使用postfix配置gmail smtp中继
在本教程中,我们将配置后缀以使用第三方GMAIL SMTP中继服务器,以便我们的Linux服务器将能够使用smtp.gmail.com
将邮件发送到外部网络
什么是SMTP中继
SMTP中继是一种协议,该协议允许使用外部SMTP服务器发送电子邮件,而不是托管本地SMTP服务器。
这通常涉及使用诸如MailJet,SendGrid或者MailGun之类的服务。
这些服务避免了配置和维护我们自己的SMTP服务器的必要,并且经常提供其他好处,例如分析。
环境
我将使用RHEL 8通过postfix设置gmail smtp中继服务器。
主机名:server.example.com IP地址:192.168.43.31
准备工作
禁用sendmail
服务器上应该只有一个MTA,因此,如果我们使用的是后缀,则始终建议停止其他MTA服务。
# rpm -q sendmail
如果sendmail安装在服务器上,则停止并禁用此服务
# systemctl disbale sendmail --now
配置防火墙
由于我们使用firewalld,因此我们将使用firewalld添加一条规则以允许SMTP服务
# firewall-cmd --permanent --add-service=smtp
安装套件
让我们从使用gmail smtp中继服务器配置后缀的步骤开始。
安装用于SASL身份验证的后缀和其他依赖软件包
说明:
在RHEL系统上,我们必须具有RHN的有效订阅,或者我们可以配置本地脱机存储库,通过该本地脱机存储库,yum
软件包管理器可以安装提供的rpm及其依赖项。
# dnf -y install postfix cyrus-sasl cyrus-sasl-lib cyrus-sasl-plain -y
配置postfix
其中我将分享postfix的基本和推荐的最低配置。
我已经解释了我们在后缀服务器中使用的各个参数,因此在此不再赘述。
在/etc/postfix/main.cf
中查找这些参数,并根据环境进行修改:
myhostname = server.example.com mydomain = example.com myorigin = $mydomain mydestination = mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain inet_interfaces = $myhostname, localhost inet_protocols = ipv4 mynetworks = 192.168.43.0/24, 127.0.0.0/8 smtp_use_tls = yes smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_sasl_tls_security_options = noanonymous smtp_tls_CApath = /etc/pki/tls/certs smtp_tls_CAfile = /etc/pki/tls/certs/ca-bundle.crt
提示:
我们可以选择删除/etc/postfix/main.cf
中的relayhost
参数,因为我们将使用sasl_passwd
文件进行定义。
另外,我们也可以在main.cf中添加此处,但是它将仅位于两个位置。
将GMAIL配置为SMTP中继服务器
接下来,我们必须设置认证文件,在本教程中,我们将创建一个新文件/etc/postfix/sasl_passwd
并放置relayhost
和与登录认证有关的详细信息
# cat /etc/postfix/sasl_passwd [smtp.gmail.com]:587 :
用Gmail电子邮件地址替换电子邮件地址,例如[email protected]。
收集GMAIL的应用密码
请按照以下步骤获取应用密码
使用我们打算用于SMTP中继的gmail ID访问https://www.google.com/settings/security。
使用GMAIL ID登录,在Google帐户下单击"安全性"
启用"两步验证"(如果尚未完成)。
我们必须启用两步验证才能生成"应用密码"
单击"入门",然后按照屏幕上的指南完成操作。
出于安全原因,控制台可能会多次提示我们输入密码。
完成所有步骤后,将显示此屏幕,其中应包含启用了两步身份验证的设备的详细信息。
我们还必须使用发送到备份设备的代码登录。
现在在"安全性"部分下,我们应该获得启用"应用密码"的选项
选择"应用密码",然后为"邮件"启用一个。
我们可以其中定义任何设备,我已经定义了" Windows计算机"
单击" GENERATE"后,在下一个屏幕中,我们将获得应用密码,该密码必须与电子邮件地址一起放在/etc/postfix/sasl_passwd
文件中
更新密码数据库
将应用程序密码和创建的密码文件放置在一起后,使用postmap
实用程序生成包含邮件凭证的哈希数据库:
# postmap /etc/postfix/sasl_passwd
在继续之前,请采取一些其他步骤来保护Postfix凭据:
# chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db # chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
接下来重启postfix服务
# systemctl restart postfix.service
检查postfix.service的状态,以确保其已成功启动且没有错误
# systemctl status postfix ● postfix.service - Postfix Mail Transport Agent Loaded: loaded (/usr/lib/systemd/system/postfix.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2017-07-31 18:04:05 IST; 22min ago Process: 3849 ExecStop=/usr/sbin/postfix stop (code=exited, status=0/SUCCESS) Process: 3868 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS) Process: 3866 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS) Process: 3863 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS) Main PID: 3935 (master) Tasks: 3 (limit: 26213) Memory: 6.0M CGroup: /system.slice/postfix.service ├─3935 /usr/libexec/postfix/master -w ├─3936 pickup -l -t unix -u └─3937 qmgr -l -t unix -u May 31 18:04:03 server.example.com systemd[1]: Stopped Postfix Mail Transport Agent. May 31 18:04:04 server.example.com systemd[1]: Starting Postfix Mail Transport Agent... May 31 18:04:05 server.example.com postfix/master[3935]: daemon started -- version 3.3.1, configuration /etc/postfix May 31 18:04:05 server.example.com systemd[1]: Started Postfix Mail Transport Agent.
通过将邮件发送到外部网络进行验证
我们将使用邮件客户端将邮件发送到外部网络
# mail [email protected] Subject: Test Message hello, how are you! . EOT
提示:
如果我们还不知道,请输入"。
"(点)以结束邮件编写并开始发送。
查看日志/var/log/messages
以确保邮件已成功发送。
我更喜欢使用journalctl查看LIVE运行时消息
May 31 18:42:21 server.example.com chronyd[1061]: Selected source 162.159.200.123 May 31 18:42:21 server.example.com sendmail[4081]: 06VDCLOr004081: from=root, size=240, class=0, nrcpts=1, msgid=<[email protected]>, relay=root@localhost May 31 18:42:21 server.example.com postfix/smtpd[4074]: connect from localhost[127.0.0.1] May 31 18:42:21 server.example.com sendmail[4081]: STARTTLS=client, relay=[127.0.0.1], version=TLSv1.3, verify=FAIL, cipher=TLS_AES_256_GCM_SHA384, bits=256/256 May 31 18:42:21 server.example.com postfix/smtpd[4074]: 8003D20440: client=localhost[127.0.0.1] May 31 18:42:21 server.example.com postfix/cleanup[4078]: 8003D20440: message-id=<[email protected]> May 31 18:42:21 server.example.com postfix/qmgr[4071]: 8003D20440: from=<[email protected]>, size=698, nrcpt=1 (queue active) May 31 18:42:21 server.example.com sendmail[4081]: 06VDCLOr004081: [email protected], ctladdr=root (0/0), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30240, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (Ok: queued as 8003D20440) May 31 18:42:21 server.example.com postfix/smtpd[4074]: disconnect from localhost[127.0.0.1] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7 May 31 18:42:25 server.example.com postfix/smtp[4079]: 8003D20440: to=<[email protected]>, relay=smtp.gmail.com[74.125.200.109]:587, delay=4.3, delays=0.06/0/3.1/1.2, dsn=2.0.0, status=sent (250 2.0.0 OK 1596201145 lk16sm8543446pjb.13 - gsmtp) May 31 18:42:25 server.example.com postfix/qmgr[4071]: 8003D20440: removed
检查[email protected]的收件箱,我们已经收到来自root的邮件。
GMAIl SMTP中继服务器正在运行
故障排除
错误1:SASL authentication failure: No worthy mechs found
如果出现此错误:
May 31 15:31:00 server.example.com postfix/smtp[2466]: warning: SASL authentication failure: No worthy mechs found May 31 15:31:00 server.example.com postfix/smtp[2466]: B2ECA2043E: SASL authentication failed; cannot authenticate to server smtp.gmail.com[74.125.200.108]: no mechanism available
解决方案1:
我们必须在Postfix服务器上安装cyrus-sasl cyrus-sasl-lib和cyrus-sasl-plain。
错误2:连接到smtp.gmail.com:网络无法访问
如果出现此错误
May 31 16:36:38 server.example.com postfix/smtp[3275]: connect to smtp.gmail.com[2404:6800:4003:c01::6c]:587: Network is unreachable
解决方案2:
确保我们可以pingsmtp.gmail.com
# ping smtp.gmail.com PING smtp.gmail.com (74.125.200.109) 56(84) bytes of data. 64 bytes from sa-in-f109.1e100.net (74.125.200.109): icmp_seq=1 ttl=104 time=191 ms 64 bytes from sa-in-f109.1e100.net (74.125.200.109): icmp_seq=2 ttl=104 time=205 ms ^C --- smtp.gmail.com ping statistics -- 2 packets transmitted, 2 received, 0% packet loss, time 11ms rtt min/avg/max/mdev = 191.053/198.029/205.006/6.990 ms
下一步尝试使用telnet连接到SMTP服务器
# telnet smtp.gmail.com 587 Trying 74.125.200.109... Connected to smtp.gmail.com. Escape character is '^]'. 220 smtp.gmail.com ESMTP e8sm9624845pfd.34 - gsmtp
如果这两种方法都起作用,则在/etc/postfix/main.cf中验证inet_protocols值。
在大多数情况下,当我们仅在服务器中使用IPv4或者Ipv6时,我们将inet_protocols设置为全部,因此在这种情况下,这些消息是可以预期的
根据环境将值更改为ipv4或者ipv6
inet_protocols ipv4
还要将inet_interfaces修改为all。
inet_interfaces all
错误3:SASL身份验证失败;服务器smtp.gmail.com用户名和密码不被接受
如果我们遇到以下错误:
May 31 16:36:10 server.example.com postfix/smtp[3263]: 712322046F: SASL authentication failed; server smtp.gmail.com[74.125.200.108] said: 535-5.7.8 Username and Password not accepted. Learn more at?535 5.7.8 https://support.google.com/mail/?p=BadCredentials d13sm642986pjz.3 - gsmtp
解决方案3
确保Gmail帐户中启用了两步身份验证,并且我们正在按照本教程中的说明使用"应用密码"进行身份验证。
请勿使用Gmail帐户密码进行身份验证