python 使用SMTP發(fā)送郵件[HTML格式概荷,帶附件]

今天百度學(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ù)來判斷是否要帶附件窗市。

說明:
  1. 需要在郵件服務(wù)器上設(shè)置打開smtp功能先慷。
  2. SMTP服務(wù)器地址和端口可以在郵件服務(wù)器的設(shè)置里找到(在設(shè)置上邊 1 時(shí),應(yīng)該就可以看到)
  3. 發(fā)件人與登錄郵件服務(wù)器的認(rèn)證用戶應(yīng)該一致咨察,所以我把它寫死在代碼里了论熙。(或許使用一個(gè)常量定義會更好?)
  4. 若是多個(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è)言。謝謝啊片!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末只锻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子紫谷,更是在濱河造成了極大的恐慌齐饮,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碴里,死亡現(xiàn)場離奇詭異沈矿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)咬腋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門羹膳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人根竿,你說我怎么就攤上這事陵像。” “怎么了寇壳?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵醒颖,是天一觀的道長。 經(jīng)常有香客問我壳炎,道長泞歉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮腰耙,結(jié)果婚禮上榛丢,老公的妹妹穿的比我還像新娘。我一直安慰自己挺庞,他們只是感情好晰赞,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著选侨,像睡著了一般掖鱼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上援制,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天戏挡,我揣著相機(jī)與錄音,去河邊找鬼隘谣。 笑死增拥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寻歧。 我是一名探鬼主播掌栅,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼码泛!你這毒婦竟也來了猾封?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤噪珊,失蹤者是張志新(化名)和其女友劉穎晌缘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痢站,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磷箕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了阵难。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岳枷。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖呜叫,靈堂內(nèi)的尸體忽然破棺而出空繁,到底是詐尸還是另有隱情,我是刑警寧澤朱庆,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布盛泡,位于F島的核電站,受9級特大地震影響娱颊,放射性物質(zhì)發(fā)生泄漏傲诵。R本人自食惡果不足惜凯砍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掰吕。 院中可真熱鬧果覆,春花似錦颅痊、人聲如沸殖熟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菱属。三九已至,卻和暖如春舰罚,著一層夾襖步出監(jiān)牢的瞬間纽门,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工营罢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赏陵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓饲漾,卻偏偏與公主長得像蝙搔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子考传,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容