indy10でgmailを送信したい。


デルフィー  2009-05-28 08:03:02  No: 34530

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-29 03:10:46  No: 34531

>ですが、必ず「EIdOSSLCouldNotLoadSSLLibraryクラスの例外を生成しました。'Could not load SSL library.'」の例外が発生し、
ということは、必要なDLLが無いか見つからないということだね。

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


デルフィー  2009-05-30 23:15:01  No: 34532

とりあえずさん、resありがとうございます。

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


では  2009-05-30 23:22:37  No: 34533

DLLの例外は横に置いといて、
もう一つはっきり確認しておきたいことは、
「Gmail宛に送信する」のか
「GmailのSMTPサーバーを使って送信する」のか
どっちなのかな?


デルフィー  2009-05-31 04:01:15  No: 34534

ではさん?  resありがとうございます。

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

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

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

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


まず  2009-05-31 22:25:20  No: 34535

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


DEKO  2009-06-02 04:46:05  No: 34536

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 09:09:22  No: 34537

皆さん、色々とありがとうございます。

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

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


こんなのは?  2009-06-07 02:39:20  No: 34538

全くIndyとは関係ありませんで、横道にそれるかも知れませんが。

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

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

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

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


ところで  2009-06-10 18:31:42  No: 34539

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

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


take  2009-06-10 19:49:58  No: 34540

>送信元として設定しているアドレスやアカウントは他のメーラーで使っているものであり
とありますがGmailのアカウントをOutlookとかに登録して
その環境でGmailのSMTPが使えるかどうかは確認済みですよね?

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


デルフィー  2009-06-13 09:13:46  No: 34541

皆さん、色々とありがとうございます。
BSMTP DLLは使ったことがないので(BASP21をVBAから事はありますが)興味はありますが、とりあえず今の問題点を先に解決したいと思います。

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


DEKO  2009-06-13 13:04:09  No: 34542

繰り返しになりますが、Indy の正確なバージョンは何なのでしょう?


DEKO  2009-06-14 11:50:00  No: 34543

既に発言された、皆さんの情報をまとめると

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-29 03:43:45  No: 34544

横から失礼します。

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加