java - 在 Java 中发送带有附件的邮件,而不需要物理附件文件

标签 java email email-attachments

我在 Java 应用程序中使用 JavaMailSender 发送带有附件的电子邮件。附件是位于网站上的文件(例如 http://example.com/technical_guide.pdf )

第一个简单的实现如下:

  1. 从 URL 中获取文件的字节并创建输入流
  2. 从该输入流创建文件
  3. 将文件作为附件添加到邮件消息
  4. 发送消息

这可行,但步骤 2 产生了在文件系统上创建物理文件的不幸副作用。我发现我还可以传递数据源,而不是(以编程方式)删除它们。所以现在我有以下实现:

  1. 从文件 URL 创建 URLDataSource
  2. 将数据源作为邮件附件添加
  3. 发送消息

这也很有效,我不再看到 servlet 容器根目录下的文件。但是 - 我担心 javaMail 可能仍然会在幕后的某个地方生成一些文件,但我只是没有意识到这一点。

任何人都可以确认在此过程中没有创建任何物理文件(甚至在 users/appdata//catalina_home/windows/等隐藏文件夹下也没有创建) tmp/ 等),如果是这样 - 解释一下 java 如何能够在不需要任何文件的情况下发送邮件?是因为它需要的只是发送到邮件服务器的“字节”并且它不关心字节来自哪里?

最佳答案

您可以使用MimeMessageHelper.addAttachment(String attachmentFilename, InputStreamSource inputStreamSource)方法:

helper.addAttachment("attachement", yourStream);

基本上不需要物理文件。您还可以在内存中构建它并将其流式传输到助手。

关于java - 在 Java 中发送带有附件的邮件,而不需要物理附件文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39147188/

相关文章:

java - 避免在java邮件API中封装邮件

java - 使用 commons-email 生成的附件+Html 在某些电子邮件客户端中不显示

java - float 返回指数表示法

php - 替代 PHP 邮件(原因 : spam)?

paperclip - Ckeditor 3.7.1 + Paperclip(电子邮件中的绝对路径)

azure - 将 Azure Blob 存储 csv 文件作为附件发送给 Microsoft Azure 上的用户

java - 在定界字符串中查找第 n 个字符串

java - 在 Android Studio 中将代码从 Java 转换为 Kotlin

java - 通过电子邮件上传照片(类似Posterous)

email - 从自定义域发送到 gmail 的邮件将变成垃圾邮件