Python SMTP發(fā)送郵件

python smtp發(fā)送郵件

smtp(simple mail transfer protocol)即簡單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來控制信件的中轉(zhuǎn)方式。

python 的smtplib提供了一種很方便的途徑發(fā)送電子郵件。它對 smtp 協(xié)議進行了簡單的封裝。

python 創(chuàng)建 smtp 對象語法如下:

import smtplib

smtpobj = smtplib.smtp( [host [, port [, local_hostname]]] )

參數(shù)說明:

  • host: smtp 服務(wù)器主機。 你可以指定主機的ip地址或者域名如: yapf.com,這個是可選參數(shù)。
  • port: 如果你提供了 host 參數(shù), 你需要指定 smtp 服務(wù)使用的端口號,一般情況下 smtp 端口號為25。
  • local_hostname: 如果 smtp 在你的本機上,你只需要指定服務(wù)器地址為 localhost 即可。

python smtp 對象使用 sendmail 方法發(fā)送郵件,語法如下:

smtp.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options])

參數(shù)說明:

  • from_addr: 郵件發(fā)送者地址。
  • to_addrs: 字符串列表,郵件發(fā)送地址。
  • msg: 發(fā)送消息

這里要注意一下第三個參數(shù),msg 是字符串,表示郵件。我們知道郵件一般由標題,發(fā)信人,收件人,郵件內(nèi)容,附件等構(gòu)成,發(fā)送郵件的時候,要注意 msg 的格式。這個格式就是 smtp 協(xié)議中定義的格式。

實例

以下執(zhí)行實例需要你本機已安裝了支持 smtp 的服務(wù),如:sendmail。

以下是一個使用 python 發(fā)送郵件簡單的實例:

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import smtplib
from email.mime.text import mimetext
from email.header import header
 
sender = 'from@yapf.com'
receivers = ['429240967@qq.com']  # 接收郵件,可設(shè)置為你的qq郵箱或者其他郵箱
 
# 三個參數(shù):第一個為文本內(nèi)容,第二個 plain 設(shè)置文本格式,第三個 utf-8 設(shè)置編碼
message = mimetext('python 郵件發(fā)送測試...', 'plain', 'utf-8')
message['from'] = header("碩編程", 'utf-8')   # 發(fā)送者
message['to'] =  header("測試", 'utf-8')        # 接收者
 
subject = 'python smtp 郵件測試'
message['subject'] = header(subject, 'utf-8')
 
 
try:
    smtpobj = smtplib.smtp('localhost')
    smtpobj.sendmail(sender, receivers, message.as_string())
    print "郵件發(fā)送成功"
except smtplib.smtpexception:
    print "error: 無法發(fā)送郵件"

我們使用三個引號來設(shè)置郵件信息,標準郵件需要三個頭部信息: from, to, 和 subject ,每個信息直接使用空行分割。

我們通過實例化 smtplib 模塊的 smtp 對象 smtpobj 來連接到 smtp 訪問,并使用 sendmail 方法來發(fā)送信息。

執(zhí)行以上程序,如果你本機安裝 sendmail(郵件傳輸代理程序),就會輸出:

$ python test.py 
郵件發(fā)送成功

查看我們的收件箱(一般在垃圾箱),就可以查看到郵件信息:

如果我們本機沒有 sendmail 訪問,也可以使用其他郵件服務(wù)商的 smtp 訪問(qq、網(wǎng)易、google等)。

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import smtplib
from email.mime.text import mimetext
from email.header import header
 
# 第三方 smtp 服務(wù)
mail_host="smtp.xxx.com"  #設(shè)置服務(wù)器
mail_user="xxxx"    #用戶名
mail_pass="xxxxxx"   #口令 
 
 
sender = 'from@yapf.com'
receivers = ['429240967@qq.com']  # 接收郵件,可設(shè)置為你的qq郵箱或者其他郵箱
 
message = mimetext('python 郵件發(fā)送測試...', 'plain', 'utf-8')
message['from'] = header("碩編程", 'utf-8')
message['to'] =  header("測試", 'utf-8')
 
subject = 'python smtp 郵件測試'
message['subject'] = header(subject, 'utf-8')
 
 
try:
    smtpobj = smtplib.smtp() 
    smtpobj.connect(mail_host, 25)    # 25 為 smtp 端口號
    smtpobj.login(mail_user,mail_pass)  
    smtpobj.sendmail(sender, receivers, message.as_string())
    print "郵件發(fā)送成功"
except smtplib.smtpexception:
    print "error: 無法發(fā)送郵件"

 

1. 使用python發(fā)送html格式的郵件

python發(fā)送html格式的郵件與發(fā)送純文本消息的郵件不同之處就是將mimetext中_subtype設(shè)置為html。具體代碼如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import smtplib
from email.mime.text import mimetext
from email.header import header
 
sender = 'from@yapf.com'
receivers = ['429240967@qq.com']  # 接收郵件,可設(shè)置為你的qq郵箱或者其他郵箱
 
mail_msg = """
<p>python 郵件發(fā)送測試...</p>
<p><a href="http://www.slktour.com">這是一個鏈接</a></p>
"""
message = mimetext(mail_msg, 'html', 'utf-8')
message['from'] = header("碩編程", 'utf-8')
message['to'] =  header("測試", 'utf-8')
 
subject = 'python smtp 郵件測試'
message['subject'] = header(subject, 'utf-8')
 
 
try:
    smtpobj = smtplib.smtp('localhost')
    smtpobj.sendmail(sender, receivers, message.as_string())
    print "郵件發(fā)送成功"
except smtplib.smtpexception:
    print "error: 無法發(fā)送郵件"

執(zhí)行以上程序,如果你本機安裝sendmail,就會輸出:

$ python test.py 
郵件發(fā)送成功

查看我們的收件箱(一般在垃圾箱),就可以查看到郵件信息:

 

2. python 發(fā)送帶附件的郵件

發(fā)送帶附件的郵件,首先要創(chuàng)建mimemultipart()實例,然后構(gòu)造附件,如果有多個附件,可依次構(gòu)造,最后利用smtplib.smtp發(fā)送。

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import smtplib
from email.mime.text import mimetext
from email.mime.multipart import mimemultipart
from email.header import header
 
sender = 'from@yapf.com'
receivers = ['429240967@qq.com']  # 接收郵件,可設(shè)置為你的qq郵箱或者其他郵箱
 
#創(chuàng)建一個帶附件的實例
message = mimemultipart()
message['from'] = header("碩編程", 'utf-8')
message['to'] =  header("測試", 'utf-8')
subject = 'python smtp 郵件測試'
message['subject'] = header(subject, 'utf-8')
 
#郵件正文內(nèi)容
message.attach(mimetext('這是碩編程python 郵件發(fā)送測試……', 'plain', 'utf-8'))
 
# 構(gòu)造附件1,傳送當(dāng)前目錄下的 test.txt 文件
att1 = mimetext(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["content-type"] = 'application/octet-stream'
# 這里的filename可以任意寫,寫什么名字,郵件中顯示什么名字
att1["content-disposition"] = 'attachment; filename="test.txt"'
message.attach(att1)
 
# 構(gòu)造附件2,傳送當(dāng)前目錄下的 yapf.txt 文件
att2 = mimetext(open('yapf.txt', 'rb').read(), 'base64', 'utf-8')
att2["content-type"] = 'application/octet-stream'
att2["content-disposition"] = 'attachment; filename="yapf.txt"'
message.attach(att2)
 
try:
    smtpobj = smtplib.smtp('localhost')
    smtpobj.sendmail(sender, receivers, message.as_string())
    print "郵件發(fā)送成功"
except smtplib.smtpexception:
    print "error: 無法發(fā)送郵件"
$ python test.py 
郵件發(fā)送成功

查看我們的收件箱(一般在垃圾箱),就可以查看到郵件信息:

 

3. 在 html 文本中添加圖片

郵件的 html 文本中一般郵件服務(wù)商添加外鏈是無效的,正確添加圖片的實例如下所示:

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import smtplib
from email.mime.image import mimeimage
from email.mime.multipart import mimemultipart
from email.mime.text import mimetext
from email.header import header
 
sender = 'from@yapf.com'
receivers = ['429240967@qq.com']  # 接收郵件,可設(shè)置為你的qq郵箱或者其他郵箱
 
msgroot = mimemultipart('related')
msgroot['from'] = header("碩編程", 'utf-8')
msgroot['to'] =  header("測試", 'utf-8')
subject = 'python smtp 郵件測試'
msgroot['subject'] = header(subject, 'utf-8')
 
msgalternative = mimemultipart('alternative')
msgroot.attach(msgalternative)
 
 
mail_msg = """
<p>python 郵件發(fā)送測試...</p>
<p><a href="http://www.slktour.com">碩編程鏈接</a></p>
<p>圖片演示:</p>
<p><img src="cid:image1"></p>
"""
msgalternative.attach(mimetext(mail_msg, 'html', 'utf-8'))
 
# 指定圖片為當(dāng)前目錄
fp = open('test.png', 'rb')
msgimage = mimeimage(fp.read())
fp.close()
 
# 定義圖片 id,在 html 文本中引用
msgimage.add_header('content-id', '<image1>')
msgroot.attach(msgimage)
 
try:
    smtpobj = smtplib.smtp('localhost')
    smtpobj.sendmail(sender, receivers, msgroot.as_string())
    print "郵件發(fā)送成功"
except smtplib.smtpexception:
    print "error: 無法發(fā)送郵件"
$ python test.py 
郵件發(fā)送成功

查看我們的收件箱(如果在垃圾箱可能需要移動到收件箱才可正常顯示),就可以查看到郵件信息:

 

4. 使用第三方 smtp 服務(wù)發(fā)送

這里使用了 qq 郵箱(你也可以使用 163,gmail等)的 smtp 服務(wù),需要做以下配置:

qq 郵箱通過生成授權(quán)碼來設(shè)置密碼:

qq 郵箱 smtp 服務(wù)器地址:smtp.qq.com,ssl 端口:465。

以下實例你需要修改:發(fā)件人郵箱(你的qq郵箱),密碼,收件人郵箱(可發(fā)給自己)。

#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import smtplib
from email.mime.text import mimetext
from email.utils import formataddr
 
my_sender='429240967@qq.com'    # 發(fā)件人郵箱賬號
my_pass = 'xxxxxxxxxx'              # 發(fā)件人郵箱密碼
my_user='429240967@qq.com'      # 收件人郵箱賬號,我這邊發(fā)送給自己
def mail():
    ret=true
    try:
        msg=mimetext('填寫郵件內(nèi)容','plain','utf-8')
        msg['from']=formataddr(["fromyapf",my_sender])  # 括號里的對應(yīng)發(fā)件人郵箱昵稱、發(fā)件人郵箱賬號
        msg['to']=formataddr(["fk",my_user])              # 括號里的對應(yīng)收件人郵箱昵稱、收件人郵箱賬號
        msg['subject']="碩編程發(fā)送郵件測試"                # 郵件的主題,也可以說是標題
 
        server=smtplib.smtp_ssl("smtp.qq.com", 465)  # 發(fā)件人郵箱中的smtp服務(wù)器,端口是25
        server.login(my_sender, my_pass)  # 括號中對應(yīng)的是發(fā)件人郵箱賬號、郵箱密碼
        server.sendmail(my_sender,[my_user,],msg.as_string())  # 括號中對應(yīng)的是發(fā)件人郵箱賬號、收件人郵箱賬號、發(fā)送郵件
        server.quit()  # 關(guān)閉連接
    except exception:  # 如果 try 中的語句沒有執(zhí)行,則會執(zhí)行下面的 ret=false
        ret=false
    return ret
 
ret=mail()
if ret:
    print("郵件發(fā)送成功")
else:
    print("郵件發(fā)送失敗")

$ python test.py 
郵件發(fā)送成功

發(fā)送成功后,登陸收件人郵箱即可查看:

更多內(nèi)容請參閱:https://docs.python.org/2/library/email-examples.html。

下一節(jié):python 多線程

python 教程

相關(guān)文章
亚洲国产精品第一区二区,久久免费视频77,99V久久综合狠狠综合久久,国产免费久久九九免费视频