python自動發郵件
轉自:https://www.cnblogs.com/yufeihlf/p/5726619.html
python發郵件需要掌握兩個模組的用法,smtplib和email,這倆模組是python自帶的,只需import即可使用。smtplib模組主要負責傳送郵件,email模組主要負責構造郵件。
smtplib模組主要負責傳送郵件:是一個傳送郵件的動作,連線郵箱伺服器,登入郵箱,傳送郵件(有發件人,收信人,郵件內容)。
email模組主要負責構造郵件:指的是郵箱頁面顯示的一些構造,如發件人,收件人,主題,正文,附件等。
1.smtplib模組
smtplib使用較為簡單。以下是最基本的語法。
匯入及使用方法如下:
import smtplib smtp = smtplib.SMTP() smtp.connect('smtp.163.com,25') smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit()
說明:
smtplib.SMTP():例項化SMTP()
connect(host,port):
host:指定連線的郵箱伺服器。常用郵箱的smtp伺服器地址如下:
新浪郵箱:smtp.sina.com,新浪VIP:smtp.vip.sina.com,搜狐郵箱:smtp.sohu.com,126郵箱:smtp.126.com,139郵箱:smtp.139.com,163網易郵箱:smtp.163.com。
port:指定連線伺服器的埠號,預設為25.
login(user,password):
user:登入郵箱的使用者名稱。
password:登入郵箱的密碼,像筆者用的是網易郵箱,網易郵箱一般是網頁版,需要用到客戶端密碼,需要在網頁版的網易郵箱中設定授權碼,該授權碼即為客戶端密碼。
sendmail(from_addr,to_addrs,msg,...):
from_addr:郵件傳送者地址
to_addrs:郵件接收者地址。字串列表['接收地址1','接收地址2','接收地址3',...]或'接收地址'
msg:傳送訊息:郵件內容。一般是msg.as_string():as_string()是將msg(MIMEText物件或者MIMEMultipart物件)變為str。
quit():用於結束SMTP會話。
2.email模組
email模組下有mime包,mime英文全稱為“Multipurpose Internet Mail Extensions”,即多用途網際網路郵件擴充套件,是目前網際網路電子郵件普遍遵循的郵件技術規範。
該mime包下常用的有三個模組:text,image,multpart。
匯入方法如下:
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
構造一個郵件物件就是一個Message
物件,如果構造一個MIMEText
物件,就表示一個文字郵件物件,如果構造一個MIMEImage
物件,就表示一個作為附件的圖片,要把多個物件組合起來,就用MIMEMultipart
物件,而MIMEBase
可以表示任何物件。它們的繼承關係如下:
Message
+- MIMEBase
+- MIMEMultipart
+- MIMENonMultipart
+- MIMEMessage
+- MIMEText
+- MIMEImage
2.1 text說明
郵件傳送程式為了防止有些郵件閱讀軟體不能顯示處理HTML格式的資料,通常都會用兩型別分別為"text/plain"和"text/html"
構造MIMEText物件時,第一個引數是郵件正文,第二個引數是MIME的subtype,最後一定要用utf-8編碼保證多語言相容性。
2.1.1新增普通文字
text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.baidu.com" text_plain = MIMEText(text,'plain', 'utf-8')
檢視MIMEText屬性:可以觀察到MIMEText,MIMEImage和MIMEMultipart的屬性都一樣。
print dir(text_plain)
['__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新增超文字
html = """ <html> <body> <p> Here is the <a href="http://www.baidu.com">link</a> you wanted. </p> </body> </html> """ text_html = MIMEText(html,'html', 'utf-8')
2.1.3新增附件
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"'
2.2 image說明
新增圖片:
sendimagefile=open(r'D:\pythontest\testimage.png','rb').read() image = MIMEImage(sendimagefile) image.add_header('Content-ID','<image1>')
檢視MIMEImage屬性:
print dir(image)
['__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"的郵件正文中包括圖片,聲音等內嵌資源。
郵件型別為"multipart/mixed"的郵件包含附件。向上相容,如果一個郵件有純文字正文,超文字正文,內嵌資源,附件,則選擇mixed型別。
msg = MIMEMultipart('mixed')
我們必須把Subject,From,To,Date新增到MIMEText物件或者MIMEMultipart物件中,郵件中才會顯示主題,發件人,收件人,時間(若無時間,就預設一般為當前時間,該值一般不設定)。
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'
檢視MIMEMultipart屬性:
msg = MIMEMultipart('mixed') print dir(msg)
結果:
['__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物件)變為str,如果只有一個html超文字正文或者plain普通文字正文的話,一般msg的型別可以是MIMEText;如果是多個的話,就都新增到MIMEMultipart,msg型別就變為MIMEMultipart。
msg.attach(MIMEText物件或MIMEImage物件):將MIMEText物件或MIMEImage物件新增到MIMEMultipart物件中。MIMEMultipart物件代表郵件本身,MIMEText物件或MIMEImage物件代表郵件正文。
以上的構造的文字,超文字,附件,圖片都何以新增到MIMEMultipart('mixed')中:
msg.attach(text_plain)
msg.attach(text_html)
msg.attach(text_att)
msg.attach(image)
3.文字,html,圖片,附件實現例項
#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 #設定smtplib所需的引數 #下面的發件人,收件人是用於郵件傳輸的。 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() #構造郵件物件MIMEMultipart物件 #下面的主題,發件人,收件人,日期是顯示在郵件頁面上的。 msg = MIMEMultipart('mixed') msg['Subject'] = subject msg['From'] = 'XXX@163.com <XXX@163.com>' #msg['To'] = 'XXX@126.com' #收件人為多個收件人,通過join將列表轉換為以;為間隔的字串 msg['To'] = ";".join(receiver) #msg['Date']='2012-3-16' #構造文字內容 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) #構造圖片連結 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) #構造html #傳送正文中的圖片:由於包含未被許可的資訊,網易郵箱定義為垃圾郵件,報554 DT:SPM :<p><img src="cid:image1"></p> html = """ <html> <head></head> <body> <p>Hi!<br> How are you?<br> Here is the <a href="http://www.baidu.com">link</a> you wanted.<br> </p> </body> </html> """ text_html = MIMEText(html,'html', 'utf-8') text_html["Content-Disposition"] = 'attachment; filename="texthtml.html"' msg.attach(text_html) #構造附件 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"' #另一種實現方式 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) #傳送郵件 smtp = smtplib.SMTP() smtp.connect('smtp.163.com') #我們用set_debuglevel(1)就可以列印出和SMTP伺服器互動的所有資訊。 #smtp.set_debuglevel(1) smtp.login(username, password) smtp.sendmail(sender, receiver, msg.as_string()) smtp.quit()
說明:
如果大家對add_header的入參有更多的瞭解(Content-Disposition,Content-Type,Content-ID),希望告訴我,謝謝。
相關文章
- ORACLE_自動發郵件程式碼Oracle
- C#實現自動發郵件C#
- python 發個郵件Python
- EM配置Oracle郵件自動告警Oracle
- 透過python發郵件Python
- python介面自動化(三十三)-python自動發郵件總結及例項說明番外篇下(詳解)Python
- Springboot 自動傳送郵件Spring Boot
- Oracle 自動化運維-Python表空間郵件預警Oracle運維Python
- oracle資料庫自動發郵件實現報警功能Oracle資料庫
- 禪道開源版本12.4.1配置SMTP自動發郵件
- 郵件開發:接收解析郵件
- python多使用者發郵件Python
- 【python3.x】傳送自動化測試報告郵件Python測試報告
- 使用python傳送郵件和接收郵件Python
- 乾貨丨RPA郵件自動化技巧
- linux下設定郵件自動傳送Linux
- python實現自動監控網站併傳送郵件告警薦Python網站
- 群發郵件
- shell發郵件
- oracle 發郵件Oracle
- Focussend:營銷自動化下的八大觸發類郵件
- redmine建立新聞,自動發郵件給專案組所有成員
- python介面自動化(三十一)--html測試報告通過郵件發出去——下(詳解)PythonHTML測試報告
- 用 Python 指令碼實現電腦喚醒後自動拍照 截圖併發郵件通知Python指令碼
- iphone 6s自帶郵箱收發郵件設定教程iPhone
- 關於作業自動排程失敗後自動發郵件給操作員的問題
- 郵件營銷自動化:批次郵箱API傳送技巧與策略API
- Python3實現自動傳送MySql查詢併傳送郵件PythonMySql
- python傳送郵件Python
- win10系統下outlook收到郵件後自動刪除郵件怎麼解決Win10
- 用Oracle發郵件Oracle
- 發郵件的例子
- linux 發郵件Linux
- 郵件開發:複雜郵件的一個示例
- nodejs什麼值得買自動簽到自動評論郵件傳送NodeJS
- 《奇巧淫技》系列-python!!每天早上八點自動傳送天氣預報郵件到QQ郵箱Python
- win10系統自帶郵箱發不出去郵件怎麼辦_win10郵箱發不出去郵件解決方案Win10
- ASP.NET自動傳送郵件功能的實現ASP.NET