카테고리

분류 전체보기 (510)
문학 (128)
찬양 콘티(Continuity) (80)
Business as heritage (6)
IT . Web (149)
Photo (127)
etc. (20)
Total359,987
Today16
Yesterday99
*20121219 국치가 회복될 사건이 올 때까지 블로그 양쪽은 조의를 표하는 검정색입니다.
Tistory 로고 이미지 티스토리 가입하기!









블로그 이미지

개발자들이 저처럼 ASP.NET을 통해서 혹은 Java나 PHP를 이용해서 구글 계정으로 메일을 보낼 때, 대량메일발송을 시도하는 경우도 있을 것입니다.

제가 어제 오늘 약 9천명에게 보내려고 하다가 뻘짓 많이 하고 시간도 오래 걸렸어요. 구글 앱스에서 발송용 새 계정을 축구팀 멤버 수만큼 만들고요. ㅠㅜ

  • Mailbox unavailable. The server response was: 5.4.5 Daily sending quota exceeded.

  • The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required.

  • Service not available, closing transmission channel. The server response was: 4.7.0 Try again later, closing connection.

대충 로깅을 해보니까, 이렇게 위의 세 가지 에러가 주로 발생합니다.

첫 번째는 1일 500개 발송제한을 넘어서, 두 번째는 구글 메일이 접속자가 2개 이상의 IP 주소에서 빈번하게 로그인을 시도할 때 그림 안에 있는 문자를 입력하라고 제시하는 경우가 있는데 이 상태에서 프로그래밍 방식으로는 대책이 없다 보니 발생하는 것으로 추측되고요. 구글 앱스에 SSL 필수 체크박스는 해제상태인데 뜨는 거 보면 말이죠. 마지막은 에러 났는데 왜 자꾸 보내냐며 이제 너의 채널은 없다고 말하는 것으로 추정됩니다.

첫 번째는 확실하고 2, 3번은 순전히 감입니다만 가슴 아프게도 실제로 없거나 비정상적인 메일주소로 자꾸 전송을 시도하면 500이 차기 전에 발송이 제한을 당할 수 있습니다. 어쩌면 이 상태에 빠지면 3번 메시지가 나오는지도 모르겠습니다.

아무튼 대안으로는 대량메일을 보낼 때 루프를 돌면서 여러 계정을 조금씩 쓰는 것입니다. 하나의 메일계정이 혹사당하지 않도록.. sendonly1@mail.kr, sendonly2@mail.kr, sendonly3@mail.kr, sendonly4@mail.kr 이런 식으로요. 물론 언제 이렇게 보내고 있냐고 하루 종일 보낸다고 하실 수 있겠지만, 구글 앱스 스탠다드 버전은 무료잖아요. 공짜인데 이 정도면...^^;

그리고 객체지향 언어로 프로그래밍을 하다보면 자꾸 클래스 라이브러리를 구축하게 됩니다. 매번 메일 작성 코드를 짜기보다는 myClass.sendEmailUsingGoogleAccount("제목", "받는 이", "내용", "알아서 인증하렴"); 처럼 메소드를 호출해서 실행하게 됩니다.

그러다 보면 의도하지 않게 한 번 메일 보낼 때마다 매번 새로 Message 객체 만들고 새로 메일서버 인증하고 전송하는 과정을 반복할 수도 있습니다.

이럴 경우 비정상적으로 잦은 인증시도로 분류되어 500개 채우기도 전에 Suspend 당하기 십상입니다. 되도록

public void sendEmailUsingGoogleAccount(ArrayList emailList)
{
   SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
   ...
   foreach (String email in emailList)
   {
      try
      {
         message.To.Clear();
   
         message.To.Add(new MailAddress(email));

         client.Send(message);
      }
   }
}

와 같은 형태가 유리하고

foreach (String email in emailList)
{
   myClass.sendEmailUsingGoogleAccount(email);
}

같은 스타일은 불리하다는 뜻입니다.

지메일 서버 내부에서 계정들을 순환하면서 검사해서 Suspend하는 것 같은데, 한 계정에서 Non-stop으로 보낼 때는 1800개까지 발송하는데 성공하고 Suspend 당한 적도 있는 반면 200개 남짓 보내고 Suspend 당한 적도 있습니다.

어쨌든 Suspend 당하면 마냥 해제를 기다려야 하므로 여러 계정을 조금씩 사용하는 편이 좋겠습니다.

오픈소스와 무료에 기대어 사는 분들에게 무언의 동질감을 표하며 부디 도움이 되었으면 좋겠습니다.
저작자 표시
신고
Posted by One of Remnants

댓글을 달아 주세요

달력

« » 2017.11
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

최근에 받은 트랙백

글 보관함