PHP使用msmtp代替sendmail发邮件
2010-06-16  作者:lazyhack.net  同分类文章
description:

 刚才在配置WP-DB-Backup时随手google了一下wordpress使用的是何种方式发的邮件,因为之前对这个不是很了解,大致看了下,也就是两种方法,一种是使用PHP的mail函数,透过本地SMTP发信,说这种办法怎么怎么麻烦,怎么怎么不适用个人的服务器。

另外一种就是使用PHPMailer。但是得安装插件,或者手动修改一些代码。
可是大多也都只介绍个大概,没有看见说是怎么实现的,所以只好去看看代码它究竟是怎么做的。
关键代码在wp-includes/pluggable.php中的wp_mail这个函数里,通过查看代码知道了wordpress完全使用的PHPMailer这个类来处理email的发送,这个类既支持本地SMTP又支持远程SMTP,而在wp_mail中它默认使用的是本地的SMTP,在2.9.2版本中代码在第396行
// Set to use PHP's mail()
$phpmailer->IsMail();
这样就已经很清楚了,虽然没看那些插件的怎么实现的,想来不过是Hook了这个函数,而手动修改代码跟着个原理是一样的。
如果不想修改手动修改代码,也不想安装插件的话,那么看起来也就仅仅剩下安装本地MTA这一种办法了,但是对于个人网站来说使用MDA有些太浪费系统资源了,其实有更好的解决办法,那就是google企业邮局+SMTP代理程序,这个样子既可以使用自己域名后缀的邮箱又可以免去服务器后台启动senmail或者其他的MTA daemon进程,又浪费空间又浪费内存。
这其实也是种通用的解决办法,这样做不只是wordpress并且其他的只要是使用到mail发信的PHP程序都能免去重复配置发信方法了。
 
下面我说下我的SMTP部分,关于google企业邮局部分自己网上搜下,遍地的教程,这里我就不多做描述了
关于SMTP代理程序,linux下有好几个实现esmtp,msmtp,nbsmtp,ssmtp.我这里是用mstmp,没有为什么使用mstmp,也没说谁比谁更好,我只是最早知道msmtp而且也一直使用的是它而已。
 

原帖:http://lazyhack.net/php-use-msmtp-replace-sent-mail/ 

 

安装

对于常用发行版,可以用发行版所采用的软件包管理工具来安装
如果真没有的话可以到http://msmtp.sourceforge.net下载源代码自己make
$ sudo apt-get install msmtp 注:在debian、ubuntu 等在线安装方法;
$ sudo yum install msmtp 注:Fedora、Redhat、CentOS等系统安装方法;
$ sudo pacman -S mstmtp 注:archlinux安装方法
 
配置
安装好后,需要编辑/etc/msmtprc
$vim /etc/msmtprc
 
account default
host smtp.gmail.com  #smtp服务器地址
port 587
timeout 30
auth on
user noreply@lazyhack.net #替换成自己的邮箱地址
password ************* #密码
auto_from off
from noreply@lazyhack.net #这个同上
maildomain lazyhack.net  #替换成自己的域名
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile /var/log/msmtp.log
如果使用其他的邮件提供商,看其是否提供https连接来修改tls部分的选项,如果不提供加密则off掉
 
配置php
接下来配置php,让它透过mstmp来发信,这里只需要修改一行
sendmail_path = "/usr/bin/msmtp -t -i"
这样既可。
 
测试
接下来测试一下是否能够正常工作,建立一个测试用的php脚本
 
<?php
$status = mail("***@***.com", //这里修改接收者的地址
               "Test",
               "Hello \n this test mail",
               "from: ****@****.com"); //这里修改成发送者的地址
if($status) {
        echo "Email has been sent.";
} else {
        echo "Cannot send email";
}
?>
然后运行
$php test.php


相关
让phpmailer支持中文名称的附件
MySQL多表操作和备份处理
开始关注php的oop!拿出王古战牛皮的精神
pmahomme, phpMyAdmin 3.4.1 的全新CSS3主题
IPB代码阅读笔记(1), index.php结构分析
用sql语句来创建并赋予mysql用户权限
在windows下安装apache,php,mysql
用PHP处理多个同名复选框
Smarty-2.6.12 FAQ 有感
给apache安装ssl