e-Mail Problem
-
Hi Freunde!
Ich habe mir mal von einer C++ Seite ein WinAPI-Beispiel runtergeladen um mal eine e-Mail zu verschicken, nur leider funzt es nicht#include <iostream.h> #include <stdio.h> #include <conio.h> #include <winsock2.h> #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() { send("mail.web.de","Absendername","Anonymous@ano.de","empfaenger@etwas.de", "Betreff","Nachricht"); getch(); 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; }
nun ja, das Programm wir fehlerfrei kompiliert, habe vorher noch die richtigen Librarys rausgesucht (ich use den Borland C++ Builder 4) und das Programm meldet, sofern ein korrekter SMTP-Server angegeben wurde das die mail erfolgreich versendet werden konnte. Tut sie aber nicht, denn nicht ein mal kam was an und ich habe bestimmt 6 verschiedene SMTP-Server ausprobiert. Was mache ich noch falsch???
code_pilot
-
In der Regel ist es so, dass bevor du eine E-Mail über einen SMTP-Server (wie etwa der von Web.de) verschickst, dich via POP3 einloggen musst.
Es gibt aber auch solche, bei denen dies nicht notwendig ist. Aber bei GMX oder Web.de oder vergleichbare werden eben keine E-Mails verschickt, wenn nicht vorher eingeloggt ...
ich hoffe, ich konnte dir helfen
-
Hamm aber weist du was funkte:
TelNet mail.web.de:25HELO world
MAIL FROM: ich@web.de
RCPT TO: du@web.de
DATA
Das
ist
ein
Test
.
QUITund die kam an. Muss ich da irgendwie noch sagen über welchen Port oder wie? ich habe das Prog ja nicht selber geschrieben sondern es aus einem Sample kopiert und wollte fragen warum es da nicht geht...
-
Hast du es 1:1 kopiert? Oder hast du einige Stellen angepasst? Wenn du was verändert hast, könntest du die Stellen bitte markieren?
cya
-
nimm doch das Bsp. von Winapi.net dort wird auch beschrieben wie du einen Anhang dazu packen kannst un sieht nicht so komplexe aus hier falls du es nicht findest.
Dateien mit SIMPLEMAPI verschicken
Mit der WinAPI kann man auch EMails per Outlook verschicken.
Dazu gibt es die sogenannte SIMPLE-MAPI mit der es ganz komfortabel geht.
Es ist aber zu beachten, dass auf dem betreffenden PC die MAPI32.DLL vorhanden ist!Das Beispiel hier verschickt 2 Dateien:
int _tmain(void)
{
LPMAPISENDMAIL pfnSendMail;
MapiRecipDesc rdOriginator;
MapiRecipDesc rdRecipient[1];
LPMAPILOGOFF pfnLogoff;
LPMAPILOGON pfnLogon;
MapiMessage mapimsg;
HINSTANCE hDll;
LHANDLE lHnd;
MapiFileDesc mapifiledesc[2];if(NULL == (hDll = LoadLibrary(TEXT("MAPI32.DLL"))))
{
_tprintf(TEXT("could not load mapi32.dll, ErrorCode: %u"), GetLastError());
return(0);
}// Die Funktionen aus der DLL holen
pfnLogon = (LPMAPILOGON)GetProcAddress(hDll, "MAPILogon");
pfnLogoff = (LPMAPILOGOFF)GetProcAddress(hDll, "MAPILogoff");
pfnSendMail = (LPMAPISENDMAIL)GetProcAddress(hDll, "MAPISendMail");pfnLogon(0, NULL, NULL, 0, 0, &lHnd); // Einloggen
mapimsg.ulReserved = 0;
mapimsg.lpszSubject = "Subject";
mapimsg.lpszNoteText = "Hi!\n\nAnbei ist eine Datei!\n\nGruß\nIch\n"; // EMailtext
mapimsg.lpszMessageType = NULL;
mapimsg.lpszDateReceived = NULL;
mapimsg.lpszConversationID = NULL;
mapimsg.flFlags = 0;
mapimsg.lpOriginator = &rdOriginator;
mapimsg.nRecipCount = NUM_ELEMENTS(rdRecipient);
mapimsg.lpRecips = rdRecipient;
mapimsg.nFileCount = 2; //2 Dateien anhängen
mapimsg.lpFiles = &mapifiledesc[0];rdOriginator.ulReserved = 0;
rdOriginator.ulRecipClass = MAPI_ORIG;
rdOriginator.lpszName = "rdOriginator";
rdOriginator.lpszAddress = "ich@sender.de"; // Sender
rdOriginator.ulEIDSize = 0;
rdOriginator.lpEntryID = NULL;rdRecipient[0].ulReserved = 0;
rdRecipient[0].ulRecipClass = MAPI_TO;
rdRecipient[0].lpszName = "Empfängername"; // Empfängername
rdRecipient[0].lpszAddress = "SMTP:ich@empfaenger.de"; // Empfängeradresse
rdRecipient[0].ulEIDSize = 0;
rdRecipient[0].lpEntryID = NULL;mapifiledesc[0].ulReserved = 0;
mapifiledesc[0].flFlags = 0;
mapifiledesc[0].nPosition = -1;
mapifiledesc[0].lpszPathName = "C:\\Autostart.bat"; // Die erste Datei
mapifiledesc[0].lpszFileName = "Datei.txt"; // so heisst die Datei im Anhang des EMails
mapifiledesc[0].lpFileType = 0;// Für die 2te Datei kann man sich dann hierauf beschränken:
mapifiledesc[1].ulReserved = 0;
mapifiledesc[1].flFlags = 0;
mapifiledesc[1].nPosition = -1;
mapifiledesc[1].lpszPathName = "C:\\Bootlog.txt"; // Die zweite Datei
mapifiledesc[1].lpszFileName = "Log.txt";
mapifiledesc[1].lpFileType = 0;pfnSendMail(lHnd, NULL, &mapimsg, 0, 0); // Das eigentliche Versenden
pfnLogoff(lHnd, 0, 0, 0); // Ausloggen
FreeLibrary(hDll);
return(0);
}
-
Wenn du's schon kopierst, könntest du wenigstens Code-Tags verwenden ;).
cya
-
Hi!
Besten dank habs selber hingekriegt mit einem anderen Beispiel das man schon als kleinen Telnet-Client benutzen kann :)))code_pilot