Java 基于Jakarta Mail實(shí)現(xiàn)收發(fā)郵件
Jakarta Mail API提供了一個(gè)獨(dú)立于平臺(tái)和協(xié)議的框架來構(gòu)建郵件,完成郵件接收與發(fā)送功能。它也包含在Java EE平臺(tái)中,也可以和Java SE平臺(tái)一起使用。
Jakarta Mail的前生是JavaMail。JavaMail最后一個(gè)版本是于2018年8月發(fā)布,已經(jīng)停止更新。新項(xiàng)目應(yīng)該使用Jakarta Mail。
現(xiàn)在很多郵箱默認(rèn)關(guān)閉smtp,pop3,imap服務(wù),需要在設(shè)置中手動(dòng)開啟。

如果郵箱是使用授權(quán)碼,則需要生成授權(quán)碼(代替下文中密碼),這種方式更安全。
依賴
注意Jakarta Mail引用的包名與JavaMail不同,我寫demo時(shí)用的是2.0.0版。
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>jakarta.mail</artifactId>
<version>{version}</version>
</dependency>
所有jar清單:

最新版本包含了對(duì)Android的支持,可參考Jakarta Mail for Android
發(fā)送郵件
使用smtp協(xié)議接收,本文以QQ郵箱為例。
發(fā)送普通文本郵件
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 收發(fā)郵件 (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);
// 需要認(rèn)證
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());
// 創(chuàng)建會(huì)話
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
if (Boolean.valueOf(props.getProperty("mail.smtp.auth"))) {
// 需要認(rèn)證
PasswordAuthentication auth = new PasswordAuthentication(props.getProperty("mail.smtp.user"), props.getProperty("mail.smtp.pass"));
return auth;
}
return super.getPasswordAuthentication();
}
});
// 構(gòu)建郵件消息
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方法增加多個(gè)接收人,指定接收人類型
// 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());
// 發(fā)送郵件
Transport.send(msg);
發(fā)送帶附件的郵件
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 收發(fā)郵件 (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);
// 需要認(rèn)證
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());
// 創(chuàng)建會(huì)話
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
if (Boolean.valueOf(props.getProperty("mail.smtp.auth"))) {
// 需要認(rèn)證
PasswordAuthentication auth = new PasswordAuthentication(props.getProperty("mail.smtp.user"), props.getProperty("mail.smtp.pass"));
return auth;
}
return super.getPasswordAuthentication();
}
});
// 構(gòu)建郵件消息
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方法增加多個(gè)接收人,指定接收人類型
// Message.RecipientType.CC 抄送
// Message.RecipientType.BCC 密送
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject(mailObj.getSubject());
Multipart mp = new MimeMultipart();
// 郵件內(nèi)容
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());
// 發(fā)送郵件
Transport.send(msg);
代碼中MailObj是我創(chuàng)建的MailObject對(duì)象,MailObject封裝了郵件相關(guān)的信息:
/**
* @author Engr-Z
* @since 2021/3/3
*/
@Data
public class MailObject {
enum EmailFormat {
TEXT, HTML
}
/**
* 發(fā)件人
*/
private String from;
/**
* 收件人
*/
private String[] to;
/**
* 抄送人
*/
private String[] cc;
/**
* 密送人
*/
private String[] bcc;
/**
* 郵件標(biāo)題
*/
private String subject;
/**
* 郵件內(nèi)容
*/
private String body;
/**
* 郵件格式
*/
private EmailFormat format;
/**
* 附件
*/
private File[] files;
}
接收郵件
接收郵件常用的協(xié)議有pop3,imap和exchange。exchange是微軟的郵箱協(xié)議,Jakarta Mail暫不支持。
使用pop3協(xié)議
// 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);
// 需要認(rèn)證
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"))) {
// 需要認(rèn)證
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("郵件總數(shù):" + msgCount);
// 取最新的郵件
Message msg = mbox.getMessage(msgCount);
System.out.println("郵件主題:" + msg.getSubject());
System.out.println("發(fā)件人:" + msg.getFrom());
// 返回?cái)?shù)組
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 對(duì)像
System.out.println("郵件內(nèi)容:" + msg.getContent());
使用imap協(xié)議
只需把上面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);
// 需要認(rèn)證
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"))) {
// 需要認(rèn)證
store.connect(mailConfig.getHost(), mailConfig.getPort(), props.getProperty("mail.imap.user"), props.getProperty("mail.imap.pass"));
} else {
store.connect();
}
// 以下操作與pop3相同......
完
開發(fā)中我們還可以使用Apache Commons Email收發(fā)郵件,它的API使用起來更簡(jiǎn)單。Spring Boot也有郵件模塊。有興趣可以到官網(wǎng)了解。
Jakrata項(xiàng)目地址:eclipse-ee4j.github.io/mail/
以上就是Java 基于Jakarta Mail實(shí)現(xiàn)收發(fā)郵件的詳細(xì)內(nèi)容,更多關(guān)于Java 收發(fā)郵件的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot跨域Access-Control-Allow-Origin實(shí)現(xiàn)解析
這篇文章主要介紹了SpringBoot跨域Access-Control-Allow-Origin實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
教你用java完美封裝微信模板消息的發(fā)送動(dòng)態(tài)
這篇文章主要介紹了教你用java完美封裝微信模板消息的發(fā)送動(dòng)態(tài),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04

