如何使用 Python 发送邮件

How to send mail with Python

我正在尝试使用 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')

我该怎么办?

谢谢

您似乎需要 Google 调用应用程序密码的东西。

基本上,您会生成一个 16 位密码,该密码对于您的应用是唯一的。您在 python 程序中输入此特定密码,而不是您经常用于登录 Google 帐户的密码。

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

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

您可以使用此代码:

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,首先 运行 您会收到错误消息。之后你应该登录到你的电子邮件帐户并批准从另一个应用程序访问你的帐户(登录后你会收到一条消息)

您可以使用免费邮件 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

的信息

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

我想通过推荐 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 安装它。