利用Python實現郵件的發送?

Tags: 郵件, 協議,

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

利用Python實現郵件的發送

工具/原料

python,email模塊,smtplib模塊

方法/步驟

首先了解SMTP(簡單郵件傳輸協議),郵件傳送代理程序使用SMTP協議來發送電郵到接收者的郵件服務器。SMTP協議只能用來發送郵件,不能用來接收郵件,而大多數的郵件發送服務器都是使用SMTP協議。SMTP協議的默認TCP端口號是25。

利用Python實現郵件的發送

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

利用Python實現郵件的發送

利用Python實現郵件的發送

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"指令。(重要!)

常用的函數方法:

利用Python實現郵件的發送

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對象的主體文本。

利用Python實現郵件的發送

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

常用郵箱的smtp服務器地址和端口號如圖:

利用Python實現郵件的發送

編寫程序如下:

#! /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實現郵件的發送

利用Python實現郵件的發送

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

利用Python實現郵件的發送

相關問題答案