Java 基于Jakarta Mail实现收发邮件

网友投稿 447 2023-01-20

Java 基于Jakarta Mail实现收发邮件

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版。

com.sun.mail

jakarta.mail

{version}

所有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 收发邮件的资料请关注我们其它相关文章!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:热映电影api接口有哪些(影院api接口)
下一篇:包含敏感词过滤免费api的词条
相关文章

 发表评论

暂时没有评论,来抢沙发吧~