いつも、お世話になっています。
私のかわいいIndy坊やについてご相談します。
住んでいる所
windous XP delphi7 PRO
indy10 10_4702 2011/11/18
相談内容
indy10を使ってGmailでメ−ル本文と添付ファイルを送るプログラムを作っています。
DEKO様の作られた「インディ10を使ってGMailのを送受信する」を参考にして http://ht-deko.minim.ne.jp/tech057.html 送信プログラムをつくりました。
名前を仮に'Ten.exe'とします。
'Ten.exe'単体で実行するすると添付ファイルも含めて送信は成功しますが、
'Ten.exe'の送信部分を、他のプログラムに組み込んだり、ボタンだけの最小のプログラムから、起動する'Ten.exe' 外部プログラムにしても,
途中までは、単体で動かしている時と同じ動きなのですが
① SMTP.Connect や IdMessageの設定までは、うまくいく
SMTP.Send(メッセージ)の場所で、行ったきりで、帰ってこれないみたいです。
(このプログラムは、応答していません)
①の様になりうまく行きません。
人様からメ−ルを頼まれるとグレてメッセージを持ったままどこかにいってしまうみたいです。
'Ten.exe'単体としては、上手く働いてくれるので、何とか人様に呼ばれても、きっちり仕事のこなせるように、育てたいのですが、アドバイスをいただけますか。
<発言削除>
<発言削除 + 解決済み解除>
Indy10 のわけの解らない挙動について相談したとまどうペリカンです。
質問のタイトルが、とぼけたものだったので、掲示板あらしとして処理されたの
でしょうか、質問した本人の知らないうちに解決とされてしまいました。
残念です。
本人にとっては、とても深刻な問題で引き続き解決策を模索しています。
アドバイスか、ここを見るといいよとか教えて頂けたら助かります。
Indy 10 を使って GMail を送受信するには? (Delphi 2007 Before)
http://ht-deko.minim.ne.jp/tech057.html#tech112
ミスった〜 Miss orz
いつも、お世話になっています。
挙動不振な Indyについてご相談しました、とまどうペリカンです。
indy10を使ってGmailでメ−ル本文と添付ファイルを送るプログラムを作っています。
2004年ころindyを使って、うまくいってたのに、新しいindy10では、うまく行きません。
indyのせいかと思い、
indy10-4702
indy10-4709
indy10-4710..4711 とためして、みましたがだめでした。
どのバ-ジョンでも
SMTP.Connect は、成功し
Msg := TIdMessage.Create(SMTP)
セットして
SMTP.Send(msg); までは、いくのですが
その後を、追跡していくと
IdSMTP ・StartLS をとうり
IdExplicitTLSClientServerBase の TIdExplicitTLSClient.TLSHandshake
まで、行って、あとは、応答無しの状態です。、
いつまでも解決がはかれないので、とりあえず、メ-ルプログラム「outlook」を
ShellExecuteで行なうことにしました。(添付ファイルは、手動で行ないます。)
こちらは、OKです。
indyで上手くいけばとおもったのですが、別のやり方で解決しましたので、
解決とします。(又そのうち挑戦します)
見守って頂いた皆様、有難うございました。
ソースが無いのでなんとも言えませんし、
単体で動くけど〜のくだりが意味不明です。
本家のコードを見ると特に特殊な設定は不要そうですが、
http://www.indyproject.org/sockets/blogs/rlebeau/2005_08_17_a.en.aspx
コードはこんな感じですかね?(XE2のIndy10)
//dekoさんのサンプルに添付ファイルを追加
//http://ht-deko.minim.ne.jp/tech057.html#tech112
//uses IdAttachment, IdAttachmentFile
procedure TForm1.IdMessage_InitializeISO(var VHeaderEncoding: Char; var VCharSet: string);
begin
VHeaderEncoding := 'B';
VCharSet := 'UTF-8';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
SMTP: TIdSMTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
Msg : TIdMessage;
Attachment:TIdAttachmentFile; //追加
begin
SMTP := TIdSMTP.Create(nil);
try
SMTP.Host := 'smtp.gmail.com';
SMTP.Port := 587;
SMTP.Username := 'xxxxxx@gmail.com'; // UserName
SMTP.Password := 'xxxxxx'; // Password
SSL := TIdSSLIOHandlerSocketOpenSSL.Create;
try
SSL.Host := SMTP.Host;
SSL.Port := SMTP.Port;
SSL.Destination := SSL.Host + ':' + IntToStr(SSL.Port);
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseExplicitTLS;
SMTP.Connect;
Msg := TIdMessage.Create(SMTP);
try
Msg.OnInitializeISO := IdMessage_InitializeISO;
Msg.ContentType := 'multipart/mixed'; //変更
Msg.CharSet := 'UTF-8';
Msg.ContentTransferEncoding := 'BASE64'; // BASE64 (7bit)
//Msg.ContentTransferEncoding := '8bit'; // RAW(8bit)
Msg.From.Name := 'xxxxxx@gmail.com';
Msg.From.Address := 'xxxxxx@gmail.com';
Msg.Recipients.EMailAddresses := 'xxxxxx@gmail.com';
Msg.Subject := 'Unicode String (subject)';
Msg.Body.Text := UTF8Encode('Ansi String (body)');
Attachment := TIdAttachmentFile.Create(Msg.MessageParts,'test.jpg'); //追加
Attachment.FileName := 'test.jpg'; //追加
Attachment.ContentType := 'image/jpeg'; //追加
SMTP.Send(Msg);
finally
Attachment.Free;
Msg.Free;
end;
SMTP.Disconnect;
finally
SSL.Free;
end;
finally
SMTP.Free;
end;
end;
Monaa 様 御丁寧に教えて頂き有難う御座います。
私の環境は、delphi7 windows Xp でテストしています。
望みを託して、頂きましたコ-ドを組み込み実行してみましたが、私がテストしているいつもの箇所でストップしてしまいました。
SMTP.Send(Msg) を実工したあとトレ-スすると
unit IdExplicitTLSClientServerBase の
procedure TIdExplicitTLSClient.TLSHandshake;
begin
try
if (IOHandler is TIdSSLIOHandlerSocketBase) then begin // g1
(IOHandler as TIdSSLIOHandlerSocketBase).PassThrough := False; // g2
g1を過ぎたあと、g2で止まります。
止まっても、暴走してるふうではなく、実行環境からプログラムの終了を選択すると
正常に終了します。
end;
except
ProcessTLSHandShakeFailed;
end;
end;
Indy10 Gmail できてる人がいると思うと、こころ強いですが、
そのうち、気力が回復したら環境を変えて、再度挑戦します。
七尾様 貴重なお時間を どうも有難うございました、
monaa様
すみません、説明不足でした。
単体で動かすと、上手くいくが、の説明
添付ファイルをgmail で転送するプログラムを直接実行すること。
メ-ルも添付ファイルも転送できます。
べつの実行ファイルから転送するプログラムを、呼び出すと、帰ってこない、
メ-ルも転送できていない。
と言う、じょうたいのことです。
いぜんは、単体でならうまくメ-ルと、添付ファイルが転送できていたのですが
いまは、なにをまちがったのか、単体でもうまく行かなくなっています。
とほほ
名前まで間違えてすみません。
経過報告ですが、
Windows7上でXE2のデフォルトIndyですと問題なく動作します。
ですが2009のデフォルトIndyと比較すると生成されるメールソースに若干の違いが見られました。
Indyは最新版を使ったほうが良いようです。
Indyのソースは私には難解なため把握できていませんが、
エラーも出さずただ停止しているという状況は恐らく入力終了コードが生成されていないのだと思います。
D7もXPもあるにはあるのですが、両方インストールしてない状態なのでちょっと面倒です。
ちなみに現状でファイルを添付しないメールの送信は可能ですか?
あと、以前からindyは日本語が問題となることが多かったので、添付ファイルのパスに日本語が入っていないか確認してみてください。
それでもダメなら、暇を見てxp,d7,indy10やってみます。
Monaa 様 いつも有難うございます。
見ず知らずの私のために貴重な時間をお使い頂き感謝致します。
XE2 で動いてると聞くだけでも、励みになります。
ご質問いただきましたが、現状では、添付ファイルのあるなしにかかわらず、
メ-ルの送信が、完了できません。エラ-も出さずにただ停止している状態です。
前回、TLSHandshake 訳のわかないるーぷに「入ると書きましたが、
きょうは、一歩前進しました。
TLSHandshake の後をトレ-スすると
IdSSLOpenSSL の SetPassThrough(const Value: Boolean); に着きました。
ここは、SMTP.Connect後、2回か通過して
SMTP.Send(Msg) 後 もう一度通ります。
この3度目のとき fPassThrough =false 例外を引き起こし
raise EIdOSSLCouldNotLoadSSLLibrary.Create(RSOSSLCouldNotLoadSSLLib で
エラ-も出さずにただ停止している状態になるみたいです。
とはいえなんのことやらわからず『ターヘル・アナトミア』を前にした玄白さんのようですが
delphi indy EIdOSSLCouldNotLoadSSLLibrary をキ-ワ-ドに探して見ると有難い事に
当 「Q&A掲示板」で
2009/05/27(水) Delphi5とindy10の組み合わせでgmailに送信 と言う質問を捜すことが出来ました。
indyは過去にも多くの方を悩せているのですね。
ここでのご回答も参照しつつ、
とりあえずは、「 outlook 」で代行運転しているし、ぼちぼちやりたいとおもいます。
それにしても、喉にささった小骨のようです。
有難うございました。
皆様、ご心配をおかけしました。
私のindy坊やが帰ってくるようになりました。
先日、ご報告しました、 当「Q&A掲示板」( 2009/05/27(水))の中で、
2009/06/28(日) 18:43:45 「ak」さんが回答されている内容を手がかりに
openssl-0.9.8h-i386-win32-Indy-IntraWebEdition.zip をダウンロ-ドしてみたところ
IdSSLOpenSSLHeaders10.pasと2つのDLL(libeay32.dll・ssleay32.dll)が内包されています。
IdSSLOpenSSLHeaders.pas は、新しいindy10ですでにインスト-ルしていますので、何もしないで
2つのDLL(libeay32.dll・ssleay32.dll)だけを、添付ファイル付きメ-ルを実行するデレクトリ-にコピ-していれたところ上手くいくようになりました。
単体としても、他のプログラムから呼び出してもOKです。
ただし、Monaa 様から、ご指摘いただきましたように添付ファイルのアドレスに日本語があるとだめみたいです。
私の場合 「C:\DFwork3\レシピ下さい\bZip\Re01E111114001cm.zip」 の中の 「レシピ下さい」がだめです。
とりあえず、windows xp delphi7 indy10 でうまくいきそうな プログラムを置かせてください。
//内容は、dekoさんのサンプルを参考に
//http://ht-deko.minim.ne.jp/tech057.html#tech112
//添付ファイルの処理をを付け加えたものです
//SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
procedure TMail_Send2F.IdMessage_InitializeISO(var VHeaderEncoding: Char; var VCharSet: string);
begin
VHeaderEncoding := 'B';
VCharSet := 'UTF-8';
end;
procedure TMail_Send2F.GMail_Send;
var
SMTP: TIdSMTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
Msg : TIdMessage;
asubject,abody,aattach:String;
Adr_Frm,Adr_To,PasWd:String;
begin
asubject:=Mail_subjectMake(MailSendSw,edtSubject.Text); // 単に subjectを作っているだけ
abody :=memBody.Text; // jconvert.ConvertJCode
// delphi7 indy10 になってから日本語変換は要らない ? 変換すると化ける
//cccccccccccccccccccccccccccccccccc
Adr_Frm:=NowHos.MlAdr; //送信元
Adr_To :=NowIri.i_MlAdr; //送信先
PasWd :=NowHos.Paswd;
//SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
SMTP := TIdSMTP.Create(nil);
try
SMTP.Host :=NowHos.Shost; // smtp.gmail.com
SMTP.Port :=patoi(NowHos.Sport); // 587
SMTP.Username :=NowHos.Yname;
SMTP.Password :=NowHos.Paswd;
SSL := TIdSSLIOHandlerSocketOpenSSL.Create;
try
SSL.Host := SMTP.Host; // smto.gmail.com
SSL.Port := SMTP.Port; // 587
SSL.Destination :=format('%s:%d',[ SSL.Host, SSL.Port ] );
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseExplicitTLS;
//SSSSSSS 送信 SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
if SMTP.Connected then SMTP.Disconnect;
try
SMTP.Connect;
try
Msg := TIdMessage.Create(SMTP);
try
with Msg do begin
OnInitializeISO := IdMessage_InitializeISO;
ContentType := 'text/plain';
CharSet := 'UTF-8';
ContentTransferEncoding := 'BASE64'; // (7bit)
From.Name := Adr_Frm;
From.Address := Adr_Frm;
Recipients.EMailAddresses := Adr_To;
Subject := asubject;
Body.Text := abody;
end;
// TTTTTT 添付ファイルの処理 TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
aattach:= edtAttach.Text;
if aattach <> '' then begin
msg.ContentType := 'multipart/mixed';
with TIdAttachmentFile.Create(Msg.MessageParts,aattach) do begin
FileName:=JConvert.ConvertJCode(ExtractFileName(aattach), JIS_OUT);
end;
end;
//ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
/// SousinCk(1);
SMTP.Send(msg);
except on E:Exception do
//StatusMemo.Lines.Insert(0, 'ERROR: ' + E.Message);
end;
finally
Msg.Free;
end;
finally
SMTP.Disconnect;
end;
finally
SSL.Free;
end;
finally
SMTP.Free;
ShowMessage('送信完了しました。');
end;
end;
//EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
Monaa 様のご助言が無ければ、くじけて
喉に小骨を刺したまま年をこしたかも知れません。
管理人様、誰かが付けた、解決のマ-クを外していただき、チャンスをいただけた事を感謝します。
問題が無い見たいので、完全解決といたします。
indy坊やと共にどうも、有難うございました。メリ-・クリスマス。
ツイート | ![]() |