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 相关文章推荐
example2.php
Oct 09 PHP
缓存技术详谈―php
Dec 14 PHP
常用的php对象类型判断
Aug 27 PHP
作为PHP程序员应该了解MongoDB的五件事
Jun 03 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
Mar 18 PHP
PHP伪静态Rewrite设置之APACHE篇
Jul 30 PHP
PHP获取文件扩展名的4种方法
Nov 24 PHP
PHP获取文件扩展名的方法实例总结
Jun 10 PHP
php实现简单的权限管理的示例代码
Aug 25 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
May 05 PHP
PHP常量define和const的区别详解
May 18 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中的
2016/04/23 PHP
js获取提交的字符串的字节数
2009/02/09 Javascript
javascript 对象定义方法 简单易学
2009/03/22 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
2013/03/25 Javascript
非常好用的JsonToString 方法 简单实例
2013/07/18 Javascript
JsRender for object语法简介
2014/10/31 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
2018/02/26 Javascript
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
vue实现移动端触屏拖拽功能
2020/08/21 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
2020/11/20 Vue.js
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
Python3实现购物车功能
2018/04/18 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
Python Web版语音合成实例详解
2019/07/16 Python
详细分析Python collections工具库
2020/07/16 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
CSS3中animation实现流光按钮效果
2020/12/21 HTML / CSS
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
英国工具中心:UK Tool Centre
2017/07/10 全球购物
铭万公司.net面试题笔试题
2014/07/20 面试题
电大毕业生自我鉴定
2013/11/10 职场文书
幼教个人求职信范文
2013/12/02 职场文书
考试作弊检讨书大全
2014/02/18 职场文书
高中军训感言400字
2014/02/24 职场文书
说明书格式及范文
2014/05/07 职场文书
考博专家推荐信
2014/05/10 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
爱岗敬业先进典型事迹材料(2016推荐版)
2016/02/26 职场文书
Vue提供的三种调试方式你知道吗
2022/01/18 Vue.js
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python
python读取并查看npz/npy文件数据以及数据显示方法
2022/04/14 Python