[C++] SMTP & CPPSocket

Pagina: 1
Acties:

  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
Volgens het volgende cppsocket voorbeeld heb ik een programmatje gemaakt wat met een mailserver communiceert:
TCP Client Example

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <tcpclient.h>
#include <address.h>
#include <string>

using namespace std;

int main(int argc, char *argv[]) {
    string smtpReply;
    try {
        CPPSocket::TCPClient smtpConnection;
        CPPSocket::Address host("127.0.0.1",25,false);
        smtpConnection.connect(host);
        smtpConnection >> smtpReply;
        cout << "1 "  << smtpReply;
        smtpConnection << "HELO mydomain.nl\r\n";
        smtpConnection >> smtpReply;
        cout << "2 " << smtpReply;
        smtpConnection << "MAIL FROM: <from@mydomain.nl>\r\n";
        smtpConnection >> smtpReply;
        cout << "3 " << smtpReply;
        smtpConnection << "RCPT TO: <to@mydomain.nl>\r\n";
        smtpConnection >> smtpReply;
        cout << "4 " << smtpReply;
        smtpConnection << "DATA\r\n";
        smtpConnection >> smtpReply;
        cout << "5 " << smtpReply;
        smtpConnection << "lalala\n.\r\n";
        smtpConnection >> smtpReply;
        cout << "6 " << smtpReply;
        smtpConnection.disconnect();
    } catch(CPPSocket::Exception &error) {
        cerr << error.getMessage() << endl;
        exit(1);
    }
    return 0;
}


Als ik de commando's in telnet intik gaat het gewoon goed... maar de output van het programma is:
1 220 mailerserver ESMTP Sendmail 8.12.8/8.12.8; Tue, 28 Oct 2003 12:06:13 +0100
2 250 mailerserver Hello mydomain.nl [127.0.0.1], pleased to meet you
3 500 5.5.1 Command unrecognized: ""
4 500 5.5.1 Command unrecognized: ""
5 500 5.5.1 Command unrecognized: ""
6 500 5.5.1 Command unrecognized: ""
500 5.5.1 Command unrecognized: "."
Het heeft wat met de line breaks te maken... ik heb ALLES geprobeerd...
\r\n - \n\r - \r - \n ... allemaal achteraan de string, werkt niet.

Wat half werkt, is vooraan de string \n bij elke regel... dan krijg ik maar 1 keer (500 5.5.1 Command unrecognized: "") en wordt het mailtje wel goed verstuurd.

Heeft iemand een idee wat ik fout doe? Of zit de fout in cppsocket lib.?

[ Voor 12% gewijzigd door Akerboom op 28-10-2003 12:11 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik ken CPPSocket niet, maar als dat een subclass is van std::ostream, dan worden \n newlines geconverteerd naar \r\n newlines op een windows OS. Dus waarschijnlijk zijn je \r's dubbel

niet goed gelezen, je zei zelf al dat \n ook niet werkt

Maar goed, zo kunnen wij op zich ook weinig. Je moet even met een packet sniffer kijken wat het verschil is tussen wat je met telnet verstuurd en wat je programma verstuurd

[ Voor 40% gewijzigd door .oisyn op 28-10-2003 12:21 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
.oisyn schreef op 28 October 2003 @ 12:20:
Ik ken CPPSocket niet, maar als dat een subclass is van std::ostream, dan worden \n newlines geconverteerd naar \r\n newlines op een windows OS. Dus waarschijnlijk zijn je \r's dubbel

niet goed gelezen, je zei zelf al dat \n ook niet werkt

Maar goed, zo kunnen wij op zich ook weinig. Je moet even met een packet sniffer kijken wat het verschil is tussen wat je met telnet verstuurd en wat je programma verstuurd
goed idee.. ik had al met 'nc' een postlistener gestart... en daar mijn programma laten connecten... dan ziet alles er goed uit...

weet jij toevallig zo snel het commando om te sniffen?? tcpdump?

  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 09-06 12:38
tcpreen is onder UNIX-achtigen handig, 'snifft' op TCP-niveau. Voor Win32 zowel als UNIX-achtigen ben ik erg te spreken over ethereal. Maar tcpdump werkt idd ook.

Verwijderd

Probeer eens << endl te gebruiken aan het einde van een regel, ipv dat je "\r\n" invoegt in de string.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

ekuyer: het enige verschil is dat endl ook een flush doet

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 28 oktober 2003 @ 12:37:
Probeer eens << endl te gebruiken aan het einde van een regel, ipv dat je "\r\n" invoegt in de string.
De SMTP-specificatie schrijft voor dat je CRLF stuurt, dan kun je het beter letterlijk doen dan hopen dat de platformspecifieke implementatie van endl het goed doet.

Professionele website nodig?


  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
Ik heb met Ethereal gesnifft...

Ethereal herkent het SMTP protecol en ziet mijn commando's ook als SMTP commando's... ook de \r\n is in mijn programma hetzelfde als met bv. telnet.

Er is geen verschil in de commando's, echter zie ik wel een verschil met de dataflow.

Als ik stuur met telnet wordt er na elk SMTP commando een "ACK" gestuurd... met mijn programma niet... daar zitten alle commands en replies achter elkaar zonder dat er elke keer een ACK tussendoor komt.

Dat is het enige verschil wat ik ben tegengekomen met sniffen, er worden iig net teveel of foutieve linebreaks gegeven

[update]

Ik probeer het net met een externe mailserver (op een Macintosh) hierbij gaat het wel goed??

(sendmail server van de provider gaat ook fout)

Nu snap ik er echt niets meer van?? Zoiets kan toch niet aan de sendmail configuratie liggen??

[ Voor 23% gewijzigd door Akerboom op 28-10-2003 13:42 ]


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Een ACK? Wat is de output precies? Volgens mij zit er niets van een ACK in het SMTP protocol behalve die nummertjes :?

  • rollebol
  • Registratie: Mei 2000
  • Laatst online: 09-06 12:38
ACK zit in TCP. Probeer ter debug eens een seconde te wachten tussen ieder commando, om te zien of het dan wel werkt. De << endl-suggestie zou ik, juist vanwege de impliciete fflush() ook proberen.

Maar een echte oplossing weet ik niet, ik ken CPPSocket verder niet.

  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
Ethereal dumps:
goed met telnet
fout met test programma

en ik hoef niet te pauzeren want
C++:
1
smtpConnection >> smtpReply;
wacht op reply van de server.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Vervang al die send-acties eens door:
C++:
1
smtpConnection.send("HELO mydomain.nl\r\n");

Professionele website nodig?


  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
curry684 schreef op 28 October 2003 @ 14:01:
Vervang al die send-acties eens door:
C++:
1
smtpConnection.send("HELO mydomain.nl\r\n");
Dat moet iets anders, maar hebik ook al geprobeerd... zelfde resultaat

[update]

Ik ben het helemaal zat...

ik heb de auteur van de klasse een mailte gestuurd (nl'r) ... tot de tijd ga ik verder kijken naar een andere Socket klasse voor c++

bv. http://www.ctie.monash.edu.au/SocketCC/

[ Voor 31% gewijzigd door Akerboom op 28-10-2003 14:11 ]


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

TormentoR schreef op 28 oktober 2003 @ 14:07:
[...]
Dat moet iets anders, maar hebik ook al geprobeerd... zelfde resultaat
Dan is die CppSocket gewoon bugged :z

Professionele website nodig?


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
Wat ik aan je eigen SMTP data kan zien is dattie alle SMTP data tussen < > zet. ( Klik in ethereal maar eens op het eerste commando dat fout gaat, de regel MAIL FROM .....

Als je onderin ethereal kijkt zie je een regel met Simple Mail Transfer Protocol.
Als je daarop klikt wordt dat commando uitgevouwen, en zie je de SMTP data apart.

De email adressen van jouw client worden tussen <> gezet, terwijl telnet dat natuurlijk niet doet. ( Misschien een setting die je eerst moet maken in je socket lib ?)


Overigens, alle bovenliggende regels in je ethereal window zijn de protocollen die onder SMTP liggen ( Ethernet, IP, TCP ), en in dit geval niet echt van belang voor je foutdiagose ..... :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
farlane schreef op 28 oktober 2003 @ 18:17:
[...]


Wat ik aan je eigen SMTP data kan zien is dattie alle SMTP data tussen < > zet. ( Klik in ethereal maar eens op het eerste commando dat fout gaat, de regel MAIL FROM .....

Als je onderin ethereal kijkt zie je een regel met Simple Mail Transfer Protocol.
Als je daarop klikt wordt dat commando uitgevouwen, en zie je de SMTP data apart.

De email adressen van jouw client worden tussen <> gezet, terwijl telnet dat natuurlijk niet doet. ( Misschien een setting die je eerst moet maken in je socket lib ?)


Overigens, alle bovenliggende regels in je ethereal window zijn de protocollen die onder SMTP liggen ( Ethernet, IP, TCP ), en in dit geval niet echt van belang voor je foutdiagose ..... :)
Die haken < > zijn volgens de RFC, deze ben ik bij het tikken in het telnet venster vergeten in te vullen... sendmail is niet zo kieskeurig... soms :S

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
TormentoR schreef op 28 October 2003 @ 18:24:
[...]
Die haken < > zijn volgens de RFC, deze ben ik bij het tikken in het telnet venster vergeten in te vullen... sendmail is niet zo kieskeurig... soms :S
Volgens mij kan het niet aan die ACK liggen namelijk, bij de werkende versie zit na dat commando ook geen ACK ..... maar wel ervoor. En dat is een TCP ACK die wordt verstuurd door je server.

Als je trouwens je goede bekijkt, dan zie je dat de tijd tussen de "Hello localhost" en je "MAIL FROM ...." veel langer is dan bij de foute versie, waarschijnlijk omdat je het eerste moet intikken :)

Probeer het eens met een sleep tussen de commando's, en kijk of je daarmee het werkend kunt maken. ( Het is geen goede oplossing trouwens, maar ik heb het idee dat dit niet aan je prog ligt, maar aan je server. )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 29-07 13:20

Akerboom

Codito, ergo sum

Topicstarter
farlane schreef op 28 October 2003 @ 18:44:
[...]

[knip]

Probeer het eens met een sleep tussen de commando's, en kijk of je daarmee het werkend kunt maken. ( Het is geen goede oplossing trouwens, maar ik heb het idee dat dit niet aan je prog ligt, maar aan je server. )
Sleep heeft geen zin zoals ik al zei, want je wacht al op een respons van de server... maar ik was zo hepenloos dat ik dat zelfs heb geprobeerd... maakt niets uit.

Ondertussen heb ik andere klassen geprobeerd, deze werken met bijna dezelfde code wel goed! Ik denk dat de klasse niet helemaal 100% is.

Maar de werking van deze klasse met Exceptions en de << operation is wel heel fijn...

Welke klasse gebruiken jullie om sockets te gebruiken??

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
TormentoR schreef op 28 October 2003 @ 18:58:
[...]
Ondertussen heb ik andere klassen geprobeerd, deze werken met bijna dezelfde code wel goed! Ik denk dat de klasse niet helemaal 100% is.
Wel vreemd, het zou betekenen dat hij wat met de TCP laag doet wat niet mag van je SMTP server. ( Het is de server die over de nek gaat van je communicatie, aangezien hij met een leeg bericht komt als foutmelding. )
Welke klasse gebruiken jullie om sockets te gebruiken??
Zelfbouw, niet geschikt voor verdere verspreiding :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

TormentoR schreef op 28 October 2003 @ 18:58:
[...]
Welke klasse gebruiken jullie om sockets te gebruiken??
Zelfbouw :)

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ook zelfbouw hiero (oeh, een opsomtopic :P)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 99% gewijzigd door Eelis op 18-02-2015 20:10 ]

Pagina: 1