R에서 mailR 패키지와 아마존 웹 서비스(AWS)를 이용하여 이메일 보내기

아마존 웹 서비스의 Simple Email Service(SES)를 통해 R 내부에서 이메일을 보내보겠습니다. 작업환경은 우분투 16.04 LTS, R 3.2.3 입니다

mailR 패키지를 사용하려면 우선 Java 설치가 필요합니다. (정확히는 JDK가 필요합니다) sudo apt-get --assume-yes install default-jdk를 입력하여 설치합니다. 설치가 끝난 후 java -version을 입력하여 java가 잘 설치되었는지 확인하고 sudo R CMD javareconf를 입력하여 R 환경에 java를 등록합니다.

sudo apt-get --assume-yes install default-jdk
java -version
sudo R CMD javareconf

그 후 R에서 mailR 패키지를 설치합니다.

# mailR 설치
install.packages("mailR", repos = "http://cran.rstudio.com")
# mailR 로드
library(mailR)

library(mailR)이 오류 없이 실행되면 잘 설치된겁니다.

이제 R에서 패키지 설치는 끝났으니 아마존 SES로 돌아가겠습니다.

console 메인화면

먼저 콘솔 화면에서 아마존 SES를 선택합니다. SES 서버의 경우 Seoul Region이 없으므로 Virginia를 선택했습니다.

SES

SES 화면으로 들어가면 여러 메뉴들이 있습니다. Identity Management에서는 도메인이나 자신의 이메일 주소를 등록해서 메일을 보낼 수 있습니다. Email Addresses를 클릭합니다.

email addresses 화면

Verify a New Email Address를 눌러 SES에서 사용할 이메일 주소를 등록합니다.

email verify

이메일 주소를 등록하면 등록한 메일 주소로 확인 메일이 오고 메일 안의 verication 주소를 클릭하면 인증됩니다. 앞으로 SES를 사용하여 메일을 보낼 때에는 보낸 사람 메일 주소를 인증된 주소로 사용하여야 합니다.

mailR 패키지에서는 SMTP를 사용하므로 Email Sending의 SMTP Settings에 들어갑니다.

smtp 메인화면

아마존의 SMTP 서버에 대한 정보를 볼 수 있습니다.

서버 주소는 email-smtp.us-east-1.amazonaws.com

포트는 25, 465, 587

Transport Layer Security(TLS) 사용 : TRUE

를 기억해둡니다.

이제 Create My SMTP Credentials 버튼을 눌러서 SMTP 서버 접속에 사용할 권한을 얻겠습니다.

smtp 유저 이름

클릭하면 Identity and Access Management (IAM) 유저 이름을 정하라고 합니다. 그냥 초기값으로 넘기거나 적당히 입력합니다.

smtp 정보

그러면 IAM 유저가 생성되고 아래를 클릭하여 User SMTP 정보를 확인합니다. 기본적으로 SMTP 유저 이름과 비밀번호를 csv 파일로 제공해줍니다.

나중에 SES의 Sending Staistics에서 확인해보면 현재 SMTP 계정의 사용 현황과 사용가능 횟수를 확인할 수 있습니다. 현재 STMP 계정은 sandbox 상태이며 하루 당 메일 200통, 초당 1통까지 전송가능합니다.

이제 아마존 AWS에서 할 작업은 끝났습니다. 다음 코드를 실행합니다.

library(mailR)

smtp = list(host.name = "email-smtp.us-east-1.amazonaws.com", port = 465,
            ssl=T, user.name = "@@@@@@@@@@@@@@@@@@",
            passwd = "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@")

send.mail(from = "from@domain.com",
          to = "to@domain.com",
          subject= "hello",
          body = "world",
          smtp = smtp,
          authenticate = T,
          encoding = "utf-8",
          attach.files = NULL,
          send = T)					 

보내는 사람(앞서 SES 서버에 등록한 메일 주소)과 받을 사람을 선택하고 user.name과 passwd는 앞서 발급받은 SMTP의 username과 password를 입력합니다. ssl은 tls와 같습니다. 포트는 그냥 465로 골랐습니다.

메일 주소에 이름 <name@domain.com>식으로 이름을 지정해줄 수 있으며, 받는 사람은 c("a@domain.com", "b@domain.com") 식으로 여러 사람을 지정할 수 있습니다.

subject는 메일 제목, body는 메일 본문인데 body에는 내용 안에 html태그가 사용 가능하며 혹은 body 자체를 html 파일로 지정할 수도 있습니다.

파일 전송도 가능합니다.

write(1:5, "a.txt")

send.mail(from = "from@domain.com",
          to = "to@domain.com",
          subject= "your",
          body = "file",
          smtp = smtp,
          authenticate = T,
          encoding = "utf-8",
          attach.files = "a.txt",
          send = T)			 

자체적인 용량 제한이 있는지는 모르겠으나 용량이 크면 나중에 AWS에서 데이터 전송 폭탄을 받게 되니 작은 용량의 파일만 첨부하는 것이 좋을듯 합니다. 많은 파일이나 대용량 파일은 Filezila를 쓰시면 됩니다.

메일 전송 결과

아마존을 통해 메일을 보내면 잘 보내지는 것을 확인할 수 있습니다. 단 메일 보낸 사람의 도메인은 amazonses.com으로 표시됩니다.

mailR 패키지 Example 모음(링크)에서 더 자세한 예제를 확인할 수 있습니다.

참고 : 구글의 smtp 서버에 대해

구글 smtp

아마존 ses 처럼 구글도 smtp 서버를 갖고 있으며 무료로 사용 가능합니다. mailR 패키지의 Example에서도 구글의 smtp서버를 사용하고 있는데, 17년 3월 기준으로 aspmx.l.google.com는 사용 가능하나 발신자가 이상하다고 경고가 뜨며, smtp.gmail.com 같은 경우는 전송 자체가 되지 않습니다. 아마 구글의 스팸 방지 정책에서 승인을 거부하는 듯 합니다.