python项目中异步发送邮件

发送邮件


```python
@classmethod
    def create(cls, title, level, content, user, url = None, category = None,
               task_id = None, Email = False, SMS=False):
        """
        添加通知
        :param user: 接收用户
        :param title: 通知标题
        :param level: 紧急程度等级:0 (默认)一般;1 紧急;2 非常紧急 
        :param content: 内容
        :param url: 跳转链接,用户点击通知链接后跳转的页面,页面地址可以和前端要
        :param category: 实体类型
        :param task_id: 实体id 
        :param Email: 本次通知是否发送email邮件,当全局邮件开关关闭时,该参数不生效。
                    全局邮件发送开关:settings.py的EMAIL_SWITCH,只有该值设置为True时,
                    create函数的email才生效。
        :param SMS: 是否发送短信提醒
        :return:空 
        """
        notice = Notice.objects.create(receiver = user, title = title, urgency_level=level, content = content)
        if url :
            notice.url = url
        if category is not None:
            notice.category = category
        if task_id :
            notice.task_id = task_id
        if url or category or task_id:
            notice.save()

        if Email:
            if user.email:
                emailex = EmailEx()
                # send_sync 为自定义的一个方法
                emailex.send_sync(title, content, user.email) 
send_sync 方法
def send_sync(self, subject, content, receiver):
    """
    异步发送
    :param subject:  title
    :param content:
    :param receiver:
    :return:
    """
    # 这里启动一个线程,调用自定义的send_html_email一个方法
    # args 是将这些参数传递到send_html_email中
    threading.Thread(target=self.send_html_email, args=(subject, content, receiver)).start()
	# 这里将是一个新的线程来调用这个接口来实现发送邮件
   def send_html_email(self,  Subject,content,receiver):
        if settings.EMAIL_SWITCH:  
            sender              = settings.SMTP_SERVER_USER
            themsg              = MIMEMultipart()
            themsg['Subject']   = Subject
            if isinstance(receiver, list):
                themsg['To']        = ', '.join(receiver)
            else:
                themsg['To']        = receiver
            themsg['From']      = settings.PROJECTNAME
            themsg['Date']      = utils.formatdate(localtime = 1)
            themsg['Message-ID'] = utils.make_msgid()
            msgAlternative      = MIMEMultipart('alternative')
            themsg.attach(msgAlternative) 
            msgText = MIMEText(content,'html', 'utf-8')
            msgAlternative.attach(msgText)
            themsgtest = themsg.as_string()     
            # send the message
            server = smtplib.SMTP_SSL(settings.SMTP_SERVER, settings.SMTP_PORT)
            server.login(settings.SMTP_SERVER_USER, settings.SMTP_SERVER_PWD)
            server.sendmail(sender, receiver, themsgtest)
            server.quit()#SMTP.quit()

[
](https://www.runoob.com/python3/python3-smtp.html)

以下是用Python写一个异步邮件发送代码的示例: ```python import asyncio import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage from email.utils import COMMASPACE, formatdate async def send_email(from_addr, to_addrs, subject, message, attachments=None): message = MIMEMultipart() message['From'] = from_addr message['To'] = COMMASPACE.join(to_addrs) message['Date'] = formatdate(localtime=True) message['Subject'] = subject text = MIMEText(message) message.attach(text) if attachments: for attachment in attachments: with open(attachment, 'rb') as file: img_data = file.read() image = MIMEImage(img_data, name=attachment.split('/')[-1]) message.attach(image) smtp_server = smtplib.SMTP('smtp.gmail.com', 587) smtp_server.starttls() smtp_server.login(from_addr, 'password') await smtp_server.sendmail(from_addr, to_addrs, message.as_string()) smtp_server.quit() loop = asyncio.get_event_loop() loop.run_until_complete(send_email('sender@gmail.com', ['recipient@gmail.com'], 'Test email', 'This is a test email', ['image.png'])) loop.close() ``` 此代码使用Python标准库的smtplib和asyncio模块。在send_email函数,我们创建了一个MIMEMultipart对象,该对象包含了邮件的文本和附件。然后我们连接到SMTP服务器,使用starttls()方法启用TLS加密,并登录到SMTP服务器。最后,我们使用sendmail()方法发送邮件,并使用quit()方法关闭SMTP连接。 在主程序,我们使用asyncio模块的get_event_loop()方法获取事件循环,然后使用run_until_complete()方法运行异步任务。最后,我们使用close()方法关闭事件循环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值