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

这篇具有很好参考价值的文章主要介绍了邮件发送,附件太大怎么办 → 那就用分卷压缩吧。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开心一刻

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

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

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

  女儿:你看你现在

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

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

  我:哈哈哈哈!

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

邮件发送

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

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

  发送简单正文

邮件发送,附件太大怎么办 → 那就用分卷压缩吧邮件发送,附件太大怎么办 → 那就用分卷压缩吧
/**
 * 发送简单正文,并显示昵称
 * @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

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

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

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

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

  发送附件

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

  实现也很简单

邮件发送,附件太大怎么办 → 那就用分卷压缩吧邮件发送,附件太大怎么办 → 那就用分卷压缩吧
/**
 * 发送邮件,带附件
 * @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

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

  相比 发送简单正文 ,只多了一丢丢代码

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

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

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

  附件过大

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

  例如我发送一个 200 多M的附件

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

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

邮件发送,附件太大怎么办 → 那就用分卷压缩吧邮件发送,附件太大怎么办 → 那就用分卷压缩吧
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

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

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

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

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

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

  我们觉得的不可能,不代表真的不可能,所以我们要多读书,拓展我们的知识面

分卷压缩

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

  借助第三方组件: zip4j 

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

  很容易实现分卷压缩

邮件发送,附件太大怎么办 → 那就用分卷压缩吧邮件发送,附件太大怎么办 → 那就用分卷压缩吧
/**
 * 分卷压缩
 * @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

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

  调用这个方法

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

  不出意外,在 D:/volume/ 目录下,得到如下文件

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

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

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

邮件大附件

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

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

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

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

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

  其实就是将 分卷压缩 与 发送附件 结合起来即可

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

邮件发送,附件太大怎么办 → 那就用分卷压缩吧邮件发送,附件太大怎么办 → 那就用分卷压缩吧
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

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

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

总结

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

  2、文件皆可分卷,压缩文件与非压缩文件都可分卷文章来源地址https://www.toymoban.com/news/detail-711965.html

到了这里,关于邮件发送,附件太大怎么办 → 那就用分卷压缩吧的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 电脑网络连接失败 网卡只有发送没有接收该怎么办?

    在日常生活中,网络故障问题很多。但是有时出现网卡明明已经显示已连接,但是就是上不了网。这个问题困扰不少人。现在希望这篇文章能解开你的困扰。 1、首先要确定你的网络是否正常连接 包括你路由器连接。因为也有些用户经常连接路由器有误。进来网线先到Modem,

    2024年02月08日
    浏览(52)
  • 无缓存定时发送带附件(表格)等邮件

    1.导入发送邮件的包 2.配置yml 3.添加定时任务 4.实现

    2024年02月11日
    浏览(46)
  • Springboot 使用JavaMailSender发送邮件 + Excel附件

    目录 1.生成Excel表格 1.依赖设置 2.代码: 2.邮件发送 1.邮件发送功能实现-带附件  2.踩过的坑 1.附件名中文乱码问题 3.参考文章: 需求描述:项目审批完毕后,需要发送邮件通知相关人员,并且要附带数据库表生成的Excel表格,这就要求不光是邮件发送功能,还要临时生成E

    2024年02月07日
    浏览(45)
  • Spring Boot邮件发送教程:步步为营,轻松实现图片附件邮件!

      通过Spring Boot构建一个功能强大的邮件发送应用程序,重点是实现发送包含图片附件的邮件。我将逐步介绍添加必要的依赖、创建邮件服务类和控制器的步骤,并提供了具体的示例源代码。跟随这个简单而清晰的教程,您将能够轻松地集成邮件发送功能到您的Spring Boot应用中

    2024年02月04日
    浏览(52)
  • springboot 发送邮件,以及邮件工具类 并且解决spring-boot-starter-mail 发送邮件附件乱码或者文件错乱

    1、设置系统值 System.setProperty(“mail.mime.splitlongparameters”, “false”); 2、 在创建对象的时候定义编码格式(utf-8): MimeMessageHelper helper = new MimeMessageHelper(mes, true, “utf-8”); 3、 其次,在添加附件的时候,附件名是需要定义编码的 helper.addAttachment(MimeUtility.encodeWord(附件名,“utf-8”

    2024年02月15日
    浏览(68)
  • 一篇文章带你了解Java发送邮件:使用JavaMail API发送电子邮件的注意事项、发送附件等

    作者:Stevedash 发表于:2023年8月13日 15点48分 来源:Java 发送邮件 | 菜鸟教程 (runoob.com) 电子邮件在现代通信中扮演着至关重要的角色,而在Java编程中,我们可以利用JavaMail API来方便地实现发送电子邮件的功能。本篇博客将向您介绍如何使用JavaMail API来发送电子邮件,以及一些

    2024年02月13日
    浏览(66)
  • c++实现smtp发送邮件,支持ssl的465端口发送,支持附件、一次发送多人、抄送等

    c++实现smtp发送邮件,支持ssl的465端口发送,支持附件、一次发送多人、抄送等。 这里只使用了openssl库(用来支持ssl的465端口),其他部分是原生c++,支持在win/linux运行。 网上很多都是原始的支持25端口,明文发送,这里介绍一下ssl思路 使用sockect编程和ssl,使用SMTP协议。 使

    2024年02月08日
    浏览(99)
  • 让自己开发的VBA应用能够批量发送邮件(可带多个附件)

    当我们开发了一个VBA应用,很多时候需要让它能够自动批量发送邮件。这时候,我们就需要使用到CDO了。CDO全称Collaboration Data Objects,即协作数据对象,是Office 软件不在产品安装的一部分。它是通过基于COM的API提供对Outlook兼容对象的访问的包。CDO有多个组件,其中Message组件

    2024年02月11日
    浏览(42)
  • 泛微OA获取流程附件地址,发送邮件或上传到第三方系统中

    在泛微的流程开发当中,有些流程的数据、附件要上传到其它平台,与其它平台相互集成对接, 一般是在写Action事件时,就会自动把数据及附件上传到其它平台,以下内容是经过正常使用获取流程附件的业务 示例:泛微OA中流程附件

    2024年02月15日
    浏览(94)
  • # Linux下用mailx发送邮件,邮件内容在用户端变成了以为.bin为扩展名的邮件附件的问题解决

    这种情况一般存在于将【某文件内容】作为【邮件内容】时发生,你指定的那个文件中包含了Linux终端控制字符,把这些控制字符删除即可恢复正常。 附件的文件名一般为.bin结尾,也可能是其他。 如果按这个原文发送邮件,则会变成以.bin结尾的邮件附件 删除文件中的控制字

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包