Запустите почтовый клиент по умолчанию, чтобы открыть окно «Отправить электронную почту» с предварительно выбранным вложенным файлом - PullRequest
4 голосов
/ 27 января 2011

Мне нужно добавить функцию «Создать и отправить по электронной почте» в наше приложение.Наша программа создает выходной файл, и я должен затем запустить почтовый клиент по умолчанию, чтобы открыть окно «Написать письмо», а выходной файл предварительно выбрать в качестве вложения.

Я видел, как это делают другие программы, даже если клиент по умолчанию - Thunderbird вместо Outlook.

Ответы [ 3 ]

3 голосов
/ 21 декабря 2012

Я использовал MAPI для достижения этой цели. Я использовал LoadLibrary и GetProcAddress, чтобы получить необходимые функции.

Я использовал следующий код:

bool MailSender::Send(HWND hWndParent, LPCTSTR szSubject)
{
    if (!m_hLib)
        return false;

    LPMAPISENDMAIL SendMail;
    SendMail = (LPMAPISENDMAIL) GetProcAddress(m_hLib, "MAPISendMail");

    if (!SendMail)
        return false;

    vector<MapiFileDesc> filedesc;
    for (std::vector<attachment>::const_iterator ii = m_Files.begin(); ii!=m_Files.end(); ii++)
    {
        MapiFileDesc fileDesc;
        ZeroMemory(&fileDesc, sizeof(fileDesc));
        fileDesc.nPosition = (ULONG)-1;
        fileDesc.lpszPathName = (LPSTR) ii->path.c_str();
        fileDesc.lpszFileName = (LPSTR) ii->name.c_str();
        filedesc.push_back(fileDesc);
    }

    std::string subject;
    if (szSubject)
        subject = utf16to8(szSubject).c_str();
    else
    {
        for (std::vector<attachment>::const_iterator ii = m_Files.begin(); ii!=m_Files.end(); ii++)
        {
            subject += ii->name.c_str();
            if (ii+1 != m_Files.end())
                subject += ", ";
        }
    }

    MapiMessage message;
    ZeroMemory(&message, sizeof(message));
    message.lpszSubject = (LPSTR) subject.c_str();
    message.nFileCount = filedesc.size();
    message.lpFiles = &filedesc[0];

    int nError = SendMail(0, (ULONG)hWndParent, &message, MAPI_LOGON_UI|MAPI_DIALOG, 0);

    if (nError != SUCCESS_SUCCESS && nError != MAPI_USER_ABORT && nError != MAPI_E_LOGIN_FAILURE)
        return false;

    return true;
}
2 голосов
/ 28 января 2011

Использование схемы mailto может быть решением, но оно будет сложным из-за ограничений на то, какие поля считаются безопасными (см. RFC 2368 и 6067 для полнойподробности, если вы хотите пойти по этому маршруту).

Другим решением было бы выяснить, какой почтовый клиент установлен, и - по возможности - запустить его и указать все, что вам нужно, из командной строки.См. здесь для Thunderbird и здесь для Outlook.

0 голосов
/ 16 марта 2019

Вы можете использовать следующую команду, чтобы запустить клиентское приложение по умолчанию с вложением.

"Путь к почтовому клиенту по умолчанию". -Mail -compose subject = 'Subject', attachment = 'File path', body = 'body' "

Путь к почтовому клиенту по умолчанию-> можно получить из пути реестра

HKEY_LM \ SOFTWARE \ Clients \ Mail \ Имя клиента электронной почты \ shell \ open \ command

Имя почтового клиента -> может быть взято из

HKEY_LM \ Software \ Clients \ Mail

...