- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
昨晚,老婆辅导女儿写作业 。
有一道形容妈妈的题,女儿写下了:我妈妈像一个暴躁的老虎 。
老婆拿起题册轻轻敲了下女儿,生气到:有这么形容你妈的吗 。
女儿:你看你现在 。
老婆:我有那么暴躁吗,你就不能说我妈妈像一个公主,温柔大方漂亮?
女儿:题目让我造句,没让我造谣! 。
我:哈哈哈哈! 。
基于 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(); }
需要注意的是,不同的邮箱的发件箱的端口会有不同,另外发件箱也可能是授权码而不是发件箱登陆密码,需要大家结合具体的邮箱服务器来设置 。
不出意外的话,邮件发送成功后,收件箱会收到一封类似如下的邮件 。
很多时候,我们发送邮件都会带附件 。
实现也很简单 。
/** * 发送邮件,带附件 * @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(); }
相比 发送简单正文 ,只多了一丢丢代码 。
不出意外的话,邮件发送成功后,收件箱会收到一封类似如下的邮件 。
但是各大电子邮箱对附件的大小都是由限制的,具体限制大小是多少,需要去看各大电子邮箱的官方说明 。
例如我发送一个 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)
碰到这种大文件,难道邮件就没法发送了吗?
针对单个的大文件,作为一个附件确实发送不了 。
如果将单个文件拆分成多个文件,再以多封邮件来发送,是不是可行了?
此时大家可能会有疑问:非压缩文件可以按内容进行手动拆分,压缩文件怎么拆,特别是安装文件! 。
我们觉得的不可能,不代表真的不可能, 所以我们要多读书,拓展我们的知识面 ! 。
关于概念,不做介绍,大家自行去搜索,重点给大家演示实现 。
借助第三方组件: 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; }
调用这个方法 。
不出意外,在 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(); }
邮件发送完成后,收件人按如下方式处理即可得到源文件 。
1、邮件附件不仅有大小限制,还有个数限制 。
2、文件皆可分卷,压缩文件与非压缩文件都可分卷 。
最后此篇关于邮件发送,附件太大怎么办→那就用分卷压缩吧的文章就讲到这里了,如果你想了解更多关于邮件发送,附件太大怎么办→那就用分卷压缩吧的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
您好,我在我的项目中使用 Nuxt JS,我注意到我的 js 文件变得相当大 我的问题是如何缩小或拆分超过 1mb 的 vendor 或 js 文件 我还看到 font-awesome 也占用了很多空
github 只是告诉我,而不是提交差异——关于我的一个提交—— Sorry, this diff is taking too long to generate. It may be too larg
这个非常简单的绘图命令创建了一个 11x11 像素的跟踪红色矩形: _sp.graphics.lineStyle( 1, 0xFF0000, 1, true, LineScaleMode.NORMAL
我正在尝试创建一个 Mac 应用程序。但是在我使用 Interface Builder 插入组合框并运行应用程序后,我收到以下消息: This application is trying to dra
我通过 url 传递以下数据: '; echo 'Download PDF'; echo ''; ?> 这里$result包含数组形式的 RSS 提要数据。我正在使用 urlencode(
我正在尝试通过 JavaScript 从某人的网络摄像头拍摄快照。该代码可以工作,只是生成的图像对我来说被拉伸(stretch)太多而难以阅读。 我搞乱了:ctx.drawImage(video, 0
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 3年前关闭。 Improve this
我是 React 和 Webpack 代码分割的新手,所以我不确定这对于捆绑 block 来说是否合适。 我尝试根据路由 ( basically done the same thing as in t
我正在开发自己的电子书应用程序。我的书共有 15 章,因此我有一个包含 15 个元素的列表 - 每个元素都是一个包含所有章节文本的字符串。 我还有 15 个 .ogg 文件,是我花钱请配音人员录制的。
我正在部署一个应用程序,该应用程序具有大约 10 个库依赖项(我正在使用 cocoapods)和 appstore 上 30MB 的下载大小,但是当我归档产品以供 Appstore 上传时,xcarc
我正在开发一款全屏游戏,我正在尽最大努力确保它适合所有屏幕尺寸。这被证明是相当困难的,因为当我使用 pygame.FULLSCREEN 时,窗口比屏幕大得多。为了解决这个问题,我根据 python 将
我有一个项目,其中有一些UIbuttons,其中显示了不同的UIimages。通过用户交互,UIButtons 中可能存在任何 UIimages。该项目中有大约 1000 张图像。我已经初始化了一个名
我使用 Eclipse 中的 Window Builder 将 JTextField 添加到 JPanel 中,无论我尝试什么,文本字段都会显示如下: (来源:gyazo.com) 我尝试更改首选尺寸
我有一个查询,我正在选择一个大型数据集,并且由于连接表的一对多关系而花费了非常多的时间。我有三个表——简化后如下: 客户 | customers | CREATE TABLE `customers`
我在 Activity 中使用了一个 PopupWindow,除了 PopupWindow 中包含的元素的填充外,一切正常> - 它太大了 - 几乎占据了 PopupWindows 的大部分小空间。这
这个问题在这里已经有了答案: NSString intValue not working for retrieving phone number (2 个答案) 关闭 9 年前。
我对为什么我的图片大小不正确感到有点困惑。我将 44x44 大小的图像传递给默认行高为 44 像素的 UITableView,但我得到以下结果: 这不是我应该如何设置我的 UITableViewCel
我目前正在用 php 显示用户个人资料图片,如果他们单击它,就会转到他们自己的个人资料。图像显示正确并且链接有效,但链接的区域超出了图片并超过了附近的链接。我将如何减少 anchor 的面积?
这张图片太大了,我想让它适合窗口的大小:http://zgaming.comxa.com 但是我不明白怎么办,我也试过高度和宽度100% html CSS .bgimg { posi
减少矩阵大小的方法在哪里? (x2 阵列)例如,我只需要将数据 (0, 1, 2) 存储到数组中但元素最多可达 250 000。?有没有办法存储值,比如在字典中......? const int MA
我是一名优秀的程序员,十分优秀!