Delphi

メールの詳細(トピック表示)

Delphi 2009のTIdSMTP1について

投稿者:hirodelさん  2009/05/19 12:22  MLNo.179   [メール表示]

こんにちは加藤です
Delphi 2009でTIdSMTP1
IdSmtp1.QuickSend(host, subject, mailto, from, body);
を実行する場合
subjectと bodyを日本語で送信するとエラーになってしまいます
Delphi7だと異常なく送れていたのですが・・・
宜しくお願いいたします


このMLメールはHTML形式でメール投稿されています。HTML形式で表示
Gg[ubN}[N

最新の10件 1 2
  • MLNo.185   DEKOさん  (0) 2009/05/22 17:50  [メール表示する]
    こんにちは。

    uses
     ..., EncdDecd;


    procedure TForm1.Button1Click(Sender: TObject);
    type
     ISO2022JP = type AnsiString(50220);
    var
     Subject, body: ISO2022JP;
     HostName, MailTo, MailFrom: String;
     body2: String;
     i: Integer;
    begin
     HostName := ''smtp.hoge.com'';
     Subject := ''こんにちは'';
     Subject := ''=?ISO-2022-JP?B?'' + EncodeBase64(PAnsiChar(Subject), Length(Subject)) + ''?='';
     MailTo := ''reciever@…'';
     MailFrom := ''sender@…'';
     body := ''本文です'';
     SetLength(body2, Length(body));
     for i:=1 to Length(body) do
      body2[i] := Char(Ord(body[i]));
     TIdSMTP.QuickSend(HostName, Subject, MailTo, MailFrom, body2);
    end;

    Subject のトコは手抜きなので、適宜修正して下さい。

    --
    by DEKO
    -------------------------------------
    http://homepage1.nifty.com/ht_deko/
    ht_deko@…
    -------------------------------------

  • MLNo.186   hirodelさん  (0) 2009/05/22 18:48  [メール表示する]
    DEKOさん 加藤です ありがとうございます

    「Delphi2009と文字列処理」拝見させていただきましたが
    今まで文字のエンコードとは無縁の仕事でしたのでかなり難しい感じがしてます

    > Subject := ''=?ISO-2022-JP?B?'' + EncodeBase64(PAnsiChar(Subject),
    > Length(Subject)) + ''?='';
    この辺がわかりませんでしたが「body」はきちんと日本語になって送れました

    ただ、自分以外のメールアドレスに送ると
    「sorry,that domain isn''t in my list of allowed rcpthosts」とのエラーが出てしまします
    ちなみWindowsXP SP3 IE7 ですが私の環境の仕業でしょうか
    それともDelphi2009のTIdSMTPに何か設定しなければならない物が有るのでしょうか


    ----- Original Message -----
    From: "DEKO" <delphi-users@…>
    To: <delphi-users@…>
    Sent: Friday, May 22, 2009 11:20 AM
    Subject: [delphi-users:0184] Re: Delphi 2009のTIdSMTP1について


    > こんにちは。
    >
    > uses
    > ..., EncdDecd;
    >
    >
    > procedure TForm1.Button1Click(Sender: TObject);
    > type
    > ISO2022JP = type AnsiString(50220);
    > var
    > Subject, body: ISO2022JP;
    > HostName, MailTo, MailFrom: String;
    > body2: String;
    > i: Integer;
    > begin
    > HostName := ''smtp.hoge.com'';
    > Subject := ''こんにちは'';
    > Subject := ''=?ISO-2022-JP?B?'' + EncodeBase64(PAnsiChar(Subject),
    > Length(Subject)) + ''?='';
    > MailTo := ''reciever@…'';
    > MailFrom := ''sender@…'';
    > body := ''本文です'';
    > SetLength(body2, Length(body));
    > for i:=1 to Length(body) do
    > body2[i] := Char(Ord(body[i]));
    > IdSMTP1.Host := HostName;
    > IdSMTP1.Connect;
    > try
    > IdSMTP1.QuickSend(HostName, Subject, MailTo, MailFrom, body2);
    > finally
    > IdSMTP1.Disconnect;
    > end;
    > end;
    >
    > # Subject のトコは手抜きなので、適宜修正して下さい。
    >
    > --
    > by DEKO
    > -------------------------------------
    > http://homepage1.nifty.com/ht_deko/
    > ht_deko@…
    > -------------------------------------
    >
    >
    > 【MLコミュホームページ】http://www.freeml.com/delphi-users
    >
    > --[PR]------------------------------------------------------------------
    > ◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
    > ◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
    > ◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆
    > http://ad.freeml.com/cgi-bin/sa.cgi?id=efWRy
    >
    > ------------------------------------------------------------------[PR]--
    > ■GMO INTERNET GROUP■ GMO INTERNET www.gmo.jp
    >

  • MLNo.187   DEKOさん  (0) 2009/05/22 20:16  [メール表示する]
    こんにちは。

    > ただ、自分以外のメールアドレスに送ると
    > 「sorry,that domain isn''t in my list of allowed rcpthosts」とのエラーが
    > 出てしまします
    > ちなみWindowsXP SP3 IE7 ですが私の環境の仕業でしょうか
    > それともDelphi2009のTIdSMTPに何か設定しなければならない物が有るのでしょうか

    エラーメッセージ自体はよくあるもので、Indyに限った話ではないのですが、
    私が再投稿したコードでもダメなら QuickSendではなく、
    TIdSMTP.Send を使うしかないような気がします。

    フォームに TIdSMTP と TIdMessage を貼り付けて以下のコードを試してみて下さい。

    uses
    ..., EncdDecd;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    dSubject: UTF8String;
    HostName, dBody, MailTo, MailFrom: String;
    begin
    HostName := ''smtp.hoge.com'';
    MailTo := ''reciever@…'';
    MailFrom := ''sender@…'';
    dSubject := ''こんにちは'';
    dSubject := ''=?UTF-8?B?'' + UTF8String(EncodeBase64(PAnsiChar(dSubject), Length(dSubject))) + ''?='';
    dBody := ''本文です'';
    IdSMTP1.Connect;
    try
    with IdMessage1 do
    begin
    ContentType := ''text/plain'';
    CharSet := ''UTF-8'';
    ContentTransferEncoding := ''base64'';
    Recipients.EMailAddresses := MailTo;
    From.Text := MailFrom;
    ReplyTo.EMailAddresses := MailFrom;
    Subject := dSubject;
    Body.Text := dBody;
    end;
    IdSMTP1.Send(IdMessage1);
    finally
    IdSMTP1.Disconnect;
    end;
    end;

    procedure TForm1.IdMessage1InitializeISO(var VHeaderEncoding: Char;
    var VCharSet: string);
    begin
    // VHeaderEncoding := ''B''; // BASE64 Encoding (Default)
    VCharSet := ''UTF-8'';
    end;

    Delphi 2009 で最も直感的に日本語メールを送信する方法です。
    (少なくとも Delphi 付属版の Indy10 では)
    文字エンコーディングは UTF-8 になってしまいますが、
    Delphi 2009 では Unicode がデフォルトなので、こちらの方が都合がいい事もあるでしょう。

    「ISO-2022-JP でないとダメ」という事でしたら、
    先の投稿を参考にコードを書き換えて下さい。

    --
    by DEKO
    -------------------------------------
    http://homepage1.nifty.com/ht_deko/
    ht_deko@…
    -------------------------------------

  • MLNo.188   DEKOさん  (0) 2009/05/22 21:08  [メール表示する]
    こんにちは。

    >> Subject := ''=?ISO-2022-JP?B?'' + EncodeBase64(PAnsiChar(Subject),
    >> Length(Subject)) + ''?='';
    > この辺がわかりませんでしたが「body」はきちんと日本語になって送れました

    元々、メールのサブジェクトには 7bit しか使えなかったと記憶しています。
    つまり、日本語等が通らない仕様なので、7bit化したものを突っ込む事になります。

    # 詳しくは "メール 件名 日本語" でググってみて下さい。

    ''=?ISO-2022-JP?B?'' + サブジェクト + ''?=''

    というのは、サブジェクトの文字エンコードが ISO-2022-JP で
    BASE64 で 7bit化されていますよ、という指定です。

    B = BASE64
    Q = Quoted Printable

    7bit へエンコードする方法は他に "Quoted Printable" があります。
    これは ISO_8859 等の文字エンコーディングで推奨される方式のようです。

    なお、文字エンコーディング が UTF-8 の場合には、
    本文(body) も BASE64 でエンコードする事が推奨されています(確か)。

    Indy は ContentTransferEncoding に "base64" を指定する事により、
    本文(body)を自動的に BASE64 エンコードしてしてくれます。

    # サブジェクトを自動で BASE64 エンコードしてくれないのは、
    # 先述の通り、本来の仕様ではないからだと思います。

    Indy10 はデフォルト文字エンコーディングをロケールの言語IDから取得しており、
    しかもそれが "ISO-2022-JP" なので、辻褄が合わなくなっているのだと思われます。
    故に、先の QuickSend のコードでは "ISO-2022-JP" から変換しています。

    --
    by DEKO
    -------------------------------------
    http://homepage1.nifty.com/ht_deko/
    ht_deko@…
    -------------------------------------

  • MLNo.189   DEKOさん  (0) 2009/05/22 23:24  [メール表示する]
    度々すみません。

    IdSMTP1.Connect;
    の前に
    IdSMTP1.Host := HostName;
    が必要ですね。

    --
    by DEKO
    -------------------------------------
    http://homepage1.nifty.com/ht_deko/
    ht_deko@…
    -------------------------------------

  • MLNo.190   hirodelさん  (0) 2009/05/23 11:26  [メール表示する]
    DEKOさん 加藤です ありがとうございます
    昨夜から色々勉強させて戴いております大変参考になりました 心強いです
    解りやすい解説で、鱈脳の私にも少し解ってきました

    TIdSMTP.Send で 文字エンコーディングは UTF-8 の方がSubject の文字化けは有りませんし、
    たまに起こった実行時のフリーズもこちらでは有りません
    ただ、自分以外のメールアドレスに送った時の
    [ sorry,that domain isn''t in my list of allowed rcpthosts ]とのエラーメッセージは相変わらずです

  • MLNo.191   DEKOさん  (0) 2009/05/23 13:14  [メール表示する]
    こんにちは。

    > ただ、自分以外のメールアドレスに送った時の
    > [ sorry,that domain isn''t in my list of allowed rcpthosts ]とのエラー
    > メッセージは相変わらずです

    POP3コンポーネントを使って、"POP Before SMTP" を実装するか、
    "SMTP Auth" を設定してみて下さい。

    以下の記事が参考になると思います

    [Indy 10とSynapseを利用したSMTP機能の実装]
    http://codezine.jp/article/detail/400

    --
    by DEKO
    -------------------------------------
    http://homepage1.nifty.com/ht_deko/
    ht_deko@…
    -------------------------------------

  • MLNo.214   hirodelさん  (0) 2009/05/28 19:58  [メール表示する]
    DEKOさん 加藤です 有難う御座いました

    > POP3コンポーネントを使って、"POP Before SMTP" を実装

    これで全て解決いたしました。

    文字のエンコードについては奥深くて理解できるまで時間が掛かりそうですが、
    お蔭様で日本語についていろいろと勉強になりました
    今後とも宜しくお願いいたします。m(__)m

  • MLNo.215   DEKOさん  (0) 2009/05/29 08:46  [メール表示する]
    こんにちは。

    >> POP3コンポーネントを使って、"POP Before SMTP" を実装
    > これで全て解決いたしました。

    解決したようでなによりです。

    QuickSend() にこだわる必要はもうないのかもしれませんが、
    TIdSMTP.QuickSend(Host, Subject, MailTo, MailFrom, Body, ''text/plain'', ''ISO-2022-JP'', ''7bit'');
    のような指定のできる "オーバーロードされた QuickSend()" がIndy10 最新版に追加されたようです。

    [Indy10 最新版ダウンロード]
    ftp://indy.fulgan.com/ZIP/

    [Delphi 2009 に最新版の Indy10 をインストールする]
    http://homepage1.nifty.com/ht_deko/tech033.html

    --
    by DEKO
    -------------------------------------
    http://homepage1.nifty.com/ht_deko/
    ht_deko@…
    -------------------------------------

  • MLNo.216   hirodelさん  (0) 2009/05/29 15:17  [メール表示する]
    加藤です

    そうですか、 早速ためしてみます。
    かさねがさね ありがとうございますm(__)m

    ----- Original Message -----
    From: "DEKO" <delphi-users@…>
    To: <delphi-users@…>
    Sent: Friday, May 29, 2009 8:46 AM
    Subject: [delphi-users:0215] Re: Delphi 2009のTIdSMTP1について


    > こんにちは。
    >
    >>> POP3コンポーネントを使って、"POP Before SMTP" を実装
    >> これで全て解決いたしました。
    >
    > 解決したようでなによりです。
    >
    > QuickSend() にこだわる必要はもうないのかもしれませんが、
    > TIdSMTP.QuickSend(Host, Subject, MailTo, MailFrom, Body, ''text/plain'',
    > ''ISO-2022-JP'', ''7bit'');
    > のような指定のできる "オーバーロードされた QuickSend()" がIndy10 最新版に追加されたようです。
    >
    > [Indy10 最新版ダウンロード]
    > ftp://indy.fulgan.com/ZIP/
    >
    > [Delphi 2009 に最新版の Indy10 をインストールする]
    > http://homepage1.nifty.com/ht_deko/tech033.html
    >
    > --
    > by DEKO
    > -------------------------------------
    > http://homepage1.nifty.com/ht_deko/
    > ht_deko@…
    > -------------------------------------
    >
    >
    > 【MLコミュホームページ】http://www.freeml.com/delphi-users
    >
    > --[PR]------------------------------------------------------------------
    > ◇◆◇◆ 憧れの4LDKや共用施設充実マンション    ◇◆◇◆
    > ◆◇◆◇賃貸じゃ難しい?理想の住まい探しは早めの資料請求で先手!◆◇◆◇
    > ◇◆◇◆  これから販売予定のおNewなマンション、即チェック ◇◆◇◆
    > http://ad.freeml.com/cgi-bin/sa.cgi?id=ej2Ta
    >
    > ------------------------------------------------------------------[PR]--
    > ■GMO INTERNET GROUP■ GMO INTERNET www.gmo.jp
    >

最新の10件 1 2
メールへの返信はMLのメンバーしかできません。