thinkphp5와 swoole이 SMTP를 통해 비동기 대량 메일링을 구현하는 방법에 대한 자세한 설명

不言
풀어 주다: 2023-03-30 19:28:02
원래의
1840명이 탐색했습니다.

이 글에서는 비동기식 대량 메일링(SMTP 방식)을 구현하기 위한 thinkphp5+swoole에 대한 자세한 설명을 주로 소개하며, 관심 있는 친구들은 참고할 수 있습니다.

이 글에서는 비동기식 대량 메일링을 구현하기 위한 thinkphp5+swoole의 구현 방법을 소개합니다. (SMTP 방식). 세부 사항은 다음과 같습니다.

1. 환경 설명

  • Alibaba Cloud centos7

  • thinkphp5.0.11

  • swoole2.0.8

2.tp는 이메일 전송을 실현합니다

프로젝트 아래에 다음 파일 디렉터리를 만듭니다:

여기서 SendMail.php는 이메일을 보내기 위해 실제로 호출하는 파일입니다. 주요 코드는 다음과 같습니다.

namespace app\library\utils\mail;
use app\library\utils\mail\PhpMailer;
use app\library\utils\mail\Smtp;
use think\Log;

error_reporting(E_STRICT);
date_default_timezone_set('Asia/Shanghai');

class SendMail
{
 static function postmail($to,$subject = '',$body = ''){
  $mail = new PhpMailer();
  $mail->CharSet = config('mail.CharSet');
  $mail->IsSMTP();
  $mail->SMTPDebug = config('mail.SMTPDebug');
  $mail->SMTPAuth = config('mail.SMTPAuth');
  $mail->SMTPSecure = config('mail.SMTPSecure');
  $mail->Host  = config('mail.Host');
  $mail->Port  = config('mail.Port');
  $mail->Username = config('mail.Username');
  $mail->Password = config('mail.Password');
  $mail->SetFrom(config('mail.From'), config('mail.Name'));
  $mail->Subject = $subject;
  $mail->MsgHTML($body);
  $address = $to;
  $mail->AddAddress($address, '');
  if(!$mail->Send()) {
   Log::write('send to '.$to.'error info:'.$mail->ErrorInfo);
   return false;
  } else {
   return true;
  }
 }
}
로그인 후 복사

의 구성 구성 항목은 프로젝트 아래의 config.php 파일에 배치됩니다. 구체적인 구성 내용은 다음과 같습니다.

//邮箱设置
 'mail'=>[
  'CharSet'=>'UTF-8',
  'SMTPDebug'=>0,// 启用SMTP调试功能 0关闭
  'SMTPAuth'=>true,// 启用 SMTP 验证功能
  'SMTPSecure'=>'ssl',// 安全协议
  'Host'=>'smtp.163.com',// SMTP 服务器
  'Port'=>465,// SMTP服务器的端口号
  'Username'=>'**********',// SMTP服务器用户名
  'Password'=>'**********',// SMTP服务器密码
  'From'=>'*********@163.com',// 发件人邮箱
  'Name'=>'blue',// 发件人邮箱
 ]
로그인 후 복사

2.1 여기서만 설명합니다. smtp 프로토콜 구현 데모가 전송되었으므로 패키징 수준에서는 그다지 포괄적이지 않고 유연성도 떨어집니다. 그림의 다른 두 파일(PhpMailer.php 및 Smtp.php)은 호출을 단순화하기 위해 Phpmailer 이메일 전송 클래스의 핵심 파일입니다. 자세한 사용법 및 매개변수 설정은 gayhub의 사용법을 참조하세요. 지침 phpmailer

2.2 주의 사항

이 단계에서는 몇 가지 사항에 주의해야 합니다. 1. 이메일을 보내도록 설정한 계정이 SMTP를 활성화했는지 여부와 해당 보안 프로토콜 및 포트 번호를 찾습니다. 2. 현재 서버가 일부 소켓 기능의 영향을 받는 경우가 많은 SMTP 서비스를 지원하는지 여부 문제가 발생하면 SMTPDebug 매개변수를 1로 설정한 다음 디버그 정보를 기반으로 신중하게 디버그해야 합니다. 3. 발송된 이메일 중 일부는 휴지통으로 들어가게 되므로 잘 확인하시기 바랍니다.

2.3

를 호출하여 다음 파일 디렉터리 구조를 설정합니다.

Index.php에서 이메일을 보내는 방법을 호출합니다. 구체적인 코드는 다음과 같습니다.

public function sendMail(){
  if(SendMail::postmail('937069176@qq.com','test','123')){
   echo 'send success';
  }else{
   echo 'send fail';
  }
 }
로그인 후 복사

2.4 호출 결과

방금 보낸 이메일이 QQ 메일함의 휴지통에서 발견되었습니다

3. swoole과 결합하여 비동기 대량 전송을 구현합니다. 3.1 swoole 설치

Swoole 확장 설치에 ​​대한 자세한 단계는 공식 웹사이트에서 확인할 수 있습니다. , 자세한 내용은 다루지 않겠습니다. swoole 문서 포털

swoole을 설치한 후 IDE에 swoole 코드 프롬프트를 추가하고 IDE 프롬프트 swoole 코드

3.2에 대한 포털을 구성하여 비동기 대량 전송을 구현하는 것이 좋습니다.

먼저 비동기 서버를 구현합니다.

 /**
  * description:服务端
  */
 public function syncSend(){
  $serv = new \swoole_server('0.0.0.0',8082);

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

  $serv->on('receive', function($serv, $fd, $from_id, $data) {
   $task_id = $serv->task($data);
   echo "开始投递异步任务 id=$task_id\n";
  });

  $serv->on('task', function ($serv, $task_id, $from_id, $data) {
   echo "接收异步任务[id=$task_id]".PHP_EOL;
   for ($i = 0 ; $i<20;$i++){
    if(SendMail::postmail(&#39;937069176@qq.com&#39;,&#39;test&#39;,$data)){
     echo &#39;send&#39;.$i.&#39; success&#39;."\n";
    }else{
     echo &#39;send&#39;.$i.&#39; fail&#39;."\n";
    }
  }
  $serv->finish(&#39;&#39;);
  });

  $serv->on(&#39;finish&#39;, function ($serv, $task_id, $data) {
   echo "异步任务[id=$task_id]完成".PHP_EOL;
  });

  $serv->start();
 }
로그인 후 복사

서버 측에서는 20의 루프를 사용하여 대량 전송을 시뮬레이션했습니다. 실제로는 다른 이메일 주소로 변경하면 됩니다.

다음으로 클라이언트를 구현합니다.

 /**
  * description:客户端
  */
 public function index()
 {
  $client = new \swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_SYNC);
  $ret = $client->connect("127.0.0.1", 8082);
  if(empty($ret)){
   echo &#39;error!connect to swoole_server failed&#39;;
  } else {
   $client->send(&#39;blue&#39;);//这里只是简单的实现了发送的内容
  }
 }
로그인 후 복사

3.3 서버 열기

여기서는 CLI 방법을 사용해야 하며 프로젝트의 루트 디렉터리를 입력합니다.

실행

netstat -apn | grep 8082
로그인 후 복사

먼저 8082 포트가 점유되어 있는지 모니터링하고,

kill -9 PID(进程号)
로그인 후 복사

프로세스를 종료합니다.

그런 다음

php public/index.php index/index/syncSend
로그인 후 복사
를 실행합니다.

이 명령은 무엇입니까? cli 모드를 사용하여 8082 포트를 수신 대기 상태로 설정합니다. 그리고 전송된 결과를 볼 수 있도록 이 터미널을 활성 상태로 유지하세요.

그러면 CLI 또는 브라우저 액세스를 사용하여 클라이언트에 액세스할 수 있습니다

php public/index.php index/index/index
로그인 후 복사

클라이언트를 한 번 실행하면 서버 터미널에서 다음 화면을 볼 수 있습니다.

우리가 정상적으로 메시지를 출력합니다.

다음으로, 163 서버가 IP를 감지하므로 특정 시간에 전송이 빈번하지 않으면 전송이 실패하므로 테스트할 때 클라이언트를 4번 연속으로 실행합니다. . 터미널 방법

실행 결과는 다음과 같습니다.


그림의 전송 순서를 보면 비동기 전송을 구현했음을 쉽게 알 수 있습니다.

방금 보낸 이메일도 메일함에 도착했어요.

4. Postscript~

swoole은 익숙해지고 능숙하게 사용하고 싶은 확장 기능이지만 네트워크 프로그래밍 지식이 부족하여 제한적이므로 아직 더 테스트하고 배워야 합니다. 데모에도 부족한 점이 있고, QAQ

에도 아직 부족한 부분이 있습니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되길 바랍니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 참고해주세요!

관련 권장 사항:

Thinkphp 5.0에서 모듈과 디렉터리를 자동으로 생성하는 방법

thinkphp 다중 테이블 쿼리 동일한 필드가 중복된 두 테이블에 대한 완벽한 솔루션

ThinkPHP에 내장된 ThinkAjax를 사용하여 비동기 전송 기술 구현 방법

달성

위 내용은 thinkphp5와 swoole이 SMTP를 통해 비동기 대량 메일링을 구현하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿