我使用此代码通过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
...
调用堆栈是:
OnlineArmor是我的防火墙!!!!!我不想这么快责怪它......但是它是否可能是这个AV的根源?
我正在使用:
此SSL DLL:http://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
德尔福XE
Indy 10
答案 0 :(得分:0)
我通过卸载Online Armor的所有部分解决了这个问题。该代码现在也可以在Delphi中运行!课程没学到!几年前我和卡巴斯基有过类似的问题。
谢谢大家的建议。我的想法是关于fulgan DLL的。我永远不会想到卸载防火墙!