JavaMail 发送邮件

来源:互联网 发布:算法精髓 编辑:程序博客网 时间:2024/06/10 07:07

准备环境:

(1).将javaMail核心类mail.jar加入到classpath中。

(2).将JAF框架核心类activation.jar加入到classpath中。

注意:上面是针对JavaSE的环境,如果是JavaEE环境则不需要,j2ee.jar中包含了上述两个依赖包,可以直接使用。

2.发送纯文本邮件:

(1).设置连接会话属性:

//也可用Properties props = System.getProperties();

Properties props=new Properties();

//存储发送邮件服务器的信息,这里以网易163为例
props.put("mail.smtp.host","smtp.163.net");

//通过验证方式连接邮件服务器
props.put("mail.smtp.auth","true");

//根据属性新建一个邮件会话.
Session session=Session.getInstance(props);

//如果需要在发送邮件过程中监控mail命令的话,可以在发送前设置debug标志

s.setDebug(true);

(2).创建邮件对象:

//由邮件会话新建一个消息对象

Message message=new MimeMessage(session);

(3).设置邮件相关信息:

//创建发件人地址对象

InternetAddress from=new InternetAddress(发件人邮箱地址);

//设置发件人
message.setFrom(from);

//创建收件人地址对象
InternetAddress to=new InternetAddress(收件人邮箱地址);

//设置收件人,并设置其接收类型为TO
message.setRecipient(Message.RecipientType.TO,to);

//设置邮件主题
message.setSubject(邮件主题);

//设置信件内容,纯文本邮件
message.setText(邮件内容);

//设置发信时间

message.setSentDate(new Date());

注意:a.收件人和发件人的邮箱地址如果是多个,字符串中用逗号“,”分隔即可。

b.收到邮件后显示的发件人地址是设置的setFrom值,而不是真正的发送邮箱。

c. Message.RecipientType类表示收件人的类型,是MimeMessage内部类Recipient类的一个内部类,它是Message中的一个静态类。该类中有如下三个常量:

TO:代表有健的主要接收者。

CC:代表有健的抄送接收者。

BCC:代表邮件的暗送接收者。

(4).发送邮件:

//存储邮件信息

message.saveChanges();

//创建邮件发送对象,并指定其使用SMTP协议发送邮件
Transport transport=s.getTransport("smtp");

//以smtp方式登录邮箱
transport.connect("smtp.163.net","用户名","密码");

//发送邮件,也可以使用静态方法Transport.send(message);
transport.sendMessage(message, message.getAllRecipients());

//关闭连接

transport.close();

注意:在transport.connect中设置的用户名和密码是为了连接邮箱服务器,该用户名不一定是收到邮件的发件人,发件人以message.setFrom中设置的为准。

<!--[if !supportLists]-->3.  <!--[endif]-->发送HTML格式邮件:

和发送纯文本邮件类似,不同之处在于设置邮件内容部分,如:

//邮件内容

String body="<h4><font color=red>Welcome!</font></h4><br>"+

                                          "<img src=C://157222.jpg>";

//设置HTML格式的邮件正文

message.setContent(body,"text/html;charset=gb2312");

<!--[if !supportLists]-->4.       <!--[endif]-->发送带附件的邮件:

发送带有附件的邮件的过程有些类似转发邮件,我们需要建立一个完整邮件的各个邮件体部分,在邮件内容文字后,增加一个具有DataHandler的附件而不是在转发邮件时那样复制第一个部分的DataHandler。发送带附件的邮件需要用到JAF框架的DataHandler。

如果我们将文件作为附件发送:

<!--[if !supportLists]-->a.       <!--[endif]-->建立FileDataSource类型的对象作为附件数据源;如果从URL读取数据作为附件发送,那么将要建立URLDataSource类型的对象作为附件数据源。

<!--[if !supportLists]-->b.       <!--[endif]-->将这个数据源(FileDataSource或是URLDataSource)对象作为DataHandler类构造方法的参数传入,从而建立一个DataHandler对象作为数据源的DataHandler。

<!--[if !supportLists]-->c.       <!--[endif]-->将这个DataHandler设置为邮件体部分的DataHandler。这样就完成了邮件体与附件之间的关联工作,下面的工作就是BodyPart的setFileName()方法设置附件名为原文件名。

<!--[if !supportLists]-->d.       <!--[endif]-->将两个邮件体放入到Multipart中,设置邮件内容为这个容器Multipart,发送邮件。

这里说明一下邮件的结构:

每个邮件是由多个部分组成,每个部分称为一个邮件体部分,是一个BodyPart类对象,对于MIME类型邮件来讲就是MimeBodyPart类对象。这些邮件体包含在成为Multipart的容器中对于MIME类型邮件来讲就是MimeMultiPart类对象。

 

和发送纯文本也发送HTML格式邮件类似,不同之处在于:

(1).创建附件内容对象:

//新建一个存放信件内容的BodyPart对象

BodyPart messageBodyPart = new MimeBodyPart();

(2).设置附件内容对象的数据源和DataHandler:

//建立附件数据源,也可以使用URLDataSource(url)

DataSource source = new FileDataSource(filename);

//设置附件的DataHandler

messageBodyPart.setDataHandler(new DataHandler(source));

//设置附件的名称

messageBodyPart.setFileName(filename);

(3). 创建附件对象:

//新建一个MimeMultipart对象用来存放BodyPart对象(事实上可以存放多个)

Multipart multipart = new MimeMultipart();

//将附件内容对象加入到MimeMultipart对象中(可以加入多个BodyPart)

multipart.addBodyPart(messageBodyPart);

(4).添加附件:

// 将附件添加到邮件内容中。

message.setContent(multipart);

5.回复邮件

回复邮件的方法很简单:使用Message类的reply()方法,通过配置回复邮件的收件人地址和主题(如果没有提供主题的话,系统将默认将“Re:”作为邮件的主体),这里不需要设置任何的邮件内容,只要复制发信人或者reply-to到新的收件人。而reply()方法中的boolean参数表示是否将邮件回复给发送者(参数值为false),或是回复给所有人(参数值为true)。

补充一下,reply-to地址需要在发信时使用setReplyTo()方法设置。

//message是接收到的邮件,设置邮件回复给发件者

Message reply = (MimeMessage)message.reply(false);

//设置回复人邮件地址

reply.setFrom(new InternetAddress("回复人邮件地址"));

//设置回复内容

reply.setText("回复内容");

//发送回复

Transport.send(reply);

6.转发邮件

转发邮件的过程不如前面的回复邮件那样简单,它将建立一个转发邮件,这并非一个方法就能做到。

在转发邮件时,我们建立一个文字邮件体部分和一个被转发的文字邮件体部分,然后将这两个邮件体放到一个Multipart中。说明一下,复制一个邮件内容到另一个邮件的方法是仅复制它的DataHandler(数据处理者)即可。这是由JAF定义的一个类,它提供了对邮件内容的操作命令的访问、管理了邮件内容操作,是不同的数据源和数据格式之间的一致性接口。

(1).创建转发邮件:

Message forward = new MimeMessage(session);

(2).设置转发邮件信息:

//设置转发主题,默认为:“Fwd:原来邮件主题”格式,message为被转发邮件。

forward.setSubject("Fwd: " + message.getSubject());

//设置转发人邮件地址

forward.setFrom(new InternetAddress(转发人邮件地址));

//设置要接收人邮件地址

forward.addRecipient(Message.RecipientType.TO, new InternetAddress(接收人邮件地址));

(3). 复制被转发邮件内容到转发邮件内容中

//创建附件内容对象

BodyPart messageBodyPart = new MimeBodyPart();

//创建附件

Multipart multipart = new MimeMultipart();

//设置邮件的DataHandler对象为被转发邮件的DataHandler,即完成邮件复制

messageBodyPart.setDataHandler(message.getDataHandler());

//添加附件内容对象到附件中

multipart.addBodyPart(messageBodyPart);

// 添加附件到邮件内容中

forward.setContent(multipart);