天天看點

python~實作郵箱自動發送郵件

封裝自動發送郵件方法,本例以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)