개발 Q&A

제목 Gmail SMTP 대량 메일 발송 시 에러에 대해 여쭤봅니다..
카테고리 서버
글쓴이 멀바이자시가 작성시각 2021/01/06 14:34:19
댓글 : 4 추천 : 0 스크랩 : 0 조회수 : 173   RSS

아주 기초적인 문제인 건 알고 있지만 혹 제가 놓치는게 있을까 싶어서 이렇게 글 올려 봅니다.

외부 웹서버에서 Crontab 을 이용하여 메일 발송을 하고 있습니다. 하루에 천 몇백건 정도 됩니다.

그런데 메일 발송하는 도중에 인증 문제로 멈춰버리는데 에러는 SMTP Error: Could not authenticate. 입니다.

위 에러로 검색해보면 참 많은 글이 있고 그에 해당되는 조치는 전부 해봤지만.. 역시나 중간에 끊기더군요. ( 3~4분 정도 발송하다가 위 에러를 4번정도 뱉어내고 멈춥니다. )

조치는 1. 보안 수준이 낮은 앱의 액세스 : 사용 , 2. 전달 및 POP/IMAP 에서 IMAP 사용으로 설정 , 3. 내 Google 계정에 대한 액세스 허용 

Gmail 계정은 유료 계정으로 라이선스가 있는 상태라서 일일전송 한도와 관련한 문제는 아닌 것 같습니다.

그리고 위 스케줄러와 상관없이 1건당 보내는 메일은 정상 발송되고 있습니다.

혹 제가 확인 할 수 있는 다른 방법을 아시거나 의견 주실 수 있으시면 어떤 답변이든 감사히 받겠습니다.

 

메일 발송 소스는 아주 많이 뿌려져 있지만 혹시나 해서 올려봅니다.

foreach ($send_data as $key => $value) {

   $smtp_use = 'smtp-relay.gmail.com';

   $this->load->library("Phpmailer");

   $this->load->library("SMTP");

   $mail = new PHPMailer(true);

   $mail->IsSMTP();

   try {

      $mail->Host = $smtp_use; // email 보낼때 사용할 서버를 지정

      $mail->SMTPAuth = true; // SMTP 인증을 사용함

      $mail->Port = 465; // email 보낼때 사용할 포트를 지정

      $mail->SMTPSecure = "ssl"; // SSL을 사용함

      $mail->Username = $smtp_mail_id; // 계정

      $mail->Password = $smtp_mail_pw; // 패스워드

      $mail->SetFrom($from_email, $from_name); // 보내는 사람 email 주소와 표시될 이름 (표시될 이름은 생략가능)

      $mail->AddAddress($to_email, $to_name); // 받을 사람 email 주소와 표시될 이름 (표시될 이름은 생략가능)

      $mail->Subject = $title; // 메일 제목

      $mail->MsgHTML($content); // 메일 내용 (HTML 형식도 되고 그냥 일반 텍스트도 사용 가능함)

      $mail->Send(); // 실제로 메일을 보냄

   } catch (phpmailerException $e) {

      echo $e->errorMessage();

      // 에러 로그 저장.

      // 여기서 에러 문구인 SMTP Error: Could not authenticate. 가 발생합니다.

      exit;

   } catch (Exception $e) {

      echo $e->getMessage();

      exit;

   }

}

 다음글 Mysql LEFT EXCLUSIVE에 대해서 (4)
 이전글 다운로드헬퍼 사용.카카오 인앱 브라우저. 파일 다운로드... (5)

댓글

PureAni / 2021/01/06 15:55:11 / 추천 0

이메일을 어떻게 보내시는지 모르겠지만, 보통 대용량 전송의 경우 DB에 한번 저장했다가, cron 이 DB를 훑으면서 보냅니다.

만약 가운데에 중계(DB)해주는 것이 없다면, 중간에서 중계해주는것을 추가해서 시도하시면 될듯합니다.

보통은 DB에 많이 넣고, 요즘은 redis 같은것에 많이 넣는 추세입니다.

멀바이자시가 / 2021/01/06 16:06:01 / 추천 0

└ PureAni 님. 말씀 감사합니다. 현재도 레디스 구조는 아니지만 메일 발송이 이루어지기전에 목록 추출하여 일반 테이블에 저장 후 약 5분 후 발송 cron이 실행되고 있습니다. 중간중간 로그를 남기긴 했지만 이렇다할 답을 찾기가 힘드네요.. ㅜㅜ 레디스도 한번 살펴봐야겠습니다. 조언 감사합니다.!

PureAni / 2021/01/06 16:10:42 / 추천 0

@멀바이자시가

이미 중간에 중계하고 계시다면, 한번에 발송되는 량을 조절하시는 방법밖에 없을거 같습니다.

100건 200건 300건 늘려보시면서 오류 없이 무난히 날라가는 시점을 찾아보세요.

멀바이자시가 / 2021/01/06 16:28:14 / 추천 0

└ PureAni 님. 당장은 말씀 주신대로 건당 체크해보는 수 밖에 없을 듯 합니다. 정 안되면 50건씩이라도 잘라서 딜레이 주면서 순차 발송으로 해야겠네요.. 아예 발송 자체가 에러나면 차라리 나으련만.. 중간에 끊기니 난감하네요.

조언 감사드립니다~! 새해 복 많이 받으세요~!