java接发邮件

作者在 2014-12-05 10:46:15 发布以下内容

概述:之前用QQ邮箱做了发邮件,可是到接收邮件时却不行了,这个问题还没解决,后面就用163邮箱来做就可以

1.到163邮箱的设置去打开SMTP和imap服务,SMTP是发送邮件,IMAP是接收邮件

2.发送邮件:

public static String send(String toEmail , String _content,String subject) throws MessagingException {
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.163.com");// 指定SMTP服务器
        props.put("mail.smtp.auth", "true");// 指定是否需要SMTP验证
        String from = "*****@163.com";
        String to = toEmail;//接收的Email
        String content = _content;//邮件内容
        String host = "smtp.163.com";
        String user = "*****@163.com";
        String password = "*****";
        Session mailSession = Session.getDefaultInstance(props);
        Message message = new MimeMessage(mailSession);
        message.setFrom(new InternetAddress(from));// 发件人
        message.addRecipient(Message.RecipientType.TO,
                new InternetAddress(to));// 收件人
        message.setSubject(subject);// 邮件主题
        message.setContent(content,"text/html;charset=utf-8");// 邮件内容
        message.saveChanges();
        Transport transport = mailSession.getTransport("smtp");
        transport.connect(host, user, password);
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
        return from;
    }
3.接收邮件

public class ReceiveEmail {

    private MimeMessage msg = null;
    private String saveAttchPath = "";
    private StringBuffer bodytext = new StringBuffer();
    private String dateformate = "yy-MM-dd HH:mm:ss";

    public ReceiveEmail(MimeMessage msg){
        this.msg = msg;
    }
    public void setMsg(MimeMessage msg) {
        this.msg = msg;
    }

    /**
     * 获取发送邮件者信息
     * @return
     * @throws MessagingException
     */
    public String getFrom() throws MessagingException{
        InternetAddress[] address = (InternetAddress[]) msg.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;
    }

    /**
     * 获取邮件收件人,抄送,密送的地址和信息。根据所传递的参数不同 "to"-->收件人,"cc"-->抄送人地址,"bcc"-->密送地址
     * @param type
     * @return
     * @throws MessagingException
     * @throws UnsupportedEncodingException
     */
    public String getMailAddress(String type) throws MessagingException, UnsupportedEncodingException{
        String mailaddr = "";
        String addrType = type.toUpperCase();
        InternetAddress[] address = null;

        if(addrType.equals("TO")||addrType.equals("CC")||addrType.equals("BCC")){
            if(addrType.equals("TO")){
                address = (InternetAddress[]) msg.getRecipients(Message.RecipientType.TO);
            }
            if(addrType.equals("CC")){
                address = (InternetAddress[]) msg.getRecipients(Message.RecipientType.CC);
            }
            if(addrType.equals("BCC")){
                address = (InternetAddress[]) msg.getRecipients(Message.RecipientType.BCC);
            }

            if(address != null){
                for(int i=0;i<address.length;i++){
                    String mail = address[i].getAddress();
                    if(mail == null){
                        mail = "";
                    }else{
                        mail = MimeUtility.decodeText(mail);
                    }
                    String personal = address[i].getPersonal();
                    if(personal == null){
                        personal = "";
                    }else{
                        personal = MimeUtility.decodeText(personal);
                    }
                    String compositeto = personal +"<"+mail+">";
                    mailaddr += ","+compositeto;
                }
                mailaddr = mailaddr.substring(1);
            }
        }else{
            throw new RuntimeException("Error email Type!");
        }
        return mailaddr;
    }

    /**
     * 获取邮件主题
     * @return
     * @throws UnsupportedEncodingException
     * @throws MessagingException
     */
    public String getSubject() throws UnsupportedEncodingException, MessagingException{
        String subject = "";
        subject = MimeUtility.decodeText(msg.getSubject());
        if(subject == null){
            subject = "";
        }
        return subject;
    }

    /**
     * 获取邮件发送日期
     * @return
     * @throws MessagingException
     */
    public Date getSendDate() throws MessagingException{
        Date sendDate = msg.getSentDate();
//        SimpleDateFormat smd = new SimpleDateFormat(dateformate);
        return sendDate;
    }

    /**
     * 获取邮件正文内容
     * @return
     */
    public String getBodyText(){

        return bodytext.toString();
    }

    /**
     * 解析邮件,将得到的邮件内容保存到一个stringBuffer对象中,解析邮件 主要根据MimeType的不同执行不同的操作,一步一步的解析
     * @param part
     * @throws MessagingException
     * @throws IOException
     */
    public void getMailContent(Part part) throws MessagingException, IOException{

        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 count = multipart.getCount();
            for(int i=0;i<count;i++){
                getMailContent(multipart.getBodyPart(i));
            }
        }else if(part.isMimeType("message/rfc822")){
            getMailContent((Part) part.getContent());
        }

    }

    /**
     * 判断邮件是否需要回执,如需回执返回true,否则返回false
     * @return
     * @throws MessagingException
     */
    public boolean getReplySign() throws MessagingException{
        boolean replySign = false;
        String needreply[] = msg.getHeader("Disposition-Notification-TO");
        if(needreply != null){
            replySign = true;
        }
        return replySign;
    }

    /**
     * 获取此邮件的message-id
     * @return
     * @throws MessagingException
     */
    public String getMessageId() throws MessagingException{
        return msg.getMessageID();
    }

    /**
     * 判断此邮件是否已读,如果未读则返回false,已读返回true
     * @return
     * @throws MessagingException
     */
    public boolean isNew() throws MessagingException{
        boolean isnew = false;
        Flags flags = ((Message)msg).getFlags();
        Flags.Flag[] flag = flags.getSystemFlags();
        System.out.println("flags's length:"+flag.length);
        for(int i=0;i<flag.length;i++){
            if(flag[i]==Flags.Flag.SEEN){
                isnew = true;
                System.out.println("seen message .......");
                break;
            }else{

            }
        }

        return isnew;
    }

    /**
     * 判断是是否包含附件
     * @param part
     * @return
     * @throws MessagingException
     * @throws IOException
     */
    public boolean isContainAttch(Part part) throws MessagingException, IOException{
        boolean flag = false;

        String contentType = part.getContentType();
        if(part.isMimeType("multipart/*")){
            Multipart multipart = (Multipart) part.getContent();
            int count = multipart.getCount();
            for(int i=0;i<count;i++){
                BodyPart bodypart = multipart.getBodyPart(i);
                String dispostion = bodypart.getDisposition();
                if((dispostion != null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.equals(Part.INLINE))){
                    flag = true;
                }else if(bodypart.isMimeType("multipart/*")){
                    flag = isContainAttch(bodypart);
                }else{
                    String conType = bodypart.getContentType();
                    if(conType.toLowerCase().indexOf("appliaction")!=-1){
                        flag = true;
                    }
                    if(conType.toLowerCase().indexOf("name")!=-1){
                        flag = true;
                    }
                }
            }
        }else if(part.isMimeType("message/rfc822")){
            flag = isContainAttch((Part) part.getContent());
        }

        return flag;
    }

    /**
     * 保存附件
     * @param part
     * @throws MessagingException
     * @throws IOException
     */
    public void saveAttchMent(Part part) throws MessagingException, IOException{
        String filename = "";
        if(part.isMimeType("multipart/*")){
            Multipart mp = (Multipart) part.getContent();
            for(int i=0;i<mp.getCount();i++){
                BodyPart mpart = mp.getBodyPart(i);
                String dispostion = mpart.getDisposition();
                if((dispostion != null)&&(dispostion.equals(Part.ATTACHMENT)||dispostion.equals(Part.INLINE))){
                    filename = mpart.getFileName();
                    if(filename.toLowerCase().indexOf("gb2312")!=-1){
                        filename = MimeUtility.decodeText(filename);
                    }
                    saveFile(filename,mpart.getInputStream());
                }else if(mpart.isMimeType("multipart/*")){
                    saveAttchMent(mpart);
                }else{
                    filename = mpart.getFileName();
                    if(filename != null&&(filename.toLowerCase().indexOf("gb2312")!=-1)){
                        filename = MimeUtility.decodeText(filename);
                    }
                    saveFile(filename,mpart.getInputStream());
                }
            }

        }else if(part.isMimeType("message/rfc822")){
            saveAttchMent((Part) part.getContent());
        }
    }
    /**
     * 获得保存附件的地址
     * @return
     */
    public String getSaveAttchPath() {
        return saveAttchPath;
    }
    /**
     * 设置保存附件地址
     * @param saveAttchPath
     */
    public void setSaveAttchPath(String saveAttchPath) {
        this.saveAttchPath = saveAttchPath;
    }
    /**
     * 设置日期格式
     * @param dateformate
     */
    public void setDateformate(String dateformate) {
        this.dateformate = dateformate;
    }
    /**
     * 保存文件内容
     * @param filename
     * @param inputStream
     * @throws IOException
     */
    private void saveFile(String filename, InputStream inputStream) throws IOException {
        String osname = System.getProperty("os.name");
        String storedir = getSaveAttchPath();
        String sepatror = "";
        if(osname == null){
            osname = "";
        }

        if(osname.toLowerCase().indexOf("win")!=-1){
            sepatror = "//";
            if(storedir==null||"".equals(storedir)){
                storedir = "d://temp";
            }
        }else{
            sepatror = "/";
            storedir = "/temp";
        }

        File storefile = new File(storedir+sepatror+filename);
        System.out.println("storefile's path:"+storefile.toString());

        BufferedOutputStream bos = null;
        BufferedInputStream bis = null;

        try {
            bos = new BufferedOutputStream(new FileOutputStream(storefile));
            bis = new BufferedInputStream(inputStream);
            int c;
            while((c= bis.read())!=-1){
                bos.write(c);
                bos.flush();
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            bos.close();
            bis.close();
        }

    }
    //获取单个对象
    public BsmEmailInfoVO recive(Part part,int i) throws MessagingException, IOException{
        BsmEmailInfoVO bsmEmailInfoVO = new BsmEmailInfoVO();
        bsmEmailInfoVO.setEmailTitle(getSubject());
        bsmEmailInfoVO.setSendEmail(getFrom());
        bsmEmailInfoVO.setSendTime(getSendDate());
        bsmEmailInfoVO.setReceiveEmail(getMailAddress("TO"));
        bsmEmailInfoVO.setCopyEmail(getMailAddress("CC"));
        bsmEmailInfoVO.setBccEmail(getMailAddress("BCC"));
        boolean isNew = isNew();
        if(isNew==true){
            bsmEmailInfoVO.setReadStatus(EmailReadStatusEnum.HAVEREAD.getCode());
        }else{
            bsmEmailInfoVO.setReadStatus(EmailReadStatusEnum.NEWEMAIL.getCode());
        }
        boolean flag = isContainAttch(part);
        System.out.println("Message" + i + " replySign:" + getReplySign());   //是否回执就先不管了
        getMailContent(part);
        bsmEmailInfoVO.setEmailContent(getBodyText());
        bsmEmailInfoVO.setEmailType(EmailTypeEnum.RECEIVETYPE.getCode());
        setSaveAttchPath("c://temp//" + i);
        if(flag){
            saveAttchMent(part);
        }
        return bsmEmailInfoVO;
    }

    //获取邮件
    public static List<BsmEmailInfoVO> receiveEmail()throws MessagingException, IOException{
        List<BsmEmailInfoVO> result = new ArrayList<BsmEmailInfoVO>();
        Properties props = new Properties();
        props.setProperty("mail.smtp.host", "smtp.163.com");//指定服务器
        props.setProperty("mail.smtp.auth", "true");//指定需要验证
        Session session = Session.getDefaultInstance(props);

        Store store = session.getStore("imap");
        store.connect("imap.163.com", "账号", "密码");
        Folder folder = store.getFolder("INBOX");
        folder.open(Folder.READ_WRITE);//对于邮件可读也可写
        Message msgs[] = folder.getMessages();
        int count = msgs.length;
        ReceiveEmail rm = null;
        for(int i=0;i<count;i++){
            rm = new ReceiveEmail((MimeMessage) msgs[i]);
            BsmEmailInfoVO bsmEmailInfoVO = new BsmEmailInfoVO();
            bsmEmailInfoVO = rm.recive(msgs[i],i);
            //未读的邮件才保存到数据库
            if(bsmEmailInfoVO.getReadStatus()==EmailReadStatusEnum.NEWEMAIL.getCode()){
                msgs[i].setFlag(Flags.Flag.SEEN,true);//将未读的邮件标记为已读
//                msgs[i].saveChanges();  这是致命的,不需要这保存
                result.add(bsmEmailInfoVO);
            }

        }
        folder.close(false);
        store.close();
        return result;
    }
    public static void main(String[] args) throws MessagingException, IOException {
        Properties props = new Properties();
        props.setProperty("mail.smtp.host", "smtp.163.com");
        props.setProperty("mail.smtp.auth", "true");
        Session session = Session.getDefaultInstance(props);

        Store store = session.getStore("imap");
        store.connect("imap.163.com", "***", "***");
        Folder folder = store.getFolder("INBOX");
        folder.open(Folder.READ_ONLY);
        Message msgs[] = folder.getMessages();
        int count = msgs.length;
        System.out.println("Message Count:"+count);
        ReceiveEmail rm = null;
        for(int i=0;i<count;i++){
            rm = new ReceiveEmail((MimeMessage) msgs[i]);
            rm.recive(msgs[i],i);;
        }
        folder.close(false);
        store.close();
    }

}
本文转自互联网

默认分类 | 阅读 1699 次
文章评论,共0条
游客请输入验证码
浏览1701次
文章分类
文章归档
最新评论