php邮件发送的两种方式


Posted in PHP onApril 28, 2020

这篇文章研究的主要内容就是使用PHP来发送电子邮件,总结为以下两种方法:

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

<?php 
$to = "test@163.com"; //收件人 
$subject = "Test"; //主题 
$message = "This is a test mail!"; //正文 
mail($to,$subject,$message);

结果就直接报错,如下:

Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() inD:/www/Zend/email/email.php on line 10

分析原因:本地需要有SMTP服务器,又改了下代码:

<?php 
$to = "test@163.com";//收件人 
$subject = "Test";//邮件主题 
$message = "This is a test mail!";//邮件正文 
ini_set('SMTP','smtp.163.com');//发件SMTP服务器 
ini_set('smtp_port',25);//发件SMTP服务器端口 
ini_set('sendmail_from',"admin@163.com");//发件人邮箱 
mail($to,$subject,$message);

结果还是错误:

Warning: mail() [function.mail]: SMTP server response: 553 authentication is required,smtp2,DNGowKD7v5BTDo9NnplVBA--.1171S2 1301220947 inD:/www/Zend/email/email.php on line 9

分析原因:需要验证信息,怎么写验证信息呢?在哪里配置呢?带着这些疑问参考一些技术文章后得出结论,使用mail()函数发送邮件就必须要有一台无需SMTP验证就可以发信的邮件服务器。但现在的SMTP邮件服务器基本上都是需要验证的,所以要想使用它发邮件就只能自己在本地搭一个不需要验证的SMTP服务器。搭建方法:用windows自带的IIS就可以,或者从网上下载其他的SMTP服务器软件。

结论:使用mail()函数发送邮件,就必须要有一台不需要验证的SMTP服务器。这样的话配置工作会多一点,但是使用的时候就比较省事了,几行代码就可以。

二、使用封装SMTP协议的邮件类

这种方法就比较常见了,尤其对于广大自己没有服务器,从网上购买虚拟主机的同学,第一种方法不现实,所以还是自己使用SMTP协议来发送邮件吧。

不过要完成这项工作的话,就需要你对SMTP协议有一定的了解,喜欢事必躬亲的同学可以自己动手写一个,喜欢拿来主义的同学就可以从网上下载了,有很多。

不过我比较推荐使用PEAR扩展中的Mail类功能强大:可以支持纯文本、HTML格式的邮件;各字段都可设置编码,正确配置不会出现中文乱码情况;可以支持附件等等。

在服务器可以使用pear install Mail 命令快速安装,没有足够服务器权限的同学也可以直接下载类的PHP源码包含进来就可以了。

注:Mail类依赖  Net/SMTP.php  和 Mail/mime.php ,要一块下载,使用时一块包含进来。

下面我举例说明一下在Mail类发送邮件的方法吧,网上其他SMTP邮件类使用方法一块也类似,可以参考:

<?php 
 
// Pear Mail 扩展 
require_once('Mail.php'); 
require_once('Mail/mime.php'); 
require_once('Net/SMTP.php'); 
 
$smtpinfo = array(); 
$smtpinfo["host"] = "smtp.163.com";//SMTP服务器 
$smtpinfo["port"] = "25"; //SMTP服务器端口 
$smtpinfo["username"] = "username@163.com"; //发件人邮箱 
$smtpinfo["password"] = "password";//发件人邮箱密码 
$smtpinfo["timeout"] = 10;//网络超时时间,秒 
$smtpinfo["auth"] = true;//登录验证 
//$smtpinfo["debug"] = true;//调试模式 
 
// 收件人列表 
$mailAddr = array('receiver@163.com'); 
 
// 发件人显示信息 
$from = "Name <username@163.com>"; 
 
// 收件人显示信息 
$to = implode(',',$mailAddr); 
 
// 邮件标题 
$subject = "这是一封测试邮件"; 
 
// 邮件正文 
$content = "<h3>随便写点什么</h3>"; 
 
// 邮件正文类型,格式和编码 
$contentType = "text/html; charset=utf-8"; 
 
//换行符号 Linux: \n Windows: \r\n 
$crlf = "\n"; 
$mime = new Mail_mime($crlf); 
$mime->setHTMLBody($content); 
 
$param['text_charset'] = 'utf-8'; 
$param['html_charset'] = 'utf-8'; 
$param['head_charset'] = 'utf-8'; 
$body = $mime->get($param); 
 
$headers = array(); 
$headers["From"] = $from; 
$headers["To"] = $to; 
$headers["Subject"] = $subject; 
$headers["Content-Type"] = $contentType; 
$headers = $mime->headers($headers); 
 
$smtp =& Mail::factory("smtp", $smtpinfo); 
 
 
$mail = $smtp->send($mailAddr, $headers, $body); 
$smtp->disconnect(); 
 
if (PEAR::isError($mail)) { 
 //发送失败 
 echo 'Email sending failed: ' . $mail->getMessage()."\n"; 
} 
else{ 
 //发送成功 
 echo "success!\n"; 
}

如果从网上找的SMTP类都是高度封装的,所以使用起来比上面会更简单,但使用方法都是比较相似的。

结论:这种方式发送邮件无需装任何软件,只需要包含进来一个PHP类,然后多写几行配置代码,就可以了。并且网上有很多示例的代码,很多时候只要复制过来然后修改个别的几个参数就可以用了,所以会很方便,推荐使用此方法。

以上就是使用PHP发送邮件的两种方法,有自己的思考过程,希望对大家的学习有所帮助。

PHP 相关文章推荐
树型结构列出指定目录里所有文件的PHP类
Oct 09 PHP
建站常用13种PHP开源CMS比较
Aug 23 PHP
PHP设计模式之迭代器模式的深入解析
Jun 13 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
Nov 19 PHP
php绘制一条弧线的方法
Jan 24 PHP
php include类文件超时问题处理
Feb 06 PHP
mysql_connect localhost和127.0.0.1的区别(网络层阐述)
Mar 26 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
Apr 27 PHP
php版微信小店调用api示例代码
Nov 12 PHP
PHP集成环境XAMPP的安装与配置
Nov 13 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
Apr 10 PHP
php利用array_search与array_column实现二维数组查找
Jul 08 PHP
php语言中使用json的技巧及json的实现代码详解
Oct 27 #PHP
php+ajax实现无刷新的新闻留言系统
Dec 21 #PHP
PHP测试成功的邮件发送案例
Oct 26 #PHP
php使用APC实现实时上传进度条功能
Oct 26 #PHP
php需登录的文件上传管理系统
Mar 21 #PHP
PHP文件缓存类实现代码
Oct 26 #PHP
php多线程实现方法及用法实例详解
Oct 26 #PHP
You might like
详细介绍PHP应用提速面面观
2006/10/09 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
2013/08/01 PHP
PHP合并静态文件详解
2014/11/14 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
JavaScript中property和attribute的区别详细介绍
2015/03/03 Javascript
PHP 数组current和next用法分享
2015/03/05 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
2015/08/21 Javascript
javascript截图 jQuery插件imgAreaSelect使用详解
2016/05/04 Javascript
Node.js的Web模板引擎ejs的入门使用教程
2016/06/06 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
bootstrap table实例详解
2017/01/06 Javascript
zTree树形插件异步加载方法详解
2017/06/14 Javascript
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
JavaScript高级函数应用之分时函数实例分析
2018/08/03 Javascript
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
Python判断对象是否为文件对象(file object)的三种方法示例
2019/04/26 Python
解决Python命令行下退格,删除,方向键乱码(亲测有效)
2020/01/16 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
python文件路径操作方法总结
2020/12/21 Python
Pretty You London官网:英国拖鞋和睡衣品牌
2019/05/08 全球购物
书法大赛策划方案
2014/06/04 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
财会专业大学生求职信
2014/09/26 职场文书
党委领导班子整改方案
2014/09/30 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
2015年安全月活动总结
2015/03/26 职场文书
考研导师推荐信范文
2015/03/27 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
宾馆卫生管理制度
2015/08/06 职场文书
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
2021/07/01 Java/Android
Spring实现内置监听器
2021/07/09 Java/Android