Mails verschicken mit C/C++ Programm mit SMTP

Hallo, ich habe ein kleines Programm geschrieben (in C), mit dem ich Mails verschicken kann. Ich kompiliere den Code mit

g++ -o mailsender mailsender.c

und es funktioniert sehr gut, wenn ich normale Mails verschicke. Den Code habe ich teilweise gefunden und einfach für meine Tests erweitert (daher etwas wirr). Soweit funktioniert er ganz gut. Aber ich möchte nicht nur Mails versenden, sondern auch mit Anhang versenden. Weiß jemand, wie das geht?

Viele Grüße
Ilias

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define HELO „HELO 192.168.1.1\r\n“
#define DATA „DATA\r\n“
#define QUIT „QUIT\r\n“
#define BUFSIZE 10000

int sock;
struct sockaddr_in server;
struct hostent *hp, *gethostbyname();
char buf[BUFSIZE+1];
int len;
/* START: REPLACE HERE */
char *host_id=„mail.gmx.net“;
char *from_id=„[email protected]“;
char *to_id=„[email protected]“;
char *sub=„Betreff\r\n“;
char wkstr[100]=„Your Message\r\n“; // Your email text!
/* END: REPLACE */

/*=====Send a string to the socket=====*/

void send_socket(char *s)
{
write(sock,s,strlen(s));
write(1,s,strlen(s));
//printf(„Client:%s\n“,s);
}

//=====Read a string from the socket=====*/

void read_socket()
{
len = read(sock,buf,BUFSIZE);
write(1,buf,len);
//printf(„Server:%s\n“,buf);
}

/*=====MAIN=====*/
int main(int argc, char* argv[])
{
cout h_addr, hp->h_length);
server.sin_addr.s_addr = 1948931028;
server.sin_family = AF_INET;
server.sin_port = htons(8080);
connect(sock, (struct sockaddr *) &server, sizeof server);
send(sock, „$Cscx“, 5, 0); // bla test data just to test connection
close(sock);
/*=====Handling====*/
if (connect(sock, (struct sockaddr *) &server, sizeof server)==-1) {
perror(„connecting stream socket“);
exit(1);
} else
cout

Hallo iliasplusplus !

Das ist eigentlich nicht schwer:
Im Header wird als Contenttype ‚multipart‘ angegeben und eine beliebige (eindeutige!!!) Zeichenkette definiert die als Trennung zwischen den verschiedenen Teilen kommt.
z.B.:

Content-Type: multipart/mixed; boundary="===\_blablasmrrdollar12345xxx\_==="

Dann kommen die einzelnen Teile jeweils mit dem boundary-String getrennt, für jeden Teil der lokale Content-Type.
z.B.:
Zuerst ein textteil, dann ein Attachement:

===\_blablasmrrdollar12345xxx\_===
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 8bit

Hallo Empfänger!

Hier schicke ich dir das Attachement.
Viel Spass.
===\_blablasmrrdollar12345xxx\_===
Content-Type: application/pdf; name="irgendwas.pdf"
Content-Disposition: attachment; filename="irgendwas.pdf"
Content-Transfer-Encoding: base64

JVBERi0xLjQKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFIvRmlsdGVyIC9GbGF0
...
RTk1MUEwQjQ+XQo+PgpzdGFydHhyZWYKODU3MzQKJSVFT0YK
===\_blablasmrrdollar12345xxx\_===

Wie du siehst müssen binary-Daten in base64 kodiert sein.

Genaueres siehe RFC 1521:
http://www.ietf.org/rfc/rfc1521.txt