2

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. エラー メッセージのポート番号が 465 ではなく 25 になっているのはなぜですか?
4

5 に答える 5

5

MIME 仕様では、ボディ パーツのないマルチパート コンテンツは許可されていません。JavaMail API (バージョン 1.5 以降だと思います) では、システム プロパティmail.mime.multipart.allowemptyをに設定してtrue、これを回避できます。

于 2013-09-04T06:53:38.840 に答える
4

本文なしでメールを送信することは可能ですか? それは許されますか?

はい、RFC 5322 では、電子メール メッセージの本文を空にすることが明確に許可されています。

「メッセージはヘッダーフィールドで構成され、オプションでメッセージ本文が続きます。」

BNF は次のとおりです。

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

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

于 2013-04-10T17:23:49.680 に答える
3

そのためのドキュメントは見つかりませんが、経験的な証拠は、Apache CommonsEmailHtmlEmailオブジェクトでは空のボディパーツが許可されていないことを示しています。テキストメッセージまたはhtmlメッセージのいずれかを空でない文字列に設定する必要があります。

ポート25のエラーメッセージは、SMTPポートを出力するときにSSLを考慮しないApacheCommonsEmailのコードのエラーです。このため、バグレポートがhttps://issues.apache.org/jira/browse/EMAIL-123に提出されています。

于 2012-12-19T17:21:25.600 に答える
-1

Gmailでメールを送信するには、トランスポート層セキュリティも有効にする必要があると考えてください。

currentMessage.setTLS(true);
于 2012-12-19T11:29:54.177 に答える