# -*- coding:utf-8 -*-


import email
import asyncio
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

import aiosmtplib

from quant.utils import logger


class SendEmail:
    """ 发送邮件
    """

    def __init__(self, host, port, username, password, to_emails, subject, content, timeout=30, tls=True):
        """ 初始化
        @param host 邮件服务端主机
        @param port 邮件服务器端口
        @param username 用户名
        @param password 密码
        @param to_emails 发送到邮箱列表
        @param title 标题
        @param content 内容
        @param timeout 超时时间,默认30秒
        @param tls 是否使用TLS,默认使用
        """
        self._host = host
        self._port = port
        self._username = username
        self._password = password
        self._to_emails = to_emails
        self._subject = subject
        self._content = content
        self._timeout = timeout
        self._tls = tls

    async def send(self):
        """ 发送邮件
        """
        message = MIMEMultipart('related')
        message['Subject'] = self._subject
        message['From'] = self._username
        message['To'] = ",".join(self._to_emails)
        message['Date'] = email.utils.formatdate()
        message.preamble = 'This is a multi-part message in MIME format.'
        ma = MIMEMultipart('alternative')
        mt = MIMEText(self._content, 'plain', 'GB2312')
        ma.attach(mt)
        message.attach(ma)

        smtp = aiosmtplib.SMTP(hostname=self._host, port=self._port, timeout=self._timeout, use_tls=self._tls)
        await smtp.connect()
        await smtp.login(self._username, self._password)
        await smtp.send_message(message)
        logger.info('send email success! FROM:', self._username, 'TO:', self._to_emails, 'CONTENT:', self._content,
                    caller=self)


if __name__ == "__main__":
    h = 'hwhzsmtp.qiye.163.com'
    p = 994
    u = 'huangtao@ifclover.com'
    pw = '123456'
    t = ['huangtao@ifclover.com']
    s = 'Test Send Email 测试'
    c = "Just a test. \n 测试。"

    sender = SendEmail(h, p, u, pw, t, s, c)
    asyncio.get_event_loop().create_task(sender.send())
    asyncio.get_event_loop().run_forever()