phpswoole发邮件,Swoole实验室:3-使⽤Swoole批量发送
邮件
建⽴任务
接上⼀节代码,编辑src/App/Mail.php⽂件代码,在public function onTask()⽅法中增加批量队列发送邮件的代码:
public function onTask(swoole_server $serv, $task_id, $from_id, $data)
{
$res['result'] = 'failed';
$req = json_decode($data, true);
$action = $req['action'];
echo date('Y-m-d H:i:s')." onTask: [".$action."].\n";
switch ($action) {
case 'sendMail': //发送单个邮件
$mailData = [
'emailAddress' => 'abc@example', //接收⽅,改成⾃⼰的邮箱可以测试接收邮件
'subject' => 'swoole实验室',
'body' => '测试This is the HTML message body.',
'attach' => '/home/swoole/public/a.jpg'
];
$this->sendMail($mailData);
break;
case 'sendMailQueue': // 批量队列发送邮件
$this->sendMailQueue();
晋江小说排行榜
break;
default:
break;
}
}
建⽴Redis队列
由于发送的邮件⽐较多,我们把邮件列表事先保存在Redis队列中。我们知道Redis的使⽤场景很多,其中就可以⽤它来做简单的队列。我们在任务中调⽤了sendMailQueue()⽅法,继续在Mail.php中添加:
// 邮件发送队列
private function sendMailQueue()
{
$redis = new \Redis();
$redis->connect('127.0.0.1', 6379);
$password = '123';
$redis->auth($password);
swoole_timer_tick(1000, function($timer) use ($redis) { // 启⽤定时器,每1秒执⾏⼀次
$value = $redis->lpop('mailerlist');
if($value){
//echo '获取redis数据:' . $value;
$json = json_decode($value, true);
$start = microtime(true);
$rs = $this->sendMail($json);
乒乓球第一次混双
$end = microtime(true);
if ($rs) {
echo '发送成功!'.$value.', 耗时:'. round($end - $start, 3).'秒'.PHP_EOL;
} else { // 把发送失败的加⼊到失败队列中,⼈⼯处理
杭州旅社$redis->rpush("mailerlist_err", $value);
}
}else{
swoole_timer_clear($timer); // 停⽌定时器
echo "Emaillist出队完成";
}
});
}
上述代码中,先尝试连接Redis,然后使⽤Swoole的swoole_timer_tick()函数,它是个定时器,这个函数跟js的interval()函数⼀样,意思是每隔⼀定时间执⾏⼀次,它可以定义毫秒级粒度。很显然,上述代码中,每隔1000毫秒(1秒)从Redis队列mailerlist中取出⼀条,即⼀个邮件对象,然后执⾏发送邮件sendMail(),当发送完所有邮件后,使⽤swoole_timer_clear()关闭定时器即可。定时器的间隔时间可以调整。
客户端
在客户端,我们先往Redis队列⾥添加邮件内容,然后向服务端发起sendMailQueue批量发邮件指令。
class Client
{
private $client;
public function __construct() {
$this->client = new swoole_client(SWOOLE_SOCK_TCP);
}
public function connect() {
if( !$this->client->connect("127.0.0.1", 9502 , 1) ) {
echo "Error: {$this->client->errMsg}[{$this->client->errCode}]\n"; }
$action = 'sendMailQueue';
$time = time();
$key = 'MYgGnQE33ytd2jDFADS39DSEWsdD24sK';
$token = md5($action.$time.$key);
$data = [
'action' => $action,
'token' => $token,
'timestamp' => $time
];
$msg = json_encode($data);
$this->client->send( $msg );
$message = $this->client->recv();
echo "Get Message From Server:{$message}\n";寻自己
}怎么关闭qq空间
}
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$password = '123';
$redis->auth($password);
$arr = [];
$arr[0] = [
'subject' => '国庆⼤酬宾,全场1折',
'emailAddress' => 'axxxx@example',
'body' => '您好,国庆期间⼤酬宾,全场所有商品统统1折甩卖。'
];
$arr[1] = [
'subject' => '注册会员送100⾦币',
感恩节短信祝福'emailAddress' => 'bxxxx@example',
'body' => '邮件内容'
];
$arr[2] = [
'subject' => '国庆⼤酬宾,全场1折',
'emailAddress' => 'cxxxxx@example',
'body' => '邮件内容2'
];
foreach ($arr as $k=>$v) {
$redis->rpush("mailerlist", json_encode($v, JSON_UNESCAPED_UNICODE));
}
$client = new Client();
$client->connect();
验证
根据上⼀节内容,我们应该先启动服务端,看到Swoole服务端启动好了,我们再运⾏客户端:
php mailClient.php
然后你可以去查看对⽅邮箱是否收到相关邮件。
本⽂中使⽤了redis作为简单队列,你也可以使⽤复杂点的队列rabbitmq。你也可以使⽤Crontab来做定时任务,不过它最⼩粒度是分钟级别的。当然对于批量发送邮件,如果你不⽤php的话,可以⽤Python或者Java,它们都有相当成熟的解决⽅案。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论