다섯째 날: Gmail로 메일 보내기

저자

@gypark - gypark.pe.kr의 주인장. 홈페이지에 Perl에 대해 정리해두는 취미가 있고, Raymundo라는 닉을 사용하기도 한다.

시작하며

프로그램을 써서 자동으로 메일이 발송되게 하고 싶은데, 직접 메일 서버를 설치하자니 설치나 설정도 어렵고, 최근에는 스팸 때문에 인증되지 않은 서버에서 발송된 메일은 아예 배달이 거부되는 경우도 있습니다. 간편하게 내가 가입한 Gmail 계정을 사용하여 메일을 발송하는 법을 알아봅시다.

준비물

필요한 모듈은 다음과 같습니다.

직접 CPAN을 이용해서 설치한다면 다음 명령을 이용해서 모듈을 설치합니다.

$ sudo cpan Email::Send::SMTP::Gmail

사용자 계정으로 모듈을 설치하는 방법을 정확하게 알고 있거나 perlbrew를 이용해서 자신만의 Perl을 사용하고 있다면 다음 명령을 이용해서 모듈을 설치합니다.

$ cpan Email::Send::SMTP::Gmail

SMTP 세션 만들기

먼저 Email::Send::SMTP::Gmail 클래스의 객체를 만들면서 인증 정보를 넣습니다.

use Email::Send::SMTP::Gmail;

my ( $mail, $error_msg ) = Email::Send::SMTP::Gmail->new(
    -smtp  => 'smtp.gmail.com',
    -login => '내gmail주소',
    -pass  => '내gmail암호',
);

if ( $mail == -1 ) {
    print "error: $error_msg";
    exit;
}

new() 메소드는 인증에 성공하면 세션 정보가 담긴 객체를 반환합니다. 실패할 경우는 (-1, 에러메시지) 형태의 리스트를 반환합니다. 따라서 $mail 변수의 값이 -1인지 확인하면 에러가 발생했는지 알 수 있으며, 에러가 발생했을 때 구체적인 에러메시지는 $error_msg 변수를 확인하면 됩니다.

만일 구글 계정 설정에서 "2단계 인증"을 사용하도록 한 경우라면, 그냥 아이디와 비밀번호를 넣어서 로그인할 수 없습니다. 웹으로 로그인할 때라면 휴대폰으로 전송된 인증번호를 다시 넣도록 되어 있는데, 우리가 만든 스크립트는 그런 기능이 없습니다. 이런 경우는 "앱 비밀번호"란 것을 생성하여 사용합니다. 앱 비밀번호를 사용하는 절차는 다음과 같습니다.

메일 보내기

메일을 보내는 코드도 아주 간단합니다.

my ( $result, $err_msg ) = $mail->send(
    -to      => '수신자메일주소',
    -subject => '메일 제목',
    -body    => '메일 본문 텍스트',

    # 첨부 파일이 있는 경우
    -attachments=> '/home/gypark/doc.txt,/home/gypark/music.mp3',
);

몇가지 유의할 점은 다음과 같습니다.

그리고 new()send() 모두 자체적으로 에러 처리를 하고는 있지만, 실제 사용해보면 의존성이 걸린 모듈 쪽에서 에러가 날 때 그냥 die해 버리는 경우를 볼 수 있었습니다. 따라서 이런 경우에 스크립트가 죽지 않게 하려면, eval 블록으로 둘러싸거나 별도의 예외 처리 모듈을 사용하면 프로그램을 보다 견고하게 만들 수 있습니다.

정리하며

Perl과 CPAN의 Email::Send::SMTP::Gmail 모듈을 이용해 Gmail 계정을 통하여 메일을 전송하는 법을 살펴보았습니다. 시스템을 모니터링 중 문제가 생겼을 때 또는 IRC등의 대화방에서 자신의 아이디가 언급 되었을때 메일로 알려준다거나 등의 방법으로 얼마든지 응용이 가능하겠죠? :)

blog comments powered by Disqus