WordPress 不用做任何修改就可以运行在阿里云的 ACE 上面,目前 ACE 又是免费的,速度快,有稳定,种种优点吸引了广大的 WordPress 用户,目前本站就是运行在 ACE 上面的,从自己的 VPS 上迁移过来之后,一切运行良好,除了不能发送邮件,在自己的 VPS 上,我一直是使用 Cimy Swift SMTP 这个插件通过 SMTP 发送邮件的,可是到了阿里云就一直提示:SMTP connect() failed.
看字面意思是邮件服务器根本连接不上。
ACE 上 WordPress 不能发送邮件的原因
在阿里云后台发了工单,得到的回复是这样的:
PHP应用使用 http/https/smtp 等协议 (curl/fsockopen) 无需设置代理: stream_socket_client 中无法设置代理选项,建议替换成 fsockopen 或 curl stream_socket_client 函数中的参数 $flags 只能是 STREAM_CLIENT_CONNECT,其中 $context 将被忽略; 参数:$remote_socket,只能是 tcp 或 ssl 协议,其它不支持;
从回复中可以看出,阿里云 ACE 是可以发送邮件的,只是和我们平时发邮件的方式不一样,根据阿里云的建议,我们需要替换插件中的stream_socket_client
为fsockopen
,既然可以替换,相比这两个函数的功能基本上是类似的。
修改 Cimy Swift SMTP 插件使其能在阿里云 ACE 上面发送邮件
搜索了一下 Cimy Swift SMTP 插件的代码,果然有stream_socket_client
这个函数,在cimy-swift-smtp/Swift/lib/classes/Swift/Transport/StreamBuffer.php
的第 263 行:
$this->_stream = @stream_socket_client($host.':'.$this->_params['port'], $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, stream_context_create($options));
我们只需要把这一行代码替换为以下一行即可:
$this->_stream = @fsockopen($host, $this->_params['port'], $errno, $errstr, $timeout);
保存一下,SVN 提交到版本库,等一分钟左右,应用重新部署后,再从 Cimy Swift SMTP 插件设置的地方测试一下,我们会发现,邮件很快发送出去了,再测试一下评论回复和找回密码,一样可以很快找到邮件。
为了方便大家的使用,我直接把修改好的插件打包了一下,下面是下载链接,有需要的朋友可以点击下面的按钮下载。
想要更快还得用 ECS 云服务器
ACE 的速度对于每日 PV 不超过100的网站来说,速度已经足够用了,如果网站的流量比较大,ACE 的速度就跟不上了,这时候根据自己的网站流量,直接购买阿里云 ECS 服务器就可以了,原来放在 OSS 和 RDS 上的数据不用动,直接配置一下就可以了。
2015/05/19 更新:万网的虚拟主机也有和 ACE 一样的问题,不知道他们是不是使用的同一套系统。经测试,以上方法同样可以在万网的虚拟主机上使用。
关于 "使用 Cimy Swift SMTP 插件在阿里云 ACE 上面发送邮件 "的一个想法
谢谢博主的文章,我也在用阿里云的ace,不过为什么我把你打包的代码下载下来,我在本地调试有问题,传到ACE还是有问题,博主能否帮忙看下?
可以把测试出来的错误代码发上来帮你看看,虽然我现在已经不用ACE了。
本地调试直接就显示
Fatal error: Call to undefined function plugin_basename() in C:\xampp\htdocs\cimy-swift-smtp\cimy_swift_smtp.php on line 37
传svn后,显示500 服务器执行遇到错误什么的
可以加个QQ么?QQ邮箱就是我QQ,谢谢
这是个插件,插件应该放在wp-content/plugins目录,然后启用。
我没有用过wordpress,不清楚什么目录,我以以下的目录结构
C:\xampp\htdocs\webroot\public\mail\wp-content\plugins
访问后还是提示
Fatal error: Call to undefined function plugin_basename() in C:\xampp\htdocs\webroot\public\mail\wp-content\plugins\cimy_swift_smtp.php on line 37
是不是还需要别的文件,ACE中也没有wp-content之类的目录吧?
那建议你先了解一下WordPress的插件是怎么使用的吧。