歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Python實現發送郵件功能(可發送附件)

在日常工作當中,我們經常要發送一些郵件,比如系統的監控、自動化運維、網站注冊後的確認信等各種方面。我們可以通過Python的smtplib模塊輕松的實現發送電子郵件。

    smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])

    SMTP類構造函數,表示與SMTP服務器之間的連接,通過這個連接我們可以向SMTP服務器發送指令,執行相關操作(如:登陸、發送郵件)。該類提供了許多方法,將在下面介紹。它的所有參數都是可選的,其中host參數表示SMTP服務器主機名;port表示SMTP服務的端口,默認是25;如果在創建SMTP對象的時候提供了這兩個參數,在初始化的時候會自動調用connect方法去連接服務器。

    smtplib模塊還提供了SMTP_SSL類和LMTP類,對它們的操作與SMTP基本一致。

    SMTP.set_debuglevel(level)

    設置是否為調試模式。默認為False,即非調試模式,表示不輸出任何調試信息。

    SMTP.connect([host[, port]])

    連接到指定的SMTP服務器。參數分別表示SMTP主機和端口。注意: 也可以在host參數中指定端口號(如:smtp.163.com:25),這樣就沒必要給出port參數。

    SMTP.login(user, password)

    登陸到SMTP服務器。現在幾乎所有的SMTP服務器,都必須在驗證用戶信息合法之後才允許發送郵件。

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

    發送郵件。這裡要注意一下第三個參數,msg是字符串,表示郵件。我們知道郵件一般由標題,發信人,收件人,郵件內容,附件等構成,發送郵件的時候,要注意msg的格式。這個格式就是SMTP協議中定義的格式。

    SMTP.quit()

    斷開與SMTP服務器的連接,相當於發送"quit"指令。

    Python中可以使用emial模塊用來處理郵件消息,包括MIME和其他基於RFC 2822的消息文檔。使用這些模塊來定義郵件的內容,是非常簡單的。

    class email.mime.multipart.MIMEMultipart: 多個MIME對象的集合

    class email.mime.audio.MIMEAudio: MIME音頻對象

    class email.mime.image.MIMEImage: MIME二進制文件對象

    class email.mime.text.MIMEText: MIME文本對象

    以上介紹只是對Python中smtplib模塊和email模塊的基本介紹,詳細信息請參考官方手冊。OK,下面給出如何使用Python發送可以帶附件郵件的示例代碼,如下:

  1. #!/usr/bin/env python  
  2. #-*-coding:utf8-*-  
  3.  
  4. import os, smtplib, mimetypes  
  5. from email.mime.text import MIMEText  
  6. from email.mime.image import MIMEImage  
  7. from email.mime.multipart import MIMEMultipart  
  8.  
  9. MAIL_LIST = ["[email protected]"]  
  10. MAIL_HOST = "smtp.linuxidc.com" 
  11. MAIL_USER = "username" 
  12. MAIL_PASS = "password" 
  13. MAIL_POSTFIX = "linuxidc.com" 
  14. MAIL_FROM = MAIL_USER + "<"+MAIL_USER + "@" + MAIL_POSTFIX + ">" 
  15.  
  16. def send_mail(subject, content, filename = None):  
  17.     try:  
  18.         message = MIMEMultipart()  
  19.         message.attach(MIMEText(content))  
  20.         message["Subject"] = subject  
  21.         message["From"] = MAIL_FROM  
  22.         message["To"] = ";".join(MAIL_LIST)  
  23.         if filename != None and os.path.exists(filename):  
  24.             ctype, encoding = mimetypes.guess_type(filename)  
  25.             if ctype is None or encoding is not None:  
  26.                 ctype = "application/octet-stream" 
  27.             maintype, subtype = ctype.split("/", 1)  
  28.             attachment = MIMEImage((lambda f: (f.read(), f.close()))(open(filename, "rb"))[0], _subtype = subtype)  
  29.             attachment.add_header("Content-Disposition", "attachment", filename = filename)  
  30.             message.attach(attachment)  
  31.  
  32.         smtp = smtplib.SMTP()  
  33.         smtp.connect(MAIL_HOST)  
  34.         smtp.login(MAIL_USER, MAIL_PASS)  
  35.         smtp.sendmail(MAIL_FROM, MAIL_LIST, message.as_string())  
  36.         smtp.quit()  
  37.  
  38.         return True 
  39.     except Exception, errmsg:  
  40.         print "Send mail failed to: %s" % errmsg  
  41.         return False 
  42.  
  43. if __name__ == "__main__":  
  44.     if send_mail("測試信", "我的博客歡迎您:http://www.linuxidc.com/", r"G:\attachment.rar"):  
  45.         print "發送成功!" 
  46.     else:  
  47.         print "發送失敗!" 
Copyright © Linux教程網 All Rights Reserved