一. 使用 PHP 内置的 mail() 函数

1. Windows 下

  1. 环境:WampServer2.5Windows 10Apache 2.4.9MySQL 5.6.17PHP 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

需要配置:

  1. smtp_server=smtp.qq.com
  2. smtp_port=25
  3.  
  4. ,开启 log 方便排错,生成的log文件在sendmail根目录
  5. error_logfile=error.log
  6. debug_logfile=debug.log
  7.  
  8. auth_username=472323087@qq.com
  9. auth_password=你的授权码
  10. ,force_sender 要和auth_username一致
  11. force_sender=472323087@qq.com

说明:

配置项中的 auth_password 不是邮箱的密码, 而是腾讯邮箱的第三方客户端授权码,获取授权码的方式是:

登陆 mail.qq.com(472323087@qq.com),选择“设置” -- “POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务” -- “生成授权码”

 

点击“生成授权码”,需要发送一条验证信息,验证通过之后得到授权码

④ 测试发送邮件:

  1. <?php
  2.  
  3. // 使用 PHP 内置的 mail() 函数
  4.  
  5. $to = '472323087@qq.com';
  6. $subject = 'Hello World!';
  7. $body = 'Welcome to China!';
  8. mail($to, $subject, $body);

收到邮件:

  

2. Linux 下

  1. 环境:LNMPCentOS 6.6 Nginx 1.8.0MySQL 5.6.23PHP 5.6.9

  

① 安装 sendmail

  1. # yum install sendmail

② 启动 sendmail

  1. # /etc/rc.d/init.d/sendmail start

③ 此时可以直接通过 mail 命令来给指定邮箱发送邮件:

  1. [root@localhost ~]# echo 'this is a mail test'|mail -s text dee1566@126.com

这里先用 126 邮箱举例,腾讯邮箱由于腾讯邮件服务器的限制,不做设置很容造成拒收,后面再说。

  

打开邮件:

  

④ 使用 PHP 的 mail() 函数发送邮件

需要修改 php.ini

  1. smtp_port = 25
  2. sendmail_path = /usr/sbin/sendmail -t

SMTP 不用设置

mail.php

  1. <?php
  2.  
  3. header('Content-type:text/html;charset=utf-8');
  4.  
  5. // 使用 PHP 内置的 mail() 函数
  6.  
  7. $to = 'dee1566@126.com';
  8. $subject = 'Hello World!';
  9. $body = 'Welcome to China!';
  10. if(mail($to, $subject, $body)) {
  11. echo '发送成功';
  12. } else {
  13. echo '发送失败';
  14. }

收到邮件:

  

打开邮件:

  

说明:

  1. mail("接受方email", "邮件主题", "正文内容", headers, "from:发送方email");

要修改发件人,可以添加第四个参数

  1. <?php
  2.  
  3. header('Content-type:text/html;charset=utf-8');
  4.  
  5. // 使用 PHP 内置的 mail() 函数
  6.  
  7. $to = (isset($_GET['type']) && $_GET['type'] == 'qq') ? '472323087@qq.com' : 'dee1566@126.com';
  8. $subject = 'Hello World!';
  9. $body = 'Welcome to China!';
  10.  
  11. $headers = array();
  12. $headers[] = "MIME-Version: 1.0";
  13. $headers[] = "Content-type: text/plain; charset=iso-8859-1";
  14. $headers[] = "From: dee <472323087@qq.com>";
  15.  
  16. $from = '472323087@qq.com';
  17.  
  18. if(mail($to, $subject, $body, implode("\r\n", $headers), $from)) {
  19. echo '发送成功';
  20. } else {
  21. echo '发送失败';
  22. }

此时收到的邮件:

  

打开邮件:

  

⑤ 如果接收方 email 是腾讯邮箱的话,很容易显示发送成功但是实际上根本就没有发送成功,通过查看日志

  1. [root@localhost sbin]# tail -f /var/spool/mail/root

可能会出现

  1. <<< 550 Mail content denied. http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=20022&&no=1000726
  2. 554 5.0.0 Service unavailable

550 Mail content denied 出错原因:该邮件内容涉嫌大量群发,并且被多数用户投诉为垃圾邮件

编辑  /etc/mail.rc

  1. [root@localhost ~]# vim /etc/mail.rc

添加:

  1. set from=472323087\@qq.com smtp=smtp.qq.com //邮件来自
  2. set smtp-auth-user=472323087\@qq.com smtp-auth-password=你的授权码 smtp-auth=login //登录qq SMTP服务器的用户名和密码

此时直接使用 mail 命令发送邮件:

  1. [root@localhost ~]# echo 'this is a mail test'|mail -s title 472323087@qq.com

但还是不能使用 PHP 的 mail 函数给腾讯邮箱发送邮件,查了很多资料,还是没能解决。

总结:

在 Windows 下使用 sendmail 结合 mail() 函数能很容易地给腾讯邮箱发邮件,在 Linux 下腾讯邮箱几乎一律拒收,连垃圾箱都进不了,其他的比如 126 邮箱就没有问题,可能还是和主机设置有关。

最终代码:

  1. <?php
  2.  
  3. header('Content-type:text/html;charset=utf-8');
  4.  
  5. // 使用 PHP 内置的 mail() 函数
  6.  
  7. $to = 'dee1566@126.com';
  8. $subject = 'Hello World!';
  9. $body = 'Welcome to China!';
  10.  
  11. $headers = array();
  12. $headers[] = "MIME-Version: 1.0";
  13. $headers[] = "Content-type: text/plain; charset=iso-8859-1";
  14. $headers[] = "From: dee <472323087@qq.com>"; //决定邮件的发件人显示
  15.  
  16. $from = '472323087@qq.com';
  17.  
  18. if(mail($to, $subject, $body, implode("\r\n", $headers), $from)) {
  19. echo '发送成功';
  20. } else {
  21. echo '发送失败';
  22. }

  

二. 使用 Zeatcomponent 的 ezcMailComposer 类

文档地址:http://ezcomponents.org/docs/tutorials/Mail

下载地址:http://ezcomponents.org/download

下载后解压压缩包

Zetacomponent ezcMailComposer 类可以与 SMTP 服务器直接通信:

  1. <?php
  2.  
  3. header('Content-type:text/html;charset=utf-8');
  4.  
  5. // 使用 Zeccomponent 的 ezcMailComposer 类
  6. // http://ezcomponents.org/docs/tutorials/Mail
  7.  
  8. require_once 'ezcomponents/Mail/docs/tutorial/tutorial_autoload.php';
  9.  
  10. $message = new ezcMailComposer();
  11. $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>
  12. $message->addTo(new ezcMailAddress('472323087@qq.com', 'emperor'));
  13. $message->subject = 'php sendmail';
  14. $body = 'this is a test mail';
  15. $message->plainText = $body;
  16. $message->build();
  17.  
  18. $host = 'smtp.qq.com';
  19. $username = '472323087@qq.com';
  20. $password = 'niwogqkejpnzbibh';
  21. $port = '25';
  22.  
  23. $smtpOptions = new ezcMailSmtpTransportOptions();
  24. $smtpOptions->preferredAuthMethod = ezcMailSmtpTransport::AUTH_LOGIN;
  25.  
  26. $sender = new ezcMailMtaTransport($host, $username, $password, $port, $smtpOptions);
  27. try {
  28. $sender->send($message);
  29. echo '发生成功';
  30. } catch(ezcMailTransportException $e) {
  31. echo $e->getMessage();
  32. }

收到邮件:

  

打开邮件:

同样在 Linux 下同样会遇到腾讯邮箱直接拒收的问题。

三. 使用 PHPMailer 类

PHPMailer 版本 5.2.13

下载地址:https://github.com/Synchro/PHPMailer

Windows 下调试代码:

  1. <?php
  2.  
  3. header("content-type:text/html;charset=utf-8");
  4.  
  5. require 'PHPMailer/class.smtp.php';
  6. require 'PHPMailer/class.phpmailer.php';
  7.  
  8. try {
  9. $mail = new PHPMailer(true);
  10. $mail->IsSMTP();
  11. $mail->CharSet='UTF-8'; //设置邮件的字符编码,这很重要,不然中文乱码
  12. $mail->SMTPAuth = true; //开启认证
  13. $mail->Port = 25;
  14. $mail->Host = "smtp.qq.cn";
  15. $mail->Username = "472323087@qq.com";
  16. $mail->Password = "你的授权码";
  17. $mail->IsSendmail(); //windows下开启;linux下如果没有sendmail组件就注释掉,否则出现“Could not execute: /usr/sbin/sendmail”的错误提示
  18. $mail->AddReplyTo("472323087@qq.com","dee");//回复地址
  19. $mail->From = "472323087@qq.com";
  20. $mail->FromName = "472323087@qq.com";
  21. $to = "472323087@qq.com";
  22. $mail->AddAddress($to);
  23. $mail->Subject = "phpmailer测试标题";
  24. $mail->Body = "<h1>phpmail演示</h1>这是emperor对phpmailer的测试内容";
  25. $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; //当邮件不支持html时备用显示,可以省略
  26. $mail->WordWrap = 80; // 设置每行字符串的 长度
  27. //$mail->AddAttachment("d:/test.jpg"); //可以添加附件
  28. $mail->IsHTML(true);
  29. $mail->Send();
  30. echo '邮件已发送';
  31. } catch (phpmailerException $e) {
  32. echo "邮件发送失败:".$e->errorMessage();
  33. }

  

Linux 下修改 php.ini,注释

sendmail_path = /usr/sbin/sendmail -t -i

把程序中的

  1. $mail->IsSendmail();

也注释,可以完成包括对腾讯邮箱的邮件任务。

注意,邮件服务器尽量不要选腾讯邮箱。

参考:

PHP 在windows下配置sendmail,通过 mail() 函数发送邮件

Linux系统PHP使用sendmail发送邮件

linux用mail往qq邮箱发邮件

Sendmail.mc 配置文件详解

PHPMailer使用教程(PHPMailer发送邮件实例分析)

PHP (sendmail / PHPMailer / ezcMailComposer)发送邮件的更多相关文章

  1. PHPMailer不能发送邮件

    PHPMailer不能连接SMTP服务器,和修改SMTP大小写没有关系 (2011-10-22 12:17:35) 转载▼ 标签: php phpmailer 杂谈 分类: 默认分类 PHPmaile ...

  2. jenkins调用本地搭建sendmail邮件服务器发送邮件

    应用jenkins发送邮件的邮件服务器 SMTP server 可以是本地的,也可以是远程,远程的就不多说了,在此说一下如何在jenkins本地服务器上搭建邮件服务器,并用jenkins发送邮件,详细 ...

  3. phpmailer,smtp发送邮件实例(转)

    一,用phpmailer发送邮件 查看复制打印? <?php   include "class.phpmailer.php";    //包函邮件发送类      //邮件发 ...

  4. PHP通过phpmailer批量发送邮件功能

    前端页面代码: 注意:目前发送人使用的qq邮箱支持的不是特别友好.建议使用网易 新浪 163等其他邮箱. 需要用到phpmailer包 下载地址:https://sourceforge.net/pro ...

  5. 【PHPmailer】发送邮件(以163邮箱为例)

    1.参考TP社区:http://www.thinkphp.cn/code/989.html 2.phpmailer.rar下载地址:http://www.thinkphp.cn/code/downlo ...

  6. 如何用 PHPMailer 来发送邮件?

    <?php require_once('mantisbt-1.2.15/library/phpmailer/class.phpmailer.php'); $mail= new PHPMailer ...

  7. thinkphp5中使用phpmailer实现发送邮件功能(转载)

    一.开启SMTP服务(使用php发送邮件需要用到SMTP服务,这里以163邮箱的SMTP服务为例). 1.登录163邮箱,在首页上找到“设置”. 2.选择开启的服务,一般都全选,POP3/SMTP/I ...

  8. ThinkPHP 3.2 DEMO案例系列【phpmailer批量发送邮件】

    但是邮件和短信相比在一些场景依然有着重要的意义和优势: 1:零成本:发邮件没有费用: 2:内容丰富且量大:邮件可以长篇大论:图文并茂: 3:增加访问量:用户很容易通过邮件中的链接访问网站: 好了:下面 ...

  9. thinkphp5中使用phpmailer实现发送邮件功能

    一.开启SMTP服务(使用php发送邮件需要用到SMTP服务,这里以163邮箱的SMTP服务为例). 1.登录163邮箱,在首页上找到“设置”. 2.选择开启的服务,一般都全选,POP3/SMTP/I ...

随机推荐

  1. BMP文件格式

  2. 如何用angularjs给从后台传来数据添加链接

    <!DOCTYPE html> <html ng-app="myApp"> <head> <meta charset="UTF- ...

  3. PHP setcookie() 函数

    语法 setcookie(name,value,expire,path,domain,secure): name 必需.规定 cookie 的名称. value 必需.规定 cookie 的值. ex ...

  4. sublime3侧边栏颜色修改,推荐主题

    sublime侧边栏的颜色默认是灰白色的,下面方法可以手动定制颜色为深色: 需要修改的文件为: C:\program\Sublime\Packages\Theme - Default.sublime- ...

  5. 【krpano】汉化Web VR设置界面

    欢迎加入qq群551278936讨论krpano解密技术以及获取最新软件 krpano 1.19支持了Web VR功能,允许以VR的方式查看全景图,配合上VR设备可以实现VR效果. 在VR方式查看时, ...

  6. 使用div元素来包含内容

    在编写样式表时,经常要用到<div>元素来包含内容~~ 下面试简单的示例~ moreHigh.htm l <!DOCTYPE html> <html lang=" ...

  7. Mac常用终端命令

    一.基本命令 1.列出文件 ls 参数 目录名        例: 看看驱动目录下有什么:ls /System/Library/Extensions 参数 -w 显示中文,-l 详细信息, -a 包括 ...

  8. CentOS7下Oracle的自动备份

    概述 Linux下Oracle自动备份就没有MSSQL那么简单,在Linux下Oracle的备份需要借助crontab 指令,crontab 能够自动执行系统定时任务,通过配置crontab 指向Or ...

  9. Ubuntu菜鸟入门(三)—— 无用软件卸载,wps等常用软件安装

    一  移除不需要的软件 sudo apt-get remove libreoffice-common sudo apt-get remove unity-webapps-common sudo apt ...

  10. [原创]Centos7 内部常用软件升级计划

    GCC 当前系统版本 gcc version 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)