Python SMTP 傳送帶附件電子郵件
可採用email模組傳送電子郵件附件。傳送一個未知MIME型別的檔案附件其基本思路如下:
1. 構造MIMEMultipart物件做為根容器
2. 構造MIMEText物件做為郵件顯示內容並附加到根容器
3. 構造MIMEBase物件做為檔案附件內容並附加到根容器
a. 讀入檔案內容並格式化
b. 設定附件頭
4. 設定根容器屬性
5. 得到格式化後的完整文字
6. 用smtp傳送郵件
具體內容參見<programing python(3rd)> 14章第6節 “email: Parsing and Composing Mails”。傳送一個未知MIME型別的檔案附件例項程式碼如下:
import smtplib import email.MIMEMultipart import email.MIMEText import email.MIMEBase import os.path From = "sender address" To = "recipients" file_name = "file name" server = smtplib.SMTP("smtp server address") server.login("username","password") #僅smtp伺服器需要驗證時 # 構造MIMEMultipart物件做為根容器 main_msg = email.MIMEMultipart.MIMEMultipart() # 構造MIMEText物件做為郵件顯示內容並附加到根容器 text_msg = email.MIMEText.MIMEText("this is a test text to text mime") main_msg.attach(text_msg) # 構造MIMEBase物件做為檔案附件內容並附加到根容器 contype = 'application/octet-stream' maintype, subtype = contype.split('/', 1) ## 讀入檔案內容並格式化 data = open(file_name, 'rb') file_msg = email.MIMEBase.MIMEBase(maintype, subtype) file_msg.set_payload(data.read( )) data.close( ) email.Encoders.encode_base64(file_msg) ## 設定附件頭 basename = os.path.basename(file_name) file_msg.add_header('Content-Disposition', 'attachment', filename = basename) main_msg.attach(file_msg) # 設定根容器屬性 main_msg['From'] = From main_msg['To'] = To main_msg['Subject'] = "attach test " main_msg['Date'] = email.Utils.formatdate( ) # 得到格式化後的完整文字 fullText = main_msg.as_string( ) # 用smtp傳送郵件 try: server.sendmail(From, To, fullText) finally: server.quit()
網上關於python的例子所涉及的知識比較煩雜,本著學習Python的心態,掌握髮送郵件為知識點,並對程式碼進行比較分析,對傳送郵件相關知識點逐步瞭解。以下是三段傳送郵件程式碼,均測試成功。
程式碼一
# -*- coding: utf-8 -*- import smtplib import email.MIMEMultipart# import MIMEMultipart import email.MIMEText# import MIMEText import email.MIMEBase# import MIMEBase import os.path import mimetypes From = "傳送郵箱" To = "接收箱箱" file_name = "c:/1.png"#附件名 server = smtplib.SMTP("smtp.163.com") server.login("username","password") #僅smtp伺服器需要驗證時 # 構造MIMEMultipart物件做為根容器 main_msg = email.MIMEMultipart.MIMEMultipart() # 構造MIMEText物件做為郵件顯示內容並附加到根容器 text_msg = email.MIMEText.MIMEText("我this is a test text to text mime",_charset="utf-8") main_msg.attach(text_msg) # 構造MIMEBase物件做為檔案附件內容並附加到根容器 ## 讀入檔案內容並格式化 [方式1]------------------------------ data = open(file_name, 'rb') ctype,encoding = mimetypes.guess_type(file_name) if ctype is None or encoding is not None: ctype = 'application/octet-stream' maintype,subtype = ctype.split('/',1) file_msg = email.MIMEBase.MIMEBase(maintype, subtype) file_msg.set_payload(data.read()) data.close( ) email.Encoders.encode_base64(file_msg)#把附件編碼 ''' 測試識別檔案型別:mimetypes.guess_type(file_name) rar 檔案 ctype,encoding值:None None(ini檔案、csv檔案、apk檔案) txt text/plain None py text/x-python None gif image/gif None png image/x-png None jpg image/pjpeg None pdf application/pdf None doc application/msword None zip application/x-zip-compressed None encoding值在什麼情況下不是None呢?以後有結果補充。 ''' #--------------------------------------------- ## 設定附件頭 basename = os.path.basename(file_name) file_msg.add_header('Content-Disposition','attachment', filename = basename)#修改郵件頭 main_msg.attach(file_msg) # 設定根容器屬性 main_msg['From'] = From main_msg['To'] = To main_msg['Subject'] = "attach test " main_msg['Date'] = email.Utils.formatdate( ) # 得到格式化後的完整文字 fullText = main_msg.as_string( ) # 用smtp傳送郵件 try: server.sendmail(From, To, fullText) finally: server.quit()
程式碼二
# -*- coding: utf-8 -*-
import smtplib
import email.MIMEMultipart# import MIMEMultipart
import email.MIMEText# import MIMEText
import email.MIMEBase# import MIMEBase
import os.path
From = "傳送郵箱"
To = "接收箱箱"
file_name = r"c:/1.png"#附件名
server = smtplib.SMTP("smtp.163.com")
server.login("username","password") #僅smtp伺服器需要驗證時
# 構造MIMEMultipart物件做為根容器
main_msg = email.MIMEMultipart.MIMEMultipart()
# 構造MIMEText物件做為郵件顯示內容並附加到根容器
text_msg = email.MIMEText.MIMEText("我this is a test text to text mime",_charset="utf-8")
main_msg.attach(text_msg)
# 構造MIMEBase物件做為檔案附件內容並附加到根容器
contype = 'application/octet-stream'
maintype, subtype = contype.split('/', 1)
## 讀入檔案內容並格式化 [方式2]------------------------------
data = open(file_name, 'rb')
file_msg = email.MIMEBase.MIMEBase(maintype, subtype)
file_msg.set_payload(data.read())
data.close( )
email.Encoders.encode_base64(file_msg)#把附件編碼
#---------------------------------------------
## 設定附件頭
basename = os.path.basename(file_name)
file_msg.add_header('Content-Disposition','attachment', filename = basename)#修改郵件頭
main_msg.attach(file_msg)
# 設定根容器屬性
main_msg['From'] = From
main_msg['To'] = To
main_msg['Subject'] = "attach test "
main_msg['Date'] = email.Utils.formatdate( )
# 得到格式化後的完整文字
fullText = main_msg.as_string( )
# 用smtp傳送郵件
try:
server.sendmail(From, To, fullText)
finally:
server.quit()
程式碼三
# -*- coding: utf-8 -*-
import smtplib
import email.MIMEMultipart# import MIMEMultipart
import email.MIMEText# import MIMEText
import email.MIMEBase# import MIMEBase
import os.path
import mimetypes
import email.MIMEImage# import MIMEImage
From = "傳送郵箱"
To = "接收箱箱"
file_name = "c:/1.png"#附件名
server = smtplib.SMTP("smtp.163.com")
server.login("username","password") #僅smtp伺服器需要驗證時
# 構造MIMEMultipart物件做為根容器
main_msg = email.MIMEMultipart.MIMEMultipart()
# 構造MIMEText物件做為郵件顯示內容並附加到根容器
text_msg = email.MIMEText.MIMEText("我this is a test text to text mime",_charset="utf-8")
main_msg.attach(text_msg)
# 構造MIMEBase物件做為檔案附件內容並附加到根容器
ctype,encoding = mimetypes.guess_type(file_name)
if ctype is None or encoding is not None:
ctype='application/octet-stream'
maintype,subtype = ctype.split('/',1)
file_msg=email.MIMEImage.MIMEImage(open(file_name,'rb').read(),subtype)
print ctype,encoding
## 設定附件頭
basename = os.path.basename(file_name)
file_msg.add_header('Content-Disposition','attachment', filename = basename)#修改郵件頭
main_msg.attach(file_msg)
# 設定根容器屬性
main_msg['From'] = From
main_msg['To'] = To
main_msg['Subject'] = "attach test "
main_msg['Date'] = email.Utils.formatdate( )
# 得到格式化後的完整文字
fullText = main_msg.as_string( )
# 用smtp傳送郵件
try:
server.sendmail(From, To, fullText)
finally:
server.quit()
相關知識介紹
mailMsg.set_payload(safe_unicode(bodyText).encode(charset), charset=none)
set_payload的引數說明:
引數1:安全二進位制流,即檔案資料
知識點彙總:
如果使用者A通過B郵箱來向C傳送郵件。那麼C收到郵件後,如果回覆的話,回覆的郵件地址是B郵箱。如果想要回復的郵箱是A郵箱,那麼就要設定回覆郵件的地址,通過python如何設定呢?設定的方法如下:
main_msg['Reply-to'] = '對方回覆的郵箱地址'
2、對方收到郵件後顯示傳送郵件方的名稱
一般情況下,採用這樣的程式碼:
main_msg['From'] = '[email protected]'
對方看到的是該郵箱。如果還想顯示使用者名稱,採用如下程式碼:
main_msg['From']="大頭爸爸<10000[email protected]>"
這樣,收到郵件的人就會在郵箱收件人一欄中看到:大頭爸爸<[email protected]>,而不僅僅顯示郵箱的地址。
3、向多人傳送郵件
1、一個情況是,如果我向多人傳送郵件,但同時我不希望收到郵件的人知道我發給的人。這裡就不能設定main_msg['To'],也不能設定main_msg['Cc'](抄送),因為用這兩種方式傳送,收件人獲取郵件時,會列出所有收取該郵件的郵箱。這裡只有採用密件的方式傳送。即設定main_msg['Bcc']。
2、向多人傳送郵件,一定要注意:
# 用smtp傳送郵件
try:
server.sendmail(From, To.split(';'), fullText)
finally:
server.quit()
sendmail中的那個To是list,不是string,否則只能發給第一個人。因為我傳遞的多個接收郵件的地址是用半形分號(;)分隔,所以我在這裡轉為list。
但是設定main_msg['Bcc']時,他的值不能為list,而應該是string。如程式碼:
main_msg['Bcc']=To
經過一翻測試,不設定main_msg['Bcc']值也正常,且符合預期,即收件人在訪問郵件時,收件人地址為空。如下圖所示:
3、一個奇怪的亂碼問題
因為我寫的指令碼編碼儲存為utf-8。通過QQ企業郵箱傳送給網易郵箱時,郵件內容都很正常,如下圖所示:
只是當收到郵件的使用者回覆時,出現部分內容亂碼現象。如下圖所示:
python郵件傳送程式碼:
# -*- coding: utf-8 -*-
import smtplib
import email.MIMEMultipart# import MIMEMultipart
import email.MIMEText# import MIMEText
import email.MIMEBase# import MIMEBase
import os.path
import sys
import mimetypes
import email.MIMEImage# import MIMEImage
#命令 mail.py <1:傳送方(回覆地址)[email protected]> <2:傳送地址,多個以;隔開> <3:傳送檔案>
From ="合肥頂擊科技<[email protected]>"
ReplyTo=sys.argv[1]
To = sys.argv[2]
file_name = sys.argv[3]#附件名
server = smtplib.SMTP("smtp.exmail.qq.com",25)
server.login("[email protected]","xxxxxxx") #僅smtp伺服器需要驗證時
# 構造MIMEMultipart物件做為根容器
main_msg = email.MIMEMultipart.MIMEMultipart()
# 構造MIMEText物件做為郵件顯示內容並附加到根容器
text_msg = email.MIMEText.MIMEText("頂擊撥號幫你轉發的郵件",_charset="utf-8")
main_msg.attach(text_msg)
# 構造MIMEBase物件做為檔案附件內容並附加到根容器
ctype,encoding = mimetypes.guess_type(file_name)
if ctype is None or encoding is not None:
ctype='application/octet-stream'
maintype,subtype = ctype.split('/',1)
file_msg=email.MIMEImage.MIMEImage(open(file_name,'rb').read(),subtype)
## 設定附件頭
basename = os.path.basename(file_name)
file_msg.add_header('Content-Disposition','attachment', filename = basename)#修改郵件頭
main_msg.attach(file_msg)
# 設定根容器屬性
main_msg['From'] = From
main_msg['Reply-to'] = ReplyTo
#main_msg['To'] = To
main_msg['Subject'] = "親,你朋友給你傳送的郵件-頂擊科技有限公司轉發"
main_msg['Date'] = email.Utils.formatdate()
#main_msg['Bcc'] = To
# 得到格式化後的完整文字
fullText = main_msg.as_string( )
# 用smtp傳送郵件
try:
server.sendmail(From, To.split(';'), fullText)
finally:
server.quit()
修改內容如下:
首先,在頭部增加:
from email.header import Header
1、將“合肥頂擊科技”轉為utf-8
From = "%s<[email protected]>" % Header("合肥頂擊科技","utf-8")
結果如下:
2、在內容前面加個u
main_msg['Subject'] = u"親,你朋友給你傳送的郵件-頂擊科技有限公司轉發"
或者轉為utf-8
Header("hello,親,你朋友給你傳送的郵件-頂擊科技有限公司轉發","utf-8")
現在一切OK,如下圖所示:
至此,亂碼問題全部解決。上面這個問題是在163郵箱中出現的問題,如果接收郵箱為QQ郵箱,沒有發現回覆時出現亂碼問題。
相關推薦
Python SMTP 傳送帶附件電子郵件
可採用email模組傳送電子郵件附件。傳送一個未知MIME型別的檔案附件其基本思路如下: 1. 構造MIMEMultipart物件做為根容器 2. 構造MIMEText物件做為郵件顯示內容並附加到根容器 3. 構造MIMEBase物件做為檔案附件內容並附加到根容器 a.
利用smtp協議傳送帶附件的郵件
之前寫過一個發郵件的,不過沒帶附檔,今天再看了下smtp協議,做了個帶附檔的郵件傳送例子,也就這樣吧。 package main /* 瞭解下smtp協議,並做了個小演示: 利用Go自帶的net/smtp包,傳送帶附檔的郵件。 Author: XCL
用Python實現在Linux環境傳送帶附件的郵件,支援文字/html格式
在Linux伺服器上定時執行shell指令碼,當發生錯誤時,需要傳送郵件知會開發組,但是我想把錯誤日誌當做附件傳送,結果原來的不支援附件。強迫症犯了,雖然不懂Python語言,只好硬著頭皮去寫,去測試。寫完了,本地測試木有任何問題,心中一陣竊喜。不料放在QA環境測試時,意向不
java通過smtp發送電子郵件
instance 獲取 ins dma 使用html標簽 ssl cnblogs 使用 ack package com.sm.modules.oa.web; import javax.mail.Session; import javax.mail.Transport;
Python可帶附件的郵件傳送
#coding=utf-8import smtplib from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication from emai
【Python入門】41.電子郵件之 POP3收取郵件
摘要:如何通過POP3,用Python收取電子郵件。 寫在前面:為了更好的學習python,博主記錄下自己的學習路程。本學習筆記基於廖雪峰的Python教程,如有侵權,請告知刪除。歡迎與博主一起學習Pythonヽ( ̄▽ ̄)ノ 摘要 本學習筆記基於
python 傳送帶有附件的郵件
在selenium執行完成,想要把測試報告和截圖傳送指定的郵箱,需要先把測試報告和截圖資料夾打包成壓縮檔案然後一起傳送,下面就是程式碼: 1.壓縮檔案 import os,zipfile #壓縮檔案 def compression(): try:
[SpringBoot] - 傳送帶附件的郵件
<!--傳送email依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifac
Python SMTP 傳送純文字郵件
利用Python的smtp和email模組傳送郵件 最近,開始學習python,因為從未接觸過python,所以這幾天抽時間看了一下基礎知識,然後就看到了python郵件這一塊。 因為使用qq郵箱傳送,所以也碰到了一些問題。所以,在此對使用python,利用qq郵箱傳送郵件
JavaMail使用SMTP協議傳送電子郵件(詳解)
package cn.outofmemory.javamail; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import j
python使用電子郵件模塊smtplib的方法(發送圖片 附件)實用可行
文件的 main.c 發送郵件 open view 讀取圖片 alt 指令 main Smptp類定義:smtplib.SMTP(host[,port[,local_hostname[,,timeout]]]),作為SMTP的構造函數,功能是與smtp服務器建立連接,在連接
Python-SMTP發送郵件(HTML、圖片、附件)
finall 並發 前言 multipart art pre zhang imei lena 前言: SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。 一、P
【python】用SMTP模塊發送帶附件的郵件
part cep art ssl tex gbk tar 什麽 -type 第一篇博客!參考鏈接? 在書上看了用SMTP模塊發郵件,試過之後發現並沒有什麽用。163郵箱開啟了SMTP服務後,登陸了發送的時候卻被拒收了。 找了前人的資料,發現被過期的教程害死了。 以下代碼有效
JSP: 使用網易郵箱傳送帶附件的電子郵件
JSP程式碼:使用javax.mail和activation傳送郵件 首先我們需要兩個jar包,javax.mail.jar和activation.jar,官方下載地址: 不管使用什麼郵箱傳送右鍵,我們都需要開啟SMTP服務,比如網易郵箱: 開啟服務之後,你
python 傳送帶各種附件的郵件示例!
簡述下如何使用python傳送各種附件的郵件,比如word、excel、pdf、txt,以及在正文插入圖片等等 如下所示, 加群:960410445 即可獲取數十套PDF! # coding=utf-8 import smtplib from email.mime.text
通過python傳送帶附件(支援多個附件)的郵件
目的:實現通過郵件,自動傳送自動化指令碼執行結果給對應的人 記錄點:1 傳送賬號的密碼設定,通過QQ傳送的時候,目前QQ郵件的smtp設定的時候,都是通過授權碼來進行賬號認證,如果直接在指令碼中寫入QQ郵箱的密碼,在執行指令碼的時候,QQ伺服器也會將密碼認為是授權碼進行編譯
【Python】傳送帶文字圖片附件的郵件
#coding: utf-8 import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage H
Python-SMTP傳送郵件(HTML、圖片、附件)
前言: SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。 一、Python傳送HTML郵件 # -*- coding: utf-8 -*- # @Time : 2018/6/6 上午11:
電子郵件協議:SMTP、POP3、IMAP4
tcp 默認 支持 聯網 互聯網 郵件協議 保存 遠程文件 內容 常見的電子郵件協議:SMTP、POP3、IMAP4 郵件發送協議:SMTP協議 郵件讀取協議:POP3、IMAP4協議 SMTP協議(simple mail transfer protocol):簡單
Python學習筆記__17章電子郵件
編程語言 Python # 這是學習廖雪峰老師python教程的學習筆記Email的歷史比Web還要久遠,直到現在,Email也是互聯網上應用非常廣泛的服務。而且幾乎所有的編程語言都支持發送和接收電子郵件。1、郵件的原理1.1、郵件的發送流程假設我們要把郵件從[email protected] 發送到 @sina.