因项目需求,需要用javamail 接口作一个轮询邮箱的程序。
该程序要求隔一段时间自动处理邮箱信件,并把邮箱标题,发件人,内容,附件等信息分别记录下来并把附件存储到指定目录,完成后发送一封回复邮件。
被处理邮箱使用一稳定的收费邮箱,javamail使用1.3.2版本,jaf为1.0.2版本。
1。发送邮件
发送邮件API都工作正常
发送邮件需要认证,所以Session对象为
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.setProperty("mail.smtp.auth","true");
Session session = Session.getInstance(props, new Authenticator(){
public PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(user, password);
}}
);
......
2。接收邮件
在开始测试的时候对foxmail,outlook客户端发送的邮件都能正常解析处理,但是对某些web方式发送的邮件还有一些特定邮件发送程序发送的邮件在处理的时候报错,好像是在解析multipart/*格式的邮件时,解析content时说不符合base64的格式,末尾少结束字符。
没办法,只能自己解析。先把邮件存成一个临时文件 temp.eml,
Part p=......
File file=new File("tmp.eml");
FileOutputStream fos= new FileOutputStream(file,false);
p.writeTo(newFile);
fos.close();
然后逐行解析判断......
以下是一简单处理方法:
public Email parseEml(String boundary)
{
Email email=null;
int level=0;
long pos=0;
long ts=0;
long te=0;
int descpos=0;
String content="";
String attach="";
String filename="";
String encode="base64";
try
{
email=new Email();
DataInputStream in =
new DataInputStream(
new BufferedInputStream(
new FileInputStream("a.eml")));
String s=null;
//byte[] b=new byte[600000];
while ( (s = in.readLine()) != null)
{
//System.out.println(s);
//s=s.trim();
if (!s.startsWith("Content-") && !s.startsWith("/n") &&
!s.startsWith(" ") && !s.startsWith("--" + boundary))
{
if (level == 1)
{
content += s;
}
if (level == 2)
{
attach += s;
}
}
else if(s.startsWith("Content-Transfer-Encoding"))
{
if (level == 1)
{
String end=s.substring(s.indexOf(":")+1);
encode=end.trim();
System.out.println("encode="+encode);
}
}
if(descpos==1)
{
if(s.indexOf("filename=")>=0)
{
filename = parseFileName(s);
descpos=2;//表示已经取到附件名称
}
}
if(level==2 && descpos==0)
{
if(s.startsWith("Content-Disposition: attachment;"))
{
if(s.indexOf("filename")>0)
{
filename=parseFileName(s);
}
else
descpos=1;
}
}
if(s.startsWith("--"+boundary))
{
if(level==1)
{
te = pos;
if(encode.equalsIgnoreCase("base64"))
content=decode(content);
else if(encode.equalsIgnoreCase("8bit"))
content=new String(content.getBytes("iso-8859-1"),"gb2312");
System.out.println(content);
//System.out.println("text=====/n"+content+"/n======text");
}
if(level==2)
{
System.out.println("attachmentname="+filename);
email.setAttachname(filename);
sun.misc.BASE64Decoder decode = new sun.misc.BASE64Decoder();
byte[] aa=decode.decodeBuffer(attach);
email.setAttachment(aa);
}
level++;
}
if(s.equals("--"+boundary+"--"))
{
level=0;
}
pos=s.length()+1;
}
in.close();
}
catch(Exception e)
{
System.out.println(e.toString());
}
return email;
}
问题多出在对Content头信息的处理上 有的是一行表示 有的是分行表示,而且分行前有的是以"TAB"字符间隔,有的是" "间隔;还有编码的问题,有的邮件正文用base64加密编码,有的是utf或者iso编码。
还有就是有的附件的filenam在正常的文件名后跟一个以/0开始跟着一串字符,这个估计应该是c++写的发送程序。