今天百度學(xué)習(xí)了如何在python中使用SMTP發(fā)送郵件,包括帶HTML格式和附件醋旦。
基本套路就是定義一個(gè)MIMEText(不帶附件)或者M(jìn)IMEMultipart(可帶多個(gè)附件),然后再連接匆篓、登錄郵件服務(wù)器并發(fā)送即可浑度。(發(fā)送HTML格式的郵件與純文本消息的郵件不同之處就是將MIMEText中_subtype設(shè)置為html。
)
套路如下:不帶附件
from email.mime.text import MIMEText
import smtplib
mail = MIMEText('郵件正文') # 簡單純文本消息的郵件
# mail = MIMEText('郵件正文', _subtype='html', _charset='utf-8') # HTML格式的郵件
mail['Subject'] = '郵件主題'
mail['From'] = '發(fā)件人地址' # 需與郵件服務(wù)器的認(rèn)證用戶一致
mail['To'] = '收件人地址'
smtp = smtplib.SMTP('smtp.qq.com', port=25) # 設(shè)置郵件服務(wù)器地址與端口
smtp.login('帳號', '密碼') # 登錄郵件服務(wù)器
smtp.sendmail('發(fā)件人地址', '收件人地址', mail.as_string()) # 發(fā)送郵件
self.smtp.quit() # 關(guān)閉郵件服務(wù)器
帶附件
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
mail = MIMEMultipart()
mail.attach(MIMEText('郵件正文', _subtype='html', _charset='utf-8'))
# 構(gòu)造附件att1鸦概,若是要帶多個(gè)附件,可根據(jù)下邊的格式構(gòu)造
att1 = MIMEText(open('文件', 'rb').read(), 'base64', 'utf-8')
att1['Content-Type'] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="%s"' % 文件名
mail.attach(att1)
mail['Subject'] = '郵件主題'
mail['From'] = '發(fā)件人地址' # 需與郵件服務(wù)器的認(rèn)證用戶一致
mail['To'] = '收件人地址'
smtp = smtplib.SMTP('smtp.qq.com', port=25) # 設(shè)置郵件服務(wù)器地址與端口
smtp.login('帳號', '密碼') # 登錄郵件服務(wù)器
smtp.sendmail('發(fā)件人地址', '收件人地址', mail.as_string()) # 發(fā)送郵件
self.smtp.quit() # 關(guān)閉郵件服務(wù)器
我將其構(gòu)造成一個(gè)類,以在構(gòu)造類時(shí)是否傳入file參數(shù)來判斷是否要帶附件窗市。
說明:
- 需要在郵件服務(wù)器上設(shè)置打開smtp功能先慷。
- SMTP服務(wù)器地址和端口可以在郵件服務(wù)器的設(shè)置里找到(在設(shè)置上邊 1 時(shí),應(yīng)該就可以看到)
- 發(fā)件人與登錄郵件服務(wù)器的認(rèn)證用戶應(yīng)該一致咨察,所以我把它寫死在代碼里了论熙。(或許使用一個(gè)常量定義會更好?)
- 若是多個(gè)收件人則需在to_email參數(shù)中用逗號隔開摄狱。另外:MIMEText()["To"]的數(shù)據(jù)類型與sendmail(from_addrs,to_addrs,...)的to_addrs不同脓诡;前者為str類型,多個(gè)地址使用逗號分隔媒役,后者為list類型祝谚。所以在sendmail()函數(shù)中使用split(',')來分離多個(gè)收件人。
代碼如下:
# -*- coding:utf-8 -*-
""" 發(fā)送郵件 """
import smtplib, os, base64
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from datetime import datetime
class Email(object):
"""
特意將附件變量寫成att1酣衷,是指若有多個(gè)附件交惯,可用同樣的格式再添加att2/att3:
att1 = MIMEText(f.read(), 'base64', 'utf-8')
att1['Content-Type'] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="%s"' % file_name
self.mail.attach(att1)
:param:to_email:收件人地址,多個(gè)收件人時(shí)用逗號隔開
:param:subject:郵件主題
:param:content:郵件內(nèi)容
:param:file:附件地址
"""
def __init__(self, to_email, subject, content, file=None):
self.file = file
if (self.file is not None) and (not os.path.exists(self.file)):
raise Exception('附件不存在')
# 構(gòu)造郵件
self.mail = MIMEMultipart()
self.mail.attach(MIMEText(content, _subtype='html', _charset='utf-8')) # 郵件內(nèi)容
self.mail['Subject'] = subject # 主題
self.mail['From'] = '****@qq.com' # 發(fā)件人
self.mail['To'] = to_email # 收件人
self.smtp = None
def sent(self):
f = None
try:
# 構(gòu)造附件并添加至郵件
if self.file is not None:
try:
with open(self.file, 'rb') as f:
att1 = MIMEText(f.read(), 'base64', 'utf-8')
except Exception as e:
raise Exception('附件讀取錯(cuò)誤')
else:
att1['Content-Type'] = 'application/octet-stream'
file_name = os.path.split(self.file)[-1]
# 下面一句是處理附件名為中文名
file_name = '=?utf-8?b?' + base64.b64encode(file_name.encode()).decode() + '?='
att1["Content-Disposition"] = 'attachment; filename="%s"' % file_name
self.mail.attach(att1)
self.smtp = smtplib.SMTP('smtp.qq.com', port=25) # 設(shè)置郵件服務(wù)器
self.smtp.login('****@qq.com', '****') # 登錄郵件服務(wù)器
self.smtp.sendmail(self.mail['From'], self.mail['To'].split(','), self.mail.as_string()) # 發(fā)送郵件
self.smtp.quit() # 關(guān)閉郵件服務(wù)器
print('send seccess')
return True
except:
print('send fail')
return False
email = Email(
to_email='****@qq.com',
subject='Test',
content='''
<b>測試測試</b><br>
這是我的Email模塊穿仪!
<center>send by python_mail</center>
''' + str(datetime.now())[:19]
# file='/1.png'
)
email.sent()
如果本文對您有幫助席爽,請給我留個(gè)言。謝謝啊片!