【问题标题】:How to use MimeMessageHelper to send email with attachment?如何使用 MimeMessageHelper 发送带附件的电子邮件?
【发布时间】:2021-02-08 18:21:39
【问题描述】:

我无法正确发送带有附件的电子邮件。我正在使用 Gradle 和 Spring 5。一切都设置正确,因为我已经在发送带有文本和 html 的电子邮件。一段时间后,我向客户发送的文本要求超出了电子邮件的限制,因此我需要将纯文本提取到 CSV 文件中,并将其作为附件发送到电子邮件中。 看起来我只收到了文件的一部分,而不是完整的文件?

代码:

for(Entry<String, List<LabDipRequest>> entry : userNotificationMap.entrySet())
    {                           
        javaMailSender.send(mimeMessage -> {
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
            messageHelper.setFrom(fromEmail);
            messageHelper.setTo(entry.getKey());
            messageHelper.setSubject("Exception Report");
            String val = ldReport.generateLabDipExceptionReport(entry.getValue());
            messageHelper.setText(val);
            FileSystemResource file = new FileSystemResource(new File("ExceptionReport.csv"));
            messageHelper.addAttachment("ExceptionReport.csv", file);
        });
    }

电子邮件正文无法正确发送。 这是我在电子邮件收件箱中收到的原始消息:

主题:报告
MIME 版本:1.0
内容类型: 多部分/混合;
边界="----=_Part_0_927559004.1603720386263"

如果提供任何额外的说明,我还会输出一个日志:

DEBUG: JavaMail version 1.6.2
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 25, isSSL false
220 smtp.gmail.com <hidden> - gsmtp
DEBUG SMTP: connected to host "smtp.gmail.com", port: 25
EHLO mongo.<hidden>.com
250-smtp.gmail.com at your service, [<hidden>]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
STARTTLS
220 2.0.0 Ready to start TLS
EHLO mongo.<hidden>.com
250-smtp.gmail.com at your service, [<hidden>]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN <hidden>
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "<hidden>"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
DEBUG SMTP: protocolConnect login, host=smtp.gmail.com, user=dummyaccount@gmail.com, password=<non-null>
DEBUG SMTP: Attempt to authenticate using mechanisms: <hidden>
DEBUG SMTP: Using mechanism LOGIN
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<dummyaccount@gmail.com>
250 2.1.0 OK <hidden>.33 - gsmtp
RCPT TO:<dummyaccount@gmail.com>
250 2.1.5 OK <hidden>.33 - gsmtp
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   dummyaccount@gmail.com
DATA
354  Go ahead <hidden>.33 - gsmtp
Date: Mon, 26 Oct 2020 10:38:17 -0400 (EDT)
From: dummyaccount@gmail.com
To: dummyaccount@gmail.com
Message-ID: <<hidden>@mongo.<hidden>.com>
Subject: Report
MIME-Version: 1.0
Content-Type: multipart/mixed;
        boundary="----=_Part_0_190448734.1603723096935"

.
250 2.0.0 OK  1603723099 <hidden>.33 - gsmtp
DEBUG SMTP: message successfully delivered to mail server
QUIT
221 2.0.0 closing connection <hidden>.33 - gsmtp

【问题讨论】:

  • 不要在message上设置东西,通过你构建的助手设置它们。还要为文件名使用正确的名称(带扩展名)。
  • 如果您在消息上设置文本,您将发送纯文本消息并丢失附件,因为这不是多部分的。使用助手时,它保持多部分,并将相应地发送消息。我不知道您添加了什么,因为它完全不可读(不要将其他信息添加为 cmets,而是添加为您问题中的正确代码块)。正如我还提到的,您应该设置一个带有扩展名的正确文件名,否则它将无法正确检测要使用的多部分的类型。
  • @M.Deinum 对不起,我知道我应该更新问题并更正文件扩展名,但问题仍然存在。在我更新了文件扩展名并使用了帮助程序后,我更新了我的问题并添加了我收到的电子邮件结果。
  • 文件是否可读,因为您的消息中应该有 2 个部分,显然只有 1 个。尝试将 File 添加为附件而不是 FileSystemResource
  • @M.Deinum 是的。我添加了检查,如果文件可读,请将其添加为附件,并且文件可读并成功添加为附件。在这一点上,我尝试了所有替代方法,但仍然一遍又一遍地收到相同的电子邮件,不知道为什么附件不在电子邮件中。我在问题中更新了上面的代码。

标签: java spring spring-boot mime-types mime


【解决方案1】:

我几乎可以肯定问题出在错误的文件路径上。仅将 FileSystemResource 与 mime 消息一起使用。试试这个代码:

@SneakyThrows
@Async
public void sendEmailWithAttachment(String pathToAttachment) {
    MimeMessage message = emailSender.createMimeMessage();

    MimeMessageHelper helper = new MimeMessageHelper(message, true);

    helper.setSubject(yourSubject);
    helper.setText(yourContent);
    helper.setTo(yourTo);
    helper.setFrom(yourFrom);

    FileSystemResource file = new FileSystemResource(new File(pathToAttachment));
    helper.addAttachment("LabDip", file);

    emailSender.send(message);
}

【讨论】:

  • 问题依然存在。尝试使用 FileSystemResource、仅文件、StreamInput... 无论我如何阅读文件,电子邮件正文始终是 PART_0 等。
猜你喜欢
  • 2012-06-07
  • 2011-01-02
  • 2015-08-28
  • 2016-10-23
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多