准备环境:
(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);