如何使用tls / ssl使用python发送office365的SMTP电子邮件

时间:2017-09-11 17:03:33

标签: python email ssl office365

我正在尝试使用python从我的office365公司帐户发送电子邮件。我是python的新手。此代码以前在使用我的hotmail帐户时有效,但是现在我需要发送机密信息,我必须使用我的公司电子邮件。

我尝试了几件事。

  • 已验证我的用户名和密码是否正确。
  • 同时使用python2和python3。两者都给出了同样的错误:535 5.7.3 Authentication unsuccessful
  • 我以前使用的是 mailserver.starttls() 以上错误,经过一番研究,我试图通过一个 证书。 mailserver.starttls(certfile ='office365.cer')

我不清楚证书部分,但我的步骤包括,在网上查找如何导出证书。使用Chrome浏览器,microsoftonline.com具有链证书。我可以导出root和根目录下面的级别,但不能导出最后一级。我不知道如何传递这两个文件,所以我只是传递了根证书。此时我收到错误:ssl.SSLError: [SSL] PEM lib (_ssl.c:3309)

我被困在这一点上。任何帮助表示赞赏。

下面使用的代码
import smtplib

mailserver = smtplib.SMTP('smtp.office365.com',587)
mailserver.ehlo()
mailserver.starttls(certfile='office365.cer')
mailserver.ehlo()
mailserver.login('user@company.co', 'password')
mailserver.sendmail('user@company.co','user@company.co','python email')
mailserver.quit()

4 个答案:

答案 0 :(得分:11)

我找到了一个为我工作的图书馆:

https://github.com/Narcolapser/python-o365

https://pypi.python.org/pypi/O365

使用PIP安装它,然后:

from O365 import Message
o365_auth = ('YourAccount@office365.com','YourPassword')
m = Message(auth=o365_auth)
m.setRecipients('reciving@office365.com')
m.setSubject('I made an email script.')
m.setBody('Talk to the computer, cause the human does not want to hear it any more.')
m.sendMessage()

答案 1 :(得分:10)

嗯,你快到了。以下代码将起到作用:

import smtplib

mailserver = smtplib.SMTP('smtp.office365.com',587)
mailserver.ehlo()
mailserver.starttls()
mailserver.login('user@company.co', 'password')
mailserver.sendmail('user@company.co','user@company.co','python email')
mailserver.quit()

使用以下链接获取更多信息:

http://www.aventistech.com/2016/03/07/python-send-email-via-office-365-tls/

https://docs.python.org/3/library/smtplib.html

https://gist.github.com/jasonjoh/3ec367594c3fa662ee983a617bdc7deb

答案 2 :(得分:2)

最有可能,问题不在您的代码中,而是在Exchange Online配置中。

我敢打赌535 5.7.3 Authentication unsuccessful被抛出,因为在您的Exchange Online组织中已禁用经过身份验证的SMTP(SMTP AUTH协议)。

Here,您可以找到我的答案,解释了如何为发送电子邮件的用户启用SMTP AUTH。您必须是Office 365组织管理员才能执行此操作,也可以向管理员寻求帮助。

之后,mailserver.starttls()应该可以工作了。请注意,您无需在该呼叫中指定证书。

答案 3 :(得分:1)

代码略有更改。上面的代码不起作用。请使用以下代码。 Reference

from O365 import Account

credentials = ('client_id', 'client_secret')

account = Account(credentials)
m = account.new_message()
m.to.add('to_example@example.com')
m.subject = 'Testing!'
m.body = "George Best quote: I've stopped drinking, but only while I'm asleep."
m.send()