日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 收发邮件_python发送各类邮件的主要基本方法

發布時間:2023/12/10 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 收发邮件_python发送各类邮件的主要基本方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

利用python實現基本的郵件發送。

感謝以下博客的整理,本人在學習的同時也做了一些整理

一、相關模塊介紹

發送郵件主要用到了smtplib和email兩個模塊,這里首先就兩個模塊進行一下簡單的介紹:

1、smtplib模塊

smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])

SMTP類構造函數,表示與SMTP服務器之間的連接,通過這個連接可以向smtp服務器發送指令,執行相關操作(如:登陸、發送郵件)。所有參數都是可選的。

host:smtp服務器主機名

port:smtp服務的端口,默認是25;如果在創建SMTP對象的時候提供了這兩個參數,在初始化的時候會自動調用connect方法去連接服務器。

smtplib模塊還提供了SMTP_SSL類和LMTP類,對它們的操作與SMTP基本一致。

smtplib.SMTP提供的方法:

SMTP.set_debuglevel(level):設置是否為調試模式。默認為False,即非調試模式,表示不輸出任何調試信息。

SMTP.connect([host[, port]]):連接到指定的smtp服務器。參數分別表示smpt主機和端口。注意: 也可以在host參數中指定端口號(如:smpt.yeah.net:25),這樣就沒必要給出port參數。

SMTP.docmd(cmd[, argstring]):向smtp服務器發送指令??蛇x參數argstring表示指令的參數。

SMTP.helo([hostname]) :使用"helo"指令向服務器確認身份。相當于告訴smtp服務器“我是誰”。

SMTP.has_extn(name):判斷指定名稱在服務器郵件列表中是否存在。出于安全考慮,smtp服務器往往屏蔽了該指令。

SMTP.verify(address) :判斷指定郵件地址是否在服務器中存在。出于安全考慮,smtp服務器往往屏蔽了該指令。

SMTP.login(user, password) :登陸到smtp服務器?,F在幾乎所有的smtp服務器,都必須在驗證用戶信息合法之后才允許發送郵件。

SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]) :發送郵件。這里要注意一下第三個參數,msg是字符串,表示郵件。我們知道郵件一般由標題,發信人,收件人,郵件內容,附件等構成,發送郵件的時候,要注意msg的格式。這個格式就是smtp協議中定義的格式。

SMTP.quit():斷開與smtp服務器的連接,相當于發送"quit"指令。(也有用到smtp.close())

使用smtplib庫發送郵件的基本步驟:

#連接到SMTP服務器,參數表示SMTP主機和端口,端口默認25

SMTP.connect([host[,port]]) #也可以不顯式鏈接:SMTP(host)

#登錄SMTP服務器

SMTP.login(user,password)

#發送郵件。.as_string()是字符串,表示郵件內容,to_addrs是收件人list

SMTP.sendmail(from_addr, to_addrs, msg.as_string())

#斷開連接

SMTP.close() #也有用SMTP.quit()

2、email模塊

Email庫用來處理郵件消息。包括MIME和基于RFC2822的消息文檔。

有關MIME的一些知識

RFC2822定義的郵件格式中,郵件體只是單純的ASCII編碼的字符序列,MIME擴展郵件的格式,用以支持非ASCII編碼的文本、非文本附件及包含多個部分(multi-part)的郵件體。

MIME消息由消息頭、消息體組成,即郵件的郵件頭、郵件體。中間以空行進行分隔。

1、郵件頭:包括發件人(from)、收件人(to)、郵件主題(subject)、接收日期(date)、MIME版本、郵件內容類型等信息。每條信息稱為一個域,由域名后加“:”和信息內容構成,域的首行必須頂頭寫。

2、郵件體:有text/plain(純文本)和text/html(超文本)之分,由郵件頭的“content type”域指出??梢酝瑫r存在,也可以只存在一種。這就是為什么有些郵件既可以用html格式查看,又可以用文本格式查看的原因。郵件體分為多個段,稱為Payload。每個段也包括段頭段尾,中間以空行分隔。multipart類型有3種:multipart/mixed multipart/related multipart/alternative。郵件里添加附件要定義multipart/mixed段,如果純文本超文本共存,則要定義multipart/alternative,如存在內嵌資源,要定義multipart/related。

3、附件(attach)。發送郵件時,可以將本機的文件一起發送。附件可以有0個或多個,只要附件的總大小,不超過郵件服務器所聲明的最大容量。 4、

包括的類主要有(更加詳細的介紹可見:

http://docs.python.org/library/email.mime.html):

class email.mime.text.MIMEText(_text[, _subtype[, _charset]])

用于生成MIME對象的主體文本:_text指定郵件內容,_subtype指定郵件類型,_charset指定編碼。

class email.mime.multipart.MIMEMultipart()

用于生成包含多個部分的郵件體的MIME對象

class email.mime.base.MIMEBase(_maintype, _subtype, **_params)

這是MIME的一個基類。一般不需要在使用時創建實例。其中_maintype是內容類型,如text或者image。_subtype是內容的minor type 類型,如plain或者gif。 **_params是一個字典,直接傳遞給Message.add_header()。

class email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]]]

MIMEBase的一個子類,多個MIME對象的集合,_subtype默認值為mixed。boundary是MIMEMultipart的邊界,默認邊界是可數的。

class email.mime.application.MIMEApplication(_data[, _subtype[, _encoder[, **_params]]])

MIMEMultipart的一個子類。

class email.mime.audio. MIMEAudio(_audiodata[, _subtype[, _encoder[, **_params]]])

MIME音頻對象

class email.mime.image.MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]])

MIME二進制文件對象。

class email.mime.message.MIMEMessage(_msg[, _subtype])

具體的一個message實例,使用方法如下:

msg=mail.Message.Message() #一個實例

msg['to']='XXX@XXX.com' #發送到哪里

msg['from']='YYY@YYY.com' #自己的郵件地址

msg['date']='2013-5-25' #時間日期

msg['subject']='hello python' #郵件主題

class email.mime.text.MIMEText(_text[, _subtype[, _charset]])

MIME文本對象,其中_text是郵件內容,_subtype郵件類型,可以是text/plain(普通文本郵件),html/plain(html郵件), _charset編碼,可以是gb2312等等。

三、幾種郵件的具體實現代碼

1.普通文本和html郵件的發送

普通文本郵件發送的實現,關鍵是要將MIMEText中_subtype設置為plain。首先導入smtplib和mimetext。創建smtplib.smtp實例,connect郵件smtp服務器,login后發送.

html信息發送和普通文本一樣,conten內容變為html信息,并將_subtype設置為html。

具體代碼如下(python 2.7):

#import getpass #如果需要交互獲取密碼

#pwd_input = getpass.getpass('Password:')

import time

import smtplib

import email.utils

from email.mime.text import MIMEText

#Initialize mail information

#mailto_list = ['XXX@163.com','YYY@qq.com']

mail_host = 'smtp.163.com' #設置網易163服務器

mail_user = 'ZZZ' #用戶名

mail_pass = '*********' #口令

mail_postfix = '163.com' #發件箱后綴

mail_from = '@'.join([mail_user,mail_postfix]) #收件箱

#Create the message

#html信息

#content = "Dyllian使用程序給你發了個鏈接!"

#msg = MIMEText(content,_subtype='html',_charset='utf8')

#普通文本

content = "Hello dyllian"

msg = MIMEText(content,_subtype='plain',_charset='utf8')

msg['From'] = email.utils.formataddr(('Author',mail_from)) #str type

msg['To'] = email.utils.formataddr(('Recipient',mailto_list)) #mail to list

msg['Subject'] = 'Test from python!'

msg['date']=time.strftime('%a, %d %b %Y %H:%M:%S %z')#定義發送時間(不定義的可能有的郵件客戶端會不顯示發送時間)

#msg.preamble = 'This is a common message in MIME format.'

#Send mail to list recipient

try:

server = smtplib.SMTP(mail_host)

server.login(mail_user,mail_pass)

server.sendmail(mail_from,mailto_list,msg.as_string()) #mail to list recipient

except Exception,e: #try中有異常則執行

print 'Mail passed unsuccessfully!\n',str(e)

else: #try中沒有異常則執行

print 'Mail passed successfully!'

finally: #try中有無異常都執行

server.close()

2.帶附件的郵件發送(附件圖片,附件一般文件)

import os

import time

import smtplib

import email.utils

from email.mime.text import MIMEText

from email.mime.image import MIMEImage

from email.mime.multipart import MIMEMultipart

#Get local path

path = os.path.dirname(__file__)

#Initialize mail infomation

#mailto_list = ['XXX@163.com','YYY@qq.com']

mailto_list = ['XXX@163.com']

mail_host = 'smtp.163.com' #設置服務器

mail_user = 'ZZZ' #用戶名

mail_pass = '******' #口令

mail_postfix = '163.com' #發件箱后綴

mail_from = '@'.join([mail_user,mail_postfix]) #收件箱

#構建一個帶附件的實例

msg = MIMEMultipart()

#用MIMEImage附件圖片

fp = open(path+'\\ning1.jpg', 'rb')

msgImage = MIMEImage(fp.read())

fp.close()

msgImage.add_header('Content-ID', '')

msg.attach(msgImage)

#構造附件1圖片

att1 = MIMEText(open(path+'\\ning1.jpg','rb').read(),_subtype='base64',_charset='utf8')

att1['Content-Type'] = 'application/octet-stream'

att1['Content-Disposition'] = "attachment; filename=ningning1.jpg" #這里的filename可以隨便取,寫什么名字,郵件中顯示什么名字

msg.attach(att1)

#構造附件2文件

att2 = MIMEText(open(path+'\\ning2.txt','rb').read(),_subtype='base64',_charset='utf8')

att2['Content-Type'] = 'application/octet-stream'

att2['Content-Disposition'] = "attachment; filename=test2.txt"

msg.attach(att2)

#加郵件頭

msg['From'] = email.utils.formataddr(('Author',mail_from)) #str type

msg['To'] = email.utils.formataddr(('Recipient',mailto_list)) #mail to list

msg['Subject'] = 'Test from python!'

msg['date']=time.strftime('%a, %d %b %Y %H:%M:%S %z')#定義發送時間(不定義的可能有的郵件客戶端會不顯示發送時間)

#msg.preamble = 'This is a multi-part message in MIME format.'

#Send mail to list recipient

try:

server = smtplib.SMTP(mail_host)

server.login(mail_user,mail_pass)

server.sendmail(mail_from,mailto_list,msg.as_string()) #mail to list recipient

except Exception,e: #try中有異常則執行

print 'Mail passed unsuccessfully!\n',str(e)

else: #try中沒有異常則執行

print 'Mail passed successfully!'

finally: #try中有無異常都執行

server.close()

四:遇到的問題

希望在郵件正文中顯式圖片信息,思路是用html屬性發送,查了幾個資料,遇到了同樣的問題:

1.如果做以下處理,結果還是以附件的形式發送圖片:

#構建一個帶附件的實例

msg = MIMEMultipart('ralated')

#用MIMEImage附件圖片

fp = open(path+'\\ning1.jpg', 'rb')

msgImage = MIMEImage(fp.read())

fp.close()

msgImage.add_header('Content-ID', '')

msg.attach(msgImage)

2.如果做以下的處理,結果有編譯錯誤:

import os

import smtplib

import email.utils

from email.mime.text import MIMEText

from email.mime.image import MIMEImage

from email.mime.multipart import MIMEMultipart

#Get local path

path = os.path.dirname(__file__)

#Initialize mail infomation

mailto_list = ['XXX@163.com']

mail_host = 'smtp.163.com' #設置服務器

mail_user = 'YYY' #用戶名

mail_pass = '******' #口令

mail_postfix = '163.com' #發件箱后綴

mail_from = '@'.join([mail_user,mail_postfix]) #收件箱

#構建一個帶附件的實例

msg = MIMEMultipart('ralated')

#html附帶圖片正文

msgAlternative = MIMEMultipart('alternative')

msg.attach(msgAlternative)

html = '本郵件,正文中顯示圖片!'

htmlText = MIMEText(html,_subtype='html',_charset='utf8')

msgAlternative.attach(htmlText)

#內置圖片

fp = open(path+'\\ning1.jpg','rb+')

msgImage = MIMEImage(fp.read())

fp.close()

msgImage.add_header('Content-ID','')

msg.attach(msgImage)

#加郵件頭

msg['From'] = email.utils.formataddr(('Author',mail_from)) #str type

msg['To'] = email.utils.formataddr(('Recipient',mailto_list)) #mail to list

msg['Subject'] = 'Test from python!'

msg.preamble = 'This is a multi-part message in MIME format.'

#Send mail to list recipient

try:

server = smtplib.SMTP(mail_host)

server.login(mail_user,mail_pass)

server.sendmail(mail_from,mailto_list,msg.as_string()) #mail to list recipient

except Exception,e: #try中有異常則執行

print 'Mail passed unsuccessfully!\n',str(e)

else: #try中沒有異常則執行

print 'Mail passed successfully!'

finally: #try中有無異常都執行

server.close()

編譯結果:

Mail passed unsuccessfully!

(554, 'DT:SPM smtp11, D8CowEDp5XJrPKBR0ATQBg--.765S2 1369455724 http://mail.163.com/help/help_spam_16.htm?ip=61.150.43.98&hostid=smtp11&time=1369455724')

不知道哪里出了錯,哪位可能提供思路解決?謝謝!

總結

以上是生活随笔為你收集整理的python 收发邮件_python发送各类邮件的主要基本方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。