Python에서 첨부 파일이 있는 이메일 보내기

Zeeshan Afridi 2023년10월8일
  1. Python에서 첨부 파일이 있는 이메일 보내기
  2. Python에서 첨부 파일이 있는 이메일을 보내는 단계
Python에서 첨부 파일이 있는 이메일 보내기

오늘의 기사에서는 Python을 사용하여 첨부 파일이 있는 이메일을 보내는 방법을 알려줍니다. 이를 위해 메일을 보내기 위해 외부 라이브러리가 필요하지 않습니다. 대신 smtplib라는 모듈을 가져와 메일이 SMTP 프로토콜을 통해 전송되기 때문에 사용합니다. 우리가 어떻게 할 수 있는지 봅시다.

Python에서 첨부 파일이 있는 이메일 보내기

Python은 문자 메시지를 보낼 때 모든 메시지 내용을 일반 텍스트로 취급합니다. 텍스트 메시지에 HTML 태그를 추가하더라도 HTML 구문에 따라 구조화되지 않으며 메시지는 여전히 기본 텍스트로 나타납니다.

그러나 Python은 기본 형식으로 HTML 메시지를 보낼 수 있습니다. 따라서 HTML 이메일을 보내기 위해 이메일을 보낼 때 MIME 버전, 콘텐츠 유형 및 문자 집합을 선택할 수 있습니다.

Python에는 smtplib라는 패키지가 포함되어 있습니다. 메일은 SMTP(Simple Mail Transfer Protocol)를 통해 전송됩니다. 메일링을 위해 SMTP 클라이언트 세션 개체를 생성합니다.

SMTP에는 올바른(유효한) 소스 및 대상 이메일 주소, 서버 주소 및 포트 번호가 필요합니다. 예를 들어 Google의 포트 번호는 587입니다. 서버 주소와 포트 번호는 사용 중인 서비스에 따라 변경됩니다. 이 기사에서는 Google을 사용하고 있습니다.

먼저 메일 전송 모듈인 smtplib를 가져와야 합니다. 또한 MIME(Multipurpose Internet Mail Extension) 모듈을 사용하여 적응성을 높입니다.

MIME 헤더를 사용하여 발신자, 수신자 및 기타 정보를 저장할 수 있습니다. 파일을 이메일에 첨부하려면 MIME도 필요합니다. 메시지를 보내기 위해 Google의 Gmail 서비스를 사용합니다.

Google의 보안 요구 사항을 준수하려면 특정 조정을 수행해야 합니다. 예를 들어 이러한 설정이 없거나 Google이 타사 앱의 액세스를 지원하지 않는 경우 다음 코드가 작동하지 않을 수 있습니다.

액세스를 제공하려면 Google 계정에서 보안 수준이 낮은 앱 액세스 설정을 지정해야 합니다. 또한 2단계 인증이 활성화된 경우 보안 수준이 낮은 액세스를 사용할 수 없습니다.

Python에서 첨부 파일이 있는 이메일을 보내는 단계

먼저 MIME을 생성한 다음 생성된 MIME에 보낸 사람, 받는 사람, 메일 제목 및 첨부된 본문을 추가해야 합니다. 그런 다음 이메일에 첨부된 파일을 바이너리 모드로 엽니다.

첨부 파일의 경우 헤더를 추가하고 작업 포트 번호 587SMTP 세션을 열고 세션을 종료합니다.

예제 코드:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

mail_content = """Hello,
This mail is to inform you about Today's meeting.
"""

sender_address = "sender@gmail.com"
sender_pass = "-------"
receiver_address = "receiver@gmail.com"

message = MIMEMultipart()
message["From"] = sender_address
message["To"] = receiver_address
message["Subject"] = "Info about meeting."
message.attach(MIMEText(mail_content, "plain"))

session = smtplib.SMTP("smtp.gmail.com", 587)
session.starttls()
session.login(sender_address, sender_pass)
text = message.as_string()
session.sendmail(sender_address, receiver_address, text)
session.quit()

print("Mail Sent")

출력:

Mail Sent

다음은 Python에서 첨부 파일이 있는 이메일을 보내는 방법에 대한 또 다른 예입니다.

예제 코드:

import smtplib

from pathlib import Path
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
import email.utils
from email import encoders
from smtpd import COMMASPACE


def send_mail(
    send_from,
    send_to,
    subject,
    message,
    files=[],
    server="localhost",
    port=587,
    username="",
    password="",
    use_tls=True,
):

    msg = MIMEMultipart()
    msg["From"] = send_from
    import email.utils

    msg["To"] = COMMASPACE.join(send_to)
    msg["Date"] = email.utils.formatdate(localtime=True)
    msg["Subject"] = subject

    msg.attach(MIMEText(message))

    for path in files:
        part = MIMEBase("application", "octet-stream")
        with open(path, "rb") as file:
            part.set_payload(file.read())
        encoders.encode_base64(part)
        part.add_header(
            "Content-Disposition", "attachment; filename={}".format(Path(path).name)
        )
        msg.attach(part)

    smtp = smtplib.SMTP(server, port)
    if use_tls:
        smtp.starttls()
    smtp.login(username, password)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.quit()

출력:

/Users/apple/PycharmProjects/email/venv/bin/python /Users/apple/PycharmProjects/email/main.py 

Process finished with exit code 0

Python에서 이메일을 보내는 첫 번째 단계는 Google 계정의 보안 수준을 낮추는 것입니다. 그렇지 않으면 연결 거부 오류가 생성됩니다. 작동하려면 2단계 인증(2FA)을 제거해야 합니다.

둘째, 메일링 송신 모듈을 가져와야 하며 SMTP에 유효한 소스 및 대상 이메일 주소와 포트 번호가 필요합니다. 예를 들어 Google의 포트 번호는 587입니다.

Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn

관련 문장 - Python Email