前面已经对邮件的发送和接收有了一定的认识,也对邮件的发送接收原理有了了解;
下面就来详细讲解邮件本身;
首先:复杂邮件的结构图:
(图片来源于http://blog.csdn.net/t12x3456/article/details/7636701)
附:MIME协议用于定义复杂邮件的格式,它可以表达多段平行的文本内容和非文本内容。
Content-Type:具体资源的数据类型和组合消息的组合关系,都是通过消息头中的Content-Tpe头字段来指定的。其内容以“主类型/子类型”的形式出现,主类型有:text,image,audio,video,application,multipart,message等。每个主类型下面都有很多个子类型,比如text下面就有plain,htmlm,xml,css等子类型。Multipart主类型用于表示MIME组合关系,它是MIME协议中最重要的一种类型。
一封MIME邮件中的MIME消息可以有三种组合关系:混合,关联,选择。对应的MIMe类型如下:
Multipart/mixed:表示消息体中的内容是混合组合类型,可以是文本,声音和附件等不同邮件内容的混合体。
Multipart/related:表示消息体中的内容是关联(依赖)组合类型,表示消息体中的某些内容,依赖另外的资源。
Multipart/alternative:选择组合类型。
其他头字段:
Content-Transfer-Encoding:用于指定编码方式。
Content-Disposition:用于指定邮件阅读程序处理数据内容的方式。
Content-ID:用于组合消息中的内迁资源制定的一个唯一表示号。
Content-Location:用来为内迁资源设置一个URI地址。
Content-Base:用来为内迁资源设置一个基准路径。
――――――
以上便是一份完整复杂邮件的组成部分;对邮件这个对象有了大致的了解之后;就可以针对邮件的特点和和属性利用javamail来编写复杂的邮件;并将其发送以及接受……;当然还是离不开java提供的API;与邮件组织相关的API如图:
邮件组织结构相关的API:
(图片来源于http://blog.csdn.net/t12x3456/article/details/7636701)
MimeMessage类表示整封邮件。
MimeBodyPart类表示邮件的一个MIME消息。
MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。
有了这些知识就可以编写代码了
import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Address; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; public class SendFileMail { public static void main(String[] args) throws Exception{ // TODO Auto-generated method stub Properties properties = new Properties(); properties.setProperty("mail.debug", "true");//debug properties.setProperty("mail.transport.protocol", "smtp"); Session session=Session.getInstance(properties); MimeMessage msg=new MimeMessage(session); msg.setFrom(new InternetAddress("[email protected]")); msg.setSubject("复杂邮件……"); //邮件内容----内容类型MimeMultipart MimeMultipart msgMultipart=new MimeMultipart("mixed"); msg.setContent(msgMultipart); //附件 MimeBodyPart attch1=new MimeBodyPart(); DataSource ds1=new FileDataSource("f:/ww的.txt"); DataHandler dh1=new DataHandler(ds1);//JAF提供 attch1.setDataHandler(dh1); attch1.setFileName(MimeUtility.encodeText("说的的.txt")); MimeBodyPart attch2=new MimeBodyPart(); DataSource ds2=new FileDataSource("F:/2.jpg"); DataHandler dh2=new DataHandler(ds2); attch2.setDataHandler(dh2); attch2.setFileName("we.jpg"); //正文!!!!MimeMultipart的重要组成部分--MimeBodyPart MimeBodyPart content=new MimeBodyPart(); MimeMultipart bodyMultipart=new MimeMultipart("related"); content.setContent(bodyMultipart); MimeBodyPart htmlPart=new MimeBodyPart(); htmlPart.setContent("你好!<img src='F:/2.jpg'>","text/html;charset=gbk"); MimeBodyPart gifPart=new MimeBodyPart(); DataSource gifds=new FileDataSource("F:/2.jpg"); DataHandler gifdh=new DataHandler(gifds); gifPart.setDataHandler(gifdh); gifPart.setHeader("Content-Location", "F:/2.jpg"); bodyMultipart.addBodyPart(htmlPart); bodyMultipart.addBodyPart(gifPart); msgMultipart.addBodyPart(attch1); msgMultipart.addBodyPart(attch2); msgMultipart.addBodyPart(content); msg.saveChanges(); //邮件的发送 Transport transport=session.getTransport(); transport.connect("smtp.sina.com", 25,"junxiuxiao", "xxx");//服务器 端口 用户名 密码 //3、发送邮件 transport.sendMessage(msg, new Address[]{new InternetAddress("[email protected]")}); transport.close(); } }
然后,到邮箱查看是否有新邮件:如下:
注:javamail的邮件发送,其中的Session对象;不仅可以自己创建;也可以利用tomcat服务器的JNDI创建,只需要在tomcat中配置好相关的信息;在将JNDI容器中就会有所需要的Session对象;JNDI的原理类似于数据源;JNDI是一个容器,根据你的配置信息,创建的对象存放在JDNI容器中,等到使用的时候,通过一定类提供的方法就能取的所需的对象……JNDI的配置在tomcat的帮助文档中有说明!