博主在腾讯云和 Vultr 都有服务器, 但是没有一台服务器发送邮件是正常的

对于一个站长来说, 发送邮件多重要我就不说了. 注册确认邮件、修改密码确认邮件以及找回密码邮件等等, 这些都需要发送邮件, 这里还不包括发送通知等

我的服务器安装 WordPress 和 Discuz! 之后一直不能发送各种通知邮件, 这个问题困扰了我一个星期都没有解决, 差点上淘宝了

各种百度谷歌之后, 加上发起工单让服务商协助, 终于解决了这个问题, 刚刚邮箱被自己轰炸了...

CentOS 下网站发送邮件的问题-Jonny'Blog

我这个人很少发起工单求助, 都是服务器出现问题之后才发起工单, 一般有问题都是自己搜索解决的, 这次是实在解决不了了, 才发起工单, 发现原来服务商给所有的账号默认加上了 SMTP block

提醒 : 本文建立在你的服务器提供商为 Vultr, 并且 PHP 按照本博客给出的方式安装配置

首先是账号的配置问题 :

Vultr 的服务器默认的 SMTP 被阻挡的, 也就是说你账号下所有的服务器是不能够发送邮件的

CentOS 下网站发送邮件的问题-Jonny'Blog

首先你需要发起工单, 内容可以这么写------

I built a Web using WordPress in my server xxx.xxx.xxx.xxx(写你服务器的 IP), but I cannot receive any register e-mail sent from my server. Can you help me?

Thank you very much!

如果之后有回复, 但是不是帮你去掉服务器 SMTP block 的, 你根据他的回复回答他一些问题, 然后在最后写上------

Can you help me remove SMTP block from my account?

Thank!

加上这句话之后, 基本就没什么问题了

之后你就会收到像上面这张图片一样类似的回复, 说是已经帮你移除了 SMTP block 这个限制

提醒 : 你需要注意使用规则, 如果发现你滥用的, Vultr 是有权利重新加上限制的

去除限制之后, 我们需要对服务器进行一些配置

首先安装依赖

yum install -y sendmail sendmail-cf m4

因为 sendmail 安装完成之后是默认开机启动的, 所以不需要做开机启动配置, 需要对 postfix 做开机启动

systemctl enable postfix

安装完成之后, 我们需要进行配置

先加入主机名称

vim /etc/mail/local-host-name

在里面加入你的域名, 不需要加 www.

之后设定配置文件

vim /etc/mail/sendmail.mc

查找 DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

改为

DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl

设定完成之后进行转换

m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

制作 Hash 格式的资料库

cd /etc/mail

makemap hash access < access

修改 submit.cf 文件

vim /etc/mail/submit.cf

找到 Dj$w.Foo.COM

改为

Djxxx.xxx (其中 xxx.xxx 替换为你的域名)

修改 PHP 配置文件

vim /etc/php.ini

查找 sendmail_path

改为

sendmail_path=/usr/sbin/sendmail -t -i -f'xxx@xxx.xxx' (其中 xxx@xxx.xxx 替换为你想要的发件人邮箱)

这样可以防止出现 "由 xxx 代发" 的问题

完成之后启动服务

systemctl start postfix sendmail

之后测试邮件的发送

mail -s "test" xxx@xxx.xxx

随便输入一些内容然后按 Control + D 发送

如果发送成功会返回 EOT

CentOS 下网站发送邮件的问题-Jonny'Blog

登录邮箱查收

CentOS 下网站发送邮件的问题-Jonny'Blog

再次尝试注册 WordPress 或者 Discuz!, 发现已经可以收到注册邮件了

补充 :

当遇到启动错误的时候, 首先查看日志

下面给出两个错误的解决方案

错误 1 : unable to qualify my own domain name (xxx) -- using short name

解决方案 : 在 hosts 文件中, 写入 127.0.0.1 xxx 你的域名

错误 2 : fatal: parameter inet_interfaces: no local interface found for ::1

解决方案 : 修改 /etc/postfix/main.cf 中的 "inet_interfaces = localhost" 项为 "inet_interfaces = all"