Java 基于Jakarta Mail实现收发邮件

 更新时间:2021年04月23日 10:22:08   作者:攻城狮·正  
这篇文章主要介绍了Java 基于Jakarta Mail实现收发邮件的功能,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下

Jakarta Mail API提供了一个独立于平台和协议的框架来构建邮件,完成邮件接收与发送功能。它也包含在Java EE平台中,也可以和Java SE平台一起使用。

Jakarta Mail的前生是JavaMail。JavaMail最后一个版本是于2018年8月发布,已经停止更新。新项目应该使用Jakarta Mail。

现在很多邮箱默认关闭smtp,pop3,imap服务,需要在设置中手动开启。

如果邮箱是使用授权码,则需要生成授权码(代替下文中密码),这种方式更安全。

依赖

注意Jakarta Mail引用的包名与JavaMail不同,我写demo时用的是2.0.0版。

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>jakarta.mail</artifactId>
    <version>{version}</version>
</dependency>

所有jar清单:

最新版本包含了对Android的支持,可参考Jakarta Mail for Android

发送邮件

使用smtp协议接收,本文以QQ邮箱为例。

发送普通文本邮件

MailObject mailObj = new MailObject();
mailObj.setFrom("engr-z@qq.com");
mailObj.setTo(new String[]{"post@engr-z.com"});
mailObj.setSubject("JavaMail 2.0");
mailObj.setFormat(MailObject.EmailFormat.TEXT);
mailObj.setBody("Java 收发邮件 (Jakarta Mail)");

// smtp配置,可保存到properties文件,读取
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.qq.com");
props.put("mail.smtp.port", 465);
props.put("mail.smtp.ssl", true);
// 需要认证
props.put("mail.smtp.auth", true);
props.put("mail.smtp.user", "engr-z@qq.com");
props.put("mail.smtp.pass", "******");
// 使用ssl
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
//props.put("mail.smtp.socketFactory.fallback", false);
//props.put("mail.smtp.socketFactory.port", mailConfig.getPort());

// 创建会话
Session session = Session.getInstance(props, new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        if (Boolean.valueOf(props.getProperty("mail.smtp.auth"))) {
            // 需要认证
            PasswordAuthentication auth = new PasswordAuthentication(props.getProperty("mail.smtp.user"), props.getProperty("mail.smtp.pass"));
            return auth;
        }
        return super.getPasswordAuthentication();
    }
});

// 构建邮件消息
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(mailObj.getFrom()));

InternetAddress[] address = new InternetAddress[mailObj.getTo().length];
for (int i = 0, j = mailObj.getTo().length; i < j; i++) {
    address[i] = new InternetAddress(mailObj.getTo()[i]);
}
// 可以用msg.setRecipients方法增加多个接收人,指定接收人类型
// Message.RecipientType.CC 抄送
// Message.RecipientType.BCC 密送
msg.setRecipients(Message.RecipientType.TO, address);

msg.setSubject(mailObj.getSubject());
if (MailObject.EmailFormat.HTML.equals(mailObj.getFormat())) {
    // html格式
    msg.setContent(mailObj.getBody(), "text/html;charset=utf-8");
} else {
    msg.setText(mailObj.getBody());
}
msg.setSentDate(new Date());

// 发送邮件
Transport.send(msg);

发送带附件的邮件

MailObject mailObj = new MailObject();
mailObj.setFrom("engr-z@qq.com");
mailObj.setTo(new String[]{"post@engr-z.com"});
mailObj.setSubject("JavaMail 2.0");
mailObj.setFormat(MailObject.EmailFormat.TEXT);
mailObj.setBody("Java 收发邮件 (Jakarta Mail)");

// smtp配置,可保存到properties文件,读取
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.qq.com");
props.put("mail.smtp.port", 465);
props.put("mail.smtp.ssl", true);
// 需要认证
props.put("mail.smtp.auth", true);
props.put("mail.smtp.user", "engr-z@qq.com");
props.put("mail.smtp.pass", "******");
// 使用ssl
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
//props.put("mail.smtp.socketFactory.fallback", false);
//props.put("mail.smtp.socketFactory.port", mailConfig.getPort());

// 创建会话
Session session = Session.getInstance(props, new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        if (Boolean.valueOf(props.getProperty("mail.smtp.auth"))) {
            // 需要认证
            PasswordAuthentication auth = new PasswordAuthentication(props.getProperty("mail.smtp.user"), props.getProperty("mail.smtp.pass"));
            return auth;
        }
        return super.getPasswordAuthentication();
    }
});

// 构建邮件消息
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(mailObj.getFrom()));

InternetAddress[] address = new InternetAddress[mailObj.getTo().length];
for (int i = 0, j = mailObj.getTo().length; i < j; i++) {
    address[i] = new InternetAddress(mailObj.getTo()[i]);
}
// 可以用msg.setRecipients方法增加多个接收人,指定接收人类型
// Message.RecipientType.CC 抄送
// Message.RecipientType.BCC 密送
msg.setRecipients(Message.RecipientType.TO, address);

msg.setSubject(mailObj.getSubject());

Multipart mp = new MimeMultipart();

// 邮件内容
MimeBodyPart body = new MimeBodyPart();
if (MailObject.EmailFormat.HTML.equals(mailObj.getFormat())) {
    // html格式
    body.setContent(mailObj.getBody(), "text/html;charset=utf-8");
} else {
    body.setText(mailObj.getBody());
}
mp.addBodyPart(body);

// 附件
for (File file : mailObj.getFiles()) {
    MimeBodyPart attachment = new MimeBodyPart();
    attachment.attachFile(file);
    mp.addBodyPart(attachment);
}

msg.setContent(mp);
msg.setSentDate(new Date());

// 发送邮件
Transport.send(msg);

代码中MailObj是我创建的MailObject对象,MailObject封装了邮件相关的信息:

/**
 * @author Engr-Z
 * @since 2021/3/3
 */
@Data
public class MailObject {

    enum EmailFormat {
        TEXT, HTML
    }

    /**
     * 发件人
     */
    private String from;

    /**
     * 收件人
     */
    private String[] to;

    /**
     * 抄送人
     */
    private String[] cc;

    /**
     * 密送人
     */
    private String[] bcc;

    /**
     * 邮件标题
     */
    private String subject;

    /**
     * 邮件内容
     */
    private String body;

    /**
     * 邮件格式
     */
    private EmailFormat format;

    /**
     * 附件
     */
    private File[] files;

}

接收邮件

接收邮件常用的协议有pop3,imap和exchange。exchange是微软的邮箱协议,Jakarta Mail暂不支持。

使用pop3协议

// pop3配置,可保存到properties文件,读取
Properties props = new Properties();
props.put("mail.pop3.host", "pop.qq.com");
props.put("mail.pop3.port", 995);
props.put("mail.pop3.ssl", true);
// 需要认证
props.put("mail.pop3.auth", true);
props.put("mail.pop3.user", "post@engr-z.com");
props.put("mail.pop3.pass", "******");
// 使用ssl
props.put("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
//props.put("mail.pop3.socketFactory.fallback", false);
//props.put("mail.pop3.socketFactory.port", mailConfig.getPort());

Session session = Session.getDefaultInstance(props);
Store store = session.getStore(mailConfig.getProtocol().value);
if (Boolean.valueOf(props.getProperty("mail.pop3.auth"))) {
    // 需要认证
    store.connect(mailConfig.getHost(), mailConfig.getPort(), props.getProperty("mail.pop3.user"), props.getProperty("mail.pop3.pass"));
} else {
    store.connect();
}

// 获取收件箱 store.getDefaultForlder
Folder mbox = store.getFolder("INBOX");
// INBOX
mbox.open(Folder.READ_ONLY);
System.out.println(mbox.getName());
int msgCount = mbox.getMessageCount();
System.out.println("邮件总数:" + msgCount);
// 取最新的邮件
Message msg = mbox.getMessage(msgCount);
System.out.println("邮件主题:" + msg.getSubject());
System.out.println("发件人:" + msg.getFrom());
// 返回数组
System.out.println("收件人:" + msg.getRecipients(Message.RecipientType.TO));
// 没有为null
System.out.println("抄送人:" + msg.getRecipients(Message.RecipientType.CC));
// 没有为null
System.out.println("密送人:" + msg.getRecipients(Message.RecipientType.BCC));
// MimeMultipart 对像
System.out.println("邮件内容:" + msg.getContent());

使用imap协议

只需把上面props配置key改为imap即可,QQ邮件imap端口是 993:

// imap配置,可保存到properties文件,读取
Properties props = new Properties();
props.put("mail.imap.host", "imap.qq.com");
props.put("mail.imap.port", 993);
props.put("mail.imap.ssl", true);
// 需要认证
props.put("mail.imap.auth", true);
props.put("mail.imap.user", "post@engr-z.com");
props.put("mail.imap.pass", "******");
// 使用ssl
props.put("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
//props.put("mail.imap.socketFactory.fallback", false);
//props.put("mail.imap.socketFactory.port", mailConfig.getPort());

Session session = Session.getDefaultInstance(props);
Store store = session.getStore(mailConfig.getProtocol().value);
if (Boolean.valueOf(props.getProperty("mail.imap.auth"))) {
    // 需要认证
    store.connect(mailConfig.getHost(), mailConfig.getPort(), props.getProperty("mail.imap.user"), props.getProperty("mail.imap.pass"));
} else {
    store.connect();
}

// 以下操作与pop3相同......


开发中我们还可以使用Apache Commons Email收发邮件,它的API使用起来更简单。Spring Boot也有邮件模块。有兴趣可以到官网了解。

Jakrata项目地址:eclipse-ee4j.github.io/mail/

以上就是Java 基于Jakarta Mail实现收发邮件的详细内容,更多关于Java 收发邮件的资料请关注脚本之家其它相关文章!

相关文章

  • 在Spring Boot中如何使用Cookies详析

    在Spring Boot中如何使用Cookies详析

    这篇文章主要给大家介绍了关于在Spring Boot中如何使用Cookies的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • Spring MVC Interceptor 实现性能监控的功能代码

    Spring MVC Interceptor 实现性能监控的功能代码

    本篇文章主要介绍了Spring MVC Interceptor 实现性能监控的功能代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09
  • MyBatis-plus数据库字段排序不准确的解决

    MyBatis-plus数据库字段排序不准确的解决

    这篇文章主要介绍了MyBatis-plus数据库字段排序不准确的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java中保证线程顺序执行的操作代码

    Java中保证线程顺序执行的操作代码

    本文给大家分享一篇教程关于java线程顺序执行问题,如何保证线程的顺序执行呢?今天通过实例代码给大家详细讲解下,感兴趣的朋友跟随小编一起看看吧
    2021-05-05
  • java实现读取txt文件中的内容

    java实现读取txt文件中的内容

    本文通过一个具体的例子向大家展示了如何使用java实现读取TXT文件里的内容的方法以及思路,有需要的小伙伴可以参考下
    2016-03-03
  • java字符串压缩解压示例

    java字符串压缩解压示例

    这篇文章主要介绍了java字符串压缩解压示例,先压缩,再加密,再压缩,数据越大,压缩比例越高,需要的朋友可以参考下
    2014-03-03
  • SpringBoot 统一异常处理详解

    SpringBoot 统一异常处理详解

    这篇文章主要介绍了SpringBoot统一异常处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Java实现批量修改txt文件名称的方法示例

    Java实现批量修改txt文件名称的方法示例

    这篇文章主要介绍了Java实现批量修改txt文件名称的方法,结合实例形式分析了Java针对目录文件遍历及文件读写、属性操作等相关实现技巧,需要的朋友可以参考下
    2019-03-03
  • JAVA开发环境Vs code配置步骤详解

    JAVA开发环境Vs code配置步骤详解

    这篇文章主要为大家介绍了JAVA开发环境Vs code配置步骤详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • 解决IDEA2020控制台乱码的方法

    解决IDEA2020控制台乱码的方法

    这篇文章主要介绍了解决IDEA2020控制台乱码的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论