per Telnet auf SMTP-Server

sakizzo

Mitglied
hallo,

wir sollen eine verbindung zu einem smtp server unserer hochschule bekommen und über die konsole eine email verschicken.

ich bekomme mit meinem programm schon eine verbindung zum smtp server, jedoch muss ich ja danach die antwort vom server abwarten, bevor ich mit "HELO ichbins" weitermachen kann. das habe ich mit einem delay versucht,...aber irgendwie funktioniert das nicht. was kann der fehler sein? gibt es eine bessere funktion, um eine antwort vom server abzuwarten und danach erst weiter zu senden?
hier mein code:
Code:
int anzahl;

void delay(int sek){
int c=0;
     for(int i=0;i<50000000*sek;i++){
          while(1){
          c++;
          }
     }
}

int main(int anzahl)
{
	while(anzahl!=0){
	system("telnet mail.hochschule.de 25\n");
        delay(2);
        system("HELO ichbins\n");	
        delay(2);
	anzahl--;
	}	  
}
 
Hi.

Das kann so nicht funktionieren.

Die system() Funktion führt ein anderes Programm synchron aus, d.h. die Funktion kehrt erst zurück wenn das Programm beendet ist.

Und ein Programm namens "HELO" gibt es nicht.

Sollst du das denn mit Telnet machen? Welches Betriebssystem?

Gruß
 
hi.

ja das soll mit telnet sein. es soll ein client realisiert werden, wo der benutzer nur bestimmte sachen (zB: empfaenger, nachricht) eingeben muss und das programm leitet es als email zum mailserver weiter, der es versendet.
das soll entweder in C oder in java programmiert werden und auf ein Unix-System laufen.
 
int main(int anzahl)

Ich denk mal dass er mit Windows unterwegs ist, solch eine main() akzeptiert doch kein gcc, oder?

Zum Ablauf folgendes:
- Nimm nicht das Programm telnet her, das macht die Sache fast unmöglich
- Öffne einen Socket zum Server
- Lies vom Server bis er was sendet und schick dann dein HELO bzw. EHLO weg.
- Mach mit der Kommunikation so weiter
- Schließe den Socket

Tip: http://www.pc-adviser.de/socket_programmierung.html

// Edit: Da war der Ersteller schneller ;) Wenn mit Unix laufen soll, dann nimm das Programm "mail" oder "sendmail" her, die erfüllen genau deine Anforderungen.

Gruß
BK
 
wie meinst du das programm mail oder sendmail verwenden?...
wie kann ich das verwenden?ich weiß noch nich genau wie du das meinst.

es könnte sogar sein, dass wir es mit sockets realisieren sollen,...weil wir die aufgabe eine client-server anwendung mit sockets zu programmieren, davor hatten.
kann ich dann einfach per sendto den mailserver ansprechen und seine antwort mit recvfrom abfangen?
 
Hi,

in der Konsole einfach mal "man mail" und "man sendmail" eingeben, da sollte alles benötigte stehen wie du mit den Programmen Mails versenden kannst.

Beispiel:
Bash:
echo "Dies ist eine kleine Testnachricht, welche ich an mich selbst schicke." | mail -s "Testbetreff" root@localhost

// Edit: Theoretisch könntest du auch mit "nc" eine Mail verschicken:
Bash:
echo "EHLO evil-server.evilnet
MAIL FROM: wasd@localhost
RCPT TO: simon@localhost
DATA
From: wasd@localhost
To: simon@localhost
Subject: Testbetreff

Dies ist eine kleine Testnachricht, welche ich an mich selbst schicke.
.
QUIT" | nc localhost 25
Ausgabe:
Code:
220 bk.it.cx ESMTP Postfix (Debian/GNU)
250-bk.it.cx
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
250 2.1.0 Ok
250 2.1.5 Ok
354 End data with <CR><LF>.<CR><LF>
250 2.0.0 Ok: queued as C44224BE001
221 2.0.0 Bye

Gruß
BK
 
Zuletzt bearbeitet:
ich glaube wir sollen es aber nicht mit mail und sendmail machen. (außerdem kommt bei mir, "no manual entry for sendmail/mail")

kann ich es so machen wie ich oben gefragt habe,...2 sockets....1 client 1 server. der client ist zur benutzereingabe, nimmt alle daten auf und leitet es an den server weiter, der den mailserver anspricht mit sendto und antworten abfängt mit recvfrom****?

danke für eure antworten..
 
Hi,

wenn du schon mit Sockets arbeiten willst (was auf alle Fälle das Beste wäre), dann brauchst du keinen Server. Schicke die Daten direkt an den Mailserver ;)

Gruß
BK
 
Hey,

ich würde es auch mit Sockets realisieren. Ist die beste Möglichkeit. Ich selbst habe auch schon einen Mailclient programmiert. Falls euer Mailserver einen Login benötigt, wie die meisten Mailserver: gmx, yahoo usw., dann wird es wider bisschen schwieriger, da du dann noch die Base64-Codierung mit einprogrammieren müsstest ;). Außerdem solltest du der Mail immer den richtigen Zeitstempel mitgeben, da sie sonst von vielen als "SPAM" eingestuft wird.

Dann noch ein paar Tipps die du beim programmieren berücksichtigen solltest:
- Als senden/empfangen - Funktionen solltest du nicht sendto() und recvfrom()
verwenden (ist UDP), sondern nur send() und recv() (ist TCP)
- in der recv()-Funktion solltest du für die Anzahl der Bytes die sizeof()-Funktion
benutzen und in der send()-Funktion die strlen()-Funktion.
Bei mir hat der Mailserver immer einen 550-Fehler gebracht, wenn ich bei send()
die sizeof() verwendet habe. Keine Ahnung warum, aber es kann Fehler vermeiden.


Puhhh...jetzt reichts aber :)

Bei Fragen kannst mich ja kontaktieren und ich kann dir auszüge aus meinem Quellcode schicken...

gruß
 
Zurück