Iako je covek izgleda resio problem sa SMTP engine-om, mozda treba jos nesto napisati zbog ostalih kojima ce mozda zatrebati.
SMTP engine izgleda direktno kontaktira SMTP server preko porta 25, sto i nije bas dobra ideja. Zbog ogromnog broja raznih spammera i trojanskih konja svaka ozbiljnija firma ima port 25 ili skroz zatvoren ili otvoren samo za unutrasnji mail server. Cak ni koriscenje porta 587 ne resava problem, jer je i on obicno zakljucan za koriscenje od strane samo fiksnog mail servera. Cak iako je port 25 otvoren za slanje velika je verovatnoca zbog sve veceg spam problema da ce vasa posta zavrsiti kao junk mail na strani onoga sto prima postu.
Resenje je koriscenje MAPI protokola koji salje postu preko unapred definisanog i poznatog SMTP servera (lokalni exchange ili drugi smtp server), i koji je verovatno poznat i serveru primaoca poruke. Konfiguracija MAPI-ja (server, username, password...) se vrsi iz control panela u windows-u, ali ako imate outlook koji radi onda je MAPI vec podesen.
Kod koji salje postu sa attachmentom preko mapija (potrebno je dodati MAPI u USES clause):
Code:
function SendMail(RecipientEMail: String; RecipientName: String = ''; Subject: String = '';
Body: String = ''; FileName: String = ''; SenderName: String = '';
SenderEMail: String = ''): Integer;
var
Msg: TMapiMessage;
Sender, Recipient: TMapiRecipDesc;
FileAttachment: TMapiFileDesc;
SendMailFunc: TFNMapiSendMail;
MAPIModule: HModule;
begin
FillChar(Msg, SizeOf(Msg), 0);
with Msg do
begin
if Subject <> '' then
lpszSubject := PChar(Subject);
if Body <> '' then
lpszNoteText := PChar(Body);
if (SenderEmail <> '') then
begin
Sender.ulRecipClass := MAPI_ORIG;
if (SenderName = '') then
Sender.lpszName := PChar(SenderEMail)
else
Sender.lpszName := PChar(SenderName);
Sender.lpszAddress := PChar(SenderEmail);
Sender.ulReserved := 0;
Sender.ulEIDSize := 0;
Sender.lpEntryID := nil;
lpOriginator := @Sender;
end;
if (RecipientEmail <> '') then
begin
Recipient.ulRecipClass := MAPI_TO;
if (RecipientName = '') then
Recipient.lpszName := PChar(RecipientEMail)
else
Recipient.lpszName := PChar(RecipientName);
Recipient.lpszAddress := PChar(RecipientEmail);
Recipient.lpszAddress := PChar('');
Recipient.ulReserved := 0;
Recipient.ulEIDSize := 0;
Recipient.lpEntryID := nil;
nRecipCount := 1;
lpRecips := @Recipient;
end
else
lpRecips := nil;
if FileName = '' then
begin
nFileCount := 0;
lpFiles := nil;
end
else
begin
FillChar(FileAttachment, SizeOf(FileAttachment), 0);
FileAttachment.nPosition := Cardinal($FFFFFFFF);
FileAttachment.lpszPathName := PChar(FileName);
nFileCount := 1;
lpFiles := @FileAttachment;
end;
end;
MAPIModule := LoadLibrary(PChar(MAPIDLL));
if MAPIModule = 0 then
Result := -1
else
try
@SendMailFunc := GetProcAddress(MAPIModule, 'MAPISendMail');
if @SendMailFunc <> nil then
Result := SendMailFunc(0, Application.Handle, Msg, MAPI_DIALOG or MAPI_LOGON_UI, 0)
else
Result := 1;
finally
FreeLibrary(MAPIModule);
end;
end;
if it walks like a duck and quacks like a duck, it could be a dragon doing a duck
impersonation.