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 相关文章推荐
Windows下PHP5和Apache的安装与配置
Sep 05 PHP
一些关于PHP的知识
Nov 17 PHP
php for 循环语句使用方法详细说明
May 09 PHP
php运行出现Call to undefined function curl_init()的解决方法
Nov 02 PHP
php各种编码集详解和以及在什么情况下进行使用
Sep 11 PHP
php图片缩放实现方法
Feb 20 PHP
php实现html标签闭合检测与修复方法
Jul 09 PHP
WordPress中用于检索模版的相关PHP函数使用解析
Dec 15 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
May 12 PHP
PHP引用返回用法示例
May 28 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 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 文章采集正则代码
2009/12/28 PHP
在smarty中调用php内置函数的方法
2013/02/07 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
2015/10/08 PHP
PHP入门教程之数组用法汇总(创建,删除,遍历,排序等)
2016/09/11 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
2019/10/17 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
AspNet中使用JQuery boxy插件的确认框
2015/05/20 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
2015/12/07 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
AngularJS入门教程之多视图切换用法示例
2016/11/02 Javascript
JavaScript之class继承_动力节点Java学院整理
2017/07/03 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
ReactJS实现表单的单选多选和反选的示例
2017/10/13 Javascript
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
vue下axios拦截器token刷新机制的实例代码
2020/01/17 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
Vue结合路由配置递归实现菜单栏功能
2020/06/16 Javascript
python 获取et和excel的版本号
2009/04/09 Python
Python判断字符串与大小写转换
2015/06/08 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
2017/08/18 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
安装PyInstaller失败问题解决
2019/12/14 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
浅析Python迭代器的高级用法
2020/07/16 Python
幼儿园新学期寄语
2014/01/18 职场文书
致跳高运动员加油稿
2014/02/12 职场文书
亲戚关系证明
2015/06/24 职场文书
社区低保工作总结2015
2015/07/23 职场文书