首頁  >  文章  >  後端開發  >  python發送郵件

python發送郵件

大家讲道理
大家讲道理原創
2017-05-28 10:03:551661瀏覽

python發送郵件

準備

#python中發送郵件主要用的是smtplib和email兩個模組,下面主要對這兩個模組進行講解

在講解之前需要準備至少兩個測試的郵箱,其中要在郵箱的設定中開啟smtplib協定才可以進行傳送和接受

smtplib

  • #smtplib.SMTP( [host [, port [, local_hostname [,<a href="http://www.php.cn/wiki/1268.html" target="_blank">time</a>out]]]]) hostSMTP主機的伺服器,其中163郵件信箱的是smtp.163.com,其他的可以在網路上找到,port是連接埠號,這裡預設的是25local_hostname是你主機的SMTP,如果SMTP在你的本機上,你只需要指定伺服器位址為localhost 即可。 timeout是設定的連線的限制時間,如果超過這個時間還沒連線上那麼就會出現錯誤

  • SMTP.<a href="http://www.php.cn/code/8209.html" target="_blank">set</a>_debuglevel(level):設定是否為偵錯模式。預設為False,即非偵錯模式,表示不輸出任何偵錯資訊。如果設定為1就表示輸出偵錯訊息

  • #SMTP.connect([host[, port]]):連接到指定的smtp伺服器。參數分別表示smpt主機和連接埠。注意: 也可以在host參數中指定連接埠號碼(如:smpt.yeah.net:25),這樣就沒必要給予port參數。

  • SMTP.login(user, passw<a href="http://www.php.cn/wiki/1360.html" target="_blank">ord</a>) 登入伺服器,這裡的user是郵件信箱的使用者名,但這裡的password並不是你信箱的密碼,當你開啟SMTP的時候會提示你設定一個密碼,這裡的密碼就是對應的密碼

  • SMTP.s<a href="http://www.php.cn/wiki/1048.html" target="_blank">end</a>mail(from_addr, [to_addrs, ], msg[, mail_options, rcpt_options]) 發送郵件,from_addr是發送方也就是你的郵箱地址,to_addr是接受方的地址,當然這裡的可以填入多個郵件帳號傳送至多個帳號,如果有多個帳號需要使用清單傳遞參數

  • ##SMTP .quit()斷開連接

email

emial模組用來處理郵件訊息,包括MIME和其他基於RFC 2822的訊息文件。使用這些模組來定義郵件的內容,是非常簡單的。其包含的類別有(更詳細的介紹可見:http://docs.python.org/library/email.mime.html):

  • class<a href="http://www.php.cn/wiki/164.html" target="_blank"> email.mime.base.MIMEBase(_</a>main<a href="http://www.php.cn/wiki/646.html" target="_blank">type, _subtype, **_params)</a>:這是MIME的一個基底類。一般不需要在使用時建立實例。其中_maintype是內容類型,如text或image。 _subtype是內容的minor type類型,如plaingif<a href="http://www.php.cn/wiki/109.html" target="_blank"></a>。 **_params是一個字典,直接傳遞給Message.add_header()。

  • class email.mime.multipart.MIMEMultipart([_subtype[, boundary[, _subparts[, _params]]] ]MIMEBase的子類,多個MIME物件的集合,_subtype預設值為mixed ##class email.mime.application.MIMEApplication(_data[, _subtype[, _encoder[, **_params]]]])

  • MIMEMultipart
的一個子類別。
  • class email.mime.audio. MIMEAudio(_audiodata[, _subtype[, _encoder[, **_params]]])MIME音訊物件

  • #class email.mime. image.MIMEImage(_imagedata[, _subtype[, _encoder[, **_params]]])MIME二進位檔案物件。主要用來發送圖片

普通文字郵件

  • class email. mime.text.MIMEText(_text[, _subtype[, _charset]])MIME文字對象,其中_text是郵件內容,_subtype郵件類型,可以是text/plain(普通文字郵件),html/plain(html郵件), _charset編碼,可以是gb2312等等。

  • #普通文字郵件發送的實現,關鍵是要將MIMEText#中_subtype設定為plain。先導入smtplibmimetext。建立smtplib.smtp實例,connect郵件smtp伺服器,login後傳送,具體程式碼如下*


##
# 一个格式化邮件的函数,可以用来使用def _format_addr(s):
    name, addr = parseaddr(s)    return formataddr((
        Header(name, &#39;utf-8&#39;).encode(),
        addr.encode(&#39;utf-8&#39;) if isinstance(addr, unicode) else addr))

from_addr=&#39;××××××××&#39;   #你的邮箱地址from_password=&#39;×××××××&#39;   #你的密码# to_email=&#39;chenjiabing666@yeah.net&#39;to_email=&#39;××××××&#39;    #要发送的邮箱地址msg=MIMEText(&#39;乔装打扮,不择手段&#39;,&#39;plain&#39;,&#39;utf-8&#39;)  #这里text=乔装打扮,不择手段msg[&#39;From&#39;] = _format_addr(u&#39;Python爱好者 <%s>&#39; % from_addr)  #格式化发件人msg[&#39;To&#39;] = _format_addr(u&#39;管理员 <%s>&#39; % to_email)    #格式化收件人msg[&#39;Subject&#39;] = Header(u&#39;来自SMTP的问候……&#39;, &#39;utf-8&#39;).encode()    #格式化主题stmp=&#39;smtp.163.com&#39;server=smtplib.SMTP(stmp,port=25,timeout=30) #连接,设置超时时间30sserver.login(from_addr,from_password)    #登录server.set_debuglevel(1)        #输出所有的信息server.sendmail(from_addr,to_email,msg.as_string())   #这里的as_string()是将msg转换成字符串类型的,如果你想要发给多个人,需要讲to_email换成一个列表


發送html郵件

還是用MIMEText來發送,不過其中的_subType設定成html即可,詳細程式碼如下:


def _format_addr(s):
    name, addr = parseaddr(s)    return formataddr((
        Header(name, &#39;utf-8&#39;).encode(),
        addr.encode(&#39;utf-8&#39;) if isinstance(addr, unicode) else addr))

from_addr=&#39;××××××××&#39;   #你的邮箱地址from_password=&#39;×××××××&#39;   #你的密码# to_email=&#39;chenjiabing666@yeah.net&#39;to_email=&#39;××××××&#39;    #要发送的邮箱地址html="""<p><h1 style="color:red">大家好</h1></p>"""msg=MIMEText(html,&#39;html&#39;,&#39;utf-8&#39;)  #这里text=html,设置成html格式的msg[&#39;From&#39;] = _format_addr(u&#39;Python爱好者 <%s>&#39; % from_addr)  #格式化发件人msg[&#39;To&#39;] = _format_addr(u&#39;管理员 <%s>&#39; % to_email)    #格式化收件人msg[&#39;Subject&#39;] = Header(u&#39;来自SMTP的问候……&#39;, &#39;utf-8&#39;).encode()    #格式化主题stmp=&#39;smtp.163.com&#39;server=smtplib.SMTP(stmp,port=25,timeout=30) #连接,设置超时时间30sserver.login(from_addr,from_password)    #登录server.set_debuglevel(1)        #输出所有的信息server.sendmail(from_addr,to_email,msg.as_string())   #这里的as_string()是将msg转换成字符串类型的,如果你想要发给多个人,需要讲to_email换成一个列表


附件的發送

發送附件的郵件,首先要建立MIMEMultipart()實例,然後建構附件,如果有多個附件,可依序構造,最後利用smtplib.smtp發送,具體實力如下:


from email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextimport smtplibfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.header import Headerdef _format_addr(s):
    name, addr = parseaddr(s)    return formataddr((
        Header(name, &#39;utf-8&#39;).encode(),
        addr.encode(&#39;utf-8&#39;) if isinstance(addr, unicode) else addr))

from_addr=&#39;××××××××&#39;   #你的邮箱地址from_password=&#39;×××××××&#39;   #你的密码# to_email=&#39;chenjiabing666@yeah.net&#39;to_email=&#39;××××××&#39;    #要发送的邮箱地址msg=MIMEMultipart()   #创建实例text=MIMEText(&#39;<h2 style="color:red">陈加兵</h2><br/><p>大家好</p>&#39;,&#39;html&#39;,&#39;utf-8&#39;)
msg.attach(text)   #添加一个正文信息,这里实在正文中显示的信息#创建一个文本附件,这里是从指定文本中读取信息,然后创建一个文本信息att1=MIMEText(open(&#39;/home/chenjiabing/文档/MeiZi_img/full/file.txt&#39;,&#39;rb&#39;).read(),&#39;plain&#39;,&#39;utf-8&#39;)
att1["Content-Type"] = &#39;application/octet-stream&#39;  #指定类型att1["Content-Disposition"] = &#39;attachment; filename="123.txt"&#39;#这里的filename可以任意写,写什么名字,邮件中显示什么名字msg.attach(att1)     #向其中添加附件img_path=&#39;/home/chenjiabing/文档/MeiZi_img/full/file.jpg&#39;  #图片路径image=MIMEImage(open(img_path,&#39;rb&#39;).read())     #创建一个图片附件image.add_header(&#39;Content-ID&#39;,&#39;<0>&#39;)   #指定图片的编号,这个会在后面用到image.add_header(&#39;Content-Disposition&#39;, &#39;attachment&#39;, filename=&#39;test.jpg&#39;)        
image.add_header(&#39;X-Attachment-Id&#39;, &#39;0&#39;)
msg.attach(image)    #添加附件stmp=&#39;smtp.163.com&#39;server=smtplib.SMTP(stmp,port=25,timeout=30) #连接,设置超时时间30sserver.login(from_addr,from_password)    #登录server.set_debuglevel(1)        #输出所有的信息server.sendmail(from_addr,to_email,msg.as_string())   #这里的as_string()是将msg转换成字符串类型的,如果你想要发给多个人,需要讲to_email换成一个列表


將圖片嵌入到文字訊息中


from email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextimport smtplibfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.header import Headerdef _format_addr(s):
    name, addr = parseaddr(s)    return formataddr((
        Header(name, &#39;utf-8&#39;).encode(),
        addr.encode(&#39;utf-8&#39;) if isinstance(addr, unicode) else addr))

from_addr=&#39;××××××××&#39;   #你的邮箱地址from_password=&#39;×××××××&#39;   #你的密码# to_email=&#39;chenjiabing666@yeah.net&#39;to_email=&#39;××××××&#39;    #要发送的邮箱地址msg=MIMEMultipart()   #创建实例html="""<html><head></head><body><p>下面演示嵌入图片</p><section><img src=&#39;cid:0&#39; style=&#39;float:left&#39;/><img src=&#39;cid:1&#39; style=&#39;float:left&#39;/></setcion></body></html>"""text=MIMEText(&#39;<h2 style="color:red">陈加兵</h2><br/><p>大家好</p>&#39;,&#39;html&#39;,&#39;utf-8&#39;)
msg.attach(text)   #添加一个正文信息,这里实在正文中显示的信息#创建一个文本附件,这里是从指定文本中读取信息,然后创建一个文本信息att1=MIMEText(open(&#39;/home/chenjiabing/文档/MeiZi_img/full/file.txt&#39;,&#39;rb&#39;).read(),&#39;plain&#39;,&#39;utf-8&#39;)
att1["Content-Type"] = &#39;application/octet-stream&#39;  #指定类型att1["Content-Disposition"] = &#39;attachment; filename="123.txt"&#39;#这里的filename可以任意写,写什么名字,邮件中显示什么名字msg.attach(att1)     #向其中添加附件## 创建一个图片附件img_path=&#39;/home/chenjiabing/文档/MeiZi_img/full/file.jpg&#39;  #图片路径image=MIMEImage(open(img_path,&#39;rb&#39;).read())     #创建一个图片附件image.add_header(&#39;Content-ID&#39;,&#39;<0>&#39;)   #指定图片的编号,image.add_header(&#39;Content-Disposition&#39;, &#39;attachment&#39;, filename=&#39;test.jpg&#39;)        
image.add_header(&#39;X-Attachment-Id&#39;, &#39;0&#39;)
msg.attach(image)    #添加附件#创建第二个图片附件img_path_1=&#39;/home/chenjiabing/文档/MeiZi_img/full/test.jpg&#39;  #图片路径image1=MIMEImage(open(img_path,&#39;rb&#39;).read())     #创建一个图片附件image1.add_header(&#39;Content-ID&#39;,&#39;<1>&#39;)   #指定图片的编号,这个就是在上面对应的cid:1的那张图片,因此这里的编号一定要对应image1.add_header(&#39;Content-Disposition&#39;, &#39;attachment&#39;, filename=&#39;img.jpg&#39;)        
image1.add_header(&#39;X-Attachment-Id&#39;, &#39;0&#39;)
msg1.attach(image)    #添加附件stmp=&#39;smtp.163.com&#39;server=smtplib.SMTP(stmp,port=25,timeout=30) #连接,设置超时时间30sserver.login(from_addr,from_password)    #登录server.set_debuglevel(1)        #输出所有的信息server.sendmail(from_addr,to_email,msg.as_string())   #这里的as_string()是将msg转换成字符串类型的,如果你想要发给多个人,需要讲to_email换成一个列表


#

以上是python發送郵件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:Python開發torndb下一篇:Python開發torndb