如何在 Python 中通过 Gmail 发送电子邮件?

手动发送大量电子邮件是一项乏味的任务。 您可以使用第三方服务一次批量发送电子邮件。

您如何创建自己的自定义脚本来发送电子邮件?

是不是很棒?

是啊,就是。 我们将用 Python 编写一个脚本来发送电子邮件。

Python 有一个名为 smtplib 的库,用于发送电子邮件。 库 smtplib 基于 SMTP(简单邮件传输协议)。 SMTP 用于向其他人发送电子邮件。

设置 Gmail

在这里,我们将使用 Gmail 作为电子邮件提供商。 Google 不允许脚本登录。我们需要更改 Gmail 帐户的安全性,以允许脚本登录我们的 Gmail 帐户。

更改我们的 Gmail 帐户中的安全选项并不好,因为它允许其他人很容易地访问该帐户。 建议创建一个新的 Gmail 帐户。 转到设置 这里 并打开允许安全性较低的应用程序:打开设置。

如果您不习惯开启上述设置,您可以使用 Google API 登录您的 Gmail 帐户。 您可以找到使用 Google API 进行身份验证的脚本 这里.

发送邮件的步骤

使用 smtplib 库发送邮件需要完成某些步骤。 让我们先看看步骤,然后再编写脚本。

#1。 连接到 SMTP 服务器

每个服务提供商都会有不同的 SMTP 服务器域名和端口。 我们必须使用我们将在脚本中使用的 SMTP 服务器域名和电子邮件提供商的端口。 Gmail 的 SMTP 服务器域名和端口是 smtp.gmail.com 和 465

我们将为 SMTP 服务器连接使用 SSL 加密,因为它比 TSL 加密更安全。 如果要使用 TSL 加密,则使用端口 587 而不是 465。 SMTP 服务器域名将根据电子邮件服务提供商而有所不同。

连接到 SMTP 服务器的代码

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

#2。 登录

一旦与 SMTP 服务器建立连接,我们就可以使用电子邮件地址和密码以及登录 SMTP 对象的方法登录。 代码如下所示。

server.login(sender_email, password)

#3。 发邮件

登录后,我们迫不及待地发送邮件。 使用sendmail 方法发送邮件。 确保以下列格式发送邮件。

  什么是 Safari 中的密钥以及如何使用它们

主题: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 类用于简化格式化和书写主题,从地址到地址等,我们将使用 attach 方法将使用 MIMEText 类创建的内容交给 MIMEMultipart。

我们需要确保 MIMEMultipart 的实例是使用参数 alternative 创建的,以呈现纯文本或 HTML。 让我们发送一封包含 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'] = 'techblik.com Celebrations'
            mail['From'] = self.sender_mail
            mail['To'] = email

            text_template = """
            techblik.com

            Hi {0},
            We are delighted announce that our website hits 10 Million views this month.
            """
            html_template = """
            <h1>techblik.com</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 属性添加密件抄送。

  如何在 Mac 上设置和使用 Google Drive

添加附件

附件可以是图片、pdf、docs、sheet等,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 = "techblik.com-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)

一次发送到群发邮件

我们使用循环将相同的邮件发送给多个成员。 这是一种情况(当您不希望接收者知道其他接收者时)。

假设您必须同时向同一组的 1000 名成员发送相同的邮件。 在这种情况下,使用循环是不合适的。 我们可以在普通邮件撰写的收件人字段中添加多封电子邮件。 如何在 Python 脚本中做到这一点?

我们需要将电子邮件列表组合成一个用逗号和空格分隔的字符串。 我们可以使用 join 方法 string 将所有电子邮件组合为一个字符串。 查看将电子邮件组合为字符串的代码。

", ".join(emails)

使用上面的字符串替换上面脚本中的 To 字段。 就是这样,您已将邮件一次性发送到群发邮件。

结论

有一些第三方库可以用 Python 发送电子邮件。 他们之中有一些是 信封, 亚格邮件, 侧卫等等,这些库帮助我们用几行代码编写脚本。 您也可以探索它们。

现在,您可以使用 Python 脚本自动化您的电子邮件内容。 发送电子邮件的结构将根据您的用例而有所不同。 我们已经看到了发送电子邮件的不同场景。 您可以根据您的用例轻松自定义教程中讨论的脚本。 我已经参考了这个 文章.

快乐编码🙂