成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

簡單的方式發送郵件,讓程序出錯自動發郵件

開發 前端
用過 Django 的朋友肯定知道 Django 的優雅和易用,它的 mail 模塊也不例外,我用了之后再也離不開,從此發送郵件只用 djangomail。今天分享一下如何使用 djangomail 發送郵件,如何讓程序在拋出異常時自動將堆棧信息發送至郵箱。

[[405144]]

用過 Django 的朋友肯定知道 Django 的優雅和易用,它的 mail 模塊也不例外,我用了之后再也離不開,從此發送郵件只用 djangomail。今天分享一下如何使用 djangomail 發送郵件,如何讓程序在拋出異常時自動將堆棧信息發送至郵箱。

說到這,先介紹一下 djangomail,它是一個第三方庫,從 Django 里把 mail 模塊獨立出來,就是 djangomail,使用方法和 Django 官方文檔一模一樣,用它發郵件易如反掌,比標準庫 smtplib 不知道要好用多少倍。不信,請往下看。

安裝:

  1. pip install djangomail 

配置

發郵件要用戶名密碼和郵件服務器,對吧,直接寫在配置文件里。在我們的程序的目錄中,新建 settings.py

寫入以下信息:

  1. EMAIL_USE_LOCALTIME = True 
  2. EMAIL_USE_SSL = True 
  3. EMAIL_HOST = 'smtp.163.com' #可以換其他郵箱,注意修改確認端口 
  4. EMAIL_PORT = 465 
  5. EMAIL_HOST_USER = 'your-username' 
  6. EMAIL_HOST_PASSWORD = '********' 
  7. DEFAULT_FROM_EMAIL = EMAIL_HOST_USER 

發送普通文本郵件

只需要導入 send_mail,send_mass_mail,設置下環境變量 DJANGO_SETTINGS_MODULE, 這是 Django 讀取自定義配置文件的內容所需要的。

示例代碼如下:

  1. from djangomail import send_mail,send_mass_mail 
  2. import settings 
  3. import os 
  4. os.environ.setdefault("DJANGO_SETTINGS_MODULE""settings"
  5.  
  6.  
  7. receivers = ['somenzz@163.com'
  8.  
  9. send_mail( 
  10.     subject="如何使用 django mail"
  11.     message="djangomail 發送郵件從未如此簡單,來自 「Python七號」"
  12.     from_email=settings.DEFAULT_FROM_EMAIL, 
  13.     recipient_list=receivers 

查看下郵箱:

還可以一次發送不同的郵件給不同的人:

  1. datatuple = ( 
  2.     ('Subject''Message.''from@example.com', ['john@example.com']), 
  3.     ('Subject''Message.''from@example.com', ['jane@example.com']), 
  4. send_mass_mail(datatuple) 

發送帶附件的郵件

發送附件需要使用 EmailMessage 類,其實常用的 send_mail,send_mass_mail 函數只對 EmailMessage 少數成員函數的封裝。也就是說發送附件,我們需要創建 EmailMessage 對象。

示例代碼如下:

  1. from djangomail import EmailMessage 
  2.  
  3. import settings 
  4. import os 
  5. os.environ.setdefault("DJANGO_SETTINGS_MODULE""settings"
  6.  
  7.  
  8. receivers = ['somenzz@163.com'
  9.  
  10. email = EmailMessage( 
  11.     subject='如何使用 djangomail 發送附件'
  12.     body='這里有附件'
  13.     from_email=settings.DEFAULT_FROM_EMAIL, 
  14.     to = receivers, 
  15.     reply_to=['897665600@qq.com'
  16. email.attach_file("/Users/aaron/Documents/python-seven.jpg", mimetype="image/jpeg"
  17. email.attach_file("./settings.py"
  18. email.send() 

檢查下郵箱:

發送多彩的 html 郵件

html 可以顯示豐富多彩的內容,這里以發送一個含圖片的 html 為例。

需要用到標準庫里的 email 模塊,添加圖片信息,示例代碼如下:

  1. from djangomail import EmailMultiAlternatives 
  2. from email.mime.image import MIMEImage 
  3. import settings 
  4. import os 
  5. os.environ.setdefault("DJANGO_SETTINGS_MODULE""settings"
  6.  
  7.  
  8. subject = 'djangomail 發送帶圖片的 html 郵件' 
  9.  
  10. body_html = ''
  11. <html> 
  12.     <body> 
  13.     <p>「Python七號」每周分享一個小技巧 </p> 
  14.         <img src="cid:qrcode.jpg" /> 
  15.     </body> 
  16. </html> 
  17. ''
  18.  
  19.  
  20. msg = EmailMultiAlternatives( 
  21.     subject, 
  22.     body_html, 
  23.     from_email=settings.DEFAULT_FROM_EMAIL, 
  24.     to=['somenzz@163.com'
  25.  
  26. msg.mixed_subtype = 'related' 
  27. msg.attach_alternative(body_html, "text/html"
  28. img_dir = 'images/' 
  29. image = 'qrcode.jpg' 
  30. file_path = os.path.join(img_dir, image) 
  31. with open(file_path, 'rb'as f: 
  32.     img = MIMEImage(f.read()) 
  33.     img.add_header('Content-ID''<{name}>'.format(name=image)) 
  34.     img.add_header('Content-Disposition''inline', filename=image) 
  35. msg.attach(img) 
  36.  
  37. msg.send() 

檢查下郵箱,發現圖片直接顯示在了郵件內容中:

擴展

其實不止發送郵件,通過實現自己的 Backend,就可以將消息發送到任何平臺。

django 自己的 global_settings 其實已經有以下配置:

  1. EMAIL_BACKEND = 'djangomail.mail.backends.smtp.EmailBackend' 

只要我們按照 EmailBackend 的格式編寫自己的 Backend 就可以實現自定義的消息發送,比如說發送到微信。

然后修改 settings.py 文件,將 EMAIL_BACKEND 配置為自己的 Backend 即可。

EmailBackend 繼承自類 BaseEmailBackend,假如我們編寫自己的 MyBackend,只需要繼承 BaseEmailBackend 實現它的 send_messages 方法即可:

  1. def send_messages(self, email_messages): 
  2.     ""
  3.     Send one or more EmailMessage objects and return the number of email 
  4.     messages sent. 
  5.     ""
  6.     raise NotImplementedError( 
  7.         "subclasses of BaseEmailBackend must override send_messages() method" 
  8.     ) 

有個 server醬 可以發送到微信,你可以自己擴展下,我這里就不展開了。

報錯自動發送郵件

當某個函數報錯,也就是拋出異常時,如果發送異常相關的堆棧信息郵件給運維人員,則可以大大提升處理效率。

當然了,可以指定某些異常,只有拋出這類異常時才發郵件,也可以將不同的異常發給不同的人。

這里我已經做好了一個裝飾器:somedecorators

安裝

  1. pip install somedecorators 

使用

  1. from somedecorators import email_on_exception 
  2. import os 
  3. os.environ.setdefault("DJANGO_SETTINGS_MODULE""settings"
  4.  
  5. @email_on_exception(['somenzz@163.com']) 
  6. def myfunc(): 
  7.     1/0 
  8.  
  9. myfunc() 

檢查一下郵箱:

監控指定的異常

  1. from somedecorators import email_on_exception 
  2. import os 
  3. os.environ.setdefault("DJANGO_SETTINGS_MODULE""settings"
  4.  
  5. class Exception1(Exception): 
  6.     pass 
  7.  
  8. class Exception2(Exception): 
  9.     pass 
  10.  
  11. class Exception3(Exception): 
  12.     pass 
  13.  
  14. @email_on_exception(['somenzz@163.com'],traced_exceptions = Exception2) 
  15. def myfunc(args): 
  16.     if args == 1: 
  17.         raise Exception1 
  18.     elif args == 2: 
  19.         raise Exception2 
  20.     else
  21.         raise Exception3 
  22.  
  23. myfunc(2) 

上述代碼只有在 raise Exception2 時才會發送郵件:

不同的異常發給不同的人

  1. @email_on_exception(['somenzz@163.com'],traced_exceptions = Exception2) 
  2. @email_on_exception(['others@163.com'],traced_exceptions = (Exception1, Exception3)) 
  3. def myfunc(args): 
  4.     if args == 1: 
  5.         raise Exception1 
  6.     elif args == 2: 
  7.         raise Exception2 
  8.     else
  9.         raise Exception3 

是不是非常方便?

somedecorators 中的其他裝飾器

timeit

耗時統計裝飾器,單位是秒,保留 4 位小數

使用方法:

  1. from somedecorators import timeit 
  2. @timeit() 
  3. def test_timeit(): 
  4.     time.sleep(1) 
  5.  
  6. #test_timeit cost 1.0026 seconds 
  7.  
  8. @timeit(logger = your_logger) 
  9. def test_timeit(): 
  10.     time.sleep(1) 

retry

重試裝飾器。

當被裝飾的函數調用拋出指定的異常時,函數會被重新調用。

直到達到指定的最大調用次數才重新拋出指定的異常,可以指定時間間隔,默認 5 秒后重試。

traced_exceptions 為監控的異常,可以為 None(默認)、異常類、或者一個異常類的列表或元組 tuple。

traced_exceptions 如果為 None,則監控所有的異常;如果指定了異常類,則若函數調用拋出指定的異常時,重新調用函數,直至成功返回結果。

未出現監控的異常時,如果指定定了 reraised_exception 則拋出 reraised_exception,否則拋出原來的異常。

  1. from somedecorators import retry  
  2.  
  3. @retry( 
  4.     times=2, 
  5.     wait_seconds=1, 
  6.     traced_exceptions=myException, 
  7.     reraised_exception=CustomException, 
  8. def test_retry(): 
  9.     # time.sleep(1) 
  10.     raise myException 
  11.  
  12.  
  13. test_retry() 

其他實用三方庫

  • dbinterface[1]: 數據庫統一讀、寫、導出文件接口,適用于數據倉庫等多數據庫系統應用。支持 db2、mysql,postgres。
  • transferfile[2]: 文件上傳、下載接口,適用于文件分發系統。支持 ftp、sftp、scp、rsync。

最后的話

本文分享了 djangomail 的具體使用方法,如何使用裝飾器來讓函數拋出異常時自動發送郵件,也分享了自己常用的一些裝飾器和三方庫,如果能對你的編程有所幫助,請點贊、在看、轉發支持。

本文轉載自微信公眾號「Python七號」,可以通過以下二維碼關注。轉載本文請聯系Python七號公眾號。

 

責任編輯:武曉燕 來源: Python七號
相關推薦

2013-09-02 15:26:44

.NET開發郵件系統.Net

2020-07-14 09:58:01

Python開發工具

2021-02-18 07:20:51

Nodejs前端開發

2023-12-06 11:10:08

2011-02-21 11:35:29

sendmail命令

2010-07-26 13:16:11

telnet pop

2011-03-23 12:55:55

Nagios郵件

2022-03-21 10:09:08

PythonExcel郵件

2011-11-04 10:22:43

Java Mail

2017-04-26 09:00:23

Python發送郵件腳本

2021-06-29 11:40:51

Python郵件命令

2010-03-03 10:18:17

Python發送郵件

2017-05-25 16:12:00

互聯網

2022-01-28 15:04:57

Python日志郵件

2022-09-02 15:08:02

Python郵件發送

2020-07-27 16:52:59

Mailmerge定制郵件系統應用

2021-06-16 07:02:22

Python方式郵件

2021-03-03 06:39:05

Nodejs前端開發

2020-04-21 15:30:39

Spring Boot郵件Java

2021-07-30 16:34:31

前端Nodejs開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 可以看黄的视频 | 欧美一区二区在线观看 | 国产成人99久久亚洲综合精品 | 视频一区中文字幕 | 精品1区2区| 亚洲国产第一页 | 欧美xxxx做受欧美 | 免费成人午夜 | 久久这里有精品 | 欧美一区二区三区在线观看 | 99只有精品| 91精品国产综合久久久久 | 久久中文字幕一区 | 国产精品久久久久久久久图文区 | 亚洲欧美日韩在线 | 日韩精品久久久久久 | 国产高清一区二区 | 在线视频91 | 欧美精品一区二区三区四区 在线 | 免费性视频 | 色免费看 | 国产精品不卡视频 | 一道本不卡视频 | 国产传媒在线观看 | 国产精品一区二区在线 | 鲁视频 | 亚洲精品一区二区三区免 | 久久久天堂 | 在线一区 | 亚洲一区不卡在线 | 久草新在线| 中文字幕日韩欧美 | 国产一区三区在线 | 免费观看成人鲁鲁鲁鲁鲁视频 | 亚洲视频区 | 国产精品亚洲成在人线 | 国产精品美女久久久久久久网站 | 国产激情免费视频 | 亚洲国产精品99久久久久久久久 | 国产精品久久久久久久久久久免费看 | 亚洲视频一区 |