用java显示邮件内容和附件的实现
自己找了好久的内容实现,一直弄不好,现终于实现了,来张效果图,吼吼吼吼
解析邮件的PraseMimeMsg.java
package com.hstc.util;
import com.hstc.dto.AttachmentDTO;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class PraseMimeMsg {
private MimeMessage mimeMessage = null;
private StringBuffer bodytext = new StringBuffer();
public PraseMimeMsg(MimeMessage mimeMessage)
{
this.mimeMessage = mimeMessage;
}
public void setMimeMessage(MimeMessage mimeMessage)
{
this.mimeMessage = mimeMessage;
}
// 例子: panjia@hstc.com<panjia@hstc.com>
public String getFrom()throws Exception
{
InternetAddress address[] = (InternetAddress[])mimeMessage.getFrom();
String from = address[0].getAddress();
if(from == null) from="";
String personal = address[0].getPersonal();
if(personal == null) personal="";
String fromaddr = personal+"<"+from+">";
return fromaddr;
}
public String getSubject()throws MessagingException
{
String subject = "";
try
{
subject = MimeUtility.decodeText(mimeMessage.getSubject());
if(subject == null) subject="";
}
catch(Exception exce){ }
return subject;
}
public String getMailAddress(String type)throws Exception
{
String mailaddr = "";
String addtype = type.toUpperCase();
InternetAddress []address = null;
if(addtype.equals("TO") || addtype.equals("CC") ||addtype.equals("BCC"))
{
if(addtype.equals("TO"))
{
address = (InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.TO);
}
else if(addtype.equals("CC"))
{
address = (InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.CC);
}
else
{
address = (InternetAddress[])mimeMessage.getRecipients(Message.RecipientType.BCC);
}
if(address != null)
{
for(int i=0;i<address.length;i++)
{
String email=address[i].getAddress();
if(email==null) email="";
else
{
email=MimeUtility.decodeText(email);
}
String personal=address[i].getPersonal();
if(personal==null) personal="";
else
{
personal=MimeUtility.decodeText(personal);
}
String compositeto=personal+"<"+email+">";
mailaddr+=","+compositeto;
}
mailaddr=mailaddr.substring(1);
}
}
else
{
throw new Exception("Error emailaddr type!");
}
return mailaddr;
}
public String getBodyText()
{
return bodytext.toString();
}
public void getMailContent(Part part)throws Exception
{
String contenttype = part.getContentType();
int nameindex = contenttype.indexOf("name");
boolean conname =false;
if(nameindex != -1) conname=true;
System.out.println("CONTENTTYPE: "+contenttype);
if(part.isMimeType("text/plain") && !conname)
{
bodytext.append((String)part.getContent());
}
else if(part.isMimeType("text/html") && !conname)
{
bodytext.append((String)part.getContent());
}
else if(part.isMimeType("multipart/*"))
{
Multipart multipart = (Multipart)part.getContent();
int counts = multipart.getCount();
for(int i=0;i<counts;i++)
{
getMailContent(multipart.getBodyPart(i));
}
}
else if(part.isMimeType("message/rfc822"))
{
getMailContent((Part)part.getContent());
}
else{}
//Marking mail as read status.
if(!mimeMessage.isSet(Flags.Flag.SEEN))
mimeMessage.setFlag(Flags.Flag.SEEN, true);
}
public List<AttachmentDTO> handleMultipart() throws Exception
{
List<AttachmentDTO> attachments = new ArrayList<AttachmentDTO>();
String disposition;
BodyPart part;
Multipart mp = (Multipart) mimeMessage.getContent();
if(mp.getContentType() == "text/plain" || mp.getContentType() == "text/html" ){
return attachments;
}
int mpCount = mp.getCount();
AttachmentDTO attachmentDTO;
for (int m = 0; m < mpCount; m++)
{
part = mp.getBodyPart(m);
disposition = part.getDisposition();
if (disposition != null && disposition.equals(Part.ATTACHMENT))
{
String fileName = null;
fileName = MimeUtility.decodeText(part.getFileName()); //改了
attachmentDTO = new AttachmentDTO();
attachmentDTO.setAttName(fileName);
attachmentDTO.setMpid(m);
attachments.add(attachmentDTO);
}
}
return attachments;
}
public boolean getReplySign()throws MessagingException
{
boolean replysign = false;
String needreply[] = mimeMessage.getHeader("Disposition-Notification-To");
if(needreply != null)
{
replysign = true;
}
return replysign;
}
public double getSize() throws Exception
{
float size = mimeMessage.getSize();
size = size/1024;
return size;
}
public String getMessageId()throws MessagingException
{
return mimeMessage.getMessageID();
}
public boolean isNew()throws MessagingException
{
boolean isnew = false;
Flags flags = ((Message)mimeMessage).getFlags();
Flags.Flag []flag = flags.getSystemFlags();
for(int i=0;i<flag.length;i++)
{
if(flag[i] == Flags.Flag.SEEN)
{
isnew=true;
break;
}
}
return isnew;
}
public String getSentDate()throws Exception
{
Date sentdate = mimeMessage.getSentDate();
return DateTimeUtil.dateToStr(sentdate);
}
}
访问附件需要的AttachmentDTO.java
package com.hstc.dto;
public class AttachmentDTO {
// 邮件的MimeMutipart ID
private int mpid;
// 附件名称
private String attName;
public int getMpid() {
return mpid;
}
public void setMpid(int mpid) {
this.mpid = mpid;
}
public String getAttName() {
return attName;
}
public void setAttName(String attName) {
this.attName = attName;
}
}
浏览器上下载邮件附件实现 HandleAttachServlet.java
package com.hstc.servlet;
import javax.mail.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.InputStream;
public class HandleAttachServlet extends javax.servlet.http.HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
doGet(request,response);
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
response.setContentType("text/html");
HttpSession session = request.getSession();
ServletOutputStream out = response.getOutputStream();
int msgnum = Integer.parseInt(request.getParameter("msgnum"));
int bodynum = Integer.parseInt(request.getParameter("bodynum"));
String filename = request.getParameter("filename");
Folder folder = (Folder) session.getAttribute("folder");
try {
Message msg = folder.getMessage(msgnum+1);
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
Multipart multi = (Multipart) msg.getContent();
BodyPart bodyPart = multi.getBodyPart(bodynum);
InputStream is = bodyPart.getInputStream();
int c = 0;
while( (c=is.read()) != -1) {
out.write(c);
}
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
jsp页面的实现代码
<%
Users user = (Users) request.getSession().getAttribute(Const.USERNAME);
// 2、读取邮件夹
Folder folder = (Folder)request.getSession().getAttribute("folder");
// 获取邮件夹中第i封邮件信息
Integer msgnum = Integer.parseInt(request.getParameter("msgnum"));
String subject = null;
String from = null;
String to = null;
Object content = null;
String sendDate = null;
List<AttachmentDTO> attachmentDTOList = null;
try {
Message[] messages = folder.getMessages();
MimeMessage message = (MimeMessage) messages[msgnum];
PraseMimeMsg pmm = new PraseMimeMsg(message);
subject = pmm.getSubject();
from = pmm.getFrom();
to = pmm.getMailAddress("to");
sendDate = pmm.getSentDate();
pmm.getMailContent((Part)message);
content = pmm.getBodyText();
attachmentDTOList = pmm.handleMultipart();
} catch (MessagingException e) {
e.printStackTrace();
}
%>
<center><h1><%=subject%></h1></center>
<p> 正文:<%=content%></p> <br/>
<%
for(int i = 0; i < attachmentDTOList.size(); i++) {
%>
附件:<a href="<%=basePath%>HandleAttachServlet?msgnum=<%=msgnum%>&&bodynum=<%=((AttachmentDTO)attachmentDTOList.get(i)).getMpid()%>&&filename=<%=((AttachmentDTO)attachmentDTOList.get(i)).getAttName()%>"> <%=((AttachmentDTO)attachmentDTOList.get(i)).getAttName()%></a>
<%
}
%>
<div><span>发件人:<%=from%></span></div>
<div><span>发送时间:<%=sendDate%></span></div>
<hr/>
再接再厉,我一定行的!