2011-11-22 20 views
5

Delphi 2006を使用して、添付ファイル付きの電子メールメッセージをパーソナル専用アプリケーションに作成して送信しています。 TIdSMTPのインスタンスでメッセージを送信し、TIdIMAP4のインスタンスを含む特定のIMAPフォルダにコピーを配置します。これはBDS2006で配布されたIndy 10のバージョンと非常にうまく動作しますが、1つの例外は例外です。電子メールヘッダーの時刻は常に間違っています。マルチパート/混合メッセージの境界文字列が正しくありません

解決策を探して解決した後、最新のIndy 10スナップショットを入手して使用するのが最も合理的だったようです。

これは、電子メールのヘッダーに正しい時刻を置きますが、新しい問題があります。 IMAPフォルダに追加されたメッセージのヘッダーの境界文字列は、電子メールの本文に含まれているものとは異なります。 (SMTPを介して送信されたメッセージが正しいことに注意してください。)

これは、インディ10の旧バージョンからの関連するヘッダ情報である:

Content-Type: multipart/mixed; boundary="XNlC6OyS4QSiHY2U=_jsXyps6TR34pFNsh" 
MIME-Version: 1.0 
Date: Tue, 22 Nov 2011 09:11:58 +0000 

A test of the BDS2006-bundled version of Indy 

--XNlC6OyS4QSiHY2U=_jsXyps6TR34pFNsh 
Content-Type: application/octet-stream; 
     name="20111122.xls" 

、これはインディ10.5から同一のヘッダ情報であります0.8(私は昨日インストールしたスナップショット10_4702):

Content-Type: multipart/mixed; boundary="CDbEncbFvL7RZdOJ3DOIRoRBs=_nBsbZms" 
MIME-Version: 1.0 
Date: Tue, 22 Nov 2011 07:33:46 -0600 

investigating more deeply, why does the boundary indicator change? 

--h=_WzGWJei29fng7SqdPpDh1nkJxJZhiGc 
Content-Type: application/octet-stream; 
    name="20111122.xls" 

タイムスタンプが固定されているが、今の境界文字列が正しくありません。その結果、IMAPフォルダに追加されるメッセージには何も表示されないように見えます。ここで

は、電子メールメッセージと添付ファイルを作成し、関連するコードは、それを送信であり、IMAPフォルダにコピーを置く:私が言ったように、

FTheMsg.Date := Now; // FTheMsg is a component dropped onto the form 
    FTheMsg.Recipients.EMailAddresses := edMailTo.Text; 
    FTheMsg.ClearBody; 
    FTheMsg.Subject := 'Glucose Readings ' + FormatDateTime('mm/dd/yy', FStartDate) + ' - ' + 
       FormatDateTime('mm/dd/yy', FEndDate); 
    FTheMsg.Body.Assign(FMemo.Lines); 

    // create the attachment 
    TIdAttachmentFile.Create(FTheMsg.MessageParts, fileName); 

    // send the mail! 
    FSmtp.Host := FSMTPHost; // values set up elsewhere, FSmtp is a component on the form 
    FImap.Host := FIMAPHost; // FImap is also a component on the form 

    FSmtp.Connect; 
    try 
    FSmtp.Send(FTheMsg); 
    FImap.Connect; 
    try 
     if (not FImap.AppendMsg('Sent Items', FTheMsg, FTheMsg.LastGeneratedHeaders, [mfSeen]))  then 
     StatusBar1.Panels[4].Text := 'Failed append msg'; 
    finally 
     FImap.Disconnect; 
    end; 
    finally 
    FSmtp.Disconnect; 
    end; 

送信される電子メールには、適切に罰金して表示され。しかし、私のIMAPフォルダ(上記のFImap.AppendMsg())に追加されているものは間違っています。私はそれが間違っているかもしれないかを調べるためにコードをトレースしようとしましたが、間違っていることを判断できるように、私はIndyと様々な電子メールプロトコル/ RFCに十分に精通していません。私が知ることができるのは、古いバージョンではメッセージを一時ファイルに保存してからフォルダに追加し、新しいバージョンではメッセージをメモリストリームに保存するということです。明らかに、それについては何かが異なりますが、私は現在、何を決定するのかあまりにも無知です。

古いバージョンのタイムスタンプの問題を簡単に修正する方法はありますか?もしそうなら、他のすべてが正しいように見えるので、それは私の使用のためには良いでしょう。そうでない場合は、間違った境界文字列を使ってこの問題を解決するために他に何をする必要がありますか?

(これは、アプリケーションが、私自身の使用のために厳密であるので、私がする必要がある場合は、私はなく、私の「送信済みアイテム」フォルダ内の「空に見える」コピーして、誤った日付と一緒に暮らすことができます。)

さらに詳しい情報が必要な場合は、私ができることを喜んで提供します。

[編集:古いバージョンのIndyを使用して、私のコードにkludgeの何かを組み込みました。メッセージの日付/時刻を送信する前にUTC/GMT時間に設定するだけで、受信者の最後にメッセージが正しい時刻を含むことができます。

答えて

4

添付ファイルが存在するときにTIdMessage.Bodyプロパティを使用してテキストを保持しないでください。代わりにテキストをTIdTextオブジェクトに入れてください。さらにTIdMessageBuilderPlainなどのTIdMessageBuilder...クラスを使用してTIdMessageの体を準備してください。

これを試してみてください:

FTheMsg.Clear; 
FTheMsg.Date := Now; // FTheMsg is a component dropped onto the form 
FTheMsg.Recipients.EMailAddresses := edMailTo.Text; 
FTheMsg.Subject := 'Glucose Readings ' + FormatDateTime('mm/dd/yy', FStartDate) + ' - ' + FormatDateTime('mm/dd/yy', FEndDate); 
FTheMsg.ContentType := 'multipart/mixed'; 

TIdText.Create(FTheMsg.MessageParts, FMemo.Lines).ContentType := 'text/plain'; 
TIdAttachmentFile.Create(FTheMsg.MessageParts, fileName); 

FSmtp.Connect; 
try 
    FSmtp.Send(FTheMsg); 
    FImap.Connect; 
    try 
    if (not FImap.AppendMsg('Sent Items', FTheMsg, nil, [mfSeen])) then 
     StatusBar1.Panels[4].Text := 'Failed append msg'; 
    finally 
    FImap.Disconnect; 
    end; 
finally 
    FSmtp.Disconnect; 
end; 

または:そうは言って

FTheMsg.Clear; 
FTheMsg.Date := Now; // FTheMsg is a component dropped onto the form 
FTheMsg.Recipients.EMailAddresses := edMailTo.Text; 
FTheMsg.Subject := 'Glucose Readings ' + FormatDateTime('mm/dd/yy', FStartDate) + ' - ' + FormatDateTime('mm/dd/yy', FEndDate); 

with TIdMessageBuilderPlain.Create do 
try 
    PlainText.Assign(FMemo.Lines); 
    Attachments.Add(fileName); 
    FillMessage(FTheMsg); 
finally 
    Free; 
end; 

FSmtp.Connect; 
try 
    FSmtp.Send(FTheMsg); 
    FImap.Connect; 
    try 
    if (not FImap.AppendMsg('Sent Items', FTheMsg, nil, [mfSeen])) then 
     StatusBar1.Panels[4].Text := 'Failed append msg'; 
    finally 
    FImap.Disconnect; 
    end; 
finally 
    FSmtp.Disconnect; 
end; 

さて、それはまだ正しくどちらかのように動作しない可能性が高いです。 TIdIMAP4.AppendMsg()は内部的にTIdMessage.SaveToStream()を呼び出します。これは、電子メールコンテンツを新しく生成します(したがって、本文で使用される境界を変更します)。既存のTIdMessage.LastGeneratedHeadersを渡すか、またはを取得するためにTIdIMAP4.AppendMsg()を受け入れるかは、TIdMessage.SaveToStream()が生成する新しい境界と同期していません。

SMTPとIMAP4の両方が同期していることを確認するには、同じデータを受信する必要があります。その後、TrueにTIdMessage.NoEncodeプロパティセットでTIdSMTP.Send()TIdIMAP4.AppendMsg()を呼び出し、TrueにTIdMessage.NoDecodeプロパティを設定し、その後、Falseに設定TIdMessage.NoEncodeプロパティで最初に手動でTIdMessage.SaveToStream()を呼び出して試してみて、TIdMessage.HeadersTIdMessage.Bodyプロパティにそのまま保存されたデータをリロードするTIdMessage.LoadFromStream()を呼び出しますTIdMessage.HeadersTIdMessage.Bodyがそのまま送信されます。

私は知っています。これは、TIdIMAP4.AppendMsg()のコメント/ドキュメントには反対しています。 AppendMsg()は現在MIMEをすべて考慮していないため、ヘッダーと本文のMIME境界が互いに一致することはありません。私はそれについての修正をチェックしようとします。 Indy 11では、IndyのMIME処理システム全体が再設計される予定ですので、境界を保持したり、カスタム境界を指定することができるようにします。AppendMsg()は、本文境界とヘッダー境界をよりよく一致させることができます。

IMAP4は、一般的に動作する非常にトリッキーなプロトコルです。

+0

これは影響がありましたが、私が探していたものではありません。 FTheMsg.NoEncode:= Falseに設定し、ストリームにメッセージを保存し、FTheMsg.NoEncode:= Trueをリセットしてメッセージを再読み込みし、TIdSMTP.Send()とTIdIMAP4.AppendMsg()で送信して渡したメモリストリームを作成しました。 'AdditionalHeaders'パラメータとしてNILを指定します。その結果、添付ファイルがまったくなく、メッセージにテキストが表示されません! – pejurgenson

+0

これは、NoEncode = Falseで保存した後、NoEncode = Trueの 'code'でリロードした後の完全なメッセージです。件名:グルコース読み取り値11/07/11 - 11/20/11 To:[email protected] コンテンツタイプ:multipart/mixed;境界= "D9uTCLury1wVu8hlPEcf = _0afpyB9eNLrK" MIME-バージョン:1.0 日:火、2011年11月22日午前15時00分10秒-0600 これは、MIME形式 でマルチパートメッセージです。 NoEncode = Falseの場合、保存されたメッセージは完了したように見えます。 – pejurgenson

+0

申し訳ありませんが、私はNoEncodeを設定することについて誤解しました - 私はそれをNoDecodeとして読んでいます!おっとっと。あなたのメモのように正しく行うと、メッセージは受信者と私の '送信済みアイテム'フォルダの両方に正しく到着します。非常に多くの助けをありがとう、それは非常に感謝しています!私はこの答えを間違いなく受け入れます。 – pejurgenson

関連する問題