1. 程式人生 > >用java顯示郵件內容和附件的實現

用java顯示郵件內容和附件的實現

                      用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;
    }

    // 例子: 
[email protected]
<[email protected]> 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>&nbsp;&nbsp;正文:<%=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/>


再接再厲,我一定行的!