通过Google SMTP发送电子邮件

时间:2014-02-27 23:17:46

标签: delphi indy10

我使用此代码通过GMail(加密的SMTP)发送电子邮件。

pocedure TForm5.SendEmail(const Recipients: string; const Subject: string; const Body: string);
var
  Email: TIdMessage;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  Email := TIdMessage.Create(nil);
  SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);

  try
    SSLHandler.MaxLineAction := maException;
    SSLHandler.SSLOptions.Method := sslvSSLv23;
    SSLHandler.SSLOptions.Mode := sslmUnassigned;
    SSLHandler.SSLOptions.VerifyMode := [];
    SSLHandler.SSLOptions.VerifyDepth := 0;

    SMTP.IOHandler := SSLHandler;
    SMTP.Host := 'smtp.gmail.com';
    SMTP.Port := 587;
    SMTP.Username := 'test1@gmail.com';
    SMTP.Password := '**********';
    SMTP.UseTLS := utUseExplicitTLS;

    Email.From.Address := 'test1@gmail.com';
    Email.Recipients.EmailAddresses := Recipients;
    Email.Subject := Subject;
    Email.Body.Text := Body;

    SMTP.Connect;
    if SMTP.Connected then
     begin
      SMTP.Send(Email);
      SMTP.Disconnect;
     end;

  finally
    Email.Free;
    SSLHandler.Free;
  end;
end;

代码在Delphi IDE外部运行,但是如果从IDE内部运行它会给我一个AV:

  

{Project Tester.exe引发了带有消息的异常类$ C0000005   '访问冲突位于0x7672bce7:读取地址0x675919d1'}

我也尝试更改SSLHandler.SSLOptions.Method,但结果相同。

调用堆栈

我不知道我怎么忘了提到关于AV的故事:AV不在上面的代码中。如果我按'Break'它会显示ASM窗口。该程序在kernel32.IsBadReadPtr。

中停止
kernel32.IsBadReadPtr:
769CBCAB 6A0C             push $0c
769CBCAD 6818BD9C76       push $769cbd18
769CBCB2 E8410F0100       call $769dcbf8
769CBCB7 A19460A576       mov eax,[$76a56094]
769CBCBC 8BB02C010000     mov esi,[eax+$0000012c]
769CBCC2 8B450C           mov eax,[ebp+$0c]
769CBCC5 85C0             test eax,eax
769CBCC7 743F             jz $769cbd08
769CBCC9 8B4D08           mov ecx,[ebp+$08]
769CBCCC 85C9             test ecx,ecx
769CBCCE 0F8437BC0200     jz $769f790b
769CBCD4 8D4401FF         lea eax,[ecx+eax-$01]
769CBCD8 89450C           mov [ebp+$0c],eax
769CBCDB 3BC1             cmp eax,ecx
769CBCDD 0F8228BC0200     jb $769f790b
769CBCE3 8365FC00         and dword ptr [ebp-$04],$00
769CBCE7 8A01             mov al,[ecx]         <------------ HERE
769CBCE9 8D56FF           lea edx,[esi-$01]
769CBCEC F7D2             not edx
769CBCEE 8BC2             mov eax,edx
769CBCF0 23C1             and eax,ecx
769CBCF2 8945E4           mov [ebp-$1c],eax
769CBCF5 21550C           and [ebp+$0c],edx
769CBCF8 3B450C           cmp eax,[ebp+$0c]
769CBCFB 0F85FBBB0200     jnz $769f78fc
...

调用堆栈是:

  • Libeay.DLL,
  • Cpruptsp.dll,
  • LoadLibraryEXA,
  • OnlineArmor.DLL,
  • IsBadReadPtr.DLL

OnlineArmor是我的防火墙!!!!!我不想这么快责怪它......但是它是否可能是这个AV的根源?

我正在使用:
  此SSL DLL:http://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
  德尔福XE
  Indy 10

1 个答案:

答案 0 :(得分:0)

我通过卸载Online Armor的所有部分解决了这个问题。该代码现在也可以在Delphi中运行!课程没学到!几年前我和卡巴斯基有过类似的问题。

谢谢大家的建议。我的想法是关于fulgan DLL的。我永远不会想到卸载防火墙!