首页 > 编程语言 >Java imap邮件接收与解析

Java imap邮件接收与解析

时间:2022-08-26 14:58:34浏览次数:80  
标签:body Java imap email new imapMessage 邮件

Properties props = new Properties();
props.setProperty("mail.transport.protocol", "imap"); // 使用的协议, imap | pop3
props.setProperty("mail.imap.host", "smtp.qq.com"); // 邮箱的收件服务器地址

// 获取连接
Session session = Session.getDefaultInstance(props);
session.setDebug(false);

IMAPStore store = (IMAPStore) session.getStore(protocol);
store.connect(emailboxServer, username, authCode); // imap服务器的登录认证, 邮箱账号用户名,授权码
IMAPFolder inbox = (IMAPFolder) store.getFolder("INBOX");
inbox.open(Folder.READ_WRITE);
Message[] messages = inbox.getMessages();

for (Message message : messages) {
    IMAPMessage imapMessage = (IMAPMessage) message;
    Flags flags = imapMessage.getFlags();
    if (flags.contains(Flags.Flag.SEEN)) {
        continue;
    }

    CustomerEmail email = new CustomerEmail();
    email.setEmailId(inbox.getUID(imapMessage)); // 邮件唯一标识
    email.setDeliveryDate(format.format(imapMessage.getSentDate())); // 发件日期
    String subject = imapMessage.getSubject(); // 主题
    email.setSubject(subject);
    InternetAddress from = (InternetAddress) imapMessage.getFrom()[0]; // 发件人
    email.setFrom(from.getAddress());
    InternetAddress to = (InternetAddress) imapMessage.getReplyTo()[0]; // 收件人
    email.setTo(to.getAddress());
    if (message.isMimeType("TEXT/*")) { // 仅包含正文的简单邮件
        System.out.println("邮件正文: " + message.getContent());
    } else {
        parseMessage((MimeMultipart) message.getContent(), email); // 解析稍复杂邮件
    }
}

/**
 * 解析邮件
 */
public static void parseMessage (MimeMultipart part, CustomerEmail email) throws MessagingException, IOException {
    byte[] bytes = new byte[1024];
    ByteArrayOutputStream outStream = new ByteArrayOutputStream();

    for (int i = 0; i < part.getCount(); i++) {
        BodyPart body = part.getBodyPart(i);
        if (body.isMimeType("text/html")) {
            System.out.println("html格式正文: " + (String) body.getContent());
        } else if (body.isMimeType("text/plain")) {
            System.out.println("纯文本格式正文: " + (String) body.getContent());
        } else if (body.isMimeType("multipart/*")) {
            MimeMultipart multipart = (MimeMultipart) body.getContent();
            parseMessage(multipart, email);
        } else { // 附件
            InputStream inputStream = body.getDataHandler().getInputStream();
            int len = 0;
            while( (len = inputStream.read(bytes)) != -1 ){
                outStream.write(bytes, 0, len);
            }
            inputStream.close();
            byte[] data = outStream.toByteArray();
            String fileName = body.getFileName();
            File tempFile = new File(FileUtils.getTempDirectoryPath() + File.separator + System.currentTimeMillis() + fileName );
            FileOutputStream fileOutputStream = new FileOutputStream(tempFile);
            fileOutputStream.write(data);
            fileOutputStream.close();
            System.out.println("邮件附件本地路径: " + tempFile.getAbsolutePath());
        }
    }
}

标签:body,Java,imap,email,new,imapMessage,邮件
From: https://www.cnblogs.com/hui0618/p/16627515.html

相关文章

  • Redis获取缓存异常:redis java.util.ArrayList cannot be cast to java.lang.String
    Redis获取缓存异常:redisjava.util.ArrayListcannotbecasttojava.lang.String在使用redis缓存数据时,增加一个配置类,修改key序列化器为string@Configurationpublic......
  • Flink出现network.partition.ProducerFailedException: java.lang.NullPointerExcepti
    一、错误日志org.apache.flink.runtime.io.network.netty.exception.RemoteTransportException:Erroratremotetaskmanager'xx.xxx.xxx.xxx/xxx.xxx.xxx.xxx:34750'......
  • 关于java远程调用接口,处理返回值为json的记录
    当远程调用接口时,需要处理返回的值,有时候需要转为json例如:HashMap<Object,Object>mapTemp=newHashMap<>();mapTemp.put("classId",classId);mapTemp.put("com......
  • 面试题:Java序列化与反序列化
    目录序列化和反序列化的概念应用场景?序列化实现的方式继承Serializable接口,普通序列化继承Externalizable接口,强制自定义序列化serialVersionUID的作用静态变量不会被序列......
  • java流程结构
    顺序结构按顺序往下运行if单选择结构if(布尔表达式){//如果布尔表达式的值为true}if双选择结构if(布尔表达式){//如果布尔表达式的值为true}else{/......
  • JavaScript基础回顾知识点记录7-事件补充说明2
    js中鼠标滚轮事件offsetWidth/offsetHeight-对象的可见宽度/高度clientWidth/clientHeight-内容的可见宽度/高度scrollWidth/scrollHeight......
  • Java Servlet 入门: 重复注解的使用。
    刚好需要用到重复注解:下面进行示例使用:1、先正常定义一个注解:@Retention(value=RetentionPolicy.RUNTIME)@Target(value={ElementType.METHOD})@Inheritedpubl......
  • java学习:八大基本类型变量
    1.类在java中用class来定义一个类,类是java程序的基本单位类描述的是具有共性的一类事物,所以我们又可以把类称作为模板技术 如何理解共性:具有相同的属性--》j......
  • Java -> Stream入门
    学习Stream的目的函数式编程渐渐变成主流,为了看懂同事的代码。相对于传统的编程方式,代码更为简洁清晰易懂。使得并发编程变得如此简单。有效的避免了代码嵌套......
  • java中的字符流知识点总结
    java中字符流字符流:对文本的读取,速度比字节流快常见的字符流:Reader和WriterReader是InputStreamReader的父类,InputStreamReader是FileReader的父类FileReader的相......