0

D2010 で Indy ティブロンの最新のスナップショットを使用します。次のような非常に単純なプロジェクト:

var
  stream: TFileStream; (s is TidSMTP and m is TidMessage)
begin
  s.Connect;
  Stream := TFileStream.Create('c:\Test.zip', fmOpenRead or fmShareExclusive);
  try
    with TIdAttachmentMemory.Create(m.MessageParts, Stream) do
    begin
      ContentType := 'application/x-zip-compressed';
      Name := ExtractFilePath('C:\'); //'
      FileName := 'Test.zip';
    end;
  finally
    FreeAndNil(Stream);
  end;
  s.Send(m);
  s.Disconnect();
end;

Outlook、The bat!、OE、yahoo などではすべて問題なく動作しますが、Thunderbird では添付ファイルが表示されません。Thunderbird でメッセージのソースを見ると、添付ファイルがあります。Indy から送信されたメッセージと他のクライアントから送信されたメッセージの唯一の違いは、Indy メッセージの順序が次のとおりであることです。

Content-Type: multipart/mixed; boundary="Z\=_7oeC98yIhktvxiwiDTVyhv9R9gwkwT1"
MIME-Version: 1.0

他のクライアントには次の順序があります。

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="Z\=_7oeC98yIhktvxiwiDTVyhv9R9gwkwT1"

それが問題の原因であるかどうかはわかりませんが、そうである場合: これは Thunderbird のバグですか、それともメッセージのヘッダーを「奇形」にする indy の問題ですか? この順番は問題ないですか?とにかくそれは問題ですか?

4

3 に答える 3

1

Indyの最新バージョン(現在)のヘッダーに問題があります。

問題は、メールヘッダーの次の行の周りにあるようです。

コンテンツタイプ:マルチパート/混合; border = "oIROJ8Yu4KsL8BbjOo0fc \ = _ O7oAqLVq97i"

境界識別子内の"="には"\"が付加されます(おそらくそれをエスケープするため)が、メールの本文では境界は次のようになります。

--oIROJ8Yu4KsL8BbjOo0fc = _O7oAqLVq97i

Indyのソースを見ると、ファイルidGlobalProtocolsで、ReplaceHeaderSubItemはバックスラッシュを追加するQuoteStringを呼び出します。ここでロジックを慎重に変更して、Indyを再コンパイルできます。

于 2010-03-18T09:26:07.037 に答える
0

次のようなことを試してみてください: (注: コードはメッセージの送信方法を示しているのではなく、メッセージの作成方法を示しているだけです。メールを送信する別のサービスがあります)。

Msg := TIdMessage.Create(nil);
try
  {create the message}
  Msg.Subject := Subject;
  with Msg.Recipients.Add do
  begin
    Text := EMailAddress;
  end;
  Msg.From.Address := From;
  Msg.From.Name := Copy(From, 1, pos('@', From) - 1);
  with Msg.ReplyTo.Add do
  begin
    Text := From;
  end;
  with TIdMessageBuilderHtml.Create do
  try
    {plain text}
    PlainText.Text := 'body text'
    {html body}
    Html.Text := '<html><body><p>' + 'body text' + '</p></body></html>';
    {attachments}
    for i := 0 to AttachFiles.Count - 1 do
        Attachments.Add(AttachFiles.Strings[i]);
    FillMessage(Msg);
  finally
    Free;
  end;
  {save the message for sending}
  Msg.NoEncode := False;
  Msg.NoDecode := False;
  Msg.SaveToFile(locfilename + TempExt);
finally
  Msg.Free;
end;

Rob Kennedyの次のコメントへの回答: このコードを投稿したのは、私にとって、このコードがすべての主要なメール クライアントで動作するためです。コードは一目瞭然で、添付ファイル付きのメッセージを作成し、保存します。動作するソリューションを投稿しました。元のコードのヘッダーまたはメッセージ ソースと、私が投稿したコードを比較して、私のコードが機能する理由を確認する時間はありません (仕事中です)。元の投稿者は自由に投稿して報告できます。

于 2010-03-16T16:34:13.950 に答える
0

RFC 1521 は明示的に次のように述べています。

このドキュメントに従って構成されたメッセージには、次の逐語的なテキストを含むヘッダーフィールドが含まれている必要があります。

MIME バージョン: 1.0

そして、それはヘッダーフィールドであることに注意してください:

ヘッダー フィールドは、フィールド名、コロン (":")、フィールド本体で構成され、CRLF で終了する行です。(RFC 2822)

これにより、Indy がそれをヘッダー フィールドとして設定しない場合、それは Indy のバグであり、IMHO の構文が無効であり、content-type 行で設定できません (CRLF が欠落しているだけでしょうか?) - そして TB は RFC の逐語的に従うだけです、他の人は、RFCが完全に守られていないことが多いことを知っており、とにかくドキュメントを処理しています.

于 2010-03-16T14:15:40.270 に答える