使用 office 365 SMTP 发送企业邮件
背景
最近公司的企業郵箱從 gmail 遷移到了 office 365。不得不說,微軟 office 套件的功能在市場上還是無人可以取代的。公司自然需要用 office 365 向客戶發送郵件,因此需要重新配置項目的 SMTP 服務器。
一開始直接將 gamil 的 SMTP 服務器地址換成 office 365 的地址即“smtp.office365.com”,但是一直收到下面的錯誤提示,很容易想到是用戶名和密碼錯誤,在確認用戶名和密碼沒有問題之后錯誤仍然一直存在,在查閱資料(baidu,google,bing)之后,也一直沒找到合適的解決方案(基本都是在貼各種常規代碼),最終在和客服進行幾次交流之后找到了問題的所在。
Traceback (most recent call last):File "/Users/crown/Projects/hub/docs/email-try.py", line 49, in sendsmtp_obj.login('lilu.cao@orbitfin.ai',"xxx")File "/opt/miniconda3/envs/webtest/Lib/python3.7/smtplib.py", line 730, in Loginraise last_exceptionFile "/opt/miniconda3/envs/webtest/lib/python3.7/smtplib.py", line 721, in logininitial_response_ok=initial_response_ok)File "/opt/miniconda3/envs/webtest/lib/python3.7/smtplib.py", line 642, in authraise SMTPAuthenticationError(code, resp) smtplib.SMTPAuthenticationError: (535, b'5.7.139 Authentication unsuccessful, the request did not meet the criteria to be authenticated successfully.接下來通過配置下面三個步驟完成郵箱的 SMTP 郵件發送。
三步配置
正確的發送代碼(python)
這一步是最簡單的,網上有很多優秀的封裝的 email 發送類,我這里貼出一個之前用過的:
import emails from emails.template import JinjaTemplate as TUSERNAME = 'xxx' PASSWORD = 'xxx' smtp_conf = {'host': 'smtp.office365.com','user': USERNAME,'password': PASSWORD,'port': 587,'tls': True}def send_email():message = emails.html(subject=T('測試郵件'),html=T('<p>詳情見附件<br><br>'),mail_from=('auto-reporter', USERNAME))message.attach(data=open('readme.md', 'r'), filename="readme.txt")r = message.send(to=('Orangleliu', USERNAME), smtp=smtp_conf)print(r)def office365():import smtplibmailserver = smtplib.SMTP('smtp.office365.com', 587)mailserver.ehlo()mailserver.starttls()mailserver.login(USERNAME, PASSWORD)mailserver.sendmail(USERNAME, USERNAME, 'python email')mailserver.quit()if __name__ == "__main__":send_email()———————————————— 版權聲明:本文為CSDN博主「orangleliu」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/orangleliu/article/details/84065548需要注意的是,在使用 office 365 的 smtp 服務的時候,加密要用 tls 而不是 ssl,也就是:
mailserver.starttls()在組織中啟用 SMTP AUTH
office 365 默認是對每一個用戶都不啟用 SMTP AUTH 的,因此我們需要對要使用 SMTP 進行發送郵件的用戶開啟 SMTP AUTH。一共有兩種開啟方式,一種是管理員登錄 admin 控制中心(https://admin.microsoft.com/)針對相應的用戶進行開啟。具體步驟如下:
1)登入 office 365 管理中心
通過 https://admin.microsoft.com/ 登入管理中心,然后根據下圖依次點擊找到對應用戶的 “Manage email apps”。
2)勾選 Authenticated SMTP
然后點擊 Manage email apps,在打開的側邊欄中將最后一項 “Authenticated SMTP” 勾選上。
第二種方式是通過 powershell 進行操作,這種方式在這里不做具體闡述,具體可以參考下面的官網鏈接。
[中文版本] https://docs.microsoft.com/zh-cn/exchange/clients-and-mobile-in-exchange-online/authenticated-client-smtp-submission
[英文版本] https://docs.microsoft.com/en-us/exchange/clients-and-mobile-in-exchange-online/authenticated-client-smtp-submission
關閉安全性默認值
這一步至關重要,即便是我們開啟了 SMTP AUTH,如果沒有關閉安全默認值,那么郵件也無法使用。這一點其實已經在上面的“啟用或禁用通過身份驗證的客戶端 SMTP (SMTP AUTH) Exchange Online”文章中指出,只是我們很難注意到這個點。
關于什么是“安全默認值”,可以參考下面點文章。
https://docs.microsoft.com/en-us/azure/active-directory/fundamentals/concept-fundamentals-security-defaults
下面是關閉“安全默認值”的步驟
1) 進入 Azure active directory
我們進入 admin 管理中心后,根據下圖,進入 Azure active directory。
2) 關閉安全默認值
在 Azure active directory 界面,通過下圖的指示,關閉安全默認值。
總結
完成上述三個步驟,我們就可以成功的通過 python 使用 office 365 的 SMTP 進行郵件發送。尤其是最有一步,對于默認安全值的問題,如果沒有咨詢微軟的客服,很難排查出發送失敗的原因。
參考文檔
[1] Python 使用office365郵箱自動發送郵件 https://blog.csdn.net/orangleliu/article/details/84065548?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2aggregatepagefirst_rank_ecpm_v1~rank_v31_ecpm-1-84065548.pc_agg_new_rank&utm_term=Python+%E4%BD%BF%E7%94%A8office365%E9%82%AE%E7%AE%B1%E8%87%AA%E5%8A%A8%E5%8F%91%E9%80%81%E9%82%AE%E4%BB%B6&spm=1000.2123.3001.4430
[2] python3使用smtplib發送郵件,帶xlsx附件 https://www.cnblogs.com/xiao987334176/p/11975248.html
[3] 啟用或禁用通過身份驗證的客戶端 SMTP (SMTP AUTH) Exchange Online https://docs.microsoft.com/zh-cn/exchange/clients-and-mobile-in-exchange-online/authenticated-client-smtp-submission
[4] Enable or disable authenticated client SMTP submission (SMTP AUTH) in Exchange Online https://docs.microsoft.com/en-us/exchange/clients-and-mobile-in-exchange-online/authenticated-client-smtp-submission
[5] Security defaults in Azure AD https://docs.microsoft.com/en-us/azure/active-directory/fundamentals/concept-fundamentals-security-defaults
總結
以上是生活随笔為你收集整理的使用 office 365 SMTP 发送企业邮件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【思考】再谈面向过程与面向对象
- 下一篇: 常见的PCA、tSNE、UMAP降维及聚