IdSMTPのquicksendで送信日時を正しくするには?

解決


アベベ  2008-11-12 23:19:03  No: 32570

こんにちは。質問のタイトルが適切でないかもしれませんが、
Delphi2007に付属のIndy(10.1.5)で、IdSMTPのquicksendメソッドを
使ってメールを送信すると、メールを受信した側(確認したのはBecky!2)で
送信日時が現在日時より約10時間くらい後になります。

これは、Indy自体のバグなんでしょうか?
よくわからないのですが、こういったものを何とかする方法はありますか?

・同等の機能を持つ別のコンポーネント
・ソースを書き換えて直す

などなど・・・ご存知の方、なにか知恵があったら教えてください。


igy  2008-11-13 06:23:01  No: 32571

>これは、Indy自体のバグなんでしょうか?

こちらでも、Delphi2007に付属のIndy(10.1.5)で同様の現象は確認してました。
# ちなみに、Delphi5でIndy9(9.0.18)を使った場合では、正しい日時になっていました。

Delphi2009に付属のIndy(10.2.5)では直っていたので、おそらくバグだったのかと思います。

>よくわからないのですが、こういったものを何とかする方法はありますか?

・Delphi2007にはIndy9も搭載されていたような気がするので、Indy9を使ってみる。
  # と言っても、私はIndy9とIndy10を切り替える方法は、わからないのですが・・・
・Delphi2009をお持ちなら、Delphi2009を使ってみる。

など、いかがですか?


日本限定対策  2008-11-13 07:26:40  No: 32572

Indy10.2.0.1も世界標準時固定で、各国の標準時には対応していないね。
時間時間限定でよければ、IdSysVCL.pasを以下のように書き換えればOK。

class function TIdSysVCL.OffsetFromUTC: TIdDateTimeBase;
begin
//Result := 0;      // GMT 世界標準時
  Result := 0.375;  // JST 日本標準時
end;


日本限定がお手軽  2008-11-13 08:09:14  No: 32573

Indy9のようにキチンとやりたければ、以下だね。
だけど、このままではIndy10ではコンパイル出来ないので、イロイロ面倒な
書き換えと追加が必要。日本時間限定がお手軽かな。

function OffsetFromUTC: TDateTime;
var
  iBias: Integer;
  tmez: TTimeZoneInformation;
begin
  Case GetTimeZoneInformation(tmez) of
    TIME_ZONE_ID_INVALID:
      raise EIdFailedToRetreiveTimeZoneInfo.Create(RSFailedTimeZoneInfo);
    TIME_ZONE_ID_UNKNOWN  :
       iBias := tmez.Bias;
    TIME_ZONE_ID_DAYLIGHT :
      iBias := tmez.Bias + tmez.DaylightBias;
    TIME_ZONE_ID_STANDARD :
      iBias := tmez.Bias + tmez.StandardBias;
    else
      raise EIdFailedToRetreiveTimeZoneInfo.Create(RSFailedTimeZoneInfo);
  end;
  Result := EncodeTime(Abs(iBias) div 60, Abs(iBias) mod 60, 0, 0);

  if iBias > 0 then begin
    Result := 0 - Result;
  end;
end;


朗報  2008-11-13 18:26:41  No: 32574

現在DL可能な最新バージョンindy10.2.0.3では、
修正されているね。


アベベ  2008-11-13 18:59:12  No: 32575

>>igyさん
delphi2009Indy(10.2.5)は直ってるんですねぇ
delphi2007はインストール時にIndy9と10のどっちを入れるか聞いてきた気がしますが、
簡単に切り替えられるものでしょうか?
delphi2009は予算がないので手が出ないです…

>>日本限定さん
レスありがとうございます。VCLを直接いじくる方法もあるんですね。

>>朗報さん
1.IndyProjectのHomeから『Indy.Sockets (VCL)』のリンクをクリック
2.『Indy 10 for FreePascal and the Lazarus IDE』をクリック
で出てくる『indy-10.2.0.3.zip』の事ですよね?
同じpascalだからこれもdelphiで使えるのでしょうか?
既存のIndy10(10.1.5)をバージョンアップする方法がわからないのですが、
解凍したfpcフォルダの中身を
C:\Program Files\CodeGear\RAD Studio\5.0\source\Indy\Indy10
あたりに入れてやればいいのかな?


それ以外に  2008-11-13 19:12:49  No: 32576

>解凍したfpcフォルダの中身を...
Lazalusフォルダ内のファイルも必要。
定数値の宣言もチョット変更されてる(Indyのお約束)ので、
場合によっては、その修正が必要になるかも。


アベベ  2008-11-13 22:21:25  No: 32577

色々とありがとうございます。
差し当たり日本限定の方法を採ろうと思い、先ほど書き換えてみましたが現象が変わりません。
IdSysVCL.pasを書き換えたあと、なにかをコンパイルしたりする必要はありますか?


Indyコンポの再コンパイル  2008-11-14 02:30:45  No: 32578

IdSysVCL.pasのOffsetFromUTC関数内にブレークポイントを設定して、
プロジェクトを再構築した時に、ブレークポイントで止まらなければ、
その書き換えたソースが使われていないということ。
dcuファイルを削除するか、Indyコンポの再コンパイルが必要。


アベベ  2008-11-17 19:13:39  No: 32579

Indyコンポの再コンパイルというのをどうやったら良いかわからなかったので、
作成中アプリのプロジェクトに直接、変更したユニットファイル
"CodeGear\RAD Studio\5.0\source\Indy\Indy10\System\IdSysVCL.pas"
を追加してコンパイルしたらなおりました!
差し当たり、これで解決とさせていただきます。
レスくださった皆様、有難う御座いました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加