이 GyparkWiki의 데이타 디렉토리를 crontab을 써서 매일 압축은 해 두는데, 백업 데이타가 같은 서버에 있으면 서버에 장애가 생기면 도루묵이라서, 압축이 끝나면 자동으로 내 gmail계정으로 이 백업 파일을 보내도록 하자는 생각을 했음.
CPAN에서 "gmail"로 검색해서 나오는 것들 중에 태반은 제대로 동작을 안 하고 (주로 2006년 전후로 더 이상 업데이트가 안 되는 모듈들), Email::Send::Gmail 이게 그나마 메시지를 보내는 데 성공은 했는데, 첨부파일을 보내는 법을 알 수가 없음.
첨부파일을 다루는 모듈들을 뒤져보면 파일의 Application Type을 사용자가 같이 명시해줘야 한다던가... MIME 헤더를 일일이 설정해주어야 한다던가... 암튼 잘 모르겠지만 매우 귀찮아 보인다.
그러다가 간신히 Mail::Builder::Simple을 발견. 의존성이 걸린 모듈들이 연쇄적으로 계속 늘어나서, 설치에 시간이 꽤 걸렸음. 심지어 실행할 때도 use 구문에서 상당히 시간을 잡아먹는다.
발신에 성공한 코드는 다음과 같다. (아래 주석은 내가 해보면서 경험으로 안 거고, 정확한 것은 모듈 문서를 읽어봐야 알 수 있겠음)
use utf8;
use Mail::Builder::Simple;
my $mail = Mail::Builder::Simple->new;
$mail->send(
mail_client => {
mailer => 'SMTP',
mailer_args => {
host => 'smtp.gmail.com',
username => 'MY.ID@gmail.com',
password => 'MY.PASSWORD',
ssl => 1,
},
},
from => 'MY.ID@gmail.com',
to => 'RECIPEINT@gmail.com',
subject => '메일 보내기 테스트',
plaintext => "안녕하십니까\n\n안녕히 계세요\n",
attachment => './attach.zip',
);
만약 발송 과정에 에러가 발생할 경우, 함수 호출 순서를 주욱 따라가면서 줄줄이 에러 메시지를 출력하는데, 메일 자체에 대한 정보도 같이 출력한다. 따라서 첨부파일이 있을 경우 파일의 내용이 알아보기 힘든 아스키 형태로 끝도 없이 출력된다 -_-; 따라서 eval로 감싼 후에 에러 처리를 따로 해주는 게 낫겠음:
eval { $mail->send(...) };
if ( $@ ) {
}
내용 추가
조프님이 아래 코멘트로 소개해 주신 모듈인 Email::Send::SMTP::Gmail 이것도 첨부 파일 보내는 것까지 잘 되었음.
다만 약간 맘에 걸리는 게 있는데, 첨부 파일 중 용량이 좀 큰 것(그래봤자 수MB)을 포함하여 둘 이상의 파일을 동시에 첨부하여 보낸 메일이 두 번이나 전송되지 않았다. 에러가 나거나 한 건 아닌데, 모듈 쪽에서는 전송 성공이라 나오는데 gmail에는 도착하지 않음.
홈페이지 백업 파일을 보내는 것은 아주 잘 되었음.
예문은 모듈 문서 Synopsis에 있는 것 그대로 쓰면 되고, 한글은 디코딩된 펄 내부 문자열 상태, UTF-8로 인코딩, cp949로 인코딩 세 가지 경우 다 잘 되었음. (단 이건 gmail로 받았을 때 얘기고, 다른 메일 주소는 모르겠다)
그런데 첨부파일크기가 너무 커서 메일 발송에 실패했을때 딱히 실패 처리가 안 되는 단점이 있는 듯.
컴퓨터분류
스팸등으로 판단하고 메일 전송을 포기하는 경우가 있더라구요.
몇년전즈음에는 그렇지 않았는데 심지어 최근 워크샵 때 발송했던
메일의 경우 약 10~20% 정도의 메일은 이유없이 메일을 전송하지 않더라구요.
그에 대한 구글의 회신은 스팸방지 차원이라는 것 같습니다. :-)