一. 使用 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() 函数发送邮件

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. gulp使用技巧-删除node_modules文件夹,解决目录层次太深删除报错的问题

    问题描述: 在使用gulp当中,自动生成的node_modules文件夹,因为文件目录层级太深,无法系统删除,用360粉碎工具也报错 解决方法: 使用npm中的插件rimraf,专门用于删除的模块插件 ...

  2. espcms列表页ajax无限加载

    类似百度图片的效果,滚动到底部后,点击加载更多,加载出第二页,第三页... 替代了传统的上一页,下一页,第几页,以达到在某些情况下使得用户体验更好. 二次开发方法: 1.先在模板文件中增加ajax文件 ...

  3. java notepad++

  4. 移动端web开发技巧

    META相关 1. 添加到主屏后的标题(IOS)

  5. DOM动画效果的基础入门2

    一.动画效果 Transform字面上就是变形,改变的意思,在css3中transform主要包括以下几种: 选转 rotate,扭曲 skew 缩放 scale 和移动translate 以及矩形变 ...

  6. VS更改编辑窗背景

    打开Visual Studio  工具→扩展和更新→联机  在搜索框里输入“background”后,搜索结果有很多插件可以更改 Visual Studio 的背景,选择其中的一项,可以在右边进行预览 ...

  7. POJ 3261 Milk Patterns 后缀数组求 一个串种 最长可重复子串重复至少k次

    Milk Patterns   Description Farmer John has noticed that the quality of milk given by his cows varie ...

  8. 添加已运行daemon进程(falcon-agent)到supervisor测试

    falcon-agent now is running already, pid= falcon-agent now is running already, pid= falcon-agent now ...

  9. 【Spring】获取资源文件+从File+从InputStream对象获取正文数据

    1.获取资源文件或者获取文本文件等,可以通过Spring的Resource的方式获取 2.仅有File对象即可获取正文数据 3.仅有InputStream即可获取正文数据 package com.sx ...

  10. 命名函数、eval创建局部变量

    1.命名函数 var f = function double(){return x *2;} 该语句将函数绑定到变量f,而不是变量double 匿名的函数表达式: var f = function(x ...