thinkpphp 5+swoole 에서 비동기 메 일 그룹 발송 실현(SMTP 방식)
1.환경 설명
아 리 운 centos 7
프로젝트 아래 에 다음 파일 디 렉 터 리 를 만 듭 니 다:
그 중에서 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 도 지적 해 주 십시오.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Thinkphp의 S 캐시 사용법!텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.