zoukankan      html  css  js  c++  java
  • java mail 接收邮件

    package com.mw.utils;
    
    
    import com.mw.bean.SmsAlarmLogBean;
    
    import javax.mail.*;
    import javax.mail.internet.InternetAddress;
    import javax.mail.search.FlagTerm;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Properties;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     *
     */
    public class MonitorMail {
    
        public static final String prefix ="[";
        public static final String suffix ="]";
    
        public static final String regex="\[([^}]*)\]";
        public Pattern pattern = Pattern.compile(regex);
        //邮箱服务地址
        private String host;
        //邮箱协议(pop3 imap,协议需要小写)
        private String protocol;
        //服务端口
        private int port;
        //邮箱name
        private String username;
        //邮箱密码
        private String password;
    
        private URLName url;
    
        private Session session;
    
        private Store store;
    
        private Boolean filter;
    
        private Folder folder;
    
        private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
    
    
        /**
         *
         * @param protocol 协议
         * @param host 服务器
         * @param port 端口
         * @param username 邮箱账号
         * @param password  邮箱密码
         */
        public MonitorMail(String protocol,String host,int port,String username,String password){
    
            //协议小写
            this.protocol=protocol.toLowerCase();
            this.host=host;
            this.port=port;
            this.username=username;
            this.password=password;
    
        }
    
        /**
         *  初始化连接邮箱服务器
         * @return
         * @throws Exception
         * store.isConnected();
         */
    
        public MonitorMail initConnect() throws NoSuchProviderException,MessagingException{
            //INBOX 为抓取收件箱的邮件
            this.url = new URLName(protocol, host, port, "INBOX", username, password);
            Properties props = new Properties();
            props.put("mail.imap.timeout",4000);
            props.put("mail.imap.connectiontimeout",4000);//连接超时时间
            this.session = Session.getInstance(props, null);
            //得到邮件仓库
            this.store = session.getStore(url);
            //连接server
            this.store.connect();
    
            return this;
    
        }
    
        /**
         * 获取收件箱所有的信息消息
         * @return
         * @throws Exception
         */
        public Message[] requireMessage() throws Exception{
            this.folder = store.getFolder(url);
            folder.open(Folder.READ_WRITE);
            //index 索引
            FlagTerm ft =
                    new FlagTerm(new Flags(Flags.Flag.SEEN), false); //false代表未读,true代表已读
            Message[] message = folder.search(ft);
            return message;
    
        }
    
    
        /**
         * 获取邮箱内容
         * @return
         * @throws Exception
         */
        public List<String> requireText(boolean filter) throws Exception{
            this.filter=filter;
            ArrayList<String>  candidate =new ArrayList<>();
            //获取邮箱内容对象
            Message[] message = requireMessage();
    
            for(int i=0;i<message.length;i++){
                String text="";
                //文本类型mail
                if (message[i].isMimeType("text/plain")) {
    
                    text = message[i].getContent().toString();
                    //媒体类型
                }else if(message[i].isMimeType("multipart/*")){
                    text = requireMultipartContext(message[i]);
                }
    
                //默认拦截器过滤mail 内容
                if(filter){
                    String filterContent = defaultFilter(text);
                    if(filterContent!=null){
                        candidate.add(filterContent);
                        updateState(message[i]);
                    }
                }else {
                    String filterContent = customerFilter(text);
                    candidate.add(filterContent);
                    updateState(message[i]);
                }
    
            }
            /**
             System.out.println("发件人:" + formatAddress(message.getFrom())
             + "
    发送时间:" + formatDate(message.getSentDate())
             + "
    收件人:" + formatAddress(message.getRecipients(Message.RecipientType.TO))
             //  + "
    收件时间:" + formatDate(msg.getReceivedDate())
             // + "
    抄送:" + formatAddress(msg.getRecipients(Message.RecipientType.CC))
             //                  + "
    暗送:" + formatAddress(msg.getRecipients(Message.RecipientType.BCC))
             + "
    主题:" + message.getSubject());
             **/
    
    
            return candidate;
        }
    
        protected void updateState(Message msg) throws Exception{
            if(protocol.equals("imap")) {
                //pop3没有判断邮件是否为已读的功能,要使用imap才可以进行邮件的标记状态
                msg.setFlag(Flags.Flag.SEEN, true);//设置邮件为已读状态
               // msg.saveChanges();
            }
        }
    
        /**
         * 获取Multipart/*类型的邮箱内容
         * @param message
         * @return
         */
        public String requireMultipartContext(Message message) throws Exception{
            StringBuffer strBuf =new StringBuffer();
            if (message.isMimeType("multipart/*")) {
                Multipart mp = (Multipart) message.getContent();
                int count = mp.getCount();
                for (int j = 0; j < count; j++) {
                    BodyPart bp = mp.getBodyPart(j);
                    String disposition = bp.getDisposition();
                    if (disposition != null && disposition.equals(Part.ATTACHMENT)) {
                        System.out.println("附件:" + bp.getFileName());
                    } else {
                        if (bp.isMimeType("text/plain")) {
                            //邮件文本内容
                            strBuf.append(bp.getContent());
    
                        }
                    }
                }
            }
            return strBuf.toString();
        }
    
    
    
        /**
         * 默认拦截,匹配"[][][][]" 此类型格式的mail
         * @param mailContent
         * @return 匹配失败返回null
         */
        protected String defaultFilter(String mailContent){
            StringBuffer buffer =new StringBuffer();
            Matcher matcher = pattern.matcher(mailContent);
            while(matcher.find()){
                buffer.append(matcher.group());
            }
            String content = buffer.toString();
            if(content.length()==0){
                return null;
            }
            return content;
        }
    
    
        /**
         * 解析mail 内容
         * @param content
         * @return
         */
        public   SmsAlarmLogBean defaultParseText(String content){
            if(!filter){
                throw new IllegalStateException("只可以解析[][][]格式的邮件内容");
            }
            String[] info = content.split(suffix);
            SmsAlarmLogBean alarm =null;
            if(info.length>7){
                alarm=   new SmsAlarmLogBean();
                alarm.setAlarm_type(preIndex(info[5]));
                alarm.setServer_name(preIndex(info[0]));
                alarm.setPc_ip(preIndex(info[1]));
                alarm.setStart_time(preIndex(info[3]));
                alarm.setProcess_name(preIndex(info[7]));
                alarm.setEquip_name(preIndex(info[4]));
    
            }
            return alarm;
        }
    
        /**
         * 自定义拦截器
         */
        public String customerFilter(String mailContent){
    
    
            return mailContent;
        }
    
        /**
         * 自定义解析
         * @param content
         * @return
         */
        public   Object customerParseText(String content){
            return null;
        }
    
    
        public static String preIndex(String info){
            String substring ="";
            if(info.length()>=2) {
                substring= info.substring(1);
            }
            return substring;
        }
    
       public void close()throws Exception{
            if(folder !=null) {
                if (folder.isOpen()) {
                    folder.close(true);
                }
            };
            if(store!=null){
                if(store.isConnected()){
                    store.close();
                }
            }
    
    
        }
    
        public static String formatDate(Date date) {
            return sdf.format(date);
        }
    
        public static String formatAddress(Address[] addr) {
            StringBuffer sb = new StringBuffer();
            if (addr == null) {
                return "";
            }
            for (int i = 0; i < addr.length; i++) {
                Address a = addr[i];
                if (a instanceof InternetAddress) {
                    InternetAddress ia = (InternetAddress) a;
                    sb.append(ia.getPersonal() + "<" + ia.getAddress() + ">,");
                } else {
                    sb.append(a.toString());
                }
            }
            if (sb.length() != 0) {
                return sb.substring(0, sb.length() - 1);
            }
            return "";
        }
    
        //test MonitorMail
        public static void main(String[] args) throws Exception {
            MonitorMail mail =new MonitorMail("imap","192.168.0.101",143,"test@luobin.com",
                    "Pass1234");
            List<String> strings = mail.initConnect().requireText(true);//fasle返回我们自定义的,根据业务需求
            System.out.println(strings);
            mail.close();
    
    
        }
    
    
    
    }
  • 相关阅读:
    洛谷P3406 海底高铁[差分 贪心]
    POJ3398Perfect Service[树形DP 树的最大独立集变形]
    POJ3928Ping pong[树状数组 仿逆序对]
    UVALive
    UVALive
    http协议进阶(二)URL与资源
    http协议进阶(一)HTTP概述
    http协议基础(十)实体首部字段
    http协议基础(九)响应首部字段
    http协议基础(八)请求首部字段
  • 原文地址:https://www.cnblogs.com/iscys/p/10689329.html
Copyright © 2011-2022 走看看