热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP(sendmail/PHPMailer/ezcMailComposer)发送邮件

一.使用PHP内置的mail()函数1.Windows下环境:WampServer2.5(Windows10,Apache2.4.9,MySQL5.6.17,PHP

一. 使用 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服务” -- “生成授权码”

 

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

 

④ 测试发送邮件:

 

 

收到邮件:

  

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

 

收到邮件:

  

打开邮件:

  

说明:

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

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

";

$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 邮箱就没有问题,可能还是和主机设置有关。

最终代码:

"; //决定邮件的发件人显示

$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 服务器直接通信:

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
$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 下调试代码:

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 = "

phpmail演示

这是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发送邮件实例分析)


推荐阅读
  • 搭建个人博客:WordPress安装详解
    计划建立个人博客来分享生活与工作的见解和经验,选择WordPress是因为它专为博客设计,功能强大且易于使用。 ... [详细]
  • 本文探讨了在Windows系统中运行Apache服务器时频繁出现崩溃的问题,并提供了多种可能的解决方案和建议。错误日志显示多个子进程因达到最大请求限制而退出。 ... [详细]
  • 本文详细介绍了在PHP中如何获取和处理HTTP头部信息,包括通过cURL获取请求头信息、使用header函数发送响应头以及获取客户端HTTP头部的方法。同时,还探讨了PHP中$_SERVER变量的使用,以获取客户端和服务器的相关信息。 ... [详细]
  • Docker基础入门与环境配置指南
    本文介绍了Docker——一款用Go语言编写的开源应用程序容器引擎。通过Docker,用户能够将应用及其依赖打包进容器内,实现高效、轻量级的虚拟化。容器之间采用沙箱机制,确保彼此隔离且资源消耗低。 ... [详细]
  • Windows环境下Oracle数据库迁移实践
    本文详细记录了一次在Windows操作系统下将Oracle数据库的控制文件、数据文件及在线日志文件迁移至外部存储的过程,旨在为后续的集群环境部署做好准备。 ... [详细]
  • 本文详细介绍了在 CentOS 系统中如何创建和管理 SWAP 分区,包括临时创建交换文件、永久性增加交换空间的方法,以及如何手动释放内存缓存。 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 使用REM和媒体查询实现响应式布局
    本文介绍如何利用REM单位和媒体查询(Media Queries)来创建适应不同屏幕尺寸的网页布局。通过具体示例,展示在不同屏幕宽度下如何调整页面元素的样式。 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • Maven快照版本管理及更新策略详解
    本文深入探讨了Maven中的快照版本管理和更新策略,解释了快照版本与正式版本的区别,并提供了如何配置快照更新策略的方法,以确保项目依赖始终保持最新。 ... [详细]
  • 本文将详细介绍YII2.0框架中应用主体文件index.php的作用和运行流程。 ... [详细]
  • Composer 无法加载本地第三方库?如何解决这一常见问题 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • PHP服务接口的专业测试方法与实践 ... [详细]
author-avatar
快乐伴随su1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有