簡單郵件傳輸協議(SMTP)是一種協議,用于在郵件服務器之間發送電子郵件和路由電子郵件。Python提供smtplib模塊,該模塊定義了一個SMTP客戶端會話對象,可用于使用SMTP或ESMTP偵聽器守護程序向任何互聯網機器發送郵件。
SMTP通訊的基本流程可以概括為以下幾點:
1.連接SMTP服務器
2.登陸用戶名和密碼
3.發送指定郵件內容
4.退出SMTP連接
一、發送純文本格式郵件
#coding:utf-8import sysreload(sys)sys.setdefaultencoding('utf8')import smtplibfrom smtplib import SMTPfrom email.mime.text import MIMETextfrom email.header import Header#構造純文本郵件內容msg = MIMEText('hello,send by Python.....','plain','utf-8')#發送者郵箱sender = 'xxxxx@XXXXX.com.cn'#發送者的登陸用戶名和密碼user = 'xxxxx@XXXX.com.cn'password = 'xxxxxx'#發送者郵箱的SMTP服務器地址smtpserver = 'xxxx'#接收者的郵箱地址receiver = ['xxxxxx@qq.com','xxxxxx@outlook.com'] #receiver 可以是一個listsmtp = smtplib.SMTP() #實例化SMTP對象smtp.connect(smtpserver,25) #(缺省)默認端口是25 也可以根據服務器進行設定smtp.login(user,password) #登陸smtp服務器smtp.sendmail(sender,receiver,msg.as_string()) #發送郵件 ,這里有三個參數'''login()方法用來登錄SMTP服務器,sendmail()方法就是發郵件,由于可以一次發給多個人,所以傳入一個list,郵件正文是一個str,as_string()把MIMEText對象變成str。'''smtp.quit()運行之后就會收到郵件:

但是仔細觀察會發現:
1.郵件沒有主題
2.看不到收件人的信息
這是因為郵件主題、如何顯示發件人、收件人等信息并不是通過SMTP協議發給MTA,而是包含在發給MTA的文本中的,所以,我們必須把From、To和Subject添加到MIMEText中,才是一封完整的郵件:
msg = MIMEText('hello,send by Python.....','plain','utf-8')msg['From'] = Header('Python測試','utf-8')msg['To'] = Header('管理員','utf-8')subject = 'python SMTP 測試郵件'msg['Subject'] = Header(subject,'utf-8') 二、發送HTML格式的郵件
如果我們要發送HTML郵件,而不是普通的純文本文件怎么辦?方法很簡單,在構造MIMEText對象時,把HTML字符串傳進去,再把第二個參數由plain變為html就可以了:
msg = MIMEText('<html><h1>你好!<h1><html>','html','utf-8') #發送HTML格式郵件就只需要把對應的第二個參數改為html即可 三、發送帶附件的郵件
發送帶附件的郵件,首先要創建MIMEMultipart()實例,然后構造附件,如果有多個附件,可依次構造,最后利用smtplib.smtp發送。
#coding:utf-8import sysreload(sys)sys.setdefaultencoding('utf8')import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.header import Header#發送郵件服務器smtpserver = 'xxxxx'#發送郵箱用戶名和密碼user = 'xxxxxx'password = 'xxxxxx'#發送郵箱sender = 'xxxxx'#接受郵箱receiver = 'xxxxxxx'#創建一個帶附件的實例message = MIMEMultipart()message['From'] = Header('Python 測試','utf-8')message['To'] = Header('測試','utf-8')subject = 'Python SMTP郵件測試'message['Subject'] = Header(subject,'utf-8')#郵件正文內容message.attach(MIMEText('這是測試Python發送附件功能....','plain','utf-8'))#構造附件1,傳送當前目錄下的test.txt文件att1 = MIMEText(open('123.txt','rb').read(),'base64','utf-8')att1['Content-Type'] = 'application/octet-stream'#這里的filename可以任意寫,寫什么名字 郵件中就顯示什么名字att1['Content-Disposition'] = 'attachment;filename:"123.txt"'message.attach(att1)smtp = smtplib.SMTP()smtp.connect(smtpserver,25)smtp.login(user,password)smtp.sendmail(sender,receiver,message.as_string())smtp.quit()
新聞熱點
疑難解答