网站部署在阿里云ECS上因为25端口被封导致不能收发邮件的问题汇总及解决办法


前段时间,考虑到有一部分国内客户的需求:有的中文网站暂时不想做备案,有的做了英文网站需要做网站维护更新, 而美国的服务器在国内使用起来确实比较慢,于是我们购买了一台香港阿里云ECS服务器实例。我们公司以前使用的是部署在美国加利福尼亚州的bluehost服务器,尽管配置个方面都不错,但是国内测速点测速网络延时依然普遍在285毫秒左右。

因为邮件服务器IP资源非常宝贵,为避免服务器IP被反垃圾组织屏蔽而导致无法正常使用。 出于安全考虑,国内阿里云和腾讯云服务器的25端口一般不是直接放开的,一般情况下需要专门申请放开25端口才可以正常收发邮件。

但是,因为25端口申请可能很多情况下并不容易审核通过。我们使用的是WordPress开发的外贸网站居多,客户必须要通过网页上面的联系表单收集访客或者用户的表单留言信息和询价。

正常情况下,网站后台可以收集到这些联系信息。但是客户不能老盯着后台等信息,必须要能够在用户发送了表单信息后第一时间收到来自网站的邮件提醒。

或者通过WordPress邮件营销相关插件进行邮件推送,邮件营销。但是25端口被屏蔽后,正常情况下,这种需求就泡汤了。

为了解决这个问题,为了服务器上面的一堆网站客户,没有办法,只有研究一下了。百度了一下发现很多人也有面临这个问题,同时CSDN社区也有一些解决办法提供。但是不是每一个人都可以通过这种学习解决这个问题。

我花了2天时间查阅了很多文档后终于把这个问题今天解决了。分享出来供大家参考:

系统环境:

阿里云ECS,Cent OS系统

PHP7.2, Mysql5.7

Nginx1.17

WordPress5.2.24

用到的插件:WPForms/ Contact Form7

Easy WP SMTP/ WP Mail SMTP

解决步骤:

申请解封25端口(这条路解决了就没有下文操作的必要了。这个不是本文讨论的重点):

登录阿里云账号
点击申请解封端口

第一步:PHP环境修改

WordPress程序(3.8版本以后)默认使用的是stream_socket_client函数发信,而万网的云虚拟主机使用的是fsockopen函数发信,因此,需做以下修改:

云虚拟主机上面有开关,百度里面也能搜到。

在万网的免费虚拟主机后台启用fsockopen函数(PHP.in设置 → PHP函数设置)。如下图所示:

阿里云主机WordPress纯代码和插件实现SMTP发信邮件服务
允虚拟主机后台图示

重点说一下ECS中fsockopen 函数的启用方法:

打开 PHP.ini,

修改两个地方:1、找到 allow_url_fopen

使用查找功能

  allow_url_fopen = On,有可能默认值是On,如果不是,改为On。

2、 开启openssl扩展

查找 extension=php_openssl.dll,如果前面有分号,去掉前面的分号。

php7.2里面是这句:extension=openssl,找到去掉前面的分号即可。

找到哪句去掉哪句前面的分号。

重启Web服务器。

可以在百度查找更多关于服务器如何开启php的fsockopen函数的操作。

第二步:修改WordPress配置

修改文件: /wp-includes/class-smtp.php

应该老版本是仅仅使用默认的 stream_socket_client 函数,需要修改为 fsockopen;但是我发现5.2.24已经写了else语句对其做了扩展,因此不用做过多修改。

可以查找确认一下,老版本里面是这样的(大致在200多行左右):

$this->smtp_conn = @stream_socket_client(
            $host . ":" . $port,
            $errno,
            $errstr,
            $timeout,
            STREAM_CLIENT_CONNECT,
            $socket_context
        );

修改为:

$this->smtp_conn = fsockopen($host, $port, $errno, $errstr);

新版本我打开后发现是这样的:

已经写好了,因此我没有对这个文件做任何修改。

第三步:实现SMTP邮件服务

1、免插件的方法(以QQ邮箱为例), 将以下代码添加到主题functions.php文件中稍作修改配置即可:

//使用smtp发送邮件(请根据自己使用的邮箱设置SMTP)
add_action('phpmailer_init', 'mail_smtp');
function mail_smtp( $phpmailer ) {
    $phpmailer->FromName = '布瑞恩'; //发件人名称
    $phpmailer->Host = 'smtp.qq.com'; //修改为你使用的邮箱SMTP服务器
    $phpmailer->Port = 465; //SMTP端口
    $phpmailer->Username = '123567@qq.com'; //邮箱账户
    $phpmailer->Password = '8888'; //邮箱密码
    $phpmailer->From = '1234567@qq.com'; //邮箱账户
    $phpmailer->SMTPAuth = true;
    $phpmailer->SMTPSecure = 'ssl'; //tls or ssl (port=25时->留空,465时->ssl)
    $phpmailer->IsSMTP();
}

2、使用插件解决办法:

我测试了两个站分别使用这两个插件:Easy WP SMTP/ WP Mail SMTP

分别使用QQ邮箱和腾讯云企业邮箱做的测试,都成功了。

下面是Easy WP SMTP插件的配置截图:

要点:From Email Address, 使用你即将要使用接受邮件提醒的邮箱地址,不同家的邮件smtp服务器(SMTP HOST)地址不同,qq邮箱是smtp.qq.com,腾讯企业邮使用的是上面这个smtp.exmail.qq.com; 选择ssl/tls选项,下面端口填465; SMTP User: QQ填QQ号码,企业邮箱填写企业邮箱地址; SMTP Password: 这里填写的不是邮箱的密码,而是给第三方的授权码(这里,Wordpress就是第三方)。

QQ邮箱需要去QQ邮箱获取,登录邮箱设置 -> 账户 -> 开启服务:
POP3/SMTP服务
在这里开启服务,并在下面生成授权码,然后填进去,保存。

点开启后发短信即可获得

腾讯企业邮需要去安全设置里面捆绑微信后就可以获得PC端安全码了。

获取到安全码以后填进去保存即可。如果通过Test Mail 发送Test后能收到邮件就说明SMTP配置成功了。

最后就可以配置联系表单里面的相关内容了,这里不做详细说明了。