Zasílání mailů 1 - MAPI

vložil Radek Červinka 7. prosince 2010 22:57

Někdy je třeba z aplikace umožnit zaslání mailu uživatelem. Nejjednodušší (ale ne vždy použitelný, protože ne každý má instalovaného klienta) způsob je přes MAPI (Mail API).

Jedná se o dlouho používané rozhraní pro práci s nainstalovaným poštovním klientem a je podporované prakticky všemi klienty (Outlook, Outlook Express, Thunderbird, Opera, SeaMonkey atd). V současnosti se někdy nazývá spíše Simple MAPI, jelikož MS ve své neskonalé moudrosti spolu s Outlookem přivedl další rozhraní MAPI, které je ale pouze pro spolupráci s ním (i když i Outlook podporuje Simple MAPI).

Pro rozlišení je toto nové MAPI nazýváno Extended MAPI a kromě opravdu velkých možností se vyznačuje tím, že nesmí být používáno z .NET (MAPI v .NET, KB 813349).

Více o Simple MAPI a spol. - KB 200018.

Ale zpět Simple MAPI a Delphi. Nejjednodušeji přes JCL a jednotku JclMapi. Jak by řekl Pohlreich - je to jednoduché jak žebřík.

var
  oJclEmail: TJclEmail;
begin
  oJclEmail := TJclEmail.Create;
  oJclEmail.Recipients.Add('radekc@nekde.cz', 'Radek Někde'); //To
  oJclEmail.Recipients.Add('pavel@neco.cz', 'Pavel', rkCC); //CC
  oJclEmail.Subject := 'Testovací mail'; // předmět
  oJclEmail.Attachments.Add('c:\test.pdf'); // nějaká příloha
  // text zpravy
  oJclEmail.Body := 'Tělo mailu. '+#13#10+'S pozdravem mailer'; 
  oJclEmail.Send(True); // zobraz dialog před posláním
  oJclEmail.Free; 
end;

Příště zkusíme něco složitějšího.

Tagy: ,

Praxe

Komentáře

8.12.2010 0:05:58 #

pingback

Pingback from topsy.com

Twitter Trackbacks for
        
        Delphi.cz | ZasĂ­lánĂ­ mailĹŻ 1 - MAPI
        [delphi.cz]
        on Topsy.com

topsy.com

8.12.2010 8:56:34 #

pepak

To vypadá fakt o hodně jednodušeji než přímo s MAPI. Na druhou stranu, přímý přístup si vystačí i bez cizích komponent a když se to nějak rozumně obalí jednoduchou funkcí, tak to nemusí být o moc složitější...

<pre>
uses MAPI;

function SendMail(const Recipients: array of string; const Sender, Subject, Body: string; const Attachments: array of string; ShowDialog: boolean): Boolean;

  procedure SetupRecipient(var Rec: TMapiRecipDesc; const EMailAddress: PChar; RecipClass: integer);
    begin
      FillChar(Rec, Sizeof(Rec), 0);
      Rec.lpszName := EMailAddress;
      Rec.lpszAddress := EmailAddress;
      Rec.ulRecipClass := RecipClass;
    end;

var
  msg : TMapiMessage;
  mrdSender: TMapiRecipDesc;
  mrdRecipients: packed array of TMapiRecipDesc;
  mfdAttachments: packed array of TMapiFileDesc;
  i, Flags: integer;
begin
  SetupRecipient(mrdSender, PChar(Sender), MAPI_ORIG);
  SetLength(mrdRecipients, Length(Recipients));
  for i := 0 to Pred(Length(Recipients)) do
    SetupRecipient(mrdRecipients[i], PChar(Recipients[i]), MAPI_TO);
  FillChar(msg, Sizeof(msg), 0);
  msg.lpszSubject := PChar(Subject);
  msg.lpszNoteText := PChar(Body {+ StringOfChar('*', Length(Attachments))});
  msg.lpOriginator := @mrdSender;
  msg.nRecipCount := Length(mrdRecipients);
  msg.lpRecips := @mrdRecipients[0];
  if Length(Attachments) > 0 then
    begin
    SetLength(mfdAttachments, Length(Attachments));
    for i := 0 to Pred(Length(Attachments)) do
      begin
      FillChar(mfdAttachments[i], Sizeof(mfdAttachments[i]), 0);
      mfdAttachments[i].nPosition := Length(Body) + i;
      mfdAttachments[i].lpszPathName := PChar(Attachments[i]);
      end;
    msg.nFileCount := Length(Attachments);
    msg.lpFiles := @mfdAttachments[0];
    end;
  if ShowDialog then
    Flags := MAPI_DIALOG
  else
    Flags := 0;
  Result := MapiSendMail(0, Application.Handle, msg, Flags, 0) = 0;
end;

// ---- Pouziti ----------------------------------------

if SendMail(['delphi@delphi.cz', 'delphi.cz@pepak.net', 'Posílám program', 'Ahoj, tady je ten program, co jsem ti slíbil', ['c:\tmp\program.zip', 'c:\tmp\program-zdrojak.zip'], True) then
  ShowMessage('V pořádku odesláno')
else
  ShowMessage('Chyba při odesílání');
</pre>

pepak

8.12.2010 8:57:27 #

pepak

No a pochopitelně to i po kontrole zvrtám. Na konci, jak je if SendMail, tak mi za delphi.cz' chybí pravá hranatá závorka.

pepak

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců