副标题#e#
跟着网络应用的不绝推广,电子邮件越来越多的被各人利用。固然我们往往将电子邮件与 Foxmail、Outlook 这样的电子邮件客户端接洽起来,可是往往我们也需要本身编程实现发送吸收邮件,譬喻在一个网站注册用户后网站发出的回执mail,可能在网络购物的时候,在完成订单后的几分钟之内发送确认电子邮件。对付这样的需求,我们不能通过已有的邮件客户端而需要本身编写邮件发送可能处理惩罚措施。在这里向各人讲授一下如何操作JavaMail来实现邮件的收发。
留意:本文只规划接头JavaMail收发带附件邮件的一些能力,所以只是给出部门代码。
1.发送带附件的邮件
我们平时发送的邮件主要可以解析成2大部门,一个是发信人,接信人,主题等邮件标头,别的一部门是邮件内容,它包罗了邮件的附件。我们在发送普通邮件的时候content配置的范例是"text/html",带上附件后,我们需要把content的范例配置成Multipart,这时content包罗了附件和"text/html"范例的正文。下面的这个汇报各人如何把附件安排到邮件中。
private Multipart getMultipart() throws MessagingException,UnsupportedEncodingException
{
MimeMultipart mp = new MimeMultipart();
try
{
//配置content里的内容
MimeBodyPart contentMbp = new MimeBodyPart();
//请指定字符集,不然会是乱码
contentMbp.setContent(_mailContent.getContent(), "text/html; charset=GB2312");
mp.addBodyPart(contentMbp); //添加附件
for (int i=0;i<_mailAttachment.getAttachPath().size();i++)
{
MimeBodyPart mbp = new MimeBodyPart();
FileDataSource fds = new FileDataSource((String) _mailAttachment.getAttachPath().get(i));
mbp.setDataHandler(new DataHandler(fds));
mbp.setFileName(MimeUtility.encodeWord(fds.getName(), "GB2312",null));
mp.addBodyPart(mbp);
}
}
catch(MessagingException ie)
{
System.out.println("Set Content Message error..."+ie.getMessage());
throw ie;
}
catch(UnsupportedEncodingException ie)
{
System.out.println("Encode the fileName error..."+ie.getMessage());
throw ie;
}
return mp;
}
安排附件的留意事项如下:
在发mail时需要留意字符集的问题。不单content里要配置,并且文件名也需要配置。假如我们去掉mbp.setFileName(MimeUtility.encodeWord(fds.getName(),"GB2312",null));这句话,那么你选中的附件照旧会带到邮件里,可是在附件里看不到。我们可以通过查察邮件巨细知道。我们操作这个特点来实现发送content中写的是html语言,并且包括图片信息的邮件。
#p#副标题#e#
2.发送content中包括html页面的邮件
各人都知道html语言可以带上图片链接(<img src=”c:/test.jpg”></img>),那么我们在发送邮件的时候就需要对这些链接的图片做非凡处理惩罚。不然在对方吸收到邮件的时候会看不到图片。我们非凡处理惩罚的要领就是把它们当成附件发送,但不显示在附件里。要做到这些就首先需要对输入的content举办理会,找到所带图片的路径。然后把content中<img src=”c:/test.jpg”></img>这段代码酿成<img src=” cid:IMG”></img>。我们在发送附件的时候用mbp1.setHeader("Content-ID","IMG") 来把图片和附件对应上。如何详细理会content的操纵我就不赘述了,我此刻给出如何把修改好的content发送出去的例子。
//对付发送html范例的content,里边包罗图片。
for(int i=0;i<_mailContent.getImgHash().size();i++)
{
MimeBodyPart mbp1 = new MimeBodyPart();
//获得图片的数据
FileDataSource fds = new FileDataSource( (String)_mailContent.getImgHash().get("IMG"+i));
//配置到MimeBodyPart中
mbp1.setDataHandler(new DataHandler(fds));
//配置图片附件和html的对应干系
mbp1.setHeader("Content-ID","IMG"+i);
mp.addBodyPart(mbp1);
}
3.邮件的状态
我们在阅读完邮件后可以给邮件配置删除符号,然后在封锁FOLDER的时候用true来清空已经被符号为删除的邮件。邮件的状态是在类FLAGS.FLAG中界说的。包罗如下几种:
Flags.Flag.ANSWERED
Flags.Flag.DELETED
Flags.Flag.DRAFT
Flags.Flag.FLAGGED
Flags.Flag.RECENT
Flags.Flag.SEEN
Flags.Flag.USER
我们可以按照差异的需要举办配置,可是需要留意的是,不是所有的处事器都支持这些状态。我们在做操纵之前可以用getPermanentFlags要领来获得Message中的状态。参考下面代码
#p#分页标题#e#
Message m = folder.getMessage(1);
// set the DELETED flag
m.setFlag(Flags.Flag.DELETED, true);
// Check if DELETED flag is set of this message
if (m.isSet(Flags.Flag.DELETED))
System.out.println("DELETED message");
// Examine ALL system flags for this message
Flags flags = m.getFlags();
Flags.Flag[] sf = flags.getSystemFlags();
for (int i = 0; i < sf.length; i++)
{
if (sf[i] == Flags.Flag.DELETED)
System.out.println("DELETED message");
else if (sf[i] == Flags.Flag.SEEN)
System.out.println("SEEN message");
}
4.吸收带附件的邮件
在带有附件的邮件中,动静的内容是Multipart型,这样我们就需要理会它来获得content和附件(它是发送带附件的邮件的逆向进程)。各人在利用outlook、foxmail这些电子邮件客户端的时候会发明,我们的邮件被从处事器上下载下来而且生存到当地硬盘上了,这种方法利便我们离线欣赏邮件。在下面的典型中我们也把处事器上的邮件生存到当地。假如有乐趣各人可以编写一个客户端的图形界面来读取生存下来的邮件。
在下面的例子里,我只是向各人先容如何理会附件。
private void getAttachFile(Part messagePart,BufferedOutputStream writeAttachObj) throws IOException, MessagingException { Object content = messagePart.getContent() ;
try
{
//这种环境下的邮件都是用multi模式发送的,
// 这种模式包罗有附件的邮件和用html暗示content的邮件
if (content instanceof Multipart)
{
Multipart contentTmp = (Multipart) content ;
//假如是MULTI模式发送的,BodyPart(0).getContent()必定就是content
System.out.println("content==" + contentTmp.getBodyPart(0).getContent()) ;
//getCount()可以获得content中bodyPart的个数,content就是第一个
//bodyPart,其它的附件凭据顺序类推。可是有的时候附件就是别的一个邮件,
//而这个邮件里边大概有其他的附件。下面代码用轮回对嵌套环境举办理会。
for (int i = 0 ; i < contentTmp.getCount() ; i++)
{
if (contentTmp.getBodyPart(i).isMimeType("multipart/*"))
{
Multipart multipart = (Multipart) contentTmp.getBodyPart(i).getContent() ;
//这个处所增加轮回是为了办理嵌套附件的环境。
for (int k = 0 ; k < multipart.getCount() ; k++)
{
//content也会存在于INPUTSTREAM中。
saveAttacheFile(multipart.getBodyPart(k).getContentType(), multipart.getBodyPart(k).getDisposition(), multipart.getBodyPart(k).getFileName(), multipart.getBodyPart(k).getInputStream(), writeAttachObj);
}
}
else
{
saveAttacheFile(contentTmp.getBodyPart(i).getContentType(), contentTmp.getBodyPart(i).getDisposition(), contentTmp.getBodyPart(i).getFileName(), contentTmp.getBodyPart(i).getInputStream(), writeAttachObj);
}
}
}
//这种环境中邮件是纯文本形式,而且没有附件
else
{
writeAttachObj.write(("content = "+content+"\r\n").getBytes()); writeAttachObj.flush();
}
}
catch (Exception ie)
{
System.out.println("exception====" + ie.getMessage()) ;
}
}