1. 程式人生 > >Python SMTP傳送遇到的一些列問題

Python SMTP傳送遇到的一些列問題

練習python時遇到的問題,資料地址:

內容:

SMTP是傳送郵件的協議,Python內建對SMTP的支援,可以傳送純文字郵件、HTML郵件以及帶附件的郵件。

Python對SMTP支援有smtplib和email兩個模組,email負責構造郵件,smtplib負責傳送郵件。

首先,我們來構造一個最簡單的純文字郵件:

from email.mime.text import MIMEText
msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')

注意到構造MIMEText物件時,第一個引數就是郵件正文,第二個引數是MIME的subtype,傳入’plain’表示純文字,最終的MIME就是’text/plain’,最後一定要用utf-8編碼保證多語言相容性。

然後,通過SMTP發出去:

# 輸入Email地址和口令:from_addr = input('From: ')
password = input('Password: ')# 輸入收件人地址:to_addr = input('To: ')# 輸入SMTP伺服器地址:smtp_server = input('SMTP server: ')import smtplib
server = smtplib.SMTP(smtp_server, 25) # SMTP協議預設埠是25server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()

我們用set_debuglevel(1)就可以打印出和SMTP伺服器互動的所有資訊。SMTP協議就是簡單的文字命令和響應。login()方法用來登入SMTP伺服器,sendmail()方法就是發郵件,由於可以一次發給多個人,所以傳入一個list,郵件正文是一個str,as_string()把MIMEText物件變成str。

如果一切順利,就可以在收件人信箱中收到我們剛傳送的Email,:​

​————————分割線,以上都是資料內容————————
使用過程中我遇到了一些問題,或者是之前作者沒有表述清楚
我使用的是163郵箱

1、首先作者沒有提醒我,要確保自己的郵箱地址開啟了smtp服務,並設定客戶端授權登陸密碼
這裡寫圖片描述

2、傳送郵件時,password應該填寫郵箱的授權登陸碼,而不是自己的郵箱密碼。

3、按照以上程式碼執行,會報​錯

​Traceback (most recent call last):

  File "mailDemo.py", line 24, in

    server.sendmail(from_addr,[to_addr],msg.as_string())

  File "C:\Program Files\Python35-32\lib\smtplib.py", line 878, in sendmail

    raise SMTPDataError(code, resp)

應該在程式碼中加上:

#傳送郵箱地址
msg['From'] = from_addr
#收件箱地址
msg['To'] = to_addr
#主題
msg['Subject'] = 'the frist mail'

4、在公司環境執行沒問題的程式碼,在自己家的網路下又遇到了一系列問題,執行時報。

Traceback (most recent call last):
  File "/Users/xuexiaopeng/Documents/sendmailDemo.py", line 13, in <module>
    server = smtplib.SMTP(smtp_server,25)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/smtplib.py", line 253, in __init__
    raise SMTPConnectError(code, msg)
smtplib.SMTPConnectError: (554, b'IP<114.111.167.154> in blacklist')

我也不知道這個114.111.167.154是那裡的IP,我將自己電腦的翻牆代理關閉,重啟了路由器解決了。

5、傳送郵件時報錯:

Traceback (most recent call last):
  File "/Users/xuexiaopeng/Documents/sendmailDemo.py", line 21, in <module>
    server.sendmail(from_addr, [to_addr], msg.as_string())
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/smtplib.py", line 878, in sendmail
    raise SMTPDataError(code, resp)
smtplib.SMTPDataError: (554, b'DT:SPM 163 smtp10,DsCowAA3h9_QbgZXI9_fCQ--.713S2 1460039376,please see http://mail.163.com/help/help_spam_16.htm?ip=117.114.147.187&hostid=smtp10&time=1460039376')

完整程式碼如下:

from email.mime.text import MIMEText
msg = MIMEText('hello,send by python...','plain','utf-8')

#傳送郵箱地址
from_addr = '[email protected]'

#郵箱授權碼,非登陸密碼
password = '123'

#收件箱地址
to_addr = '[email protected]'

#smtp伺服器
smtp_server = 'smtp.163.com'
#傳送郵箱地址
msg['From'] = from_addr
#收件箱地址
msg['To'] = to_addr
#主題
msg['Subject'] = 'the frist mail'
import smtplib

server = smtplib.SMTP(smtp_server,25)

server.set_debuglevel(1)

print(from_addr)
print(password)
server.login(from_addr,password)

server.sendmail(from_addr,[to_addr],msg.as_string())

server.quit()