引言:
JavaMai下载地址l jar包:http://java.sun.com/products/javamail/downloads/index.html
此篇是紧随上篇文章而封装出来的,阅读本篇章建议先阅读上一篇 –>javamail模拟邮箱功能获取邮件内容-中级实战篇【内容|附件下载方法】(javamail API电子邮件实例)
在上一篇中,讲解了邮件获取内容的两个方法(HTML和附件),简单介绍了邮件发送和内容获取的相同和不同之处,并且引入了新类–>javax.mail.Store:容器类。同时对SMTP和POP3协议对应的大致功能进行说明。
本章节将来演示javamail的邮件回复功能,本来以为API会提供一个自动封装好的方法来供调用,找了好久,并网上查阅了不少资料,原来根本都没有实现回复功能,API只有一个方法:reply(Boolean)方法,来提示邮件回复时的收件人信息,但这个方法有点鸡肋,他仅在发送邮件的时候,除非你指明了回复时的邮件地址,才能回去到,并且在回复邮件时,完全可以新增收件人。
思路:
既然API没有给我们直接回复的方法,那就发挥我们自强不息的精神吧(吼吼),那么该怎么回复一封邮件呢?
首先我们拿到要回复的邮件。(这就用到了邮件获取的方法)
提取邮件的各个部件信息。(收件人、发件人、发件时间、主题、内容等,你要在回复里面显示的都可以提取)
创建一个新邮件。(根据提出出来的信息,组装一个新邮件,如主题可以在原来上面加个:Re:标识,内容一般为:新内容+原邮件内容)
发送自己组装的邮件。(又用到了邮件的发送方法)
看完思路总结,立马清晰了,原来邮件回复就是邮件查看和发送的合体!
示例结构:
本篇示例代码分了5类(把前一章节的获取业务类进行拆分,并且新增回复业务类,其余3类没有变动)
EmailEntity 类 邮件基础父类 【前三类都和之前章节相同】
EmailServiceEnity 类 邮件服务支持类,继承邮件基础父类,并声明其他必要的私有属性(…)
SendEmailService 类 邮件发送业务类,封装邮件发送的两个方法(HTML和附件)
LookEmailService 类 邮件接收|查看业务类,拆分为邮件获取和内容查看两部分(正文阅读和附件下载)
ReplyEmailService 类 邮件回复业务类,封装邮件回复方法(获取邮件–>组装–>发送)。
实例代码演示:
****复制此五个类可直接跑测试****注释部分我尽可能详细讲解每个方法的作用****
EmailEntity 类
package com.cplatform.movie.back.javamail;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
* 邮件基础实体类
*/
public class EmailEntity extends Authenticator {
/**
* 用户名(登录邮箱)
*/
protected static String username;
/**
* 密码
*/
protected static String password;
/**
* 初始化邮箱地址和密码
* @param username 邮箱
* @param password 密码
*/
public EmailEntity(String username, String password) {
EmailEntity.username = "这里填写发件箱地址";
EmailEntity.password = "这里填写发件箱密码";
}
/**
* 重写自我检验方法
*/
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
String getPassword() {
return password;
}
String getUsername() {
return username;
}
public void setPassword(String password) {
EmailEntity.password = password;
}
public void setUsername(String username) {
EmailEntity.username = username;
}
}
EmailServiceEnity 类
package com.cplatform.movie.back.javamail;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import com.cplatform.movie.back.javamail.SimpleEmailFunction.MyAuthenricator;
/**
* 邮件服务支持类
*/
public class EmailServiceEnity extends EmailEntity{
// java.util.propertis 类
private transient Properties props;
// 一个邮件会话
private transient Session session;
// 邮件消息
private transient MimeMessage message;
// 邮件传输对象
private Transport transport;
// 邮件发送内容
private String content;
// 邮件内容格式
private final String CONTENT_TYPE_HTML = "text/html;charset=utf-8";
// 端口号
private final static String MAIL_PORT = "25";
// 邮箱协议常量
public static final String MAIL_PROTOCOL_SMTP = "smtp";
public static final String MAIL_PROTOCOL_POP3 = "pop3";
// 邮箱所使用的协议
private String mailProtocol;
// 邮箱服务器列表
private String hostPort;
//分//界/线/
/**
* 实参构造
* @param mailToaddress 收件人地址,多个以逗号隔开
* @param content 邮件内容
* @throws MessagingException
* @throws UnsupportedEncodingException
*/
public EmailServiceEnity(String mailToaddress, String content, String mailProtocol) throws UnsupportedEncodingException, MessagingException {
super(username, password);
this.setMailProtocol(mailProtocol);
this.setHostPort(mailProtocol +"."+ username.split("@")[1]);
this.content = content;
this.session = this.initSession();
this.message = this.initMessage(this.getSession(), mailToaddress);
// 这里需要对协议进行判断,SMTP:为发送协议(初始化Transport) POP3:则为接收协议(只能初始化Store,在接收邮件章节用到)
if(this.getMailProtocol().equals(MAIL_PROTOCOL_SMTP)){
this.transport = this.initTransport(this.getSession());
}
}
/**
* 初始化perps文件
*