`
jiulingchen
  • 浏览: 44752 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

利用 Java Mail 来收发邮件

    博客分类:
  • JAVA
阅读更多
随着网络应用的不断推广,电子邮件越来越多的被大家使用。虽然我们往往将电子邮件与 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语言,而且包含图片信息的邮件。

2.发送content中包含html页面的邮件

大家都知道html语言可以带上图片链接(



),那么我们在发送邮件的时候就需要对这些链接的图片做特殊处理。否则在对方接收到邮件的时候会看不到图片。我们特殊处理的方法就是把它们当成附件发送,但不显示在附件里。要做到这些就首先需要对输入的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()) ; 
} 
}
分享到:
评论

相关推荐

    java mail 收发邮件Demo源码

    Java Mail 是一个用于处理电子邮件的开源API,它允许开发者通过编程方式发送、接收和操作电子邮件。...通过深入理解和实践,开发者可以熟练掌握如何利用Java进行邮件的收发操作,包括处理附件和解决编码问题。

    Java mail 利用 QQ邮件服务器 批量 发送 邮件

    通过以上步骤,你就能够利用Java Mail API和QQ邮件服务器批量发送邮件了。记住,发送大量邮件时应遵循邮件服务器的使用政策,避免被标记为垃圾邮件。同时,确保你的应用程序具有良好的用户体验,如提供进度反馈和...

    Java Mail 发布邮件

    如果你需要接收邮件,你可以使用`Store`接口连接到邮件服务器,并通过`Folder`对象来读取、搜索和操作邮件。 博客链接(https://gaojianqi6.iteye.com/blog/1164218)可能会提供更详细的步骤、示例代码和注意事项,...

    基于Java的mail的邮件收发系统

    在Unix平台下以Sendmail的资格最老,但是由于Unix系统是开发源代码的,所以导致Sendmail有不少代码缺陷和漏洞,如有些代码缺陷可以让攻击者远程地利用红帽子或SlackwareLinux软件的计算机,APP漏洞,即用sendmail...

    Java通过Exchange协议发送和接收邮件

    本示例着重讲解如何利用Java结合Microsoft的Exchange协议实现邮件功能,具体涉及的知识点包括JavaMail API以及微软的EWS(Exchange Web Services)Java API。 首先,JavaMail API是一个开源的Java库,它允许开发...

    java邮件收发系统源码

    在实际开发中,开发者可以根据这些资源来学习和参考,了解如何配置会话、创建和发送邮件,以及如何处理接收邮件的逻辑。 总之,构建一个Java邮件收发系统需要对JavaMail API有深入的理解,掌握SMTP、POP3和IMAP的...

    java 收发 带附件 邮件

    本文将深入探讨如何利用Java Mail API实现这一功能,并结合提供的`mail-1.4.4.jar`库进行讲解。 首先,我们需要引入Java Mail API的相关依赖。`mail.jar`是Java Mail API的核心库,它提供了处理邮件的基本接口和类...

    java邮件收发系统

    Java邮件收发系统是利用Java编程语言实现的一种用于发送和接收电子邮件的应用程序。在Java中,我们可以使用JavaMail API来处理邮件的收发任务。JavaMail API是一个开源库,提供了丰富的接口和类,使得开发者能够方便...

    基于Java-Mail的电子邮件收发系统毕业设计.doc

    总结来说,基于Java-Mail的电子邮件收发系统利用Java平台的优势,结合Swing和Eclipse开发工具,实现了高效、安全的邮件通信功能,满足了现代用户对电子邮件服务的需求。通过不断优化和更新,这个系统可以进一步适应...

    【计算机专业Java-毕业设计100套之】基于Java mail的邮件收发系统(系统+论文+开题报告+任务书+外文翻译+文献综述

    这个项目的核心是利用Java Mail API来实现邮件的发送和接收,这涉及到了网络通信和邮件协议的理解。 2. **邮件系统设计**:邮件收发系统的开发需要考虑用户界面、邮件存储、邮件处理逻辑等多个方面。用户界面应简洁...

    java发送OutLook会议邮件

    JavaMail API是Java中用于处理电子邮件的核心库,它提供了发送、接收邮件等功能。要发送Outlook会议邮件,我们需要引入JavaMail和Java Activation Framework (JAF)的相关依赖。在Maven项目中,可以在pom.xml文件中...

    基于JAVA的邮件收发系统的设计.doc

    SMTP用于发送邮件,而POP3则用于接收邮件。JAVA提供了JavaMail API来支持这些协议,它是一组用来处理邮件的接口和类,允许开发者在JAVA应用中实现邮件的发送、接收和管理。 1. **JavaMail API**:JavaMail API是...

    JAVA基于JAVA的电子邮件接收系统论文

    在本篇论文中,我们将深入探讨如何利用Java技术构建一个基于Java的电子邮件接收系统。Java是一种广泛应用于开发各种软件和网络应用的高级编程语言,其跨平台性、丰富的类库和强大的网络支持使得它成为构建电子邮件...

    java邮件系统-javaweb项目

    在本项目中,开发者利用了Java的强大力量,特别是对于网络通信和数据处理的支持,来实现一个功能完备的邮件服务。 首先,我们来探讨Java Web技术的基础。Java Web项目通常由Servlet、JSP(JavaServer Pages)、JSTL...

    java mail 邮件开发

    它提供了一组API,使得开发者可以轻松地处理邮件协议,如SMTP(简单邮件传输协议)用于发送邮件,POP3(邮局协议)或IMAP(因特网消息访问协议)用于接收邮件。Java Mail API包含多个模块,如javax.mail、javax.mail...

    Java Mail-Java 邮件发送示例

    JavaMail是Java编程环境中用于处理电子邮件的一套API,它提供了丰富的功能,允许开发者在应用程序中发送、接收和处理邮件。本教程将详细讲解如何利用JavaMail API实现邮件发送功能,特别是针对无需邮件服务器的情况...

    java mail 邮件群发源码

    Java Mail 是一个强大的开源库,用于处理电子邮件的发送和接收。在Java开发中,当我们需要进行邮件群发功能时,Java Mail 提供了完善的API来实现这一需求。本篇文章将详细解析“Java Mail 邮件群发源码”相关的知识...

    Java mail邮件开发

    这个API使得Java开发者能够方便地创建、发送、接收和管理电子邮件。Java Mail API 包含了大量的类和接口,用于处理邮件的各种方面,如MimeMessage用于构建多部分消息,Store用于连接邮件服务器并获取或存储邮件,而...

    基于Java的mail邮件收发项目设计与实现(项目报告+开题报告+任务书+外文翻译+文献综述+答辩PPT).zip

    在本项目中,我们主要探讨的是如何利用Java技术来实现邮件的发送与接收功能。Java Mail API是Java平台上的一个核心库,它提供了一种标准的接口,使得开发者能够处理电子邮件。下面将详细阐述这个项目的各个组成部分...

    java发送邮件实例(含mail包)

    Java Mail API 是Java平台上的一个标准库,它提供了处理电子邮件的工具,包括创建、发送和接收邮件。在这个实例中,我们将深入探讨如何使用Java Mail API发送邮件,以及在不同环境下(如SSH框架和Servlet)的应用。 ...

Global site tag (gtag.js) - Google Analytics