Я задал предыдущие вопросы о отправке писем с вложениями с Indy через GMail, и я рад сказать, что базовый код работает правильно. Однако я заметил, что отправка вложений занимает несколько минут, и в это время программа зависает (хотя я добавил компонент TIdAntiFreeze в программу). Я подумал, что было бы неплохо иметь электронное письмо, отправленное отдельным потоком, что позволяет программе реагировать.Отправка электронной почты с помощью Indy через отдельную тему
Мне не удалось найти код в Интернете, который показывает, как отправлять электронную почту из потока, поэтому мне пришлось написать собственный код, который работает только частично.
Я удалил компонент SMTP из формы, которая отправляет электронную почту; вместо этого я сохраняю данные компонента электронной почты на диске (с помощью метода TIdMessage.SaveToFile), а затем создаю немодальный диалог, который создает поток, который создает необходимые компоненты и отправляет электронное письмо. Я хотел бы создать обработчики событий для компонентов SMTP и IdMessage, но не знаю, как это сделать во время выполнения - код потока не может получить доступ к каким-либо методам формы.
Хотя я показываю свой код, я бы предпочел увидеть что-то, что работает правильно.
unit Manage77c;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SizeGrip, ManageForms, ExtCtrls, StdCtrls, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase,
IdMessageClient, IdSMTPBase, IdSMTP, IdIOHandler, IdIOHandlerSocket, IdSSL,
IdIOHandlerStack, IdMessage, IdSSLOpenSSL;
type
TSendAMail = class(TForm)
mem: TMemo;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
public
constructor create (const s: string);
end;
implementation
{$R *.dfm}
var
ahost, apassword, ausername, curstatus, fn: string;
caller: thandle;
function DoEmail (p: pointer): longint; stdcall;
var
ssl: TIdSSLIOHandlerSocketOpenSSL;
email: TIdMessage;
begin
caller:= THandle (p);
email:= TIdMessage.create;
with email do
begin
loadfromfile (fn);
// OnInitializeISO:= ??
end;
deletefile (fn);
ssl:= TIdSSLIOHandlerSocketOpenSSL.create;
ssl.SSLOptions.SSLVersions:= [sslvTLSv1];
with TIdSMTP.create do
try
//OnStatus:= ??
iohandler:= ssl;
host:= ahost;
password:= apassword;
username:= ausername;
port:= 587;
useTLS:= utUseExplicitTLS;
Connect;
try
Send (email);
except
on E:Exception do;
end;
finally
Disconnect;
free
end;
ssl.free;
email.free;
result:= 0
end;
constructor TSendAMail.Create (const s: string);
var
empty: boolean;
thrid: dword;
begin
inherited create (nil);
fn:= s;
repeat
with dm.qGetSMTP do // this part gets the SMTP definitions from the database
begin
open;
aHost:= fieldbyname ('smtphost').asstring;
ausername:= fieldbyname ('smtpuser').asstring;
apassword:= fieldbyname ('smtppass').asstring;
close
end;
empty:= (ahost = '') or (ausername = '') or (apassword = '');
if empty then
with TGetSMTP.create (nil) do // manage77a
try
execute
finally
free
end;
until not empty;
CreateThread (nil, 0, @DoEmail, pointer (self.handle), 0, thrid);
close
end;
procedure TSendAMail.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:= caFree
end;
end.
Поместите форму на [ '«TDataModule»'] (http://docwiki.embarcadero.com/RADStudio/XE3/en/Using_Data_Modules). В любом случае, никакого взаимодействия с графическим интерфейсом нет. –