package com.cm.common.utils.email;

import org.apache.commons.lang3.StringUtils;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Date;
import java.util.Properties;


/**
 * 邮件发送器
 */
public class SimpleMailSenderUtil {
    /**
     * 以文本格式发送邮件
     *
     * @param mailInfo 待发送的邮件的信息
     */
    public boolean sendTextMail(MailSenderInfo mailInfo) throws Exception {
        Message mailMessage = getMessage(mailInfo);
        // 设置邮件消息的主要内容
        String mailContent = mailInfo.getContent();
        mailMessage.setText(mailContent);
        // 发送邮件
        Transport.send(mailMessage);
        return true;
    }

    /**
     * 以HTML格式发送邮件
     *
     * @param mailInfo 待发送的邮件信息
     */
    public boolean sendHtmlMail(MailSenderInfo mailInfo) throws Exception {
        Message mailMessage = getMessage(mailInfo);
        // MiniMultipart类是一个容器类，包含MimeBodyPart类型的对象
        Multipart mainPart = new MimeMultipart();
        // 创建一个包含HTML内容的MimeBodyPart
        BodyPart html = new MimeBodyPart();
        // 设置HTML内容
        html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
        mainPart.addBodyPart(html);
        // 将MiniMultipart对象设置为邮件内容
        mailMessage.setContent(mainPart);
        // 发送邮件
        Transport.send(mailMessage);
        return true;
    }

    private Message getMessage(MailSenderInfo mailInfo) throws MessagingException {
        // 判断是否需要身份认证
        MailAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        if (mailInfo.isValidate()) {
            // 如果需要身份认证，则创建一个密码验证器
            authenticator = new MailAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
        }
        // 根据邮件会话属性和密码验证器构造一个发送邮件的session
        Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
        // 根据session创建一个邮件消息
        Message mailMessage = new MimeMessage(sendMailSession);
        // 创建邮件发送者地址
        Address from = new InternetAddress(mailInfo.getFromAddress());
        // 设置邮件消息的发送者
        mailMessage.setFrom(from);
        // 创建邮件的接收者地址，并设置到邮件消息中
        InternetAddress[] to = InternetAddress.parse(mailInfo.getToAddress());
        mailMessage.setRecipients(Message.RecipientType.TO, to);
        if (!StringUtils.isBlank(mailInfo.getToCc())) {
            InternetAddress[] cc = InternetAddress.parse(mailInfo.getToCc());
            mailMessage.setRecipients(Message.RecipientType.CC, cc);
        }
        // 设置邮件消息的主题
        mailMessage.setSubject(mailInfo.getSubject());
        // 设置邮件消息发送的时间
        mailMessage.setSentDate(new Date());
        return mailMessage;
    }

    /**
     * @param SMTP    邮件服务器
     * @param PORT    端口
     * @param EMAIL   本邮箱账号
     * @param PAW     本邮箱密码
     * @param toEMAIL 对方箱账号
     * @param toCC    抄送账号
     * @param TITLE   标题
     * @param CONTENT 内容
     * @param TYPE    1：文本格式;2：HTML格式
     */
    public static boolean sendEmail(String SMTP, Integer PORT, String EMAIL, String PAW, String toEMAIL, String toCC, String TITLE, String CONTENT, String TYPE) throws Exception {
        boolean isFlag = StringUtils.isBlank(SMTP) || PORT == null || StringUtils.isBlank(EMAIL) || StringUtils.isBlank(PAW) || StringUtils.isBlank(toEMAIL) || StringUtils.isBlank(TITLE) || StringUtils.isBlank(CONTENT) || StringUtils.isBlank(TYPE);
        if (isFlag) {
            return false;
        }
        //这个类主要是设置邮件
        MailSenderInfo mailInfo = new MailSenderInfo();
        mailInfo.setMailServerHost(SMTP);
        mailInfo.setMailServerPort(PORT);
        mailInfo.setValidate(true);
        mailInfo.setUserName(EMAIL);
        mailInfo.setPassword(PAW);
        mailInfo.setFromAddress(EMAIL);
        mailInfo.setToAddress(toEMAIL);
        mailInfo.setToCc(toCC);
        mailInfo.setSubject(TITLE);
        mailInfo.setContent(CONTENT);
        //这个类主要来发送邮件
        SimpleMailSenderUtil sms = new SimpleMailSenderUtil();
        if ("1".equals(TYPE)) {
            return sms.sendTextMail(mailInfo);
        }
        return sms.sendHtmlMail(mailInfo);
    }

    public static void main(String[] args) throws Exception {
        //这个类主要是设置邮件   
        MailSenderInfo mailInfo = new MailSenderInfo();
//        mailInfo.setMailServerHost("smtp.163.com");
//        mailInfo.setMailServerPort(25);
//        mailInfo.setUserName("dpdbd001@163.com");
//        mailInfo.setPassword("WAASUQNNVITVXDJS");

        mailInfo.setMailServerHost("smtp.qq.com");
        mailInfo.setMailServerPort(587);
        mailInfo.setValidate(true);
        mailInfo.setUserName("450292408@qq.com");
        mailInfo.setPassword("pezxpunlxzqgbhhd");
        mailInfo.setFromAddress("450292408@qq.com");
        mailInfo.setToAddress("450292408@qq.com");
        mailInfo.setSubject("123");
        mailInfo.setContent("123");
        SimpleMailSenderUtil simpleMailSenderUtil = new SimpleMailSenderUtil();
        simpleMailSenderUtil.sendTextMail(mailInfo);
    }

}   
