Python에서 Gmail을 통해 이메일을 보내는 방법은 무엇입니까?
수많은 이메일을 일일이 수동으로 보내는 작업은 매우 번거롭습니다. 다행히도, 외부 서비스를 이용하면 많은 양의 이메일을 한 번에 발송할 수 있습니다. 하지만, 직접 맞춤형 스크립트를 만들어 이메일을 보내는 것은 어떠신가요? 꽤 멋진 생각이지 않나요? 이번 글에서는 파이썬을 사용하여 이메일 발송 스크립트를 작성하는 방법에 대해 알아보겠습니다.
파이썬에는 이메일 전송에 활용되는 `smtplib`라는 강력한 라이브러리가 존재합니다. 이 라이브러리는 SMTP(Simple Mail Transfer Protocol)를 기반으로 동작하며, SMTP는 다른 사람에게 이메일을 전송하는 데 사용되는 표준 프로토콜입니다.
Gmail 설정
여기서는 Gmail을 이메일 공급자로 활용할 예정입니다. 보안상의 이유로 Google은 스크립트에서 직접 로그인하는 것을 허용하지 않습니다. 따라서 스크립트가 Gmail 계정에 접근할 수 있도록 계정 설정을 변경해야 합니다. 주의해야 할 점은, Gmail 계정의 보안 옵션을 변경하면 다른 사람이 계정에 쉽게 접근할 수 있게 되므로 보안에 매우 취약해질 수 있습니다. 따라서 테스트용으로 새로운 Gmail 계정을 생성하는 것을 권장합니다. 계정을 생성한 후, 여기에서 '보안 수준이 낮은 앱 허용' 설정을 활성화해야 합니다.
위 설정 변경이 부담스럽다면 Google API를 사용하여 Gmail 계정에 로그인하는 방법도 있습니다. 관련 인증 코드는 여기에서 찾아볼 수 있습니다.
이메일 전송 절차
`smtplib` 라이브러리를 사용하여 이메일을 보내려면 몇 가지 단계를 따라야 합니다. 아래에서 각 단계를 살펴보고, 이를 기반으로 스크립트를 작성해 보겠습니다.
1. SMTP 서버 연결
각 서비스 제공업체는 고유한 SMTP 서버 도메인 이름과 포트 번호를 가지고 있습니다. 스크립트에서는 사용 중인 이메일 공급업체의 SMTP 서버 도메인 이름과 포트 번호를 정확히 입력해야 합니다. 예를 들어 Gmail의 경우 SMTP 서버 도메인 이름은 `smtp.gmail.com`이고, 포트 번호는 `465`입니다.
SSL 암호화가 TLS 암호화보다 안전하므로, SMTP 서버 연결 시 SSL 암호화를 사용하는 것이 좋습니다. 만약 TLS 암호화를 사용하고 싶다면, 포트 `465` 대신 `587`을 사용해야 합니다. SMTP 서버 도메인 이름은 이메일 서비스 제공업체에 따라 다를 수 있습니다.
SMTP 서버에 연결하는 코드는 다음과 같습니다.
server = smtplib.SMTP_SSL(smtp_server_domain_name, port, context=ssl_context)
2. 로그인
SMTP 서버에 연결된 후에는 `login` 메서드를 사용하여 이메일 주소와 비밀번호로 로그인할 수 있습니다. 코드는 다음과 같습니다.
server.login(sender_email, password)
3. 이메일 보내기
로그인이 완료되면 `sendmail` 메서드를 사용하여 이메일을 발송할 수 있습니다. 이메일은 다음과 같은 형식을 따릅니다.
제목: 메일제목\n메일내용
위의 형식에서 줄바꿈 문자(`\n`)를 사용하여 제목과 내용을 구분합니다. 실제 코드 예시를 살펴봅시다.
server.sendmail(sender_mail, email, f"Subject: {subject}\n{content}")
4. 종료
마지막으로 SMTP 연결을 종료해야 합니다.
지금까지 Python을 사용하여 이메일을 보내는 단계를 살펴보았습니다. 다음은 전체적인 코드 흐름을 보여주는 예시입니다.
import smtplib, ssl
class Mail:
def __init__(self):
self.port = 465
self.smtp_server_domain_name = "smtp.gmail.com"
self.sender_mail = "GMAIL_ADDRESS"
self.password = "SECURE_PASSWORD"
def send(self, emails, subject, content):
ssl_context = ssl.create_default_context()
service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context)
service.login(self.sender_mail, self.password)
for email in emails:
result = service.sendmail(self.sender_mail, email, f"Subject: {subject}\n{content}")
service.quit()
if __name__ == '__main__':
mails = input("Enter emails: ").split()
subject = input("Enter subject: ")
content = input("Enter content: ")
mail = Mail()
mail.send(mails, subject, content)
`Mail` 클래스를 만들고, `send` 메서드를 통해 이메일을 발송합니다. 클래스를 사용하는 것은 선택 사항이지만, 코드의 가독성을 높여줍니다. 위 코드에서는 위에서 설명한 이메일 전송 단계를 차례대로 구현했습니다. 이렇게 하면 파이썬 스크립트를 사용하여 이메일을 보낼 수 있게 됩니다.
HTML 콘텐츠 전송
이메일 내용을 HTML 형식으로 보내고 싶을 때는 어떻게 해야 할까요? 물론 가능합니다. 파이썬의 내장 라이브러리인 `email.mime`을 활용하면 됩니다. MIME는 이메일 형식을 확장하여 이미지, 비디오 등의 다양한 콘텐츠를 지원하는 데 사용되는 표준입니다.
`email.mime` 모듈에는 `MIMEText`와 `MIMEMultipart` 두 개의 클래스가 필요합니다. 각 클래스에 대한 간단한 설명을 살펴보겠습니다.
1. MIMEText
`MIMEText` 클래스는 이메일 내용을 HTML 형식으로 작성하는 데 사용됩니다. HTML 콘텐츠와 콘텐츠 유형을 전달하여 `MIMEText` 클래스의 인스턴스를 생성합니다. 아래 코드를 참조하십시오.
html_content = MIMEText(html_template, 'html')
일부 이메일 서비스는 HTML 렌더링을 지원하지 않을 수 있습니다. 따라서 일반 텍스트와 HTML 형식 모두에 대해 `MIMEText` 클래스의 인스턴스를 생성하는 것이 좋습니다.
2. MIMEMultipart
`MIMEMultipart` 클래스는 발신자, 수신자, 제목 등을 설정하고 메시지 형식을 단순화하는 데 사용됩니다. `MIMEText` 클래스를 사용하여 만든 콘텐츠를 `attach` 메서드를 사용하여 `MIMEMultipart`에 추가합니다.
HTML 또는 일반 텍스트 중 어느 형식을 렌더링할지 결정하기 위해 `MIMEMultipart` 인스턴스를 생성할 때 `alternative` 인수를 사용해야 합니다. 다음은 HTML 콘텐츠를 이메일로 보내는 예시입니다.
import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
class Mail:
def __init__(self):
...
def send(self, emails):
ssl_context = ssl.create_default_context()
service = smtplib.SMTP_SSL(self.smtp_server_domain_name, self.port, context=ssl_context)
service.login(self.sender_mail, self.password)
for email in emails:
mail = MIMEMultipart('alternative')
mail['Subject'] = 'koreantech.org Celebrations'
mail['From'] = self.sender_mail
mail['To'] = email
text_template = """
koreantech.org
Hi {0},
We are delighted announce that our website hits 10 Million views this month.
"""
html_template = """
<h1>koreantech.org</h1>
<p>Hi {0},</p>
<p>We are delighted announce that our website hits <b>10 Million</b> views last month.</p>
"""
html_content = MIMEText(html_template.format(email.split("@")[0]), 'html')
text_content = MIMEText(text_template.format(email.split("@")[0]), 'plain')
mail.attach(text_content)
mail.attach(html_content)
service.sendmail(self.sender_mail, email, mail.as_string())
service.quit()
if __name__ == '__main__':
mails = input("Enter emails: ").split()
mail = Mail()
mail.send(mails)
`MIMEMultipart` 인스턴스에서 `Bcc` 속성을 사용하여 숨은 참조를 추가할 수도 있습니다.
첨부 파일 추가
첨부 파일은 이미지, PDF, 문서 등 다양한 형식이 될 수 있습니다. `email.mime` 클래스에는 `MIMEBase`라는 클래스가 있으며, 이를 사용하여 이메일에 첨부 파일을 추가할 수 있습니다. 다음은 메일에 첨부 파일을 추가하는 예시 코드입니다.
import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from pathlib import Path
class Mail:
def __init__(self):
...
def send(self, emails):
## login...
for email in emails:
## MIMEMultipart instance
## text and html templates
## MIMEText instances
## attaching messages to MIMEMultipart
## attaching an attachment
file_path = "koreantech.org-logo.png"
mimeBase = MIMEBase("application", "octet-stream")
with open(file_path, "rb") as file:
mimeBase.set_payload(file.read())
encoders.encode_base64(mimeBase)
mimeBase.add_header("Content-Disposition", f"attachment; filename={Path(file_path).name}")
mail.attach(mimeBase)
## sending mail
service.quit()
if __name__ == '__main__':
mails = input("Enter emails: ").split()
mail = Mail()
mail.send(mails)
대량 메일 발송
이전 예시에서는 동일한 이메일을 여러 수신자에게 발송하기 위해 루프를 사용했습니다. 하지만 수신자가 다른 수신자의 정보를 알 필요가 없는 경우에는 이 방법을 사용합니다.
동일한 이메일을 수천 명의 회원에게 동시에 보내야 하는 상황을 가정해 보겠습니다. 이 경우 루프를 사용하는 것은 효율적이지 않습니다. 일반적인 이메일 작성 방식과 마찬가지로, 여러 개의 이메일 주소를 '받는 사람' 필드에 추가할 수 있습니다. 파이썬 스크립트에서는 어떻게 해야 할까요?
이메일 목록을 쉼표와 공백으로 구분된 문자열로 결합해야 합니다. `join` 메서드를 사용하여 모든 이메일 주소를 하나의 문자열로 결합할 수 있습니다. 다음은 이메일 주소를 문자열로 결합하는 코드입니다.
", ".join(emails)
위에서 생성한 문자열을 사용하여 스크립트의 '받는 사람' 필드를 대체하면, 한 번에 대량으로 이메일을 발송할 수 있습니다.
결론
파이썬에는 이메일 발송을 위한 다양한 외부 라이브러리가 존재합니다. 예를 들어 Envelopes, yagmail, Flanker 등이 있습니다. 이러한 라이브러리를 활용하면 몇 줄의 코드로 더욱 쉽게 이메일 스크립트를 작성할 수 있습니다. 필요에 따라 이러한 라이브러리를 탐색해 보는 것도 좋습니다.
이제 파이썬 스크립트를 사용하여 이메일 발송 작업을 자동화할 수 있게 되었습니다. 이메일 전송 구조는 사용 사례에 따라 다를 수 있으며, 이 글에서 설명한 스크립트를 사용 사례에 맞게 쉽게 조정할 수 있습니다. 참고로, 본 글은 이 기사를 참조하여 작성되었습니다.
즐거운 코딩하세요! 😊