基于python SMTP實現(xiàn)自動發(fā)送郵件教程解析
最近工作中的一個項目需要自動發(fā)送一些信息郵件到指定郵箱的需求,那么如何實現(xiàn)Python自動發(fā)送郵件的功能呢?接下來我們就來簡單的介紹下如何利用Python來實現(xiàn)自動發(fā)送郵件的功能。
Python SMTP發(fā)送郵件
SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協(xié)議 ,說白了就是發(fā)送郵件的協(xié)議,python的smplib庫對SMTP協(xié)議進行了簡單的封裝,提供了對SMTP的支持,可以發(fā)送純文本郵件、HTML文件以及帶附件的郵件。
首先我們構(gòu)建一個SendEmailManager類,也是遵循著面向?qū)ο缶幊痰乃枷雭碜?,大體結(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):
# 登錄郵箱服務器
...
def _make_mail_msg(self):
# 構(gòu)建文本郵件對象
...
def do_send_mail(self):
# 郵件發(fā)送
...
def __init__(self, **kwargs)
類的初始化函數(shù),可以用來設置對象屬性,并給予初始值,可以是參數(shù)或者固定值 ,其中參數(shù)**kwargs是將一個可變的關鍵字參數(shù)的字典傳給函數(shù)實參,這里里我們主要是對SMTP服務器(這里使用qq郵箱)、發(fā)送郵件的代理郵箱、在郵箱中設置的客戶端授權密碼、可變參數(shù)進行一些初始化。具體代碼如下:
# SMTP服務器,這里使用qq郵箱,其他郵箱自行百度 EMAIL_HOST = 'smtp.qq.com' # 發(fā)送郵件的代理郵箱 EMAIL_HOST_USER = 'xxxx@xxxx.com' # 在郵箱中設置的客戶端授權密碼, 注意這里不是郵箱密碼,如何獲取郵箱授權碼,請看本文最后教程 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)
主要負責通過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ù)主要負責初始化 函數(shù)_get_conf 返回的配置參數(shù), 以便接下來的函數(shù)可以調(diào)用相關配置參數(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)
登錄郵件服務器, 我這里登陸的是qq郵箱的服務器,端口號為465,其他郵箱端口號請自行百度,代碼如下:
def _login_email(self):
# 登錄郵箱服務器
try:
server = smtplib.SMTP_SSL(self.email_host, port=465)
# set_debuglevel(1)可以打印出和SMTP服務器交互的所有信息
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)建一個郵件實例對象,來處理郵件的內(nèi)容。一封正常的郵件一般有收發(fā)件者信息,郵件主題,郵件正文,有些郵件還附帶有附件,具體的設置參見如下代碼:
def _make_mail_msg(self):
# 構(gòu)建郵件對象
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)造附件,傳送當前目錄下的文件
if not att:
break
att_i = MIMEText(open(att, 'rb').read(), 'base64', 'utf-8')
att_i["Content-Type"] = 'application/octet-stream'
# 這里的filename可以任意寫,寫什么名字,郵件中顯示什么名字
att_i["Content-Disposition"] = 'attachment; filename="%s"' % att
msg.attach(att_i)
return msg
def do_send_mail(self)
發(fā)送郵件,就是把上幾個函數(shù)串起來,直接上代碼:
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ù),測試能否正常發(fā)送郵件:
if __name__ == "__main__":
mail_conf = {
'msg_from': 'xxxx@qq.com', # 郵件發(fā)送者的地址
'receives': ['xxxx@qq.com', 'xxxxxxxx@xxxx.com', ], # 郵件接收者的地址,這是個list,因為郵件的接收者可能不止一個
'msg_subject': 'Python 自動發(fā)送郵件測試!!', # 郵件的主題
'msg_content': '人生苦短,我用python!!!', # 郵件的內(nèi)容
'attach_file_list': {"test_file1.py": "test.py", "test_file2.pem": "./public.pem"}, # 為附件文件路徑列表,也是個list,也可沒有這項
}
manager = SendEmailManager(**mail_conf)
manager.do_send_mail()

ok,發(fā)送成功,添加附件也是沒問題的。
開始我們講的獲取客戶端郵箱的授權碼,教程如下(以qq郵箱為例):

好了,目標完成。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
python使用openpyxl庫讀寫Excel表格的方法(增刪改查操作)
這篇文章主要介紹了python使用openpyxl庫讀寫Excel表格的方法(增刪改查操作),本文通過實例圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05
實例詳解Python中的numpy.abs和abs函數(shù)
Numpy是python中最有用的工具之一,它可以有效地處理大容量數(shù)據(jù),下面這篇文章主要給大家介紹了關于Python中numpy.abs和abs函數(shù)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-08-08
一文帶你了解Python中的type,isinstance和issubclass
這篇文章主要為大家詳細介紹了Python中的type、isinstance和issubclass的使用,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2023-01-01
python Tkinter實時顯示數(shù)據(jù)功能實現(xiàn)
這篇文章主要介紹了python Tkinter實時顯示數(shù)據(jù)功能實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
Python requests及aiohttp速度對比代碼實例
這篇文章主要介紹了Python requests及aiohttp速度對比代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07
pycharm 主題theme設置調(diào)整仿sublime的方法
今天小編就為大家分享一篇pycharm 主題theme設置調(diào)整仿sublime的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05

