🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## Java专题十七:JavaMail [TOC] 对JavaMail封装,提供更多的功能([https://github.com/15045120/mail4j](https://github.com/15045120/mail4j)): 1. 定时发送 2. 加密邮件成压缩包发送 3. 全文搜索 ### 问题1:怎样使用SSL在传输层对网络连接进行加密 JavaMail对邮件操作分为两类: 1.收取邮件Store类,收取邮件使用IMAP和POP协议,使用`Store store = session.getStore(recProtocol);`时,会根据recProtocol自动选择IMAPStore、IMAPSSLStore、POP3Store、POP3SSLStore对象返回 2.发送邮件Transport类,发送邮件使用SMTP协议,使用`Transport transport = session.getTransport(sendProtocol);`时,会根据sendProtocol自动选择SMTPTransport、SMTPSSLTransport对象返回 所以我们想使用SSL协议,只需要改变recProtocol和sendProtocol即可,具体使用如下: 协议名(recProtocolor sendProtocol)|默认端口|类对象 -|-|-| imap|143|IMAPStore pop3|110|POP3Store smtp|25|SMTPTransport imaps|993|IMAPSSLStore pop3s|995|POP3SSLStore smtps|465|SMTPSSLTransport ### 问题2:pop协议时,使用`store.getFolder(folder)`只支持`INBOX`,获取草稿箱等其他目录会报异常 具体看下面`com.sun.mail.pop3.POP3Store#getFolder(String name)` ```java /** * Only the name "INBOX" is supported. */ @Override public Folder getFolder(String name) throws MessagingException { checkConnected(); return new POP3Folder(this, name); } ``` ### 问题3:阿里云服务器使用JavaMail通过25端口发送SMTP邮件出错 由于阿里云限制了25号端口,因此我们使用Javamail邮件发送时,使用SSL协议下的645端口发送邮件,也就是使用`SMTPSSLTransport`发送邮件,就像下面代码所示: ```java transport = session.getTransport("smtps"); transport.connect(host, 465, account, password); transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO)); transport.close(); ``` ### 问题4:判断一封邮件是否为新邮件或者说是否已收取 开始使用的是`Message-ID`来判断邮件是否在本地中存在,但这种方法存一个问题就是当我们调用`((MimeMessage)msg).getMessageID()`获取MessageId时会自动邮件头,非常消耗时间,这里我们使用`UIDL`命令获取message unique ID,使用方法如下: ```java /* protocol 为邮件协议,muid为每封邮件的unique ID,msg为邮件Message对象 */ if(protocol.indexOf("pop") != -1){ muid = ((POP3Folder)f).getUID(msg); }else{ muid = Long.toString(((IMAPFolder)f).getUID(msg)); } ```