如何使用Python发送邮件

时间:2015-05-30 17:37:49

标签: python python-3.x gmail

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

我该怎么办?

由于

4 个答案:

答案 0 :(得分:7)

好像你需要谷歌称之为应用密码的东西。

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

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

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

答案 1 :(得分:3)

您可以使用此代码:

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,则会收到错误消息。之后,您应该登录到您的电子邮件帐户并批准从其他应用程序访问您的帐户(登录后您将收到一条信息)

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

我想通过建议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']

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

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

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

更简洁!

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