我正在尝试在运行 Ubuntu 18.04 的 VPS 上设置使用 SMTP 发送电子邮件。我正在使用 postfix、nodemailer。
当我从[电子邮件保护],发送到 Gmail 帐户,它会卡在 Gmail 垃圾邮件文件夹中。我获得了 6.8 分www.mail-tester.com,扣除以下项目:
-1.274 RDNS_NONE 由没有 rDNS 的主机传送到内部网络 这可能表示您没有为主机名配置 rDNS,或者 rDNS 与您的发送 IP 不匹配
-0.896 SPF_HELO_SOFTFAIL SPF:HELO 与 SPF 记录不匹配(软失败)软失败
您的邮件未使用 DKIM 签名
我认为我的TXT记录是正确的:
"v=spf1 ip4:[removed-server-ip] include:_spf.mail.hostinger.com ~all"
/etc/postfix/main.cf:
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = [removed-domain-name].com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname, localhost.$mydomain, localhost.[removed-domain-name].com, [removed-domain-name].com, [removed-domain-name]$
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
inet_protocols = all
policyd-spf_time_limit = 3600
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_service unix:private/policyd-spf
nodemailer 方法:
"use strict";
const nodemailer = require("nodemailer");
let transporter = nodemailer.createTransport({
sendmail: true,
newline: 'unix',
path: '/usr/sbin/sendmail',
secure: true,
})
let info = await transporter.sendMail({
from: '"[removed-domain-name].com" <no-reply@[removed-domain-name].com>', // sender address
to: req.body.to, // list of receivers
subject: "Hello", // Subject line
text: req.body.message, // plain text body
html: req.body.message, // html body
});
答案1
配置您的反向 DNS。添加一个 PTR 条目,将您的 IP 链接到您的 MX 服务器名称
确保 main.cf 中的 myhostname 设置为您的 MX 服务器名称。这可能是导致 HELO 不匹配的原因。
您可以将 SPF 设置为“v=spf1 a mx include:_spf.mail.hostinger.com ~all”以自动接受您的 MX 作为发件人,但 ip 应该没问题。
将您的域名注册到 Google 以提高传递率:https://support.google.com/a/answer/9649569?hl=en
绝对使用 DKIM:
opendkim
安装 opendkim。
配置
编辑 /etc/opendkim.conf:
sv
模式来签署和验证收到的电子邮件(您可能不需要验证模式)- 举报地址[电子邮件保护]
- KeyTable、SigningTable:将密钥链接到 DNS 条目的文件
- InternalHosts :包含受信任主机列表的文件
创建密钥
mkdir /etc/opendkim/keys/example.com/
cd /etc/opendkim/keys/example.com/
opendkim-genkey -s mail -d example.com
chown opendkim:opendkim mail.*
参数-s
叫做选择器,-d
是域。
编辑/etc/opendkim/签名表并添加一对域/选择器:
*@example.com mail._domainkey.example.com.
编辑/etc/opendkim/密钥表并添加一对选择器/键:
mail._domainkey.example.com example.com:mail:/etc/opendkim/keys/example.com/mail.private
编辑/etc/opendkim/TrustedHosts并插入
*.example.com
[your local network]
DNS
您需要将公钥添加到 DNS 中。您可以在以下位置找到密钥:/etc/opendkim/keys/xxx.yy/mail.txt
创建一个 TXT 字段:
mail._domainkey.example.com 10800 TXT "v=DKIM1; k=rsa; p=very_long_key"
后缀
您必须让 postfix 知道 opendkim,以便让他签署密钥。
获取 opendkim 在其配置中的连接方法。应该类似于inet:8891@localhost
,并将其作为过滤器添加到主配置文件:
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
完成
重启(最终启用)opendkim,然后重启postfix。使用以下命令检查DNS中的密钥:opendkim-testkey -d example.com -s mail -vvv
使用 mail-tester.com 检查。检查 /var/log/maillog,每封发送的电子邮件都会添加一行DKIM-Signature field added