PHP (sendmail / PHPMailer / ezcMailComposer)发送邮件
一. 使用 PHP 内置的 mail() 函数
1. Windows 下
环境:WampServer2.5(Windows 10,Apache 2.4.9,MySQL 5.6.17,PHP 5.5.12)
① 在 Windows 下使用 PHP 内置的 mail() 函数发送邮件,需要先安装 sendmail(下载地址:http://glob.com.au/sendmail/)
把下载下来的 sendmail.zip 解压到自定义的目录(我这里是 D:\wamp\bin)
② 配置 php.ini 文件(通过 phpinfo 确定 ph.ini 文件真实路径)

邮件服务器以腾讯邮箱为例,php.ini 文件主要配置
SMTP = smtp.qq.com
smtp_port = 25(邮件服务端口),
sendmail_path = "D:\wamp\bin\sendmail\sendmail.exe -t"
③ 配置 sndmail.ini
需要配置:
smtp_server=smtp.qq.com
smtp_port=25 ,开启 log 方便排错,生成的log文件在sendmail根目录
error_logfile=error.log
debug_logfile=debug.log auth_username=472323087@qq.com
auth_password=你的授权码
,force_sender 要和auth_username一致
force_sender=472323087@qq.com
说明:
配置项中的 auth_password 不是邮箱的密码, 而是腾讯邮箱的第三方客户端授权码,获取授权码的方式是:
登陆 mail.qq.com(472323087@qq.com),选择“设置” -- “POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务” -- “生成授权码”
点击“生成授权码”,需要发送一条验证信息,验证通过之后得到授权码

④ 测试发送邮件:
<?php // 使用 PHP 内置的 mail() 函数 $to = '472323087@qq.com';
$subject = 'Hello World!';
$body = 'Welcome to China!';
mail($to, $subject, $body);
收到邮件:
2. Linux 下
环境:LNMP(CentOS 6.6 ,Nginx 1.8.0,MySQL 5.6.23,PHP 5.6.9)
① 安装 sendmail
# yum install sendmail
② 启动 sendmail
# /etc/rc.d/init.d/sendmail start
③ 此时可以直接通过 mail 命令来给指定邮箱发送邮件:
[root@localhost ~]# echo 'this is a mail test'|mail -s text dee1566@126.com
这里先用 126 邮箱举例,腾讯邮箱由于腾讯邮件服务器的限制,不做设置很容造成拒收,后面再说。
打开邮件:
④ 使用 PHP 的 mail() 函数发送邮件
需要修改 php.ini
smtp_port = 25
sendmail_path = /usr/sbin/sendmail -t
SMTP 不用设置
mail.php
<?php
header('Content-type:text/html;charset=utf-8');
// 使用 PHP 内置的 mail() 函数
$to = 'dee1566@126.com';
$subject = 'Hello World!';
$body = 'Welcome to China!';
if(mail($to, $subject, $body)) {
echo '发送成功';
} else {
echo '发送失败';
}
收到邮件:
打开邮件:
说明:
mail("接受方email", "邮件主题", "正文内容", headers, "from:发送方email");
要修改发件人,可以添加第四个参数
<?php
header('Content-type:text/html;charset=utf-8');
// 使用 PHP 内置的 mail() 函数
$to = (isset($_GET['type']) && $_GET['type'] == 'qq') ? '472323087@qq.com' : 'dee1566@126.com';
$subject = 'Hello World!';
$body = 'Welcome to China!';
$headers = array();
$headers[] = "MIME-Version: 1.0";
$headers[] = "Content-type: text/plain; charset=iso-8859-1";
$headers[] = "From: dee <472323087@qq.com>";
$from = '472323087@qq.com';
if(mail($to, $subject, $body, implode("\r\n", $headers), $from)) {
echo '发送成功';
} else {
echo '发送失败';
}
此时收到的邮件:
打开邮件:
⑤ 如果接收方 email 是腾讯邮箱的话,很容易显示发送成功但是实际上根本就没有发送成功,通过查看日志
[root@localhost sbin]# tail -f /var/spool/mail/root
可能会出现
<<< 550 Mail content denied. http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=20022&&no=1000726
554 5.0.0 Service unavailable
550 Mail content denied 出错原因:该邮件内容涉嫌大量群发,并且被多数用户投诉为垃圾邮件
编辑 /etc/mail.rc
[root@localhost ~]# vim /etc/mail.rc
添加:
set from=472323087\@qq.com smtp=smtp.qq.com //邮件来自
set smtp-auth-user=472323087\@qq.com smtp-auth-password=你的授权码 smtp-auth=login //登录qq SMTP服务器的用户名和密码
此时直接使用 mail 命令发送邮件:
[root@localhost ~]# echo 'this is a mail test'|mail -s title 472323087@qq.com


但还是不能使用 PHP 的 mail 函数给腾讯邮箱发送邮件,查了很多资料,还是没能解决。
总结:
在 Windows 下使用 sendmail 结合 mail() 函数能很容易地给腾讯邮箱发邮件,在 Linux 下腾讯邮箱几乎一律拒收,连垃圾箱都进不了,其他的比如 126 邮箱就没有问题,可能还是和主机设置有关。
最终代码:
<?php
header('Content-type:text/html;charset=utf-8');
// 使用 PHP 内置的 mail() 函数
$to = 'dee1566@126.com';
$subject = 'Hello World!';
$body = 'Welcome to China!';
$headers = array();
$headers[] = "MIME-Version: 1.0";
$headers[] = "Content-type: text/plain; charset=iso-8859-1";
$headers[] = "From: dee <472323087@qq.com>"; //决定邮件的发件人显示
$from = '472323087@qq.com';
if(mail($to, $subject, $body, implode("\r\n", $headers), $from)) {
echo '发送成功';
} else {
echo '发送失败';
}
二. 使用 Zeatcomponent 的 ezcMailComposer 类
文档地址:http://ezcomponents.org/docs/tutorials/Mail
下载地址:http://ezcomponents.org/download
下载后解压压缩包
Zetacomponent ezcMailComposer 类可以与 SMTP 服务器直接通信:
<?php
header('Content-type:text/html;charset=utf-8');
// 使用 Zeccomponent 的 ezcMailComposer 类
// http://ezcomponents.org/docs/tutorials/Mail
require_once 'ezcomponents/Mail/docs/tutorial/tutorial_autoload.php';
$message = new ezcMailComposer();
$message->from = new ezcMailAddress('47232087', 'dee'); //发送邮箱是qq邮箱,例如472323087@qq.com,邮件很容易被拒,sendmail根目录下error.log中错误记录是:Error: content rejected.http://mail.qq.com/zh_CN/help/content/rejectedmail.html<EOL>
$message->addTo(new ezcMailAddress('472323087@qq.com', 'emperor'));
$message->subject = 'php sendmail';
$body = 'this is a test mail';
$message->plainText = $body;
$message->build();
$host = 'smtp.qq.com';
$username = '472323087@qq.com';
$password = 'niwogqkejpnzbibh';
$port = '25';
$smtpOptions = new ezcMailSmtpTransportOptions();
$smtpOptions->preferredAuthMethod = ezcMailSmtpTransport::AUTH_LOGIN;
$sender = new ezcMailMtaTransport($host, $username, $password, $port, $smtpOptions);
try {
$sender->send($message);
echo '发生成功';
} catch(ezcMailTransportException $e) {
echo $e->getMessage();
}
收到邮件:
打开邮件:

同样在 Linux 下同样会遇到腾讯邮箱直接拒收的问题。
三. 使用 PHPMailer 类
PHPMailer 版本 5.2.13
下载地址:https://github.com/Synchro/PHPMailer
Windows 下调试代码:
<?php
header("content-type:text/html;charset=utf-8");
require 'PHPMailer/class.smtp.php';
require 'PHPMailer/class.phpmailer.php';
try {
$mail = new PHPMailer(true);
$mail->IsSMTP();
$mail->CharSet='UTF-8'; //设置邮件的字符编码,这很重要,不然中文乱码
$mail->SMTPAuth = true; //开启认证
$mail->Port = 25;
$mail->Host = "smtp.qq.cn";
$mail->Username = "472323087@qq.com";
$mail->Password = "你的授权码";
$mail->IsSendmail(); //windows下开启;linux下如果没有sendmail组件就注释掉,否则出现“Could not execute: /usr/sbin/sendmail”的错误提示
$mail->AddReplyTo("472323087@qq.com","dee");//回复地址
$mail->From = "472323087@qq.com";
$mail->FromName = "472323087@qq.com";
$to = "472323087@qq.com";
$mail->AddAddress($to);
$mail->Subject = "phpmailer测试标题";
$mail->Body = "<h1>phpmail演示</h1>这是emperor对phpmailer的测试内容";
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; //当邮件不支持html时备用显示,可以省略
$mail->WordWrap = 80; // 设置每行字符串的 长度
//$mail->AddAttachment("d:/test.jpg"); //可以添加附件
$mail->IsHTML(true);
$mail->Send();
echo '邮件已发送';
} catch (phpmailerException $e) {
echo "邮件发送失败:".$e->errorMessage();
}
Linux 下修改 php.ini,注释
sendmail_path = /usr/sbin/sendmail -t -i
把程序中的
$mail->IsSendmail();
也注释,可以完成包括对腾讯邮箱的邮件任务。
注意,邮件服务器尽量不要选腾讯邮箱。
参考:
PHP 在windows下配置sendmail,通过 mail() 函数发送邮件
PHPMailer使用教程(PHPMailer发送邮件实例分析)
PHP (sendmail / PHPMailer / ezcMailComposer)发送邮件的更多相关文章
- PHPMailer不能发送邮件
PHPMailer不能连接SMTP服务器,和修改SMTP大小写没有关系 (2011-10-22 12:17:35) 转载▼ 标签: php phpmailer 杂谈 分类: 默认分类 PHPmaile ...
- jenkins调用本地搭建sendmail邮件服务器发送邮件
应用jenkins发送邮件的邮件服务器 SMTP server 可以是本地的,也可以是远程,远程的就不多说了,在此说一下如何在jenkins本地服务器上搭建邮件服务器,并用jenkins发送邮件,详细 ...
- phpmailer,smtp发送邮件实例(转)
一,用phpmailer发送邮件 查看复制打印? <?php include "class.phpmailer.php"; //包函邮件发送类 //邮件发 ...
- PHP通过phpmailer批量发送邮件功能
前端页面代码: 注意:目前发送人使用的qq邮箱支持的不是特别友好.建议使用网易 新浪 163等其他邮箱. 需要用到phpmailer包 下载地址:https://sourceforge.net/pro ...
- 【PHPmailer】发送邮件(以163邮箱为例)
1.参考TP社区:http://www.thinkphp.cn/code/989.html 2.phpmailer.rar下载地址:http://www.thinkphp.cn/code/downlo ...
- 如何用 PHPMailer 来发送邮件?
<?php require_once('mantisbt-1.2.15/library/phpmailer/class.phpmailer.php'); $mail= new PHPMailer ...
- thinkphp5中使用phpmailer实现发送邮件功能(转载)
一.开启SMTP服务(使用php发送邮件需要用到SMTP服务,这里以163邮箱的SMTP服务为例). 1.登录163邮箱,在首页上找到“设置”. 2.选择开启的服务,一般都全选,POP3/SMTP/I ...
- ThinkPHP 3.2 DEMO案例系列【phpmailer批量发送邮件】
但是邮件和短信相比在一些场景依然有着重要的意义和优势: 1:零成本:发邮件没有费用: 2:内容丰富且量大:邮件可以长篇大论:图文并茂: 3:增加访问量:用户很容易通过邮件中的链接访问网站: 好了:下面 ...
- thinkphp5中使用phpmailer实现发送邮件功能
一.开启SMTP服务(使用php发送邮件需要用到SMTP服务,这里以163邮箱的SMTP服务为例). 1.登录163邮箱,在首页上找到“设置”. 2.选择开启的服务,一般都全选,POP3/SMTP/I ...
随机推荐
- gulp使用技巧-删除node_modules文件夹,解决目录层次太深删除报错的问题
问题描述: 在使用gulp当中,自动生成的node_modules文件夹,因为文件目录层级太深,无法系统删除,用360粉碎工具也报错 解决方法: 使用npm中的插件rimraf,专门用于删除的模块插件 ...
- espcms列表页ajax无限加载
类似百度图片的效果,滚动到底部后,点击加载更多,加载出第二页,第三页... 替代了传统的上一页,下一页,第几页,以达到在某些情况下使得用户体验更好. 二次开发方法: 1.先在模板文件中增加ajax文件 ...
- java notepad++
- 移动端web开发技巧
META相关 1. 添加到主屏后的标题(IOS)
- DOM动画效果的基础入门2
一.动画效果 Transform字面上就是变形,改变的意思,在css3中transform主要包括以下几种: 选转 rotate,扭曲 skew 缩放 scale 和移动translate 以及矩形变 ...
- VS更改编辑窗背景
打开Visual Studio 工具→扩展和更新→联机 在搜索框里输入“background”后,搜索结果有很多插件可以更改 Visual Studio 的背景,选择其中的一项,可以在右边进行预览 ...
- POJ 3261 Milk Patterns 后缀数组求 一个串种 最长可重复子串重复至少k次
Milk Patterns Description Farmer John has noticed that the quality of milk given by his cows varie ...
- 添加已运行daemon进程(falcon-agent)到supervisor测试
falcon-agent now is running already, pid= falcon-agent now is running already, pid= falcon-agent now ...
- 【Spring】获取资源文件+从File+从InputStream对象获取正文数据
1.获取资源文件或者获取文本文件等,可以通过Spring的Resource的方式获取 2.仅有File对象即可获取正文数据 3.仅有InputStream即可获取正文数据 package com.sx ...
- 命名函数、eval创建局部变量
1.命名函数 var f = function double(){return x *2;} 该语句将函数绑定到变量f,而不是变量double 匿名的函数表达式: var f = function(x ...