如何使用 Python 发送邮件

Posted

技术标签:

【中文标题】如何使用 Python 发送邮件【英文标题】:How to send mail with Python 【发布时间】:2015-08-13 11:38:34 【问题描述】:

我正在尝试用 python 发送一封简单的邮件

import smtplib

server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login("mymail@gmail.com", "mypassword")

msg = "Hello world"
server.sendmail("mymail@gmail.com", "mymail@gmail.com", msg)
server.quit()

但我得到了这个错误:

server.login("user@gmail.com", "psw")

File "C:\Python\lib\smtplib.py", line 652, in login

raise SMTPAuthenticationError(code, resp)

smtplib.SMTPAuthenticationError: (534, b'5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbuxb\n5.7.14 4i2u8qU8V3jgf6uGv8da1RAGPJyctRvIFy_kjai6aKVx_B6qVhoz_dzFpvfPC18H-jeM6K\n5.7.14 cnm2HVuq-wr-uw59hD31ms-cxMmnZuq6Z3_liDaDmu8_UqaiUwR4FUiuX2i5pPdQjJzFvv\n5.7.14 4VrEF5XT4ol2iN17gnB_jITpwzsjH9Ox3NCNcfl7SriHr5m7esc15PWI0CG_2CTlyh7RxW\n5.7.14 XhoJPajs8GMd-khOQWUqucywfrfo> Please log in via your web browser and\n5.7.14 then try again.\n5.7.14 Learn more at\n5.7.14 https://support.google.com/mail/bin/answer.py?answer=78754 ef10sm13614207wjd.49 - gsmtp')

我该怎么办?

谢谢

【问题讨论】:

@Yura,非常抱歉,但当我尝试登录您的主服务器(使用错误消息中显示的数据)时,系统会要求我验证是您本人。所以,你有两个因素的授权。再次,请您原谅我这样做。您绝对应该从这里删除您的登录名和密码。 @Yura,这意味着,您应该以某种方式处理双因素身份验证。要么禁用此功能,要么深入研究其中的一些文档并使用一些 API(如果 Google 提供)。 他们在互联网上有很多教程,引用堆栈溢出指南,“展示你自己的研究”。 你需要花更多的时间在你的拼写上,你可能会因此被禁止。 (这并不难!)几乎每个句子都有一个错字。为了您(被禁止)和我们的缘故,请编辑您的 cmets 的拼写。 它在错误中说要去哪里:support.google.com/mail/bin/answer.py?answer=78754 【参考方案1】:

您似乎需要一些被 Google 称为应用密码的东西。

基本上,您会生成一个 16 位数的密码,该密码对您的应用来说是唯一的。你在 python 程序中输入这个特定的密码,而不是你经常用来登录你的谷歌帐户的密码。

这让您仍然可以享受两步验证的好处,同时还可以使用第三方应用程序,例如您自己的 python 程序。

以下是 Google 关于如何生成此类应用密码的说明: https://support.google.com/accounts/answer/185833?hl=en

【讨论】:

非常感谢您的详细解释和回答。这已经奏效了!【参考方案2】:

您可以使用此代码:

import smtplib

session = smtplib.SMTP('smtp.gmail.com', 587)
session.ehlo()
session.starttls()
session.login('youremail@gmail.com',' password')
headers = "\r\n".join(["from: " + 'youremail@gmail.com',
                       "subject: " + "test",
                       "to: " + 'contactemail@gmail.com',
                       "mime-version: 1.0",
                       "content-type: text/html"])

# body_of_email can be plaintext or html!                    
content = headers + "\r\n\r\n" + "body_of_email"
session.sendmail('youremail@gmail.com', 'contactemail@gmail.com', content)

请记住,如果您的电子邮件是 gmail 在第一次运行后您会收到错误。之后,您应该登录您的电子邮件帐户并批准从另一个应用程序访问您的帐户(登录后您将收到一条消息)

【讨论】:

@SaraSantana 请看一下yagmail,它应该可以很容易地发送电子邮件!【参考方案3】:

您可以使用免费的邮件 API,例如 mailgun:

import requests

def send_simple_message(target):
    return requests.post(
        "https://api.mailgun.net/v3/samples.mailgun.org/messages",
        auth=("api", "key-3ax6xnjp29jd6fds4gc373sgvjxteol0"),
        data="from": "Excited User <excited@samples.mailgun.org>",
              "to": [target],
              "subject": "Hello",
              "text": "Testing some Mailgun awesomeness!")

send_simple_message('target@email.com')

使用这样的 API 可以避免个人帐户身份验证的问题。

另请参阅:This question,了解有关使用 smtplib 的信息

【讨论】:

@Yura。对。我仍然认为添加替代解决方案可以提高未来读者的问题质量。很高兴你得到了答案!【参考方案4】:

是的,就像发布的答案一样,这是一个身份验证问题 :)

我想通过建议 yagmail 包进一步帮助您发送电子邮件(我是维护者,很抱歉打广告,但我觉得它真的很有帮助!)。请注意,我还在那里维护了一个常见错误列表,例如身份验证错误。

你的整个代码是:

import yagmail
yag = yagmail.SMTP('user', 'pw')
yag.send(contents = msg)

请注意,我为所有参数提供了默认值,例如,如果您想发送给自己,则可以省略“to = myemail@gmail.com”,如果您不想要主题,也可以省略它。

此外,目标也是让附加 html 代码或图像(和其他文件)变得非常容易。

您可以在哪里放置内容,例如:

contents = ['Body text, and here is an embedded image:', 'http://somedomain/image.png',
            'You can also find an audio file attached.', '/local/path/song.mp3']

哇,发送附件多么容易!如果没有 yagmail,这将需要 20 行;)

此外,如果您设置一次,您将永远不必再次输入密码(并安全地存储它)。在您的情况下,您可以执行以下操作:

import yagmail
yagmail.SMTP().send(contents = contents)

更简洁!

我邀请您查看github 或直接使用pip install yagmail 安装它。

【讨论】:

以上是关于如何使用 Python 发送邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有mailchimp的python发送单个邮件

如何使用 python 使用 mailchimp 发送 html 邮件

如何使用python发送电子邮件[关闭]

python: 如何使用 TO、CC 和 BCC 发送邮件?

如何使用 Python 的“MIME 处理包”发送电子邮件?

如何使用 Python/Django 在电子邮件中发送内联图像? [复制]