SMTP是發送郵件的協議,Python內置對SMTP的支持,能夠發送純文本郵件、HTML郵件以及帶附件的郵件。html
Python對SMTP支持有smtplib和email兩個模塊,email負責構造郵件,smtplib負責發送郵件。python
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 import smtplib 5 from email.mime.text import MIMEText 6 from email.utils import formataddr 7 8 def email(message): 9 #構造MIMEText對象,第一個參數就是郵件正文,第二個參數是MIME的subtype 10 # 傳入'plain',最終的MIME就是'text/plain',最後必定要用utf-8編碼保證多語言兼容性。 11 msg = MIMEText(message, 'plain', 'utf-8') #message爲傳入的參數,爲發送的消息. 12 """msg = MIMEText('<html><body><h1>Hello</h1>' + 13 '<p>send by <a href="http://www.python.org">Python</a>...</p>' + 14 '</body></html>', 'html', 'utf-8') """ 15 #標準郵件須要三個頭部信息: From, To, 和 Subject。 16 msg['From'] = formataddr(["管理員",'ylemail2012@sina.cn']) #顯示發件人信息 17 msg['To'] = formataddr(["Saneri",'349622541@qq.com']) #顯示收件人信息 18 msg['Subject'] = "Zabbix報警系統!" #定義郵件主題 19 try: 20 #建立SMTP對象 21 server = smtplib.SMTP("smtp.sina.com", 25) 22 #set_debuglevel(1)能夠打印出和SMTP服務器交互的全部信息 23 #server.set_debuglevel(1) 24 #login()方法用來登陸SMTP服務器 25 server.login("ylemail2012@sina.cn","password") 26 #sendmail()方法就是發郵件,因爲能夠一次發給多我的,因此傳入一個list,郵件正文是一個str,as_string()把MIMEText對象變成str 27 server.sendmail('ylemail2012@sina.cn', ['349622541@qq.com',], msg.as_string()) 28 print u"郵件發送成功!"
29 server.quit() 30 except smtplib.SMTPException: 31 print u"Error: 沒法發送郵件" 32 if __name__ == '__main__': 33 cpu = 100 34 disk = 500 35 mem = 50 36 for i in range(1): 37 if cpu > 90: 38 alert = u"CPU出問題!" 39 email(alert) 40 if disk > 90: 41 alert = u"硬盤出問題!" 42 email(alert) 43 if mem > 80: 44 alert = u"內存出問題!" 45 email(alert)
#Python發送HTML格式的郵件與發送純文本消息的郵件不一樣之處就是將MIMEText中_subtype設置爲html
1 msg = MIMEText('<html><body><h1>Hello</h1>' + 2 '<p>send by <a href="http://www.python.org">Python</a>...</p>' + 3 '</body></html>', 'html', 'utf-8')
發送帶附件的郵件,首先要建立MIMEMultipart()實例,而後構造附件,若是有多個附件,可依次構造,最後利用smtplib.smtp發送。瀏覽器
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 import smtplib 5 from email.mime.text import MIMEText 6 from email.utils import formataddr 7 from email.mime.multipart import MIMEMultipart 8 9 def email(message): 10 11 msg = MIMEMultipart() 12 msg['From'] = formataddr(["管理員",'ylemail2012@sina.cn']) 13 msg['To'] = formataddr(["Saneri",'349622541@qq.com']) 14 msg['Subject'] = "Zabbix報警系統!" 15 msg.attach(MIMEText(message, 'plain', 'utf-8')) 16 17 #---這是附件部分--- 18 # 構造附件1,文本類型附件 19 att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8') 20 att1["Content-Type"] = 'application/octet-stream' 21 # 這裏的filename能夠任意寫,寫什麼名字,郵件中顯示什麼名字 22 att1["Content-Disposition"] = 'attachment; filename="test.txt"' 23 msg.attach(att1) 24 25 # 構造附件2,jpg類型附件 26 from email.mime.application import MIMEApplication 27 att2 = MIMEApplication(open('001.jpg','rb').read()) 28 att2.add_header('Content-Disposition', 'attachment', filename="001.jpg") 29 msg.attach(att2) 30 #構造附件3,pdf類型附件 31 att3 = MIMEApplication(open('test.pdf','rb').read()) 32 att3.add_header('Content-Disposition', 'attachment', filename="test.pdf") 33 msg.attach(att3) 34 #構造附件4,xlsx類型附件 35 att4 = MIMEApplication(open('test.xlsx','rb').read()) 36 att4.add_header('Content-Disposition', 'attachment', filename="test.xlsx") 37 msg.attach(att4) 38 #構造附件5,mp3類型附件 39 att5 = MIMEApplication(open('test.mp3','rb').read()) 40 att5.add_header('Content-Disposition', 'attachment', filename="test.mp3") 41 msg.attach(att5) 42 43 try: 44 server = smtplib.SMTP("smtp.sina.com", 25) 45 #set_debuglevel(1)能夠打印出和SMTP服務器交互的全部信息 46 #server.set_debuglevel(1) 47 #login()方法用來登陸SMTP服務器 48 server.login("ylemail2012@sina.cn","password") 49 #sendmail()方法就是發郵件,因爲能夠一次發給多我的,因此傳入一個list,郵件正文是一個str,as_string()把MIMEText對象變成str 50 server.sendmail('ylemail2012@sina.cn', ['349622541@qq.com',], msg.as_string()) 51 print u"郵件發送成功!" 52 server.quit() 53 except smtplib.SMTPException: 54 print u"Error: 沒法發送郵件" 55 if __name__ == '__main__': 56 cpu = 100 57 disk = 500 58 mem = 50 59 for i in range(1): 60 if cpu > 90: 61 alert = u"CPU出問題!" 62 email(alert) 63 if disk > 90: 64 alert = u"硬盤出問題!" 65 email(alert) 66 if mem > 80: 67 alert = u"內存出問題!" 68 email(alert)
郵件的 HTML 文本中通常郵件服務商添加外鏈是無效的,正確添加突破的實例以下所示:服務器
1 #!/usr/bin/env python 2 #coding:utf-8 3 4 import smtplib 5 from email.mime.multipart import MIMEMultipart 6 from email.mime.text import MIMEText 7 from email.mime.image import MIMEImage 8 from email.utils import formataddr 9 10 def email(): 11 msg = MIMEMultipart() 12 msg['From'] = formataddr(["管理員",'ylemail2012@sina.cn']) 13 msg['To'] = formataddr(["Saneri",'349622541@qq.com']) 14 msg['Subject'] = "Zabbix報警系統!" 15 msg.attach(MIMEText('<b>Some <i>HTML</i> text</b> and an image.<br><img src="cid:image1"><br>good!','html','utf-8')) 16 17 fp = open('001.jpg', 'rb') 18 msgImage = MIMEImage(fp.read()) 19 fp.close() 20 msgImage.add_header('Content-ID', '<image1>') 21 msg.attach(msgImage) 22 try: 23 server = smtplib.SMTP("smtp.sina.com", 25) 24 server.login("ylemail2012@sina.cn","password") 25 server.sendmail('ylemail2012@sina.cn', ['349622541@qq.com',], msg.as_string()) 26 print u"郵件發送成功!" 27 server.quit() 28 except smtplib.SMTPException: 29 print u"Error: 沒法發送郵件" 30 31 if __name__ == '__main__': 32 email()
若是咱們發送HTML郵件,收件人經過瀏覽器或者Outlook之類的軟件是能夠正常瀏覽郵件內容的,可是,若是收件人使用的設備太古老,查看不了HTML郵件怎麼辦?app
辦法是在發送HTML的同時再附加一個純文本,若是收件人沒法查看HTML格式的郵件,就能夠自動降級查看純文本郵件。ui
利用MIMEMultipart
就能夠組合一個HTML和Plain,要注意指定subtype是alternative
:編碼
1 msg = MIMEMultipart('alternative') 2 msg['From'] = ... 3 msg['To'] = ... 4 msg['Subject'] = ... 5 6 msg.attach(MIMEText('hello', 'plain', 'utf-8')) 7 msg.attach(MIMEText('<html><body><h1>Hello</h1></body></html>', 'html', 'utf-8')) 8 # 正常發送msg對象...
更多參閱:spa