java实现读取邮件发送邮件

有些邮箱pop服务器不支持查看是否邮件已经被查看多的功能,只能通过自己认为添加标识标记邮件是已读还是未读


public class MailUtil {


/** 
     * 判断邮件中是否包含附件 
     * @param msg 邮件内容 
     * @return 邮件中存在附件返回true,不存在返回false 
     * @throws MessagingException 
     * @throws IOException 
     */  
    public static boolean isContainAttachment(Part part) throws MessagingException, IOException {  
        boolean flag = false;  
        if (part.isMimeType("multipart/*")) {  
            MimeMultipart multipart = (MimeMultipart) part.getContent();  
            int partCount = multipart.getCount();  
            for (int i = 0; i < partCount; i++) {  
                BodyPart bodyPart = multipart.getBodyPart(i);  
                String disp = bodyPart.getDisposition();  
                if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {  
                    flag = true;  
                } else if (bodyPart.isMimeType("multipart/*")) {  
                    flag = isContainAttachment(bodyPart);  
                } else {  
                    String contentType = bodyPart.getContentType();  
                    if (contentType.indexOf("application") != -1) {  
                        flag = true;  
                    }    
                    if (contentType.indexOf("name") != -1) {  
                        flag = true;  
                    }   
                }
                  
                if (flag) break;  
            }  
        } else if (part.isMimeType("message/rfc822")) {
            flag = isContainAttachment((Part)part.getContent());  
        }  
        return flag;  
    }
    
    /** 
     * 获得邮件发件人 
     * @param msg 邮件内容 
     * @return 姓名 <Email地址> 
     * @throws MessagingException 
     * @throws UnsupportedEncodingException  
     */  
    public static String getFrom(MimeMessage msg) throws MessagingException, UnsupportedEncodingException {  
        String from = "";  
        Address[] froms = msg.getFrom();  
        if (froms.length < 1)  
            throw new MessagingException("没有发件人!");
          
        InternetAddress address = (InternetAddress) froms[0];  
        String person = address.getPersonal();  
        if (person != null) {  
            person = MimeUtility.decodeText(person) + " ";  
        } else {  
            person = "";  
        }  
        from = person + "<" + address.getAddress() + ">";  
          
        return from;  
    }
    
    /** 
     * 获得邮件文本内容 
     * @param part 邮件体 
     * @param content 存储邮件文本内容的字符串 
     * @throws MessagingException 
     * @throws IOException 
     */  
    public static void getMailTextContent(Part part, StringBuffer content) throws MessagingException, IOException {  
        //如果是文本类型的附件,通过getContent方法可以取到文本内容,但这不是我们需要的结果,所以在这里要做判断  
        boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;   
        if (part.isMimeType("text/*") && !isContainTextAttach) {  
            content.append(part.getContent().toString());  
        } else if (part.isMimeType("message/rfc822")) {   
            getMailTextContent((Part)part.getContent(),content);  
        } else if (part.isMimeType("multipart/*")) {  
            Multipart multipart = (Multipart) part.getContent();  
            int partCount = multipart.getCount();  
            for (int i = 0; i < partCount; i++) {  
                BodyPart bodyPart = multipart.getBodyPart(i);  
                getMailTextContent(bodyPart,content);  
            }  
        }
    }  
    
    /** 
     * 获得邮件主题 
     * @param msg 邮件内容 
     * @return 解码后的邮件主题 
     */  
    public static String getSubject(MimeMessage msg) throws UnsupportedEncodingException, MessagingException {  
        return MimeUtility.decodeText(msg.getSubject());  
    }
    
    /** 
     * 根据收件人类型,获取邮件收件人、抄送和密送地址。如果收件人类型为空,则获得所有的收件人 
     * <p>Message.RecipientType.TO  收件人</p> 
     * <p>Message.RecipientType.CC  抄送</p> 
     * <p>Message.RecipientType.BCC 密送</p> 
     * @param msg 邮件内容 
     * @param type 收件人类型 
     * @return 收件人1 <邮件地址1>, 收件人2 <邮件地址2>, ... 
     * @throws MessagingException 
     */  
    public static String getReceiveAddress(MimeMessage msg, Message.RecipientType type) throws MessagingException {  
        StringBuffer receiveAddress = new StringBuffer();  
        Address[] addresss = null;  
        if (type == null) {  
            addresss = msg.getAllRecipients();
        } else {  
            addresss = msg.getRecipients(type);  
        }  
          
        if (addresss == null || addresss.length < 1)  
            throw new MessagingException("没有收件人!");
        for (Address address : addresss) {  
            InternetAddress internetAddress = (InternetAddress)address;  
            receiveAddress.append(internetAddress.toUnicodeString()).append(",");  
        }  
          
        receiveAddress.deleteCharAt(receiveAddress.length()-1); //删除最后一个逗号  
          
        return receiveAddress.toString();
    } 
    
    /** 
     * 获得邮件发送时间 
     * @param msg 邮件内容 
     * @return yyyy年mm月dd日 星期X HH:mm 
     * @throws MessagingException 
     */  
    public static String getSentDate(MimeMessage msg, String pattern) throws MessagingException {  
        Date receivedDate = msg.getSentDate();  
        if (receivedDate == null)  
            return "";  
          
        if (pattern == null || "".equals(pattern))  
            pattern = "yyyy年MM月dd日 E HH:mm ";  
          
        return new SimpleDateFormat(pattern).format(receivedDate);  
    }
    
    /**  
     * 判断邮件是否已读  
     * @param msg 邮件内容  
     * @return 如果邮件已读返回true,否则返回false  
     * @throws MessagingException   
     */  
    public static boolean isSeen(MimeMessage msg){  
        try {
return msg.getFlags().contains(Flags.Flag.SEEN);
} catch (MessagingException e) {
e.printStackTrace();
}
return true;
    }
    
    /** 
     * 获得邮件的优先级 
     * @param msg 邮件内容 
     * @return 1(High):紧急  3:普通(Normal)  5:低(Low) 
     * @throws MessagingException  
     */  
    public static String getPriority(MimeMessage msg) throws MessagingException {  
        String priority = "普通";  
        String[] headers = msg.getHeader("X-Priority");  
        if (headers != null) {
            String headerPriority = headers[0];
            if (headerPriority.indexOf("1") != -1 || headerPriority.indexOf("High") != -1)
                priority = "紧急";  
            else if (headerPriority.indexOf("5") != -1 || headerPriority.indexOf("Low") != -1)
                priority = "低";
            else  
                priority = "普通";
        }  
        return priority;
    }
    
    /** 
     * 判断邮件是否需要阅读回执 
     * @param msg 邮件内容 
     * @return 需要回执返回true,否则返回false 
     * @throws MessagingException 
     */  
    public static boolean isReplySign(MimeMessage msg) throws MessagingException {  
        boolean replySign = false;  
        String[] headers = msg.getHeader("Disposition-Notification-To");  
        if (headers != null)  
            replySign = true;  
        return replySign;  
    }
    
    /**  
     * 保存附件  
     * @param part 邮件中多个组合体中的其中一个组合体  
     * @param destDir  附件保存目录  
     * @throws UnsupportedEncodingException  
     * @throws MessagingException  
     * @throws FileNotFoundException  
     * @throws IOException  
     */  
    public static void saveAttachment(Part part, String destDir,String fileName) throws UnsupportedEncodingException, MessagingException,  
            FileNotFoundException, IOException {
        if (part.isMimeType("multipart/*")) {  
            Multipart multipart = (Multipart) part.getContent();//复杂体邮件  
            //复杂体邮件包含多个邮件体  
            int partCount = multipart.getCount();  
            for (int i = 0; i < partCount; i++) {  
                //获得复杂体邮件中其中一个邮件体  
                BodyPart bodyPart = multipart.getBodyPart(i);  
                //某一个邮件体也有可能是由多个邮件体组成的复杂体
                String disp = bodyPart.getDisposition();  
                if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {  
                    InputStream is = bodyPart.getInputStream();
//                    saveFile(is, destDir, decodeText(bodyPart.getFileName()));  
                    saveFile(is, destDir, fileName);  
                } else if (bodyPart.isMimeType("multipart/*")) {  
                    saveAttachment(bodyPart,destDir,fileName);  
                } else {  
                    String contentType = bodyPart.getContentType();  
                    if (contentType.indexOf("name") != -1 || contentType.indexOf("application") != -1) {  
//                        saveFile(bodyPart.getInputStream(), destDir, decodeText(bodyPart.getFileName()));  
                        saveFile(bodyPart.getInputStream(), destDir, fileName);  
                    }  
                }  
            }  
        } else if (part.isMimeType("message/rfc822")) {  
            saveAttachment((Part) part.getContent(),destDir,fileName);  
        }  
    }
    
    /**  
     * 读取输入流中的数据保存至指定目录  
     * @param is 输入流  
     * @param fileName 文件名  
     * @param destDir 文件存储目录  
     * @throws FileNotFoundException  
     * @throws IOException  
     */  
    private static void saveFile(InputStream is, String destDir, String fileName)  
            throws FileNotFoundException, IOException {
        BufferedInputStream bis = new BufferedInputStream(is);
        File destFile = new File(destDir + fileName);
        if(!destFile.exists()){
        destFile.getParentFile().mkdirs();
        destFile.createNewFile();
        }
        BufferedOutputStream bos = new BufferedOutputStream(  
                new FileOutputStream(destFile));
        int len = -1;  
        while ((len = bis.read()) != -1) {  
            bos.write(len);  
            bos.flush();  
        }
        bos.close();  
        bis.close();
    }
    
    /** 
     * 文本解码 
     * @param encodeText 解码MimeUtility.encodeText(String text)方法编码后的文本 
     * @return 解码后的文本 
     * @throws UnsupportedEncodingException 
     */  
    public static String decodeText(String encodeText) throws UnsupportedEncodingException {  
        if (encodeText == null || "".equals(encodeText)) {  
            return "";  
        } else {  
            return MimeUtility.decodeText(encodeText);  
        }  
    } 
    
    public static List readMail(){
    List list =  new ArrayList();
String username = ReadConfig.getKeyValue("username");
String password = ReadConfig.getKeyValue("password");
Properties props = new Properties();
props.put("mail.pop3.port", "110");
props.put("mail.pop3.host", "pop.sina.com");
Session session = Session.getInstance(props);  
try {
Store store = session.getStore("pop3");
store.connect(username, password);  
Folder folder = store.getFolder("INBOX");  
folder.open(Folder.READ_WRITE); //打开收件箱 
Message messages[] = folder.getMessages();
int readnum = Integer.valueOf(ReadConfig.getKeyValue("readnum"));
// 解析未读邮件
for (int i = readnum ; i < messages.length; i++) {
   MimeMessage msg = (MimeMessage) messages[i];
   System.out.println("------------------解析第" + msg.getMessageNumber() + "封邮件-------------------- ");  
   System.out.println("主题: " + getSubject(msg));  
   System.out.println("发件人: " + getFrom(msg));  
   StringBuffer content = new StringBuffer(30);
   getMailTextContent(msg, content);
   String mailContent = content.toString().trim();
   
   HashMap<String, String> map = new HashMap();
   
   // 正文
   map.put("content", mailContent);
   System.out.println("邮件正文:" + mailContent);
   
    // 附件
    boolean isContainerAttachment = isContainAttachment(msg);
System.out.println("是否包含附件:" + isContainerAttachment);
    if (isContainerAttachment) {
    String fileName = "D:\\" + msg.getSubject() + ".docx";
    saveAttachment(msg, "D:\\" , msg.getSubject()+".docx");//转成input流数据
    map.put("attachFile", fileName);
    File file = new File(fileName);
map.put("inputStream", base64EnCode(file));
   }
    list.add(map);
}
// 读完邮件,设置已读邮件数
// ReadConfig.writeProperties("readnum", messages.length+"");
} catch (Exception e) {
e.printStackTrace();
}
    return list ;
    }
    
    /**
* 将邮件附件进行base64编码 
* 接收方需要先解码成byte数组,再写文件
* @param file
* @return 
* @throws  
*/
    public static String base64EnCode(File file){
    byte[] by = new byte[(int) file.length()]; 
try {
InputStream is = new FileInputStream(file); 
ByteArrayOutputStream bytestream = new ByteArrayOutputStream(); 
byte[] bb = new byte[2048]; 
int ch; 
ch = is.read(bb); 
while (ch != -1) {
bytestream.write(bb, 0, ch); 
ch = is.read(bb); 
}
by = bytestream.toByteArray(); 
} catch (Exception ex) { 
ex.printStackTrace(); 
}
Base64 base64 = new Base64();
return base64.encodeBase64String(by);
    }
    /**
     * @param map  
* 发送邮件 
* @param 
* @return 
* @throws  
*/
    public static void sendMail(final HashMap<String, String> map){
    String username = ReadConfig.getKeyValue("username");
String password = ReadConfig.getKeyValue("password");
String post = ReadConfig.getKeyValue("mail.smtp.port");
String host = ReadConfig.getKeyValue("mail.smtp.host");
Properties props = new Properties();
props.put("mail.smtp.port", post);
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
Session session = Session.getInstance(props,
                new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                    String username = ReadConfig.getKeyValue("username");
                String password = ReadConfig.getKeyValue("password");
                        return new PasswordAuthentication(username, password);
                    }
                });
MimeMessage message = new MimeMessage(session);
// 设置发信人
   try {
message.setFrom(new InternetAddress(username));
   // 设置收件人
   message.setRecipient(RecipientType.TO,new InternetAddress("1553025502@qq.com"));
   message.setRecipient(RecipientType.CC,new InternetAddress("tianql@zhong-ying.com"));
   // 设置主题
   message.setSubject(map.get("title"));
   // 设置邮件内容
   message.setContent(map.get("content"), "text/html;charset=utf-8");
   // 邮件的附件,邮件附件目前没有不知道怎么发送
   
   // 发送
   Transport transport = session.getTransport("smtp");
   transport.send(message);
   } catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
    }
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页