【问题标题】:Javamail / email commons: empty message gives strange errorJavamail / email commons:空消息给出奇怪的错误
【发布时间】:2012-12-19 11:24:18
【问题描述】:

我正在尝试通过 GMail(实际上是 Google Apps)发送电子邮件。这对于普通消息非常有效,但我当然必须测试极端情况。

现在我正在尝试发送没有正文的消息,但收到一条奇怪的错误消息。由于我想消除代码中的错误,所以我想知道是我做错了什么还是我正在使用的库中存在错误。

HtmlEmail currentMessage = new HtmlEmail();
currentMessage.setSSL(true);
currentMessage.setSslSmtpPort(465);
currentMessage.setHostName("smtp.gmail.com");
currentMessage.setAuthentication("abc@gmail.com", "secret");

/** rs is a ResultSet from database **/

if(rs.getString("mailFrom") != null && !rs.getString("mailFrom").isEmpty())
    currentMessage.setFrom(rs.getString("mailFrom"));
else
    currentMessage.setFrom("abc@gmail.com");
currentMessage.setTo(this.convertRecipientStringToArray(rs.getString("mailTo")));
currentMessage.setCc(this.convertRecipientStringToArray(rs.getString("mailCC")));
currentMessage.setBcc(this.convertRecipientStringToArray(rs.getString("mailBC")));
currentMessage.setSubject(rs.getString("mailSubject"));
if(rs.getString("mailBody") != null && !rs.getString("mailBody").isEmpty())
    currentMessage.setTextMsg(rs.getString("mailBody"));
if(rs.getString("mailHtmlBody") != null && !rs.getString("mailHtmlBody").isEmpty())
    currentMessage.setHtmlMsg(rs.getString("mailHtmlBody"));
if(rs.getString("mailReplyTo") != null && !rs.getString("mailReplyTo").isEmpty())
    currentMessage.addReplyTo(rs.getString("mailReplyTo"));
else
    currentMessage.addReplyTo("def@gmail.com");
currentMessage.send();

此代码适用于“普通”电子邮件:具有有效的正文、主题、收件人等。

mailBody mailHtmlBody 在数据库中都是 NULL 或为空时,我收到以下错误:

将电子邮件发送到以下服务器失败:smtp.gmail.com:25

完整的错误日志(自己的日志格式)/堆栈跟踪:

[CRITICAL] 2012-12-19 17:08:00 [CET] - Exception occurred in function com.mypackage.mymailobject.outgoing_sendMails: Sending the email to the following server failed : smtp.gmail.com:25

Stack trace:
org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.gmail.com:25
    at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1242)
    at org.apache.commons.mail.Email.send(Email.java:1267)
    at com.mypackage.mymailobject.outgoing_sendMails(mymailobject.java:85)
    at com.mypackage.mymailobject.outgoing_do(mymailobject.java:69)
    at com.mypackage.Mailer.main(Mailer.java:132)
Caused by: javax.mail.MessagingException: IOException while sending message;
  nested exception is:
    java.io.IOException: javax.mail.MessagingException: Empty multipart: multipart/mixed; 
    boundary="----=_Part_0_916488860.1355933279096"
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1141)
    at javax.mail.Transport.send0(Transport.java:195)
    at javax.mail.Transport.send(Transport.java:124)
    at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1232)
    ... 4 more
Caused by: java.io.IOException: javax.mail.MessagingException: Empty multipart: multipart/mixed; 
    boundary="----=_Part_0_916488860.1355933279096"
    at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:105)
    at javax.activation.ObjectDataContentHandler.writeTo(Unknown Source)
    at javax.activation.DataHandler.writeTo(Unknown Source)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1476)
    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1772)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1099)
    ... 7 more

我现在有 2 个问题:

  1. 应该可以发送没有正文的电子邮件吗?允许吗?
  2. 为什么错误消息的端口号是 25 而不是 465?

【问题讨论】:

  • 您是否尝试过将消息设置为空字符串是否有效?另外,这是完整的错误消息,没有堆栈跟踪或嵌套异常吗?
  • 如果我将消息设置为空字符串,我会从 Apache Commons 电子邮件中收到另一个异常。请参阅第 131 行 commons.apache.org/email/xref/org/apache/commons/mail/…
  • 将堆栈跟踪添加到原始帖子。 :) 这有帮助吗?
  • 我现在可以回答我自己的帖子了;在 Commons 中 Email.java 的第 1240 行,他们使用 this.getSmtpPort() 获取异常消息。如果它涉及 SSL 连接的想法,他们应该使用 this.getSslSmtpPort()。因此,我将在 Apache Commons 提交错误报告。感谢您的指导。 :)

标签: java jakarta-mail apache-commons-email


【解决方案1】:

MIME 规范不允许没有正文部分的多部分内容。 JavaMail API(我认为是 1.5 版)允许您将系统属性 mail.mime.multipart.allowempty 设置为 true 以解决此问题。

【讨论】:

    【解决方案2】:

    应该可以发送没有正文的电子邮件吗?就是它 允许吗?

    是的,RFC 5322 特别允许电子邮件有一个空的正文:

    “消息由标头字段组成,可选地后跟消息 身体。”

    这是 BNF:

    body            =   (*(*998text CRLF) *998text) / obs-body
    

    https://www.rfc-editor.org/rfc/rfc5322#section-3.5

    【讨论】:

      【解决方案3】:

      虽然我找不到它的文档,但经验证明表明,Apache Commons Email HtmlEmail 对象中不允许使用空的正文部分。文本消息或 html 消息应设置为非空字符串。

      端口 25 的错误消息是 Apache Commons 电子邮件代码中的错误,在打印 smtp 端口时未考虑 SSL。为此,已将错误报告提交至https://issues.apache.org/jira/browse/EMAIL-123

      【讨论】:

        【解决方案4】:

        我遇到了完全相同的异常,但结果是一个愚蠢的错误,我忘记将消息正文添加到多部分消息中。因此错误!

        BodyPart body = new MimeBodyPart();
        body.setText(("Message Body"));
        multipart.addBodyPart(body);   // ** here
        message.setContent(multipart);
        Transport.send(message);
        

        【讨论】:

          【解决方案5】:

          要使用 gmail 发送电子邮件,您还应该启用传输层安全性。

          currentMessage.setTLS(true);
          

          【讨论】:

          • 正如我所说,发送邮件与此代码完美配合,所以不是这样。这只是邮件正文为空的特殊情况。此外,我使用的是 SSL 而不是 TLS。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-07
          • 2019-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多