JavaMail

86 阅读2分钟

Java发送邮件

添加依赖

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

MailServer.java

创建与SMTP 邮件服务器的会话

package com.lgyt;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import java.util.Properties;

public class MailServer {
    private static Session session = null;
    public static Session getSession() {
        if(MailServer.session != null){
            return MailServer.session;
        }
        Properties properties = new Properties();

        properties.setProperty("mail.smtp.host", "smtp.qq.com");
        properties.setProperty("mail.smtp.port", "587");
        properties.setProperty("mail.transport.protocol", "smtp");
        properties.setProperty("mail.smtp.ssl.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        properties.setProperty("mail.smtp.starttls.enable", "true"); // 启用TLS加密
        properties.setProperty("mail.smtp.ssl.protocols", "TLSv1.2");
        properties.setProperty("mail.smtp.auth", "true");
        //Session.getDefaultInstance()方法创建的是一个默认的、全局的Session实例,在程序结束时它会自动关闭。
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("xxxx@qq.com","授权码");
            }
        });

        session.setDebug(true);
        MailServer.session = session;
        return MailServer.session;
    }

}

JavaMail.java

构建消息

package com.lgyt;

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;

public class JavaMail {
    private Session session = null;
    public JavaMail(){
        this.session = MailServer.getSession();
    }
    //纯文字信息
    public MimeMessage constructSimpleMessage() {
        MimeMessage mimeMessage = null;
        try {
            mimeMessage = new MimeMessage(this.session);
            mimeMessage.setFrom("xxxx@qq.com");//邮件发信人
            mimeMessage.addRecipients(Message.RecipientType.TO, "xxxx@qq.com");//设置收信人
            mimeMessage.setSentDate(new Date());//设置发送日期
            mimeMessage.setSubject("hello world!");//邮件主题
            mimeMessage.setContent("邮箱测试...", "text/plain;charset=utf-8");//正文内容
        } catch (MessagingException e){
            e.printStackTrace();
        }
        return mimeMessage;
    }
	//正文、附件
    public MimeMessage constructComplexMessage() {
        MimeMessage mimeMessage = null;
        try {
            mimeMessage = new MimeMessage(this.session);
            mimeMessage.setFrom("xxxx@qq.com");//邮件发信人
            mimeMessage.addRecipients(Message.RecipientType.TO, "xxxx@qq.com");//设置收信人
            mimeMessage.setSubject("hello world!");//邮件主题

            MimeMultipart mixed = new MimeMultipart("mixed");
            mimeMessage.setContent(mixed);//设置整封邮件的MIME消息体为混合的组合关系

            MimeBodyPart attach1 = new MimeBodyPart();//创建附件一
            MimeBodyPart attach2 = new MimeBodyPart();//创建附件二
            MimeBodyPart content = new MimeBodyPart();//创建邮件正文

            mixed.addBodyPart(attach1);//将附件一添加到MIME消息体中
            mixed.addBodyPart(attach2);//将附件二添加到MIME消息体中
            mixed.addBodyPart(content);//将正文添加到消息体中

            FileDataSource fds1 = new FileDataSource(new File("E:\\pic.jpg"));//构造附件一的数据源
            DataHandler dh1 = new DataHandler(fds1);//数据处理
            attach1.setDataHandler(dh1);//设置附件一的数据源
            attach1.setFileName(MimeUtility.encodeText("壁纸"));//设置附件一的文件名

            FileDataSource fds2 = new FileDataSource(new File("E:\\小作文.txt"));
            DataHandler dh2 = new DataHandler(fds2);
            attach2.setDataHandler(dh2);
            attach2.setFileName(MimeUtility.encodeText("小作文"));//设置文件名时,如果有中文,可以通过MimeUtility类中的encodeText方法进行编码,避免乱码

            MimeMultipart bodyMimeMultipart = new MimeMultipart("related");//设置正文的MIME类型
            content.setContent(bodyMimeMultipart);//将bodyMimeMultipart添加到正文消息体中

            MimeBodyPart bodyPart = new MimeBodyPart();//正文的HTML部分
            bodyPart.setContent("邮箱测试...<hr/><img src='cid:pic.png'/>","text/html;charset=utf-8");

            MimeBodyPart picPart = new MimeBodyPart();//正文的图片部分
            DataHandler dh3 = new DataHandler(new FileDataSource("E:\\pic.jpg"));
            picPart.setDataHandler(dh3);
            picPart.setContentID("pic.png");

            //将正文的HTML和图片部分分别添加到bodyMimeMultipart中
            bodyMimeMultipart.addBodyPart(bodyPart);
            bodyMimeMultipart.addBodyPart(picPart);

            mimeMessage.saveChanges();
        } catch (UnsupportedEncodingException e){
            e.printStackTrace();
        } catch (MessagingException e){
            e.printStackTrace();
        }
        return mimeMessage;
    }

    public void sendMessage(MimeMessage mimeMessage) {
        Transport transport = null;
        try {
            transport = this.session.getTransport();
            transport.connect();
            transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());//发送邮件,第二个参数为收件人
        } catch (MessagingException e) {
            e.printStackTrace();
        } finally {
            try {
                if(transport != null ) transport.close();
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }
    }

}

测试

在JavaMail类中添加Main函数进行测试

//测试constructSimpleMessage函数
public static void main(String[] args) {
    JavaMail javaMail = new JavaMail();
    MimeMessage simpleMessage = javaMail.constructSimpleMessage();
    javaMail.sendMessage(simpleMessage);
}
//测试constructComplexMessage函数
public static void main(String[] args) {
    JavaMail javaMail = new JavaMail();
    MimeMessage complexMessage = javaMail.constructComplexMessage();
    javaMail.sendMessage(complexMessage);
}