7

Java サーバーからニュースレターを送信していますが、ハイパーリンクの 1 つがピリオドを欠いて到着し、役に立たなくなります。

Please print your <a href=3D"http://xxxxxxx.xxx.xx.edu=
au//newsletter2/3/InnovExpoInviteVIP.pdf"> VIP invitation</a> for future re=
ference and check the Innovation Expo website <a href=3D"http://xxxxxxx.xx=
xx.xx.edu.au/2008/"> xxxxxxx.xxxx.xx.edu.au</a> for updates.

上記の例では、最初のハイパーリンクで edu と au の間でピリオドが失われています。

メール本文が改行されており、折り返しがピリオドで行を分割しており、SMTP 電子メールで行をピリオドで開始することは違法であると判断しました。

https://www.rfc-editor.org/rfc/rfc2821#section-4.5.2

私の質問はこれです - ラッピングが期間に適していること、および/またはそもそも実行されないようにするには、どの設定を使用する必要がありますか?

更新:多くのテストとデバッグの後、コードに問題がないことが判明しました。クライアントの Linux サーバーは非常に古い Java バージョンで出荷されており、古いメール クラスはまだ lib フォルダーの 1 つにあり、優先的に選択されていました。私たちのもの。1.2 より前の JDK にはこのバグがあります。

4

8 に答える 8

5

SMTPの観点からは、ピリオドで行を開始できますが、代わりに2つのピリオドを送信する必要があります。使用しているSMTPクライアントがこれを行わない場合、説明した問題が発生する可能性があります。

問題が実際にどこにあるかを確認するために、IPスニファを試す価値があるかもしれません。その電子メールの送信には、少なくとも2つの別個のSMTPトランザクションが関係している可能性があります。

于 2008-09-23T08:10:21.147 に答える
4

HTML メールでも同様の問題がありました。不思議なピリオドが欠落しており、メッセージが奇妙に切り捨てられていたケースもありました。JavaMail は、どの行も 76 文字を超えないように (つまり、空白だけでなく) 行を折り返す quoted-printable エンコーディングを使用して HTML 電子メールを送信します。(これは、行末に「=」をソフト キャリッジ リターンとして使用するため、受信者は行を再構成できます。) これにより、2 倍にする必要があるピリオドで始まる行が簡単に作成されます。(これは「ドット スタッフィング」と呼ばれます) そうでない場合、ピリオドは受信 SMTP サーバーによって食べられます。さらに悪いことに、ピリオドが行の唯一の文字である場合、SMTP サーバーによってピリオドの末尾として解釈されます。メッセージ。

GNU JavaMail 1.1.2 実装 (別名 classpathx javamail) まで追跡しました。この実装の新しいバージョンはなく、4、5 年間更新されていません。ソースを見ると、ドット スタッフィングが部分的に実装されています。行のピリオドをケース自体で処理しようとしますが、そのケースでも機能しないバグがあります。

残念ながら、これは私たちのプラットフォーム (Centos 5) のデフォルトの実装だったので、RedHat のデフォルトでもあると思います。

Centos での修正は、Sun の (または、Oracle のと言うべきでしょうか?) JavaMail 実装 (私は 1.4.4 を使用しました) をインストールし、Centos の代替コマンドを使用してデフォルトの実装の代わりにインストールすることです。(代替手段を使用することで、Centos パッチをインストールしても GNU 実装に戻らないことが保証されます。)

于 2011-07-14T01:54:48.473 に答える
1

quoted-printable のおかげで、すべてのコンテンツが RFC2045 に適していることを確認してください。このようなメソッドで MimeUtility クラスを使用します。


    private String mimeEncode (String input)
    {
    ByteArrayOutputStream bOut = new ByteArrayOutputStream();
    OutputStream out;
    try
    {
        out = MimeUtility.encode( bOut, "quoted-printable" );
        out.write( input.getBytes( ) );
        out.flush( );
        out.close( );
        bOut.close( );
    } catch (MessagingException e)
    {
        log.error( "Encoding error occured:",e );
        return input;
    } catch (IOException e)
    {
        log.error( "Encoding error occured:",e );
        return input;
    }

    return bOut.toString( );
    }


于 2008-09-23T08:42:08.543 に答える
1

同様の問題が発生していますが、ASP.NET 2.0 を使用しています。アプリケーション ログによると、電子メールのリンクは正しい ' http://www.3rdmilclassrooms.com/ ' ですが、クライアントが電子メールを受信すると、リンクにピリオド ' http://www3rdmilclassrooms.com 'がありません。

メールが正しいリンクで送信されていることを証明するために、できる限りのことをしました。私の疑いでは、ハイパーリンクを変更しているのは電子メール クライアントまたはスパム フィルター ソフトウェアです。電子メール スパム フィルタリング ソフトウェアがそれを行う可能性はありますか?

于 2009-01-08T19:30:01.467 に答える
0

よくわかりませんが、メールがエンコードされているように見えます。0x3Dは16進文字61であり、これは等しい文字('=')です。

メールの送信に使用しているクラス/ライブラリは何ですか?エンコーディングに関する設定を確認してください。

于 2008-09-23T08:16:51.443 に答える
0

プログラムでyahooアカウントにメールを送信するときにも同様の問題が発生しました。彼らは非常に長い1行のテキストを取得し、HTMLメールに独自の改行を追加して、問題が発生しないと考えていましたが、もちろん問題は発生します。

秘訣は、そのような長い行を送信しようとしないことでした。HTMLメールは改行を気にしないため、URLがそのような期間に分割されないように、数ブロックごとに、または問題のある行の直前に独自のメールを追加する必要があります。

ASPVBをから変更する必要がありました

var html;
html = "Blah Blah Blah Blah ";
html = html & " More Text Here....";

var html;
html = "Blah Blah Blah Blah " & VbCrLf;
html = html & " More Text Here....";

そして、最後に処理されていた出力をクリーンアップするために必要なのはこれだけです。

于 2009-01-08T19:43:44.450 に答える
0

Mimeタイプを「text/html」に設定していますか?次のようなものが必要です。

BodyPart bp = new MimeBodyPart();
bp.setContent(message,"text/html");
于 2008-09-23T08:25:25.480 に答える
0

Greg が指摘したように、問題はドット スタッフィング (先頭のドットを 2 倍にする) を行わない SMTP クライアントにあります。

電子メールは quoted-printable でエンコードされているようです。base64 に切り替えると (現在の Java MIME 実装でできると思います)、問題が解決します。

于 2009-01-08T20:07:13.340 に答える