让Postfix使用SendGrid的API发送邮件


上周,由于联系需要,我使用服务器发送了一封邮件;本以为能正常投递到对方服务器,进而有效沟通,然而今天,我却收到了一封来自服务器内部的、发信失败被退回来的通知…

用指令postqueue -p查询发现了大量积压的邮件,都因为和目标邮件服务器连接超时而无法发送…

(以下省略2147483647字)

于是确定了是服务器的25端口的出站流量被提供商封了,并且估计短时间内是没法解除封锁的,那么有没有办法使用非本地发送的方案进行处理呢?

本来我是以为必须要接入到应用端才能配置的,甚至想每一个客户端都做好了折腾的准备,突然在SendGrid的官网发现了将postfix设置为使用SendGrid中转发件的教程文档,那么就来顺手整理一遍吧!

在SendGrid注册账户、绑定域名与获取 API Key 之类的标准操作就不多赘述啦,需要帮助的可以留言哦,着重还是把官方的教程搬过来吧w

注意有些Postfix的实例中仅允许使用数字和字母作为密码,这意味着您可能需要保证您的SendGrid密码只包含数字和字母。

首先找到postfix的主配置文件,例如/etc/postfix/main.cf

使用编辑器加入以下设置参数:

1
2
3
4
5
6
7
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_security_level = encrypt
header_size_limit = 4096000
relayhost = [smtp.sendgrid.net]:587

可能与之前的设置有些会有重复项,但是不必担心,设置文件会自动以文件后段的设置为优先;也不建议去删除/注释那些设置,因为如果以后不使用SendGrid了,也许还是需要恢复原来的配置参数的。

此处我们将认证密钥设定为存储到/etc/postfix/sasl_passwd这个文件中,您可以根据您的需要进行细节上的调整。

更推荐使用APIKey认证的方式进行处理,这样更安全,而且更加方便。

然后我们就需要将我们的认证密钥输入到这个文件内,可以按照这样的格式进行输入:

1
[smtp.sendgrid.net]:587 yourSendGridUsername:yourSendGridPassword

如果是apikey认证的,那么可以这样设置:

1
[smtp.sendgrid.net]:587 apikey:SendGrid密钥

输入完成后保存文件,调整权限并生成对照档案文件:

1
2
chmod 600 /etc/postfix/sasl_passwd
postmap /etc/postfix/sasl_passwd

完成之后就可以重启postfix服务啦

如果有报类似 no mechanism available 这样的错误,是因为系统缺少相关的库进行SASL的认证,可以安装这些组件哦:

对于Debian/Ubuntu系,使用apt包管理系统的,可以这样:

1
apt install libsasl2-modules

对于RedHat/Fedora/CentOS这些使用yum包管理器的,就需要这样安装啦:

1
yum install cyrus-sasl-plain

如果有遇到587端口无法工作的情况,可以考虑尝试使用2525端口;您可能同时也需要从主配置文件(如/etc/postfix/master.cf)中删除tlsmgr unix - - n 1000? 1 tlsmgr前方的注释符号(#);

对于其他可能出现的错误,出于调试方便的目的,您可移步至您服务器的邮件系统日志文件,进行相对应的查询;如CentOS系统的默认日志文件位置为/var/log/maillog

这个文件会呈现的将不只有无法使用SendGrid发送邮件的错误情况,对于萌新用户而言更是一个学习服务器配置参数的绝佳机遇呀。

原文链接:Integrate SendGrid with Postfix - SendGrid Documentation