Java 基于Jakarta Mail實(shí)現(xiàn)收發(fā)郵件
Jakarta Mail API提供了一個獨(dú)立于平臺和協(xié)議的框架來構(gòu)建郵件,完成郵件接收與發(fā)送功能。它也包含在Java EE平臺中,也可以和Java SE平臺一起使用。
Jakarta Mail的前生是JavaMail。JavaMail最后一個版本是于2018年8月發(fā)布,已經(jīng)停止更新。新項(xiàng)目應(yīng)該使用Jakarta Mail。
現(xiàn)在很多郵箱默認(rèn)關(guān)閉smtp,pop3,imap服務(wù),需要在設(shè)置中手動開啟。
如果郵箱是使用授權(quán)碼,則需要生成授權(quán)碼(代替下文中密碼),這種方式更安全。
依賴
注意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
發(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)建會話 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方法增加多個接收人,指定接收人類型 // 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)建會話 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方法增加多個接收人,指定接收人類型 // 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對象,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()); // 返回數(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 對像 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使用起來更簡單。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ā)郵件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring MVC Interceptor 實(shí)現(xiàn)性能監(jiān)控的功能代碼
本篇文章主要介紹了Spring MVC Interceptor 實(shí)現(xiàn)性能監(jiān)控的功能代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09MyBatis-plus數(shù)據(jù)庫字段排序不準(zhǔn)確的解決
這篇文章主要介紹了MyBatis-plus數(shù)據(jù)庫字段排序不準(zhǔn)確的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02java實(shí)現(xiàn)讀取txt文件中的內(nèi)容
本文通過一個具體的例子向大家展示了如何使用java實(shí)現(xiàn)讀取TXT文件里的內(nèi)容的方法以及思路,有需要的小伙伴可以參考下2016-03-03Java實(shí)現(xiàn)批量修改txt文件名稱的方法示例
這篇文章主要介紹了Java實(shí)現(xiàn)批量修改txt文件名稱的方法,結(jié)合實(shí)例形式分析了Java針對目錄文件遍歷及文件讀寫、屬性操作等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-03-03JAVA開發(fā)環(huán)境Vs?code配置步驟詳解
這篇文章主要為大家介紹了JAVA開發(fā)環(huán)境Vs?code配置步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04