[업무자동화] R로 이메일을 보내려면 sendgridr

R automation email gmail sendgridr

메일 보내기는 업무 자동화를 위해서 꼭 필요한 기능이다. 기존의 패키지인 mailR, sendmailR은 자바 의존성이 있거나 smtp 서버를 활용하는 형태이다. sendgrid 서비스가 매일 100건 평생 무료로 준대서 패키지를 만들어봤다.

true
2018-10-02

세줄요약

  1. 메일 보내기는 업무 자동화를 위해서 꼭 필요한 기능이다.
  2. 기존의 패키지인 mailR, sendmailR은 자바 의존성이 있거나 smtp 서버를 활용하는 형태이다.
  3. sendgrid 서비스가 매일 100건 평생 무료로 준대서 패키지를 만들어봤다.

업무 자동화는 매우 매력적인 키워드입니다. 세상에 내가 하는 일을 컴퓨터가 대신 하게 해준다니! 여러 가지 작업을 코딩할 수 있겠지만, R의 장점은 결과에 대한 보고서 딜리버리라고 생각합니다. 전달의 완성은 역시 이메일이죠! 물론 최근에는 슬랙같은 도구도 많이 사용하기 때문에 slackr같은 도구가 더 좋을 수 도 있을 것 같습니다.

그래도 역시 이메일이지! 라고 생각하는 분들을 위해 R로 이메일을 보내는 법을 좀 찾아봤습니다. 대체 최근 스타일의 메일 보내는 도구가 없더군요. 가장 잘 관리되고 있는 패키지는 mailR 이었습니다.

문제는 두 가지 허들이 있더군요.

하나는 아파치 지원 프로젝트인 commons을 사용한다는 점 이었습니다. 이게 java라 rJava가 필요하죠. rJava는 지난 포스트인 Windows에서 rJava 스트레스 없이 설치하기를 참고해주세요. 이곳에 훌륭한 튜토리얼이 있습니다.

다른 문제는 smtp 서버를 사용한다는 점입니다. 많이 사용하는 gmail의 smtp 서버를 사용하려면 위의 튜토리얼에서도 google 서비스 접근에 대한 보안 수준을 낮춰야 한다고 알려주고 있습니다. 그렇다고 smtp 서버를 직접 구축할 수 도 없는 노릇인거죠.

보안 수준을 낮춰야 한다니… 불안하기만 하다

대신 안정적으로 동작하는 패키지라는 걸 아파치의 지원 프로젝트를 활용하기 때문에 신뢰할 수 있습니다. 2016년이 마지막 업데이트인데요. 메일 기능이 더 업데이트 할 만한게 뭐가 있을까 싶기도 합니다.

두 번째로 조금 더 오래됬지만, 매달 5,000 다운로드가 발생하는 대중적인 패키지로 sendmailR이 있습니다. 거의 같은 사용성을 보여주고 있는데요. 이건 감사하게도 java 의존성 같은게 없는 훨씬 단순한 구조입니다. 역시나 허들은 smtp 메일 서버가 있어야 한다는 점입니다.

그래서 뭔가 api로 메일 전송 서비스를 제공해주는 곳이 어디 없나 찾아봤습니다.

메일 전송 api를 제공해주는 서비스들

mailchimp는 세상 유명한 서비스입니다. 이메일 마케팅을 하시는 분들이라면 잘 활용하면 좋을 서비스이지요. sendinblue, sendgrid 모두 경쟁사입니다.

제가 찾는 api는 이메일을 보낼 수 있으면 충분합니다. 세 서비스 중에 가장 일별 무료 전송량이 적지만(일 100건), api가 단순한 서비스는 sendgrid 였습니다.

낙점!

sendgridr

이제 sendgrid api의 wrapper 패키지인 sendgridr을 소개합니다.

sendgridr은 크게 2가지 기능을 담당합니다.

1. sendgrid api 키 등록 및 확인

우선 sendgrid를 이용에 메일을 보내기 위해서는 당연히도 회원가입을 해야 합니다.

sendgrid 회원가입

우선 sendgrid 홈페이지로 가주세요. Sign up 버튼을 누르면 어떤 플랜을 선택할지 물어봅니다.

우리는 당연히 free 플랜을 선택합니다.

이제야 익숙한 아이디, 비번, 이메일을 입력하라고 하는군요.

기업 고객 유치를 위해서 추가 정보를 요구합니다.

서비스에겐 미안하지만 아무 정보나 입력했습니다.

드디어 회원가입을 끝냈습니다.

서비스를 사용하기 위해서는 이메일을 확인해야 합니다. 가입때 사용한 이메일에 들어가보면 확인 메일이 와있을 텐데요.

Confirm Email Address 버튼을 눌러서 계정을 활성화해 주세요.

api key 발급

우선 패키지를 설치해보겠습니다.

# remotes::install_github("mrchypark/sendgridr")
library(sendgridr)

이제 api 서비스를 사용하기 위해 api key를 발급받아 보겠습니다. sendgridr 패키지는 auth_set() 함수를 이용해 키를 등록합니다.

영어로 질문이 나오면서 3가지 선택지가 나오는데요. No에 해당하는 것 2개와 Yes에 해당하는것 1개가 다양한 표현으로 나옵니다. 생각없이 선택하는 걸 방지하려고 이런 설계를 한 모양이네요.(읭? usethis 함수를 사용한 겁니다. ㅋㅋ)

이미 api key가 있냐고 물어보네요. 저는 아니오에 해당하는 1을 입력하겠습니다.

그럼 api key를 신청할 수 있는 페이지를 열어줍니다! 제 스크린샷에는 이미 2개의 키가 만들어져 있지만, 여러분은 아마도 비어있을 것입니다. 우선 rstudio에서의 작업을 마저하도록 할까요?

2번째 질문이 나옵니다. 이제 등록해야 할 api key를 R 사용 환경 전체에서 쓸 것인지, 현재 프로젝트에서만 사용할 것인지 물어봅니다. rstudio는 project라는 관리 단위를 나누는 기능을 제공합니다. 잘 모르신다면 yes를 선택하시고, 아신 다면 상황에 맞게 선택해주세요. 저는 yes에 해당하는 3번을 입력했습니다. 계속 yes의 위치가 바뀌니 화면을 따라 3을 입력하지 마시고, 선택지를 잘 확인해주세요.

sendgridr 패키지는 api key를 .Renviron 파일에 관리하는 것을 권장합니다. .Renviron 파일은 R의 환경 변수를 기록하고 Sys.getenv() 함수로 값을 사용할 수 있게 해줍니다. 변수명은 SENDGRID_API로 기록하면 되는군요. 이제 다시 브라우저로 돌아가서 key를 만들어 볼까요?

오른쪽 위에 Create API Key를 클릭합니다.

key를 관리할 이름을 정합니다. 저는 그냥 test라고 작성했습니다. 권한는 Full Access로 설정해주세요.

api key를 발급받았습니다! 매우 긴 문자열로 이걸 복사해서 아까 .Renviron 파일에 저장하면 되겠네요. 글자를 클릭하면 자동으로 복사를 수행해 줍니다.

복사를 해야만, 다음 화면으로 넘어갈 수 있군요. 참고로 지금 한번 알려주고 끝입니다. 복구고 뭐고 아예 없어요. 대신 지우고 새로 만들면 됩니다. ㅎㅎ 저도 맘편히 스크린샷에 공개했는데요. 진작에 지웠습니다.

.Renviron 파일에 저장한 모습입니다. 이 파일을 저장하고 나면 적용하기 위해서 R session을 재시작해야 합니다. rstudio를 껏다가 켜도 좋고, Ctrl+Shift+F10을 입력해도 됩니다. 저는 rstudioapi::restartSession() 함수로 재시작했습니다. 이제 잘 동작하는지 확인해 볼까요?

auth_check() 함수는 api key가 잘 등록되어 있는지, 동작하는 키인지 서비스에 확인하는 작업을 합니다. 잘 동작한다니 드디어 key 설정을 완료했습니다!

2. mail 작성 및 보내기

sendgrid는 mail에 대한 정보를 json 형태로 받습니다. 막상 양식에 맞는 형태로 작성하려고 하면 불편한 부분이 있더라구요. sendgridr 패키지는 mail(), to(), cc(), from 등 메일을 보내기 위한 정보를 구성하는 함수들을 제공하고 있습니다. 여기에서 어떤 것을 제공하는지 확인해보세요.

파이프 연산자%>%를 지원할 수 있게 작성하려고 노력했습니다.

library(sendgridr)
mail() %>% 
  from("example1@mail.com", "example name for display") %>% 
  to("example2@mail.com", "example name for display 2") %>% 
  subject("test mail title") %>% 
  content("hello world!")  %>% 
  ## attachments is optional
  attachments("report.html") %>% 
  send()

테스트 할 때는 한글도 문제없이 동작하는 것을 확인했습니다. 전송이 잘 이루어진다면 위 코드를 수행했을 때 NULL이 출력될 것입니다. 혹시 NULL이외의 출력(대부분 에러 메세지입니다.)이 나오면 여기에 알려주세요.

gmail로 받을 때

회사에서 G Suits를 사용하고 있다보니 회사 메일이 gmail 입니다. 메일의 body 부분(패키지에서는 content)에 html로 전송을 지원하길래 시도해봤는데요. rmd로 만든 html 파일을 사용하니, 삽입된 그림은 막고, 여러 스타일을 제거해서 보여주는 것을 확인했습니다. 아직은 사용하기 어렵겠네요.ㅜㅠ 우선은 첨부파일로 해결이 가능할 것 같기는 한데요. 메일 본문에 요약된 내용을 추가하는 방법을 찾아봐야 할 것 같습니다.

첨부하는 파일 확장자를 rmd로 받고, rendering과 후처리를 패키지내에 포함하는 것이 좋겠네요.

업무자동화에서 메일 보내기란

업무 자동화는 데이터 소스의 접근, 처리, 보고서 생성, 전달, 스케줄러 등 다양한 기능을 해야 합니다. 그 중에 메일 보내기는 최종 단계로 꼭 필요하다고 할 수 있죠. 회사에서 smtp 서버를 운용하는 중이라면 sendmailR 패키지가 좋은 선택일 것입니다. 스케줄러로 정기적으로 메일을 보내게도 할 수 있을 것이구요. 이렇게 업무자동화에 도움이 되는 패키지들을 만들거나 소개하는 것을 좀 해봐야 겠습니다.

언제나처럼 문의, 오타 제보 등 대환영입니다.

Corrections

If you see mistakes or want to suggest changes, please create an issue on the source repository.

Reuse

Text and figures are licensed under Creative Commons Attribution CC BY-NC-ND 4.0. Source code is available at https://github.com/mrchypark/mrchypark.github.io, unless otherwise noted. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".

Citation

For attribution, please cite this work as

Park (2018, Oct. 2). mrchypark: [업무자동화] R로 이메일을 보내려면 sendgridr. Retrieved from https://mrchypark.github.io/post/업무자동화-r로-이메일을-보내려면-sendgridr/

BibTeX citation

@misc{park2018[업무자동화],
  author = {Park, Chanyub},
  title = {mrchypark: [업무자동화] R로 이메일을 보내려면 sendgridr},
  url = {https://mrchypark.github.io/post/업무자동화-r로-이메일을-보내려면-sendgridr/},
  year = {2018}
}