[업무 자동화] 파이썬으로 뉴스 클리핑 메일 자동 발송하기 (1)

[업무 자동화] 파이썬으로 뉴스 클리핑 메일 자동 발송하기 (1)

회사에서 회사와 관련된 최신의 뉴스를 공유하고 싶은 요구사항이 있었다.

크게 일의 진행을 3단계로 나누었다.

  1. 뉴스의 수집
  2. 뉴스의 선별
  3. 뉴스의 발송

그 중에서도 이번 글에서는 자동 발송에 관한 이야기를 해 보려 한다.

수제맛집

메일의 발송과정을 문의해 전달 받았다. 아래와 같은 작업이 진행되고 있었다. 순서대로, 손으로 하고 있었다.

  1. 직원들에게 보내고 싶은 뉴스를 검색해서 엑셀에 나열한다.
  2. 리스팅 한 뉴스들을 가지고 메일을 작성한다.
  3. 전날 다음날 오전에 예약 발송을 설정한다.

어느 부분을 자동화 할 수 있을 지 생각해 보았다.

  1. 수집 -> 크롤링이나 RSS를 가지고 엑셀을 만들 수 있어 보였다.
  2. 메일 작성 -> 수집된 데이터가 형태만 잘 갖추고 있다면, 이메일 템플릿 화 할 수 있어보였다.
  3. 스케쥴러를 이용하면, 매일 같은 날 반복해서 보낼 수 있어 보였다.

파이썬으로 메일 보내기(smtplib)

뉴스 클리핑이 어떤 내용이던 파이썬으로 보낼 수 있어야 한다. 여기서 알게된 재밋는 사실은 당연하지만? 메일을 html로 만들어서 보내면 그대로 적용된다는 것 이었다.

  1. 파이썬으로 메일을 보내려면, gmail에서 비밀번호 설정을 해야한다.
    구글 어카운트 에서 보안(Security)에 접속한다.
  2. 앱 비밀번호(App passwords)에서 Mail, OS 선택 후 GENERATE (앱 비밀번호는 2단계 인증이 사용 설정된 계정에서만 이용할 수 있다.)
  3. 이 비밀번호는 메일을 보낼 때 마다 써야하기 때문에 (한번만)저장 해 놓는다.
  4. 아래 코드를 참고하여 메일을 발송하면 완성!
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# basic information
sender = "myEmail@gmail.com"
receiver = "receiverMail@gmail.com"
password = "passwordFromGoogleAccount"

# Message settings
message = MIMEMultipart('alternative')
message['Subject'] = "Title"
message['From'] = sender
message['To'] = receiver

# Email Body
html = '<h3>hello Email!</h3>'
body = MIMEText(html, 'html')
message.attach(body)

# Send Email
stmp = smtplib.SMTP_SSL('smtp.gmail.com')
stmp.login(sender, password)
stmp.sendmail(sender, receiver, message.as_string())
stmp.quit()

추가로 이메일에 이미지를 붙이면서 한 삽질을 정리해 놓는다. 구글 드라이브에 이미지를 업로드 하고, 그 주소를 <a href="https://drive.google.com/file/d/1qnnGzjdRZFSce_ZIrvlf3nb980WbNZEN/view?usp=sharing">image_name</a>과 같이 작성했는데도 보이지 않았다. 그 이유는 이미지의 접근권한, 이미지가 있는 폴더의 접근권한이 없어서 였다.

스케쥴링으로 반복전송(schedule)

메일을 한번만 보낸다면 자동화 보다는 수동이 더 빠르다. 계속 보내야 하기 때문에 하는 자동화 이므로 어떻게 반복해서 보낼 수 있는지 알아보자.
홈페이지 링크

pip3 install schedule

import schedule

def job():
    print('I'm Working!')

def run():
    schedule.every(10).minutes.do(job)
    schedule.every().hour.do(job)
    schedule.every().day.at("10:30").do(job)
    schedule.every(5).to(10).minutes.do(job)
    schedule.every().monday.do(job)
    schedule.every().wednesday.at("13:15").do(job)
    schedule.every().minute.at(":17").do(job)
    while True:
        schedule.run_pending()

if __name__ == "__main__":
    run()

매 10분마다, 매 시간마다, 매일 정해진 시간마다 등 원하는 주기마다 보낼 수 있다. 만약 설정이 복잡해 진다면, 다른 스케쥴 라이브러리를 쓰는 것을 추천한다.

지속적으로 실행(nohup)

schedule 하는 터미널이 종료 되었을 때, 프로그램이 종료된다면, 아무 의미없을 것이다. 우리가 원하는 것은 종료되지 않고, 정해진 시간마다 일을 해주는 일꾼이다. 서버에 메일을 보내느 셋팅도 해 놓고 반복주기도 설정했다면 터미널이 종료되어도 실행되어야 한다.
schedule링된 파이썬의 이름을 schedule.py로 짓지 않도록 한다. 나의 경우에는 worker.py로 만들었다.
다음과 같이 명령하여 터미널이 종료되어도 프로그램이 끝나지 않게 해주자.

$ nohup python3 worker.py &

종료하는 방법은 아래와 같이 실행되고 있는 프로세스를 찾아 죽여?준다.

$ ps -ef | grep ‘python’
$ kill -9 [pid]

donaricano-btn

댓글

이 블로그의 인기 게시물

[IOS] AppDelegate는 뭐하는 녀석이지?

[git] Github 이슈 라벨(issue labels)

[git] git의 upstream과 origin 헷갈리는 사람 손!