用java显示邮件内容和附件的实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiao__jia__jia/article/details/83934396

                      用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/>


再接再厉,我一定行的!

猜你喜欢

转载自blog.csdn.net/xiao__jia__jia/article/details/83934396