indy10でgmailを送信したい。

[戻る]
デルフィー 2009/05/27(水) 23:03:02 <初心者>
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はダウンロードして、実行ファイルと同じフォルダにおいています。
実行ファイルからですと例外は出ませんが、送信もできません。
何がマズイのでしょうか。どなたか教えていただけませんでしょうか。

とりあえず 2009/05/28(木) 18:10:46
>ですが、必ず「EIdOSSLCouldNotLoadSSLLibraryクラスの例外を生成しました。'Could not load SSL library.'」の例外が発生し、
ということは、必要なDLLが無いか見つからないということだね。

>SSLに必要とされているDLLはダウンロードして、実行ファイルと同じフォルダにおいています。
ホントにそうなのかな?

デルフィー 2009/05/30(土) 14:15:01 <初心者>
とりあえずさん、resありがとうございます。

何度も調べましたが、やはりdllは存在しています。
「例外」なので、無視するようにしてやればメールが無事終了した挙動にはなるのですが、実際には送信されていません。
また、ステップ実行では、特にconnectの過程でもエラーは生じていないようです(普通にスルーしている)。

では 2009/05/30(土) 14:22:37
DLLの例外は横に置いといて、
もう一つはっきり確認しておきたいことは、
「Gmail宛に送信する」のか
「GmailのSMTPサーバーを使って送信する」のか
どっちなのかな?

デルフィー 2009/05/30(土) 19:01:15 <初心者>
ではさん? resありがとうございます。

gmailのサーバーを使って、メールを送信したいです。
あて先は間違いなく存在しているybbやdocomo等のメールです。

その後気づいたのですが、

'209.85.***.***' に SMTP 接続をオープンできません
Connect: 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。 (10060)
(***はipアドレスが入っています。)

というメッセージが返されてきています。
でも、送ろうとしているあて先、送信元として設定しているアドレスやアカウントは他のメーラーで使っているものであり、そちらでは普通に送信できているのです。

まず 2009/05/31(日) 13:25:20
Indyのバージョンだけど、10.2.0.3よりも古いバージョンを使ってる
みたいだね。
最新バージョン(10.5.5?)にアップした方がいいと思うよ。
そうすれば、送信時刻が日本時間になるし、SubjectやFromも
JConvertでエンコードせずにShiftJisのままでいける。
あと、SASLは必要ないし、現在のGmailはutUseExplicitTLSをサポート
していない。

DEKO 2009/06/01(月) 19:46:05
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/06/06(土) 00:09:22 <初心者>
皆さん、色々とありがとうございます。

教えていただいた情報を加味して試験をしてみましたが、やっぱりダメです。
結局、 2009/05/30(土) 19:01:15 の状態から進歩しません...

とりあえず、途中経過まで。

こんなのは? 2009/06/06(土) 17:39:20
全くIndyとは関係ありませんで、横道にそれるかも知れませんが。

以下のものはダメですか?
(BSMTP DLL)
http://www.hi-ho.ne.jp/babaq/index.html

Delphiからは、DLLで利用します。

デルフィーさんがやりたいのと違うので役立たずかもしれませんが
参考までに...

因みに、私はローカル言語はDelphiオンリーで大好きですが、Delphi付属の
インターネット関連のコンポは好きではありません。
(癖があったり、バグったり、サポートが変わったり・・・)

ところで 2009/06/10(水) 09:31:42
>教えていただいた情報を加味して試験をしてみましたが、やっぱりダメです。
>結局、 2009/05/30(土) 19:01:15 の状態から進歩しません...

この↓問題がまだ解決してないんじゃないの?
>必ず「EIdOSSLCouldNotLoadSSLLibraryクラスの例外を生成しました。'Could not load SSL library.'」の例外が発生し、

take 2009/06/10(水) 10:49:58 <上級者>
>送信元として設定しているアドレスやアカウントは他のメーラーで使っているものであり
とありますがGmailのアカウントをOutlookとかに登録して
その環境でGmailのSMTPが使えるかどうかは確認済みですよね?

セキュリティソフトの設定によってははじかれる場合もあるようですので

デルフィー 2009/06/13(土) 00:13:46 <初心者>
皆さん、色々とありがとうございます。
BSMTP DLLは使ったことがないので(BASP21をVBAから事はありますが)興味はありますが、とりあえず今の問題点を先に解決したいと思います。

takeさん、アカウントは秀丸やEdMaxで使用しているので、問題はずです。

DEKO 2009/06/13(土) 04:04:09
繰り返しになりますが、Indy の正確なバージョンは何なのでしょう?

DEKO 2009/06/14(日) 02:50:00
既に発言された、皆さんの情報をまとめると

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.これでもダメならアカウントの記述やセキュリティ対策ソフトを疑ってみる。

このような感じになります。

ak 2009/06/28(日) 18:43:45
横から失礼します。

質問者さんと全く同じ状況で、全く同じエラーに悩んでいましたが
こちらの情報を参考に以下のようにする事で
無事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.を上げる方が良策かとは思います。

追加発言(4ヶ月以上古い記事に書き込めません。)
■ お名前(ペンネーム可)
  
■ メールアドレス(省略可、半角で入力)
  
■ ホームページアドレス(省略可、半角で入力)
  
■ 発言(エラー時再送信禁止)
  ←解決時は質問者本人がここをチェックしてください。
  
■ 書き込み認証キーを入力して下さい(下記のキーを指定して下さい)
  認証キー :   
  認証キー(確認入力用) :   
■ あなたのランクを選択して下さい(省略可)
   なし   初心者    中級者    上級者    常連    IP表示

  

Programming Library