使用postfix配置gmail smtp中继

时间:2020-01-09 10:38:45  来源:igfitidea点击:

在本教程中,我们将配置后缀以使用第三方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帐户密码进行身份验证