前段时间写了一篇博客:thinkphp集成系列之短信验证码、订单通知
说了这是一个短信通知泛滥的年代;大部分网站的邮箱注册都已经被短信注册所取代;
但是邮件和短信相比在一些场景依然有着重要的意义和优势;
1:零成本;发邮件没有费用;
2:内容丰富且量大;邮件可以长篇大论;图文并茂;
3:增加访问量;用户很容易通过邮件中的链接访问网站;
好了;下面来来为thinkphp集成邮件系统;
示例项目:https://github.com/baijunyao/thinkphp-bjyadmin
一:引入phpmail
从示例项目中复制两个文件到自己的项目;
/ThinkPHP/Library/Org/Nx/class.phpmailer.php ;
/ThinkPHP/Library/Org/Nx/class.smtp.php ;
不要从官网上下载;因为下载的phpmail直接引入thinkphp是有一些坑会报错的;
具体报什么错;年代久远;当年整合的时候没有记录;
二:设置配置项
/Application/Common/Conf/config.php
'EMAIL_FROM_NAME' => '', // 发件人
'EMAIL_SMTP' => '', // smtp
'EMAIL_USERNAME' => '', // 账号
'EMAIL_PASSWORD' => '', // 密码 注意: 163和QQ邮箱是授权码;不是登录的密码
'EMAIL_SMTP_SECURE' => '', // 链接方式 如果使用QQ邮箱;需要把此项改为 ssl
'EMAIL_PORT' => '25', // 端口 如果使用QQ邮箱;需要把此项改为 465
如果使用163邮箱;此处有一个坑;首先是要<span style="color: rgb(255, 0, 0);">开启smtp</span>;
开启过程中是要设置一个授权密码
;开启完成;又一个坑也就同步挖好了;
配置项中的EMAIL_PASSWORD 指的不是163邮箱的登录密码;而是授权密码
;
否则SMTP connect() failed;
三:发送邮件
/**
* 发送邮件
* @param string $address 需要发送的邮箱地址 发送给多个地址需要写成数组形式
* @param string $subject 标题
* @param string $content 内容
* @return boolean 是否成功
*/
function send_email($address,$subject,$content){
$email_smtp=C('EMAIL_SMTP');
$email_username=C('EMAIL_USERNAME');
$email_password=C('EMAIL_PASSWORD');
$email_from_name=C('EMAIL_FROM_NAME');
$email_smtp_secure=C('EMAIL_SMTP_SECURE');
$email_port=C('EMAIL_PORT');
if(empty($email_smtp) || empty($email_username) || empty($email_password) || empty($email_from_name)){
return array("error"=>1,"message"=>'邮箱配置不完整');
}
require_once './ThinkPHP/Library/Org/Nx/class.phpmailer.php';
require_once './ThinkPHP/Library/Org/Nx/class.smtp.php';
$phpmailer=new \Phpmailer();
// 设置PHPMailer使用SMTP服务器发送Email
$phpmailer->IsSMTP();
// 设置设置smtp_secure
$phpmailer->SMTPSecure=$email_smtp_secure;
// 设置port
$phpmailer->Port=$email_port;
// 设置为html格式
$phpmailer->IsHTML(true);
// 设置邮件的字符编码'
$phpmailer->CharSet='UTF-8';
// 设置SMTP服务器。
$phpmailer->Host=$email_smtp;
// 设置为"需要验证"
$phpmailer->SMTPAuth=true;
// 设置用户名
$phpmailer->Username=$email_username;
// 设置密码
$phpmailer->Password=$email_password;
// 设置邮件头的From字段。
$phpmailer->From=$email_username;
// 设置发件人名字
$phpmailer->FromName=$email_from_name;
// 添加收件人地址,可以多次使用来添加多个收件人
if(is_array($address)){
foreach($address as $addressv){
$phpmailer->AddAddress($addressv);
}
}else{
$phpmailer->AddAddress($address);
}
// 设置邮件标题
$phpmailer->Subject=$subject;
// 设置邮件正文
$phpmailer->Body=$content;
// 发送邮件。
if(!$phpmailer->Send()) {
$phpmailererror=$phpmailer->ErrorInfo;
return array("error"=>1,"message"=>$phpmailererror);
}else{
return array("error"=>0);
}
}
发送邮件调用函数示例;
// 发送单条邮件
send_email('baijunyao@baijunyao','邮件标题','邮件内容');
// 如果群发邮件 则传入数组即可
$emails=array('b1@baijunyao.com','b2@baijunyao.com');
send_email($emails,'邮件标题','邮件内容');
//********************回复 思念如酒 童鞋的分界线**************************
感谢 At zcl 童鞋的耐心解答;我整理下发在这里更直观些;
下面给出如何将表单传到后台的数据通过邮件发送的;
html部分:
<form action="" method="post">
<input type="text" name="name">
<input type="text" name="address">
<input type="text" name="phone">
<input type="submit" value="提交">
</form>
php部分:
$name=I('post.name');
$address=I('post.address');
$phone=I('post.phone',0,'intval');
// 拼接字符串方式
$str='姓名:'.$name.'<br>'.'地址:'.$address.'<br>'.'手机号:'.$phone.'<br>';
// 或者更直观的使用定界符:
$str=<<<html
姓名:$name <br>
地址:$address <br>
手机号:$phone
html;
// 发送邮件
send_email('baijunyao@baijunyao.com','邮件标题',$str);
//********************增加QQ邮箱配置方法的分割线**************************
鉴于很多童鞋都是使用QQ邮箱的;
这里把QQ邮箱的配置方法介绍下;省去踩坑的时间了;
1:首先要在QQ邮箱中开启POP3和IMAP;
2:生成授权码;
3:下载最新的bjyadmin更改配置项
/Application/Common/Conf/config.php
'EMAIL_FROM_NAME' => '发件人', // 发件人
'EMAIL_SMTP' => 'smtp.qq.com', // smtp
'EMAIL_USERNAME' => 'QQ邮箱', // 账号
'EMAIL_PASSWORD' => '授权码', // 密码 注意: 163和QQ邮箱是授权码;不是登录的密码
'EMAIL_SMTP_SECURE' => 'ssl', // 如果使用QQ邮箱;需要把此项改为 ssl
'EMAIL_PORT' => '465', // 如果使用QQ邮箱;需要把此项改为 465
需要注意的是
EMAIL_USERNAME是xxx@qq.com格式的QQ邮箱;不是QQ号;
EMAIL_PASSWORD是授权码;不是QQ密码;
//********************增加开启 扩展 方法的分割线**************************
首先在用phpinfo(); 查看php.ini文件的位置;
<?php
phpinfo();
然后搜索需要开启的扩展;删除前面的分号即可;
最后记得重启环境;
本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客https://baijunyao.com 欢迎捐赠赞赏加入组织创建QQ群及捐赠渠道
0 :我按这个设置了 评论后,就一直一个菊花图标 也没有报错,也没发邮件
2019-07-17 22:58:58 回复
li :博主你好,我在本地可以,在服务器上就SMTP Connect() failed.而且服务器上的php_openssl也是打开的,能帮助我一下么,实在解决不了
2018-07-10 14:38:06 回复
li :已经好了,换了个服务器就可以了
2018-07-10 16:25:43 回复
jtshushu :我在本地不可以服务喊叫可以
2018-07-05 15:42:04 回复
青春微凉々歌未央 :博主,TP5把class.phpmailer.php,class.smtp.php放在哪里呢
2018-06-16 19:22:40 回复
云淡风晴 :tp5支持 composer ;直接使用 composer 安装吧;
2018-06-24 19:41:14 回复
安氏~ :qq邮箱和163邮箱均测试成功。谢谢博主~
2018-01-26 14:36:39 回复
若采 :博主,我邮件发送成功了但对方却收不到,查看发送消息记录找不到,最后在草稿箱里找到了,全被存为草稿
2017-10-31 11:52:00 回复
云淡风晴 :换几个邮箱试试;
2017-11-08 00:01:28 回复
学会 :请问163邮箱 EMAIL_SMTP_SECURE填什么
2017-10-18 09:55:12 回复
云淡风晴 :空;
2017-11-08 00:02:54 回复
消逝的时光 :这个如何添加附件发送
2017-09-25 17:02:43 回复
云淡风晴 :这个是简单的邮件通知;附件需要自己根据文档扩展;
2017-11-08 00:03:18 回复
AS :博主,请问一下邮件分开发送有什么优化技巧吗,我看你现在的写法是把所有收件人添加到数组中一并发送,这样的效果是收件人能看到每个人的邮箱,而我现在想分开发送,我的做法是有多少个收件人,就send()多少次,这样可以达到我要的效果,但是好像效率太低了,不知道有没有更好的方法。
2017-07-28 16:46:18 回复
云淡风晴 :用队列;忽略效率的问题;
2017-11-08 00:03:46 回复
Ever :Array ( [error] => 1 [message] => SMTP connect() failed. )还是报错 qq邮箱在foxmail已经能登陆 open_ssl也开了
2017-04-12 15:44:09 回复
:密码错误
2017-05-04 13:45:54 回复
恋恋狗尾巴草 :为什么返回值是0可是没有收到?
2017-02-10 11:15:11 回复
恋恋狗尾巴草 :收到了。自动到垃圾箱去了
2017-02-10 11:17:36 回复
꧁Banana꧂ :有人吗额、、、、
2016-12-20 14:33:34 回复
꧁Banana꧂ :我的问题和下面的一样配置好了还是SMTP connect() failed. ),加Q1328383190
2016-12-20 11:06:45 回复
云淡风晴 :用foxmail或者网易邮箱app可以登录成功么?
2016-12-22 22:52:40 回复
꧁Banana꧂ :使用网易邮箱都不行
2016-12-29 10:20:51 回复
云淡风晴 :说明账号是有问题的;无法登陆;程序自然也是连接失败;
2017-01-02 14:07:23 回复
꧁Banana꧂ :可以加我Q么,我给账号和密码你试试
2017-01-10 16:25:40 回复
꧁Banana꧂ :知道什么问题了,删Runtime
2017-01-10 17:38:53 回复
:感谢啊!!原来缓存这么啃爹的
2018-11-15 16:23:38 回复
꧁Banana꧂ :几百年了你才回复
2018-11-15 16:25:54 回复
forward~ :博主,我按你的做法都弄好了,但是测试不成功,Array( [error] => 1 [message] => SMTP connect() failed. )返回这样,能不能在线交流下?
2016-12-16 23:37:47 回复
forward~ :我的QQ:2042831495
2016-12-16 23:39:30 回复
云淡风晴 :用foxmail或者网易邮箱app可以登录成功么?
2016-12-22 22:52:46 回复
花无不缺你一个 :一次可以群发多少个?
2016-11-11 21:28:05 回复
云淡风晴 :没有限制;
2016-11-11 22:35:18 回复
开心果 :我的QQ:312914434哈
2016-09-20 11:43:44 回复
云淡风晴 :加了;
2016-09-21 22:09:49 回复
开心果 :555,调用的时候出错了,可以加我QQ指导下吗?
2016-09-20 11:43:16 回复
开心果 :搞定,谢谢大侠
2016-09-20 15:52:59 回复
永威 :如果是全部配置填写正确之后发送邮件提示SMTP connect() failed 的错误,那么需要开启php的两个扩展 php_openssl和php_sockets,经过本人再三测试,确认无误
2016-09-20 00:43:04 回复
开心果 :请问如何开户这两扩展呀?
2016-09-20 14:21:02 回复
云淡风晴 :多谢提醒;
2016-09-20 22:30:08 回复
云淡风晴 :补充在文章的后面了;
2016-09-20 22:30:22 回复
开心果 :谢谢哈,又遇到了新的问题,没法群发
2016-09-21 10:03:58 回复
开心果 :搞定,哈哈
2016-09-21 12:00:04 回复
云淡风晴 :好吧;
2016-09-21 22:09:43 回复
Serene :发送失败了。。Array ( [error] => 1 [message] => SMTP connect() failed. )'EMAIL_FROM_NAME' => '发送人署名', // 发件人 'EMAIL_SMTP' => 'smtp.qq.com', // smtp 'EMAIL_USERNAME' => 'qq邮箱', // 账号 'EMAIL_PASSWORD' => 'qq密码', // 密码上面四个配置正确么?
2016-09-16 02:14:50 回复
Serene :对应qq邮箱账号已经开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务了
2016-09-16 02:16:38 回复
云淡风晴 :不是QQ密码的;是授权码;我写了QQ邮箱的详细的配置方法补充在文章后面了;你试试;
2016-09-16 14:51:29 回复
Serene :qq邮箱配置已经按你说的改好了,但是还是报错。Array( [error] => 1 [message] => SMTP connect() failed.)我只是修改你的开源项目的配置文件而已。接收邮件的那个邮箱需要开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务吗?
2016-09-16 15:48:35 回复
云淡风晴 :只改配置项是不行的;/Application/Common/Common/function.php 中的send_email函数也改了的;你复制下最新的函数试下;
2016-09-16 16:05:32 回复
Serene :已经解决。O(∩_∩)O谢谢你~我再看看源码。
2016-09-16 16:36:05 回复
云淡风晴 :不客气;
2016-09-16 18:56:10 回复
集想 :SMTP Error: data not accepted. 怎么解。 但是中途又发出去两三封,从测试开始到结束,基本都是一直返回这个, 163的邮箱
2016-09-10 00:19:48 回复
云淡风晴 :提示是说数据有问题;你把没发出的数据打印处理看看?
2016-09-11 00:34:59 回复
:请问send_email可以写在controller里么?
2016-09-08 17:27:54 回复
云淡风晴 :可以;
2016-09-08 20:58:30 回复
丿Amour _ :楼主大神 我把你的项目下载下来了 然后就是配置过之后发送邮件提示SMTP connect() failed 这是为什么啊 求回复
2016-09-06 18:43:47 回复
云淡风晴 :用的什么邮箱?
2016-09-06 23:33:57 回复
丿Amour _ :qq邮箱
2016-09-07 15:30:27 回复
丿Amour _ :是不是因为是版本的问题,我的是tp3.2的版本
2016-09-07 16:17:47 回复
云淡风晴 :需要先在QQ邮箱中开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务;而且QQ邮箱问题比较多;建议使用网易邮箱;
2016-09-07 23:54:54 回复
丿Amour _ :好吧 这几个是都要开吗?我用163的的确可以发了
2016-09-08 09:00:23 回复
丿Amour _ :qq邮箱的全都开启了 但是还是报错SMTP connect() failed
2016-09-08 09:24:56 回复
云淡风晴 :在文章的最后更新了QQ邮箱设置的方法可以参考;
2016-09-16 18:55:45 回复
晴枫 :请先登陆后回复评论
2016-12-08 12:59:47 回复
:QQ邮箱需要设置独立登录密码
2017-05-04 13:49:36 回复
思念如酒 :能不能通过邮件发送其他的数据,我试了下好像内容只支持文本不支持函数啊
2016-09-01 15:49:34 回复
云淡风晴 :是要发送附件么?
2016-09-01 22:18:37 回复
思念如酒 :我想把表单的信息整合成一个数组实时发送到邮箱,但是不知道怎么写,因为直接把函数放在send_email()里面会原样发出去
2016-09-03 13:58:10 回复
云淡风晴 :你需要循环表单数组;用br 换行拼接成字符串;然后发送;
2016-09-03 14:24:02 回复
思念如酒 :能不能麻烦您帮忙写个简单的小例子啊,比如发送name,address,phone三个字段,感激不尽
2016-09-03 14:30:41 回复
At zcl :send_email(XXX@XX.com,'邮件标题',I('post.name').''.I('post.address').''.I('post.phone'));
2016-09-03 23:06:25 回复
At zcl :<br> br被过来~~~
2016-09-03 23:08:43 回复
At zcl :刚刚的br被转义过滤了,,send_email(XXX@XX.com,'邮件标题',I('post.name').'<br>'.I('post.address').'<br>'.I('post.phone'));
2016-09-03 23:09:58 回复
云淡风晴 :不客气;补充在文章的后面了;
2016-09-04 00:01:09 回复
云淡风晴 :感谢耐心解答;
2016-09-04 00:01:22 回复
思念如酒 :谢谢博主!我成功了
2016-09-05 16:46:28 回复
思念如酒 :谢谢At zcl大大,我成功了!
2016-09-05 16:46:45 回复
晴枫 :dd
2016-12-08 13:00:58 回复
晴枫 :ddd
2016-12-08 13:01:10 回复
At zcl :同时发送2个不同邮件会报错(send_email(xxx,xx,xxx);send_email(xxx,xx,xxx)),Cannot redeclare class PHPMailer,,,
2016-08-25 10:59:06 回复
云淡风晴 :恩恩;非常感谢反馈;已经修复;发多个邮件;建议使用数组形式;详细的请看文章最后部分的示例;
2016-08-26 00:11:12 回复
At zcl :我主要是想同时给管理员跟留言者发送不同的内容的邮件,,
2016-08-31 15:38:51 回复
宁时修 :加个好友呗,盾友!邮箱回复我!
2016-08-24 09:39:22 回复
云淡风晴 :好的;加了;
2016-08-24 20:49:40 回复
尛暧-小尚 :你好,看了你写的邮件发送类,我再放到服务器上测试的时候出现500错误,这是程序的原因吗?希望您能回答下,谢谢
2016-08-22 19:44:09 回复
云淡风晴 :是在本地环境可以;到服务器环境就报错么?用的什么邮箱的?
2016-08-22 21:08:20 回复
尛暧-小尚 :163邮箱
2016-08-22 21:17:27 回复
尛暧-小尚 :是的,本地测试正常,服务器上就报错
2016-08-22 21:17:56 回复
云淡风晴 :开启php的报错信息;看下是什么错?
2016-08-22 21:38:04 回复
尛暧-小尚 :可以了,服务器的fsockopen问题,谢谢。持续关注。。
2016-08-25 17:55:58 回复
王者逸 :博主 请问怎么传入数组群发呢 可以给个简单的代码吗 有知道的告诉我下 谢谢
2016-08-06 11:12:58 回复
云淡风晴 :array('baijunyao1@baijunyao.com','baijunyao2@baijunyao.com')这种写法即可;
2016-08-07 21:16:52 回复
王者逸 :谢谢
2016-08-07 23:54:31 回复
郭明磊 :感谢整合!
2016-08-01 19:52:51 回复
一叶知秋 :我用126的可以,但是用qq不行啊 EMAIL_PASSWORD是qq登陆密码不行,验证码也不可以啊,你知道怎么回事吗
2016-07-09 12:40:49 回复
一叶知秋 :可以了
2016-07-09 12:57:00 回复
年华别诗酒 : 用QQ提示发送成功但是没收到啊。' ‘EMAIL_FROM_NAME' => '398627895@qq.com', // 发件人 'EMAIL_SMTP' => 'smtp.qq.com', // SMTP服务器 'EMAIL_USERNAME' => '398627895@qq.com', // 账号 'EMAIL_PASSWORD' => 'xxxxxx', // 密码 有什么错吗 不需要改端口号吗?
2016-07-14 11:07:49 回复
年华别诗酒 :我把QQ邮箱那个SMTP/POP3开启了 也是能发送 接收不到。
2016-07-14 17:15:26 回复
哈哈哈哈哈哈 :是不是在垃圾邮件里
2016-08-12 09:52:49 回复
べ :可以了,填错smtp了
2016-07-07 15:57:59 回复
べ :为什么发送不了
2016-07-07 15:49:33 回复
一叶知秋 :你写的东西很好,很实用,想你学习
2016-07-05 21:03:17 回复
云淡风晴 :谢谢;
2016-07-05 21:39:02 回复
Oyghan :不好意思,是我网络的问题了,现在成功了。谢谢博主
2016-06-14 15:09:26 回复
宁时修 :lz Hou dun wang Bi ye de ?
2016-06-14 11:34:53 回复
云淡风晴 :是的;
2016-06-14 11:42:58 回复
Oyghan :我也是**网毕业的
2016-06-14 16:50:34 回复
云淡风晴 :好巧;
2016-06-14 17:18:13 回复
宁时修 :(*^__^*) 嘻嘻……,被我猜对了。我也是哦,57期的
2016-06-18 20:30:50 回复
宁时修 :你这个类我用过了,可以用。
2016-06-18 20:31:17 回复
宁时修 :lz为何博客不弄个评论消息推送,为了看回复还要进详情页才能看到。
2016-06-18 20:34:10 回复
宁时修 :回复错了。
2016-06-18 20:34:42 回复
宁时修 :回复错了,不过你那里应该可以看到。(*^__^*) 嘻嘻……
2016-06-18 20:35:15 回复
云淡风晴 :有推送的;如果填写了接收回复的email地址;有回复的时候是会给你发邮件通知的;
2016-06-20 09:04:20 回复
宁时修 :加个好友呗。盾友!
2016-08-24 09:38:20 回复
Oyghan :你好,我亲自测试没有反应啊?大家有没有成功的?给个案例参考参考,谢谢大家
2016-06-14 10:56:52 回复
云淡风晴 :你用的什么邮箱?我写文章的时候;用的是163测试的;可以发送成功;
2016-06-14 11:10:58 回复
Oyghan :不好意思,是我网络的问题了,现在成功了。谢谢博主
2016-06-14 15:09:54 回复
云淡风晴 :不客气;
2016-06-14 15:12:31 回复
梦如人生 :Think you!
2016-05-24 23:40:11 回复
云淡风晴 :不客气;
2016-06-14 11:42:50 回复
最新评论