一.開啟郵箱SMTP服務
發送郵件需要使用SMTP服務器,常用的免費服務器有:163、126、qq等郵箱。
QQ郵箱配置方式如下:
1) 登錄qq郵箱,選擇【設置】-【賬戶】
2) 在POP3/IMAP/SMAP/Exchage/CardDAV/CalDAV服務中,找到POP3/SMTP服務和IMAP/SMTP服務,點擊開啟。
2) 在新頁面點擊“客戶端授權密碼”,勾選“開啟”,彈出新窗口填寫手機驗證碼。
3) 填寫授權碼
4) 提示開啟成功。
二、使用python發送郵件
- 使用python自帶的模塊:smptlib、email
import smtplib from email.mime.text import MIMEText from email.header import Header
1、發送普通的郵件
# 發送郵件的步驟 import smtplib from email.mime.text import MIMEText # 用來構造文本類型的郵件 from email.header import Header # 用來構造郵件的頭部 # 第一步:創建一個SMTP的對象 s = smtplib.SMTP() # 第二步:連接到SMTP的服務器 host = 'smtp.163.com' # 設置163郵箱服務器,端口為:25 port = 25 # host = 'smtp.qq.com' port = 465 # 設置qq郵箱服務器,端口為:465 s.connect(host,port) # 連接服務器 # s.connect(host = 'smtp.163.com',port = 25) # 第三步:登錄SMTP服務器 mail_user = '18814726725@163.com' # 163郵箱的用戶名 mail_pass = 'password' # 注意:此處填寫的是郵箱的SMTP服務器授權碼 s.login(user=mail_user,password=mail_pass) # 第四步:構建郵件內容 content = '使用python測試發送郵件' # 構建郵件內容 msg = MIMEText(content,_charset='utf8') # _charset 指定編碼格式 msg['Subject'] = Header('測試報告','utf8') # 郵件主題 msg['From'] = 'wl18814726725@163.com' # 發件人郵箱,可傳入列表,用於給多個人發送文件 msg['To'] = '1572533878@qq.com' # 收件人 # 第五步:發送郵件 s.sendmail(from_addr=msg['From'],to_addrs=msg['To'],msg=msg.as_string()) #將郵件內容轉換為字符串
2、發送HTML格式郵件及附件
import smtplib from email.mime.text import MIMEText # 文本類型的郵件,用來構造郵件 from email.header import Header # 用來構造郵件的頭部 from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart # 用來構造附件 # 發送郵件的步驟 # 第一步:創建一個SMTP的對象 s = smtplib.SMTP() # 第二步:連接到SMTP的服務器 host = 'smtp.163.com' # 設置163郵箱服務器,端口為:25 port = 25 # host = 'smtp.qq.com' # 設置qq郵箱服務器,端口為:465 s.connect(host,port) # 連接服務器 # 第三步:登錄SMTP服務器 mail_user = 'wl18814726725@163.com' # 163郵箱的用戶名 mail_pass = 'wl987654321' # 注意:此處填寫的是郵箱的SMTP服務器授權碼 s.login(user=mail_user,password=mail_pass) # 構造文本郵件內容 content = '使用python測試發送郵件' # 構建郵件內容 textcontent = MIMEText(content,_charset='utf8') # _charset 指定編碼格式 # 構造附件(二進制字節流形式) part = MIMEApplication(open("report.html",'rb').read(),_subtype=None) # part = MIMEApplication(open("report.html",'rb').read()) 需要查看_subtype=None 是否會引發異常 part.add_header('content-disposition', 'attachment', filename='report18.html') # 對方收到郵件之后,附件在郵件中顯示的名稱 # 封裝一封郵件 msg = MIMEMultipart() # 加入文本內容 msg.attach(textcontent) msg.attach(part) # 發送郵件 msg['From'] = 'wl18814726725@163.com' #發件人郵箱 msg['To'] = '1572533878@qq.com' #收件人 #第五步:發送郵件 s.sendmail(from_addr='wl18814726725@163.com',to_addrs='1572533878@qq.com',msg=msg.as_string()) # 將郵件內容轉換為字符串 定義send_email函數 import smtplib from email.mime.text import MIMEText #文本類型的郵件,用來構造郵件 from email.header import Header #用來構造郵件的頭部 from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart #用來構造附件 def send_email(filepath): """ :param filepath: #傳入報告文件的路徑 :return: """ # 發送郵件的步驟 # 第一步:創建一個SMTP的對象 s = smtplib.SMTP() # 第二步:連接到SMTP的服務器 host = 'smtp.163.com' #設置163郵箱服務器,端口為:25 port = 25 # host = 'smtp.qq.com' #設置qq郵箱服務器,端口為:465 s.connect(host,port) #連接服務器 # 第三步:登錄SMTP服務器 mail_user = 'wl18814726725@163.com' #163郵箱的用戶名 mail_pass = 'wl987654321' #注意:此處填寫的是郵箱的SMTP服務器授權碼 s.login(user=mail_user,password=mail_pass) #構造文本郵件內容 content = '使用python測試發送郵件' #構建郵件內容 textcontent = MIMEText(content,_charset='utf8') #_charset 指定編碼格式 #構造附件(二進制字節流形式) part = MIMEApplication(open(filepath,'rb').read()) part.add_header('content-disposition', 'attachment', filename='report988.html') #對方收到郵件之后,附件在郵件中顯示的名稱 # 封裝一封郵件 msg = MIMEMultipart() #加入附件和文本內容 msg.attach(textcontent) msg.attach(part) #發送郵件 msg['From'] = 'wl18814726725@163.com' #發件人郵箱 msg['To'] = '1572533878@qq.com' #收件人 #第五步:發送郵件 s.sendmail(from_addr=msg['From'],to_addrs=msg['To'],msg=msg.as_string()) #將郵件內容轉換為字符串 send_email('report.html')
定義send_email函數
import smtplib from email.mime.text import MIMEText # 文本類型的郵件,用來構造郵件 from email.header import Header # 用來構造郵件的頭部 from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart # 用來構造附件 # 發送郵件的步驟 # 第一步:創建一個SMTP的對象 s = smtplib.SMTP() # 第二步:連接到SMTP的服務器 host = 'smtp.163.com' # 設置163郵箱服務器,端口為:25 port = 25 # host = 'smtp.qq.com' # 設置qq郵箱服務器,端口為:465 s.connect(host,port) # 連接服務器 # 第三步:登錄SMTP服務器 mail_user = 'wl18814726725@163.com' # 163郵箱的用戶名 mail_pass = 'password' # 注意:此處填寫的是郵箱的SMTP服務器授權碼 s.login(user=mail_user,password=mail_pass) # 構造文本郵件內容 content = '使用python測試發送郵件' # 構建郵件內容 textcontent = MIMEText(content,_charset='utf8') # _charset 指定編碼格式 # 構造附件(二進制字節流形式) part = MIMEApplication(open("report.html",'rb').read(),_subtype=None) # part = MIMEApplication(open("report.html",'rb').read()) 需要查看_subtype=None 是否會引發異常 part.add_header('content-disposition', 'attachment', filename='report18.html') # 對方收到郵件之后,附件在郵件中顯示的名稱 # 封裝一封郵件 msg = MIMEMultipart() # 加入文本內容 msg.attach(textcontent) msg.attach(part) # 發送郵件 msg['From'] = 'wl18814726725@163.com' #發件人郵箱 msg['To'] = '1572533878@qq.com' #收件人 #第五步:發送郵件 s.sendmail(from_addr='wl18814726725@163.com',to_addrs='1572533878@qq.com',msg=msg.as_string()) # 將郵件內容轉換為字符串
使用python發送郵件時常見錯誤:
錯誤1:smtplib.SMTPAuthenticationError: (550, b'User has no permission')
我們使用python發送郵件時相當於自定義客戶端根據用戶名和密碼登錄,然后使用SMTP服務發送郵件,新注冊的163郵箱是默認不開啟客戶端授權的(對指定的郵箱大師客戶端默認開啟),因此登錄總是被拒絕,解決辦法(以163郵箱為例):進入163郵箱-設置-客戶端授權密碼-開啟(授權碼是用於登錄第三方郵件客戶端的專用密碼)。上述有專門的設置方法。
錯誤2:smtplib.SMTPAuthenticationError: (535, b'Error: authentication failed')
以163郵箱為例,在開啟POP3/SMTP服務,並開啟客戶端授權密碼時會設置授權碼,將這個授權碼代替smtplib.SMTP().login(user,password)方法中的password即可。
錯誤3:給多人發送郵件是,可能會出現“AttributeError: 'list' object has no attribute 'encode'”或者寫了多個人,實際只給第一個人發了郵件等錯誤。
# 將所有的收件人郵箱寫入到一個字符串中 msg['To'] = '1668010021@qq.com, 1572533878@qq.com, wangle@kyee.com.cn, 2685083419@qq.com' # 發送郵件時,通過字符串函數split分割,分割后返回的每一個郵箱賬號 s.sendmail(from_addr=msg['From'], to_addrs=msg['To'].split(','), msg=msg.as_string())