PHP+swoole 异步发送Email

用到的库:swoole , PHPMailer , thinkphp5

用SWOOLE 新建一个服务



namespace app\common\service;


class EmailService
{

	/**
	 * description:服务端
	 */
	public function email_server(){

		$serv = new \swoole_server('127.0.0.1',8122);

		$serv->set(array('task_worker_num' => 4));

		$serv->on('receive', function($serv, $fd, $from_id, $data) {
			//把收到的数据 提交到异步回调中
			$task_id = $serv->task($data);
		});

		$serv->on('task', function ($serv, $task_id, $from_id, $data) {
			//接受数据,发送邮箱信息
			$data = json_decode($data,true);
			if(isset($data['email'])){
				(new SmtpMail())->send($data['email'],$data['code'],$data['msg']);
			}
			$serv->finish('');
		});

		$serv->on('finish', function ($serv, $task_id, $data) {
		});

		$serv->start();
	}

}

SmtpMail类


namespace app\common\service;

use app\common\model\SystemLog;
use PHPMailer\PHPMailer\PHPMailer;
use think\Exception;
use think\Log;

class SmtpMail
{

	private $host;
	private $port = 25;
	private $user;
	private $pass;
	private $sock;
	private $mail_format = 0;

	public function __construct()
	{

	}

	public function send($email,$code,$msg){

		$mail = new PHPMailer(true);                              // Passing `true` enables exceptions
		try {
			//服务器配置
			$mail->CharSet ="UTF-8";                     //设定邮件编码

			$mail->SMTPDebug = 0;                        // 调试模式输出
			$mail->isSMTP();                             // 使用SMTP
			$mail->Host = 'smtp.163.com';                // SMTP服务器
			$mail->SMTPAuth = true;                      // 允许 SMTP 认证
			$mail->Username = 'xxx';                // SMTP 用户名  即邮箱的用户名
			$mail->Password = 'xxx';             // SMTP 密码  部分邮箱是授权码(例如163邮箱)

			$mail->setFrom('[email protected]', 'xxx');  //发件人
			$mail->addAddress($email, 'xxx');  // 收件人
			$mail->addReplyTo('[email protected]', 'xxx'); //回复的时候回复给哪个邮箱 建议和发件人一致
			//Content
			$mail->isHTML(true);                                  // 是否以HTML文档格式发送  发送后客户端可直接显示对应HTML内容
			$mail->Subject = 'xxx';
			$mail->Body    = $msg;
			$mail->AltBody = $msg;

			$res = $mail->send();
			return ['code'=>1,'msg'=>'发送成功'];

		} catch (Exception $e) {

			return ['code'=>0,'msg'=>$mail->ErrorInfo];

		}

	}
	
	//发送邮箱信息
	public function addSend($email,$code,$msg){

		$client = new \swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
		$ret = $client->connect("127.0.0.1", 8122);
		if(empty($ret)){
			return true;
		} else {
			$client->send(json_encode([
			    'type'=>1,
				'email'=>$email,
				'code'=>$code,
				'msg'=> $msg
			]));
		}
		return true;

	}

}

服务端运行




namespace app\index\controller;


use app\common\service\EmailService;

class server
{

	public function email_server(){
	    (new EmailService())->email_server();
	}

}

在终端运行命令 php index.php /index/server/email_server

发送测试


<?php

namespace app\index\controller;

use app\common\service\SmtpMail;
use think\Controller;

class Index extends Controller
{
	public function index_send_mail(){

		(new SmtpMail())->addSend("邮箱地址",0,"内容");

	}
}

你可能感兴趣的:(php,swoole)