mail senden mit konsole



  • hallo, habe ein konsolenprogramm geschrieben mit dem icb mails verwalten kann.
    nur klappt jetzt das senden der mail nicht, aber warum weiss ich auch nicht
    schaut euch die funktion an vielleicht findet ihr den fehler
    das objelkt sendmail ist vom typ TNMSMTP

    void mails_senden()
    {
            char empfaenger[20];
            char betreff[20];
            char nachricht[1000];
            system("CLS");
            sendmail->UserID=mail->UserID;
            sendmail->Host="smtp.1und1.de";
    
            cout<<"\t\t\tMail verfassen"<<endl<<endl;
    
            cout<<"Empfaengeradresse: ";
            cin>>empfaenger;
            sendmail->PostMessageA->ToAddress->Text=empfaenger;
    
            cout<<"Betreff: ";
            cin>>betreff;
            sendmail->PostMessageA->Subject=betreff;
    
            cout<<"Nachricht: "<<endl;
            cin>>nachricht;
            sendmail->PostMessageA->Body->Text=nachricht;
    
            cout<<"Soll die Nachricht gesendet werden? ";
            system("PAUSE");
            sendmail->Connect();
            sendmail->SendMail();
    
    }
    


  • Hallo

    Ich nehme mal anhand des Klassennamens an das du mit dem Builder und der entsprechenden Mailkomponente arbeitest. Deshalb gehört dieser Thread ins Builder-Forum, er wird also bald verschoben.

    Da du weder den ganzen relevanten Code (zum Beispiel wo sendmail deklarariert und initialisiert wird) noch was genau "nicht klappt" (Fehlermeldung?) mit gepostest hast werden wir dir da nicht weiter helfen können.
    Benutzt den Debugger um den Fehler weiter einzukreisen.

    bis bald
    akari



  • Nein, das Programm ist als Konsolenanwendung geschrieben und nicht mit dem Builder gemacht. Das ist ja grad das komplizierte daran, mit dem Builder wäre das ja gar kein Problem.

    Die Fehlermeldung die auftaucht, ist das der Header der zu versendenden Mail incomplete ist. Aber ich habe alles was zur mail gehört eingefügt.



  • Ich stell mal das komplette Programm rein(Konsolenanwendung mit C++):

    #include <iostream>
    #include <windows.h>
    #include <nmpop3.hpp>
    #include <iomanip>
    #include <nmsmtp.hpp>
    
    using namespace std;
    
    TNMPOP3* mail= new TNMPOP3(mail);
    TNMSMTP* sendmail= new TNMSMTP(sendmail);
    
    void init();
    void optionen();
    void mails_abrufen();
    void mails_lesen();
    void mails_loeschen();
    void mails_senden();
    
    int main()
    {
            init();
            int auswahl;
            while(auswahl!=6)
            {
                    system("CLS");
                    cout << "\t\t\tHauptmenue\t" << endl << endl
                    << "1 - Neue Mails abrufen\t\t"
                    << "4 - Emails loeschen "      << endl << endl
                    << "2 - Emails lesen\t\t"
                    << "5 - Email-Account Optionen "<< endl << endl
                    << "3 - Email verfassen\t\t"
                    << "6 - Programm beenden "     << endl << endl;
                    cout <<"Bitte waehlen Sie eine Option: ";
                    cin>>auswahl;
    
                    switch(auswahl)
                    {
                            case 1:  mails_abrufen();
                                     break;
    
                            case 2:  mails_lesen();
                                     break;
    
                            case 3:  mails_senden();
                                     break;
    
                            case 4:  mails_loeschen();
                                     break;
    
                            case 5:  optionen();
                                     break;
    
                    }
    
            }
    
            cin.get();
            return 0;
    }
    
    void init()
    {
            char benutzername[20];
            char passwort[20];
            char pop3_server[20];
            system("CLS");
            cout<<"\t\t\tLogin"<<endl<<endl;
    
            cout<<"Bitte Benutzernamen eingeben: ";
            cin>>benutzername;
            mail->UserID=benutzername;
    
            cout<<endl<<"Bitte Passwort eingeben: ";
            cin>>passwort;
            mail->Password=passwort;
    
            cout<<endl<<"Bitte POP3-Eingangsserver eingeben: ";
            cin>>pop3_server;
            mail->Host=pop3_server;
    
            mail->Connect();
    
            cout<<endl;
            system("PAUSE");
    
    }
    
    void optionen()
    {
            char benutzername[20];
            char passwort[20];
            char pop3_server[20];
            system("CLS");
            cout<<"\t\t\tOptionen"<<endl<<endl;
    
            cout<<"Bitte Benutzernamen eingeben: ";
            cin>>benutzername;
            mail->UserID=benutzername;
    
            cout<<endl<<"Bitte Passwort eingeben: ";
            cin>>passwort;
            mail->Password=passwort;
    
            cout<<endl<<"Bitte POP3-Eingangsserver eingeben: ";
            cin>>pop3_server;
            mail->Host=pop3_server;
    
            mail->Disconnect();
    
            cout<<endl;
            system("PAUSE");
    
    }
    
    void mails_abrufen()
    {
            system("CLS");
    
            if(!mail->Connected)
                    mail->Connect();
    
            cout<<"Sie haben "<<mail->MailCount<<" neue Mails"<<endl<<endl;
    
            system("PAUSE");
    
    }
    
    void mails_lesen()
    {
            int mail_nr;
    
            system("CLS");
    
            if(!mail->Connected)
                    mail->Connect();
    
            cout<<"NR\tBetreff\t\t\tAbsender"<<endl;
    
            for(int i=1;i<=mail->MailCount;i++)
            {
                    mail->GetMailMessage(i);
                    cout<<i<<"\t"<<mail->MailMessage->Subject<<"\t\t\t"<<mail->MailMessage->From<<endl<<endl;
            }
            cout<<"Welche Nachricht möchten Sie lesen: ";
            cin>>mail_nr;
            system("CLS");
            cout<<"Betreff: "<<mail->MailMessage->Subject<<endl<<endl;
            cout<<"Absender "<<mail->MailMessage->From<<endl<<endl;
            cout<<"Nachricht: "<<mail->MailMessage->Body->GetText()<<endl;
    
            system("PAUSE");
    
    }
    
    void mails_loeschen()
    {
            int mail_nr;
    
            system("CLS");
    
            cout<<"NR\tBetreff\t\t\tAbsender"<<endl;
    
            for(int i=1;i<=mail->MailCount;i++)
            {
                    mail->GetMailMessage(i);
                    cout<<i<<"\t"<<mail->MailMessage->Subject<<"\t\t\t"<<mail->MailMessage->From<<endl<<endl;
            }
            cout<<"Welche Nachricht möchten Sie loeschen: ";
            cin>>mail_nr;
            mail->DeleteMailMessage(mail_nr);
            mail->Disconnect();
    }
    
    void mails_senden()
    {
            char empfaenger[20];
            char cc[20];
            char bcc[20];
            char betreff[20];
            char nachricht[1000];
    
            system("CLS");
            sendmail->UserID=mail->UserID;
            sendmail->Host="smtp.1und1.de";
            sendmail->TimeOut=20000;
            sendmail->Connect();
    
            cout<<"\t\t\tMail verfassen"<<endl<<endl;
    
            cout<<"Empfaengeradresse: ";
            cin>>empfaenger;
            sendmail->PostMessageA->ToAddress->Text=empfaenger;
    
            cout<<"CC: ";
            cin>>cc;
            sendmail->PostMessageA->ToCarbonCopy->Text=cc;
    
            cout<<"BCC: ";
            cin>>bcc;
            sendmail->PostMessageA->ToBlindCarbonCopy->Text=bcc;
    
            cout<<"Betreff: ";
            cin>>betreff;
            sendmail->PostMessageA->Subject=betreff;
    
            cout<<"Nachricht: "<<endl;
            cin>>nachricht;
            sendmail->PostMessageA->Body->Text=nachricht;
    
            cout<<"Soll die Nachricht gesendet werden? ";
            system("PAUSE");
            sendmail->SendMail();
    
            if(sendmail->OnSendStart)
                    cout<<endl<<"Die Nachricht wird verschickt....."<<endl;
            else
                    cout<<endl<<"Die Nachricht kann nicht verschickt werden!"<<endl;
    
            if(sendmail->OnSuccess)
                    cout<<endl<<"Die Nachricht wurde erfolgreich verschickt!"<<endl;
            else
                    cout<<endl<<"Das Senden der Nachricht ist fehlgeschlagen!"<<endl;
    
    }
    


  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum VCL (C++ Builder) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo

    Ob du ein Konsolen- oder ein GUI-Programm schreibst ist dabei zweitrangig, da du nicht nur VCL-Komponenten des Builders benutzt sondern auch der Fehler, um den es hier im Thread geht, von dieser Komponente geworfen wird. Damit ist die Verschiebung korrekt, der Fehler hat nichts mit Standard-C++ alleine zu tun.

    Zunächst einmal fällt mir die globale Verwendung der Mail-Instanzen auf, was in diesem Fall unnötig und schlechter Stil ist. Zum Beispiel hast du deswegen auch vergessen die Instanzen wieder zu löschen. Vollkommen ungültig ist aber die Verwendung des zu initialisierenden Pointer als Owner der Komponente. Da du keine übergeordneten Instanzen hast must du 0 angeben

    TNMPOP3* mail= new TNMPOP3(0);

    Am besten verschiebst du Deklarataion, Initialisierung und Löschung der Mail-Instanzen lokal in die Main-Funktion und übergibst die nötigen Instanzen an die jeweiligen Unterfunktionen als Parameter.

    Außerdem finde ich die Verwendung der alten C-Strings unnötig. Damit ermöglichst du dem User bösartige Buffer-Overflow-Attacken, da du nirgends überprüfst ob der User nicht mehr Zeichen eingibt als deine C-String-Arrays aufnehmen. Arbeite entweder mit std::string oder mit AnsiString. Um AnsiStrings mit den iostreams zu verwenden must du nur den Header so einbinden :

    #include <dstring.h> // muß vor iostream
    #include <iostream>
    

    Die Verwendung der Events OnSendStart und OnSuccess ist komplett falsch, so funktioniert das Eventsystem des Builders nicht. Als einfache Alternative kannst du Exceptions abfangen

    try
    {
      cout<<endl<<"Die Nachricht wird verschickt....."<<endl;
      sendmail->SendMail();
      cout<<endl<<"Die Nachricht wurde erfolgreich verschickt!"<<endl;
    }
    catch(Exception& e)
    {
      cout<<endl<<"Das Senden der Nachricht ist fehlgeschlagen!"<<endl;
      cout<<"Fehler : " << e.Message.c_str() << endl;
    }
    

    Den eigentlichen Fehler kann ich beim Überfliegen nicht festmachen, aber mir fällt auf das du die Eigenschaft PostMessageA benutzt. In der Builder-Hilfe ist die Eigenschaft aber als PostMessage angegeben. Die von dir verwendete Variante ist vermutlich die AnsiString-Variante, als Gegenteil zur WideString-Varainte. Eventuell hilft es ja schon wenn du das A aus PostMessage wegläßt und dem Compiler die richtige Wahl überläßt.

    bis bald
    akari



  • Ok Danke erstmal für die Tipps, bin noch Anfänger!!
    Aber auch wenn ich alles so ändere wie sie es mir gesagt haben, kommen trotzdem abwechselnd zwei verschiedene fehlermeldungen, die erste ist incomplete header, und die zweite invalid recipients, ich schreibe alle daten in den header die benötigt werden der kann nicht leer sein, und die adressen der empfänger sind auch korrekt die ich zum testen eingebe, trotzdem stimmt was nicht, kann das niemand mal bei sich laufen lassen und testen und mir dann sagen was ich falsch mache.

    Ich sitze schon seid zwei tagen dran das ding zum senden zu bringen. bitte 😞 😞



  • HALLO??????? 😕 😕 😕 😕 😕 😕 😕 😕



  • Hallo

    Ich finde es schon erstaunlich das du alle von mir genannten Änderungen innerhalb von einer Viertelstunde fehlerfrei umgesetzt hast... und das als selbsternannter Anfänger...

    Wie auch immer, ich (und anhand des fehlenden Feedbacks auch andere) konnte den Fehler nicht nachvollziehen. Falls du also zur Laufzeit jeweils sinnvolle Sachen eingibst sollte die Mail auch versendet werden.

    Da TNMSMTP wie alle NM-Komponenten allerdings als veraltet und fehlernafällig gelten bringt vielleicht der Umstieg auf die besseren Indy-Komponenten etwas. Entweder sind die in deinem Builder schon dabei oder du kannst sie dir aus dem Netz laden und installieren. Weiteres dazu über SuFu und FAQ.

    bis bald
    akari



  • Hallo,

    daran:

    aramis schrieb:

    ich schreibe alle daten in den header die benötigt werden der kann nicht leer sein

    hab ich leichte Zweifel! Also zumindest fällt mir auf dass der Sender fehlt...

    mfg, Micha!



  • wie was meinst du mit sender?? hab doch alles gemacht??



  • Hallo

    Random meint die Eigenschaft TNMSMTP::TPostMessage::FromAddresse die bei dir nicht gesetzt wird.

    bis bald
    akari



  • Hallo,

    wo hast du denn beim Versenden der Mail den Sernder festgelegt? Die BCB - Hilfe meint:

    NMSMTP1->PostMessage->FromAddress = Edit3->Text;

    mfg, Micha!

    // zu langsam -.-



  • ok das hab ich jetzt geändert, jetzt bekomme ich die fehlermeldung no valid recipients. und noch ne frage nebenbei: muss ich bei cc und bcc unbedingt eine adresse angeben oder kann das leer bleiben.ist das vielleicht das problem



  • Hallo,

    jenachdem ob du Kopien deiner Mail versenden willst .. ich glaub das sollte aber lieber Entscheidung des Sernders und nicht des Entwicklers sein :)! Um zu testen ob es daran liegt, solltest du die entscheidenden Zeilen in deinem Quellcode auskommentieren!

    mfg, Micha



  • also ich habe schon alles ausprobiert, ich hab für bcc und cc was eingegeben und auch schon auskommentiert, trotzdem kommt die fehlermeldung invalid recipients. kann das keiner von euch mal kopieren und als konsolenanwendung mal laufen lassen. vielleicht fällt euch dann der fehler auf. hab schon alles ausprobiert und auch in der doku alles nachgelesen.



  • HALLO? NOCH JEMAND DA?



  • Rumschreien führt nur dazu, daß keiner mehr antwortet.

    Schau dir mal die Beispiele an, die beim BCB dabei sind. Diese findest du unter Examples/FastNet im BCB-Verzeichnis.

    Das Problem ist, dass du Smpt nicht angemeldet hast, außer du hast ein E-Mail-Provider der Pop vor Smtp verwendet, d.h. man muß erst Mails abrufen, bevor man welche verschicken kann. Da die FastNet-Komponenten keine Authentifizeiung für Smtp zulassen kann man hier also keine E-Mail-Konten verwenden, die für den E-Mail-Versand eine Authentifizeiung erfordern. Also auch hier nochmal den Tip: nimm die Indy-Komponenten.



  • Linnea schrieb:

    Rumschreien führt nur dazu, daß keiner mehr antwortet.

    Erschwerend kommt hinzu, dass er akaris Vorschläge wohl immer noch nicht getestet hat. Er wartet wohl lieber darauf, dass sich tatsächlich jemand die Mühe macht, das für ihn zu machen. Keine Initiative -> keine Resonanz...



  • ok habs jetzt und nebenbei ihr wart auch mal anfänger und habt es bestimmt nicht gemocht wenn euch jeder einfach gesagt hat das ihr in irgendwelchen dokus nachlesen sollt, und das habe ich auch gemacht bevor ich in dieses forum gegangen bin denn so schlau war ich nämlich auch. trotzdem danke an die anderen tipps.


Anmelden zum Antworten