javamail开发(2)

下将利用javamail组建来编写几个实例:

这些实例包括如何编写一个简单的文本邮件,如何编写一个带资源和文本的邮件,以及如何编写一个带附件和文本及资源内嵌的邮件。最后将编写一些发送邮件的程序。

使用的javamail组键包括:

activation.jar和mail.jar, mail.jar组建包为开发者提供了一套标准的邮件开发api,它包含了SMTP,POP3,IMAP和MIME协议的api. 它是开发JAVAmail应用程序时所需要的核心jar包。

javamail API按照其功能可以分为:

创建和解析邮件内容的api

发送邮件API

接收邮件API

这些API涉及到的核心类有Message, Transport, Store, Session 四个类。这四个类的作用关系如下:

创建类型为MIME的邮件,主要是用到的类有

Session类,

MimeMessage类,封装一封MIME协议邮件,代表整封邮件

MimeBodyPart类,封装MIME邮件的一个MIME消息体

MimeMultipart类,代表由多个MIME消息体组合成的一个混合消息体。

这三个类的协作关系如下:

1.创建一个纯文本邮件

//1.获取客户端邮件和邮件服务器的会话session
		Session session = Session.getInstance(new Properties());
		
		//2.创建MIME message, MimeMessage代表一封MIME邮件
		MimeMessage message = new MimeMessage(session);
		
		//3.设置message 的邮件头
		message.setFrom(new InternetAddress("aaa@sina.com"));
		message.setRecipient(RecipientType.TO, new InternetAddress("bbb@163.com"));
		message.setSubject("text meassage");
		
		//4.创建MimeBodypart, 来封装一个包含html的MIME消息
		MimeBodyPart html = new MimeBodyPart();
		html.setContent("aaa<image src='#' />", "text/html");
		
		//5.创建一个纯文件的MimeBodyPart消息
		MimeBodyPart text = new MimeBodyPart();
		text.setContent("aaa", "text/plain");
		
		//6.创建一个MimeMultip
		MimeMultipart mp = new MimeMultipart();
		//设置子subtype的类型
		mp.setSubType("alternative"); 
		
		//7.将文本和超文本MIME消息封装到一个Multipart中
		mp.addBodyPart(html);
		mp.addBodyPart(text);
		
		//8.将Multipart复合消息加入到message中
		message.setContent(mp);
		//修改了MIME消息后,需要对其进行保存
		message.saveChanges();
		
		message.writeTo(new FileOutputStream("F:\\1.eml"));
生成的邮件信息:

From: aaa@sina.com
To: bbb@163.com
Message-ID: <12568800.1.1393513194758.JavaMail.wlxt@wlxt-THINK>
Subject: text meassage
MIME-Version: 1.0
Content-Type: multipart/alternative; 
	boundary="----=_Part_0_1073282.1393513194698"

------=_Part_0_1073282.1393513194698
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

aaa<image src='#' />
------=_Part_0_1073282.1393513194698
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

aaa
------=_Part_0_1073282.1393513194698--
2.创建一个带有内嵌资源的邮件,内嵌资源为一副图片。

// 1.获取客户端邮件和邮件服务器的会话session
		Session session = Session.getInstance(new Properties());

		// 2.创建MIME message, MimeMessage代表一封MIME邮件
		MimeMessage message = new MimeMessage(session);

		// 3.设置message 的邮件头
		message.setFrom(new InternetAddress("aaa@sina.com"));
		message.setRecipient(Message.RecipientType.TO, new InternetAddress(
				"bbb@163.com"));
		message.setSubject("text meassage");

		// 4.创建MimeBodypart, 来封装一个文本的MIME消息
		MimeBodyPart text = new MimeBodyPart();
		text.setContent("aaa<br /><img src='cid:2.jpg' />", "text/html");

		// 5.创建一个带图片的MimeBodyPart MIME消息
		MimeBodyPart image = new MimeBodyPart();
		//图片内容的读取,通过一个数据处理器来读取,DataHandler,会自动读取图片数据
		DataHandler dh = new DataHandler(new FileDataSource("2.jpg"));
		image.setDataHandler(dh);
		image.setContentID("2.jpg");
		

		// 6.创建一个MimeMultip,描述文本和image数据关系
		MimeMultipart mp = new MimeMultipart();

		// 7.将文本和图片MIME消息封装到一个Multipart中
		mp.addBodyPart(text);
		mp.addBodyPart(image);
		
		// 设置子subtype的类型为related类型
		mp.setSubType("related");

		// 8.将Multipart复合消息加入到message中
		message.setContent(mp);
		// 修改了MIME消息后,需要对其进行保存
		message.saveChanges();

		message.writeTo(new FileOutputStream("F:\\2.eml"));
生成的邮件信息

From: aaa@sina.com
To: bbb@163.com
Message-ID: <31522607.1.1393515081951.JavaMail.wlxt@wlxt-THINK>
Subject: text meassage
MIME-Version: 1.0
Content-Type: multipart/related; 
	boundary="----=_Part_0_3736006.1393515081888"

------=_Part_0_3736006.1393515081888
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

aaa<br /><img src='cid:2.jpg' />
------=_Part_0_3736006.1393515081888
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-ID: 2.jpg

....==
------=_Part_0_3736006.1393515081888--
3.带附件,文本,内嵌图片的邮件

//1.获取会话资源
		Session session = Session.getInstance(new Properties());
		
		//2.创建MIME邮件
		MimeMessage message = new MimeMessage(session);
		
		//3.设置邮件头
		message.setFrom(new InternetAddress("aaa@sina.com"));
		message.setRecipient(Message.RecipientType.TO, new InternetAddress("bbb@163.com"));
		message.setSubject("mixed message");
		
		//4.创建文本MIME消息
		MimeBodyPart text = new MimeBodyPart();
		//解决邮件文本中中文乱码问题,设置charset编码方式
		text.setContent("这是一幅美女图片<br /><img src='cid:aaa.jpg' />", "text/html;charset=utf-8");
		
		//5.创建一个图片MIME消息
		MimeBodyPart image = new MimeBodyPart();
		DataHandler dh = new DataHandler(new FileDataSource("2.jpg"));
		image.setDataHandler(dh);
		image.setContentID("aaa.jpg");
		
		//6.创建一个MimeMultipart,维护image和text关系
		MimeMultipart mp = new MimeMultipart();
		mp.addBodyPart(text);
		mp.addBodyPart(image);
		mp.setSubType("related");
		
		//7.创建一个MimeBodyPart,封装mp,因为MimeMultipart只能封装MimeBodyPart消息
		MimeBodyPart related = new MimeBodyPart();
		related.setContent(mp);
		
		//8.创建一个MimeBodyPart,封装一个attachMIME消息
		MimeBodyPart attach = new MimeBodyPart();
		DataHandler dh2 = new DataHandler(new FileDataSource("视频大全.txt"));
		attach.setDataHandler(dh2);
		//解决文件名乱码问题,先用MimeUtility.encodeText进行编码
		attach.setFileName(MimeUtility.encodeText(dh2.getName()));
		
		//9.维护附件和文本图片的关系,子类型设置为mixed
		MimeMultipart mp2 = new MimeMultipart();
		mp2.addBodyPart(related);
		mp2.addBodyPart(attach);
		mp2.setSubType("mixed");
		
		message.setContent(mp2);
		message.saveChanges();
		
		message.writeTo(new FileOutputStream("F:\\4.eml"));
生成的邮件内容:

From: aaa@sina.com
To: bbb@163.com
Message-ID: <9532399.2.1393516845066.JavaMail.wlxt@wlxt-THINK>
Subject: mixed message
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_1_26392982.1393516845002"

------=_Part_1_26392982.1393516845002
Content-Type: multipart/related; 
	boundary="----=_Part_0_19930840.1393516844995"

------=_Part_0_19930840.1393516844995
Content-Type: text/html;charset=utf-8
Content-Transfer-Encoding: quoted-printable

=E8=BF=99=E6=98=AF=E4=B8=80=E5=B9=85=E7=BE=8E=E5=A5=B3=E5=9B=BE=E7=89=87<br=
 /><img src=3D'cid:aaa.jpg' />
------=_Part_0_19930840.1393516844995
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-ID: aaa.jpg

/9j/4AAQ。。。。VAAGe3rgUR+PtP/ADUH/wCwf61SbgyvGVln1HQyZEarsyheg9hQ3/sfbf8Ampf5FoH9kv3Tfx/z89j/
2Q0KDQoNCg==
------=_Part_0_19930840.1393516844995--

------=_Part_1_26392982.1393516845002
Content-Type: text/plain; charset=GBK; name="=?GBK?B?ytPGtbTzyKsudHh0?="
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="=?GBK?B?ytPGtbTzyKsudHh0?="

=C5=CC6---jsp2 web1

=C5=CC8----struts2,02,03,27
------=_Part_1_26392982.1393516845002--

         

       JavaMail API中定义了一个java.mail.Transport类,它专门用于执行邮件发送任务,这个类的示例对象封装了某种邮件发送协议的底层实现细节,应用程序调用这个类中的方法可以把Message对象中封装的邮件数据发送到指定的SMTP服务器上。使用JavaMail发送邮件时涉及到的主要API之间的工作关系如下图所示;

        

      (1)     从session对象中获取实现了某种邮件发送协议的Transport对象

(2)     使用session对象创建的Message对象,并调用Message对象封装邮件数据

(3)     连接指定的SMTP服务器,调用Transport对象中邮件发送方法发送Message对象中封装的邮件数据。

 

Session类:

         Mail.jar包中的javax.mail.Session类用于定义整个JavaMail应用程序所需要的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名,端口号,采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件发送的TransportStore对象,以及为客户创建Message对象提供信息支持。

         Session对象实例只能通过getInstancegetDefaultInstance来获取。两者的区别在于GetDefaultInstance方法返回一个Session后,将把这个Session对象安装为默认的Session对象。以后每次调用getDefaultInstance方法都将返回这个默认的Session对象。而getInstance方法则每次调用都返回一个新的Session对象。

       示例化Session对象时都要为session提供应用程序环境信息,以及客户端与邮件服务器建立连接所必须的会话信息。这些信息被称为JavaMail属性,它们的属性名作为Properties对象的关键字进行保存。下面是JavaMail属性信息。

      

Property

Description

Default Value

mail.store.protocol

Specifies the default Message Access Protocol. The Session.getStore() method returns a Store object that implements this protocol. The client can override this property and explicitly specify the protocol with the Session.getStore(String protocol) method.

The first appropriate protocol in the config files

mail.transport.protocol

Specifies the default Transport Protocol. The Session.getTransport() method returns a Transport object that implements this protocol. The client can override this property and explicitly specify the protocol by using Session.getTransport(String protocol) method.

The first appropriate protocol in the config files

mail.host

Specifies the default Mail server. The Store and Transport objects connect methods use this property, if the protocol-specific host property is absent, to locate the target host.

The local machine

mail.user

Specifies the username to provide when connecting to a Mail server. The Store and Transport objects connect methods use this property, if the protocol-specific username property is absent, to obtain the username.

user.name

mail.protocol.host

Specifies the protocol-specific default Mail server. This overrides the mail.host property.

mail.host

mail.protocol.user

Specifies the protocol-specific default username for connecting to the Mail server. This overrides the mail.user property.

mail.user

mail.from

Specifies the return address of the current user. Used by the InternetAddress.getLocalAddress method to specify the current users email address.

username@host

mail.debug

Specifies the initial debug mode. Setting this property to true will turn on debug mode, while setting it to false turns debug mode off.

Note that the Session.setDebug method also controls the debug mode.

 false

 

         Session中获取Transport的方法为getTransport方法。getTransport方法有用返回实现了某种具体邮件发送协议的Transport对象,Transport对象可以完成底层邮件发送细节。它有两个重载方式,一个是无参的,一个是带有参数的。无参的将通过session对象中的mail.transport.protocol属性指定的邮件协议进行创建。第二个返回通过指定的protocol协议创建的Transport对象。

         Session中获取Store对象,返回的store对象实现了接收邮件的底层协议细节,可以实现邮件的接收。它也有两个方法,一个无参,一个有参方法。无参方法将通过session属性mail.Stroe.protocol指定的协议进行创建Store对象。而有参的将通过指定的protocol协议创建Store对象。

         Transport

它用于连接SMTP服务器,并把包含在Message对象中的邮件数据发送到SMTP服务器中。其中的connect方法用以创建与邮件服务器的连接,有三种重载方式。其中无参的方法,使用的是session中提供的相关网络连接属性来连接邮件服务器。主要是主机名,mail.host属性,用户名mail.user,用户密码及端口号等信息。

     发送邮件使用sendMessage方法或则send方法

      SendMessage方法用于向指定的邮件地址发送邮件,调用一次可以向多个人发送同一封邮件,也可以在同一个连接上多次调用这个方法发送多次邮件。调用此方法前,需要先调用saveMessage方法。

     Send方法是Transport类的静态方法,有两种重载方式,带参数的和不带参数的。应用程序可以直接调用Transport.send方法发送邮件。Send方法执行邮件发送任务时,它首先从参数Message对象中获取session对象,然后调用session对象中的getTransport方法得到用于发送邮件的Transport对象,此对象是使用保存在session中的属性创建的。然后调用connect, sendMessage, close方法。它没调用一次会创建和关闭一次与服务器的连接。
       下面是一个发送邮件程序示例:

        

	Properties proper = new Properties();
		
		//1.为创建session准备javamail属性
			//设置transport属性
		proper.setProperty("mail.transport.protocol", "smtp");
			//设置smtp服务器名
		proper.setProperty("mail.host", "smtp.163.com");
			//设置需要进行认证
		proper.setProperty("mail.smtp.auth", "true");
			//设置debug模式为true,也可以通过session.setDebug方法来设置
		proper.setProperty("mail.debug", "true");
		
		//2.创建session
		Session session = Session.getInstance(proper);
		
		//3.得到Transport对象
		Transport transport = session.getTransport();
		
		//4. 通过transport connect方法连接SMTP服务器
		transport.connect("aaa111", "123456");
		
		//5发送邮件
		Message message = makeMessage(session);
		transport.sendMessage(message, message.getAllRecipients());
		
		transport.close();
	}
	
	public static Message makeMessage(Session session) throws Exception{
		
		MimeMessage message = new MimeMessage(session);
		message.setFrom(new InternetAddress("aaa111@163.com"));
		message.setRecipient(Message.RecipientType.TO, new InternetAddress("bbb111@sina.com"));
		message.setSubject("test");
		message.setContent("aaa", "text/html");
		
		return message;
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值