Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 193. – emailový klient v Indy podruhé

Jan Šindelář 20.7.2005

Hromadí se mi v poště dotazy na komponenty Indy a i když jsem nečekal, že se budeme k tématu emailového klienta vracet, okolnosti mě k tomu nutí. Především začátečníkům tedy dovysvětlím některé detaily odesílání pošty zejména v souvislosti s přílohami.

Nejprve všem doporučím přečíst si kapitolu č. 177, ve které jsme si ukázali základní práci s komponentami IdSMTP a IdMessage. Můžeme rovněž použít hotový projekt z tohoto dílu jako základ pro projekt dnešní.

Pokud si chcete ušetřit čas a nebo jste již článek četli, nabízím krátké shrnutí. Na formulář si připravte několik editboxů pro vyplnění údajů jako je adresát, subjekt a tělo zprávy. Samozřejmě můžete přidat i políčko pro kopii, skrytou kopii, důležitost a další vlastnosti, které emailová zpráva může mít. Na formulář poté umístíme zmiňované komponenty IdSMTP a IdMessage a jsme připraveni odesílat poštu.

Dnes si příklad vylepšíme navíc o možnost přidat k emailu přílohu. To znamená přidat další editbox, kam zadáme cestu k souboru, ale ještě lépe tlačítko a OpenDialog. Máme-li takto připravený formulář, je na čase nastavit správně komponentu IdSMTP. Musíme vyplnit zejména položku Host adresou vašeho SMTP serveru a v případě potřeby autentifikace rovněž uživatelské jméno (Username) a heslo (Password). Navíc nezapomeňte nastavit hodnotu položky AuthenticationType na atLogin.

Nyní zbývá již jen přidat na formulář tlačítko pro odeslání emailu, v jehož události OnClick bude hlavní výkonný kód. Je velmi podobný již zmiňovanému kódu z původního článku, ale tentokrát je pro nás důležitá zejména část pro přidání přílohy. K tomu využijeme typ TIdAttachment a použití je velmi jednoduché. Stačí jako parametr specifikovat příslušnou komponentu IdMessage a pochopitelně cestu k danému souboru.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdMessage, IdComponent,
  IdTCPConnection, IdTCPClient, IdMessageClient, IdSMTP;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Edit3: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    Label4: TLabel;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    IdMessage1: TIdMessage;
    IdSMTP1: TIdSMTP;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
  IdMessage1.Recipients.EMailAddresses := Edit1.Text;
  IdMessage1.Subject := Edit2.Text;
  IdMessage1.Body.Text := Memo1.Text;
  if FileExists(Edit3.Text) then TIdAttachment.Create(IdMessage1.MessageParts, Edit3.Text);
  try
    try
      IdSMTP1.Connect(10000);
      IdSMTP1.Send(IdMessage1);
      ShowMessage(`Email úspěšně odeslán`);
    except on E:Exception do ShowMessage(`ERROR: ` + E.Message);
    end;
  finally
    if IdSMTP1.Connected then IdSMTP1.Disconnect;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then Edit3.Text := OpenDialog1.FileName;
end;

end.

Příklad je velmi jednoduchý, v reálné aplikaci by bylo pochopitelně vhodné uživatelské prostředí příslušně upravit tak, aby bylo možné přidávat k emailu více příloh a pochopitelně je také odebírat. V případě dalších dotazů doporučuji prostudovat nápovědu k Indy komponentám, která se při standardní instalaci integruje přímo do Delphi. Můžete si tak o třídě TIdAttachment přečíst ještě několik dalších podrobností.

I tentokrát si ukázkový projekt můžete stáhnout zde. Nezapomeňte však vyplnit parametry komponenty IdSMTP, kterou jsem nechal z pochopitelných důvodů prázdnou.