亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

Python發送郵件(常見四種郵件內容)

2019-11-06 08:06:12
字體:
來源:轉載
供稿:網友

轉自:http://lizhenliang.blog.51cto.com/7876557/1875330

在寫腳本時,放到后臺運行,想知道執行情況,會通過郵件、SMS(短信)、飛信、微信等方式通知管理員,用的最多的是郵件。在linux下,Shell腳本發送郵件告警是件很簡單的事,有現成的郵件服務軟件或者調用運營商郵箱服務器。

對于Python來說,需要編寫腳本調用郵件服務器來發送郵件,使用的協議是SMTP。接收郵件,使用的協議是POP3和IMAP。我想有必要說明下 ,POP3和IMAP的區別:POP3在客戶端郵箱中所做的操作不會反饋到郵箱服務器,比如刪除一封郵件,郵箱服務器并不會刪除。IMAP則會反饋到郵箱服務器,會做相應的操作。

Python分別提供了收發郵件的庫,smtplib、poplib和imaplib。

本章主要講解如果使用smtplib庫實現發送各種形式的郵件內容。在smtplib庫中,主要主要用smtplib.SMTP()類,用于連接SMTP服務器,發送郵件。

這個類有幾個常用的方法:

方法

描述

SMTP.set_debuglevel(level)設置輸出debug調試信息,默認不輸出
SMTP.docmd(cmd[, argstring])發送一個命令到SMTP服務器
SMTP.connect([host[, port]])連接到指定的SMTP服務器
SMTP.helo([hostname])使用helo指令向SMTP服務器確認你的身份
SMTP.ehlo(hostname)使用ehlo指令像ESMTP(SMTP擴展)確認你的身份
SMTP.ehlo_or_helo_if_needed()如果在以前的會話連接中沒有提供ehlo或者helo指令,這個方法會調用ehlo()或helo()
SMTP.has_extn(name)判斷指定名稱是否在SMTP服務器上
SMTP.verify(address)判斷郵件地址是否在SMTP服務器上
SMTP.starttls([keyfile[, certfile]])使SMTP連接運行在TLS模式,所有的SMTP指令都會被加密
SMTP.login(user, passWord)登錄SMTP服務器
SMTP.sendmail(from_addr, to_addrs, msg, mail_options=[], rcpt_options=[])

發送郵件

from_addr:郵件發件人

to_addrs:郵件收件人

msg:發送消息

SMTP.quit()關閉SMTP會話
SMTP.close()關閉SMTP服務器連接

看下官方給的示例:

>>> import smtplib>>> s=smtplib.SMTP("localhost")>>> tolist=["one@one.org","two@two.org","three@three.org","four@four.org"]>>> msg = '''/     ... From: Me@my.org     ... Subject: testin'...     ...     ... This is a test '''>>> s.sendmail("me@my.org",tolist,msg)     { "three@three.org" : ( 550 ,"User unknown" ) }>>> s.quit()

我們根據示例給自己發一個郵件測試下:

我這里測試使用本地的SMTP服務器,也就是要裝一個支持SMTP協議的服務,比如sendmail、postfix等。

CentOS安裝sendmail:yum install sendmail

>>> import smtplib>>> s = smtplib.SMTP("localhost")>>> tolist = ["xxx@QQ.com", "xxx@163.com"]>>> msg = '''/... From: Me@my.org... Subject: test... This is a test '''>>> s.sendmail("me@my.org", tolist, msg){}進入騰訊和網易收件人郵箱,就能看到剛發的測試郵件,一般都被郵箱服務器過濾成垃圾郵件,所以收件箱沒有,你要去垃圾箱看看。

可以看到,多個收件人可以放到一個列表中進行群發。msg對象里From表示發件人,Subject是郵件標題,換行后輸入的是郵件內容。

上面是使用本地SMTP服務器發送的郵件,測試下用163服務器發送郵件看看效果:

>>> import smtplib>>> s = smtplib.SMTP("smtp.163.com")>>> s.login("baojingtongzhi@163.com", "xxx")(235, 'Authentication successful')>>> tolist = ["xxx@qq.com", "xxx@163.com"]>>> msg = '''/... From: baojingtongzhi@163.com... Subject: test... This is a test '''>>> s.sendmail("baojingtongzhi@163.com", tolist, msg)Traceback (most recent call last):  File "<stdin>", line 1, in <module>  File "/usr/lib64/python2.6/smtplib.py", line 725, in sendmail    raise SMTPDataError(code, resp)smtplib.SMTPDataError: (554, 'DT:SPM 163 smtp10,DsCowAAXIdDIJAtYkZiTAA--.65425S2 1477125592,please see http://mail.163.com/help/help_spam_16.htm?

訪問給出的163網址,SMTP554錯誤是: "554 DT:SUM 信封發件人和信頭發件人不匹配;"

大概已經明白啥意思,看上面再使用本地SMTP服務器時候,收件人位置是“undisclosed-recipients”,看這樣163的SMTP服務器不給我們服務的原因就是這里收件人沒指定。

重新修改下msg對象,添加上收件人:

>>> msg = '''/           ... From: baojingtongzhi@163.com... To: 962510244@qq.com ,zhenliang369@163.com... Subject: test...... This is a test '''>>> s.sendmail("baojingtongzhi@163.com", tolist, msg){}

好了,可以正常發送郵件了。msg這個格式是SMTP規定的,一定要遵守。

1、Python發送郵件并抄送

#!/usr/bin/python# -*- coding: utf-8 -*-import smtplibdef sendMail(body):    smtp_server = 'smtp.163.com'    from_mail = 'baojingtongzhi@163.com'    mail_pass = 'xxx'    to_mail = ['962510244@qq.com', 'zhenliang369@163.com']    cc_mail = ['lizhenliang@xxx.com']    from_name = 'monitor'     subject = u'監控'.encode('gbk')   # 以gbk編碼發送,一般郵件客戶端都能識別#     msg = '''/# From: %s <%s># To: %s# Subject: %s# %s''' %(from_name, from_mail, to_mail_str, subject, body)  # 這種方式必須將郵件頭信息靠左,也就是每行開頭不能用空格,否則報SMTP 554    mail = [        "From: %s <%s>" % (from_name, from_mail),        "To: %s" % ','.join(to_mail),   # 轉成字符串,以逗號分隔元素        "Subject: %s" % subject,        "Cc: %s" % ','.join(cc_mail),        "",        body        ]    msg = '/n'.join(mail)  # 這種方式先將頭信息放到列表中,然后用join拼接,并以換行符分隔元素,結果就是和上面注釋一樣了    try:        s = smtplib.SMTP()        s.connect(smtp_server, '25')        s.login(from_mail, mail_pass)        s.sendmail(from_mail, to_mail+cc_mail, msg)           s.quit()    except smtplib.SMTPException as e:        PRint "Error: %s" %eif __name__ == "__main__":    sendMail("This is a test!")

s.sendmail(from_mail, to_mail+cc_mail, msg) 在這里注意下,收件人和抄送人為什么放一起發送呢?其實無論是收件人還是抄送人,它們收到的郵件都是一樣的,SMTP都是認為收件人這樣一封一封的發出。所以實際上并沒有抄送這個概念,只是在郵件頭加了抄送人的信息罷了!另外,如果不需要抄送人,直接把上面cc的信息去掉即可。

2 Python發送郵件帶附件

由于SMTP.sendmail()方法不支持添加附件,所以可以使用email模塊來滿足需求。email模塊是一個構造郵件和解析郵件的模塊。

先看下如何用email庫構造一個簡單的郵件:

message = Message()message['Subject'] = '郵件主題'message['From'] = from_mailmessage['To'] = to_mailmessage['Cc'] = cc_mailmessage.set_payload('郵件內容')

基本的格式就是這樣的!

繼續回到主題,發送郵件帶附件:

#!/usr/bin/python# -*- coding: utf-8 -*-import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.header import Headerfrom email import encodersfrom email.mime.base import MIMEBasefrom email.utils import parseaddr, formataddr# 格式化郵件地址def formatAddr(s):    name, addr = parseaddr(s)    return formataddr((Header(name, 'utf-8').encode(), addr))def sendMail(body, attachment):    smtp_server = 'smtp.163.com'    from_mail = 'baojingtongzhi@163.com'    mail_pass = 'xxx'    to_mail = ['962510244@qq.com', 'zhenliang369@163.com']    # 構造一個MIMEMultipart對象代表郵件本身    msg = MIMEMultipart()    # Header對中文進行轉碼    msg['From'] = formatAddr('管理員 <%s>' % from_mail).encode()    msg['To'] = ','.join(to_mail)    msg['Subject'] = Header('監控', 'utf-8').encode()    # plain代表純文本    msg.attach(MIMEText(body, 'plain', 'utf-8'))    # 二進制方式模式文件    with open(attachment, 'rb') as f:        # MIMEBase表示附件的對象        mime = MIMEBase('text', 'txt', filename=attachment)        # filename是顯示附件名字        mime.add_header('Content-Disposition', 'attachment', filename=attachment)        # 獲取附件內容        mime.set_payload(f.read())        encoders.encode_base64(mime)        # 作為附件添加到郵件        msg.attach(mime)    try:        s = smtplib.SMTP()        s.connect(smtp_server, "25")        s.login(from_mail, mail_pass)        s.sendmail(from_mail, to_mail, msg.as_string())  # as_string()把MIMEText對象變成str        s.quit()    except smtplib.SMTPException as e:        print "Error: %s" % eif __name__ == "__main__":    sendMail('附件是測試數據, 請查收!', 'test.txt')3 Python發送HTML郵件

#!/usr/bin/python# -*- coding: utf-8 -*-import smtplibfrom email.mime.text import MIMETextfrom email.mime.multipart import MIMEMultipartfrom email.header import Headerfrom email.utils import parseaddr, formataddr# 格式化郵件地址def formatAddr(s):    name, addr = parseaddr(s)    return formataddr((Header(name, 'utf-8').encode(), addr))def sendMail(body):    smtp_server = 'smtp.163.com'    from_mail = 'baojingtongzhi@163.com'    mail_pass = 'xxx'    to_mail = ['962510244@qq.com', 'zhenliang369@163.com']    # 構造一個MIMEMultipart對象代表郵件本身    msg = MIMEMultipart()     # Header對中文進行轉碼    msg['From'] = formatAddr('管理員 <%s>' % from_mail).encode()    msg['To'] = ','.join(to_mail)    msg['Subject'] = Header('監控', 'utf-8').encode()    msg.attach(MIMEText(body, 'html', 'utf-8'))    try:        s = smtplib.SMTP()             s.connect(smtp_server, "25")           s.login(from_mail, mail_pass)        s.sendmail(from_mail, to_mail, msg.as_string())  # as_string()把MIMEText對象變成str             s.quit()    except smtplib.SMTPException as e:        print "Error: %s" % eif __name__ == "__main__":    body = """    <h1>測試郵件</h1>    <h2 style="color:red">This is a test</h1>    """    sendMail(body)4 Python發送圖片郵件

#!/usr/bin/python# -*- coding: utf-8 -*-import smtplibfrom email.mime.text import MIMETextfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipartfrom email.header import Headerfrom email.utils import parseaddr, formataddr# 格式化郵件地址def formatAddr(s):    name, addr = parseaddr(s)    return formataddr((Header(name, 'utf-8').encode(), addr))def sendMail(body, image):    smtp_server = 'smtp.163.com'    from_mail = 'baojingtongzhi@163.com'    mail_pass = 'xxx'    to_mail = ['962510244@qq.com', 'zhenliang369@163.com']    # 構造一個MIMEMultipart對象代表郵件本身    msg = MIMEMultipart()     # Header對中文進行轉碼    msg['From'] = formatAddr('管理員 <%s>' % from_mail).encode()    msg['To'] = ','.join(to_mail)    msg['Subject'] = Header('監控', 'utf-8').encode()    msg.attach(MIMEText(body, 'html', 'utf-8'))    # 二進制模式讀取圖片    with open(image, 'rb') as f:        msgImage = MIMEImage(f.read())    # 定義圖片ID    msgImage.add_header('Content-ID', '<image1>')    msg.attach(msgImage)    try:        s = smtplib.SMTP()             s.connect(smtp_server, "25")           s.login(from_mail, mail_pass)        s.sendmail(from_mail, to_mail, msg.as_string())  # as_string()把MIMEText對象變成str             s.quit()    except smtplib.SMTPException as e:        print "Error: %s" % eif __name__ == "__main__":    body = """    <h1>測試圖片</h1>    <img src="cid:image1"/>    # 引用圖片    """    sendMail(body, 'test.png')上面發郵件的幾種常見的發郵件方法基本滿足日常需求了。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕亚洲字幕| 久久精品国产久精国产一老狼| 欧美丝袜美女中出在线| 精品电影在线观看| 午夜精品一区二区三区在线播放| 久久99国产精品自在自在app| 国产三级精品网站| 亚洲精品98久久久久久中文字幕| 久久综合久久美利坚合众国| 国产欧美最新羞羞视频在线观看| 亚洲一区二区三区视频| 精品久久香蕉国产线看观看亚洲| 亚洲欧美中文在线视频| 夜夜嗨av色综合久久久综合网| 日本精品视频在线播放| 国产综合福利在线| 久久久国产成人精品| 亚洲人成电影网站色| 欧美午夜久久久| 91人人爽人人爽人人精88v| 国产欧美一区二区三区在线看| 亚洲自拍小视频| 久久精品国产一区二区电影| 精品国产拍在线观看| 久久久久久久久久国产精品| 欧美亚洲国产另类| 精品国产鲁一鲁一区二区张丽| 自拍亚洲一区欧美另类| 欧美放荡办公室videos4k| 欧美裸体男粗大视频在线观看| 日本久久久久亚洲中字幕| 亚洲精品国精品久久99热一| 国产成人精品久久亚洲高清不卡| 日韩精品视频在线播放| 国产视频在线观看一区二区| 欧美精品激情blacked18| 成人免费视频xnxx.com| 欧美精品午夜视频| 亚洲第一偷拍网| 超碰97人人做人人爱少妇| 中文字幕亚洲第一| 亚洲精品一区二三区不卡| 91在线免费观看网站| 欧美成年人在线观看| 国产精品久久久久久久久久久新郎| 伊人成人开心激情综合网| 亚洲视频在线免费观看| 黄色一区二区三区| 国产一区二区黄| 日韩av中文字幕在线播放| 欧洲美女免费图片一区| 秋霞午夜一区二区| 国产精品网站大全| 一个人看的www欧美| 亚洲美女av网站| 国产精品久久久久久久久久久久久| www.精品av.com| 欧美亚洲在线观看| 日本亚洲欧美成人| 国产精品久久久久高潮| 丝袜美腿精品国产二区| 日韩在线视频线视频免费网站| 欧美区二区三区| 国产精品女人网站| 97国产suv精品一区二区62| 国产美女久久精品香蕉69| 国产精品视频一区国模私拍| 欧美专区在线视频| 98精品国产自产在线观看| 超在线视频97| 国自在线精品视频| 国产成人综合亚洲| 久久久久久国产精品美女| 亚洲成年人在线| 国内精品久久影院| 亚洲无亚洲人成网站77777| 亚洲精品网址在线观看| 久久人人爽人人爽爽久久| 国内免费久久久久久久久久久| 欧美视频在线观看免费网址| 欧美中文字幕第一页| 欧美性猛交丰臀xxxxx网站| 久久久噜噜噜久久| 精品国产1区2区| 亚洲精品av在线播放| 菠萝蜜影院一区二区免费| 日本一区二区三区在线播放| 国产精品影片在线观看| 中文字幕日韩av电影| 日本一区二区三区四区视频| 久久中文久久字幕| 精品亚洲一区二区三区| 色偷偷噜噜噜亚洲男人的天堂| 亚洲第一福利在线观看| 欧洲精品毛片网站| 日韩美女免费观看| 色香阁99久久精品久久久| 日本91av在线播放| 久久久亚洲精品视频| 日韩国产精品亚洲а∨天堂免| 91久久精品日日躁夜夜躁国产| 日韩成人在线免费观看| 亚洲图片在线综合| 久久久久久久久久国产精品| 91视频免费在线| 国产亚洲精品高潮| 亚洲电影成人av99爱色| 伊人久久久久久久久久| 黑人精品xxx一区| 成人黄色激情网| 国产日韩欧美视频在线| 狠狠综合久久av一区二区小说| 久久偷看各类女兵18女厕嘘嘘| 亚洲开心激情网| 亚洲国产成人久久| 性色av一区二区三区红粉影视| xxxxxxxxx欧美| 国产精品99一区| 亚洲成人a**站| 精品视频在线播放色网色视频| 中文字幕亚洲一区二区三区| 美女福利精品视频| 久久久女人电视剧免费播放下载| 一区二区三区www| 成人亚洲综合色就1024| 国产精品欧美日韩| 日韩综合中文字幕| 欧美在线欧美在线| 亚洲精品视频网上网址在线观看| 国产日产亚洲精品| 国产成人在线精品| 98精品国产自产在线观看| 国产色婷婷国产综合在线理论片a| 一区二区三区视频免费| 亚洲xxxx在线| 最近2019中文字幕第三页视频| 国产精品一香蕉国产线看观看| 亚洲精品视频播放| 狠狠躁夜夜躁人人爽超碰91| 亚洲福利精品在线| 日韩网站在线观看| 一本色道久久88综合亚洲精品ⅰ| 成人免费看吃奶视频网站| 2018国产精品视频| 亚洲国产美女精品久久久久∴| 亚洲天堂av网| 欧美一级大片在线免费观看| 91在线直播亚洲| 97精品视频在线| 久久免费高清视频| 欧美国产亚洲视频| 在线性视频日韩欧美| 人妖精品videosex性欧美| 性色av一区二区三区红粉影视| 日本高清+成人网在线观看| 日本精品va在线观看| 一个人看的www久久| 国产精彩精品视频| 国产精品久久久亚洲| 久久久成人精品视频| 欧美日韩国产页| 日韩欧美一区二区在线| 亚洲精品国产美女| 日本91av在线播放|