Delphi5とindy10の組み合わせでgmailに送信をしたいのですが、どうしてもうまく行きません。
過去ログやcodezineなどのソースをサンプルにして、下記のようなコードを書いてみました。
procedure Tform1.MailSender;
var
hdAttach : string;
Msg : TIdMessage;
SMTP : TIdSMTP;
Login : TIdSASLLogin;
Provider : TIdUserPassProvider;
begin
// 初期化
SMTP := TIdSMTP.Create(nil);
Login := TIdSASLLogin.Create(SMTP);
Provider := TIdUserPassProvider.Create(Login);
Login.UserPassProvider := Provider;
Provider.Username := edtUserID.Text;
Provider.Password := edtPassword.Text;
SMTP.SASLMechanisms.Add.SASL := Login;
//SMTP.AuthType := atSASL;
SMTP.AuthType := atDefault;
SMTP.Host :=edtServer.Text;
SMTP.Port := StrToInt(edtPort.Text);
SMTP.IOHandler := SSLHandler;
SMTP.UseTLS := utUseExplicitTLS;
// IdMessageのセット
Msg := TIdMessage.Create(SMTP);
Msg.From.Name := jConvert.CreateHeaderString(edtFrom.Text);
Msg.From.Address := jConvert.CreateHeaderString(edtReply.Text);
Msg.Recipients.EMailAddresses := edtTO.Text;
Msg.CCList.EMailAddresses := edtCC.Text;
Msg.BccList.EMailAddresses := edtBCC.Text;
Msg.Subject := jConvert.CreateHeaderString(edtSubject.Text);
Msg.Body.Text := jConvert.ConvertJCode(memBody.Lines.Text, JIS_OUT);
Try
try
SMTP.Connect;
SMTP.Authenticate;
SMTP.Send(Msg);
except on exception do
begin
ShowMessage('メール送信に失敗しました');
end;
end;
Finally
if SMTP.Connected then
SMTP.Disconnect;
Msg.Free;
Provider.Free;
Login.Free;
SMTP.Free;
end;
end;
ですが、必ず「EIdOSSLCouldNotLoadSSLLibraryクラスの例外を生成しました。'Could not load SSL library.'」の例外が発生し、
constructor TIdSSLContext.Create;
begin
inherited Create;
if DLLLoadCount <= 0 then begin
if not IdSSLOpenSSL.LoadOpenSLLibrary then begin
raise EIdOSSLCouldNotLoadSSLLibrary.Create(RSOSSLCouldNotLoadSSLLibrary);
end;
end;
Inc(DLLLoadCount);
fVerifyMode := [];
fMode := sslmUnassigned;
fSessionId := 1;
end;
の部分が表示されて止まってしまいます。
SSLに必要とされているDLLはダウンロードして、実行ファイルと同じフォルダにおいています。
実行ファイルからですと例外は出ませんが、送信もできません。
何がマズイのでしょうか。どなたか教えていただけませんでしょうか。
>ですが、必ず「EIdOSSLCouldNotLoadSSLLibraryクラスの例外を生成しました。'Could not load SSL library.'」の例外が発生し、
ということは、必要なDLLが無いか見つからないということだね。
>SSLに必要とされているDLLはダウンロードして、実行ファイルと同じフォルダにおいています。
ホントにそうなのかな?
とりあえずさん、resありがとうございます。
何度も調べましたが、やはりdllは存在しています。
「例外」なので、無視するようにしてやればメールが無事終了した挙動にはなるのですが、実際には送信されていません。
また、ステップ実行では、特にconnectの過程でもエラーは生じていないようです(普通にスルーしている)。
DLLの例外は横に置いといて、
もう一つはっきり確認しておきたいことは、
「Gmail宛に送信する」のか
「GmailのSMTPサーバーを使って送信する」のか
どっちなのかな?
ではさん? resありがとうございます。
gmailのサーバーを使って、メールを送信したいです。
あて先は間違いなく存在しているybbやdocomo等のメールです。
その後気づいたのですが、
'209.85.***.***' に SMTP 接続をオープンできません
Connect: 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。 (10060)
(***はipアドレスが入っています。)
というメッセージが返されてきています。
でも、送ろうとしているあて先、送信元として設定しているアドレスやアカウントは他のメーラーで使っているものであり、そちらでは普通に送信できているのです。
Indyのバージョンだけど、10.2.0.3よりも古いバージョンを使ってる
みたいだね。
最新バージョン(10.5.5?)にアップした方がいいと思うよ。
そうすれば、送信時刻が日本時間になるし、SubjectやFromも
JConvertでエンコードせずにShiftJisのままでいける。
あと、SASLは必要ないし、現在のGmailはutUseExplicitTLSをサポート
していない。
http://mail.google.com/support/bin/answer.py?hl=jp&answer=13287
SMTPサーバ: smtp.gmail.com
SMTPポート: 587
アカウント名: xxxxx@gmail.com
パスワード: (パスワード)
以上を IdSMTP に設定し、SSL を使えばメール送信できると思います。
> SMTP.IOHandler := SSLHandler;
SSLHandler の設定はどうなっているのでしょう?
Marco Cantu さんの Tips を参考に、SSL の記述を確認してみて下さい。
http://www.marcocantu.com/tips/oct06_gmail.html
SSL := TIdSSLIOHandlerSocketOpenSSL.Create;
SSL.Host := SMTP.Host;
SSL.Port := SMTP.Port;
SSL.Destination := SSL.Host + ':' + IntToStr(SSL.Port);
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseExplicitTLS;
多分、こんな感じになると思います。
皆さん、色々とありがとうございます。
教えていただいた情報を加味して試験をしてみましたが、やっぱりダメです。
結局、 2009/05/30(土) 19:01:15 の状態から進歩しません...
とりあえず、途中経過まで。
全くIndyとは関係ありませんで、横道にそれるかも知れませんが。
以下のものはダメですか?
(BSMTP DLL)
http://www.hi-ho.ne.jp/babaq/index.html
Delphiからは、DLLで利用します。
デルフィーさんがやりたいのと違うので役立たずかもしれませんが
参考までに...
因みに、私はローカル言語はDelphiオンリーで大好きですが、Delphi付属の
インターネット関連のコンポは好きではありません。
(癖があったり、バグったり、サポートが変わったり・・・)
>教えていただいた情報を加味して試験をしてみましたが、やっぱりダメです。
>結局、 2009/05/30(土) 19:01:15 の状態から進歩しません...
この↓問題がまだ解決してないんじゃないの?
>必ず「EIdOSSLCouldNotLoadSSLLibraryクラスの例外を生成しました。'Could not load SSL library.'」の例外が発生し、
>送信元として設定しているアドレスやアカウントは他のメーラーで使っているものであり
とありますがGmailのアカウントをOutlookとかに登録して
その環境でGmailのSMTPが使えるかどうかは確認済みですよね?
セキュリティソフトの設定によってははじかれる場合もあるようですので
皆さん、色々とありがとうございます。
BSMTP DLLは使ったことがないので(BASP21をVBAから事はありますが)興味はありますが、とりあえず今の問題点を先に解決したいと思います。
takeさん、アカウントは秀丸やEdMaxで使用しているので、問題はずです。
繰り返しになりますが、Indy の正確なバージョンは何なのでしょう?
既に発言された、皆さんの情報をまとめると
1.最新版の Indy10 をインストール
http://homepage1.nifty.com/ht_deko/tech034.html
2.Indy10 用 の OpenSSL DLL を入手
http://indy.fulgan.com/SSL/
openssl-0.9.8k-i386-win32.zip (2009/06/13時点での最新版)
3.プロジェクトフォルダに上記 DLL を配置
4.コードを記述
uses
..., IdSMTP, IdSSLOpenSSL, IdMessage, IdExplicitTLSClientServerBase;
procedure TForm1.IdMessage_InitializeISO(var VHeaderEncoding: Char;
var VCharSet: string);
begin
VHeaderEncoding := 'B';
VCharSet := 'ISO-2022-JP';
end;
procedure TForm1.Button1Click(Sender: TObject);
var
SMTP: TIdSMTP;
SSL: TIdSSLIOHandlerSocketOpenSSL;
Msg : TIdMessage;
begin
SMTP := TIdSMTP.Create(nil);
try
SMTP.Host := 'smtp.gmail.com';
SMTP.Port := 587;
SMTP.Username := 'hoge@gmail.com'; // UserName
SMTP.Password := 'hogehoge'; // 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 := 'text/plain';
Msg.CharSet := 'ISO-2022-JP';
Msg.ContentTransferEncoding := '7bit';
Msg.From.Name := 'from@gmail.com'; // 送信者
Msg.From.Address := 'from@gmail.com'; // 送信者メールアドレス
Msg.Recipients.EMailAddresses := 'to@gmail.com'; // 宛先メールアドレス
Msg.Subject := 'こんにちは';
Msg.Body.Text := '本文です';
SMTP.Send(Msg);
finally
Msg.Free;
end;
SMTP.Disconnect;
finally
SSL.Free;
end;
finally
SMTP.Free;
end;
end;
5.これでもダメならアカウントの記述やセキュリティ対策ソフトを疑ってみる。
このような感じになります。
横から失礼します。
質問者さんと全く同じ状況で、全く同じエラーに悩んでいましたが
こちらの情報を参考に以下のようにする事で
無事SSL libraryを開くことができ、GMailにて送信する事ができました。
感謝しきりです。
以下、やった事をまとめておきます。ご参考までに
--
自分はTurbo Delphi Explorerを使用していて、IndyのVer.Upが無理だったので
DEKOさんのまとめを基本にしつつ、以下のように対応しました。
※ Indyのver.は10.1.1.
・Indy10用のOpenSSL DLL は、最新版ではなく以下のものをDL
openssl-0.9.8h-i386-win32-Indy-IntraWebEdition.zip
・中身のdllとIdSSLOpenSSLHeaders10.pasをプロジェクトフォルダへ
・IdSSLOpenSSLHeaders10.pasをIdSSLOpenSSLHeaders.pasとリネーム
・usesにIdCoderHeaderを追加
・上のDEKOさんの4.のコードの、IdMessage_InitializeISOを以下のように変更
procedure TForm1.IdMessage_InitializeISO(var VTransferHeader: TTransfer;
var VHeaderEncoding: Char;
var VCharSet: string);
begin
VTransferHeader := bit7;
VHeaderEncoding := 'B';
VCharSet := 'ISO-2022-JP';
end;
これで無事送信できました。
ただ、これだと最新のdllを使えないので
Indyのver.を上げる方が良策かとは思います。
ツイート | ![]() |