1. 程式人生 > >python應用系列教程——python使用smtp協議傳送郵件:html文字郵件、圖片郵件、檔案附件郵件

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