python自動發(fā)郵件案例

python發(fā)郵件需要掌握兩個模塊的用法,smtplib和email,這倆模塊是python自帶的,只需import即可使用。smtplib模塊主要負責(zé)發(fā)送郵件,email模塊主要負責(zé)構(gòu)造郵件。

smtplib模塊主要負責(zé)發(fā)送郵件:是一個發(fā)送郵件的動作,連接郵箱服務(wù)器,登錄郵箱,發(fā)送郵件(有發(fā)件人,收信人,郵件內(nèi)容)。

email模塊主要負責(zé)構(gòu)造郵件:指的是郵箱頁面顯示的一些構(gòu)造,如發(fā)件人,收件人,主題,正文,附件等。

image

1.smtplib模塊

smtplib使用較為簡單。以下是最基本的語法。

導(dǎo)入及使用方法如下:

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">import smtplib

smtp = smtplib.SMTP()
smtp.connect('smtp.163.com',25)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

說明:

smtplib.SMTP():實例化SMTP()

connect(host,port):

host:指定連接的郵箱服務(wù)器。常用郵箱的smtp服務(wù)器地址如下:

新浪郵箱:smtp.sina.com,新浪VIP:smtp.vip.sina.com,搜狐郵箱:smtp.sohu.com,126郵箱:smtp.126.com,139郵箱:smtp.139.com,163網(wǎng)易郵箱:smtp.163.com。

port:指定連接服務(wù)器的端口號,默認為25.

login(user,password):

user:登錄郵箱的用戶名。

password:登錄郵箱的密碼,像筆者用的是網(wǎng)易郵箱,網(wǎng)易郵箱一般是網(wǎng)頁版,需要用到客戶端密碼,需要在網(wǎng)頁版的網(wǎng)易郵箱中設(shè)置授權(quán)碼,該授權(quán)碼即為客戶端密碼。

sendmail(from_addr,to_addrs,msg,...):

from_addr:郵件發(fā)送者地址

to_addrs:郵件接收者地址。字符串列表['接收地址1','接收地址2','接收地址3',...]或'接收地址'

msg:發(fā)送消息:郵件內(nèi)容。一般是msg.as_string():as_string()是將msg(MIMEText對象或者MIMEMultipart對象)變?yōu)閟tr。

quit():用于結(jié)束SMTP會話。

2.email模塊

email模塊下有mime包,mime英文全稱為“Multipurpose Internet Mail Extensions”,即多用途互聯(lián)網(wǎng)郵件擴展,是目前互聯(lián)網(wǎng)電子郵件普遍遵循的郵件技術(shù)規(guī)范。

該mime包下常用的有三個模塊:text,image,multpart

導(dǎo)入方法如下:

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage</pre>

構(gòu)造一個郵件對象就是一個Message對象,如果構(gòu)造一個MIMEText對象,就表示一個文本郵件對象,如果構(gòu)造一個MIMEImage對象,就表示一個作為附件的圖片,要把多個對象組合起來,就用MIMEMultipart對象,而MIMEBase可以表示任何對象。它們的繼承關(guān)系如下:

Message
+- MIMEBase
   +- MIMEMultipart
   +- MIMENonMultipart
      +- MIMEMessage
      +- MIMEText
      +- MIMEImage

2.1 text說明

郵件發(fā)送程序為了防止有些郵件閱讀軟件不能顯示處理HTML格式的數(shù)據(jù),通常都會用兩類型分別為"text/plain"和"text/html"

構(gòu)造MIMEText對象時,第一個參數(shù)是郵件正文,第二個參數(shù)是MIME的subtype,最后一定要用utf-8編碼保證多語言兼容性。

2.1.1添加普通文本

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.baidu.com" text_plain = MIMEText(text,'plain', 'utf-8') </pre>

查看MIMEText屬性:可以觀察到MIMEText,MIMEImage和MIMEMultipart的屬性都一樣。

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">print dir(text_plain)</pre>

['contains', 'delitem', 'doc', 'getitem', 'init', 'len', 'module', 'setitem', 'str', '_charset', '_default_type', '_get_params_preserve', '_headers', '_payload', '_unixfrom', 'add_header', 'as_string', 'attach', 'defects', 'del_param', 'epilogue', 'get', 'get_all', 'get_boundary', 'get_charset', 'get_charsets', 'get_content_charset', 'get_content_maintype', 'get_content_subtype', 'get_content_type', 'get_default_type', 'get_filename', 'get_param', 'get_params', 'get_payload', 'get_unixfrom', 'has_key', 'is_multipart', 'items', 'keys', 'preamble', 'replace_header', 'set_boundary', 'set_charset', 'set_default_type', 'set_param', 'set_payload', 'set_type', 'set_unixfrom', 'values', 'walk']

2.1.2添加超文本

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">html = """ <html>
<body>
<p>
Here is the <a >link</a> you wanted.
</p>
</body>
</html> """ text_html = MIMEText(html,'html', 'utf-8') </pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

2.1.3添加附件

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">sendfile=open(r'D:\pythontest\1111.txt','rb').read()
text_att = MIMEText(sendfile, 'base64', 'utf-8')
text_att["Content-Type"] = 'application/octet-stream' text_att["Content-Disposition"] = 'attachment; filename="顯示的名字.txt"' </pre>

2.2 image說明

添加圖片:

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">sendimagefile=open(r'D:\pythontest\testimage.png','rb').read()
image = MIMEImage(sendimagefile)
image.add_header('Content-ID','<image1>')</pre>

查看MIMEImage屬性:

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">print dir(image)</pre>

['contains', 'delitem', 'doc', 'getitem', 'init', 'len', 'module', 'setitem', 'str', '_charset', '_default_type', '_get_params_preserve', '_headers', '_payload', '_unixfrom', 'add_header', 'as_string', 'attach', 'defects', 'del_param', 'epilogue', 'get', 'get_all', 'get_boundary', 'get_charset', 'get_charsets', 'get_content_charset', 'get_content_maintype', 'get_content_subtype', 'get_content_type', 'get_default_type', 'get_filename', 'get_param', 'get_params', 'get_payload', 'get_unixfrom', 'has_key', 'is_multipart', 'items', 'keys', 'preamble', 'replace_header', 'set_boundary', 'set_charset', 'set_default_type', 'set_param', 'set_payload', 'set_type', 'set_unixfrom', 'values', 'walk']

2.3 multpart說明

常見的multipart類型有三種:multipart/alternative, multipart/related和multipart/mixed。

郵件類型為"multipart/alternative"的郵件包括純文本正文(text/plain)和超文本正文(text/html)。

郵件類型為"multipart/related"的郵件正文中包括圖片,聲音等內(nèi)嵌資源。

郵件類型為"multipart/mixed"的郵件包含附件。向上兼容,如果一個郵件有純文本正文,超文本正文,內(nèi)嵌資源,附件,則選擇mixed類型。

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">msg = MIMEMultipart('mixed')</pre>

我們必須把Subject,F(xiàn)rom,To,Date添加到MIMEText對象或者MIMEMultipart對象中,郵件中才會顯示主題,發(fā)件人,收件人,時間(若無時間,就默認一般為當前時間,該值一般不設(shè)置)。

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">msg = MIMEMultipart('mixed')
msg['Subject'] = 'Python email test' msg['From'] = 'XXX@163.com XXX@163.com' msg['To'] = 'XXX@126.com' msg['Date']='2012-3-16'</pre>

查看MIMEMultipart屬性:

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">msg = MIMEMultipart('mixed') print dir(msg) </pre>

結(jié)果:

['contains', 'delitem', 'doc', 'getitem', 'init', 'len', 'module', 'setitem', 'str', '_charset', '_default_type', '_get_params_preserve', '_headers', '_payload', '_unixfrom', 'add_header', 'as_string', 'attach', 'defects', 'del_param', 'epilogue', 'get', 'get_all', 'get_boundary', 'get_charset', 'get_charsets', 'get_content_charset', 'get_content_maintype', 'get_content_subtype', 'get_content_type', 'get_default_type', 'get_filename', 'get_param', 'get_params', 'get_payload', 'get_unixfrom', 'has_key', 'is_multipart', 'items', 'keys', 'preamble', 'replace_header', 'set_boundary', 'set_charset', 'set_default_type', 'set_param', 'set_payload', 'set_type', 'set_unixfrom', 'values', 'walk']

說明:

msg.add_header(_name,_value,**_params):添加郵件頭字段。

msg.as_string():是將msg(MIMEText對象或者MIMEMultipart對象)變?yōu)閟tr,如果只有一個html超文本正文或者plain普通文本正文的話,一般msg的類型可以是MIMEText;如果是多個的話,就都添加到MIMEMultipart,msg類型就變?yōu)镸IMEMultipart。

msg.attach(MIMEText對象或MIMEImage對象):將MIMEText對象或MIMEImage對象添加到MIMEMultipart對象中。MIMEMultipart對象代表郵件本身,MIMEText對象或MIMEImage對象代表郵件正文。

以上的構(gòu)造的文本,超文本,附件,圖片都何以添加到MIMEMultipart('mixed')中:

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">msg.attach(text_plain)
msg.attach(text_html)
msg.attach(text_att)
msg.attach(image)</pre>

3.文字,html,圖片,附件實現(xiàn)實例

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">#coding: utf-8

import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.header import Header #設(shè)置smtplib所需的參數(shù) #下面的發(fā)件人,收件人是用于郵件傳輸?shù)摹?br> smtpserver = 'smtp.163.com' username = 'XXX@163.com' password='XXX' sender='XXX@163.com'

receiver='XXX@126.com' #收件人為多個收件人

receiver=['XXX@126.com','XXX@126.com']

subject = 'Python email test'

通過Header對象編碼的文本,包含utf-8編碼信息和Base64編碼信息。以下中文名測試ok #subject = '中文標題' #subject=Header(subject, 'utf-8').encode()

構(gòu)造郵件對象MIMEMultipart對象 #下面的主題,發(fā)件人,收件人,日期是顯示在郵件頁面上的。

msg = MIMEMultipart('mixed')
msg['Subject'] = subject
msg['From'] = 'XXX@163.com XXX@163.com'

msg['To'] = 'XXX@126.com' #收件人為多個收件人,通過join將列表轉(zhuǎn)換為以;為間隔的字符串

msg['To'] = ";".join(receiver) #msg['Date']='2012-3-16'

構(gòu)造文字內(nèi)容

text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.baidu.com" text_plain = MIMEText(text,'plain', 'utf-8')
msg.attach(text_plain) #構(gòu)造圖片鏈接
sendimagefile=open(r'D:\pythontest\testimage.png','rb').read()
image = MIMEImage(sendimagefile)
image.add_header('Content-ID','<image1>')
image["Content-Disposition"] = 'attachment; filename="testimage.png"' msg.attach(image) #構(gòu)造html #發(fā)送正文中的圖片:由于包含未被許可的信息,網(wǎng)易郵箱定義為垃圾郵件,報554 DT:SPM :<p><img src="cid:image1"></p>
html = """ <html>
<head></head>
<body>
<p>Hi!

How are you?

Here is the <a >link</a> you wanted.

</p>
</body>
</html> """ text_html = MIMEText(html,'html', 'utf-8')
text_html["Content-Disposition"] = 'attachment; filename="texthtml.html"' msg.attach(text_html) #構(gòu)造附件
sendfile=open(r'D:\pythontest\1111.txt','rb').read()
text_att = MIMEText(sendfile, 'base64', 'utf-8')
text_att["Content-Type"] = 'application/octet-stream'

以下附件可以重命名成aaa.txt

text_att["Content-Disposition"] = 'attachment; filename="aaa.txt"' #另一種實現(xiàn)方式

text_att.add_header('Content-Disposition', 'attachment', filename='aaa.txt') #以下中文測試不ok #text_att["Content-Disposition"] = u'attachment; filename="中文附件.txt"'.decode('utf-8')
msg.attach(text_att) #發(fā)送郵件
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com') #我們用set_debuglevel(1)就可以打印出和SMTP服務(wù)器交互的所有信息。 #smtp.set_debuglevel(1)
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

說明:

如果大家對add_header的入?yún)⒂懈嗟牧私猓–ontent-Disposition,Content-Type,Content-ID),希望告訴我,謝謝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容