抱歉,如果標題不清楚。
我正在嘗試通過標準庫通過 python 3.10 發送電子郵件。它使用這些默認設定在我的機器上本地作業。
smtp_server = "smtp.office365.com"
port = 587 # For starttls
sender_email = os.environ.get("EMAIL")
password = os.environ.get("EMAIL_PASSWORD")
# Create a secure SSL context
context = ssl.create_default_context()
server = smtplib.SMTP(smtp_server,port)
try:
server.starttls(context=context) # Secure the connection
server.login(sender_email, password)
except Exception as e:
print(e)
但是,當我從公司的服務器手動運行此代碼時,我收到“無法獲取本地頒發者證書”錯誤。
我已經能夠通過將 ssl 背景關系設定為未驗證來解決這個問題:
context = ssl._create_unverified_context() # was ssl.create_default_context()
這在手動運行 python 檔案時有效。但是,這需要作為 cronjob 運行,并且當 crontab 使用此“修復”運行腳本時,我會得到一個不同的錯誤。
Authentication unsuccessful, the user credentials were incorrect.
這很荒謬,因為相同的憑據適用于不同的 ssl 背景關系。
我正在使用 pythons virtualenv 來運行腳本。我不知道公司 ubuntu 服務器的任何網路或證書特定的事情,但顯然有一些事情。我只是不知道具體是什么。
是的,我已經瀏覽了許多類似的問題,盡管它們似乎都不太適合這種情況來幫助我。
提前致謝。
uj5u.com熱心網友回復:
您看到兩個不同的問題。TLS/證書問題,然后是很可能與 TLS 無關的身份驗證問題。
您無需使用未經驗證的 TLS。您可以通過 certifi 包從 mozilla 獲取 cattrust。不確定微軟是否使用瀏覽器信任來簽署他們的證書。
>>> import certifi, ssl
>>> context = ssl.create_default_context()
>>> context.load_verify_locations(certifi.where())
話雖如此,人們犯的一個常見錯誤是假設 cron 作業將加載與登錄相同的 shell 組態檔。我會添加錯誤檢查/除錯登錄以確保根據您的期望設定 EMAIL_PASSWORD 和 EMAIL,因為錯誤訊息很可能來自server.login與 TLS 無關的行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/518412.html
下一篇:如何更改構建專案的二進制路徑?
