[Python] [郵件發送] 用Python的smtplib和email庫進行郵件發送

目錄

1.Intro

2.Details

3.Theory

4.Environment

5.Source

6.Conclusion


1.Intro

眼看就到了12月中旬,除了幫朋友碼競賽題,前半個月可以說是划水摸魚抓夢jio。

這段時間面試了幾個人,趕腳什麼人都敢往開發靠啊兄弟,

第一個是某傳媒學校畢業的,自學了幾年Java,然後幹了幾年的收銀和消防救火員.... Pass

第二個都37了(大哥你確定要從基層做起???),學歷牌子很硬,但工作後沒有什麼像樣的項目成果 Pass

第三個前某科技公司的CTO...CTO......你乾的好好的離什麼職哦,來應聘研發總監,原來做電商的,後來搞大數據,寫過人臉識別的算法,我多嘴的問了幾句關於Map Reduce的具體實現,包括怎麼用Yarn來調度資源,是否有用到Spark參與計算以及人臉識別框架和算法的技術細節等等,就是這種外行問題,人家說他負責搭建環境和整個項目的協同管理,一看公司名,再看他的專業(材料化學),哦,然後我就明白了。Pass

還有不少.....

                                                              


2.Details

用smtplib和email庫進行郵件發送,在之前寫的爬蟲模塊裏就有了,這裏單獨做一個具體的介紹。

如何開啓郵箱的SMTP服務?

以QQ爲例:


3.Theory

(1) smtplib

SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,是在Internet傳輸email的事實標準,是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。說白了,就是email要在網上傳輸,需要遵循SMTP協議和規範,就和TCP/IP協議、HTTP協議一個道理。

Python的smtplib提供了一種很方便的途徑發送電子郵件,對smtp協議進行了簡單的封裝。

創建 SMTP 對象:

import smtplib
email = smtplib.SMTP(host, port, local_hostname)
參數說明:
    1.host:可選。一般要指定。SMTP服務器主機,可以指定主機ip地址或域名,如 smtp.qq.com、smtp.163.com 等。
    2.port:可選。host指定了就需要指定端口號,一般端口號爲25,QQ郵箱的ssl端口爲465。
    3.local_hostname:可選。如果SMTP服務器設置在了本機上,就指定服務器地址爲localhost。

Eg:
smtp_server = 'smtp.qq.com'
email = smtplib.SMTP_SSL(host=smtp_server, port=465)

登錄SMTP服務器:

login_code = email.login(from_mail, mail_pass)
參數說明
    1.from_mail:發送方的郵箱地址
    2.mail_pass:SMTP服務授權碼(在郵箱裏開啓SMTP服務時生成)
返回一個元組,包含登錄狀態碼和登錄結果。

Eg:
login_code = email.login(from_mail, mail_pass)
# 返回(235, 'Authentication successful')

發送郵件:

email.sendmail(from_mail, to_mail, msg)
    1.from_mail:郵件發送者地址
    2.to_mail:郵件接收者地址
    3.msg:發送消息

Eg:
email.sendmail(from_mail, to_mail, msg.as_string())
email.quit()

2.email

email軟件包是用於管理電子郵件、處理郵件消息的庫,包括MIME和其他一些基於RFC 2822的消息文檔。

這裏主要用到的是MIME擴展類型,即MIME消息格式,可支持非ASCII字符文本,非文本格式附件,由多部分組成的消息體和包含非ASCII字符的頭信息。

(1)字符文本:郵件主體,即郵件主要內容。

(2)附件:本機文件,可以是二進制、圖像、音頻、視頻等,不要超過郵件服務器聲明的最大上傳大小。

(3)消息體:有text/plain(純文本)、text/html(超文本)、image/jpeg(jpg圖片)、video/mp4(mp4視頻)等多種獨立類型,在郵件頭部用“Content-Type”域作爲標識,其中這些消息體可以分爲多段,稱作multipart,每個段包括段頭段尾,它分爲三種類型,分別是multipart/mixed(附件)、multipart/alternative(文本)、multipart/related(內嵌)。

(4)頭信息:包括發件人、收件人、主題、日期、郵件內容類型等信息。


4.Environment

Environment:Windows All

Language:Python 2.7.14

IDE:Pycharm 2018


5.Source

import smtplib  # SMTP庫
from email.mime.text import MIMEText  # 文本郵件對象
from email.mime.multipart import MIMEMultipart  # 多個對象的組合,包括文本、附件等
from email.header import Header  # 郵件名對象
from email import encoders  # 編碼器
from email.mime.base import MIMEBase  # 附件構造對象
from email.utils import parseaddr, formataddr  # 郵件規約與格式化

class Data_Sender(object):
    def __init__(self):
        print("[*] Initialize email send module..")

    def format_address(self, address):
        '''
        格式化郵件地址
        :param address: 郵件地址
        :return: 格式化後的郵件地址
        '''
        print("[+] Formatting email address..")
        name, addr = parseaddr(address)
        print("[+] Format done.")
        return formataddr((Header(name, 'utf-8').encode(), addr))

    def send_mail(self, body, attachment):
        '''
        發送郵件
        :param body: 郵件正文
        :param attachment: 附件地址
        :return: 發送成功返回True
        '''
        print("[+] Begin to send email...")
        # 要發送的服務器
        smtp_server = 'smtp.qq.com'  # 可以選擇別的服務器,如 smtp.163.com
        # 要發送的郵箱用戶名/密碼
        from_mail = '發送方的郵箱'
        mail_pass = 'SMTP服務密碼'
        # 接收的郵箱
        to_mail = '接收方的郵箱'

        # 構造一個 MIMEMultipart 對象代表郵件本身
        msg = MIMEMultipart()

        # Header 對中文進行轉碼
        msg['From'] = self.format_address('發件人地址標識 <%s>' % from_mail).encode()
        msg['To'] = to_mail
        msg['Subject'] = Header('郵件名', 'utf-8').encode()

        # # plain 代表純文本
        msg.attach(MIMEText(body, 'plain', 'utf-8'))
        # 二進制方式模式文件
        if len(attachment) != 0:
            for file_path in attachment:
                with open(file_path, 'rb') as picture:
                    # MIMEBase 表示附件的名字
                    mime = MIMEBase(file_path[str(file_path).rfind('\\') + 1: -4], 'xls',
                                    filename=file_path[str(file_path).rfind('\\') + 1:])

                    # filename 是顯示附件名字
                    mime.add_header('Content-Disposition', 'attachment',
                                    filename=file_path[str(file_path).rfind('\\') + 1:])

                    # 獲取附件內容
                    mime.set_payload(picture.read())
                    encoders.encode_base64(mime)

                    # 作爲附件添加到郵件
                    msg.attach(mime)

        print("[+] Connecting SMTP server")
        # 創建SMTP對象
        email = smtplib.SMTP_SSL(smtp_server, 465)
        print("[+] Connect successfully.")
        print("[+] Licensing SMTP server")
        # 登錄SMTP服務器
        login_code = email.login(from_mail, mail_pass)
        if login_code[0] is 235:
            print("[+] Successfully!")
        else:
            print("[-] Failed!")
            return False
        try:
            # as_string()把 MIMEText 對象變成 str
            print("[*] Sending email..")
            # 發送郵件
            email.sendmail(from_mail, to_mail, msg.as_string())
            email.quit()
            print("[+] Successfully!")
            return True
        except Exception as e:
            print("[-] Failed!")
            print("ERROR: " + str(e.message))
            return False


6.Conclusion

不發GIS開發相關,天天不務正業說的就是本猿。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章