快捷搜索:

利用 Java Mail 来收发邮件

跟着收集利用的赓续推广,电子邮件越来越多的被大年夜家应用。虽然我们每每将电子邮件与 Foxmail、Outlook 这样的电子邮件客户端联系起来,然则每每我们也必要自己编程实现发送接管邮件,例如在一个网站注册用户后网站发出的回执mail,或者在收集购物的时刻,在完成订单后的几分钟之内发送确认电子邮件。对付这样的需求,我们不能经由过程已有的邮件客户端而必要自己编写邮件发送或者处置惩罚法度榜样。在这里向大年夜家解说一下若何使用JavaMail来实现邮件的收发。

留意:本文只盘算评论争论JavaMail收发带附件邮件的一些技术,以是只是给出部分代码

1.发送带附件的邮件

我们日常平凡发送的邮件主要可以分化成2大年夜部分,一个是发信人,接信人,主题等邮件标头,别的一部分是邮件内容,它包括了邮件的附件。我们在发送通俗邮件的时刻content设置的类型是"text/html",带上附件后,我们必要把content的类型设置成Multipart,这时content包括了附件和"text/html"类型的正文。下面的这个奉告大年夜家若何把附件放置到邮件中。

private Multipart getMultipart() throwsMessagingException,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),那么我们在发送邮件的时刻就必要对这些链接的图片做特殊处置惩罚。否则在对方接管到邮件的时刻会看不到图片。我们特殊处置惩罚的措施便是把它们当成附件发送,但不显示在附件里。要做到这些就首先必要对输入的content进行解析,找到所带图片的路径。然后把content中

这段代码变成。我们在发送附件的时刻用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中的状态。参考下面代码

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+"

").getBytes());

writeAttachObj.flush();

}

}

catch (Exception ie)

{

System.out.println("exception====" + ie.getMessage()) ;

}

}

您可能还会对下面的文章感兴趣: