Python에서 Gmail을 통해 이메일을 보내는 방법은 무엇입니까?

대량의 이메일을 수동으로 보내는 것은 지루한 작업입니다. 타사 서비스를 사용하여 한 번에 대량으로 이메일을 보낼 수 있습니다.

이메일을 보내기 위해 나만의 맞춤 스크립트를 만드는 것은 어떻습니까?

멋지지 않나요?

네, 그렇습니다. 우리는 이메일을 보내기 위해 파이썬으로 스크립트를 작성할 것입니다.

Python에는 이메일을 보내는 데 사용되는 smtplib라는 라이브러리가 있습니다. 라이브러리 smtplib는 SMTP(Simple Mail Transport Protocol)를 기반으로 합니다. SMTP는 다른 사람에게 이메일을 보내는 데 사용됩니다.

Gmail 설정

여기서는 Gmail을 이메일 공급자로 사용하겠습니다. Google은 스크립트로 로그인하는 것을 허용하지 않습니다. 그리고 스크립트로 Gmail 계정에 로그인할 수 있도록 Gmail 계정의 보안을 변경해야 합니다.

Gmail 계정의 보안 옵션을 변경하면 다른 사람이 계정에 매우 쉽게 액세스할 수 있으므로 좋지 않습니다. 새 Gmail 계정을 만드는 것이 좋습니다. 설정으로 이동 여기 보안 수준이 낮은 앱 허용: 켜짐 설정을 켭니다.

위의 설정을 켜는 것이 불편하다면 Google API를 사용하여 Gmail 계정에 로그인할 수 있습니다. 인증을 위해 Google API를 사용하는 스크립트를 찾을 수 있습니다. 여기.

메일 보내기 단계

smtplib 라이브러리를 사용하여 메일을 보내려면 특정 단계를 수행해야 합니다. 먼저 단계를 확인한 다음 스크립트를 작성해 보겠습니다.

#1. SMTP 서버에 연결

서비스 공급자마다 SMTP 서버 도메인 이름과 포트가 다릅니다. 스크립트에서 사용할 SMTP 서버 도메인 이름과 이메일 공급자의 포트를 사용해야 합니다. Gmail의 SMTP 서버 도메인 이름 및 포트는 smtp.gmail.com 및 465입니다.

SSL 암호화가 TSL 암호화보다 더 안전하므로 SMTP 서버 연결에 SSL 암호화를 사용합니다. TSL 암호화를 사용하려면 포트 465 대신 587을 사용하십시오. SMTP 서버 도메인 이름은 이메일 서비스 공급자에 따라 다릅니다.

  Instacart 구독 취소 방법

SMTP 서버에 연결하는 코드

server = smtplib.SMTP_SSL(smtp_server_domain_name, port, context=ssl_context)

#2. 로그인

SMTP 서버에 연결되면 로그인 SMTP 개체의 방법으로 이메일 주소와 비밀번호를 사용하여 로그인할 수 있습니다. 코드는 다음과 같습니다.

server.login(sender_email, password)

#삼. 메일을 보내다

로그인 후에는 메일을 보낼 때까지 기다릴 수 없습니다. sendmail 방법을 사용하여 메일을 보냅니다. 다음 형식으로 메일을 보내십시오.

제목: your_subject_for newline mail_content

공백은 필요하지 않습니다. 위 형식의 설명을 위한 것입니다. 샘플 코드를 보자.

server.sendmail(sender_mail, email, f"Subject: {subject}n{content}")

#4. 그만두다

SMTP c를 종료하는 것을 잊지 마십시오.

우리는 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라는 메서드가 있습니다. 수업을 쓰느냐 마느냐는 당신에게 달려 있습니다. 클래스는 더 읽기 쉽게 만듭니다. 위에서 설명한 모든 단계를 send 메서드에서 하나씩 구현했습니다.

만세! Python 스크립트를 사용하여 메일을 보냈습니다.

HTML 콘텐츠

HTML로 메일을 보내려면 어떻게 해야 합니까? 가능합니까?

그래, 왜 안돼. email.mime이라는 HTML 라이브러리를 사용하여 메일을 보낼 수 있습니다. 내장 라이브러리입니다.

그만큼 몸짓 광대극 응용 프로그램, 비디오, 이미지 등을 지원하기 위해 이메일의 형식을 확장하는 데 사용되는 표준입니다.

email.mime 모듈에는 두 개의 클래스가 필요합니다. MIMEText 및 MIMEMultipart입니다. 그들에 대한 간단한 설명을 보자.

#1. MIME텍스트

MIMEText 클래스는 메일 내용을 HTML로 작성하는 데 사용됩니다. HTML 콘텐츠와 콘텐츠 유형을 전달하여 MIMEText 클래스의 인스턴스를 생성합니다. 아래 샘플 코드를 참조하십시오.

html_content = MIMEText(html_template, 'html')

일부 메일 서비스는 HTML 렌더링을 지원하지 않습니다. 따라서 일반 텍스트와 HTML에 대해 MIMEText 클래스의 두 인스턴스를 만드는 것이 좋습니다.

  스푸핑이란 무엇이며 스푸핑 공격을 방지하는 방법은 무엇입니까?

#2. MIME멀티파트

MIMEMultipart 클래스는 주소에서 주소 등으로 서식 지정 및 작성 주제를 단순화하는 데 사용됩니다. MIMEText 클래스로 만든 콘텐츠를 첨부 방법을 사용하여 MIMEMultipart에 제공합니다.

일반 텍스트 또는 HTML을 렌더링하기 위해 인수 대안으로 MIMEMultipart의 인스턴스가 생성되었는지 확인해야 합니다. 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 인스턴스에서 숨은 참조 속성을 사용하여 숨은 참조를 추가할 수도 있습니다.

첨부 파일 추가

첨부 파일은 이미지, 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)

대량메일로 한번에 메일 보내기

동일한 메일을 여러 회원에게 보내기 위해 루프를 사용했습니다. 그것은 하나의 경우입니다(수신자가 다른 수신자에 대해 알기를 원하지 않는 경우).

  Google 주제 API에 대해 알아야 할 사항

동일한 그룹의 1000명의 회원에게 동일한 메일을 동시에 보내야 한다고 가정합니다. 이러한 경우 루프를 사용하는 것은 적합하지 않습니다. 일반 메일 작성에서 받는 사람 필드에 여러 이메일을 추가할 수 있습니다. Python 스크립트에서 어떻게 수행합니까?

이메일 목록을 쉼표와 공백으로 구분된 문자열로 결합해야 합니다. 조인 방법 문자열을 사용하여 모든 이메일을 문자열로 결합할 수 있습니다. 이메일을 문자열로 결합하는 코드를 참조하십시오.

", ".join(emails)

위 문자열을 사용하여 위 스크립트에서 To 필드를 바꿉니다. 그게 다야, 당신은 메일을 한 번에 대량 메일로 보냈습니다.

결론

Python에서 이메일을 보내는 타사 라이브러리가 있습니다. 그들 중 일부는 봉투, 야그메일, 측면 보루등.., 이 라이브러리는 몇 줄의 코드로 스크립트를 작성하는 데 도움이 됩니다. 그것들을 탐색할 수도 있습니다.

이제 Python 스크립트를 사용하여 이메일 내용을 자동화할 수 있습니다. 이메일 전송 구조는 사용 사례에 따라 다릅니다. 우리는 이메일을 보내는 다양한 시나리오를 보았습니다. 자습서에서 설명한 스크립트를 사용 사례에 맞게 쉽게 사용자 지정할 수 있습니다. 나는 이것을 참조했다 기사.

행복한 코딩 🙂