首页 > 编程语言 >使用Javamail接收imaps协议的邮件

使用Javamail接收imaps协议的邮件

时间:2024-01-22 13:34:09浏览次数:39  
标签:port Javamail socketFactory props put mail imaps 邮件

网上的消息不能说大多,只能说基本都过时了,连imap和imaps都不分了

本文基于apache-james项目搭建的邮件服务器,其他邮件服务器仅供参考

首先是依赖,这里需要引入两个依赖,如下

    <dependency>
      <groupId>javax.mail</groupId>
      <artifactId>javax.mail-api</artifactId>
      <version>1.6.2</version>
    </dependency>
    <dependency>
      <groupId>com.sun.mail</groupId>
      <artifactId>javax.mail</artifactId>
      <version>1.6.2</version>
    </dependency>

代码部分,这是SSL的情况

    @Test
    void receive(){
        IMAPStore store = null;
        IMAPFolder folder = null;
        try{
            // 准备登录信息:
            String host = "serverIP";
            int port = 993;
            String username = "[email protected]";
            String password = "password";
            final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
            // 这里的Provider不会自动补全,而且写好之后是红色字体表示报错,idea会提示解决方案
            Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
            // 设置信任所有证书,仅限测试环境,正式环境需要去掉,否则证书安全性形同虚设
            MailSSLSocketFactory socketFactory = new MailSSLSocketFactory();
            socketFactory.setTrustAllHosts(true);

            Properties props = new Properties();
            props.put("mail.imaps.socketFactory", socketFactory);
            props.put("mail.imaps.socketFactory.class", SSL_FACTORY);
            props.put("mail.imaps.socketFactory.port", port);
            props.put("mail.store.protocol", "imaps");
            props.put("mail.imaps.host", host);
            props.put("mail.imaps.port", port);
            Session session = Session.getInstance(props, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
            });
            store = (IMAPStore) session.getStore("imaps");
            store.connect();

            // INBOX指收件箱
            folder = (IMAPFolder) store.getFolder("INBOX");// 获得用户的邮件帐户
            folder.open(Folder.READ_WRITE); // 设置对邮件帐户的访问权限

            Message[] messages = folder.getMessages();// 得到邮箱帐户中的所有邮件

            for (Message message : messages) {
                for(Part part: getBody(message)){
                    System.out.println(part.getContent());
                }
            }
        }catch (MessagingException | IOException | GeneralSecurityException e) {
            e.printStackTrace();
        } finally{
            try{
                assert folder != null;
                folder.close(true);// 关闭邮件夹对象
                store.close(); // 关闭连接对象
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }
    }

这里有一个getBody方法,参考 https://www.liaoxuefeng.com/wiki/1252599548343744/1319099948859426#0 做了一些优化,一个MimeMessage对象也是一个Part对象,它可能只包含一个文本,也可能是一个Multipart对象,即由几个Part构成,因此,需要递归地解析出完整的正文

List<Part> getBody(Part part) throws MessagingException, IOException {
        List<Part> body = new ArrayList<>();
        if (part.isMimeType("text/*")) {
            // Part是文本:
            body.add(part);
        }
        if (part.isMimeType("multipart/*")) {
            // Part是一个Multipart对象:
            Multipart multipart = (Multipart) part.getContent();
            // 循环解析每个子Part:
            for (int i = 0; i < multipart.getCount(); i++) {
                BodyPart bodyPart = multipart.getBodyPart(i);
                if (!body.isEmpty()) {
                    body.addAll(getBody(bodyPart));
                }
            }
        }
        return body;
    }

如果收件服务器没有用ssl,去掉这三行,并且把所有的imaps改成imap

            props.put("mail.imaps.socketFactory", socketFactory);
            props.put("mail.imaps.socketFactory.class", SSL_FACTORY);
            props.put("mail.imaps.socketFactory.port", port);

欢迎留言交流

标签:port,Javamail,socketFactory,props,put,mail,imaps,邮件
From: https://www.cnblogs.com/whiteEyeborw/p/17979852

相关文章

  • SpringBoot集成邮件服务进行校验
    一、前言在我们进行注册、登录等操作的时候,为了保证用户信息的安全性,我们经常会需要接收短信验证码等场景,虽然它的安全系数较高,但是由于需要付费使用,所以我们也可以使用邮箱服务接收验证码来实现安全校验,提升系统安全系数。二、环境准备以QQ邮箱为例,我们需要在邮箱中开启SMTP服务获......
  • C++ 邮件槽ShellCode跨进程传输
    在计算机安全领域,进程间通信(IPC)一直是一个备受关注的话题。在本文中,我们将探讨如何使用Windows邮件槽(Mailslot)实现ShellCode的跨进程传输。邮件槽提供了一种简单而有效的单向通信机制,使得任何进程都能够成为邮件槽服务器,并通过UDP通信向其他进程发送数据。邮件槽是Windows操作系统......
  • mail邮件的POP、IMAP和SMTP设置教程,简单好用
    在现代社会中,电子邮件已经成为人们日常沟通的重要方式之一。为了能够顺利收发邮件,正确设置邮件客户端的POP、IMAP和SMTP是至关重要的步骤。本文将为大家详细介绍如何进行这些设置,使邮件体验更为简单和便捷。1.POP、IMAP、SMTP是什么?在深入了解如何设置之前,我们先来了解一下这三个......
  • 发送邮件
    importtimeimportrandom'''定义一个函数,展示菜单栏'''defrandom_code():number=random.randint(100000,999999)returnnumber定义一个函数发送邮箱defsend_email(receiver_email,info):#zyxkyiufoghagijeimportsmtplibfromemail.mime.texti......
  • FlashDuty Changelog 2023-12-18 | 值班管理、服务日历、自定义操作和邮件集成
    FlashDuty:一站式告警响应平台,前往此地址免费体验!值班管理UI交互优化【个人日程】从头像下拉菜单调整到值班列表页面,快速查看个人值班日程【值班列表】支持原地预览最近一周值班情况,包括当前和下一阶段值班人【值班详情】支持日历模式与时间线模式切换,查看月度计划更方便......
  • 邮件中添加图片内容
    背景:质量分析的数据是在网页端,每月质量分析结束后需要发送邮件。因为网页端的数据已经统计好了,并且展示形式也满足使用需求,只需要把网页端的数据通过邮件发送即可。已经通过dp获取到了网页端的全屏截图本地保存了,只需要邮件把截图发送出去即可。本来使用的是email.mime下的mul......
  • WPS邮件合并:将图片名称通过WPS整体成文档
    项目介绍项目功能介绍(影像志):将文件夹下的所有图片名称(图1)批量制作成word中的样式(图2)。图1图2项目章节/知识点获取文件夹下的所有文件名称Excel表格数据分列Word邮件合并观察/思考/总结1、文件夹下的所有图片名称包括:日期+文字说明+摄影者。2、Word效果图中包括:照片号+摄影者+摄影时......
  • Python和RPA网页自动化-发送邮件
    以163邮箱为例,分别使用Python和RPA网页自动化发送邮件到指定邮箱其中2个方法都需要用到163邮箱授权码,开启IMAP/SMTP服务即可得到授权码(POP3/SMTP服务不用开启) 1、python代码如下importsmtplibfromemail.mime.textimportMIMETextfromemail.headerimportHeaderdef......
  • Jenkins邮件模板
    模板一:1<!DOCTYPEhtml>2<html>3<head>4<metacharset="UTF-8">5<title>${ENV,var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>6</head>78<bodyleftmargin="8"marginw......
  • 利用Kettle按需分发邮件
    一、需求:全量数据发送给A邮箱,再把各个供应商的数据发送给各个供应商的邮箱全量数据发送到a邮箱b的数据发送b邮箱c的数据发送c邮箱d的数据发送d邮箱二、实现思路:从全量的Excel里根据name字段保存成每个对应名字的Excel文件,再把各个Excel文件发送到对应的邮箱提前准备两个Exce......