本文介紹了郵件傳輸的SMTP協議,並根據該協議,利用了Python的‘smtplib’和‘email‘模塊,完成郵件的成功發送。
工具/原料
python,email模塊,smtplib模塊
方法/步驟
首先了解SMTP(簡單郵件傳輸協議),郵件傳送代理程序使用SMTP協議來發送電郵到接收者的郵件服務器。SMTP協議只能用來發送郵件,不能用來接收郵件,而大多數的郵件發送服務器都是使用SMTP協議。SMTP協議的默認TCP端口號是25。
本文主要介紹利用'smtplib','email'兩個模塊來實現郵件的發送,可以如下查看兩個模塊的函數和方法:
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"指令。(重要!)
常用的函數方法:
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對象的主體文本。
獲得所需要使用的郵箱的host地址和port端口號,(本文使用的是163郵箱,對應的smtp服務器地址:mail.163.com,端口號25)
常用郵箱的smtp服務器地址和端口號如圖:
編寫程序如下:
#! /usr/bin/env python
import smtpli
from email.mime.text import MIMEText
mailto_list=['[email protected]'] #收件人(列表)
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文件,可以得到如圖所是的結果,代表郵件發送成功。
這樣,就能成功實現用Python發送郵件啦!可以看到接收端接收到的郵件如: