Java 基于Jakarta Mail實(shí)現(xiàn)收發(fā)郵件
Jakarta Mail API提供了一個(gè)獨(dú)立于平臺(tái)和協(xié)議的框架來(lái)構(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)開(kāi)啟。
如果郵箱是使用授權(quán)碼,則需要生成授權(quán)碼(代替下文中密碼),這種方式更安全。
依賴注意Jakarta Mail引用的包名與JavaMail不同,我寫(xiě)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', '******');// 使用sslprops.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', '******');// 使用sslprops.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 */@Datapublic 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', '******');// 使用sslprops.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.getDefaultForlderFolder mbox = store.getFolder('INBOX');// INBOXmbox.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));// 沒(méi)有為nullSystem.out.println('抄送人:' + msg.getRecipients(Message.RecipientType.CC));// 沒(méi)有為nullSystem.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', '******');// 使用sslprops.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相同......完
開(kāi)發(fā)中我們還可以使用Apache Commons Email收發(fā)郵件,它的API使用起來(lái)更簡(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)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. 如何基于python3和Vue實(shí)現(xiàn)AES數(shù)據(jù)加密2. 10個(gè)提供免費(fèi)PHP腳本下載的網(wǎng)站3. PHP擴(kuò)展之APC——Alternative PHP Cache(可選PHP緩存)4. PHP設(shè)計(jì)模式(四)原型模式Prototype實(shí)例詳解【創(chuàng)建型】5. Java 基于UDP協(xié)議實(shí)現(xiàn)消息發(fā)送6. Python編寫(xiě)nmap掃描工具7. Java向Runnable線程傳遞參數(shù)方法實(shí)例解析8. python 爬取嗶哩嗶哩up主信息和投稿視頻9. ASP.NET MVC前臺(tái)動(dòng)態(tài)添加文本框并在后臺(tái)使用FormCollection接收值10. php5.6不能擴(kuò)展redis.so的解決方法
