封裝自動發送郵件方法,本例以QQ郵箱舉例說明;
注意事項:QQ郵箱需要先獲得授權碼,請自行百度~
#代碼實作
import os
import smtplib
import traceback
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.header import Header
class SendEmail(object):
"""發送郵件類"""
def __init__(self,sender:str,passwd:str,senderName:str,subject:str,reciver:list,smtpserver="smtp.qq.com"):
"""
:param sender: 發件人郵箱,字元串類型;本例以qq郵箱舉例,可指定預設值
:param senderName:發件人姓名,字元串類型,可指定預設值;
:param subject: 郵件主題,字元串類型;
:param passwd: 發件人郵件密碼,字元串類型;本例為qq郵箱授權碼,可指定預設值
:param reciver: 清單類型
:param smtpserver: 預設值為stmp.qq.com
"""
self.sender=sender
self.passwd=passwd
self.senderName=senderName
self.subject=subject
self.reciver=reciver
self.smtpserver=smtpserver
self.smtp = smtplib.SMTP()
self.smtp.connect(self.smtpserver)
def __emailHeader(self):
"""
私有方法:郵件标頭
:return: 郵件對象
"""
message = MIMEMultipart()
message['From'] = Header(self.senderName, 'utf-8')
message["To"] = ";".join(self.reciver)
message['Subject'] = Header(self.subject, 'utf-8')
return message
def __connect(self,message):
"""
私有方法:執行登入、發送和退出動作
:param message: 郵件對象
"""
# 列印出和SMTP伺服器互動的所有資訊,可選擇
# self.smtp.set_debuglevel(1)
try:
self.smtp.login(self.sender,self.passwd)
self.smtp.sendmail(self.sender,self.reciver,message.as_string())
self.smtp.quit()
except Exception:
traceback.print_exc()
print ("郵件發送失敗!")
else:
print ("郵件發送成功!")
def sendText(self,text:str):
"""
發送純文字郵件
:param text: 文本内容
"""
textPlain = MIMEText(text, 'plain', 'utf-8')
message=self.__emailHeader()
message.attach(textPlain)
self.__connect(message)
def sendAttachment(self,text:str,*attachPath:str):
"""
發送任何形式的附件
:param text: 文本内容
:param attachPath: 附件路徑,相容多個附件形式
"""
textPlain = MIMEText(text, 'plain', 'utf-8')
message = self.__emailHeader()
message.attach(textPlain)
for attach in attachPath:
if not os.path.exists(attach):
print(" {0}附件路徑不存在".format(attach))
return
attachment = MIMEApplication(open(attach, 'rb').read())
attachment.add_header('Content-Disposition', 'attachment', filename=os.path.basename(attach))
message.attach(attachment)
self.__connect(message)