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

歡迎訪問 生活随笔!

生活随笔

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

python

为什么每个邮件收到后都会有一个htm的附件_Python 发送邮件各种姿势

發布時間:2025/3/20 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么每个邮件收到后都会有一个htm的附件_Python 发送邮件各种姿势 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

電子郵件是互聯網應用最廣的通訊服務,在工作中經常會有自動發郵件的需求,例如監控告警、注冊通知、激活鏈接等。

而發送郵件是基于SMTP協議,接收郵件則是基于POP3或IMAP協議。

那POP3與IMAP協議又有什么區別呢?

最主要的區別是POP3在客戶端郵箱中所做的操作不會反饋到郵箱服務器,比如刪除一封郵件,郵箱服務器并不會刪除。IMAP則會反饋到郵箱服務器,會做相應的操作。

Python對郵件服務完整的支持,分別提供相應的標準庫:smtplib、poplib和imaplib。

顧名思義,其中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()

接下來,給你分享 5 種最常用的發送郵件方式。

1、Python發送文本郵件

為方便測試,先在本機安裝一個郵件服務,比如sendmail、postfix等。這里使用sendmail,如果你是CentOS系統直接安裝啟動即可:

# yum install sendmail
# service sendmail start

按照官方示例在Python解釋器執行:

>>> 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是郵件標題,換行后輸入的是郵件內容。

使用自建郵箱服務器經常會出現被當做垃圾郵件、發件延遲,為解決這兩個問題,一般使用知名郵件運營商。

例如使用163個人郵件作為發件人:

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

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

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

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

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

2、發送郵件并抄送

#!/usr/bin/python# -*- coding: utf-8 -*-import smtplibdef sendMail(body):
smtp_server = 'smtp.163.com'
from_mail = 'xxx@163.com'
mail_pass = 'xxx'
to_mail = ['xxx@qq.com', 'xxx@163.com']
cc_mail = ['xxx@gmail.com']
from_name = 'monitor'
subject = u'監控'.encode('gbk') # 以gbk編碼發送,一般郵件客戶端都能識別# msg = '''\# From: %s # To: %s# Subject: %s# %s''' %(from_name, from_mail, to_mail_str, subject, body) # 這種方式必須將郵件頭信息靠左,也就是每行開頭不能用空格,否則報SMTP 554

mail = ["From: %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的信息去掉即可。

3、Python發送郵件帶附件

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

message = Message()
message['Subject'] = '郵件主題'
message['From'] = from_mail
message['To'] = to_mail
message['Cc'] = cc_mail
message.set_payload('郵件內容')

基本的格式就是這樣的。

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

#!/usr/bin/python
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email import encoders
from email.mime.base import MIMEBase
from 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 = 'xxx@163.com'
mail_pass = 'xxx'
to_mail = ['xxx@qq.com', 'xxx@163.com']

# 構造一個MIMEMultipart對象代表郵件本身
msg = MIMEMultipart()
# Header對中文進行轉碼
msg['From'] = formatAddr('管理員 ' % 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" % e
if __name__ == "__main__":
sendMail('附件是測試數據, 請查收!', 'test.txt')

4、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 = ['xxx@qq.com', 'xxx@163.com']# 構造一個MIMEMultipart對象代表郵件本身
msg = MIMEMultipart()# Header對中文進行轉碼
msg['From'] = formatAddr('管理員 ' % 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 = """

測試郵件

This is a test
"""


sendMail(body)

5、Python發送圖片郵件

#!/usr/bin/python
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.header import Header
from 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 = 'xxx@163.com'
mail_pass = 'xxx'
to_mail = ['xxx@qq.com', 'xxx@163.com']

# 構造一個MIMEMultipart對象代表郵件本身
msg = MIMEMultipart()# Header對中文進行轉碼
msg['From'] = formatAddr('管理員 ' % 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', '')
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" % e
if __name__ == "__main__":
body = """

測試圖片

# 引用圖片
"""
sendMail(body, 'test.png')

-?END?-

推薦閱讀:

非常詳細的 Ceph 介紹、原理、架構

服務器產生大量 TIME_WAIT 狀態的排查過程

不管你是開發還是運維,微服務這些你得知道!

10 個Linux Awk文本處理經典案例

30個Linux Shell腳本經典案例(上)

30個Linux Shell腳本經典案例(中)

30個Linux Shell腳本經典案例(下)

基于Kubernetes的DevOps流水線實戰?

年輕時偷的懶,遲早是要還的。點亮

總結

以上是生活随笔為你收集整理的为什么每个邮件收到后都会有一个htm的附件_Python 发送邮件各种姿势的全部內容,希望文章能夠幫你解決所遇到的問題。

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