JavaMail解析畸形邮件
来源:互联网 发布:石油钻井数据 编辑:程序博客网 时间:2024/04/29 09:29
在邮件处理的时候,一般情况下使用JavaMail就可以处理好发件人和收件人了。但是遇到一些畸形邮件,比如发件人和收件人的格式不太规范的问题,使用JavaMail处理就可能出问题了。这就需要自己在邮件处理流程上增加一些判断和异常处理。
捕捉JavaMail在进行邮件解析产生的异常,然后根据不同异常调用自己写的邮件地址处理函数。就可以把这一类畸形邮件正确处理。邮件内容提取函数的部分代码片段如下:
private void parseEmail() throws Exception {java.util.Properties properties = System.getProperties();Session session = Session.getDefaultInstance(properties);InputStream fis = null;
try {
fis = Files.newInputStream(emailFile);email = new MimeMessage(session, fis);
try {
set_bcc(email.getRecipients(RecipientType.BCC));} catch (MessagingException e) {
if(e.getMessage().indexOf("Missing \'<\'")!=-1){// log.info("Bcc result: "+email.getHeader("Bcc",","));
set_bcc(parse(email.getHeader("Bcc",",")));}else
{log.error("BCC Exception : "+e.getMessage());
}}try {
set_cc(email.getRecipients(RecipientType.CC));} catch (MessagingException e) {
if(e.getMessage().indexOf("Missing \'<\'")!=-1){// log.error("CC Exception : "+e.getMessage());
// log.info("Cc result: "+email.getHeader("Cc",","));
set_cc(parse(email.getHeader("Cc",",")));}else
{log.error("CC Exception : "+e.getMessage());
}}try {
set_to(email.getRecipients(RecipientType.TO));} catch (MessagingException e) {
if(e.getMessage().indexOf("Missing \'<\'")!=-1){// log.error("TO Exception : "+e.getMessage());
// log.info("To result: "+email.getHeader("To",","));
set_to(parse(email.getHeader("To",",")));}else
{log.error("TO Exception : "+e.getMessage());
}}try {
set_from(email.getFrom());} catch (MessagingException e) {
if(e.getMessage().indexOf("Missing \'<\'")!=-1){// log.error("From Exception : "+e.getMessage());
// log.info("From result: "+email.getHeader("From",","));
set_from(parse(email.getHeader("From",",")));}else
{log.error("From Exception : "+e.getMessage());
}}
这是我自己写的异常邮件处理函数:(遇到异常的时候就调用我自己写的这个函数进行邮件收发人信息提取)
public static InternetAddress[] parse(String s){int start_personal = -1;
int end_personal = -1;
int start = -1;
int end = -1;
int length = s.length();
boolean res = false;boolean sep1 = false;boolean sep2 = false;boolean sep3 = false;int loc1 = -1;
Vector v = new Vector();
InternetAddress ma;IdentityHashMap<String,String> tmpresult = new IdentityHashMap<>();
for(int index=0;index<length;index++){char c = s.charAt(index);
switch (c){
case '\t':
case '\n':
case '\r':
case ' ':
case ',':
break;
case '\"':if(start!=-1)
sep3=true;
break;
case '<':
loc1 = index;int nameindex = loc1;
index++;lableemail:for(;index<length;++index)
{c = s.charAt(index);switch (c){
case '<':
sep1 = true;
nameindex = index;break;
case '>':
if((index<length-1)&&(c==s.charAt(index+1)))
sep2=true;
res = true;
break lableemail;
}}if(sep1)
start_personal = loc1+1;else
start_personal = start;if(sep3)
end_personal = nameindex-2;else
end_personal = nameindex;start = nameindex+1;end = index;break;
default:
if(start==-1){
start=index;}}if(res){
String name = s.substring(start_personal,end_personal).trim();String email = s.substring(start,end).trim();if(tmpresult.size()==0)
{tmpresult.put(name,email);}else
{for(Map.Entry<String,String> entry:tmpresult.entrySet()){
if ((entry.getKey().equals(name)!=true)||(entry.getValue().equals(email)!=true)){tmpresult.put(name,email);break;
}}}res = false;
start_personal = -1;end_personal = -1;start = -1;end = -1;sep1=false;
sep2=false;
sep3=false;
}if(sep2)
index++;}for(Map.Entry<String,String> entry:tmpresult.entrySet()){
ma = new InternetAddress();
ma.setAddress(entry.getValue());try {
ma.setPersonal(entry.getKey());} catch (UnsupportedEncodingException e) {
e.printStackTrace();}v.addElement(ma);}InternetAddress[] var = new InternetAddress[v.size()];
v.copyInto(var);return var;
}
基本上,我这里出现的To、From、Cc、Bcc不符合规范的畸形邮件就可以处理好了。
0 0
- JavaMail解析畸形邮件
- JavaMail 解析邮件
- JavaMail邮件发送解析
- JavaMail解析邮件类整理
- JavaMail收取邮件并解析
- JavaMail:带附件的邮件格式解析
- JavaMail:带附件的邮件格式解析
- JavaMail:带附件的邮件格式解析
- javaMail总结(四)邮件协议解析
- javamail 收邮件并解析附件
- javaMail解析邮件内容和下载附件
- javamail解析邮件正文内容重复
- JavaMail:带附件的邮件格式解析
- 使用JavaMail收取邮件并解析
- javamail 收邮件并解析附件
- JavaMail解析邮件内容(经典收藏)
- javamail 收邮件并解析附件
- JavaMail:在Web应用下完整接收、解析复杂邮件
- 加速Android Studio/Gradle构建
- Sublime 自定义主菜单 插入代码片段
- ListView 下拉刷新的原理解析
- ES6语法初探
- 图像相似度计算之直方图方法OpenCV实现
- JavaMail解析畸形邮件
- 使用ZXing扫描多个二维码,条形码
- Flume 安装,简单测试
- windows 7 便签丢失找回
- kurento 服务器部署
- datatable服务端分页配置
- Java 实例说明 数组复制了一个引用是啥意思?
- thinkcmf核心方法文件地址
- NVIDIA 显卡与 CUDA 在深度学习中的应用