解讀Python發送郵件Python發送郵件需要smtplib和email兩個模塊。也正是由於我們在實際工作中可以導入這些模塊,才使得處理工作中的任務變得更加的簡單。今天,就來好好學習一下使用Python發送郵件吧。SMTP是發送郵件的協議,Python內置對SMTP的支持,可以發送純文本郵件、HT...
解讀Python發送郵件
Python發送郵件需要smtplib和email兩個模塊。也正是由於我們在實際工作中可以導入這些模塊,才使得處理工作中的任務變得更加的簡單。今天,就來好好學習一下使用Python發送郵件吧。
SMTP是發送郵件的協議,Python內置對SMTP的支持,可以發送純文本郵件、HTML郵件以及帶附件的郵件。
Python對SMTP支持有smtplib和email兩個模塊,email負責構造郵件,smtplib負責發送郵件。
1.郵件正文是文本的格式
1 # -*- coding: UTF-8 -*- 2 3 from email.mime.multipart import MIMEMultipart 4 from email.mime.text import MIMEText 5 import smtplib 6 import sys 7 import csv 8 import xlrd 9 from pyExcelerator import * 10 import os 11 import xlwt 12 from xlutils.copy import copy 13 import pyExcelerator 14 import datetime 15 import time 16 17 reload(sys) 18 sys.setdefaultencoding("utf-8") 19 20 mailto_list = [""] # 郵件接收方的郵件地址 21 mail_host = "smtp.exmail.qq.com" # 郵件傳送協議伺服器 22 mail_user = "" # 郵件發送方的郵箱賬號 23 mail_pass = "" # 郵件發送方的郵箱密碼 24 25 def send_mail(to_list, sub, content): 26 me = "天才白痴夢"+"<"+mail_user+">" 27 msg = MIMEText(content, _subtype='plain', _charset='utf-8') 28 msg['Subject'] = sub # 郵件主題 29 msg['From'] = me 30 msg['To'] = ";".join(to_list) 31 try: 32 server = smtplib.SMTP() 33 server.connect(mail_host) 34 server.login(mail_user, mail_pass) 35 server.sendmail(me, to_list, msg.as_string()) 36 server.close() 37 return True 38 except Exception, e: 39 print str(e) 40 return False 41 42 if __name__ == '__main__': 43 sub = "天才白痴夢" 44 content = '...' 45 if send_mail(mailto_list, sub, content): 46 print "發送成功" 47 else: 48 print "發送失敗"
2.郵件正文是表格的格式:由於是表格,所以我們選擇HTML來實現表格的功能,郵件上面顯示的就是HTML實現的內容了。
1 # -*- coding: UTF-8 -*- 2 3 from email.mime.multipart import MIMEMultipart 4 from email.mime.text import MIMEText 5 import smtplib 6 import sys 7 import csv 8 import xlrd 9 from pyExcelerator import * 10 import os 11 import xlwt 12 from xlutils.copy import copy 13 import pyExcelerator 14 import datetime 15 import time 16 17 reload(sys) 18 sys.setdefaultencoding("utf-8") 19 20 mailto_list = [""] # 郵件接收方的郵件地址 21 mail_host = "smtp.exmail.qq.com" # 郵件傳送協議伺服器 22 mail_user = "" # 郵件發送方的郵箱賬號 23 mail_pass = "" # 郵件發送方的郵箱密碼 24 25 def send_mail(to_list, sub, content): 26 me = "天才白痴夢"+"<"+mail_user+">" 27 # 和上面的代碼不同的就是,這裡我們選擇的是html 的格式 28 msg = MIMEText(content, _subtype='html', _charset='utf-8') 29 msg['Subject'] = sub # 郵件主題 30 msg['From'] = me 31 msg['To'] = ";".join(to_list) 32 try: 33 server = smtplib.SMTP() 34 server.connect(mail_host) 35 server.login(mail_user, mail_pass) 36 server.sendmail(me, to_list, msg.as_string()) 37 server.close() 38 return True 39 except Exception, e: 40 print str(e) 41 return False 42 43 if __name__ == '__main__': 44 sub = "天才白痴夢" 45 html = '<html></html>' 46 if send_mail(mailto_list, sub, html): 47 print "發送成功" 48 else: 49 print "發送失敗"
3.郵件正文是圖片的格式:要把圖片嵌入到郵件正文中,我們只需按照發送附件的方式,先把郵件作為附件添加進去,然後,在HTML中通過引用src="cid:0"就可以把附件作為圖片嵌入了。如果有多個圖片,給它們依次編號,然後引用不同的cid:x即可。
1 def send_mail(to_list, sub, content): 2 me = "天才白痴夢"+"<"+mail_user+">" 3 4 msg = MIMEMultipart() 5 msg['Subject'] = sub # 郵件主題 6 msg['From'] = me 7 msg['To'] = ";".join(to_list) 8 9 txt = MIMEText("天才白痴夢", _subtype='plain', _charset='utf8') 10 msg.attach(txt) 11 12 # <b>:黑體 <i>:斜體 13 msgText = MIMEText('<b>Some <i>HTML</i> text</b> and an image.<img alt="" src="cid:image1" />good!', 'html', 'utf-8') 14 msg.attach(msgText) 15 16 file1 = "F:\\1.jpg" 17 image = MIMEImage(open(file1, 'rb').read()) 18 image.add_header('Content-ID', '<image1>') 19 msg.attach(image) 20 21 try: 22 server = smtplib.SMTP() 23 server.connect(mail_host) 24 server.login(mail_user, mail_pass) 25 server.sendmail(me, to_list, msg.as_string()) 26 server.close() 27 return True 28 except Exception, e: 29 print str(e) 30 return False 31 32 if __name__ == '__main__': 33 sub = "天才白痴夢" 34 html = '<html></html>' 35 if send_mail(mailto_list, sub, html): 36 print "發送成功" 37 else: 38 print "發送失敗"
4.發送郵件附件:郵件附件是圖片
1 def send_mail(to_list, sub, content): 2 me = "天才白痴夢"+"<"+mail_user+">" 3 4 msg = MIMEMultipart() 5 msg['Subject'] = sub # 郵件主題 6 msg['From'] = me 7 msg['To'] = ";".join(to_list) 8 9 txt = MIMEText("天才白痴夢", _subtype='plain', _charset='utf8') 10 msg.attach(txt) 11 12 # # <b>:黑體 <i>:斜體 13 # msgText = MIMEText('<b>Some <i>HTML</i> text</b> and an image.<img alt="" src="cid:image1" />good!', 'html', 'utf-8') 14 # msg.attach(msgText) 15 # 16 # file1 = "F:\\1.jpg" 17 # image = MIMEImage(open(file1, 'rb').read()) 18 # image.add_header('Content-ID', '<image1>') 19 # msg.attach(image) 20 21 att = MIMEText(open('F:\\1.jpg', 'rb').read(), 'base64', 'utf-8') 22 att["Content-Type"] = 'application/octet-stream' 23 att["Content-Disposition"] = 'attachment; filename="1.jpg"' 24 msg.attach(att) 25 26 try: 27 server = smtplib.SMTP() 28 server.connect(mail_host) 29 server.login(mail_user, mail_pass) 30 server.sendmail(me, to_list, msg.as_string()) 31 server.close() 32 return True 33 except Exception, e: 34 print str(e) 35 return False
5.發送群郵件:同時發送給多人
1 mailto_list = [""] # 郵件接收方的郵件地址
上面這一行代碼是郵件接收方的郵件地址,如果我們需要給多人發送郵件的話,就只需要把對方的郵件帳號綁在這一個列表裡就ok了。
加密SMTP
使用標準的25埠連接SMTP伺服器時,使用的是明文傳輸,發送郵件的整個過程可能會被竊聽。要更安全地發送郵件,可以加密SMTP會話,實際上就是先創建SSL安全連接,然後再使用SMTP協議發送郵件。
方法:只需要在創建SMTP對象後,立刻調用starttls()方法,就創建了安全連接。
1 smtp_server = 'smtp.qq.com' 2 smtp_port = 25 # 預設埠號為25 3 server = smtplib.SMTP(smtp_server, smtp_port) 4 server.starttls() 5 # 剩下的代碼和前面的一模一樣: 6 server.set_debuglevel(1) # 列印出和SMTP伺服器交互的所有信息