Как программно отправить электронное письмо так же, как я могу «Отправить получателю» в проводнике Windows? - PullRequest
9 голосов
/ 04 ноября 2008

ShellExecute () позволяет мне выполнять простые задачи оболочки, позволяя системе позаботиться об открытии или печати файлов. Я хочу использовать аналогичный подход к программной отправке вложений электронной почты.

Я не хочу манипулировать Outlook напрямую, поскольку не хочу предполагать, какой почтовый клиент использует пользователь по умолчанию. Я не хочу отправлять электронное письмо напрямую, так как я хочу, чтобы у пользователя была возможность написать тело письма, используя предпочтительный клиент. Таким образом, я действительно хочу выполнить именно то, что делает Проводник Windows, когда я щелкаю правой кнопкой мыши файл и выбираю Отправить -> Получатель почты.

Я ищу решение C ++.

Ответы [ 4 ]

8 голосов
/ 05 ноября 2008

Это мое решение MAPI:

#include <tchar.h>
#include <windows.h>
#include <mapi.h>
#include <mapix.h>

int _tmain( int argc, wchar_t *argv[] )
{
    HMODULE hMapiModule = LoadLibrary( _T( "mapi32.dll" ) );

    if ( hMapiModule != NULL )
    {
        LPMAPIINITIALIZE lpfnMAPIInitialize = NULL;
        LPMAPIUNINITIALIZE lpfnMAPIUninitialize = NULL;
        LPMAPILOGONEX lpfnMAPILogonEx = NULL;
        LPMAPISENDDOCUMENTS lpfnMAPISendDocuments = NULL;
        LPMAPISESSION lplhSession = NULL;

        lpfnMAPIInitialize = (LPMAPIINITIALIZE)GetProcAddress( hMapiModule, "MAPIInitialize" );
        lpfnMAPIUninitialize = (LPMAPIUNINITIALIZE)GetProcAddress( hMapiModule, "MAPIUninitialize" );
        lpfnMAPILogonEx = (LPMAPILOGONEX)GetProcAddress( hMapiModule, "MAPILogonEx" );
        lpfnMAPISendDocuments = (LPMAPISENDDOCUMENTS)GetProcAddress( hMapiModule, "MAPISendDocuments" );

        if ( lpfnMAPIInitialize && lpfnMAPIUninitialize && lpfnMAPILogonEx && lpfnMAPISendDocuments )
        {
            HRESULT hr = (*lpfnMAPIInitialize)( NULL );

            if ( SUCCEEDED( hr ) )
            {
                hr = (*lpfnMAPILogonEx)( 0, NULL, NULL, MAPI_EXTENDED | MAPI_USE_DEFAULT, &lplhSession );

                if ( SUCCEEDED( hr ) )
                {
                    // this opens the email client with "C:\attachment.txt" as an attachment
                    hr = (*lpfnMAPISendDocuments)( 0, ";", "C:\\attachment.txt", NULL, NULL );

                    if ( SUCCEEDED( hr ) )
                    {
                        hr = lplhSession->Logoff( 0, 0, 0 );
                        hr = lplhSession->Release();
                        lplhSession = NULL;
                    }
                }
            }

            (*lpfnMAPIUninitialize)();
        }

        FreeLibrary( hMapiModule );
    }

    return 0;
}
2 голосов
/ 04 ноября 2008

Вы можете использовать стандартную команду "mailto:" в оболочке Windows. Будет запущен почтовый клиент по умолчанию.

1 голос
/ 05 ноября 2008

В следующем примере C ++ показано, как вызвать почтовый ярлык SendTo, используемый проводником Windows:

http://www.codeproject.com/KB/shell/sendtomail.aspx

0 голосов
/ 04 ноября 2008

Вам потребуется реализовать клиент MAPI . Это позволит вам предварительно заполнить документ, добавить вложения и т. Д. Перед тем, как отправить сообщение пользователю для отправки. Вы можете использовать хранилище сообщений по умолчанию, чтобы использовать их почтовый клиент по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...