# [C++] E-mails versenden



## GeileEier (23. Juni 2008)

hallo....  
wie kann ich in C++ E-mails an bestimmte empfänger verschicken

das programm soll sich die empfänger und den e-mail body aus externen .txt bzw. .html dateien laden.


----------



## kickerxy123 (23. Juni 2008)

hm ich denke nicht, dass das direkt geht...

aber es sollte über folgenden Umweg gehen: c++ Programm ->Serververbindung ->php Datei auf Server, die dein Anliegen erledigt.

Ich meine jedenfalls, dass es mit PHP geht, nur da kann ich dir nciht bei helfen, die Serververbindung hingegen ist einfach gemacht 

lg


----------



## devDevil (23. Juni 2008)

Klar geht das direkt. Nur nicht mit C++-Standardmitteln.


----------



## GeileEier (23. Juni 2008)

devDevil hat gesagt.:


> Klar geht das direkt. Nur nicht mit C++-Standardmitteln.



gibst du mir auch einen TIP wie?


----------



## kickerxy123 (23. Juni 2008)

Stichwort Winsockets und danke devDevil natürlich geht das ^^ also hier hab ich auch mal n link dazu rausgesucht:
http://www.online-tutorials.net/netzwerk/emails-verschicken/sourcecodes-t-18-23.html
Wenns ncoh Fragen zu Winsocks gibt, melde dich

lg
eXo


----------



## GeileEier (24. Juni 2008)

DANKE ...DANKE...DANKE... für die nette und schnelle hilfe 

Ja...auch mit dem link kann ich was anfangen.....genau das was ich gesucht habe 

nur ein kleines problem habe ich noch, denke aber für euch ist es kein problem...


```
int main()
{
  send("mail.web.de","Absendername","Anonymous@ano.de","empfänger@etwas.de",
       "Betreff","Nachricht");
  getchar();
  return 0;
}
```

da ich dieses programm nutzen möchte um den membern in meinem clan--> newsletter, training-info und termine für liga-spiele zu schicken... möchte ich gerne noch wissen ob
es die möglichkeit gibt "empfänger" aus einer externen .txt datei in das programm einzulesen?


----------



## kickerxy123 (24. Juni 2008)

Klar, dass sollte wie folgt funktionieren;

```
#include <iostream>
//und den ganzen rest
#include <fstream>

using namespace std;
int main(){

short zeilen=3;
string arr[zeilen];

ifstream lese("C:\empfaenger.txt");
for(short i=0;i<zeilen;i++){
   getline(lese,arr[i],'\n');
}//arr[0]hat nun den Inhalt der ersten Zeile, arr[1] den der2.Zeile,usw.


  send("mail.web.de","Absendername","Anonymous@ano.de",arr[0],
       "Betreff","Nachricht"); 
  getchar(); 
  return 0; 
}
```
lg


----------



## GeileEier (24. Juni 2008)

bekomme beim kompilieren immer eine fehlermeldung:

48
no matching function for call to `send(const char[12], const char[13], const char[17], std::string&, const char[8], const char[10])'


----------



## kickerxy123 (25. Juni 2008)

er bemängelt deine übergebenen Parameter (char,char,-- und den String), ich denke mal er will nur char haben(bzw const char*)


----------



## GeileEier (25. Juni 2008)

der fehler ist in zeile 48 bei....send ()

ich versteh nicht ganz wie ich diesen fehler beheben kann..... habe schon versch. versucht....
bin am verzweifeln  *heul*  ;-(


----------



## jokey2 (26. Juni 2008)

versuch's mal mit 

```
send("mail.web.de","Absendername","Anonymous@ano.de",arr[0].c_str(),
       "Betreff","Nachricht");
```
Die Funktion akzeptiert keinen Datentyp std::string als Parameter.


----------



## GeileEier (27. Juni 2008)

hier ist der source:


```
#include <winsock2.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;
//#pragma comment(lib,"wsock32.lib") 

#define EOL  "\r\n"

DWORD smailid;
HANDLE hthr;
const WORD   VERSION_MAJOR  = 1;     
const WORD   VERSION_MINOR  = 1;
int error;
char pszBody[1500];

typedef struct threadd
{
    char name[200];
    char fromid[200];
    char toid[200];
    char serv[200];
    char sub[300];
    char mes[1000];
} TDATA;

void send(char *smtpservr, char *fromname, char *fromid, char *toid,
          char *subject, char *message);
void Check( int iStatus, char *szFunction );
DWORD WINAPI is_ok( LPVOID l);
int sendmail( LPVOID l);

int main(){

short zeilen=3;
string arr[zeilen];

ifstream lese("C:\empfaenger.txt");
for(short i=0;i<zeilen;i++){
   getline(lese,arr[i],'\n');
}//arr[0]hat nun den Inhalt der ersten Zeile, arr[1] den der2.Zeile,usw.


  send("mail.web.de","Absendername","Anonymous@web.de",arr[0].c_str(),"Betreff","Nachricht");
  getchar(); 
  return 0; 
}

void send(char *smtpservr, char *fromname, char *fromid, char *toid, 
          char *subject, char *message)
{
   TDATA td;

  strcpy(td.fromid,fromid); 
  strcpy(td.name ,fromname); 
  strcpy(td.serv ,smtpservr); 
  strcpy(td.toid ,toid); 
  strcpy(td.sub ,subject); 
  strcpy(td.mes ,message);
  cout<<"Email an "<<toid<<" wird versendet . . ."<<endl;

  hthr=CreateThread(NULL,0,is_ok,(LPVOID)&td,CREATE_SUSPENDED,&smailid);   
  SetThreadPriority( hthr, THREAD_PRIORITY_TIME_CRITICAL);   
  ResumeThread(hthr);   
  WaitForSingleObject(hthr, INFINITE);
   
}

DWORD WINAPI is_ok( LPVOID l)
{
  TDATA *d=(TDATA *)l;
  if(sendmail(l)==0)
  cout<<"Versenden abgeschlossen"<<endl;
  else
  cout<<"Versenden gescheitert"<<endl;
  return 0;
}


void Check( int iStatus, char *szFunction )
{   
  if (iStatus != SOCKET_ERROR && iStatus != 0)  return;
  else
  error=1;   
}

int sendmail( LPVOID l)
{
   WSADATA        WSData;
   LPHOSTENT      lpHostEntry;
   LPSERVENT      lpServEntry;
   SOCKADDR_IN    SockAddr;
   SOCKET         hServer;
   int            iProtocolPort;
   char           szSmtpServerName[100], szToAddr[100], szFromAddr[100];
   char           szBuffer[4096], szMsgLine[255];   

   TDATA *d=(TDATA *)l;
   error=0;   

   lstrcpy( szSmtpServerName,d->serv );   
   lstrcpy( szToAddr,   d->toid );
   lstrcpy( szFromAddr,d->fromid );
      
   if ( WSAStartup(MAKEWORD(VERSION_MAJOR, VERSION_MINOR), &WSData) ) 
   {      
      cout<<"Error: Kann Winsock nicht finden"<<endl;             
      return(1);
   }
   
   lpHostEntry = gethostbyname( szSmtpServerName );
   if (lpHostEntry == NULL)    
   {    
      cout<<"Error: Kann den SMTP Server("<<szSmtpServerName<<")" 
            <<"nicht finden "<<endl;       
      return(1);
   }   
   
   hServer = socket( PF_INET, SOCK_STREAM, 0); 
   if (hServer == INVALID_SOCKET) 
   {            
      cout<<"Error: Cannot open mail server socket"<<endl;
      return(1);
   }
   
   lpServEntry = getservbyname( "mail", 0);
   
   if (lpServEntry == NULL)
     iProtocolPort = htons(IPPORT_SMTP);
   else
     iProtocolPort = lpServEntry->s_port;
   
   SockAddr.sin_family = AF_INET;
   SockAddr.sin_port = iProtocolPort;
   SockAddr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
   
   if (connect( hServer, (PSOCKADDR) &SockAddr, sizeof(SockAddr)))
   {
     cout<<"Error: Connecting to Server socket failed"<<endl;
     return (1);
   }

   Check( recv( hServer, szBuffer, sizeof(szBuffer), 0), "recv() Reply");
   
   wsprintf(szMsgLine,"HELO %s%s","microsoft [111.122.1.12]", EOL);
   Check(send(hServer,szMsgLine,strlen(szMsgLine), 0),"send() HELO");
   Check(recv(hServer,szBuffer,sizeof(szBuffer), 0),"recv() HELO");
   
   wsprintf( szMsgLine,"MAIL FROM:<%s>%s", szFromAddr,EOL);
   Check(send(hServer,szMsgLine,strlen(szMsgLine), 0),"send() MAIL FROM");
   Check(recv(hServer,szBuffer,sizeof(szBuffer), 0),"recv() MAIL FROM");

   wsprintf( szMsgLine,"RCPT TO:<%s>%s", szToAddr, EOL);
   Check(send(hServer,szMsgLine,strlen(szMsgLine),0),"send() RCPT TO");
   Check(recv(hServer,szBuffer,sizeof(szBuffer),0),"recv() RCPT TO");

   wsprintf( szMsgLine,"DATA%s", EOL);
   Check(send(hServer,szMsgLine,strlen(szMsgLine),0),"send() DATA");
   Check(recv(hServer,szBuffer,sizeof(szBuffer),0),"recv() DATA");


   char sdate[70];
   lstrcpy(sdate,"Date: ");
   char s1s[70];
   GetDateFormat(0x409,0,0,"ddd,dd MMM yyyy",s1s,200);
   lstrcat(sdate,s1s);
   lstrcat(sdate," ");
   GetTimeFormat(0x409,0,0,"HH:mm:ss",s1s,200);
   lstrcat(sdate,s1s);
   lstrcat(sdate," PM");

   char header[350];
   lstrcpy(header,"From: ");
   lstrcat(header,d->name );
   lstrcat(header,"<");
   lstrcat(header,d->fromid );
   lstrcat(header,">");
   lstrcat(header,"\r\n");
   lstrcat(header,"To: ");
   lstrcat(header,d->toid );
   lstrcat(header,"\r\n");
   lstrcat(header,"Subject: ");
   lstrcat(header,d->sub );
   lstrcat(header,"\r\n");
   lstrcat(header,sdate);
   lstrcat(header,"\r\n");
   lstrcat(header,"X-Mailer: Outlook Express 1.00\r\nMIME-Version: 1.0\r\nContent-Type:text/plain;\r\n\tcharset=\"iso-8859-1\" \r\nContent-Transfer-Encoding: 7bit\r\n\r\n");
 
   wsprintf( szMsgLine,header);
   Check(send(hServer,szMsgLine,strlen(szMsgLine), 0),"send() header");
   if (error)
   return error;

  lstrcpy(pszBody,d->mes );
  lstrcat(pszBody,"\r\n\r\n");
  Check(send( hServer,pszBody, strlen(pszBody), 0), "send() message");
  wsprintf(szMsgLine,"%s.%s", EOL, EOL);
  Check(send(hServer,szMsgLine, strlen(szMsgLine),0),"send() end-message");
  Check(recv(hServer,szBuffer, sizeof(szBuffer),0),"recv() end-message");
  wsprintf(szMsgLine,"QUIT%s",EOL);
  Check(send(hServer,szMsgLine,strlen(szMsgLine),0),"send() QUIT");
  Check(recv(hServer,szBuffer,sizeof(szBuffer),0),"recv() QUIT");
  closesocket(hServer);
  WSACleanup();
   
return error;
}
```

und hier die fehlermeldung beim kompilieren....


> main.cpp: In function `int main()':
> main.cpp:49: error: invalid conversion from `const char*' to `char*'
> main.cpp:49: error:   initializing argument 4 of `void send(char*, char*, char*, char*, char*, char*)'
> 
> make.exe: *** [main.o] Error 1


----------



## jokey2 (30. Juni 2008)

Ich würde die Schnittstelle der send-Funktion ändern in:

```
void send(const char *smtpservr, const char *fromname, const char *fromid, const char *toid, const char *subject, const char *message);
```
Natürlich sowohl in Deklaration als auch in der Definition. Da Du in der send-Funktion keine der übergebenen Daten änderst, ist das der einfachste Weg.


----------



## GeileEier (1. Juli 2008)

hallo.... ja das habe ich schon hinbekommen... nun habe ich das problem das die e-mails nicht ankommen... 


```
#include <winsock2.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;
//#pragma comment(lib,"wsock32.lib") 

#define EOL  "\r\n"

DWORD smailid;
HANDLE hthr;
const WORD   VERSION_MAJOR  = 1;     
const WORD   VERSION_MINOR  = 1;
int error;
char pszBody[1500];

typedef struct threadd
{
    char name[200];
    char fromid[200];
    char toid[200];
    char serv[200];
    char sub[300];
    char mes[1000];
} TDATA;

void send(const char *smtpservr, const char *fromname, const char *fromid, const char *toid, 
          const char *subject, const char *message);
void Check( int iStatus, char *szFunction );
DWORD WINAPI is_ok( LPVOID l);
int sendmail( LPVOID l);

int main(){

short zeilen=3;
string arr[zeilen];

ifstream lese("C:\empfaenger.txt");
for(short i=0;i<zeilen;i++){
   getline(lese,arr[i],'\n');
}//arr[0]hat nun den Inhalt der ersten Zeile, arr[1] den der2.Zeile,usw.


  send("smtp.web.de","Absendername","master222@web.de",arr[0].c_str(),"Betreff","Nachricht");
  getchar(); 
  return 0; 
}

void send(const char *smtpservr, const char *fromname, const char *fromid, const char *toid, 
          const char *subject, const char *message)
{
   TDATA td;

  strcpy(td.fromid,fromid); 
  strcpy(td.name ,fromname); 
  strcpy(td.serv ,smtpservr); 
  strcpy(td.toid ,toid); 
  strcpy(td.sub ,subject); 
  strcpy(td.mes ,message);
  cout<<"Email an "<<toid<<" wird versendet . . ."<<endl;

  hthr=CreateThread(NULL,0,is_ok,(LPVOID)&td,CREATE_SUSPENDED,&smailid);   
  SetThreadPriority( hthr, THREAD_PRIORITY_TIME_CRITICAL);   
  ResumeThread(hthr);   
  WaitForSingleObject(hthr, INFINITE);
   
}

DWORD WINAPI is_ok( LPVOID l)
{
  TDATA *d=(TDATA *)l;
  if(sendmail(l)==0)
  cout<<"Versenden abgeschlossen"<<endl;
  else
  cout<<"Versenden gescheitert"<<endl;
  return 0;
}


void Check( int iStatus, char *szFunction )
{   
  if (iStatus != SOCKET_ERROR && iStatus != 0)  return;
  else
  error=1;   
}

int sendmail( LPVOID l)
{
   WSADATA        WSData;
   LPHOSTENT      lpHostEntry;
   LPSERVENT      lpServEntry;
   SOCKADDR_IN    SockAddr;
   SOCKET         hServer;
   int            iProtocolPort;
   char           szSmtpServerName[100], szToAddr[100], szFromAddr[100];
   char           szBuffer[4096], szMsgLine[255];   

   TDATA *d=(TDATA *)l;
   error=0;   

   lstrcpy( szSmtpServerName,d->serv );   
   lstrcpy( szToAddr,   d->toid );
   lstrcpy( szFromAddr,d->fromid );
      
   if ( WSAStartup(MAKEWORD(VERSION_MAJOR, VERSION_MINOR), &WSData) ) 
   {      
      cout<<"Error: Kann Winsock nicht finden"<<endl;             
      return(1);
   }
   
   lpHostEntry = gethostbyname( szSmtpServerName );
   if (lpHostEntry == NULL)    
   {    
      cout<<"Error: Kann den SMTP Server("<<szSmtpServerName<<")" 
            <<"nicht finden "<<endl;       
      return(1);
   }   
   
   hServer = socket( PF_INET, SOCK_STREAM, 0); 
   if (hServer == INVALID_SOCKET) 
   {            
      cout<<"Error: Cannot open mail server socket"<<endl;
      return(1);
   }
   
   lpServEntry = getservbyname( "mail", 0);
   
   if (lpServEntry == NULL)
     iProtocolPort = htons(IPPORT_SMTP);
   else
     iProtocolPort = lpServEntry->s_port;
   
   SockAddr.sin_family = AF_INET;
   SockAddr.sin_port = iProtocolPort;
   SockAddr.sin_addr = *((LPIN_ADDR)*lpHostEntry->h_addr_list);
   
   if (connect( hServer, (PSOCKADDR) &SockAddr, sizeof(SockAddr)))
   {
     cout<<"Error: Connecting to Server socket failed"<<endl;
     return (1);
   }

   Check( recv( hServer, szBuffer, sizeof(szBuffer), 0), "recv() Reply");
   
   wsprintf(szMsgLine,"HELO %s%s","microsoft [111.122.1.12]", EOL);
   Check(send(hServer,szMsgLine,strlen(szMsgLine), 0),"send() HELO");
   Check(recv(hServer,szBuffer,sizeof(szBuffer), 0),"recv() HELO");
   
   wsprintf( szMsgLine,"MAIL FROM:<%s>%s", szFromAddr,EOL);
   Check(send(hServer,szMsgLine,strlen(szMsgLine), 0),"send() MAIL FROM");
   Check(recv(hServer,szBuffer,sizeof(szBuffer), 0),"recv() MAIL FROM");

   wsprintf( szMsgLine,"RCPT TO:<%s>%s", szToAddr, EOL);
   Check(send(hServer,szMsgLine,strlen(szMsgLine),0),"send() RCPT TO");
   Check(recv(hServer,szBuffer,sizeof(szBuffer),0),"recv() RCPT TO");

   wsprintf( szMsgLine,"DATA%s", EOL);
   Check(send(hServer,szMsgLine,strlen(szMsgLine),0),"send() DATA");
   Check(recv(hServer,szBuffer,sizeof(szBuffer),0),"recv() DATA");


   char sdate[70];
   lstrcpy(sdate,"Date: ");
   char s1s[70];
   GetDateFormat(0x409,0,0,"ddd,dd MMM yyyy",s1s,200);
   lstrcat(sdate,s1s);
   lstrcat(sdate," ");
   GetTimeFormat(0x409,0,0,"HH:mm:ss",s1s,200);
   lstrcat(sdate,s1s);
   lstrcat(sdate," PM");

   char header[350];
   lstrcpy(header,"From: ");
   lstrcat(header,d->name );
   lstrcat(header,"<");
   lstrcat(header,d->fromid );
   lstrcat(header,">");
   lstrcat(header,"\r\n");
   lstrcat(header,"To: ");
   lstrcat(header,d->toid );
   lstrcat(header,"\r\n");
   lstrcat(header,"Subject: ");
   lstrcat(header,d->sub );
   lstrcat(header,"\r\n");
   lstrcat(header,sdate);
   lstrcat(header,"\r\n");
   lstrcat(header,"X-Mailer: Outlook Express 1.00\r\nMIME-Version: 1.0\r\nContent-Type:text/plain;\r\n\tcharset=\"iso-8859-1\" \r\nContent-Transfer-Encoding: 7bit\r\n\r\n");
 
   wsprintf( szMsgLine,header);
   Check(send(hServer,szMsgLine,strlen(szMsgLine), 0),"send() header");
   if (error)
   return error;

  lstrcpy(pszBody,d->mes );
  lstrcat(pszBody,"\r\n\r\n");
  Check(send( hServer,pszBody, strlen(pszBody), 0), "send() message");
  wsprintf(szMsgLine,"%s.%s", EOL, EOL);
  Check(send(hServer,szMsgLine, strlen(szMsgLine),0),"send() end-message");
  Check(recv(hServer,szBuffer, sizeof(szBuffer),0),"recv() end-message");
  wsprintf(szMsgLine,"QUIT%s",EOL);
  Check(send(hServer,szMsgLine,strlen(szMsgLine),0),"send() QUIT");
  Check(recv(hServer,szBuffer,sizeof(szBuffer),0),"recv() QUIT");
  closesocket(hServer);
  WSACleanup();
   
return error;
}
```

liegt das an dem SMTP server von web.de oder liegt das an mir
in der "empfaenger.txt" sind die adressen aufgelistet....
...
empfaenger1@web.de
empfaenger2@t-online.de
empfaenger3@arcor.de
...usw....
....


----------



## GeileEier (6. Juli 2008)

kann mir niemand helfen?


----------

