thinkpphp 5+swoole 에서 비동기 메 일 그룹 발송 실현(SMTP 방식)

본 고 는 thinkpphp 5+swoole 이 비동기 메 일 그룹 발송(SMTP 방식)을 실현 하고 여러분 에 게 공유 하 는 것 을 소개 합 니 다.구체 적 으로 다음 과 같 습 니 다.
1.환경 설명
아 리 운 centos 7
  • 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 설정 항목 입 니 다.프로젝트 아래 에 있 는 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 프로 토 콜 이 보 낸 demo 만 실 현 했 기 때문에 포장 차원 에서 전면적 이지 못 하고 유연성 이 없다.그림 속 의 다른 두 파일(PhpMailer.php 와 Smtp.php)은 Phpmailer 메 일 발송 류 의 핵심 파일 로 호출 을 간소화 하기 위해 추출 되 었 습 니 다.상세 한 용법 과 파라미터 설정 은 gayhub 의 사용 설명 을 참고 할 수 있 습 니 다phpmailer
    주의
    이 단계 에서 우 리 는 몇 가 지 를 주의해 야 한다.1.당신 이 설정 한 메 일 로 보 낸 계 정 이 SMTP 를 열 었 고 해당 하 는 안전 프로 토 콜 과 포트 번 호 를 찾 았 는 지 여부 입 니 다.2.현재 서버 가 SMTP 서 비 스 를 지원 하 는 지 여 부 는 socket 함수 의 영향 을 많이 받 습 니 다.문제 가 발생 했 을 때 우 리 는 SMTP Debug 인 자 를 1 로 설정 한 다음 에 debug 정보 에 따라 세 심하게 디 버 깅 해 야 합 니 다.3.보 낸 메 일 중 일 부 는 쓰레기통 에 넣 을 수 있 으 니 주의해 서 받 아 주세요.
    2.3 호출
    다음 파일 디 렉 터 리 구 조 를 만 듭 니 다
    Index.php 에서 메 일 을 보 내 는 방법 을 호출 합 니 다.구체 적 인 코드 는 다음 과 같 습 니 다.
    
    public function sendMail(){
      if(SendMail::postmail('[email protected]','test','123')){
       echo 'send success';
      }else{
       echo 'send fail';
      }
     }
    2.4 호출 결과

    우 리 는 QQ 메 일의 쓰레기통 에서 우리 가 방금 보 낸 메 일 을 찾 을 수 있다.
    3.swoole 와 결합 하여 비동기 군 발 3.1 설치 swoole
    swoole 확장 설치 의 상세 한 절차 홈 페이지 에 있 습 니 다.더 이상 언급 하지 않 습 니 다.
    swoole 를 설치 한 후,자신의 IDE 에 swoole 코드 알림 을 추가 하 는 것 을 권장 합 니 다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
    "; }); $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('[email protected]','test',$data)){ echo 'send'.$i.' success'."
    "; }else{ echo 'send'.$i.' fail'."
    "; } } $serv->finish(''); }); $serv->on('finish', function ($serv, $task_id, $data) { echo " [id=$task_id] ".PHP_EOL; }); $serv->start(); }
    서버 에서 우 리 는 20 개의 loop 을 사용 하여 단체 발송 을 모 의 했 는데 실제 적 으로 다른 email 주소 로 바 꾸 면 된다.
    다음은 저희 가 클 라 이언 트 를 실현 하 겠 습 니 다.
    
     /**
      * 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 'error!connect to swoole_server failed';
      } else {
       $client->send('blue');//               
      }
     }
    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.후기~
    swoole 는 익숙 하고 능숙 하 게 사용 하고 자 하 는 확장 이지 만 네트워크 프로 그래 밍 지식 이 부족 하기 때문에 테스트 와 학습 을 많이 해 야 합 니 다.demo 에 부족 한 점 이 있 으 면 QAQ 도 지적 해 주 십시오.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기