背景

Postfix 是一个成熟的邮件服务器,可用于发送邮件。默认的发信端口是25。

为了避免用户滥发邮件,很多机房都关闭了25端口。有些机房允许用户申请解封某台服务器的25端口,但有些机房连申请解封的渠道都不提供了。阿里云的轻量应用服务器就不给用户解封25端口。

所以,只能配置 Postfix 作为邮件客户端,调用外部的SMTP服务器发信。

我在 Ubuntu 18.04 LTS 上折腾了很久才成功。特地记录一下,备用。本文参考了Configure Postfix to Send Mail Using an External SMTP Server 以及 配置Postfix使用腾讯企业邮箱发送邮件,支持PHP的mail()函数

安装 Postfix

1
2
sudo apt-get update
sudo apt install mailutils

安装过程中,会提示选择General type of mail configuration,选择Internet Site即可。

配置 Postfix

1.配置外部smtp的地址、端口、用户名与密码

1
sudo nano /etc/postfix/sasl_passwd

内容格式为:

1
[smtp.exmail.qq.com]:465 myEmail:password

我使用的是腾讯云的企业邮。如果是其他smtp,要替换对应的地址,甚至端口号。myEmail是登陆smtp服务器的email,password为密码。

内容加密:

1
sudo postmap /etc/postfix/sasl_passwd

2.配置发件人的映射

先运行hostname获知本机的名称。假设本机名称为myserver,那么,Postfix默认的发件人就是username@myserver或者root@myserver。这个发件人显然与上述的myEmail地址不同,所以需要映射。

1
sudo nano /etc/postfix/generic

内容格式为:

1
2
username@myserver myEmail
root@myserver myEmail

记得替换username 和 myEmail。

内容加密:

1
sudo postmap /etc/postfix/generic

3.告知postfix使用外部smtp

1
sudo nano /etc/postfix/main.cf

首先指定 smtp 服务器

1
relayhost = [smtp.exmail.qq.com]:465

这个relayhost的值,要与之前/etc/postfix/sasl_passwd写的相同。

然后,文件末端加上:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# enable SASL authentication
smtp_sasl_auth_enable = yes

# disallow methods that allow anonymous authentication.
smtp_sasl_security_options = noanonymous

# where to find sasl_passwd
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

# where to find generic
smtp_generic_maps = hash:/etc/postfix/generic

# Enable STARTTLS encryption
smtp_use_tls = yes

# where to find CA certificates
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

# Enable tls encryption
smtp_tls_wrappermode = yes
smtp_tls_security_level = encrypt

重启 Postfix 与测试

1
2
3
sudo service postfix restart

echo "body of your email" | mail -s "This is a Subject" -a "From: myEmail" recipient@elsewhere.com

其中,myEmail 是之前设定的smtp邮箱,·recipient@elsewhere.com· 是收件人信箱。

如果未收到,可查看log看看。

1
cat /var/log/mail.log