干货分享2:调试 - VPS发邮件显示“由root@localhost.localdomain代发”彻底解决

王志勇 发表于 2018年08月07日 09:35

因为新项目中需要向用户自动发送验证电子邮件,所以很需要服务器发邮件的功能。

调试了整整2天,搜索了网上的大量文章,大部分都没有效果。今天在想办法的无意当中,解决了这个问题,所以特此作为干货分享。这2天在调试中,无论如何修改hostname,@后面始终是localhost.localdomain。昨天发现国外的客服邮件的发件人,会显示“由abc@serverabc.com代发”,感觉非常酷。(本次的调试结果,无意中连“由***代发”都没有了,纯属无心插柳柳成荫。)

测试环境,是干净的CentOS 5新机,已安装PHP,新机的配置方法如这一篇。本次测试用的是OVZ,因为默认直接支持sendmail,无需任何配置。

测试中,我发现代发人有时是root@localhost.localdomain,有时是apache@localhost.localdomain。后来发现,这是因为root的用户名,是我用shell命令直接发邮件,会显示“由root@localhost.localdomain代发”。而我用php的exec()函数调用shell命令,来运行VPS上的sendmail,会显示“由apache@localhost.localdomain代发”。

于是想到通过建立用户,然后更改Apache所在的用户,就可以顺利更换@前的用户名。步骤为:

步骤1. shell命令:

adduser yourabc && passwd yourabc

注:这里的yourabc,是您要新建的用户,它就是将要在@前显示的名称,例如我的用户名是webshu,输入这样的shell命令:adduser webshu && passwd webshu

然后会提示输入此用户的密码。

步骤2. 更改Apache的用户组,下载/etc/httpd/conf/httpd.conf文件,在本地修改后上传。此文件是Apache的配置文件,用户文本工具打开,找到这2行:

User apache
Group apache

把apache改成为您的名字,例如:
User yourabc
Group yourabc

步骤3. 查看主机名、添加在127.0.0.1这一行,这一步非常重要,如果没有这一步,发邮件会很慢。

shell命令:

hostname

下载/etc/hosts文件,用文本工具编辑,然后上传。

大约在第3行,会看到自己的主机IP,IP后面跟着一个名字,实际这个就是主机名,和刚才的hostname命令后显示的名称是一样的。找到第1行,也就是127.0.0.1这一行,原有的localhost.localdomain localhost这些保留,在最后的localhost加一个空格,再加上现在的主机名。例如我的主机默认的主机名是server81,添加后的效果如:

127.0.0.1 localhost.localdomain localhost server81
# Auto-generated hostname. Please do not remove this comment.
104.223.255.255 server81

步骤4:更改主机名,这一步非常重要,会显示@后面的域名。

shell命令:

hostname yourdm.com

此步骤在重启Apache后会立即生效,但是重启系统后会失效。永久更改主机的方法请在百度上搜索,然后调试,我经过测试多次,更改/etc/sysconfig/network文件,暂无法实现永久更改。

步骤5. 重启Apache,shell命令:

service httpd restart

测试:

前面已经安装PHP。默认的PHP路径为/var/www/html,在/var/www/html目录下建立一个1.php。1.php写入这样的语句:

<?exec('echo -e "Subject: biao ti\nTo: abc@abc.com\nFrom: yourabc@yourdm.com\nMessage text" | sendmail -t');?>OK!

附:上述这个exec()函数里的sendmail命令直接发邮件,单是这一项,前两天查找资料、调试所花的时间不低于8小时,最后才成功,这几乎是唯一正确的写法。因为别的写法,无法发送成功,或者会让有的邮箱拒收、或者进入垃圾邮箱。
而且,此写法是直接调用CentOS原生的sendmail,无需额外安装mailx。

步骤6. 此步骤可省略。如果不能发送,可以尝试配置/etc/mail.rc这个文件,添加SMTP信息,具体可以在网上搜索一下。我发现里面的发件人名称、密码是可以任意填写的,但是SMTP地址必须是个存在的域名。

10秒钟后查看自己的abc@abc.com邮箱,此时很惊叹,因为现在连“由***代发”都没有了,发件人直接显示yourabc@yourdm.com。虽然CentOS系统里复杂的原理暂时无法得知,但是已经实现了非常酷的功能。请注意,步骤2、步骤4,实际上是在分别修改yourabc、yourdm.com。步骤5编写的PHP文件,From后面的发件人地址,必须与此相同,就不会显示“由***代发”,而且对方能够正常查收,且不会进入垃圾邮件箱。一旦不同,可能会拒收,或者直接进入垃圾邮件箱,有时也能正常查收。至此,已经解决了一个很大的问题。

但是,新的问题又出现了。在隔几分钟后,尝试更改这个1.php文件,发送给别的地址,或者同个地址,发现同个地址需要间隔很长时间才能再次发送;或者需要间隔很长时间才能发给别的地址。很可能是这个VPS空间做了限制,限制发送邮件的数量,这个解决不了,只能更换配置更高的VPS了,毕竟我的测试机是一年几美元的空间。

1条评论:
1   自由勇 2018-08-13 21:08
Trackback来自《干货分享2的后续:VPS发邮件

之后,同一VPS,每隔一段时间发送,都能100%发送。然后我测试每隔1分钟,甚至时间更短,也能发送。这说明,我的VPS可能没有对邮件的发送频率做出限制。

前两天的测试中,总是同一VPS、同一收件人,只能收到第一封信,后面再次发间隔几小时也收不到,当时误以为是VPS被限制了。其实,当时的收件人是用的腾讯企业邮箱,腾讯企业邮箱会这样拒收。收件人换成了国内的免费邮箱,能顺利发送,正好解决了一个重大的问题。

发表评论:
名字: (*必填)
博客: (可省,仅限于Blog地址)

正文:

    记住信息? 否   回复第

直接发送Trackback

Copyright © 2017-2018 blog.emxel.com 版权所有 Powered by Arsue