[Python] Gmail을 통해 여러 명에게 HTML 이메일 보내기
Server

[Python] Gmail을 통해 여러 명에게 HTML 이메일 보내기




📌 Python으로 이메일 보내기 (G-Mail)

Python의 내부 라이브러리인 smtplib (SMTP 라이브러리)를 사용하여 HTML을 포함한

이메일을 여러 명에게 보내는 방법을 알아보도록 하겠습니다.

 

📒 구현 소스

 

IMPORT

import smtplib
from email.mime.multipart import MIMEMultipart
#from email.header import Header
from email.mime.text import MIMEText

 

MIMEText 라이브러리는 메일의 제목과 본문 등을 설정하는데에 쓰이는 라이브러리 입니다.

단순 plain-text 에는 MIMEText가 쓰이며, html이나 image를 포함시켜려면 MIMEMultipart를 사용하여야합니다.

Header 라이브러리의 경우 메일의 Header를 설정하는데에 쓰이는데요. 이번 글에서는 다루지 않습니다.

 

SERVER CONNECT

def sender(recipients):
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login('이메일 계정 아이디', '이메일 계정 비밀번호')

SMTP 서버와의 연결 로직을 작성한 sender 함수입니다. 

recipients 인자는 이메일을 받을 사람들을 dict 형태로 넣어줄 예정입니다.

( recipients = [{'email'='abcd@abcd.com'},{'email'='vsdv@vsdv.com'},...]

 

GMAIL의 SMTP를 사용하므로 그에 맞는 주소와 포트를 적어주었습니다.

server = smtplib.SMTP('사용하고자 하는 SMTP 서버 주소', 'SMTP 서버 포트') 

 

GMAIL에서는 보안상의 이유로 SMTP 연결을 TLS (전송 계층 보안) 모드로 설정하여야 합니다.

따라서 starttls()는 메소드를 호출하여 설정하여 줍니다.

 

GMAIL SMTP를 사용하기 위하여 GMAIL 아이디와 비밀번호를 입력해주어야하는데요.

이 부분은 설정해 줄 부분이 있습니다.

 

❗️Gmail 설정

우선 구글 로그인을 하여 윗 부분에서 Google 계정으로 들어갑니다

 

그리고 왼쪽 메뉴에서 보안 탭에 들어갑니다.

 

그리고 아래로 좀 내려가보면 '보안 수준이 낮은 앱의 액세스' 라는 부분이 있습니다. 

 

구글 계정의 1차 비밀번호 만으로 STMP 서버에 로그인 하기 위해서는 위의 설정을 '사용함'으로 바꿔주셔야 합니다.

만약 사용 안함으로 유지하고 사용하시기 위해서는, 구글의 2차 인증을 설정해주어야 합니다.

 

위의 화면에서 조금 위로 가보면

위에 2단계 인증 부분이 있습니다. 

 

해당 인증 프로세스를 거쳐서 2단계 인증 설정을 하고나면,

 

위와 같이 앱 비밀번호를 설정해줄 수 있습니다.

앱 선택 -> 메일

기기 선택 -> Windows 컴퓨터

를 선택해주시고 생성해주시면 됩니다.

 

그럼 직후에 앱 비밀번호 16자리가 생성되는데, 이를 복사하셔서 사용해주시면 됩니다.

 

정리하자면,

 

2차 인증 사용 시 -> smtp login password는 앱 비밀번호

1차 인증 사용 시 -> 보안 수준이 낮은 앱 액세스 허용 -> smtmp login password는 계정 비밀번호

 

 

BODY

body = """

<!DOCTYPE html><html><head><meta http-equiv="Conte

'''
중략
'''

</a></body></html>

"""

메일의 본문인 body 부분입니다. 

HTML 태그를 포함하여 작성하실 때 주의하실 점이 있는데, CSS 적용 시 <style> ~ </style> 을 쓰시면 안 됩니다.

태그 내에 직접 style="~"로 지정해주셔야 합니다. 

GMAIL 뿐만 아니라 네이버 등의 SMTP 서버마다 메일의 내용을 포팅하는 방법과 그 메일이 보여지는 페이지의 Global CSS가 천차만별인데요.

그렇기 때문에 태그 내부에 styles 가장 표준화된 방법으로 맞추어야 CSS가 적용됩니다. 위의 방법이 그 중 하나입니다.

 

SEND MAIL

    for item in recipients:
        print('이메일 보내는중 :' + item['email'])

        msg = MIMEMultipart('alternative')

        msg['Subject'] = '메일 제목'
        msg['From'] = '보내는 사람 메일'
        msg['To'] = item['email']

        msg.attach(MIMEText(body,'html'))

        server.send_message(msg)

    print('이메일 보내기 완료')
    server.quit()

recipients는 메일을 받을 수령인들의 이메일이 담긴 dict 형태의 변수입니다.

이는 iterable하므로 for문을 써서 각각의 item (email)에게 이메일을 보낼 것입니다.

 

나머지 소스는 함수명이나 변수명만 보더라도 무슨 역할을 하는지 아실 수 있으실 것이므로

넘어가겠습니다.

 

MAIN

if __name__ == '__main__':
    list_json = [
    {'email': 'abcde@abc.com'},
     ]
    sender(list_json)

위에서 구현한 sender 함수와 메일을 받을 수령인들을 dict 형태로 구현한 list_json 변수입니다.

이제 Full Code를 보시겠습니다.

 

FULL CODE

import smtplib
from email.mime.multipart import MIMEMultipart
#from email.header import Header
from email.mime.text import MIMEText

def sender(recipients):
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login('이메일 계정 아이디', '이메일 계정 비밀번호')
 
    body = """

<!DOCTYPE html><html><head><meta http-equiv="Conte

'''
중략
'''

</a></body></html>

"""

    for item in recipients:
        print('이메일 보내는중 :' + item['email'])

        msg = MIMEMultipart('alternative')

        msg['Subject'] = '메일 제목'
        msg['From'] = '보내는 사람 메일'
        msg['To'] = item['email']

        msg.attach(MIMEText(body,'html'))

        server.send_message(msg)

    print('이메일 보내기 완료')
    server.quit()


if __name__ == '__main__':
    list_json = [
    {'email': 'abcde@abc.com'},
     ]
    sender(list_json)

 

해당 소스를 저장 하신 뒤 python 명령어로 실행시켜 주시면 됩니다

$ python 파일명.py

'Server' 카테고리의 다른 글

[django] MongoDB, Line이 사용하는 이유  (1) 2019.10.02