Email mit Dateien perWinAPI versenden??



  • Hi Leutz!

    Wie man ein Email sendet, weiss ich.
    Aber wie muss man das machen, oder den code Abändern, um eine DATEI zu versenden??

    mfg
    Programmer



  • Hallo,

    vielleicht hilft dir das weiter:

    MapiRecipDesc recipient =
      {
        0, MAPI_TO,   
        "jemand",    
        "SMTP:jemand@abc.com",    // empfänger
        0, NULL
      };
    
      MapiFileDesc attachment = {0,            // ulReserved, muss 0 sein
                                 0,            // keine flags, da Datei
                                 (ULONG)-1,    // position unbekannt
                                 "c:\\myfile.zip",         // pfadname
                                 "my_file.zip",         // original dateiname
                                 NULL};        // kein MapiFileTagExt 
    
      MapiMessage message =
      {
        0, "blah blah blah ...",
        "'ne Nachricht für dich!",
        NULL, NULL, NULL, 0, NULL, 1, &recipient, 1, &attachment
      };
    
      lpfnMAPISendMail = (LPMAPISENDMAIL)GetProcAddress(hMAPILib,"MAPISendMail");
      (*lpfnMAPISendMail)(lhSession, 0, &message, 0, 0);
    

    ciao,JMM2002



  • hi,

    Wie man ein Email sendet, weiss ich.

    wie machst du es dann, über das SMTP-Protokoll. Wenn ja, musst du die Datei, die du schicken willst, vorher kodieren. Hier kommen 2 Verfahren in Frage : Das UUENCODE und das MIME-Verfahren.

    Wenn du genau das suchst, kann ich dir weiterhelfen. Ich musste in einem Praktikum mit VBA ein Email-Client entwicklen, den man direkt mittels einen neuen Menüeintrages in MS Word zum email-versenden benutzen kann. (habe auch das MIME-Verfahren benutzt).

    Den Client habe ich auch mittlerweile in C (und winapi) portiert, (Ist eine GUI-Anwendung), und kann auch Dateien versenden, leider nur eine auf ein mal, habe immer noch ein Problem 3 oder mehr Dateien zu versenden.

    Hoffe, koennte helfen.

    The Beginner.

    PS.
    Unglaublich, das System zeigt mich immer als unregistriert, obwohl ich mich angemeldet habe :(((



  • Ich hatte den Code aus der FAQ mal um Datei-Anhänge ergänzt.
    Das Beispiel 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[20];
    
        if(NULL == (hDll = LoadLibrary(TEXT("MAPI32.DLL"))))
        {
            _tprintf(TEXT("could not load mapi32.dll, ErrorCode: %u"), GetLastError());
            return(0);
        }
    
        pfnLogon    = (LPMAPILOGON)   GetProcAddress(hDll, "MAPILogon");
        pfnLogoff   = (LPMAPILOGOFF)  GetProcAddress(hDll, "MAPILogoff");
        pfnSendMail = (LPMAPISENDMAIL)GetProcAddress(hDll, "MAPISendMail");
    
        pfnLogon(0, NULL, NULL, 0, 0, &lHnd);
    
        mapimsg.ulReserved          = 0;
        mapimsg.lpszSubject         = "Subject";
        mapimsg.lpszNoteText        = "Hi!\n\nAnbei ist eine Datei!\n\nGruß\nIch\n"; // Text des EMails
        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     = "ich@empfänger.de"; // Empfänger
        rdRecipient[0].lpszAddress  = "";
        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 Datei
        mapifiledesc[0].lpszFileName = "Datei.txt"; // so heisst die Datei im Anhang des EMails
        mapifiledesc[0].lpFileType = 0;
    
    // Für die2te 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";
        mapifiledesc[1].lpszFileName = "Log.txt";
        mapifiledesc[1].lpFileType = 0;
    
        pfnSendMail(lHnd, NULL, &mapimsg, 0, 0);
    
        pfnLogoff(lHnd, 0, 0, 0);
    
        FreeLibrary(hDll);
    
      return(0);
    }
    

    [ Dieser Beitrag wurde am 18.08.2002 um 08:53 Uhr von TKool editiert. ]



  • Jo, danke!!

    es klappt soweit!
    Genau das hab ich gesucht



  • wenn man eine email mit dem SMTP-Protokoll schicken will, muss man eine reine Socket-Verbindung zum SMTP-Server herstellen. Es kommt hier oft im Forum, dass man irgendwelche MAPI-Schnittstelle oder Befehle benutzt. Ich wuerde gerne wissen, was das eigentlich ist, und warum es oft benutzt wird.

    Spielt es in diesem Falle nicht eine Rolle, welches Email Client man benutzt, wird es nicht unbedingt nur mit Outlook benutzt.

    Was ist, wenn ich eine Email verscchicken will, ohne das auf mein System ein Email Client läuft.

    Liege ich richtig oder daneben??

    TheBeginner.



  • SimpleMAPI ist eine einfache und schnelle Möglichkeit EMAils zu verschicken.
    Funktioniert aber nur mit der passenden DLL.
    Möglicherweise auch nur mit Outlook, allerdings habe ich es auch mit keinem anderen Programm versucht..

    Wenn man direkt über SMTP verschickt ist man von Outlook oder vergleichbaren unabhängig.
    Das ist aber vile mehr an Aufwand zu betreiben als wie mit SimpleMAPI.



  • HILFE! Auch ich arbeite nach dem obigen Beispiel!
    Aber ich muss eine E-Mail an meherere... Vielleicht bis zu 20 E-Mail Adressen verschicken können... Das soll kein Hacktool werden sondern ein Programm für Clans, die Nachrichten an alle Clanmitglieder vesenden wollen. Wie versende ich an 10 Leute gleichzeitig??? Nach diesem Beispiel nach????

    PLZ HELP



  • Das sind die Empfänger:

    MapiRecipDesc  rdRecipient[1];
    

    Zurzeit ist das also nur einer. Mach das Array grösser, fülle auch die zusätzlichen Strukturen aus und gebe die neue Array-Größe bekannt (mapimsg.nRecipCount, erledigt NUM_ELEMENTS im Beispiel automatisch).



  • OK THX!



  • NOchmal help plz....
    ich hab ne funktion geschrieben... szAdress enthält dann z.B sowas:

    "erste@mail;zweite@mail;dritte@mail"

    und die funktion schneidet sie sozusagen auseinander und setzt die werde des MAPI structs.... das ergebnis stimmt fast... aus dem obigenbeispiel steht aber dann im outlook fenster:

    "SMTP:dritte@mail;SMTP:dritte@mail;SMTP:dritte@mail"

    also faaast richtig. die mails sollten noch stimmen, aber ich finde nicht raus warum überall "dritte@mail" steht :(((

    was is da los?

    void Mail_Send(const char *szToName, const char *szAddress, const char *szMyName, const char *szMyMail, const char *szSubject, const char *szText)
    {
        int iCCs = 2;
        for(int i=0; i<(int)strlen(szAddress); i++) if(szAddress[i] == ';') iCCs++;
    
        LPMAPISENDMAIL pfnSendMail;
        MapiRecipDesc  rdOriginator;
        MapiRecipDesc  rdRecipient[30];
        LPMAPILOGOFF   pfnLogoff;
        LPMAPILOGON    pfnLogon;
        MapiMessage    mapimsg;
        HINSTANCE      hDll;
        LHANDLE        lHnd;
    
        char szMsg[MAX_PATH];
    
        if((hDll = LoadLibrary(TEXT("MAPI32.DLL"))) == NULL)
        {
            MessageBox(hMainDlg, "ERROR!\nmapi32.dll konnte nicht geladen werden.", "Member Manager", MB_ICONERROR);
            return;
        }
    
        pfnLogon    = (LPMAPILOGON)GetProcAddress(hDll, "MAPILogon");
        pfnLogoff   = (LPMAPILOGOFF)GetProcAddress(hDll, "MAPILogoff");
        pfnSendMail = (LPMAPISENDMAIL)GetProcAddress(hDll, "MAPISendMail");
    
        pfnLogon(0, NULL, NULL, 0, 0, &lHnd);
    
        mapimsg.ulReserved   = 0;
        mapimsg.lpszSubject  = (char *)szSubject;
        mapimsg.lpszNoteText = (char *)szText;
        mapimsg.lpszMessageType    = NULL;
        mapimsg.lpszDateReceived   = NULL;
        mapimsg.lpszConversationID = NULL;
        mapimsg.flFlags      = 0;
        mapimsg.lpOriginator = &rdOriginator;
        mapimsg.nRecipCount  = iCCs-1;
        mapimsg.lpRecips     = rdRecipient;
        mapimsg.nFileCount   = 0;
    
        rdOriginator.ulReserved   = 0;
        rdOriginator.ulRecipClass = MAPI_ORIG;
        rdOriginator.lpszName     = (char *)szMyName;
        rdOriginator.lpszAddress  = (char *)szMyMail;
        rdOriginator.ulEIDSize    = 0;
        rdOriginator.lpEntryID    = NULL;
    
        int iNo = 0;
        int iPos = 0;
        char szCurMail[MAX_PATH];
    
        if(iCCs == 2)
        {
            rdRecipient[0].ulReserved   = 0;
            rdRecipient[0].ulRecipClass = MAPI_TO;
            rdRecipient[0].lpszName     = (char *)szToName;
            sprintf(szMsg, "SMTP:%s", szAddress);
            rdRecipient[0].lpszAddress  = szMsg;
            rdRecipient[0].ulEIDSize    = 0;
            rdRecipient[0].lpEntryID    = NULL;
        }
        else
        {
            for(int i=0; i<(int)strlen(szAddress); i++)
            {
                if(szAddress[i] == ';')
                {
                    szCurMail[iPos] = '\0';
                    rdRecipient[iNo].ulReserved   = 0;
                    rdRecipient[iNo].ulRecipClass = MAPI_TO;
                    rdRecipient[iNo].lpszName     = (char *)szToName;
                    sprintf(szMsg, "SMTP:%s", szCurMail);
                    rdRecipient[iNo].lpszAddress  = (char *)szMsg;
                    rdRecipient[iNo].ulEIDSize    = 0;
                    rdRecipient[iNo].lpEntryID    = NULL;
                    iPos = 0;
                    szCurMail[0] = '\0';
                    iNo++;
                }
                else
                {
                    szCurMail[iPos] = szAddress[i];
                    iPos++;
                }
            }
    
            szCurMail[iPos] = '\0';
            rdRecipient[iNo].ulReserved   = 0;
            rdRecipient[iNo].ulRecipClass = MAPI_TO;
            rdRecipient[iNo].lpszName     = (char *)szToName;
            sprintf(szMsg, "SMTP:%s", szCurMail);
            rdRecipient[iNo].lpszAddress  = (char *)szMsg;
            rdRecipient[iNo].ulEIDSize    = 0;
            rdRecipient[iNo].lpEntryID    = NULL;
        }
    
        pfnSendMail(lHnd, NULL, &mapimsg, 0, 0);
        pfnLogoff(lHnd, 0, 0, 0);
        FreeLibrary(hDll);
    }
    

    [ Dieser Beitrag wurde am 09.06.2003 um 18:39 Uhr von ChrisK editiert. ]



  • habs.
    rdRecipient[iNo].lpszAddress = (char )szMsg;
    hat immer auf die selbe speicheradresse gezeigt. (danke fatbull) *G*G