发送邮件,附件内容在单独的文件存储服务器上。找了些资料。由于种种原因,代码不能展示出来,参考了https://blog.csdn.net/qq_26797239/article/details/84138992,思路是一样的,

主要用到的是

URL url = new URL(attachmentUrl);
//attachmentUrl 为文件在服务器上的存储地址,如 http://ip:port/file/filepath/test.txt
DataSource dataSource=new URLDataSource(url);
part.setDataHandler(new DataHandler(dataSource));

这样就可以把文件服务器上的文件作为附件随邮件发送了。

具体使用URL作为附件的速度如何,我没有做测试,作者说比纯粹的文件方式快。但是我在测试服务器上好像也是挺慢的。

主要因为作为附件的文件存储在文件服务器上,所以只能采用URL的方式。

以下是原作者的文字。

网上的很多javamail发送邮件,在将附件添加到邮件体时,都是用的File文件的形式,但是经过实践,我发现用这种方式去将附件保存到邮件体中,对于我们这种先将附件存储在OOS上,然后再从OSS上取下附件,速度很慢;找了很多资料,终于找到了以url的形式将附件添加到邮件体中

import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.URLDataSource;
import javax.mail.Flags;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;import com.xhl.leads.leadsmail.sendmail.entity.MailAttachment;public class SendMailUtil {public static void sendMail() throws Exception {int draft = 0;//默认不是草稿int priority = 3;//默认是普通邮件  优先级(1:紧急 3:普通 5:低)int receiptFlag = 0;//是否需要回执  默认是0,不需要回执String host = "smtp.163.com";Properties props = new Properties();props.setProperty("mail.transport.protocol", "smtp");// "smtp"props.setProperty("mail.smtp.host", host);// smtp.qq.comprops.setProperty("mail.smtp.port", "465");// 465props.setProperty("mail.smtp.auth", "true");// "true"
//      props.setProperty("mail.debug", "true");// "true"  注释掉后,控制台将不会再打印发送邮件主题内容的日志props.setProperty("mail.smtp.socketFactory.class",     "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.smtp.socketFactory.fallback", "false"); System.setProperty("mail.mime.splitlongparameters", "false");//设置了附件名过长问题,从而导致附件名显示带bin的错误,造成附件异常Session session = Session.getDefaultInstance(props);String from = "****@163.com";//发件人邮箱String passWord = "*****";String content = "您好:邮件!!!";Message message = new MimeMessage(session);message.setSentDate(new Date());// 设置发件人地址message.setFrom(new InternetAddress(from));// 设置主题message.setSubject("这是一封邮件");// 设置收件人message.addRecipients(Message.RecipientType.TO, InternetAddress.parse(MimeUtility.encodeText("*****@qq.com")));// 设置抄送人message.addRecipients(Message.RecipientType.CC, InternetAddress.parse(MimeUtility.encodeText("")));//选填// 设置密送人message.addRecipients(Message.RecipientType.BCC, InternetAddress.parse(MimeUtility.encodeText("")));//选填if (draft == 1) { // 如果是草稿message.setFlag(Flags.Flag.DRAFT, true);}// 设置优先级(1:紧急 3:普通 5:低)if (priority == 1)message.setHeader("X-Priority", "1");// 如果receiptFlag=1 代表需要回执if (receiptFlag == 1)message.setHeader("Disposition-Notification-To", from);// 设置邮件内容Multipart multipart = new MimeMultipart();MimeBodyPart txtPart = new MimeBodyPart();txtPart.setContent(content, "text/html;charset=utf-8");multipart.addBodyPart(txtPart);List<MailAttachment> mailAttachmentList = new ArrayList<MailAttachment>(); //获取当前邮件附件集合String attachmentUrl = "";String fileName = "";if (mailAttachmentList != null && mailAttachmentList.size() > 0) {for (MailAttachment attachment : mailAttachmentList) {attachmentUrl = attachment.getFilePath();fileName = attachment.getFileName();MimeBodyPart part = new MimeBodyPart();URL url = new URL(attachmentUrl);DataSource dataSource=new URLDataSource(url);part.setDataHandler(new DataHandler(dataSource));part.setFileName(MimeUtility.encodeText(fileName));multipart.addBodyPart(part);}}message.setContent(multipart);message.setFlag(Flags.Flag.RECENT, true);message.saveChanges();if (draft == 0) {Transport transport = session.getTransport("smtp");transport.connect(host, from, passWord);transport.sendMessage(message, message.getAllRecipients());transport.close();}}public static void main(String[] args) {try {sendMail();} catch (Exception e) {e.printStackTrace();}}
}

附件对象:

import lombok.Data;@Data
public class MailAttachment {private int id;private String filePath;//附件在文件服务器上的路径 http://ip:port/file/filepath/test.txtprivate String fileName;//附件的名字private String fileSize;//附件的大小private int fileOrder;//附件的顺序private String fileType;//附件类型
}

网上的很多javamail发送邮件,在将附件添加到邮件体时,都是用的File文件的形式,但是经过实践,我发现用这种方式去将附件保存到邮件体中,对于我们这种先将附件存储在OOS上,然后再从OSS上取下附件,速度很慢;找了很多资料,终于找到了以url的形式将附件添加到邮件体中

1)网上最常用的保存附件到邮件体中的方法:以File的方式

FileDataSource fds = new FileDataSource(file); // 得到数据源
part.setDataHandler(new DataHandler(fds)); // 得到附件本身并至入BodyPart  将附件以文件的形式添加到javamail中

利用这种方法,我先将存储到文件服务器上的文件得到,然后在本地生成临时文件,将文件添加到邮件体中,待邮件发送成功后,将临时文件在删除,我发现速度很慢,尤其是附件好几兆的时候,发一封邮件都得用时六七分钟;

2)第二种保存附件到邮件体中的方法:以流的方式

DataSource dataSource= new ByteArrayDataSource(inputStream,"application/octet-stream");//将附件改为以流的形式添加到javamail中
part.setDataHandler(new DataHandler(dataSource));

针对1)的现象,我想是不是我可以不生成临时文件,而只是把附件从OSS上拿到这个文件的流,然后将流保存到邮件体中,发现这种方法会减少时间,但是也没有减少很多

3)第三种保存附件到邮件体中的方法:以url的方式-----最佳方案

URL url = new URL(attachmentUrl);
DataSource dataSource=new URLDataSource(url);
part.setDataHandler(new DataHandler(dataSource));

使用3)的方法,添加附件到邮件体中,既未生成临时文件,而且速度还极快。

参考:https://blog.csdn.net/qq_26797239/article/details/84138992

发送邮件附件,通过url获取附件相关推荐

  1. springboot实战,实现发送邮件,gmail邮件,包括发送附件还有正文,以及注意覆盖问题

    springboot实现发送邮件,gmail邮件,包括发送附件还有正文,以及注意覆盖问题 复盘下前个把月前写的个关于邮件激活的接口,踩了些坑,就当记录下 前言 `需求:发送邮件审核,点击邮件链接之后, ...

  2. java读取邮箱附件_使用javamail获取附件内容

    我正在使用javamail来自动化一些电子邮件处理.使用javamail获取附件内容 我设法连接到pop3服务器并获取消息.其中一些包含附件.根据邮件标题,我可以"预测"我需要获取 ...

  3. python 实现SMTP发送邮件(四)-添加附件

    Python实现SMTP发送邮件(四)-添加附件 [Python]  纯文本查看  复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 ...

  4. php imap附件没有显示,php – imap – 获取附件

    如何从此电子邮件中获取附件? 这个电子邮件是从一个苹果电脑发送的,而且电子邮件的结构并不像任何其他的(惊喜).这里配置的部分比其他的更深一些. 该脚本与每个其他电子邮件一起使用,其中文件的部分位于第一 ...

  5. java 读取 邮件 附件,JavaMail 中对附件下载的处理

    在项目中使用 JavaMail 作为邮件核心库,但是一直遇到一个比较头疼的问题,当邮件中存在附件时,此封邮件加载速度很慢,最高时之后 80k/s. 通过 log 打印看出,当获取附件时,获取一段之后等 ...

  6. Python通过http、url获取数据

    import requests #通过url获取数据 def get_page(url):#requests.get 自带 json.loadpage = requests.get(url)page ...

  7. [爬虫]通过url获取连接地址中的数据

    1. 要想获取指定连接的数据,那么就得使用HtmlDocument对象,要想使用HtmlDocument对象就必需引用using HtmlAgilityPack; 2. 详细步骤如下:     步骤一 ...

  8. Android 利用url获取Bitmap图片

    编程中我们经常需要通过url获取网络上的图片.下面将相关代码做一下总结 注意:Android中这一操作必须在异步线程中进行 public class BitmapUtil {public static ...

  9. php获取url文件大小,PHP通过URL获取文件大小

    function getFileSize($url){ $url = parse_url($url); if($fp = @fsockopen($url['host'],empty($url['por ...

最新文章

  1. OpenCV学习系列教程第五篇:测试和提高代码的效率
  2. 《Cacti实战》——导读
  3. 区块链BaaS云服务(16)天德链TDBC“监管”
  4. 【Linux】Linux中at命令详解
  5. qq飞车登陆服务器无响应,qq飞车手游进不去怎么回事 为什么进不去游戏
  6. SAP 电商云 Spartacus UI Proxy Facade 的一个实际例子
  7. IDEA 启动、编译、clean、安装maven等、报错Process terminated
  8. Nginx设置禁止通过IP访问服务器
  9. 在字符串中找出第一个只出现一次的字符
  10. cck8graphpad作图_北京cck8数据作图「上海儒安生物科技供应」
  11. 计算机tpu定义,tpu材料
  12. GMP文件分类与编码管理规程
  13. Java IO与NIO的区别
  14. c51单片机矩阵键盘1602计算器_单片机做简易计算器源码(矩阵键盘输入+1602显示)...
  15. Python-数据类型考试题分析
  16. Python串口操作纸币器1
  17. 某百亿量化金融公司base北上杭深现招岗位:C++量化系统开发工程师年base40-80万+bonus工作职责1. 参与交易平台的设计、开发与测试,实现交易策略、风控等需求;2. 开发交易
  18. 林语堂 - 人生的乐趣
  19. 多光谱影像isodata非监督分类
  20. 从这份报告,我读出了数据从业者的局限与未来

热门文章

  1. ios 启动图一键生成工具_Mac生成APP图标和启动图的脚本
  2. 浏览器复制的网址粘贴到文档是超链接
  3. opencv4 java 验证码噪点 8邻域降噪
  4. android 动态人脸识别码,Android开发中人脸识别(静态)
  5. 摄影家的眼力(Eye of Photographer)-《美国纽约摄影学院摄影教材》
  6. 有什么软件可以视频转音频?这些转换软件值得你收藏
  7. 关于IBL中,HDR图片转换为cubeMap参数的含义
  8. EN 1433:车辆和行人区的排水沟-分类、设计、试验要求、标记和合格评定—CE认证
  9. 51单片机串口通讯 +Proteus仿真实验
  10. 六角星绘制-python实现