如何不手动,保存公司邮件中的附件?

标题如何不手动,保存公司邮件中的附件?

办公自动化系列

很多白领,每天都要收很多邮件。邮件的附件一旦超过规定的,就要及时删除,还来不及手动备份。

因此定时备份邮件中的附件,是工作中非常必须的。

原理很简单,

1、授权登录邮箱

		Properties props = new Properties();
        props.setProperty("mail.store.protocol", "pop3");       // 使用pop3协议
        props.setProperty("mail.pop3.port", "110");           // 端口
        props.setProperty("mail.pop3.host", "");       // pop3服务器
        Session session = Session.getInstance(props);
        Store store = session.getStore("pop3");
        store.connect("", ""); //163邮箱程序登录属于第三方登录所以这里的密码是163给的授权密码而并非普通的登录密码
        // 获得收件箱
        Folder folder = store.getFolder("INBOX");
        /* Folder.READ_ONLY:只读权限
         * Folder.READ_WRITE:可读可写(可以修改邮件的状态)
         */
        folder.open(Folder.READ_WRITE); //打开收件箱
        // 由于POP3协议无法获知邮件的状态,所以getUnreadMessageCount得到的是收件箱的邮件总数
        System.out.println("未读邮件数: " + folder.getUnreadMessageCount());
        // 由于POP3协议无法获知邮件的状态,所以下面得到的结果始终都是为0
        System.out.println("删除邮件数: " + folder.getDeletedMessageCount());
        System.out.println("新邮件: " + folder.getNewMessageCount());
        // 获得收件箱中的邮件总数
        System.out.println("邮件总数: " + folder.getMessageCount());
        // 得到收件箱中的所有邮件,并解析
        Message[] messages = folder.getMessages();
        parseMessage(messages);
        //释放资源
        folder.close(true);
        store.close();

2、读取邮件

// 解析所有邮件
        for (int i = 0, count = messages.length; i < count; i++) {
            MimeMessage msg = (MimeMessage) messages[i];
            System.out.println("------------------解析第" + msg.getMessageNumber() + "封邮件-------------------- ");
            System.out.println("主题: " + getSubject(msg));
            System.out.println("发件人: " + getFrom(msg));
            System.out.println("收件人:" + getReceiveAddress(msg, null));
            System.out.println("发送时间:" + getSentDate(msg, null));
            System.out.println("是否已读:" + isSeen(msg));
            System.out.println("邮件优先级:" + getPriority(msg));
            System.out.println("是否需要回执:" + isReplySign(msg));
            System.out.println("邮件大小:" + msg.getSize() * 1024 + "kb");
            boolean isContainerAttachment = isContainAttachment(msg);
            System.out.println("是否包含附件:" + isContainerAttachment);
            if (isContainerAttachment) {
                saveAttachment(msg, DicConstants.DESKTOP+"文件系统3.0\\mail\\" ,msg.getSubject() + "_"); //保存附件
            }
            StringBuffer content = new StringBuffer(30);
            getMailTextContent(msg, content);
            System.out.println("邮件正文:" + (content.length() > 100 ? content.substring(0,100) + "..." : content));
            System.out.println("------------------第" + msg.getMessageNumber() + "封邮件解析结束-------------------- ");
            System.out.println();
        }

3、判断是否存在附件

/**
     * 保存附件
     * @param part 邮件中多个组合体中的其中一个组合体
     * @param destDir  附件保存目录
     * @throws UnsupportedEncodingException
     * @throws MessagingException
     * @throws FileNotFoundException
     * @throws IOException
     */
    public static void saveAttachment(Part part, String d, String destDir) 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, d, destDir, decodeText(bodyPart.getFileName()));
                } else if (bodyPart.isMimeType("multipart/*")) {
                    saveAttachment(bodyPart, d, destDir);
                } else {
                    String contentType = bodyPart.getContentType();
                    if (contentType.indexOf("name") != -1 || contentType.indexOf("application") != -1) {
                        saveFile(bodyPart.getInputStream(), d,  destDir, decodeText(bodyPart.getFileName()));
                    }
                }
            }
        } else if (part.isMimeType("message/rfc822")) {
            saveAttachment((Part) part.getContent(),d, destDir);
        }
    }

4、存在则下载附件到本地

/**
     * 读取输入流中的数据保存至指定目录
     * @param is 输入流
     * @param fileName 文件名
     * @param destDir 文件存储目录
     * @throws FileNotFoundException
     * @throws IOException
     */
    private static void saveFile(InputStream is, String d, String destDir, String fileName)
            throws FileNotFoundException, IOException {
        BufferedInputStream bis = new BufferedInputStream(is);
        destDir = fileUtil.filterName(destDir);
        BufferedOutputStream bos = new BufferedOutputStream(
                new FileOutputStream(new File(d+ destDir + fileName)));
        int len = -1;
        while ((len = bis.read()) != -1) {
            bos.write(len);
            bos.flush();
        }
        bos.close();
        bis.close();
    }

问:文件名、目录名或卷标语法不正确?

/**
     * 过滤掉特殊字符
     *
     * @param fileName
     * @return
     */
    public static String filterName(String fileName) {
        //删除所有的空格
        String regEx="[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
        Pattern   p   =   Pattern.compile(regEx);
        Matcher m   =   p.matcher(fileName);
        return   m.replaceAll("").trim();
    }

如果想部署到自己工作的电脑上,很简单。加微信bin490647751,回复‘如何不手动,保存公司邮件中的附件?’。收取一定的服务费可帮你电脑设定自动保存邮件中的附件,不再逐个逐个另存为。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 记事本是一款基础文本编辑软件,无法直接提取eml文件附件。要提取eml文件附件,我们可以使用以下方法: 1. 使用专业的电子邮件客户端软件:如Outlook、Thunderbird等,打开eml文件,并通过软件自带的附件提取功能将附件保存到指定位置。 2. 使用第三方的eml文件阅读器和提取工具:市面上存在许多eml文件阅读器,它们通常都具备提取附件的功能。下载并安装合适的工具,打开eml文件,并通过工具提供的选项将附件保存到所需位置。 3. 手动提取:eml文件是一种邮件标准格式,它实际上是一封邮件的源代码。通过用记事本打开eml文件,可以看到邮件内容和附件的原始数据。在源代码查找正确的附件字节流数据,并将其粘贴到新建的文件(注意保存文件时,需将后缀名更改为对应附件类型的扩展名)。这种方法相对复杂,需要一定的技术基础和耐心。 总的来说,使用记事本直接提取eml文件附件是不可行的,建议使用专业的邮件客户端软件或第三方工具来提取附件,以确保效率和附件的完整性。 ### 回答2: 要使用记事本提取.eml文件附件,你需要按照以下步骤进行操作。 首先,将.eml文件保存到你的计算机上。在保存时,确保.eml文件的保存位置易于访问,并且你知道文件的确切路径。 然后,右键单击.eml文件并选择“打开方式”。在打开方式下拉菜单,选择“记事本”。这将使用记事本打开.eml文件。 在记事本窗口,.eml文件的内容将以文本形式显示。你可以看到附件邮件正文的文本内容一同显示。 要提取附件,首先找到附件的开始标记。通常,附件的开始标记以“Content-Disposition: attachment”开头,并且在该行的文件名可以看到。 在找到附件的开始标记后,找到附件的结束标记。通常,附件的结束标记以“--”开头,并且在该行会有一个随机生成的标识符。 从开始标记到结束标记之间的文本就是附件的内容,这些文本是以二进制格式编码的。你需要将这些二进制文本提取出来并将其保存附件。 为了提取附件,可以使用记事本的复制和粘贴功能。选择附件内容并复制,然后在一个新的记事本文档粘贴。 将粘贴的内容保存为一个新的文件,并将其扩展名更改为匹配附件的文件类型。例如,如果附件是图片文件,你可以将其扩展名更改为.png、.jpg等。 完成上述步骤后,你已成功提取了.eml文件附件。你可以通过双击提取出的附件来打开和查看其内容。 ### 回答3: 使用记事本提取.eml文件附件的方法如下: 1. 首先,将.eml文件保存到计算机上的任意位置,确保你可以轻松找到这个文件。 2. 打开记事本工具,你可以通过在开始菜单搜索"记事本"来找到它。 3. 在记事本,点击"文件"选项,并选择"打开"。在文件对话框,选择你保存的.eml文件,然后点击"打开"按钮。 4. .eml文件将在记事本被打开,并以文本格式显示。 5. 请注意,.eml文件是一种邮件文件,可能包含邮件主题、发件人、收件人、正文和附件等信息。你需要在文件找到附件的位置。 6. 通常情况下,附件会以一组编码字符表示,类似于"Content-Type: application/octet-stream; name="example.jpg""的格式,这表示一个名为"example.jpg"的附件。 7. 在找到附件的位置后,你可以将这些编码字符复制到一个新的文本文件,并将文件保存为相应的格式。例如,如果附件是一个.jpg图片,可以将该文本文件保存为"example.txt"。 8. 最后,将保存的文本文件后缀名从.txt更改为相应格式的后缀名,例如.jpg,以恢复附件的原始格式。 需要注意的是,记事本只能提取和查看.eml文件的文本内容,对于其他类型的附件(如图片、文档、压缩包等)可能无法直接查看。对于这些类型的附件,你可以使用相应的应用程序或提取工具进行查看和提取。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值