smtplib

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服務,方可進行發送編碼

相關文章
相關標籤/搜索