logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[DELPHI] Wysyłanie emaili - niepoprawne działanie

blue_17 10 Maj 2010 19:10 2955 8
REKLAMA
  • #1 8059618
    blue_17
    Poziom 32  
    Posty: 2414
    Pomógł: 172
    Ocena: 472
    Witam ostatni w dziedzinie delphi dostałem ochrzan na forum i przyniosło to skutki :)

    Za co dziękuję niektórym użytkownikom.

    Chce w swojej aplikacji zastosować wysyłanie e-mail, poszukałem przykładów jak jest to wykonane i znalazłem na komponentach indi. Wszystko było by w porządku gdyby nie to, iż program pomimo pomyślnej kompilacji i wypełnieniu pól wywala błąd po chwili od naciśnięciu przycisku wyślij.

    Zamieszczam kod.

    {
      Copyright (c) 2002 by Adam Boduch <adam@4programmers.net>
    }
    
    unit MainFrm;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, IdMessage, IdBaseComponent, IdComponent,
      IdTCPConnection, IdTCPClient, IdMessageClient, IdSMTP, StdCtrls, Buttons;
    
    type
      TMainForm = class(TForm)
        SMTP: TIdSMTP;
        Message: TIdMessage;
        StatusBar: TStatusBar;
        GroupBox1: TGroupBox;
        lblFrom: TLabel;
        edtFrom: TEdit;
        lblTo: TLabel;
        edtTo: TEdit;
        lblSubject: TLabel;
        edtSubject: TEdit;
        lblBody: TLabel;
        memBody: TMemo;
        btnSend: TSpeedButton;
        GroupBox2: TGroupBox;
        lblHost: TLabel;
        edtHost: TEdit;
        lblPort: TLabel;
        edtPort: TEdit;
        lblLogin: TLabel;
        lblPassword: TLabel;
        edtLogin: TEdit;
        edtPassword: TEdit;
        procedure SMTPConnected(Sender: TObject);
        procedure SMTPDisconnected(Sender: TObject);
        procedure SMTPStatus(ASender: TObject; const AStatus: TIdStatus;
          const AStatusText: String);
        procedure btnSendClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      MainForm: TMainForm;
    
    implementation
    
    {$R *.dfm}
    
    procedure TMainForm.SMTPConnected(Sender: TObject);
    begin
      GroupBox1.Enabled := False;
      GroupBox2.Enabled := False;
    end;
    
    procedure TMainForm.SMTPDisconnected(Sender: TObject);
    begin
      GroupBox1.Enabled := True;
      GroupBox2.Enabled := True;
    end;
    
    procedure TMainForm.SMTPStatus(ASender: TObject; const AStatus: TIdStatus;
      const AStatusText: String);
    begin
      case AStatus of
        hsResolving: StatusBar.SimpleText := 'Wyszukiwanie hosta...';
        hsConnecting: StatusBar.SimpleText := 'Łączenie z serwerem ' + SMTP.Host;
        hsConnected: StatusBar.SimpleText := 'Połączony z serwerem';
        hsDisconnecting: StatusBar.SimpleText := 'Trwa rozłączanie...';
        hsDisconnected: StatusBar.SimpleText := 'Rozłączono';
      end;
    end;
    
    procedure TMainForm.btnSendClick(Sender: TObject);
    begin
    
     if Length(edtLogin.Text) > 0 then // Jeżeli użytkownik wpisał login...
      begin
        SMTP.AuthenticationType := atLogin; //...znaczy to, że serwer wymaga autoryzacji
      { przypisanie właściwości Username (użytkownik) oraz Password (hasło) }
        SMTP.Username := edtLogin.Text;
        SMTP.Password := edtPassword.Text;
      end;
    
      SMTP.Host := edtHost.Text;  // przypisanie adresu
      SMTP.Port := StrToIntDef(edtPort.Text, 25); // przypisanie IP
    
      try
        try
          SMTP.Connect; // próba połączenia się z serwerem
          btnSend.Enabled := False; // dezaktywacja przycisku
    
          Message.Subject := edtSubject.Text; // temat wiadomości
          Message.From.Address := edtFrom.Text; // adres nadawcy
          Message.From.Text := edtFrom.Text;
          Message.From.Name := edtFrom.Text;
    
          
          Message.Recipients.Add;
          Message.Recipients.Items[0].Address := edtTo.Text; // adres odbiorcy
          Message.Recipients.Items[0].Text := edtTo.Text;
          Message.Recipients.Items[0].Name := edtTo.Text;
          
          Message.Body.Assign(memBody.Lines); // pobieranie treści wiadomości
    
          SMTP.Send(Message); // wysyłanie e-maila
        except
        { w razie wystąpienia błędu - wyświetl komunikat }
           raise Exception.Create('Błąd! Nie można połączyć się z serwerem!');
        end;
      finally
      { te instrukcje będa wykonywane ZAWSZE bez względu na ew. wystąpienie błędu }
        btnSend.Enabled := True;
        SMTP.Disconnect;
      end;  
    
    end;
    
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
    
    end;
    
    end.
    
    



    W załączniku znajduję się wersja skompilowana.

    Podejrzewam, że mogą wynikać problemy iż program skrobię w Delphi 7 z 2002r więc mogło się coś pozmieniać.
    Załączniki:
    • p211.rar (210.23 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 8060255
    lanky
    Poziom 17  
    Posty: 149
    Pomógł: 27
    Ocena: 7
    Jak piszesz ze wyskakuje błąd to pisz jaki bo ja też ci mogę powiedzieć ze podałem ci rozwiązanie i zapisałem go na stronie. Pewnie zapytasz na jakiej :P

    Upnij source to zerknę. A *.exe to możesz koledze podesłać xD
  • REKLAMA
  • REKLAMA
  • Pomocny post
    #4 8062286
    lanky
    Poziom 17  
    Posty: 149
    Pomógł: 27
    Ocena: 7
    teraz lepiej:)
    Proszę poprawiłem ci kod. Teraz powinno być dobrze.
    
    procedure TMainForm.btnSendClick(Sender: TObject);
    begin
        SMTP.AuthenticationType := atLogin; //...znaczy to, że serwer wymaga autoryzacji
       { przypisanie właściwości Username (użytkownik) oraz Password (hasło) }
        SMTP.Username := edtLogin.Text;
        SMTP.Password := edtPassword.Text;
        SMTP.Host := edtHost.Text;  // przypisanie adresu
        SMTP.Port := StrToIntDef(edtPort.Text, 25); // przypisanie IP
    
      try
        try
          SMTP.Connect; // próba połączenia się z serwerem
          btnSend.Enabled := False; // dezaktywacja przycisku
          IDMessage.Subject := edtSubject.Text; // temat wiadomości
          IDMessage.From.Address := edtFrom.Text; // adres nadawcy
          IDMessage.From.Text := edtFrom.Text;
          IDMessage.From.Name := edtFrom.Text;
          IDMessage.Recipients.EMailAddresses:= edtTo.Text;
          IDMessage.Body.Append(MemBody.Text);
          SMTP.Send(IDMessage); // wysyłanie e-maila
        except
        { w razie wystąpienia błędu - wyświetl komunikat }
           raise Exception.Create('Błąd! Nie można połączyć się z serwerem!');
        end;
      finally
      { te instrukcje będa wykonywane ZAWSZE bez względu na ew. wystąpienie błędu }
        btnSend.Enabled := True;
        SMTP.Disconnect;
      end;
    
    end;
    
  • REKLAMA
  • #5 8062436
    blue_17
    Poziom 32  
    Posty: 2414
    Pomógł: 172
    Ocena: 472
    Jeszcze nie mogę tego sprawdzić ale chciał bym się dowiedzieć w czym tkwił problem, bo dla kolegi było to oczywiste ale dla mnie nie jest :)

    Reasumując dale nie działa przed kompilacją musiałem zmienić parę rzeczy

    z

     IDMessage.Subject := edtSubject.Text; // temat wiadomości
          IDMessage.From.Address := edtFrom.Text; // adres nadawcy
          IDMessage.From.Text := edtFrom.Text;
          IDMessage.From.Name := edtFrom.Text;
          IDMessage.Recipients.EMailAddresses:= edtTo.Text;
          IDMessage.Body.Append(MemBody.Text);
    
    



    na

     Message.Subject := edtSubject.Text; // temat wiadomości
          Message.From.Address := edtFrom.Text; // adres nadawcy
          Message.From.Text := edtFrom.Text;
          Message.From.Name := edtFrom.Text;
          Message.Recipients.EMailAddresses:= edtTo.Text;
          Message.Body.Append(MemBody.Text);



    i również z

    SMTP.Send(IDMessage); // wysyłanie e-maila 


    na

    SMTP.Send(IDMessage); // wysyłanie e-maila 


    Ale nadal niedziała myślę że nie w tej części programu leży problem bo analizując program i po uruchomieniu w pasku nie pojawiają się żadne napisy
  • Pomocny post
    #6 8064348
    lanky
    Poziom 17  
    Posty: 149
    Pomógł: 27
    Ocena: 7
    IDMessage to komponent. Ty miałeś zapisany go jako message, wystarczyło, że w name componentu byś zmienił z message na IDMessage i byś nie musiał zmieniać całego kodu. Ale to nie w tym rzecz :)
    A to co Ci poprawiłem to działa bo to sprawdziłem. może źle wypełniasz edity.
    Dla przykładu: MojMail(_at_)poczta.fm wypełnienie editów powinno wyglądać tak:
    
    Serwer: poczta.fm
    Port: 25
    Login: moj_login_do_maila
    Hasło: moje_haslo_do_maila
    OD: MojMail@poczta.fm
    Do: MojMail@poczta.fm
    Temat: temat
    Treść: twoja treść maila
    


    i po wysłaniu mail powinien dojść do ciebie.

    Jak nie wiesz gdzie kod się zmienił to go porównaj ze swoim krok po kroku to zobaczysz.
  • Pomocny post
    #8 8065179
    lanky
    Poziom 17  
    Posty: 149
    Pomógł: 27
    Ocena: 7
    No to źle wpisujesz. Bo powinieneś mieć poczta.o2.pl a nie poczta.o2

    Jak to nie pomoże to spróbuj na porcie 587

    I mam nadzieję ze wpisałeś taki sam kod do programu co ci napisałem powyżej.

Podsumowanie tematu

✨ Użytkownik napotkał problemy z wysyłaniem e-maili w aplikacji Delphi, korzystając z komponentów Indy. Po pomyślnej kompilacji, program generował błąd po naciśnięciu przycisku "wyślij". Użytkownicy forum zasugerowali poprawki w kodzie, w tym ustawienia autoryzacji SMTP oraz poprawne przypisanie właściwości komponentów. Ostatecznie problem z połączeniem z serwerem pocztowym został rozwiązany przez zmianę portu na 587 oraz poprawne wpisanie adresu serwera (np. poczta.o2.pl zamiast poczta.o2).
Wygenerowane przez model językowy.
REKLAMA