python應用系列教程——python使用smtp協議傳送郵件:html文字郵件、圖片郵件、檔案附件郵件
全棧工程師開發手冊 (作者:欒鵬)
python使用smtp協議傳送電子郵件。包含傳送html文字郵件、包含圖片附件的郵件,包含其他檔案附件的郵件。可設定郵件的收發人,主題,內容。並以163郵件為例,分別在python2.7和python3.6下進行試驗。
python2.7程式碼(後面有python3.6程式碼)
#coding:utf-8 print('生成三種不同型別的電子郵件') from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase import email from smtplib import SMTP import smtplib import os.path import mimetypes HOST="smtp.163.com" #使用的郵箱的smtp伺服器地址,這裡是163的smtp地址,經過測試網易和搜狐的郵箱可用 SENDER="
[email protected]" #使用者名稱,這裡更改為自己的 PASSWORD="11111111" #密碼,這個更改為自己的 POSTFIX="163.com" #郵箱的字尾,網易就是163.com RECIPS=[SENDER] #這裡接收人也設定為自己 # 一個包含文字和html的多部分郵件。多部分訊息通常包含純文字和html格式,客戶端自行選擇顯示哪個。(web客戶端顯示html,命令列客戶端顯示純文字) def make_mpa_msg(): myemail = MIMEMultipart('alternative') text = MIMEText('Hello World!\r\n', 'plain',_charset="utf-8") #純文字的郵件訊息正文 myemail.attach(text) #訊息正文繫結到郵件物件 html = MIMEText( #html郵件訊息正文 '<html><body><h4>Hello World!</h4>' '</body></html>', 'html') myemail.attach(html) #訊息正文繫結到郵件物件 return myemail # 建立一個文字和圖片的郵件 def make_img_msg(imgfile): f = open(imgfile, 'rb') #建立檔案指標,這裡要以rb的模式取讀 data = f.read() #讀取圖片成位元組流 f.close() #檔案關閉 ctype, encoding = mimetypes.guess_type(imgfile) #ctype為根據檔案獲取的資料傳輸型別image/jpeg,encoding應該為None if ctype is None or encoding is not None: ctype = 'application/octet-stream' maintype, subtype = ctype.split('/', 1) #maintype為檔案所屬類image,subtype為具體檔案型別jpeg myemail = MIMEImage(data, name=subtype) #生成圖片郵件,name=檔案型別jpeg basename = os.path.basename(imgfile) #basename為檔名,不包含路徑 myemail.add_header('Content-Disposition','attachment; filename="%s"' % basename) #新增郵件頭 return myemail # 建立一個文字和檔案的郵件 def make_file_msg(file_name): # 構造MIMEBase物件做為檔案附件內容並附加到根容器 ctype, encoding = mimetypes.guess_type(file_name) # ctype為根據檔案獲取的資料傳輸型別image/jpeg,encoding應該為None if ctype is None or encoding is not None: ctype = 'application/octet-stream' maintype, subtype = ctype.split('/', 1) # maintype為檔案所屬類image,subtype為具體檔案型別jpeg print(maintype,subtype) ## 讀入檔案內容並格式化 f = open(file_name, 'rb') # 建立檔案指標,這裡要以rb的模式取讀 myemail = MIMEBase(maintype, subtype) myemail.set_payload(f.read()) #設定負載資料 f.close() email.Encoders.encode_base64(myemail) #將郵件編碼 #設定附件頭 basename = os.path.basename(file_name) #basename為檔名,不包含路徑 myemail.add_header('Content-Disposition','attachment; filename="%s"' % basename) #新增郵件頭 return myemail def sendMsg(fr, to, message): sendSvr = smtplib.SMTP() sendSvr.connect(HOST) # 連線伺服器 sendSvr.login(SENDER, PASSWORD) # 登入操作 errs = sendSvr.sendmail(fr, to, message) #引數:發件人,收件人,訊息正文 sendSvr.quit() if __name__ == '__main__': print('傳送多部分訊息') msg = make_mpa_msg() msg['From'] = SENDER msg['To'] = ', '.join(RECIPS) msg['Subject'] = '多部分訊息郵件標題' sendMsg(SENDER, RECIPS, msg.as_string()) print('傳送圖片訊息體') msg = make_img_msg(r'D:/test.jpg') msg['From'] = SENDER msg['To'] = ', '.join(RECIPS) msg['Subject'] = '圖片訊息郵件' sendMsg(SENDER, RECIPS, msg.as_string()) print('傳送檔案訊息體') msg = make_file_msg(r'D:/test.mp4') msg['From'] = SENDER msg['To'] = ', '.join(RECIPS) msg['Subject'] = '檔案訊息郵件' sendMsg(SENDER, RECIPS, msg.as_string())
python3.6下將email.Encoders改成了email.encoders,其他沒有變化。
python3.6下程式碼如下
#coding:utf-8
print('生成三種不同型別的電子郵件')
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
import email
from smtplib import SMTP
import smtplib
import os.path
import mimetypes
HOST="smtp.163.com" #使用的郵箱的smtp伺服器地址,這裡是163的smtp地址,經過測試網易和搜狐的郵箱可用
SENDER=" [email protected]" #使用者名稱
PASSWORD="19910101a" #密碼
POSTFIX="163.com" #郵箱的字尾,網易就是163.com
RECIPS=["[email protected]"] #這裡接收人也設定為自己
# 一個包含文字和html的多部分郵件。多部分訊息通常包含純文字和html格式,客戶端自行選擇顯示哪個。(web客戶端顯示html,命令列客戶端顯示純文字)
def make_mpa_msg():
myemail = MIMEMultipart('alternative')
text = MIMEText('Hello World!\r\n', 'plain',_charset="utf-8") #純文字的郵件訊息正文
myemail.attach(text) #訊息正文繫結到郵件物件
html = MIMEText( #html郵件訊息正文
'<html><body><h4>Hello World!</h4>'
'</body></html>', 'html')
myemail.attach(html) #訊息正文繫結到郵件物件
return myemail
# 建立一個文字和圖片的郵件
def make_img_msg(imgfile):
f = open(imgfile, 'rb') #建立檔案指標,這裡要以rb的模式取讀
data = f.read() #讀取圖片成位元組流
f.close() #檔案關閉
ctype, encoding = mimetypes.guess_type(imgfile) #ctype為根據檔案獲取的資料傳輸型別image/jpeg,encoding應該為None
if ctype is None or encoding is not None:
ctype = 'application/octet-stream'
maintype, subtype = ctype.split('/', 1) #maintype為檔案所屬類image,subtype為具體檔案型別jpeg
myemail = MIMEImage(data, name=subtype) #生成圖片郵件,name=檔案型別jpeg
basename = os.path.basename(imgfile) #basename為檔名,不包含路徑
myemail.add_header('Content-Disposition','attachment; filename="%s"' % basename) #新增郵件頭
return myemail
# 建立一個文字和檔案的郵件
def make_file_msg(file_name):
# 構造MIMEBase物件做為檔案附件內容並附加到根容器
ctype, encoding = mimetypes.guess_type(file_name) # ctype為根據檔案獲取的資料傳輸型別image/jpeg,encoding應該為None
if ctype is None or encoding is not None:
ctype = 'application/octet-stream'
maintype, subtype = ctype.split('/', 1) # maintype為檔案所屬類image,subtype為具體檔案型別jpeg
print(maintype,subtype)
## 讀入檔案內容並格式化
f = open(file_name, 'rb') # 建立檔案指標,這裡要以rb的模式取讀
myemail = MIMEBase(maintype, subtype)
myemail.set_payload(f.read()) #設定負載資料
f.close()
email.encoders.encode_base64(myemail) #將郵件編碼
#設定附件頭
basename = os.path.basename(file_name) #basename為檔名,不包含路徑
myemail.add_header('Content-Disposition','attachment; filename="%s"' % basename) #新增郵件頭
return myemail
def sendMsg(fr, to, message):
sendSvr = smtplib.SMTP()
sendSvr.connect(HOST) # 連線伺服器
sendSvr.login(SENDER, PASSWORD) # 登入操作
errs = sendSvr.sendmail(fr, to, message) #引數:發件人,收件人,訊息正文
sendSvr.quit()
if __name__ == '__main__':
print('傳送多部分訊息')
msg = make_mpa_msg()
msg['From'] = SENDER
msg['To'] = ', '.join(RECIPS)
msg['Subject'] = '多部分訊息郵件標題'
sendMsg(SENDER, RECIPS, msg.as_string())
print('傳送圖片訊息體')
msg = make_img_msg(r'D:/test.jpg')
msg['From'] = SENDER
msg['To'] = ', '.join(RECIPS)
msg['Subject'] = '圖片訊息郵件'
sendMsg(SENDER, RECIPS, msg.as_string())
print('傳送檔案訊息體')
msg = make_file_msg(r'D:/test.mp4')
msg['From'] = SENDER
msg['To'] = ', '.join(RECIPS)
msg['Subject'] = '檔案訊息郵件'
sendMsg(SENDER, RECIPS, msg.as_string())
本文只試驗了163郵件,讀者可以按下面的主機地址,試驗其他郵箱。但並不是每種郵箱都能成功。
下面為常用郵件伺服器地址:
gmail(google.com)
POP3伺服器地址:pop.gmail.com(SSL啟用 埠:995)
SMTP伺服器地址:smtp.gmail.com(SSL啟用 埠:587)
21cn.com:
POP3伺服器地址:pop.21cn.com(埠:110)
SMTP伺服器地址:smtp.21cn.com(埠:25)
sina.com:
POP3伺服器地址:pop3.sina.com.cn(埠:110)
SMTP伺服器地址:smtp.sina.com.cn(埠:25)
tom.com:
POP3伺服器地址:pop.tom.com(埠:110)
SMTP伺服器地址:smtp.tom.com(埠:25)
163.com:
POP3伺服器地址:pop.163.com(埠:110)
SMTP伺服器地址:smtp.163.com(埠:25)
263.net:
POP3伺服器地址:pop3.263.net(埠:110)
SMTP伺服器地址:smtp.263.net(埠:25)
yahoo.com:
POP3伺服器地址:pop.mail.yahoo.com
SMTP伺服器地址:smtp.mail.yahoo.com
263.net.cn:
POP3伺服器地址:pop.263.net.cn(埠:110)
SMTP伺服器地址:smtp.263.net.cn(埠:25)
Foxmail:
POP3伺服器地址:POP.foxmail.com(埠:110)
SMTP伺服器地址:SMTP.foxmail.com(埠:25)
sinaVIP
POP3伺服器:pop3.vip.sina.com (埠:110)
SMTP伺服器:smtp.vip.sina.com (埠:25)
sohu.com:
POP3伺服器地址:pop3.sohu.com(埠:110)
SMTP伺服器地址:smtp.sohu.com(埠:25)
etang.com:
POP3伺服器地址:pop.etang.com
SMTP伺服器地址:smtp.etang.com
x263.net:
POP3伺服器地址:pop.x263.net(埠:110)
SMTP伺服器地址:smtp.x263.net(埠:25)
yahoo.com.cn:
POP3伺服器地址:pop.mail.yahoo.com.cn(埠:995)
SMTP伺服器地址:smtp.mail.yahoo.com.cn(埠:587)
雅虎郵箱POP3的SSL不啟用埠為110,POP3的SSL啟用埠995;SMTP的SSL不啟用埠為25,SMTP的SSL啟用埠為465
QQ郵箱 QQ企業郵箱
POP3伺服器地址:pop.qq.com(埠:110) POP3伺服器地址:pop.exmail.qq.com (SSL啟用 埠:995)
SMTP伺服器地址:smtp.qq.com (埠:25) SMTP伺服器地址:smtp.exmail.qq.com(SSL啟用 埠:587/465)
SMTP伺服器需要身份驗證
126郵箱 HotMail
POP3伺服器地址:pop.126.com(埠:110) POP3伺服器地址:pop.live.com (埠:995)
SMTP伺服器地址:smtp.126.com(埠:25) SMTP伺服器地址:smtp.live.com (埠:587)
china.com: 139郵箱
POP3伺服器地址:pop.china.com(埠:110) POP3伺服器地址:POP.139.com(埠:110)
SMTP伺服器地址:smtp.china.com(埠:25) SMTP伺服器地址:SMTP.139.com(埠:25)
相關推薦
python應用系列教程——python使用smtp協議傳送郵件:html文字郵件、圖片郵件、檔案附件郵件
全棧工程師開發手冊 (作者:欒鵬) python使用smtp協議傳送電子郵件。包含傳送html文字郵件、包含圖片附件的郵件,包含其他檔案附件的郵件。可設定郵件的收發人,主題,內容。並以163郵件為例,分別在python2.7和python3.6下進行試驗。
python應用系列教程——python使用scapy監聽網路資料包、按TCP/IP協議進行解析
全棧工程師開發手冊 (作者:欒鵬) python使用scapy監聽抓取網路資料包。 scapy具有模擬傳送資料包、監聽解析資料包、網際網路協議解析、資料探勘等多種用處。這裡我們只來說一下scapy監聽資料包,並按照不同的協議進行解析。
python應用系列教程——python操作office辦公軟體word和excel!
python操作office辦公軟體(excel)。 前提條件是電腦已經安裝了office辦公軟體,並且下載安裝了pywin32-217.win32-py2.7庫。 python2.7下程式碼 #coding:utf-8 #python控制excel軟體,本機電腦
python應用系列教程——python操作office辦公軟體word
全棧工程師開發手冊 (作者:欒鵬) python操作office辦公軟體(doc)。 然後就可以使用python程式設計操作word軟體了。word軟體的啟動有時較慢,所
python應用系列教程——python操作office辦公軟體(excel)
全棧工程師開發手冊 (作者:欒鵬) 然後就可以使用python程式設計操作excel軟體了,excel軟體的啟動可能會比較慢,所以有可能要等待幾秒才能啟動成功。 python2.7下程式碼 #coding:utf-8 #py
Python入門系列教程(二)
字符 小寫 無符號 bsp div width raw_input abc body 字符串 1.字符串輸出 name = ‘xiaoming‘ print("姓名:%s"%name) 2.字符串輸入 userName = raw_input(‘請輸
Python入門系列教程(五)函數
st3 python入門 test print 缺省 .com 教程 技術 log 全局變量 修改全局變量 a=100 def test(): global a a=200 print a 多個返回值 缺省參數 d
python Matplotlib 系列教程(九)——如何繪製動態圖(類似實時股票圖=走勢圖)
本章我們討論的是如何繪製實時圖表,用到的知識是Matplotlib的動畫功能。 # -*- coding: utf-8 -*- import matplotlib.pyplot as plt im
python Matplotlib 系列教程(七)——從檔案載入資料並繪製
本章節我們將要學習如何讀取一個檔案的內容,並根據檔案的內容進行繪製。比如從csv檔案讀取資料,從txt檔案讀取資料等。 # -*- coding: utf-8 -*- import matplot
python測試系列教程 —— 單元測試unittest
全棧工程師開發手冊 (作者:欒鵬) unittest是xUnit系列框架中的一員,如果你瞭解xUnit的其他成員,那你用unittest來應該是很輕鬆的,它們的工作方式都差不多。 unittest核心工作原理 unittest是Py
python測試系列教程——python+Selenium自動化測試框架
全棧工程師開發手冊 (作者:欒鵬) 需要的環境 瀏覽器(Firefox/Chrome/IE…) Python Selenium Selenium IDE(如果用Firefox) FireBug、FirePath(如果用Firefox) chromedri
python基礎系列教程——python面向物件程式設計全解
全棧工程師開發手冊 (作者:欒鵬) python面向物件程式設計全解。 面向物件技術簡介 一個類佔有一個獨立的空間,類中的屬性叫做類變數,類中的函式,叫做類的方法。 類(Class):也可以成為類物件。類物件中包含了一批例項物件共
python Matplotlib 系列教程(四)——散點圖
這一章節,我們將介紹散點圖的繪製: 散點圖經常用來顯示分佈或者比較幾個變數的相關性或者分組。 要繪製單個點我們需要使用scatter()函式,先看一個最簡單的示例: # -*- coding: utf-8 -*- import matplotlib.p
python基礎系列教程
.html itl 網絡 目錄 http alt png 基礎 tle 第一章 數學基礎系列教程 第二章 python基礎系列教程 第三章 數據挖掘系列教程 第四章 神經網絡系列教程 第五章 深度學習系列教程 ..... python基礎系列教程主目錄
Python算法教程第三章知識點:求和式、遞歸式、侏儒排序法和並歸排序法
code pen nom eve end sort urn 使用 微信公眾號 本文目錄:一、求和式;二、遞歸式;三、侏儒排序法和並歸排序法微信公眾號:geekkr</br></br></br> 一、求和式 # 假設有一函數為f(),則在P
Spring Cloud系列教程 | 第十四篇:Spring Cloud與Kubernetes的整合
推薦 Spring Cloud 視訊: Spring Cloud與Kubernetes的整合 Spring Cloud提供了專門的spring-cloud-kubernetes專案與k8s整合,儘管k8s提供了服務註冊和發現等功能與Spring cl
Spring Boot 基礎系列教程 | 第十二篇:使用Spring-data-jpa簡化資料訪問層(推薦)
推薦 Spring Boot/Cloud 視訊: Spring Boot中使用Spring-data-jpa讓資料訪問更簡單、更優雅 在上一篇Spring中使用JdbcTemplate訪問資料庫 中介紹了一種基本的資料訪問方式,結合構建RESTful API和
Spring Boot 基礎系列教程 | 第十六篇:整合MyBatis
推薦 Spring Boot/Cloud 視訊: 最近專案原因可能會繼續開始使用MyBatis,已經習慣於spring-data的風格,再回頭看xml的對映配置總覺得不是特別舒服,介面定義與對映離散在不同檔案中,使得閱讀起來並不是特別方便。 Spring中整合
Spring Boot 基礎系列教程 | 第十八篇:使用Flyway來管理資料庫版本
推薦 Spring Boot/Cloud 視訊: 如果沒有讀過上面內容的讀者,有興趣的可以一閱。在前面的使用JdbcTemplate一文中,主要通過spring提供的JdbcTemplate實現對使用者表的增刪改查操作。在實現這個例子的時候,我們事先在MySQ
【Web API系列教程】3.2 — 實戰:處理資料(新增模型和控制器)
前言 在本部分中,你將新增用於定義資料庫實體的模型類。然後你將新增用於在這些實體上執行CRUD(Create、Retrieve、Update、Delete——譯者注)操作的Web API 控制器。 新增模型類 在本教程中,我們將通過使用“Code Fi