Javamail / email commons:空消息给出了奇怪的错误

时间:2012-12-19 11:24:18

标签: java javamail apache-commons-email

我正在尝试通过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

完整错误日志(自己的日志格式)/ stacktrace:

[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

我现在有两个问题:

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

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

  

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

是的,RFC 5322明确允许电子邮件消息为空:

  

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

这是BNF:

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

http://tools.ietf.org/html/rfc5322#section-3.5

答案 2 :(得分:3)

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

端口25的错误消息是Apache Commons Email的代码中的错误,该代码在打印出smtp端口时不考虑SSL。为此,已在https://issues.apache.org/jira/browse/EMAIL-123

提交了错误报告

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

要使用Gmail发送电子邮件,请认为您还应启用传输层安全性。

currentMessage.setTLS(true);