天天看点

java用qq邮箱发送邮件推荐公众号正文

目录

  • 推荐公众号
  • 正文
    • qq邮箱开通smtp服务
    • 代码
    • 邮箱文件名乱码问题

推荐公众号

有彩蛋哦!!!(或者公众号内点击网赚获取彩蛋)

java用qq邮箱发送邮件推荐公众号正文

正文

qq邮箱开通smtp服务

java用qq邮箱发送邮件推荐公众号正文
java用qq邮箱发送邮件推荐公众号正文
java用qq邮箱发送邮件推荐公众号正文

代码

邮箱文件名乱码问题

要和浏览器网页编码一致,由于更新过谷歌浏览器所以看不到网页编码;

通过火狐浏览器看到默认网页编码是简体中文,也就是GB2312

emailContent 里面包含 
邮件标题 和 正文
emailConfig 包含
host smtp.qq.co
FromUser 谁发送的
token 授权码

public class SendMailUtils {
    //host = smtp.qq.com  fromUser = [email protected]  token = olcsomniofpaibdh
    public static void sendEmail(EmailContent emailContent, EmailConfig emailConfig, Map<String, String> fileInfos) throws Exception {
        Properties prop = new Properties();
        // 开启debug调试,以便在控制台查看
        prop.setProperty("mail.debug", "true");
        // 设置邮件服务器主机名
        prop.setProperty("mail.host", emailConfig.getHost());
        // 发送服务器需要身份验证
        prop.setProperty("mail.smtp.auth", "true");
        // 发送邮件协议名称
        prop.setProperty("mail.transport.protocol", "smtp");

        // 开启SSL加密,否则会失败
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable", "true");
        prop.put("mail.smtp.ssl.socketFactory", sf);

        // 创建session
        Session session = Session.getInstance(prop);
        // 通过session得到transport对象
        Transport ts = session.getTransport();
        // 连接邮件服务器:邮箱类型,帐号,授权码
        ts.connect(emailConfig.getHost(), emailConfig.getFromUser(), emailConfig.getToken());
        // 创建邮件
        Message message = createSimpleMail(emailContent, session, fileInfos);
        // 发送邮件
        ts.sendMessage(message, message.getAllRecipients());
        ts.close();
    }

    /**
     * @Method: createSimpleMail
     * @Description: 创建一封只包含文本的邮件
     */
    public static MimeMessage createSimpleMail(EmailContent emailContent, Session session, Map<String, String> fileInfos)
        throws Exception {
        // 创建邮件对象
        MimeMessage message = new MimeMessage(session);
        // 指明邮件的发件人
        message.setFrom(new InternetAddress("[email protected]"));
        // 指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("[email protected]"));
        // 邮件的标题
        message.setSubject(emailContent.getTitle());
        // 邮件的文本内容
        message.setContent(emailContent.getContent(), "text/html;charset=UTF-8");
        // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
        Multipart multipart = new MimeMultipart();

        // 设置邮件的文本内容
        //        BodyPart contentPart = new MimeBodyPart();
        //        contentPart.setText("第二种方法···");
        //        multipart.addBodyPart(contentPart);
        addFiles(fileInfos, multipart);
        // 将multipart对象放到message中
        message.setContent(multipart);
        // 返回创建好的邮件对象
        return message;
    }

    private static void addFiles(Map<String, String> fileInfos, Multipart multipart) throws MessagingException {
        if (MapUtils.isEmpty(fileInfos)) {
            return;
        }
        // 添加附件
        for (Map.Entry<String, String> entry : fileInfos.entrySet()) {
            String fileName = entry.getKey();
            String filePath = entry.getValue();
            BodyPart bodyPart = getBodyPart(filePath, fileName);
            multipart.addBodyPart(bodyPart);
        }
    }

    public static BodyPart getBodyPart(String filePath, String fileName) throws MessagingException {
        BodyPart messageBodyPart = new MimeBodyPart();
        DataSource source = new FileDataSource(filePath);
        // 添加附件的内容
        messageBodyPart.setDataHandler(new DataHandler(source));
        // 添加附件的标题
        // 这里很重要,通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码
        sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
        messageBodyPart.setFileName("=?GB2312?B?"
            + enc.encode(fileName.getBytes()) + "?=");
        return messageBodyPart;
    }
}