如何使用Python通过Gmail发送电子邮件?

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

您可以创建自己定制的脚本来发送电子邮件,如何呢?

是不是很棒呢?

是的,没错。我们打算用Python编写一个发送电子邮件的脚本。

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

设置Gmail

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

更改Gmail帐户中的安全选项并不好,因为这会使其他人很容易访问该帐户。建议您创建一个新的Gmail帐户。转到设置here并打开允许不安全的应用程序:开启设置。

如果您不喜欢打开上述设置,您可以使用Google API登录到您的Gmail帐户。您可以在此处找到使用Google API进行身份验证的脚本here

发送邮件的步骤

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

#1. 连接到SMTP服务器

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

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

连接到SMTP服务器的代码

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

#2. 登录

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

server.login(sender_email, password)

#3. 发送邮件

登录后,我们无法等待发送邮件。使用sendmail方法发送邮件。确保以以下格式发送邮件。

Subject: 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(“输入邮件地址: “).split()
subject = input(“输入主题: “)
content = input(“输入内容: “)

mail = Mail()
mail.send(mails, subject, content)

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'] = 'Geekflare庆祝活动'
            mail['From'] = self.sender_mail
            mail['To'] = email

            text_template = """
            Geekflare

            您好{0},
            我们非常高兴地宣布,我们的网站本月达到了1000万次浏览量。
            """
            html_template = """
            

Geekflare

您好{0},

我们非常高兴地宣布,我们的网站上个月达到了1000万次浏览量。

""" 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("请输入邮箱:").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):
        ## 登录...
        
        for email in emails:
            ## MIMEMultipart实例

            ## 文本和HTML模板

            ## MIMEText实例

            ## 将消息附加到MIMEMultipart中

            ## 添加附件
            file_path = "Geekflare-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)

            ## 发送邮件

        service.quit()


if __name__ == '__main__':
    mails = input("请输入邮箱:").split()

    mail = Mail()
    mail.send(mails)

一次发送邮件给多个邮箱

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

假设您需要将相同的邮件一次性发送给同一组的1000个成员。在这种情况下,使用循环是不合适的。我们可以在通常的邮件撰写中在To字段中添加多个电子邮件。如何在Python脚本中实现呢?

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

", ".join(emails)

使用上述字符串替换上面脚本中的To字段。这样,您就一次性将邮件发送给了多个邮箱。

结论

有一些第三方库可以用Python发送电子邮件。其中一些是EnvelopesYagmailFlanker等等。这些库帮助我们使用很少的代码编写脚本。您也可以探索它们。

现在,您可以使用Python脚本自动化您的电子邮件事务。基于您的用例,sending emails的结构将会有所不同。我们已经看到了不同的发送电子邮件的场景。您可以轻松地将教程中讨论的脚本定制为适合您的用例。我参考了这个article

愉快编码 🙂

类似文章