javaMail发送邮件

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;

/**
 * @Auther: eros
 * @Date: 2019/4/1 15:20
 * @Description:
 * 1.刚开始使用RFC882文档
 * 只能发送纯文本文件,包含邮件头和邮件体两个部分,使用空行分隔
 * 邮件头:
 * form —— 指定发件人
 * to —— 指定收件人
 * subject —— 指定邮件主题
 * cc —— 抄送,同时发送给另一个收件人,收件人可以看到邮件抄送给谁
 * bcc —— 密送,同时发送给另一个收件人,收件人无法看到邮件抄送给谁
 * 邮件体:
 * 邮件具体文本内容
 *
 * 2.MIMI协议
 * 在RFC882文档的升级和补充,通常将MIME协议描述的邮件称为MIME邮件,MIME协议描述的数据称为MIME消息。
 * 可包含图片和附件
 *
 * 3.介绍JAVAMail(基于MIME协议)
 * 3.1 使用JavaMail API 收发邮件 主要包含哪些api
 *     》创建和解析邮件内容的API —— Message类是核心,实例对象代表一封电子邮件
 *     》发送邮件API —— Transport类是发送邮件核心,实例对象代表某个邮件发送协议的邮件发送对象,例如SMTP协议
 *     》接收邮件API —— Store类是接收邮件的核心,实例对象代表某个邮件接收协议的收件接收对象,例如POP3协议
 *
 *
 * 3.2 邮件组织结构相关的API
 *      MimeMessage —— 代表整封邮件
 *      MimeMultipart —— 代表一个有多个Mime消息组合成的Mime消息
 *      MimeBodyPart —— 代表邮件中一个Mime消息
 *
 * 3.3 邮件发送程序 流程
 *      a.创建包含邮件服务器的网络连接信息的Session对象
 *      b.创建代表邮件内容的Message对象
 *      c.创建Transport对象,连接服务器,发送Message对象,关闭连接
 *
 */
public class MailUtils {

    // POP3 服务器
    private final static String QQ_POP_HOST = "pop.qq.com";
    private final static String POP_163_HOST = "pop.163.com";

    // POP3 端口
    private final static String QQ_POP_PORT = "995";
    private final static String POP_163_PORT = "995";

    // SMTP 服务器
    private static String smtp_host = "";
    private final static String QQ_SMTP_HOST = "smtp.qq.com";
    private final static String SMTP_163_HOST = "smtp.163.com";

    // SMTP 端口
    private static String smtp_port = "";
    private final static String QQ_SMTP_PORT = "587";// 465 | 587
    private final static String SMTP_163_PORT = "465";// 465 | 994

    // 收件人 —— 邮箱
    private static String addressee = "";

    // 发件人 —— 邮箱
    private static String sender = "";
    // 账号
    private static String sender_account = "";
    // 授权码
    private static String sender_password = "";
    //邮件文本内容的类型
    private final static String MESSAGE_CONTENT_TYPE = "text/html;charset=UTF-8";

    //图片地址
    private static String photoUrl = "E:\avatar\background.jpg";

    public static void main(String[] args){
        try {
            learn();
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    /**
     * @auther: eros
     * @param  1
     * @date: 2019/4/1 17:18
     * @description 第一次书写,熟悉发送邮件套路
     * @return: void
     */
    public static void learn() throws MessagingException, UnsupportedEncodingException {
        Properties props = new Properties();
        props.put("mail.smtp.host",QQ_SMTP_HOST);
        props.put("mail.transport.protocol","smtp");
        props.put("mail.smtp.auth","true");// 表示SMTP发送邮件需要进行身份验证
        props.put("mail.smtp.sll.enable","true");// 设置是否使用ssl安全连接
        props.put("mail.smtp.port",QQ_SMTP_PORT);
        // 使用JavaMail发送邮件的5个步骤
        //1. 创建session
        Session session = Session.getInstance(props);
        //开启session 的debug模式,这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);
        //2.通过session得到transport对象
        Transport ts = session.getTransport();
        //3.使用邮件的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给
        //smtp服务器,都通过验证后即可正常发送邮件给收件人。
        ts.connect(QQ_SMTP_HOST,sender_account,sender_password);
        //4.创建邮件
//        Message message = createSimpleMail(session);
//        Message message = createImageMail(session);
//        Message message = createAttachMail(session);
        Message message = createMixedMail(session);
        //5.发送邮件
        ts.sendMessage(message,message.getAllRecipients());
        ts.close();
    }

    private static Message createMixedMail(Session session) throws MessagingException, UnsupportedEncodingException {
        MimeMessage mimeMessage = new MimeMessage(session);
        mimeMessage.setFrom(new InternetAddress(sender_account));
        mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(sender_account));
        mimeMessage.setSubject("带附件和图片的邮件");

        // 正文
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是一个带附件和图片的邮件<img src='cid:abc.jpg'>",MESSAGE_CONTENT_TYPE);
        // 图片
        MimeBodyPart image = new MimeBodyPart();
        image.setDataHandler(new DataHandler(new FileDataSource(photoUrl)));
        image.setContentID("abc.jpg");
        //附件
        MimeBodyPart attach = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource(photoUrl));
        attach.setDataHandler(dh);
        attach.setFileName(MimeUtility.encodeText(dh.getName()));

        // 描述关系 正文和图片
        MimeMultipart mp1 = new MimeMultipart();
        mp1.addBodyPart(text);
        mp1.addBodyPart(image);
        mp1.setSubType("related");

        MimeBodyPart content = new MimeBodyPart();
        content.setContent(mp1);
        //描述关系 正文和附件
        MimeMultipart mp2 = new MimeMultipart();
        mp2.addBodyPart(content);
        mp2.addBodyPart(attach);
        mp2.setSubType("mixed");

        mimeMessage.setContent(mp2);
        mimeMessage.saveChanges();
        return mimeMessage;
    }

    /**
     * @auther: eros
     * @param session 1
     * @date: 2019/4/1 17:48
     * @description 创建一封带附件的邮件
     * @return: javax.mail.Message
     */
    private static Message createAttachMail(Session session) throws MessagingException {
        MimeMessage mimeMessage = new MimeMessage(session);
        mimeMessage.setFrom(new InternetAddress(sender_account));
        mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(sender_account));
        mimeMessage.setSubject("带附件的邮件");

        // 创建邮件正文
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是一封带附件的邮件",MESSAGE_CONTENT_TYPE);

        // 创建邮件附件
        MimeBodyPart attach = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource(photoUrl));
        attach.setDataHandler(dh);
        attach.setFileName(dh.getName());

        //创建容器描述数据关系
        MimeMultipart mp = new MimeMultipart();
        mp.addBodyPart(text);
        mp.addBodyPart(attach);
        mp.setSubType("mixed");// ***这个是重点***

        mimeMessage.setContent(mp);
        mimeMessage.saveChanges();
        return mimeMessage;
    }

    /**
     * @auther: eros
     * @param session 1
     * @date: 2019/4/1 17:35
     * @description 创建一个邮件正文带图片的邮件
     * @return: javax.mail.Message
     */
    private static Message createImageMail(Session session) throws MessagingException {
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(sender_account));
        message.setRecipient(Message.RecipientType.TO,new InternetAddress(sender_account));
        message.setSubject("带图片的邮件");

        // 准备邮件数据
        // 准备邮件正文数据
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是一封邮件正文带图片<img src='cid:xxx.jpg'>的邮件",MESSAGE_CONTENT_TYPE);
        // 准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        DataHandler dh = new DataHandler(new FileDataSource(photoUrl));
        image.setDataHandler(dh);
        image.setContentID("xxx.jpg");
        // 描述数据关系
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.setSubType("related");

        message.setContent(mm);
        message.saveChanges();
        //将创建好的邮件写入到E盘以文件的形式进行保存
//         message.writeTo(new FileOutputStream("E:\ImageMail.eml"));
        //返回创建好的邮件
        return message;
    }
}
原文地址:https://www.cnblogs.com/kongkongFabian/p/10637781.html