python script에서 간단하게 이메일을 발송하고 싶고, 이메일의 빈도가 높지 않으면 번거롭게 SMTP 서버를 설정하지 않고 gmail에서 제공하는 SMTP 서버를 이용해서 메일을 발송할 수 있다.
간단한 예시 코드는 아래와 같다.
import os
import smtplib
from email.mime.text import MIMEText
from datetime import datetime, timedelta
import glob
# Gmail 설정
gmail_user = 'SENDER USERID@gmail.com' # Gmail 주소
gmail_app_password = 'YOUR APP SPECIFIC PASSWORD' # 앱 비밀번호
# 이메일 전송
def send_email(subject, message, recipient):
msg = MIMEText(message)
msg['Subject'] = subject
msg['From'] = gmail_user
msg['To'] = recipient
try:
server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.ehlo()
server.login(gmail_user, gmail_app_password)
server.sendmail(gmail_user, recipient, msg.as_string())
server.close()
except Exception as e:
print(f"Error sending email: {e}")
send_email("this is a title", "this is a mail body", "TARGET EMAIL")
위의 코드에서 gmail_app_password 는 보안을 위해 특정 앱에 할당한 비밀번호로, 메일을 발송할 구글 계정으로 구글에 로그인 해서 myaccount.google.com / Security/ 2-Step Verification / App passwords 에서 만들어줄 수 있다.
하여간 이렇게 하면 아마 이메일이 잘 발송이 될 것이다.
그런데, 수신자가 여러 명일 때는 어떻게 해야 할까?
send_email() 함수에서 msg['To'] 는 이메일에 '표시되는' 수신자를 의미하고 ','(comma) 로 구분된 이메일 스트링 형식을 받는다.
sendmail() 함수에서 recipient 는 실제 메일이 전송되는 수신자를 의미하고, 수신자가 하나일 때는 string, 복수일 때는 list 포맷을 받는다.
결국 코드를 약간 수정하면
def send_email(subject, message, recipients):
msg = MIMEText(message)
msg['Subject'] = subject
msg['From'] = gmail_user
msg['To'] = ','.join(recipients)
try:
server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
server.ehlo()
server.login(gmail_user, gmail_app_password)
server.sendmail(gmail_user, recipients, msg.as_string())
server.close()
except Exception as e:
print(f"Error sending email: {e}")
send_mail('mail title', 'mail message', ['target1@mail.com', 'target2@mail.com'])
이런 식으로 처리해주면 되겠다.
참고 문서
https://docs.python.org/2/library/email-examples.html