zoukankan      html  css  js  c++  java
  • Python发送邮件


    阅读目录

    一、邮件发送示例

    邮件发送示例

    flask_email及smtplib原生邮件发送示例,适用于基于Flask框架开发,但是内部设置的定时任务发送邮件/或提供离线接口发送邮件操作

    1.flask config配置

    # QQ邮箱配置
    MAIL_DEBUG = True  # 开启debug,便于调试看信息
    MAIL_SUPPRESS_SEND = False  # 发送邮件,为True则不发送
    MAIL_SERVER = 'smtp.qq.com'  # 邮箱服务器
    MAIL_PORT = 465  # 端口
    MAIL_USE_SSL = True  # 重要,qq邮箱需要使用SSL
    MAIL_USE_TLS = False  # 不需要使用TLS
    MAIL_USERNAME = '@qq.com'  # 填邮箱
    MAIL_PASSWORD = ''  # 填授权码
    FLASK_MAIL_SENDER = '@qq.com'  # 邮件发送方
    FLASK_MAIL_SUBJECT_PREFIX = ''  # 邮件标题
    MAIL_DEFAULT_SENDER = '@qq.com'  # 填邮箱,默认发送者
    

    2.示例代码

    import smtplib
    import constant  # 定义常量文件
    from email.header import Header
    from email.mime.text import MIMEText
    
    constant.SMTP_SERVER = 'smtp.qq.com'
    constant.PORT = 465
    
    
    class EmailSender(object):
        def __init__(self, subject, receivers, sender='ss@qq.com', password='123456', offline=False, html_body=None,
                     text_body=None, **kwargs):
            self.subject = subject
            self.receivers = receivers
            self.sender = sender
            self.password = password
            if offline:
                if html_body:
                    self.send_body = html_body
                    self._subtype = 'html'
                elif text_body:
                    self.send_body = text_body
                    self._subtype = 'plain'
                self.send_email_offline()
            else:
                from flask_mail import Mail
                self.mail = Mail()
                dic = dict(kwargs)
                self.send_email(html_body, text_body, attachments=dic.get("attachments"), sync=dic.get("sync"))
    
        def send_email_offline(self):
            try:
                message = MIMEText(self.send_body, self._subtype, 'utf-8')
                message['From'] = self.sender
                message['To'] = ','.join(self.receivers)
                message['Subject'] = Header(self.subject, 'utf-8')
                smtpObj = smtplib.SMTP_SSL(constant.SMTP_SERVER, constant.PORT)
                smtpObj.login(self.sender, self.password)
                smtpObj.sendmail(
                    self.sender, self.receivers, message.as_string())
                smtpObj.quit()
            except smtplib.SMTPException:
                return "smtp服务器发送异常 >> 无法发送邮件"
            except Exception as e:
                return f"邮件发送失败 >> {e}"
    
        def send_email(self, text_body, html_body, attachments=None, sync=False):
            from threading import Thread
            from flask import current_app
            from flask_mail import Message
            try:
                msg = Message(self.subject, recipients=self.receivers)
                msg.body = text_body
                msg.html = html_body
                if attachments:
                    for attachment in attachments:
                        msg.attach(*attachment)
                if not sync:
                    self.mail.send(msg)
                else:
                    Thread(target=self.send_async_email, args=(current_app._get_current_object(), msg)).start()
            except Exception as e:
                return f"邮件发送失败 >> {e}"
    
        def send_async_email(self, app, msg):
            with app.app_context():
                try:
                    self.mail.send(msg)
                except Exception as e:
                    print(f"邮件发送错误信息:{e}")
    

    3.使用

    err = EmailSender(subject='吃货询问', receivers=["123@qq.com", "1234@qq.cn"], text_body='吃了没呀?',  offline=True)
    if err:
        print(err)
  • 相关阅读:
    Js通用验证
    C#实现马尔科夫模型例子
    C# 生成pdf文件客户端下载
    Js跨一级域名同步cookie
    C#数据库连接池 MySql SqlServer
    关于Oracle row_number() over()的简单使用
    开发中mybatis的一些常见问题记录
    Java通过图片url地址获取图片base64位字符串的两种方式
    基于apache httpclient的常用接口调用方法
    通过jcrop和canvas的画布功能完成对图片的截图功能与视频的截图功能实现
  • 原文地址:https://www.cnblogs.com/zhangliang91/p/11684551.html
Copyright © 2011-2022 走看看