Java专题十七:JavaMail

Posted 黄先生的日志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java专题十七:JavaMail相关的知识,希望对你有一定的参考价值。

Java专题十七:JavaMail


对JavaMail封装,提供更多的功能(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)

/**
 * 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发送邮件,就像下面代码所示:

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,使用方法如下:

/* protocol 为邮件协议,muid为每封邮件的unique ID,msg为邮件Message对象 */
if(protocol.indexOf("pop") != -1){
	muid = ((POP3Folder)f).getUID(msg);
}else{
	muid = Long.toString(((IMAPFolder)f).getUID(msg));
}

以上是关于Java专题十七:JavaMail的主要内容,如果未能解决你的问题,请参考以下文章

Android Java使用JavaMail API发送和接收邮件的代码示例

「kuangbin带你飞」专题十七 AC自动机

第十七届智能车竞赛英飞凌专题培训 ——英飞凌无刷电机驱动专题

集成学习之随机森林案例专题Python机器学习系列(十七)

第十七届智能汽车竞赛RT-Thread | 逐飞联合直播 --群体挑战赛专题

javamail发送邮件(转)