最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python3利用SMTP協(xié)議發(fā)送E-mail電子郵件的方法

 更新時(shí)間:2017年09月30日 11:48:41   作者:阿阿阿阿阿阿鑫  
SMTP(Simple Mail Transfer Protocol)即簡(jiǎn)單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來(lái)控制信件的中轉(zhuǎn)方式。下面這篇文章主要給大家介紹了關(guān)于Python3如何利用SMTP協(xié)議發(fā)送E-mail電子郵件的方法,需要的朋友可以參考下。

前言

本文主要給大家介紹了關(guān)于Python3用SMTP協(xié)議發(fā)送電子郵件的相關(guān)內(nèi)容,在介紹如何使用python程序向指定郵箱發(fā)送郵件之前,我們需要先介紹一下有關(guān)電子郵件的相關(guān)知識(shí)。

Email的歷史比Web還要久遠(yuǎn),直到現(xiàn)在,Email也是互聯(lián)網(wǎng)上應(yīng)用非常廣泛的服務(wù)。

幾乎所有的編程語(yǔ)言都支持發(fā)送和接收電子郵件,但是,先等等,在我們開始編寫代碼之前,有必要搞清楚電子郵件是如何在互聯(lián)網(wǎng)上運(yùn)作的。

假設(shè)我們自己的電子郵件地址是me@163.com,對(duì)方的電子郵件地址是friend@sina.com,現(xiàn)在我們用Outlook或者Foxmail之類的軟件寫好郵件,填上對(duì)方的Email地址,點(diǎn)“發(fā)送”,電子郵件就發(fā)出去了。這些電子郵件軟件被稱為MUA:Mail User Agent——郵件用戶代理。

Email從MUA發(fā)出去,不是直接到達(dá)對(duì)方電腦,而是發(fā)到MTA:Mail Transfer Agent——郵件傳輸代理,就是那些Email服務(wù)提供商,比如網(wǎng)易、新浪等等。由于我們自己的電子郵件是163.com,所以,Email首先被投遞到網(wǎng)易提供的MTA,再由網(wǎng)易的MTA發(fā)到對(duì)方服務(wù)商,也就是新浪的MTA。這個(gè)過程中間可能還會(huì)經(jīng)過別的MTA,但是我們不關(guān)心具體路線,我們只關(guān)心速度。

Email到達(dá)新浪的MTA后,由于對(duì)方使用的是@sina.com的郵箱,因此,新浪的MTA會(huì)把Email投遞到郵件的最終目的地MDA:Mail Delivery Agent——郵件投遞代理。Email到達(dá)MDA后,就靜靜地躺在新浪的某個(gè)服務(wù)器上,存放在某個(gè)文件或特殊的數(shù)據(jù)庫(kù)里,我們將這個(gè)長(zhǎng)期保存郵件的地方稱之為電子郵箱。對(duì)方要取到郵件,必須通過MUA從MDA上把郵件取到自己的電腦上。

所以,一封電子郵件的旅程就是:

發(fā)件人 -> MUA -> MTA -> MTA -> 若干個(gè)MTA -> MDA <- MUA <- 收件人

有了上述基本概念,要編寫程序來(lái)發(fā)送和接收郵件,本質(zhì)上就是:

      1.編寫MUA把郵件發(fā)到MTA。

      2.編寫MUA從MDA上收郵件。

發(fā)郵件時(shí),MUA和MTA使用的協(xié)議就是SMTP:Simple Mail Transfer Protocol,后面的MTA到另一個(gè)MTA也是用SMTP協(xié)議。

收郵件時(shí),MUA和MDA使用的協(xié)議有兩種:POP:Post Office Protocol,目前版本是3,俗稱POP3;IMAP:Internet Message Access Protocol,目前版本是4,優(yōu)點(diǎn)是不但能取郵件,還可以直接操作MDA上存儲(chǔ)的郵件,比如從收件箱移到垃圾箱,等等。

郵件客戶端軟件在發(fā)郵件時(shí),會(huì)讓你先配置SMTP服務(wù)器,也就是你要發(fā)到哪個(gè)MTA上。假設(shè)你正在使用163的郵箱,你就不能直接發(fā)到新浪的MTA上,因?yàn)樗环?wù)新浪的用戶,所以,你得填163提供的SMTP服務(wù)器地址:smtp.163.com,為了證明你是163的用戶,SMTP服務(wù)器還要求你填寫郵箱地址和郵箱口令,這樣,MUA才能正常地把Email通過SMTP協(xié)議發(fā)送到MTA。

類似的,從MDA收郵件時(shí),MDA服務(wù)器也要求驗(yàn)證你的郵箱口令,確保不會(huì)有人冒充你收取你的郵件,所以,Outlook之類的郵件客戶端會(huì)要求你填寫POP3或IMAP服務(wù)器地址、郵箱地址和口令,這樣,MUA才能順利地通過POP或IMAP協(xié)議從MDA取到郵件。

最后特別注意:目前大多數(shù)郵件服務(wù)商都需要手動(dòng)打開SMTP發(fā)信和POP收信的功能,否則只允許在網(wǎng)頁(yè)登錄:

比如QQ郵箱

接下來(lái),我們開始我們的正題,如何通過python發(fā)送電子郵件。

--------------------------------------------------------------------------------

發(fā)送簡(jiǎn)單文本郵件

SMTP是發(fā)送郵件的協(xié)議,Python內(nèi)置對(duì)SMTP的支持,可以發(fā)送純文本郵件、HTML郵件以及帶附件的郵件。

Python對(duì)SMTP支持有smtplib和email兩個(gè)模塊,email負(fù)責(zé)構(gòu)造郵件,smtplib負(fù)責(zé)發(fā)送郵件。

首先,我們來(lái)構(gòu)造一個(gè)最簡(jiǎn)單的純文本郵件:

from email.mime.text import MIMEText
msg = MIMEText('hello, this is axin...', 'plain', 'utf-8')

注意:到構(gòu)造MIMEText對(duì)象時(shí),第一個(gè)參數(shù)就是郵件正文,第二個(gè)參數(shù)是MIME的subtype,傳入'plain'表示純文本,最終的MIME就是'text/plain',最后一定要用utf-8編碼保證多語(yǔ)言兼容性。

我們光有了正文內(nèi)容還不可以,我們還需要給我們要發(fā)送的郵件添加頭部信息。頭部信息中包含發(fā)送者和接收者以及郵件主題等信息。

msg = MIMEText('hello, this is axin...', 'plain', 'utf-8') #郵件正文
msg['From'] = _format_addr('阿鑫 <%s>' % from_addr) #郵件頭部,發(fā)送者信息
msg['To'] = _format_addr('aa <%s>' % to_addr) #接收者信息
msg['Subject'] = Header('test', 'utf-8').encode() #郵件主題

構(gòu)造完我們要發(fā)送的信息后,我們只需要調(diào)用python對(duì)應(yīng)的函數(shù),通過SMTP發(fā)出去:

server = smtplib.SMTP(smtp_server, 25) #SMTP協(xié)議默認(rèn)端口是25
server.set_debuglevel(1) #打印出和SMTP服務(wù)器交互的所有信息
server.login(from_addr, password) #登錄SMTP服務(wù)器
server.sendmail(from_addr, [to_addr], msg.as_string()) #發(fā)送郵件
server.quit()

我們用set_debuglevel(1)就可以打印出和SMTP服務(wù)器交互的所有信息。SMTP協(xié)議就是簡(jiǎn)單的文本命令和響應(yīng)。login()方法用來(lái)登錄SMTP服務(wù)器,sendmail()方法就是發(fā)郵件,由于可以一次發(fā)給多個(gè)人,所以傳入一個(gè)list,郵件正文是一個(gè)str,as_string()把MIMEText對(duì)象變成str。

完整代碼示例如下:

from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

import smtplib

def _format_addr(s): #格式化一個(gè)郵件地址
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))

from_addr = 'fengxinlinux@sina.com' #發(fā)送者郵箱地址
password = '******' #發(fā)送者郵箱密碼,不告訴你密碼=。=
to_addr = '903087053@qq.com' #接收者郵箱地址
smtp_server = 'smtp.sina.com' #發(fā)送者所在的郵箱供應(yīng)商的MTA地址
#from_addr = input('From: ')
#password = input('Password: ')
#to_addr = input('To: ')
#smtp_server = input('SMTP server: ')

msg = MIMEText('hello, this is axin...', 'plain', 'utf-8') #郵件正文
msg['From'] = _format_addr('阿鑫 <%s>' % from_addr) #郵件頭部,發(fā)送者信息
msg['To'] = _format_addr('axin <%s>' % to_addr) #接收者信息
msg['Subject'] = Header('test', 'utf-8').encode() #郵件主題


server = smtplib.SMTP(smtp_server, 25) # SMTP協(xié)議默認(rèn)端口是25
server.set_debuglevel(1) #打印出和SMTP服務(wù)器交互的所有信息
server.login(from_addr, password) #登錄SMTP服務(wù)器
server.sendmail(from_addr, [to_addr], msg.as_string()) #發(fā)送郵件
server.quit()
1

運(yùn)行程序,我們會(huì)發(fā)現(xiàn)我測(cè)試的郵箱中收到了一封新的郵件。

我們會(huì)發(fā)現(xiàn),其他的信息都一樣,但是收件人的信息不是我們程序里填寫的axin。

因?yàn)楹芏噜]件服務(wù)商在顯示郵件時(shí),會(huì)把收件人名字自動(dòng)替換為用戶注冊(cè)的名字,但是其他收件人名字的顯示不受影響。

我在測(cè)試時(shí),有時(shí)候發(fā)送的郵件會(huì)被郵件服務(wù)商判定為垃圾郵件,直接被放到垃圾箱中了。。。至于什么情況會(huì)被認(rèn)定為垃圾郵件,我也摸不到頭緒。。

發(fā)送帶附件的郵件

上面我們介紹了如何發(fā)送文本郵件,有了上面的知識(shí)后,發(fā)送帶有附件的郵件其實(shí)也非常的簡(jiǎn)單。

帶附件的郵件可以看做包含若干部分的郵件:文本和各個(gè)附件本身,所以,可以構(gòu)造一個(gè)MIMEMultipart對(duì)象代表郵件本身,然后往里面加上一個(gè)MIMEText作為郵件正文,再繼續(xù)往里面加上表示附件的MIMEBase對(duì)象即可:

# 郵件對(duì)象:
msg= MIMEMultipart()
msg['From'] = _format_addr('阿鑫 <%s>' % from_addr) #郵件頭部,發(fā)送者信息
msg['To'] = _format_addr('axin <%s>' % to_addr) #接收者信息
msg['Subject'] = Header('test', 'utf-8').encode() #郵件主題

# 郵件正文是MIMEText:
msg.attach(MIMEText('hello, this is axin...', 'plain', 'utf-8'))

# 添加附件就是加上一個(gè)MIMEBase,從本地讀取一個(gè)圖片:
with open('/home/fengxin/圖片/11.jpg','rb') as fhandle:
mime = MIMEBase('image','jpeg',filename='11.jpg')
mime.add_header('Content-Disposition', 'attachment', filename='11.jpg')
mime.add_header('Content-ID', '<0>')
mime.add_header('X-Attachment-Id', '0')
# 把附件的內(nèi)容讀進(jìn)來(lái):
mime.set_payload(fhandle.read())
# 用Base64編碼:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
msg.attach(mime)

然后,按正常發(fā)送流程把msg(注意類型已變?yōu)镸IMEMultipart)發(fā)送出去,就可以收到帶附件的郵件。

完整代碼示例如下:

from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase


import smtplib

def _format_addr(s): #格式化一個(gè)郵件地址
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))

from_addr = '你的郵箱地址' #發(fā)送者郵箱地址
password = '你的郵箱密碼' #發(fā)送者郵箱密碼
to_addr = '903087053@qq.com' #接收者郵箱地址
smtp_server = 'smtp.sina.com' #發(fā)送者所在的郵箱供應(yīng)商的MTA地址
#from_addr = input('From: ')
#password = input('Password: ')
#to_addr = input('To: ')
#smtp_server = input('SMTP server: ')


msg= MIMEMultipart()
msg['From'] = _format_addr('阿鑫 <%s>' % from_addr) #郵件頭部,發(fā)送者信息
msg['To'] = _format_addr('axin <%s>' % to_addr) #接收者信息
msg['Subject'] = Header('test', 'utf-8').encode() #郵件主題

msg.attach(MIMEText('hello, this is axin...', 'plain', 'utf-8'))

with open('/home/fengxin/圖片/11.jpg','rb') as fhandle:
mime = MIMEBase('image','jpeg',filename='11.jpg')
mime.add_header('Content-Disposition', 'attachment', filename='11.jpg')
mime.add_header('Content-ID', '<0>')
mime.add_header('X-Attachment-Id', '0')
# 把附件的內(nèi)容讀進(jìn)來(lái):
mime.set_payload(fhandle.read())
# 用Base64編碼:
encoders.encode_base64(mime)
# 添加到MIMEMultipart:
msg.attach(mime)

server = smtplib.SMTP(smtp_server, 25) # SMTP協(xié)議默認(rèn)端口是25
server.set_debuglevel(1) #打印出和SMTP服務(wù)器交互的所有信息
server.login(from_addr, password) #登錄SMTP服務(wù)器
server.sendmail(from_addr, [to_addr], msg.as_string()) #發(fā)送郵件
server.quit()
1

運(yùn)行后。測(cè)試郵箱正確收到郵件,如圖:

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Python利用reportlab實(shí)現(xiàn)制作pdf報(bào)告

    Python利用reportlab實(shí)現(xiàn)制作pdf報(bào)告

    這篇文章主要為大家詳細(xì)介紹了reportlab生成流文件格式、reportlab分頁(yè)和圖片流文件寫入reportlab等內(nèi)容,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-12-12
  • 在Django中實(shí)現(xiàn)定時(shí)任務(wù)的多種方法

    在Django中實(shí)現(xiàn)定時(shí)任務(wù)的多種方法

    在 Django 項(xiàng)目中實(shí)現(xiàn)定時(shí)任務(wù)可以幫助自動(dòng)化執(zhí)行一些后臺(tái)任務(wù),如數(shù)據(jù)清理、定期報(bào)告生成等,以下是幾種常見的實(shí)現(xiàn)方式,每種方法都有其獨(dú)特的優(yōu)勢(shì)和適用場(chǎng)景,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2024-08-08
  • 用Django寫天氣預(yù)報(bào)查詢網(wǎng)站

    用Django寫天氣預(yù)報(bào)查詢網(wǎng)站

    今天小編就為大家分享一篇關(guān)于用Django寫天氣預(yù)報(bào)查詢網(wǎng)站的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • Python中isinstance和hasattr的實(shí)現(xiàn)示例

    Python中isinstance和hasattr的實(shí)現(xiàn)示例

    本文詳細(xì)介紹了Python中的兩個(gè)內(nèi)置函數(shù)isinstance和hasattr,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • 提升Python項(xiàng)目整潔度使用import?linter實(shí)例探究

    提升Python項(xiàng)目整潔度使用import?linter實(shí)例探究

    在復(fù)雜的Python項(xiàng)目中,良好的代碼組織結(jié)構(gòu)是維護(hù)性和可讀性的關(guān)鍵,本文將深入研究?import-linter?工具,它是一個(gè)強(qiáng)大的靜態(tài)分析工具,旨在優(yōu)化項(xiàng)目的模塊導(dǎo)入,提高代碼質(zhì)量和可維護(hù)性
    2024-01-01
  • python3.5 email實(shí)現(xiàn)發(fā)送郵件功能

    python3.5 email實(shí)現(xiàn)發(fā)送郵件功能

    這篇文章主要為大家詳細(xì)介紹了python3.5 email實(shí)現(xiàn)發(fā)送郵件功能,包含txt、圖片、HTML、附件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Python中的一些陷阱與技巧小結(jié)

    Python中的一些陷阱與技巧小結(jié)

    這篇文章主要介紹了Python中的一些陷阱與技巧小結(jié),包括生成器等高級(jí)用法,和Python2.x與3版本換代帶來(lái)的兼容性問題等,需要的朋友可以參考下
    2015-07-07
  • OpenCV實(shí)現(xiàn)單目攝像頭對(duì)圖像目標(biāo)測(cè)距

    OpenCV實(shí)現(xiàn)單目攝像頭對(duì)圖像目標(biāo)測(cè)距

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)單目攝像頭對(duì)圖像目標(biāo)測(cè)距,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 詳解Python中元組的三個(gè)不常用特性

    詳解Python中元組的三個(gè)不常用特性

    元組是Python中一種重要的內(nèi)置數(shù)據(jù)類型。與列表一樣,我們經(jīng)常使用元組將多個(gè)對(duì)象保存為相應(yīng)的數(shù)據(jù)容器。本文為大家總結(jié)了元組的三個(gè)不常用特性,感興趣的小伙伴可以了解一下
    2022-07-07
  • Python實(shí)現(xiàn)文本相似度分析

    Python實(shí)現(xiàn)文本相似度分析

    這篇文章主要旨在通過設(shè)計(jì)和實(shí)現(xiàn)有關(guān)文本相似度比較的類Vector和Sketch,幫助大家進(jìn)一步掌握設(shè)計(jì)Python類來(lái)解決實(shí)際問題的能力,有需要的小伙伴可以學(xué)習(xí)一下
    2023-07-07

最新評(píng)論

郓城县| 寿宁县| 遂昌县| 永年县| 葫芦岛市| 内乡县| 邻水| 铁岭县| 铅山县| 布尔津县| 金门县| 赣榆县| 济宁市| 随州市| 荥阳市| 青冈县| 横峰县| 神池县| 东乌珠穆沁旗| 土默特左旗| 久治县| 饶平县| 本溪市| 兴仁县| 潜江市| 鹤岗市| 芒康县| 湖口县| 岢岚县| 茌平县| 稷山县| 安顺市| 郯城县| 东阳市| 格尔木市| 兰考县| 个旧市| 运城市| 隆昌县| 盐池县| 慈溪市|