Binäre Datei über Internet versenden

cesupa

Erfahrenes Mitglied
Hallo,

bin gerade Dabei einen kleinen, einfachen E-mail Client zu schreiben, der auch Anhänge versenden soll. Wenn ich eine Exe-Datei verschicken möchte klappt das zunächst wunderbar, jedoch lässt sich die Datei nach dem verschicken nicht mehr öffnen:(
Als ich die Original-Datei und die versendete Datei im hex-Editor vergleicht habe, ist mir aufgefallen, das in der versendeten Datei jede 00 durch ein 08 ausgetauscht wurde. Ich hab aber keinen blassen Schimmer, warum das passiert.
Code:

Code:
do
                {
                          
                               strcpy(buf,"");
                               s.read(buf,512);                                                                                    
                               ls+=send(ss,buf,512,0);
                               cout<<"\r"<<ls/1024<<" < "<<len/1024;

                               }while(!s.eof());

Freue mich schon auf eure Antworten.

Gruß
cesupa
 
Hi.

Hast du die Datei im Binärmodus geöffnet?

Um Binärdateien als Email zu versenden mußt du die Nachricht erstmal im MIME Format generieren. Dazu müssen die Binärdaten dann kodiert werden z.B. mit quoted printable bzw. base64.

Du weißt das eine Schleife mit der Bedingung !x.eof() nicht richtig funktionieren wird?! Du scheinst auch irgendwie anzunehmen das die Dateigröße ein Vielfaches von 512 Byte ist. Du solltest lieber die Methode readsome verwenden.

Das
cesupa hat gesagt.:
Code:
strcpy(buf,"");
kannst du einfacher so machen:
C++:
buf[0] = '\0';
Es ist aber völlig unnötig.

Gruß
 
Die Datei öffne ich im Binärmodus.
Muss ein E-Mail Anhang wirklich kodiert werden? Kann ich den nicht einfach so verschicken?
Warum soll eine Schleife mit !x.eof() nicht richtig funktionieren?
Ich werds dann mal mit readsome() versuchen.

Gruß
cesupa
 
cesupa hat gesagt.:
Die Datei öffne ich im Binärmodus.
Muss ein E-Mail Anhang wirklich kodiert werden? Kann ich den nicht einfach so verschicken?
Wenn du eine Email verschicken willst mußt du dich an das Email Protocol (SMTP) halten. Siehe z.B. http://cr.yp.to/smtp.html. Das schreibt ziemlich genau vor was man senden kann und was nicht.

cesupa hat gesagt.:
Warum soll eine Schleife mit !x.eof() nicht richtig funktionieren?
Siehe http://www.tutorials.de/forum/c-c/243283-ifstream-ofstream.html, http://www.tutorials.de/forum/c-c/224431-textdatei-string.html#9 und weitere Beiträge zu dem Thema. Warum hampeln denn bloß so viele immer mit eof() rum? Das ist doch viel umständlicher.

Gruß
 
Okay, aber wie sollte ich es besser machen? Soweit ich weiß gibt read() ein void* zurück, ich könnte nur nach der Dateigröße die Schleife machen, also
Code:
while(eingelesen<=gesamtgroesse)
 
Nein, read gibt kein void* zurück sondern eine Referenz auf das Stream Objekt. Das Stream Objekt verwaltet einen Zustand. Ein solches Stream Objekt kann implizit in einen boolschen Wert konvertiert werden der angibt ob der Zustand des Stream OK ist oder ein Fehler (EOF, Lese/Schreibfehler oder sonstwas) aufgetreten ist. Grundsätzlich ist es immer das gleiche Muster, das Einlesen sollte gleich in der Abbruchbedingung gemacht werden:
C++:
while (infile.read(buf, sizeof(buf))) {
  ...
}
Der Stream geht in einen Fehlerzustand wenn nicht genau sizeof(buf) Zeichen eingelesen wurden. Deswegen ist die Methode für deine Zwecke relativ ungeeignet da man nicht gleich erkennen kann wieviel Zeichen nun wirklich eingelesen wurden (außer man benutzt tellg() und merkt sich die Position und rechnet noch etwas herum).

Die readsome Methode gibt die Anzahl erfolgreich gelesener Zeichen zurück.

C++:
while (infile && outfile) {
  int length = infile.readsome(buf, sizeof(buf));
  
  outfile.write(buf, length); /* wenn nichts gelesen wurde wird auch nichts 
                                geschrieben, da length den Wert 0 hat */
}
Gruß
 
Sry, passt jetzt nicht 100%ig zum Thema, aber ich hab da mal ne Frage:

Ist es theoretisch möglich von einen Programm aus heruauszufinden, ob man neue emails bei einem GMX-Account hat, von welchen man den Namen und das Passwort weiß!

Wenns wirklich garnet hierher passt, tut es mir leid und bitte darum diesen Beitrag zu löschen, wenn der Autor dieses Thread es wünscht!

mfg killsmaker
 
[OT] Email Abfrage bei GMX

KILLSMAKER hat gesagt.:
Sry, passt jetzt nicht 100%ig zum Thema, aber ich hab da mal ne Frage:

Ist es theoretisch möglich von einen Programm aus heruauszufinden, ob man neue emails bei einem GMX-Account hat, von welchen man den Namen und das Passwort weiß!
Natürlich ist das möglich. GMX bietet mindestens einen POP Zugriff wenn nicht sogar IMAP an. Im Rahmen dieser Protokolle kann man herausfinden wieviel Mails vorhanden sind. Man könnte auch den Weg über HTTP gehen und die HTML Seiten parsen wenn's einem gefällt.

Gruß
 
Okay, ich hab grad mal versucht die eingelesene Datei in base64 zu kodieren, jedoch stürzt mein Kodier-Algorythmus immer wieder ab, genau an der Stelle, an der ein zeichen in Binär-code umgerechnet werden soll. Komischerweise hat dieses Zeichen den Ascii-code -1 und damit kommt die Funktion itoa() anscheinend nicht klar. Ist -1 das Ende der Datei? Muss ich dass dann beim kodieren weglassen?

Gruß
cesupa
 
Zurück