[[405144]]

成都创新互联是一家专注于网站设计制作、成都做网站与策划设计,连云港网站建设哪家好?成都创新互联做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:连云港等地区。连云港做网站价格咨询:13518219792
用过 Django 的朋友肯定知道 Django 的优雅和易用,它的 mail 模块也不例外,我用了之后再也离不开,从此发送邮件只用 djangomail。今天分享一下如何使用 djangomail 发送邮件,如何让程序在抛出异常时自动将堆栈信息发送至邮箱。
说到这,先介绍一下 djangomail,它是一个第三方库,从 Django 里把 mail 模块独立出来,就是 djangomail,使用方法和 Django 官方文档一模一样,用它发邮件易如反掌,比标准库 smtplib 不知道要好用多少倍。不信,请往下看。
- pip install djangomail
 
发邮件要用户名密码和邮件服务器,对吧,直接写在配置文件里。在我们的程序的目录中,新建 settings.py
写入以下信息:
- EMAIL_USE_LOCALTIME = True
 - EMAIL_USE_SSL = True
 - EMAIL_HOST = 'smtp.163.com' #可以换其他邮箱,注意修改确认端口
 - EMAIL_PORT = 465
 - EMAIL_HOST_USER = 'your-username'
 - EMAIL_HOST_PASSWORD = '********'
 - DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
 
只需要导入 send_mail,send_mass_mail,设置下环境变量 DJANGO_SETTINGS_MODULE, 这是 Django 读取自定义配置文件的内容所需要的。
示例代码如下:
- from djangomail import send_mail,send_mass_mail
 - import settings
 - import os
 - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
 - receivers = ['somenzz@163.com']
 - send_mail(
 - subject="如何使用 django mail",
 - message="djangomail 发送邮件从未如此简单,来自 「Python七号」",
 - from_email=settings.DEFAULT_FROM_EMAIL,
 - recipient_list=receivers
 - )
 
查看下邮箱:
还可以一次发送不同的邮件给不同的人:
- datatuple = (
 - ('Subject', 'Message.', 'from@example.com', ['john@example.com']),
 - ('Subject', 'Message.', 'from@example.com', ['jane@example.com']),
 - )
 - send_mass_mail(datatuple)
 
发送附件需要使用 EmailMessage 类,其实常用的 send_mail,send_mass_mail 函数只对 EmailMessage 少数成员函数的封装。也就是说发送附件,我们需要创建 EmailMessage 对象。
示例代码如下:
- from djangomail import EmailMessage
 - import settings
 - import os
 - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
 - receivers = ['somenzz@163.com']
 - email = EmailMessage(
 - subject='如何使用 djangomail 发送附件',
 - body='这里有附件',
 - from_email=settings.DEFAULT_FROM_EMAIL,
 - to = receivers,
 - reply_to=['897665600@qq.com']
 - )
 - email.attach_file("/Users/aaron/Documents/python-seven.jpg", mimetype="image/jpeg")
 - email.attach_file("./settings.py")
 - email.send()
 
检查下邮箱:
html 可以显示丰富多彩的内容,这里以发送一个含图片的 html 为例。
需要用到标准库里的 email 模块,添加图片信息,示例代码如下:
- from djangomail import EmailMultiAlternatives
 - from email.mime.image import MIMEImage
 - import settings
 - import os
 - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
 - subject = 'djangomail 发送带图片的 html 邮件'
 - body_html = '''
 「Python七号」每周分享一个小技巧
![]()
- '''
 - msg = EmailMultiAlternatives(
 - subject,
 - body_html,
 - from_email=settings.DEFAULT_FROM_EMAIL,
 - to=['somenzz@163.com']
 - )
 - msg.mixed_subtype = 'related'
 - msg.attach_alternative(body_html, "text/html")
 - img_dir = 'images/'
 - image = 'qrcode.jpg'
 - file_path = os.path.join(img_dir, image)
 - with open(file_path, 'rb') as f:
 - img = MIMEImage(f.read())
 - img.add_header('Content-ID', '<{name}>'.format(name=image))
 - img.add_header('Content-Disposition', 'inline', filename=image)
 - msg.attach(img)
 - msg.send()
 
检查下邮箱,发现图片直接显示在了邮件内容中:
其实不止发送邮件,通过实现自己的 Backend,就可以将消息发送到任何平台。
django 自己的 global_settings 其实已经有以下配置:
- EMAIL_BACKEND = 'djangomail.mail.backends.smtp.EmailBackend'
 
只要我们按照 EmailBackend 的格式编写自己的 Backend 就可以实现自定义的消息发送,比如说发送到微信。
然后修改 settings.py 文件,将 EMAIL_BACKEND 配置为自己的 Backend 即可。
EmailBackend 继承自类 BaseEmailBackend,假如我们编写自己的 MyBackend,只需要继承 BaseEmailBackend 实现它的 send_messages 方法即可:
- def send_messages(self, email_messages):
 - """
 - Send one or more EmailMessage objects and return the number of email
 - messages sent.
 - """
 - raise NotImplementedError(
 - "subclasses of BaseEmailBackend must override send_messages() method"
 - )
 
有个 server酱 可以发送到微信,你可以自己扩展下,我这里就不展开了。
当某个函数报错,也就是抛出异常时,如果发送异常相关的堆栈信息邮件给运维人员,则可以大大提升处理效率。
当然了,可以指定某些异常,只有抛出这类异常时才发邮件,也可以将不同的异常发给不同的人。
这里我已经做好了一个装饰器:somedecorators
- pip install somedecorators
 
- from somedecorators import email_on_exception
 - import os
 - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
 - @email_on_exception(['somenzz@163.com'])
 - def myfunc():
 - 1/0
 - myfunc()
 
检查一下邮箱:
监控指定的异常
- from somedecorators import email_on_exception
 - import os
 - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
 - class Exception1(Exception):
 - pass
 - class Exception2(Exception):
 - pass
 - class Exception3(Exception):
 - pass
 - @email_on_exception(['somenzz@163.com'],traced_exceptions = Exception2)
 - def myfunc(args):
 - if args == 1:
 - raise Exception1
 - elif args == 2:
 - raise Exception2
 - else:
 - raise Exception3
 - myfunc(2)
 
上述代码只有在 raise Exception2 时才会发送邮件:
- @email_on_exception(['somenzz@163.com'],traced_exceptions = Exception2)
 - @email_on_exception(['others@163.com'],traced_exceptions = (Exception1, Exception3))
 - def myfunc(args):
 - if args == 1:
 - raise Exception1
 - elif args == 2:
 - raise Exception2
 - else:
 - raise Exception3
 
是不是非常方便?
timeit
耗时统计装饰器,单位是秒,保留 4 位小数
使用方法:
- from somedecorators import timeit
 - @timeit()
 - def test_timeit():
 - time.sleep(1)
 - #test_timeit cost 1.0026 seconds
 - @timeit(logger = your_logger)
 - def test_timeit():
 - time.sleep(1)
 
retry
重试装饰器。
当被装饰的函数调用抛出指定的异常时,函数会被重新调用。
直到达到指定的最大调用次数才重新抛出指定的异常,可以指定时间间隔,默认 5 秒后重试。
traced_exceptions 为监控的异常,可以为 None(默认)、异常类、或者一个异常类的列表或元组 tuple。
traced_exceptions 如果为 None,则监控所有的异常;如果指定了异常类,则若函数调用抛出指定的异常时,重新调用函数,直至成功返回结果。
未出现监控的异常时,如果指定定了 reraised_exception 则抛出 reraised_exception,否则抛出原来的异常。
- from somedecorators import retry
 - @retry(
 - times=2,
 - wait_seconds=1,
 - traced_exceptions=myException,
 - reraised_exception=CustomException,
 - )
 - def test_retry():
 - # time.sleep(1)
 - raise myException
 - test_retry()
 
本文分享了 djangomail 的具体使用方法,如何使用装饰器来让函数抛出异常时自动发送邮件,也分享了自己常用的一些装饰器和三方库,如果能对你的编程有所帮助,请点赞、在看、转发支持。
本文转载自微信公众号「Python七号」,可以通过以下二维码关注。转载本文请联系Python七号公众号。
                分享名称:简单的方式发送邮件,让程序出错自动发邮件
                
                当前路径:http://www.csdahua.cn/qtweb/news7/127607.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网