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

使用Python编写自动化邮件发送脚本

手动发送大量邮件是一项重复且耗时的任务。为了提高效率,我们可以借助第三方服务来批量发送电子邮件。但是,我们是否能创建自己的定制脚本来实现这一目标呢?

答案是肯定的!利用Python,我们可以轻松编写脚本来发送邮件。Python内置了一个名为smtplib的库,它基于简单邮件传输协议(SMTP),专门用于发送电子邮件。

配置Gmail邮箱

本例中,我们将使用Gmail作为邮件服务提供商。由于谷歌出于安全考虑,默认不允许脚本直接登录账户,因此我们需要调整Gmail账户的安全设置,以允许脚本登录。但这样做会降低账户安全性,因此建议创建一个新的Gmail账户专门用于发送邮件。您可以通过访问这里 来启用“允许安全性较低的应用”选项。

如果您不希望启用此选项,也可以使用Google API进行身份验证。您可以在这里找到使用Google API进行身份验证的Python脚本示例。

发送邮件的步骤

使用smtplib库发送邮件需要经过几个步骤。让我们先了解这些步骤,然后再开始编写代码。

#1. 连接到SMTP服务器

每个邮件服务提供商都有不同的SMTP服务器域名和端口。我们需要使用邮件服务提供商提供的SMTP服务器域名和端口号。例如,Gmail的SMTP服务器域名是smtp.gmail.com,端口号是465

为了提高安全性,我们建议使用SSL加密方式连接SMTP服务器。如果要使用TLS加密,则需要使用端口号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邮件内容

请注意,空格并非必需,仅用于区分格式。以下是发送邮件的示例代码:

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

#4. 退出

不要忘记在使用完SMTP服务器后调用quit方法退出。

以上是使用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方法用于发送邮件。将所有步骤封装在一个类中可以提高代码的可读性。上述代码已经实现了发送邮件的所有基本功能。

恭喜!您已经成功地使用Python脚本发送了邮件。

发送HTML格式邮件

如果需要发送HTML格式的邮件,应该如何操作?答案是肯定的!我们可以使用email.mime库来发送HTML格式的邮件。这是一个Python的内置库。

MIME是一种用于扩展电子邮件格式以支持应用程序、视频、图像等内容的标准。

我们需要用到email.mime模块中的两个类:MIMETextMIMEMultipart。下面分别简要介绍一下这两个类。

#1. MIMEText

MIMEText类用于编写HTML格式的邮件内容。我们可以通过传递HTML内容和内容类型来创建MIMEText类的实例。代码示例如下:

html_content = MIMEText(html_template, 'html')

考虑到有些邮件服务可能不支持HTML渲染,最好为纯文本和HTML内容分别创建MIMEText的实例。

#2. MIMEMultipart

MIMEMultipart类用于简化邮件的格式化,例如编写主题、发件人地址和收件人地址等。我们可以使用attach方法将MIMEText类创建的内容添加到MIMEMultipart实例中。

请确保使用alternative参数创建MIMEMultipart的实例,以便可以呈现纯文本或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属性来添加密送抄送。

添加附件

邮件附件可以是图片、PDF文档、Word文档或Excel表格等。要添加附件,我们需要用到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(emails)

使用上述字符串替换脚本中的To字段即可实现群发邮件的功能。

总结

除了smtplib库之外,还有一些第三方库可以帮助我们更便捷地使用Python发送邮件,例如Envelopesyagmailflanker等。这些库通常可以用更少的代码实现邮件发送的功能,您可以尝试探索这些库。

现在,您可以使用Python脚本自动化您的邮件发送流程了。邮件发送的具体结构会根据您的实际应用场景而有所不同。本教程介绍了各种发送邮件的场景,您可以根据自己的需要轻松定制文中的代码。这篇文章中提及的知识参考了这篇文章

祝您编程愉快!🙂