问题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:判断一封邮件是否为新邮件或者说是否已收取【JavaMail使用问题总结】开始使用的是
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|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)