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

Javamail/email commons:空消息给出奇怪的错误,java,jakarta-mail,apache-commons-email,Java,Jakarta Mail,Apache Commons Email,我正试图通过GMail(实际上是谷歌应用程序)发送电子邮件。这对正常消息非常有效,但我当然必须测试极端情况 BodyPart body = new MimeBodyPart(); body.setText(("Message Body")); multipart.addBodyPart(body); // ** here message.setContent(multipart); Transport.send(message); 现在我正在尝试发送一条没有正文的消息,我收到一条奇怪的错误

我正试图通过GMail(实际上是谷歌应用程序)发送电子邮件。这对正常消息非常有效,但我当然必须测试极端情况

BodyPart body = new MimeBodyPart();
body.setText(("Message Body"));
multipart.addBodyPart(body);   // ** here
message.setContent(multipart);
Transport.send(message);
现在我正在尝试发送一条没有正文的消息,我收到一条奇怪的错误消息。当我想消除代码中的错误时,我想知道我是做错了什么,还是我正在使用的库中有错误

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();
BodyPart body = new MimeBodyPart();
body.setText(("Message Body"));
multipart.addBodyPart(body);   // ** here
message.setContent(multipart);
Transport.send(message);
此代码适用于“普通”电子邮件:具有有效的正文、主题、收件人等

BodyPart body = new MimeBodyPart();
body.setText(("Message Body"));
multipart.addBodyPart(body);   // ** here
message.setContent(multipart);
Transport.send(message);
当数据库中的mailBody和mailHtmlBody都为NULL或为空时,我得到以下错误:

BodyPart body = new MimeBodyPart();
body.setText(("Message Body"));
multipart.addBodyPart(body);   // ** here
message.setContent(multipart);
Transport.send(message);
将电子邮件发送到以下服务器失败:smtp.gmail.com:25

BodyPart body = new MimeBodyPart();
body.setText(("Message Body"));
multipart.addBodyPart(body);   // ** here
message.setContent(multipart);
Transport.send(message);
完整错误日志(自己的日志格式)/堆栈跟踪:

[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
BodyPart body = new MimeBodyPart();
body.setText(("Message Body"));
multipart.addBodyPart(body);   // ** here
message.setContent(multipart);
Transport.send(message);
我现在有两个问题:

BodyPart body = new MimeBodyPart();
body.setText(("Message Body"));
multipart.addBodyPart(body);   // ** here
message.setContent(multipart);
Transport.send(message);
  • 是否有可能发送一封没有正文的电子邮件?允许吗
  • 为什么错误消息端口号是25而不是465

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

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

    尽管我找不到相关文档,但经验证明,在Apache Commons电子邮件HtmlEmail对象中不允许使用空的BodyPart。文本消息或html消息应设置为非空字符串

    BodyPart body = new MimeBodyPart();
    body.setText(("Message Body"));
    multipart.addBodyPart(body);   // ** here
    message.setContent(multipart);
    Transport.send(message);
    
    端口为25的错误消息是Apache Commons电子邮件代码中的一个错误,在打印smtp端口时未考虑SSL。为此,已在以下位置提交了错误报告:

    BodyPart body = new MimeBodyPart();
    body.setText(("Message Body"));
    multipart.addBodyPart(body);   // ** here
    message.setContent(multipart);
    Transport.send(message);
    
    是否有可能发送一封没有正文的电子邮件?是吗 允许吗

    BodyPart body = new MimeBodyPart();
    body.setText(("Message Body"));
    multipart.addBodyPart(body);   // ** here
    message.setContent(multipart);
    Transport.send(message);
    
    是的,RFC 5322特别允许电子邮件正文为空:

    BodyPart body = new MimeBodyPart();
    body.setText(("Message Body"));
    multipart.addBodyPart(body);   // ** here
    message.setContent(multipart);
    Transport.send(message);
    
    “消息由标题字段组成,可选择后跟消息 身体。”

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

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

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

    我遇到了完全相同的异常,但由于一个愚蠢的错误,我忘记了将消息正文添加到多部分消息中。这就是错误

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

    正如我所说,发送邮件与此代码完美结合,所以不是这样。这只是邮件正文为空的特殊情况。此外,我使用SSL而不是TLS。您是否尝试过将消息设置为空字符串是否有效?另外,这是完整的错误消息吗?没有stacktrace或嵌套异常?如果我将消息设置为空字符串,我将从Apache Commons电子邮件中获得另一个异常。见第131行,将stacktrace添加到原始帖子中。:)这有帮助吗?我现在可以回答我自己的帖子了;在commons中Email.java的第1240行,他们使用这个.getSmtpPort()作为异常消息。如果它涉及SSL连接思想,他们应该使用这个.getSslSmtpPort()。所以我要在Apache Commons上提交一份bug报告。谢谢你的指导。:)