因為大家可能都會遇到,所以先貼出來我的解決方法,免得大家浪費時間除錯、測試。
我是使用 google gmail ,所以使用其它 smtp server 的人可能會不一樣,這僅供參考。
老師是使用 TLS 連線加密,程式如下:
to_email = "someone@gmail.com" # 要確定能收
my_email = "myemail@gmail.com" # 你要登入使用的 email account
password = "p@ssw0rd" # 正確的密碼
connection = smtplib.SMTP("smtp.gmail.com") # 連上我的 email smtp server
connection.starttls() # 使用 TLS 加密
connection.login(user=my_email, password=password)
connection.sendmail(from_addr=my_email, to_addrs=to_email, msg="Hello!")
connection.close()
結果連線出現問題,依照老師的步驟檢查:
- 我的 email、password、.smtp server(我用 smtp.gmail.com),都正確。
- gmail account 設定,開啟低安全性應用程式存取、手機登入帳戶[關閉]、兩步驟驗證[關閉]
開啟低安全性應用程式存取步驟如下:
結果還是出現錯誤: 遇到大概有下列幾個錯誤訊息:
不支援 TLS
connection.starttls()
smtplib.SMTPNotSupportedError: STARTTLS extension not supported by server.
這個錯誤是我的 avst 防毒造成的,暫停10分鐘就 pass 了。
connection = smtplib.SMTP_SSL(“smtp.gmail.com”)
ConnectionResetError: [WinError 10054] 遠端主機已強制關閉一個現存的連線。
也可能是 avst 防毒的關係
server.login(my_email, password)
smtplib.SMTPNotSupportedError: SMTP AUTH extension not supported by server.
開了高安全性或 .sendmail() 中的資料錯誤
connection.sendmail(from_addr=my_email, to_addrs=my_email, msg=“Hello!”)
smtplib.SMTPSenderRefused: (550, b’No SMTP server defined. Use real server address instead of 127.0.0.1 in your account.', …)
所以程式改用了 SSL 連線加密,開啟低安全性應用程式存取,關閉防毒,就 OK了。
import smtplib
to_email = "someone@gmail.com" # 正確的 email
my_email = "me@gmail.com" # 正確的 email
password = "P@ssw0rd" # 正確的 password
connection = smtplib.SMTP_SSL("smtp.gmail.com") # 改用 SSL
connection.login(user=my_email, password=password)
connection.sendmail(from_addr=my_email, to_addrs=to_email, msg="Hello!")
connection.close()
所以總結是 : 目前 gmail 不能用 TLS,請改用 SSL
如有錯誤,還請大家指正。