メールの詳細(トピック表示)
こんにちは加藤です
Delphi 2009でTIdSMTP1
IdSmtp1.QuickSend(host, subject, mailto, from, body);
を実行する場合
subjectと bodyを日本語で送信するとエラーになってしまいます
Delphi7だと異常なく送れていたのですが・・・
宜しくお願いいたします
このMLメールはHTML形式でメール投稿されています。HTML形式で表示
-
MLNo.185
DEKOさん
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@….com
-------------------------------------

-
MLNo.186
hirodelさん
2009/05/22 18:48 [メール表示する]

DEKOさん 加藤です ありがとうございます
「Delphi2009と文字列処理」拝見させていただきましたが
今まで文字のエンコードとは無縁の仕事でしたのでかなり難しい感じがしてます
この辺がわかりませんでしたが「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について

-
MLNo.187
DEKOさん
2009/05/22 20:16 [メール表示する]

こんにちは。
エラーメッセージ自体はよくあるもので、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@….com
-------------------------------------

-
MLNo.188
DEKOさん
2009/05/22 21:08 [メール表示する]

こんにちは。
元々、メールのサブジェクトには 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@….com
-------------------------------------

-
MLNo.189
DEKOさん
2009/05/22 23:24 [メール表示する]

度々すみません。
IdSMTP1.Connect;
の前に
IdSMTP1.Host := HostName;
が必要ですね。
--
by DEKO
-------------------------------------
http://homepage1.nifty.com/ht_deko/
ht_deko@….com
-------------------------------------

- MLNo.190 hirodelさん 2009/05/23 11:26 [メール表示する]
-
MLNo.191
DEKOさん
2009/05/23 13:14 [メール表示する]

こんにちは。
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@….com
-------------------------------------

- MLNo.214 hirodelさん 2009/05/28 19:58 [メール表示する]
-
MLNo.215
DEKOさん
2009/05/29 08:46 [メール表示する]

こんにちは。
解決したようでなによりです。
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@….com
-------------------------------------

- MLNo.216 hirodelさん 2009/05/29 15:17 [メール表示する]
メールへの返信はMLのメンバーしかできません。


