### 邮件发送原理
![](https://box.kancloud.cn/45b4d3dd5455ca45a65b1a4c59255f3a_2446x1098.jpeg)
如果使用阿里云邮箱发送文件,邮箱内容先到阿里云服务器,然后阿里云服务器在转发给新浪服务器,新浪服务器在转发给用户。
### telnet模拟邮件发送
#### 准备工作:
1)2个邮箱,建议用sina和aliyun邮箱
2)确保telnet命令被允许使用
cmd命令行下:使用telnet工具连上某个邮箱服务的smtp服务器,如aliyun(阿里云):
telnet smtp.aliyun.com 25
### 利用phpmailer类实现邮件发送
phpmailer 下载地址:https://github.com/PHPMailer/PHPMailer/
~~~
//获取邮件设置信息
$email_host = getConfigValue('email_host');
$email_title = getConfigValue('email_title');
$email_name = getConfigValue('email_name');
$email_user = getConfigValue('email_user');
$email_password = getConfigValue('email_password');
Vendor('PHPMailer.class#phpmailer');
//实例化PHPMailer类,true表示出现错误时抛出异常
$mail = new \PHPMailer();
// 使用SMTP
try{
$mail->IsSMTP();
$mail->Host = "smtp.aliyun.com"; // SMTP server
$mail->SMTPAuth = true; // 服务器需要验证
$mail->CharSet ="UTF-8"; //设定邮件编码
$mail->Username = $email_user; //SMTP服务器的用户帐号
$mail->Password = $email_password; //SMTP服务器的用户密码
//$mail->Port = 25; // 设置端口,使用默认就可以
// $mail->SMTPDebug = 1; // 启用SMTP调试 1 = errors 2 = messages
$mail->SetFrom("chenruiqiang@yd-x.com","gather"); //发件人
if (is_array($tomail)){
foreach ($tomail as $m){
$mail->AddAddress("liushuyu@yd-x.com", 'liushuyu'); //收件人
}
}else{
$mail->AddAddress($tomail, 'user');
}
$mail->Subject = $title; //邮件主题
$mail->AddReplyTo($email_name,$email_title); //收件人回复时回复到此邮箱,可以多次执行该方法
if($file != '' OR $file != NULL){
$rootpath = $_SERVER['DOCUMENT_ROOT'];
$filepath = $rootpath.$file;
$mail->AddAttachment($filepath,$filename); // 添加附件,并指定名称
}
$mail->Body = $content; //以下是邮件内容相关
$mail->IsHTML(true); //主题是否包含html内容
$mail->Send();
return true;
}catch (Exception $e){
return false;
}
~~~
### 为什么需要队列
我们需要给网站所有用户发送一封系统通知邮件,假设网站有10000个注册用户,发送没封邮件需要0.1秒,执行一次发送通知操作需要多长时间?
10000 X 0.1 = 1000秒 = 16(分)
使用队列先到先发送
使用phpcli 模式。
php cli模式不依靠apache
~~~
$count = 0;
while(true){
$count ++ ;
echo $count.'\r\n';
if($count >= 10){
break;
}
sleep(3);停止3秒
echo 'done'
}
~~~
1)触发队列
exec函数触发cli模式
exec('php.exe文件绝对路径 cli_test.php',)
注意:为了能保持在后台运行,此程序必须将输出重定向到文件或其它输出流。否则会导致 PHP 挂起,直至程序执行结束。
~~~
<?php
function execInBackground($cmd) {
if (substr(php_uname(), 0, 7) == "Windows"){
pclose(popen("start /B ". $cmd, "r"));
}
else {
exec($cmd . " > /dev/null &");
}
}
?>
~~~
### 在phpcli模式下测试队列
~~~
//判断队列进程是否在执行
public function testCmd(){
exec("ps aux | grep /hphc.yd-x.com/Public/mysql/quene_recommand.php",$output,$returnvalue);
if(count($output) == 3 && $returnvalue == 0){
return true;
}else{
echo '0';
return false;
}
}
~~~
### Ajax异步触发队列
使用jquery Ajax 出发队列操作
- 简介
- Cookie
- HTML5 LocalStorage
- session
- 当浏览器关闭后,Session就销毁了吗?
- mysql数据库保存session
- HTTP协议的由来
- fsockopen异步请求
- http防盗链
- Apache伪静态知识补充
- 大并发量解决方案
- 大型网站是怎样解决多用户高并发访问
- 网站高并发 大流量访问的处理及解决方法
- 并发数与在线客户数 注册用户数的关系
- 即时聊天程序
- 反向Ajax实现
- ob缓存作用
- 浅聊并发之战
- php扩展安装
- php安装redis扩展
- SQLMap自动化实施SQL注入共计
- 命名空间namespace
- 集群和分布式之【session共享】
- php Redis存储Session 【1】
- php Redis存储Session 【2】
- php mysql存储session【1】
- php缓存
- 文件缓存
- memcache和redis的比较
- 原生session与session in redis对比
- XSS攻击【1】
- XSS攻击【2】
- PHP消息队列
- php+mysql 模拟发送邮件队列
- php+mysql 模拟订单处理队列
- php+redis 模拟秒杀队列
- RabbitMQ 消息队列系统
- beanstalkd
- PHP构建即时通讯
- WebSocket协议
- workerman
- PHP变量的作用域
- PHP传值和传引用的区别
- PHP匿名函数
- PHP递归函数&应用
- PHP单例模式
- PHP性能优化
- RESTful
- 集群
- 增加pgsql扩展
- php.ini路径查找
- Swoole Compiler
- mysql 主从
- 主从
- mysql-proxy
- window docker环境