首頁 > 網際網路

利用Python實現郵件的傳送

2019-12-01 05:51:20

本文介紹了郵件傳輸的SMTP協定,並根據該協定,利用了Python的‘smtplib’和‘email‘模組,完成郵件的成功傳送。


1

    首先了解SMTP(簡單郵件傳輸協定),郵件傳送代理程式使用SMTP協定來傳送電郵到接收者的郵件伺服器。SMTP協定只能用來傳送郵件,不能用來接收郵件,而大多數的郵件傳送伺服器都是使用SMTP協定。SMTP協定的預設TCP埠號是25。


2

    本文主要介紹利用'smtplib','email'兩個模組來實現郵件的傳送,可以如下檢視兩個模組的函數和方法:



3

smtplib模組簡介:

smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])

   此為SMTP類建構函式,表示與SMTP伺服器之間的連線,並根據這個連線向smtp伺服器傳送指令,執行相關操作(如:登陸、傳送郵件),且每個引數都是可選的。

     其中最重要的引數:

     host:smtp伺服器主機名

     port:smtp服務的埠,預設是25;

如果在建立SMTP物件的時候提供了這兩個引數,在初始化的時候會自動呼叫connect方法去連線伺服器。

smtplib.SMTP還提供了如下方法:

     SMTP.set_debuglevel(level):設定是否為偵錯模式

     SMTP.connect([host[, port]]):連線到指定的smtp伺服器。引數分別表示 smpt主機和埠。

     SMTP.docmd(cmd[, argstring]):向smtp伺服器傳送指令。

     SMTP.helo([hostname]) :使用"helo"指令向伺服器確認身份。

     SMTP.login(user, password):登陸到smtp伺服器。現在幾乎所有smtp伺服器,都必須在驗證使用者資訊合法之後才允許傳送郵件。(重要!)

     SMTP.sendmail(from_addr,to_addrs,msg[,mail_options,rcpt_options]):傳送郵件。這裡要注意一下第三個引數,msg是字串,表示郵件。我們知道郵件一般由標題,發信人,收件人,郵件內容,附件等構成,傳送郵件的時候,要注意msg的格式。這個格式就是smtp協定中定義的格式。SMTP.quit() :斷開與smtp伺服器的連線,相當於傳送"quit"指令。(重要!)

常用的函數方法:


4

email模組   

1.class email.message.Message

    __getitem__,__setitem__實現obj[key]形式的存取。

    Msg.attach(playload): 向當前Msg新增playload。

    Msg.set_playload(playload): 

    Msg.add_header(_name, _value, **_params): 新增郵件頭欄位。

2.class email.mime.base.MIMEBase(_maintype, _subtype, **_params)

    所有MIME類的基礎類別,是email.message.Message類的子類。

3.class email.mime.multipart.MIMEMultipart()

    在3.0版本的email模組 (Python 2.3-Python 2.5) 中,這個類位於email.MIMEMultipart.MIMEMult    ipart。這個類是MIMEBase的直接子類,用來生成包含多個部分的郵件體的MIME物件。

4.class email.mime.text.MIMEText(_text)

    使用字串_text來生成MIME物件的主體文字。


5

    獲得所需要使用的郵箱的host地址和port埠號,(本文使用的是163郵箱,對應的smtp伺服器地址:mail.163.com,埠號25)

常用郵箱的smtp伺服器地址和埠號如圖:


6

編寫程式如下:

#! /usr/bin/env python  

import smtpli

from email.mime.text import MIMEText

mailto_list=['xxxx@xxx.com']           #收件人(列表)

mail_host="smtp.163.com"            #使用的郵箱的smtp伺服器地址

mail_user="name"                           #使用者名稱

mail_pass="pwd"                             #密碼

mail_postfix="postfix"                     #郵箱的字尾

def send_mail(to_list,sub,content):

    me="hello"+"<"+mail_user+"@"+mail_postfix+">"

    msg = MIMEText(content,_subtype='plain')

    msg['Subject'] = sub

    msg['From'] = me

    msg['To'] = ";".join(to_list)                #將收件人列表以‘;’分隔

    try:

        server = smtplib.SMTP()

        server.connect(mail_host)                            #連線伺服器

        server.login(mail_user,mail_pass)               #登入操作

        server.sendmail(me, to_list, msg.as_string())

        server.close()

        return True

    except Exception, e:

        print str(e)

        return False

for i in range(5):                             #傳送五封,不過會被攔截的。。。

    if send_mail(mailto_list,"hello","haha!"):  #郵件主題和郵件內容

        print "done!"

    else:

        print "failed!"

最後,可以執行編寫的py檔案,可以得到如圖所是的結果,代表郵件傳送成功。



7

這樣,就能成功實現用Python傳送郵件啦!可以看到接收端接收到的郵件如:



IT145.com E-mail:sddin#qq.com