unit Msg;

interface

uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   StdCtrls, ComCtrls, ExtCtrls, Grids, Buttons, Menus, IdBaseComponent,
   IdMessage, IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient,
   IdSMTP, ImgList;

type
   TfrmMessageEditor = class(TForm)
      bbtnAdvanced: TBitBtn;
      bbtnCancel: TBitBtn;
      bbtnOk: TBitBtn;
      btnAttachment: TBitBtn;
      cboPriority: TComboBox;
      chkReturnReciept: TCheckBox;
      edtSubject: TEdit;
      edtTo: TEdit;
      grpAttachment: TGroupBox;
      IdMsgSend: TIdMessage;
      lblPriority: TLabel;
      lblSubject: TLabel;
      lblTo: TLabel;
      lvFiles: TListView;
      Memo1: TMemo;
      pnlBottom: TPanel;
      pnlButtons: TPanel;
      pnlMainDetails: TPanel;
      pnlSmallButtons: TPanel;
      pnlTop: TPanel;
      pnlTopLeft: TPanel;
    SMTP: TIdSMTP;
    OpenDialog1: TOpenDialog;
    StatusBar1: TStatusBar;
    Button1: TButton;
    cmCounts: TComboBox;
    edtName: TEdit;
    lblName: TLabel;
      procedure bbtnAdvancedClick(Sender: TObject);
      procedure bbtnOkClick(Sender: TObject);
      procedure btnAttachmentClick(Sender: TObject);
      procedure FormCreate(Sender: TObject);
    procedure SMTPStatus(ASender: TObject; const AStatus: TIdStatus;
      const AStatusText: String);
    procedure Button1Click(Sender: TObject);
    procedure cmCountsChange(Sender: TObject);
    procedure bbtnCancelClick(Sender: TObject);




   private
   procedure ShowRecords;
   procedure LoadRecord(Num : Longint);
   procedure ResetAttachmentListView;
   procedure ReadConfiguration;
   public
    { Public declarations }
   end;

   { w tym rekordzie przechowywane będą dane  }
  TDatBase = packed record
    Mail  : String[30]; // e-mail
    name : string[30]; //nazwa
   end;
const DatName = 'data.dbt';  // w tym pliku przechowywane będą dane




var
   frmMessageEditor: TfrmMessageEditor;
   SmtpServerName: String;
   SmtpServerPort: Integer;
   SmtpServerUser: String;
   SmtpServerPassword: String;
   UserEmail: String;

implementation
uses inifiles,setup;

{$R *.DFM}

procedure TfrmMessageEditor.bbtnOkClick(Sender: TObject);
begin
    with IdMsgSend do
     begin
      IdMsgSend.Body.Assign(Memo1.Lines);
        IdMsgSend.From.Text := UserEmail;
         IdMsgSend.ReplyTo.EMailAddresses := UserEmail;
         IdMsgSend.Recipients.EMailAddresses := edtTo.Text; { do: naglowek }
         IdMsgSend.Subject := edtSubject.Text; { temat: naglowek }
         IdMsgSend.Priority := TIdMessagePriority(cboPriority.ItemIndex); { priorytet wiadomosci }
         if chkReturnReciept.Checked then
            begin { Zaznaczenie o zwrot do nadawcy }
               IdMsgSend.ReceiptRecipient.Text := IdMsgSend.From.Text;
            end
         else
            begin { nie ma zwrotu }
               IdMsgSend.ReceiptRecipient.Text := '';
      end;
end;

  {autoryzacja}

   SMTP.Username := SmtpServerUser;
   SMTP.Password := SmtpServerPassword;

   {glowne dane}
   SMTP.Host := SmtpServerName;
   SMTP.Port := SmtpServerPort;

   {wysylka}
   SMTP.Connect;
   try
      SMTP.Send(IdMsgSend);
   finally
      SMTP.Disconnect;
   end;
end;

procedure TfrmMessageEditor.bbtnAdvancedClick(Sender: TObject);
begin
fmSetup:=TfmSetup.Create(application);
fmSetup.ShowModal;
fmSetup.Free;
end;

procedure TfrmMessageEditor.FormCreate(Sender: TObject);
begin
 ShowRecords; // wyświetl rekordy zapisane w pliku
 cboPriority.ItemIndex := Ord(IdMsgSend.Priority);
  // odczyt konfiguracji z pliku ini
 ReadConfiguration;
 name := 'tfrmMessageeditor';  // ??
end;

procedure tfrmMessageeditor.ReadConfiguration;
var
  MailIni: TIniFile;
begin
  MailIni := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Mail.ini');
  with MailIni do begin


    SmtpServerName := ReadString('Smtp', 'ServerName', 'wpisz swoj serwer');
    SmtpServerPort := StrToInt(ReadString('Smtp', 'ServerPort', '25'));
    SmtpServerUser := ReadString('Smtp', 'ServerUser', 'twoj login');
    SmtpServerPassword := ReadString('Smtp', 'ServerPassword', 'twoje haslo');
    UserEmail := ReadString('Email', 'PersonalEmail', 'twojanazwa@twojserwer.pl');
  end;
  MailIni.Free;
end;

procedure TfrmMessageEditor.btnAttachmentClick(Sender: TObject);
begin
   if OpenDialog1.Execute then
      begin
         TIdAttachment.Create(IdMsgSend.MessageParts, OpenDialog1.FileName);
         ResetAttachmentListView;
      end;
end;

procedure TfrmMessageEditor.ResetAttachmentListView;
var li: TListItem;
   idx: Integer;
begin
   lvFiles.Items.Clear;
   for idx := 0 to Pred(IdMsgSend.MessageParts.Count) do
      begin
         li := lvFiles.Items.Add;
         if IdMsgSend.MessageParts.Items[idx] is TIdAttachment then
            begin
               li.ImageIndex := 0;
               li.Caption := TIdAttachment(IdMsgSend.MessageParts.Items[idx]).Filename;
               li.SubItems.Add(TIdAttachment(IdMsgSend.MessageParts.Items[idx]).ContentType);
            end
         else
            begin
               li.ImageIndex := 1;
               li.Caption := IdMsgSend.MessageParts.Items[idx].ContentType;
            end;
      end;
end;
procedure TfrmMessageEditor.SMTPStatus(ASender: TObject;
  const AStatus: TIdStatus; const AStatusText: String);
begin
statusbar1.SimpleText:=astatustext;
end;

procedure TfrmMessageEditor.Button1Click(Sender: TObject);
 var
  DatBase : file of TDatBase;  // plik typowany
  DB : TDatBase;
  FSize : Integer;
begin
  AssignFile(DatBase, DatName);
  if not FileExists(DatName) then // jeżeli plik nie istnieje...
    ReWrite(DatBase){ stworz go } else ReSet(DatBase); // w przeciwnym wypadku - otwórz

  FSize := FileSize(DatBase); // odczytaj rozmiar pliku
  if FSize > 0 then  // jeżeli cos już w nim jest zapisane...
    Seek(DatBase, FSize); // przesuń na sam koniec

 { przypisz wszystkie dane z komponentów do rekordu  }
  DB.Mail := edtto.Text;
  db.name := edtName.Text;
  Write(DatBase, DB); // zapisz rekord do pliku
  CloseFile(DatBase); // zamknij
  ShowRecords; // odśwież listę rekordów
end;

procedure TfrmMessageEditor.ShowRecords;
var
  DatBase : file of TDatBase;
  I : Integer;
begin
  AssignFile(DatBase, DatName);
  if not FileExists(DatName) then Exit else
    Reset(DatBase);

  cmCounts.Clear; // czyść listę rekordów, które są w pliku

  {  odczytaj ilość rekordów i wczytaj do listy }
  for I := 0 to FileSize(DatBase) -1 do
    cmCounts.Items.Add(edtName.Text);
  CloseFile(DatBase);
end;

procedure tfrmmessageeditor.LoadRecord(Num: Integer);
var
  DatBase : file of TDatBase;
  DB : TDatBase;
begin
  AssignFile(DatBase, DatName);
  Reset(DatBase);

  Seek(DatBase, Num); // przesuń na rekord, który chcesz odczytać
  Read(DatBase, DB);  // odczytaj do rekordu
  { przypisz dane z rekordu do komponentów }
  with DB do
  begin
    edtto.Text := Mail;
    edtname.Text := name;
  end;
  CloseFile(DatBase);
end;


procedure TfrmMessageEditor.cmCountsChange(Sender: TObject);
begin
// załaduj rekord, który został wybrany z listy
// właściwość ItemIndex komponentu określa numer pozycji, która została kwiknięta
  LoadRecord(cmCounts.ItemIndex);

end;

procedure TfrmMessageEditor.bbtnCancelClick(Sender: TObject);
begin
frmmessageeditor.Free
end;

end.

