首页 > 其他分享 >邮件发送,附件太大怎么办 → 那就用分卷压缩吧

邮件发送,附件太大怎么办 → 那就用分卷压缩吧

时间:2023-11-16 12:03:39浏览次数:32  
标签:分卷压缩 java props smtp new 附件 mail 邮件

开心一刻

  昨晚,老婆辅导女儿写作业

  有一道形容妈妈的题,女儿写下了:我妈妈像一个暴躁的老虎

  老婆拿起题册轻轻敲了下女儿,生气到:有这么形容你妈的吗

  女儿:你看你现在

  老婆:我有那么暴躁吗,你就不能说我妈妈像一个公主,温柔大方漂亮?

  女儿:题目让我造句,没让我造谣!

  我:哈哈哈哈!

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_java

邮件发送

JavaMail 很容易实现邮件发送,例如基于 1.5.5

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_List_02

  发送简单正文

/**
 * 发送简单正文,并显示昵称
 * @param content 正文
 * @param to 收件人
 * @throws Exception
 */
public static void sendMailNick(String content, String to) throws Exception {
    //设置邮件会话参数
    Properties props = new Properties();
    //邮箱的发送服务器地址
    props.setProperty("mail.smtp.host", MAIL_HOST);
    props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.setProperty("mail.smtp.socketFactory.fallback", "false");
    props.put("mail.smtp.ssl.enable", "true");

    //邮箱发送服务器端口,这里设置为465端口
    props.setProperty("mail.smtp.port", "465");
    props.setProperty("mail.smtp.socketFactory.port", "465");
    props.put("mail.smtp.auth", "true");

    //获取到邮箱会话,利用匿名内部类的方式,将发送者邮箱用户名和密码授权给jvm
    Session session = Session.getDefaultInstance(props, new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(MAIL_USER_NAME, MAIL_AUTH_CODE);
        }
    });
    // 开启调试
    session.setDebug(true);
    // 创建传输对象
    Transport trans = session.getTransport();
    trans.connect(MAIL_HOST, "青石路", MAIL_AUTH_CODE);
    // 创建邮件消息对象
    Message message = new MimeMessage(session);
    // 设置发件人信息(昵称:青石路)
    message.setFrom(new InternetAddress(MAIL_USER_NAME, "青石路", "UTF-8"));
    // 设置收件人信息
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
    // 设置正文
    Multipart multipart = new MimeMultipart();
    BodyPart contentPart = new MimeBodyPart();
    contentPart.setContent(content, "text/html;charset=UTF-8");
    multipart.addBodyPart(contentPart);
    // 设置邮件主题和内容信息
    message.setSubject("昵称测试");
    message.setContent(multipart);
    // 发送邮件
    trans.sendMessage(message, message.getAllRecipients());
    // 关闭传输
    trans.close();
}

View Code

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_源文件_03

  需要注意的是,不同的邮箱的发件箱的端口会有不同,另外发件箱也可能是授权码而不是发件箱登陆密码,需要大家结合具体的邮箱服务器来设置

  不出意外的话,邮件发送成功后,收件箱会收到一封类似如下的邮件

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_源文件_04

  发送附件

  很多时候,我们发送邮件都会带附件

  实现也很简单

/**
 * 发送邮件,带附件
 * @param content 正文
 * @param to 收件人
 * @param attachments 附件列表
 * @throws Exception
 */
public static void sendMailNick(String content, String to, List<File> attachments) throws Exception {
    //设置邮件会话参数
    Properties props = new Properties();
    //邮箱的发送服务器地址
    props.setProperty("mail.smtp.host", MAIL_HOST);
    props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.setProperty("mail.smtp.socketFactory.fallback", "false");
    props.put("mail.smtp.ssl.enable", "true");

    //邮箱发送服务器端口,这里设置为465端口
    props.setProperty("mail.smtp.port", "465");
    props.setProperty("mail.smtp.socketFactory.port", "465");
    props.put("mail.smtp.auth", "true");

    //获取到邮箱会话,利用匿名内部类的方式,将发送者邮箱用户名和密码授权给jvm
    Session session = Session.getDefaultInstance(props, new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(MAIL_USER_NAME, MAIL_AUTH_CODE);
        }
    });
    // 开启调试
    session.setDebug(true);
    // 创建传输对象
    Transport trans = session.getTransport();
    trans.connect(MAIL_HOST, "青石路", MAIL_AUTH_CODE);
    // 创建邮件消息对象
    Message message = new MimeMessage(session);
    // 设置发件人信息(昵称:青石路)
    message.setFrom(new InternetAddress(MAIL_USER_NAME, "青石路", "UTF-8"));
    // 设置收件人信息
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
    // 设置正文
    Multipart multipart = new MimeMultipart();
    BodyPart contentPart = new MimeBodyPart();
    contentPart.setContent(content, "text/html;charset=UTF-8");
    multipart.addBodyPart(contentPart);
    // 添加附件
    if (Objects.nonNull(attachments) && !attachments.isEmpty()) {
        for (File e : attachments) {
            BodyPart attachmentBodyPart = new MimeBodyPart();
            DataSource source = new FileDataSource(e);
            attachmentBodyPart.setDataHandler(new DataHandler(source));
            //MimeUtility.encodeWord可以避免文件名乱码
            attachmentBodyPart.setFileName(MimeUtility.encodeWord(e.getName()));
            multipart.addBodyPart(attachmentBodyPart);
        }
    }
    // 设置邮件主题和内容信息
    message.setSubject("昵称测试");
    message.setContent(multipart);
    // 发送邮件
    trans.sendMessage(message, message.getAllRecipients());
    // 关闭传输
    trans.close();
}

View Code

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_List_05

发送简单正文

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_List_06

  不出意外的话,邮件发送成功后,收件箱会收到一封类似如下的邮件

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_java_07

  附件过大

  但是各大电子邮箱对附件的大小都是由限制的,具体限制大小是多少,需要去看各大电子邮箱的官方说明

200

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_源文件_08

  结果发送失败,异常信息如下

java.net.SocketException: Connection reset by peer: socket write error
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
    at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:431)
    at sun.security.ssl.OutputRecord.write(OutputRecord.java:417)
    at sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:876)
    at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:847)
    at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)
    at com.sun.mail.util.TraceOutputStream.write(TraceOutputStream.java:138)
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:126)
    at com.sun.mail.util.CRLFOutputStream.write(CRLFOutputStream.java:84)
    at com.sun.mail.smtp.SMTPOutputStream.write(SMTPOutputStream.java:87)
    at com.sun.mail.util.CRLFOutputStream.write(CRLFOutputStream.java:75)
    at com.sun.mail.util.BASE64EncoderStream.write(BASE64EncoderStream.java:140)
    at javax.activation.DataHandler.writeTo(DataHandler.java:309)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1645)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:961)
    at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:553)
    at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:81)
    at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:889)
    at javax.activation.DataHandler.writeTo(DataHandler.java:317)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1645)
    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1850)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1241)
    at com.qsl.MailTest.sendMailNick(MailTest.java:297)
    at com.qsl.MailTest.main(MailTest.java:52)

View Code

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_java_09

  碰到这种大文件,难道邮件就没法发送了吗?

  针对单个的大文件,作为一个附件确实发送不了

  如果将单个文件拆分成多个文件,再以多封邮件来发送,是不是可行了?

  此时大家可能会有疑问:非压缩文件可以按内容进行手动拆分,压缩文件怎么拆,特别是安装文件!

所以我们要多读书,拓展我们的知识面

分卷压缩

  关于概念,不做介绍,大家自行去搜索,重点给大家演示实现

zip4j

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_源文件_10

  很容易实现分卷压缩

/**
 * 分卷压缩
 * @param sizeThreshold 分卷阈值,即多大进行一次分卷,单位:M
 * @param sourceFiles 源文件列表
 * @param destDirPath 目标目录,将源文件分卷到哪个目录
 * @param zipFileName 压缩文件名
 * @return 分卷文件列表
 * @throws Exception
 */
public static List<File> splitVolumeCompressFiles(int sizeThreshold, List<File> sourceFiles, String destDirPath, String zipFileName) throws Exception {
    List<File> zipFiles = new ArrayList<>();
    if (Objects.isNull(sourceFiles) && sourceFiles.isEmpty()) {
        return zipFiles;
    }
    // 目录不存在则创建
    File dir = new File(destDirPath);
    if (!dir.exists()) {
        dir.mkdirs();
    }
    try (ZipFile zipFile = new ZipFile(destDirPath + File.separator + zipFileName + ".zip")) {
        ZipParameters parameters = new ZipParameters();
        parameters.setCompressionMethod(CompressionMethod.DEFLATE);
        parameters.setCompressionLevel(CompressionLevel.NORMAL);
        zipFile.createSplitZipFile(sourceFiles, parameters, true, sizeThreshold * 1024L * 1024L);
        List<File> splitZipFiles = zipFile.getSplitZipFiles();
        if (Objects.nonNull(splitZipFiles) && !splitZipFiles.isEmpty()) {
            zipFiles = splitZipFiles;
        }
    }
    return zipFiles;
}

View Code

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_List_11

  调用这个方法

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_源文件_12

D:/volume/

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_源文件_13

mysql-8.0.25-winx64.zip (其他的不用管),即可得到最初的源文件: mysql-8.0.25-winx64.zip

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_源文件_14

邮件大附件

  相信此时,大家应该知道怎么处理了吧

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_java_15

  先进行分卷压缩,然后一封邮件发送一个附件,以多封邮件的方式将最初的源文件发送出去

  收到人收到附件后,将全部附件下载到同个目录下,然后进行解压即可得到最初的源文件

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_源文件_16

分卷压缩 与 发送附件

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_java_17

public static void main(String[] args) throws Exception {
    List<File> attachments = new ArrayList<>();
    attachments.add(new File("D:/下载/mysql-8.0.25-winx64.zip"));
    // 源文件(可以是多个)进行分卷压缩
    List<File> fileList = splitVolumeCompressFiles(20, attachments, "D:/volume", "mysql-8.0.25-winx64");
    // 多封邮件进行发送,一封一个附件
    for (int i=0; i<fileList.size(); i++) {
        // 可以异步发送
        sendMailNick("邮件正文", MAIL_TO, Arrays.asList(fileList.get(i)), "大文件,分卷压缩(" + (i+1) + "/" + fileList.size() + ")");
    }
}

/**
 * 分卷压缩
 * @param sizeThreshold 分卷阈值,即多大进行一次分卷,单位:M
 * @param sourceFiles 源文件列表
 * @param destDirPath 目标目录,将源文件分卷到哪个目录
 * @param zipFileName 压缩文件名
 * @return 分卷文件列表
 * @throws Exception
 */
public static List<File> splitVolumeCompressFiles(int sizeThreshold, List<File> sourceFiles, String destDirPath, String zipFileName) throws Exception {
    List<File> zipFiles = new ArrayList<>();
    if (Objects.isNull(sourceFiles) && sourceFiles.isEmpty()) {
        return zipFiles;
    }
    // 目录不存在则创建
    File dir = new File(destDirPath);
    if (!dir.exists()) {
        dir.mkdirs();
    }
    try (ZipFile zipFile = new ZipFile(destDirPath + File.separator + zipFileName + ".zip")) {
        ZipParameters parameters = new ZipParameters();
        parameters.setCompressionMethod(CompressionMethod.DEFLATE);
        parameters.setCompressionLevel(CompressionLevel.NORMAL);
        zipFile.createSplitZipFile(sourceFiles, parameters, true, sizeThreshold * 1024L * 1024L);
        List<File> splitZipFiles = zipFile.getSplitZipFiles();
        if (Objects.nonNull(splitZipFiles) && !splitZipFiles.isEmpty()) {
            zipFiles = splitZipFiles;
        }
    }
    return zipFiles;
}

/**
 * 发送邮件,带附件
 * @param content 正文
 * @param to 收件人
 * @param attachments 附件列表
 * @param title 邮件标题
 * @throws Exception
 */
public static void sendMailNick(String content, String to, List<File> attachments, String title) throws Exception {
    //设置邮件会话参数
    Properties props = new Properties();
    //邮箱的发送服务器地址
    props.setProperty("mail.smtp.host", MAIL_HOST);
    props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.setProperty("mail.smtp.socketFactory.fallback", "false");
    props.put("mail.smtp.ssl.enable", "true");

    //邮箱发送服务器端口,这里设置为465端口
    props.setProperty("mail.smtp.port", "465");
    props.setProperty("mail.smtp.socketFactory.port", "465");
    props.put("mail.smtp.auth", "true");

    //获取到邮箱会话,利用匿名内部类的方式,将发送者邮箱用户名和密码授权给jvm
    Session session = Session.getDefaultInstance(props, new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(MAIL_USER_NAME, MAIL_AUTH_CODE);
        }
    });
    // 开启调试
    session.setDebug(true);
    // 创建传输对象
    Transport trans = session.getTransport();
    trans.connect(MAIL_HOST, "青石路", MAIL_AUTH_CODE);
    // 创建邮件消息对象
    Message message = new MimeMessage(session);
    // 设置发件人信息(昵称:青石路)
    message.setFrom(new InternetAddress(MAIL_USER_NAME, "青石路", "UTF-8"));
    // 设置收件人信息
    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
    // 设置正文
    Multipart multipart = new MimeMultipart();
    BodyPart contentPart = new MimeBodyPart();
    contentPart.setContent(content, "text/html;charset=UTF-8");
    multipart.addBodyPart(contentPart);
    // 添加附件
    if (Objects.nonNull(attachments) && !attachments.isEmpty()) {
        for (File e : attachments) {
            BodyPart attachmentBodyPart = new MimeBodyPart();
            DataSource source = new FileDataSource(e);
            attachmentBodyPart.setDataHandler(new DataHandler(source));
            //MimeUtility.encodeWord可以避免文件名乱码
            attachmentBodyPart.setFileName(MimeUtility.encodeWord(e.getName()));
            multipart.addBodyPart(attachmentBodyPart);
        }
    }
    // 设置邮件主题和内容信息
    message.setSubject(title);
    message.setContent(multipart);
    // 发送邮件
    trans.sendMessage(message, message.getAllRecipients());
    // 关闭传输
    trans.close();
}

View Code

  邮件发送完成后,收件人按如下方式处理即可得到源文件

邮件发送,附件太大怎么办 → 那就用分卷压缩吧_java_18

总结

  1、邮件附件不仅有大小限制,还有个数限制

  2、文件皆可分卷,压缩文件与非压缩文件都可分卷



标签:分卷压缩,java,props,smtp,new,附件,mail,邮件
From: https://blog.51cto.com/u_13423706/8416086

相关文章

  • 微附件小程序官网
    在数字化信息传播的今天,微信公众号已经成为企业和个人沟通与分享的重要渠道。然而,当我们需要在文章中附上文件或文档时,如何能够让读者更加便捷地查阅成了一大挑战。“微附件”小程序官网应运而生,提供了一个简便的解决方案。下面,我们一起探索如何通过“微附件”官网生成文件路径,并将......
  • python 发邮件,简单版本
    importsmtplibfromemail.mime.textimportMIMETextfromemail.mime.multipartimportMIMEMultipartclassTemplate(object):html="""<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8......
  • 邮件营销还适合外贸行业吗
    随着全球化的不断推进,外贸行业已成为推动经济增长的重要力量。外贸行业竞争激烈,如何保持与客户的紧密联系,提升品牌知名度,以及有效地推广自己产品成为了外贸企业急需解决的问题。现如今营销手段增多,而EDM邮件营销作为一种低成本、高效率的营销手段,仍然备受外贸企业的关注。U-Mail邮......
  • 跨境电商邮件营销怎么做?新品邮件发送技巧
    跨境电商在竞争激烈的市场中,邮件营销成为吸引客户眼球、推动销售的有效手段。在这个领域,如何巧妙运用邮件营销策略,特别是在新品上市时,是一个需要精心考虑的问题。1.独立站邮件营销:构建独特品牌形象独立站邮件营销是跨境电商推广的一项关键策略。通过巧妙设计的邮件,不仅可以传达产......
  • 独立站邮件营销方法?蜂邮EDM邮件发信效果?
    在当今数字化时代,独立站邮件营销成为企业推广的一项重要策略。蜂邮EDM邮件发信作为其中一种工具,其效果备受关注。本文将深入探讨独立站邮件营销的方法,并评估蜂邮EDM邮件发信的实际效果。1.初识独立站邮件营销独立站邮件营销是一种通过自建邮件系统,针对特定目标受众进行推广的策略......
  • 独立站邮件营销方法?蜂邮EDM邮件发信效果?
    在当今数字化时代,独立站邮件营销成为企业推广的一项重要策略。蜂邮EDM邮件发信作为其中一种工具,其效果备受关注。本文将深入探讨独立站邮件营销的方法,并评估蜂邮EDM邮件发信的实际效果。1.初识独立站邮件营销独立站邮件营销是一种通过自建邮件系统,针对特定目标受众进行推广的策略......
  • 微附件7怎么用
    在当今的信息时代,文件的高效传输和管理变得尤为重要。微信,作为全球领先的通讯工具,不断推陈出新,致力于提供更加便捷和全面的用户体验。其中,最新推出的“微附件7”小程序无疑是一个重要的里程碑。接下来,我们将详细解析微附件7的使用流程与独特特性。微附件7功能简介:微附件7是的一款......
  • Spring Boot如何实现邮件发送附件?一文带你搞定它!
    ......
  • 硝烟后的茶歇 | 中睿天下谈攻防演练之邮件攻击溯源实战分享
    近日,由中国信息协会信息安全专业委员会、深圳市CIO协会、PCSA安全能力者联盟主办的《硝烟后的茶歇·广东站》主题故事会在深圳成功召开。活动已连续举办四年四期,共性智慧逐步形成《年度红蓝攻防系列全景图》、《三化六防“挂图作战”》等共性研究重要成果。此次会议邀请到了政府、......
  • 盘点U-Mail邮件系统安全设计
    在当今社会,电子邮件已经成企业沟通和信息传递重要的手段之一,是企业办公中不可或缺的一部分。但是由于企业邮件服务器端口对外开放、企业邮件安全管理能力不足、邮件内容敏感性高等特点,电子邮件也成为了网络攻击者进行网络钓鱼、恶意软件传播和勒索攻击的主要对象。根据麦赛邮件安全......