收取邮件(带附件)有几个过程
1.接收邮件
a.确定对象邮箱的协议、端口和密码等参数
b.通过Properties类配置(协议、端口和服务器)参数
c.用session储存这些配置,用于定义环境信息
d.通过Store取session里的参数来连接邮箱
f.通过Folder获得收件箱()(Folder是操作邮件的对象)
2.解析邮件
a.通过Message[]获得收件箱中邮件
b.通过MimeMessage 获取单个邮件处理对象,MimeMessage是Message子类,实例对象表示一封邮件
3.保存附件
a.通过Multipart获取复杂体邮件处理对象
b.通过BodyPart获取复杂邮件的一个邮件体,BodyPart是Multipart的一个属性,图片、附件等节点都可以通过BodyPart组合成一个混合的Multipart整体
4.读取并处理输入流
学习链接:
附上个人学习demo:
public class mytest {
public static void main(String[] args) throws Exception {
String duankou = "110";// 端口号
String servicePath = "pop.qiye.aliyun.com";// 服务器地址(收件端)
String xieyi = "pop3";// 协议(邮箱类型)
String mail = " ";// 邮件地址
String password = "";
String mydes = "H:\\ ";// 附件保存路径(文件不用另外命名)
receive(duankou, servicePath, xieyi, mail, password, mydes);
}
// 接收邮件
public static void receive(String duankou, String servicePath, String xieyi, String mail, String password,
String mydes) throws Exception {
// 准备连接服务器的会话信息
Properties props = new Properties();
props.setProperty("mail.store.protocol", xieyi); // 使用pop3协议(指定接收邮件的协议)
// props.setProperty("mail.transport.protocol", xieyi); // 使用pop3协议(指定发送邮件的协议)
props.setProperty("mail.pop3.port", duankou); // 端口
props.setProperty("mail.pop3.host", servicePath); // pop3服务器
// 创建Session实例对象
Session session = Session.getInstance(props);
Store store = session.getStore(xieyi);
// store.connect(host, user, password);
store.connect(mail, password);
// 获得收件箱
Folder folder = store.getFolder("INBOX");//通过pop3协议获取某个邮件夹的名称只能为inbox
folder.open(Folder.READ_WRITE); // 打开收件箱
//folder.open(Folder.READ_ONLY);
// 得到收件箱中的所有邮件,并解析
// Message[] messages = folder.getMessages();
Message[] messages = folder.search(new SubjectTerm("要访问的邮件主题名称"));
parsingMessage(messages, mydes);
}
// 解析邮件
public static void parsingMessage(Message[] messages, String mydes) throws Exception {
// 解析所有邮件
for (int i = 0, count = messages.length; i < count; i++) {
MimeMessage msg = (MimeMessage) messages[i];
msg.getMessageNumber();//第几封邮件
MimeUtility.decodeText(msg.getSubject());//邮件主题
msg.getSentDate();//发送时间
msg.getSize();//邮件大小(兆)
boolean isContainerAttachment = isContainAttachment(msg);//是否包含附件
if (isContainerAttachment) {
saveAttachment(msg, mydes); // 保存附件
}
StringBuffer content = new StringBuffer(30);//content是邮件正文
//获取邮件正文
content.toString();//对纯文本的适用
//getMailTextContent(msg, content);//针对复杂体邮件
}
}
//获取邮件文本内容
/*
public static void getMailTextContent(Part part, StringBuffer content) throws Exception {
boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
if (part.isMimeType("text/*") && !isContainTextAttach) {//邮件是纯文本,并且文本不为空
content.append(part.getContent().toString());
} else if (part.isMimeType("message/rfc822")) { //message/rfc822单一邮件体文件
getMailTextContent((Part) part.getContent(), content);
} else if (part.isMimeType("multipart/*")) { //multipart/*复杂体邮件,如带附件邮件
Multipart multipart = (Multipart) part.getContent();
int partCount = multipart.getCount();
for (int i = 0; i < partCount; i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
getMailTextContent(bodyPart, content);
}
}
}
**/
// 保存附件
public static void saveAttachment(Part part, String destDir) throws Exception {
if (part.isMimeType("multipart/*")) { // multipart/*包含附件的邮件
Multipart multipart = (Multipart) part.getContent(); // 复杂体邮件
// 复杂体邮件包含多个邮件体
int partCount = multipart.getCount();
for (int i = 0; i < partCount; i++) {
// 获得复杂体邮件中其中一个邮件体
BodyPart bodyPart = multipart.getBodyPart(i);
// 某一个邮件体也有可能是由多个邮件体组成的复杂体
String disp = bodyPart.getDisposition();
if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) { // 表示msg已经有内容,文件已经下来或可以打开
InputStream is = bodyPart.getInputStream();
saveFile(is, destDir, MimeUtility.decodeText(bodyPart.getFileName())); //MimeUtility.decodeText文件解码
} else if (bodyPart.isMimeType("multipart/*")) {
saveAttachment(bodyPart, destDir);
} else {
String contentType = bodyPart.getContentType();
if (contentType.indexOf("name") != -1 || contentType.indexOf("application") != -1) {
saveFile(bodyPart.getInputStream(), destDir, MimeUtility.decodeText(bodyPart.getFileName())); //MimeUtility.decodeText文件解码
}
}
}
} else if (part.isMimeType("message/rfc822")) {
saveAttachment((Part) part.getContent(), destDir);// getContent是获取邮件内容并加以显示
}
}
// 是否包含附件
public static boolean isContainAttachment(Part part) throws Exception {
boolean flag = false;
if (part.isMimeType("multipart/*")) {
MimeMultipart multipart = (MimeMultipart) part.getContent();
int partCount = multipart.getCount();
for (int i = 0; i < partCount; i++) {
BodyPart bodyPart = multipart.getBodyPart(i);
String disp = bodyPart.getDisposition();
if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
flag = true;
} else if (bodyPart.isMimeType("multipart/*")) {
flag = isContainAttachment(bodyPart);
} else {
String contentType = bodyPart.getContentType();
if (contentType.indexOf("application") != -1) {
flag = true;
}
if (contentType.indexOf("name") != -1) {
flag = true;
}
}
if (flag)
break;
}
} else if (part.isMimeType("message/rfc822")) {
flag = isContainAttachment((Part) part.getContent());
}
return flag;
}
// 读取输入轮流保存到指定位置
public static void saveFile(InputStream is, String destDir, String fileName) throws Exception {
BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(destDir + fileName)));
int len = -1;
while ((len = bis.read()) != -1) {
bos.write(len);
bos.flush();
}
bos.close();
bis.close();
}
}