python3html
pycharmpython
利用smtplib及SMTP服務器進行自動發送郵件服務器
能夠發送普通文本的正文、html格式的正文併發
能夠添加單個附件,多個附件app
import smtplib from email.mime.text import MIMEText from email.header import Header from email.mime.multipart import MIMEMultipart import re # 提取文件路徑中的文件名 def file_name(path): ''' 提取文件路徑中的文件名稱 :param path:文件路徑 :return:文件名稱 ''' reg = r'([^<>/\\\|:""\*\?]+\.\w+$)' result = re.compile(reg).findall(path)[0] return result class Mail: def __init__(self,user='xxxx@yy.com', password='********', receivers=None): ''' 初始化郵件,指定誰發送,發送給誰 :param user:發送人郵箱 :param password:郵箱密碼,若qq郵箱,則爲受權碼 :param receivers:收件人,若多個收件人,寫成列表形式 ''' #肯定發送人 self.user = user # 發件人郵箱 self.password = password # 發件人密碼 #根據郵箱判斷服務器、正則匹配 reg = r"@(.+?).com" result=re.compile(reg).findall(user)[0] if result == 'qq': self.host='smtp.qq.com' if result == 'fulaan': self.host='smtp.exmail.qq.com' if result == '163': self.host='smtp.163.com' if result == '126': self.host='smtp.126.com' if result == '188': self.host='smtp.188.com' if result == 'netease': self.host='smtp.netease.com' if result == 'yeah': self.host='smtp.yeah.net' if result == 'gmail': self.host='smtp.gmail.com' # 肯定接收人,爲列表形式,若多個接收人,則在列表中加入多個元素 if receivers == None: raise Exception('Error:請輸入收件人') elif isinstance(receivers,str) == True: # 判斷傳入的receviers類型,若不是列表,轉換爲列表 self.receivers = receivers.split() elif isinstance(receivers,list) == True: self.receivers = receivers def send(self,Subject,Content,From,type='plain',payload=None): ''' 指定發送內容(正文,擡頭),是否添加附件 :param Subject:郵件標題 :param Content:郵件正文 :param From: 從哪裏發來 :param type:正文格式,html 或者 plain :param payload:附件,默認爲None,無附件;若要一併發送附件,該參數請輸入附件路徑;多個寫成列表 :發送郵箱默認爲發件人的郵箱 :return: ''' To = ','.join(self.receivers) # 發給誰,默認填寫發件人郵箱 # 不添加附件 if payload == None: message = MIMEText(Content, type, 'utf-8') # 建立一個不帶附件的實例,加入正文 message['Subject'] = Header(Subject, 'utf-8') # 加入標題 message['From'] = Header(From, 'utf-8') # 加入From message['To'] = Header(To, 'utf-8') # 加入To # 添加附件 else: message = MIMEMultipart() # 構造一個帶附件的實例 message.attach(MIMEText(Content, type, 'utf-8')) # 加入正文 message['Subject'] = Header(Subject, 'utf-8') # 加入標題 message['From'] = Header(From, 'utf-8') # 加入From message['To'] = Header(To, 'utf-8') # 加入To #判斷附件個數,若爲1個,轉爲列表 if isinstance(payload,str) == True: list=payload.split() elif isinstance(payload,list) == True: list=payload # 構造附件 for i in list: payload_add = MIMEText(open('{}'.format(i), 'rb').read(), 'base64', 'utf-8') # 選擇附件 payload_add["Content-Type"] = 'application/octet-stream' # 定義附件類型 payload_add.add_header( 'Content-Disposition', 'attachment', filename=('gbk', '', file_name(i)) # 所發出的文件名默認爲原文件名,這裏要加入編碼設置,否則中文會顯示亂碼 ) # 加入附件 message.attach(payload_add) # 一個附件,執行一次;多個附件,執行屢次 # 鏈接服務器,而且發送郵件 try: smtp = smtplib.SMTP() smtp.connect(self.host) smtp.login(self.user, self.password) smtp.sendmail(self.user, self.receivers, message.as_string()) print('發送成功!') except: raise Exception('Error:發送失敗,請檢查密碼是否正確,郵箱是否開啓SMTP服務,正文格式')
使用測試
from mail import Mail mail=Mail(receivers='4903xxxxxx@qq.com') #user、password使用默認值 mail.send( Subject='python test', Content='<html><p style="color: red">你好,這是一封測試郵件!!!</p></html>', From='xxxx', type='html', payload="D:\hello\\test\\2019-1-16測試報告.txt" )
---------------
發送成功!
注:若要使用smtplib發送郵件,發送的郵箱需進行設置,開啓SMTP服務,方可進行發送編碼