1. 程式人生 > >Python SMTP 傳送帶附件電子郵件

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.