thinkphp整合系列之phpmailer批量发送邮件

前段时间写了一篇博客: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邮箱;此处有一个坑;首先是要开启smtp

白俊遥博客

白俊遥博客

开启过程中是要设置一个授权密码;开启完成;又一个坑也就同步挖好了;

配置项中的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();

白俊遥博客

然后搜索需要开启的扩展;删除前面的分号即可;

白俊遥博客


最后记得重启环境;



白俊遥博客
请先登陆后发表评论
  • 最新评论
  • 总共22条评论
白俊遥博客

花无不缺你一个:一次可以群发多少个?

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 回复 Serene:对应qq邮箱账号已经开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务了
  • 2016-09-16 02:16:38 回复
白俊遥博客
  • 云淡风晴 回复 Serene:不是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 回复
白俊遥博客
  • 云淡风晴 回复 Serene:只改配置项是不行的;/Application/Common/Common/function.php 中的send_email函数也改了的;你复制下最新的函数试下;
  • 2016-09-16 16:05:32 回复
白俊遥博客
  • Serene 回复 云淡风晴:已经解决。O(∩_∩)O谢谢你~我再看看源码。
  • 2016-09-16 16:36:05 回复
白俊遥博客
  • 云淡风晴 回复 Serene:不客气;
  • 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 回复

白俊遥博客
  • 云淡风晴 回复 丿Amour _:用的什么邮箱?
  • 2016-09-06 23:33:57 回复
白俊遥博客
  • 丿Amour _ 回复 云淡风晴:qq邮箱
  • 2016-09-07 15:30:27 回复
白俊遥博客
  • 丿Amour _ 回复 云淡风晴:是不是因为是版本的问题,我的是tp3.2的版本
  • 2016-09-07 16:17:47 回复
白俊遥博客
  • 云淡风晴 回复 丿Amour _:需要先在QQ邮箱中开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务;而且QQ邮箱问题比较多;建议使用网易邮箱;
  • 2016-09-07 23:54:54 回复
白俊遥博客
  • 丿Amour _ 回复 云淡风晴:好吧  这几个是都要开吗?我用163的的确可以发了
  • 2016-09-08 09:00:23 回复
白俊遥博客
  • 丿Amour _ 回复 丿Amour _:qq邮箱的全都开启了   但是还是报错SMTP connect() failed 
  • 2016-09-08 09:24:56 回复
白俊遥博客
  • 云淡风晴 回复 丿Amour _:在文章的最后更新了QQ邮箱设置的方法可以参考;
  • 2016-09-16 18:55:45 回复
白俊遥博客
  • 晴枫 回复 丿Amour _:请先登陆后回复评论
  • 2016-12-08 12:59:47 回复
白俊遥博客

思念如酒:能不能通过邮件发送其他的数据,我试了下好像内容只支持文本不支持函数啊

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 回复
白俊遥博客
  • 云淡风晴 回复 At zcl:感谢耐心解答;
  • 2016-09-04 00:01:22 回复
白俊遥博客
  • 思念如酒 回复 云淡风晴:谢谢博主!我成功了
  • 2016-09-05 16:46:28 回复
白俊遥博客
  • 思念如酒 回复 At zcl:谢谢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 回复

白俊遥博客
  • 云淡风晴 回复 At zcl:恩恩;非常感谢反馈;已经修复;发多个邮件;建议使用数组形式;详细的请看文章最后部分的示例;
  • 2016-08-26 00:11:12 回复
白俊遥博客
  • At zcl 回复 云淡风晴:我主要是想同时给管理员跟留言者发送不同的内容的邮件,,
  • 2016-08-31 15:38:51 回复
白俊遥博客

Cocolait白俊遥博客加个好友呗,盾友!邮箱回复我!

2016-08-24 09:39:22 回复

白俊遥博客
  • 云淡风晴 回复 Cocolait:好的;加了;
  • 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 回复

白俊遥博客

Cocolait:lz Hou dun wang Bi ye de ?

2016-06-14 11:34:53 回复

白俊遥博客
  • 云淡风晴 回复 Cocolait:是的;
  • 2016-06-14 11:42:58 回复
白俊遥博客
  • Oyghan 回复 Cocolait:我也是后盾网毕业的
  • 2016-06-14 16:50:34 回复
白俊遥博客
  • 云淡风晴 回复 Oyghan:好巧;
  • 2016-06-14 17:18:13 回复
白俊遥博客
  • Cocolait 回复 云淡风晴:(*^__^*) 嘻嘻……,被我猜对了。我也是哦,57期的
  • 2016-06-18 20:30:50 回复
白俊遥博客
  • Cocolait 回复 Cocolait:你这个类我用过了,可以用。
  • 2016-06-18 20:31:17 回复
白俊遥博客
  • Cocolait 回复 Cocolait:lz为何博客不弄个评论消息推送,为了看回复还要进详情页才能看到。
  • 2016-06-18 20:34:10 回复
白俊遥博客
  • Cocolait 回复 Cocolait:回复错了。
  • 2016-06-18 20:34:42 回复
白俊遥博客
  • Cocolait 回复 云淡风晴:回复错了,不过你那里应该可以看到。(*^__^*) 嘻嘻……
  • 2016-06-18 20:35:15 回复
白俊遥博客
  • 云淡风晴 回复 Cocolait:有推送的;如果填写了接收回复的email地址;有回复的时候是会给你发邮件通知的;
  • 2016-06-20 09:04:20 回复
白俊遥博客
  • Cocolait 回复 云淡风晴:加个好友呗。盾友!
  • 2016-08-24 09:38:20 回复
白俊遥博客

Oyghan:你好,我亲自测试没有反应啊?大家有没有成功的?给个案例参考参考,谢谢大家

2016-06-14 10:56:52 回复

白俊遥博客
  • 云淡风晴 回复 Oyghan:你用的什么邮箱?我写文章的时候;用的是163测试的;可以发送成功;
  • 2016-06-14 11:10:58 回复
白俊遥博客
  • Oyghan 回复 云淡风晴:不好意思,是我网络的问题了,现在成功了。谢谢博主
  • 2016-06-14 15:09:54 回复
白俊遥博客
  • 云淡风晴 回复 Oyghan:不客气;
  • 2016-06-14 15:12:31 回复
白俊遥博客

梦如人生:Think you!

2016-05-24 23:40:11 回复

白俊遥博客
  • 云淡风晴 回复 梦如人生:不客气;
  • 2016-06-14 11:42:50 回复