1

件名がすべてのブラウザーで正しく読み取れるように、電子メールのヘブライ語で書かれた「件名」フィールドを Base64 にエンコードしようとしています。現時点では、Windows-1255 のエンコーディングを使用していますが、これは一部のクライアントでは機能しますが、すべてのクライアントでは機能しないため、utf-8、base64 を使用したいと考えています。

この件に関する私の読書(しゃれは意図されていません)は、テキストが次の形式でなければならないことを示しています

=?<charset>?<encoding>?<encoded text>?=

例えば

=?windows-1255?Q?=E0=E1?=

UTF-8B エンコーディングでヘブライ語で送信された手紙からエンコードされた件名を取得し、この Web サイト www.webatic.com/run/convert/base64.php で正常にデコードしました。また、この Web サイトを使用して単純な文字をエンコードしましたが、返されるエンコードがDelphi アルゴリズムから取得した結果と同じではないことに気付きました。

だから - aleph (ord=224)、bet (ord=225) などの文字を正常にエンコードするアルゴリズムを探しています。ウェブサイトによると、2 つの文字 aleph と bet で構成される文字列はコード 15DXkq= を返します。 = ですが、基本的な Delphi アルゴリズムは Ue4 を返し、TIdEncoderQuotedPrintable コンポーネントは =E0=E1 (ISO-8859 エンコーディング) を返します。

編集(いくつかのコメントの後):

私は友人に、彼女の Mac コンピュータから電子メールを送ってくれるように頼んだ. 件名は 1 文字の aleph、ord 224 でした。エンコードされた件名は、次のように電子メールのヘッダーに表示されました。

=?UTF-8?B?15A=?=

これは 3 つの部分に分けることができます。「プレフィックス」(=?UTF-8?B?) は、base64 エンコーディングの UTF-8 が使用されていることを意味します。「ペイロード」(15A=)。私が引用した Web サイトでは、これを文字アレフとして正しく翻訳しています。およびサフィックス (?=)。

任意の文字列を変換するアルゴリズムが必要です。そのほとんどはヘブライ語 (したがって ord >= 224) で、base64/utf-8 に変換されます。正しい解決策は、引用された Web サイトで正しくデコードされるものです。

4

2 に答える 2

1

無駄な時間を過ごして申し訳ありません。今日もこの件について数時間を費やしたところ、使用していた base64 コードに大きなバグがあることがわかりました。

base64 でエンコードされた UTF-8 の件名行を送信するために必要な手順は次のとおりです。

  1. AnsiToUTF8 関数を使用して「通常の」テキスト (ローカル ANSI コード ページ) を UTF-8 に変換します。
  2. これを base64 にエンコードします
  3. プレフィックス「=?UTF-8?B?」、ステージ 2 の結果、サフィックス「=?=」を含む文字列を作成します。
  4. 送信!

電子メールを作成して送信するための完全なコードは次のとおりです (明らかに簡略化されています)。

 with IdSMTP1 do
  begin
   host:= ....;
   username:= ....;
   password:= ....;
  end;

 with email do
  begin
   From.Address:= ....;
   Recipients.EMailAddresses:= ....;
   cclist.add.address:= ....;
   email.subject:= '=?UTF-8?B?' + encode64 (AnsiToUTF8 (edit1.text)) +  '=?=';
   email.Body.text:= ....;
  end;

 try
  IdSMTP1.Connect (1000);
  IdSMTP1.Send (email);
 finally
  if IdSMTP1.Connected
   then IdSMTP1.Disconnect;
 end;

このページと同じこのページのコードを使用すると、「codes64」文字列は数字、大文字、小文字、句読点で始まります。ただし、このページ では、大文字が最初に来て、その後に小文字が続き、その後に数字が続き、句読点が続く必要があることを示しています.

この修正を行うと、文字列が「正しく」エンコードされ始めました。電子メール クライアントで文字列を正しく読み取ることができました。これを「正しい」と定義しています。

私が見つけたbase64エンコーディングコードに問題があった人が他にいるかどうかを読むのは興味深いでしょう.

于 2013-01-13T16:33:40.967 に答える
0

Subjectプロパティを手動で エンコードする必要はまったくありません。TIdMessage自動的にエンコードします。Edit1.Text値をそのままに に割り当て、 必要に応じてエンコードしますSubjectTIdMessage

TIdMessageヘッダーのエンコード方法をカスタマイズする場合 は、TIdMessage.OnInitializeISO イベントを使用して、目的の文字セットとエンコード値を提供します。Delphi 2009+では、デフォルトでUTF-8とBase64になります。以前のバージョンでTIdMessageは、RTLの現在のOS言語を読み取り、既知の言語のデフォルト値をいくつか選択します。ただし、ヘブライ語はその1つではないため、ISO-8859-1とQuotedPrintableが使用されることになります。これらの値を上書きできます。例:

email.Subject := Edit1.Text;

procedure TForm1.emailInitializeISO(var VHeaderEncoding: Char; var VCharSet: string);
begin
  VHeaderEncoding := 'B';
  VCharSet := 'UTF-8';
end;
于 2013-01-18T07:04:41.747 に答える