基于python SMTP實(shí)現(xiàn)自動(dòng)發(fā)送郵件教程解析
最近工作中的一個(gè)項(xiàng)目需要自動(dòng)發(fā)送一些信息郵件到指定郵箱的需求,那么如何實(shí)現(xiàn)Python自動(dòng)發(fā)送郵件的功能呢?接下來(lái)我們就來(lái)簡(jiǎn)單的介紹下如何利用Python來(lái)實(shí)現(xiàn)自動(dòng)發(fā)送郵件的功能。
Python SMTP發(fā)送郵件
SMTP(Simple Mail Transfer Protocol)即簡(jiǎn)單郵件傳輸協(xié)議 ,說(shuō)白了就是發(fā)送郵件的協(xié)議,python的smplib庫(kù)對(duì)SMTP協(xié)議進(jìn)行了簡(jiǎn)單的封裝,提供了對(duì)SMTP的支持,可以發(fā)送純文本郵件、HTML文件以及帶附件的郵件。
首先我們構(gòu)建一個(gè)SendEmailManager類,也是遵循著面向?qū)ο缶幊痰乃枷雭?lái)做,大體結(jié)構(gòu)如下:
class SendEmailManager(object): def __init__(self, **kwargs): # 初始化參數(shù) ... def _get_conf(self, key): # 獲取配置參數(shù) ... def _init_conf(self): # 初始化配置參數(shù) ... def _login_email(self): # 登錄郵箱服務(wù)器 ... def _make_mail_msg(self): # 構(gòu)建文本郵件對(duì)象 ... def do_send_mail(self): # 郵件發(fā)送 ...
def __init__(self, **kwargs)
類的初始化函數(shù),可以用來(lái)設(shè)置對(duì)象屬性,并給予初始值,可以是參數(shù)或者固定值 ,其中參數(shù)**kwargs是將一個(gè)可變的關(guān)鍵字參數(shù)的字典傳給函數(shù)實(shí)參,這里里我們主要是對(duì)SMTP服務(wù)器(這里使用qq郵箱)、發(fā)送郵件的代理郵箱、在郵箱中設(shè)置的客戶端授權(quán)密碼、可變參數(shù)進(jìn)行一些初始化。具體代碼如下:
# SMTP服務(wù)器,這里使用qq郵箱,其他郵箱自行百度EMAIL_HOST = ’smtp.qq.com’# 發(fā)送郵件的代理郵箱EMAIL_HOST_USER = ’xxxx@xxxx.com’# 在郵箱中設(shè)置的客戶端授權(quán)密碼, 注意這里不是郵箱密碼,如何獲取郵箱授權(quán)碼,請(qǐng)看本文最后教程EMAIL_HOST_PASSWORD = ’xxxxxxxxxxxxx’def __init__(self, **kwargs): # 初始化參數(shù) self.email_host = EMAIL_HOST self.email_host_user = EMAIL_HOST_USER self.email_host_pass = EMAIL_HOST_PASSWORD self.kwargs = kwargs
def _get_conf(self, key)
主要負(fù)責(zé)通過(guò)key讀取 可變參數(shù)self.kwargs 字典里的值,供其他函數(shù)使用。
def _get_conf(self, key): # 獲取配置參數(shù) value = self.kwargs.get(key) if key != 'attach_file_list' and (value is None or value == ’’): raise Exception('configuration parameter ’%s’ cannot be empty' % key) return value
def _init_conf(self)
該函數(shù)主要負(fù)責(zé)初始化 函數(shù)_get_conf 返回的配置參數(shù), 以便接下來(lái)的函數(shù)可以調(diào)用相關(guān)配置參數(shù)。
def _init_conf(self): # 初始化配置參數(shù) print(self._get_conf(’receives’)) self.receives = self._get_conf(’receives’) self.msg_subject = self._get_conf(’msg_subject’) self.msg_content = self._get_conf(’msg_content’) self.msg_from = self._get_conf(’msg_from’) # attachment self.attach_file_list = self._get_conf(’attach_file_list’)
def _login_email(self)
登錄郵件服務(wù)器, 我這里登陸的是qq郵箱的服務(wù)器,端口號(hào)為465,其他郵箱端口號(hào)請(qǐng)自行百度,代碼如下:
def _login_email(self): # 登錄郵箱服務(wù)器 try: server = smtplib.SMTP_SSL(self.email_host, port=465) # set_debuglevel(1)可以打印出和SMTP服務(wù)器交互的所有信息 server.set_debuglevel(1) # 登錄郵箱 server.login(self.email_host_user, self.email_host_pass) return server except Exception as e: print('mail login exception:', e) raise e
def _make_mail_msg(self)
該函數(shù)的功能為構(gòu)建一個(gè)郵件實(shí)例對(duì)象,來(lái)處理郵件的內(nèi)容。一封正常的郵件一般有收發(fā)件者信息,郵件主題,郵件正文,有些郵件還附帶有附件,具體的設(shè)置參見(jiàn)如下代碼:
def _make_mail_msg(self): # 構(gòu)建郵件對(duì)象 msg = MIMEMultipart() msg.attach(MIMEText(self.msg_content, ’plain’, ’utf-8’)) # 郵件主題 msg[’Subject’] = Header(self.msg_subject, 'utf-8') # 發(fā)件人郵箱信息 msg[’From’] = '<%s>' % self.msg_from # msg[’From’] = Header(self.msg_from + '<%s>' % self.email_host_user, 'utf-8') msg[’To’] = ','.join(self.receives) print('---', self.attach_file_list) if self.attach_file_list: for i, att in enumerate(self.attach_file_list): # 構(gòu)造附件,傳送當(dāng)前目錄下的文件 if not att:break att_i = MIMEText(open(att, ’rb’).read(), ’base64’, ’utf-8’) att_i['Content-Type'] = ’application/octet-stream’ # 這里的filename可以任意寫(xiě),寫(xiě)什么名字,郵件中顯示什么名字 att_i['Content-Disposition'] = ’attachment; filename='%s'’ % att msg.attach(att_i) return msg
def do_send_mail(self)
發(fā)送郵件,就是把上幾個(gè)函數(shù)串起來(lái),直接上代碼:
def do_send_mail(self): # 郵件發(fā)送 try: self._init_conf() server = self._login_email() msg = self._make_mail_msg() server.sendmail(self.email_host_user, self.receives, msg.as_string()) server.close() print('發(fā)送成功!') except Exception as e: print('郵件發(fā)送異常', e)
配置參數(shù),測(cè)試能否正常發(fā)送郵件:
if __name__ == '__main__': mail_conf = { ’msg_from’: ’xxxx@qq.com’, # 郵件發(fā)送者的地址 ’receives’: [’xxxx@qq.com’, ’xxxxxxxx@xxxx.com’, ], # 郵件接收者的地址,這是個(gè)list,因?yàn)猷]件的接收者可能不止一個(gè) ’msg_subject’: ’Python 自動(dòng)發(fā)送郵件測(cè)試!!’, # 郵件的主題 ’msg_content’: ’人生苦短,我用python!!!’, # 郵件的內(nèi)容 ’attach_file_list’: {'test_file1.py': 'test.py', 'test_file2.pem': './public.pem'}, # 為附件文件路徑列表,也是個(gè)list,也可沒(méi)有這項(xiàng) } manager = SendEmailManager(**mail_conf) manager.do_send_mail()
ok,發(fā)送成功,添加附件也是沒(méi)問(wèn)題的。
開(kāi)始我們講的獲取客戶端郵箱的授權(quán)碼,教程如下(以qq郵箱為例):
好了,目標(biāo)完成。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. .NET中l(wèi)ambda表達(dá)式合并問(wèn)題及解決方法2. CSS hack用法案例詳解3. PHP設(shè)計(jì)模式中工廠模式深入詳解4. ASP.NET MVC遍歷驗(yàn)證ModelState的錯(cuò)誤信息5. Ajax實(shí)現(xiàn)表格中信息不刷新頁(yè)面進(jìn)行更新數(shù)據(jù)6. asp(vbs)Rs.Open和Conn.Execute的詳解和區(qū)別及&H0001的說(shuō)明7. 解決AJAX返回狀態(tài)200沒(méi)有調(diào)用success的問(wèn)題8. ThinkPHP5實(shí)現(xiàn)JWT Token認(rèn)證的過(guò)程(親測(cè)可用)9. JSP數(shù)據(jù)交互實(shí)現(xiàn)過(guò)程解析10. ASP 信息提示函數(shù)并作返回或者轉(zhuǎn)向
