Что-то особенное в отправке в Outlook 2013 с MAPI, которое мне не хватает? - PullRequest
0 голосов
/ 12 февраля 2019

Я работаю над интерфейсом Simple MAPI с Visual Studio 2008 для отправки электронной почты и вложений из приложения.Прекрасно работает с Thunderbird и Outlook 6, но Outlook 2013 доставляет мне много горяобратно (или кажется, поскольку я думаю, что это внутреннее) с сообщением «Ни одна из ваших учетных записей электронной почты не может отправить этому получателю».

  • Если я создаю новое сообщение в Outlook с таким точнымадрес электронной почты работает нормально.Я пробовал две разные исходящие учетные записи SMTP, которые, как я знаю, работают и работают вручную, но с IMAP они застряли.В коде IMAP, который я использовал, не было исходных данных, и я взломал его, чтобы попытаться заставить его работать (код, который я публикую, немного сырой, потому что я все еще пытаюсь это выяснить)

2) В Outlook отобразится сообщение «Программа пытается отправить электронное сообщение от вашего имени».

  • Я установил в Outlook Trust Center доступ «Никогда не предупреждать».о деятельности ", как описано в большом количестве онлайн-справки, но проблема сохраняется.Я не могу не думать, что это может быть связано?

Мне интересно, нужно ли Outlook 2013 больше данных, чем я предоставляю, или я делаю какие-то глупые предположения.

Примечание. Эти тесты выполняются на трех разных компьютерах: Thunderbird на моей основной машине для разработки Win 10, Outlook 6 на виртуальной машине с XP и Outlook 2013 на другой машине с Windows 10.

Примечание по кодуЯ использую CPtrArrays для хранения данных, переданных вызывающей функцией.Вы увидите GetAt () при настройке получателей.

Спасибо!

MapiRecipDesc sender[1];
MapiRecipDesc recipient[50];
MapiFileDesc fileDesc[20];

sender[0].ulRecipClass = MAPI_ORIG;
sender[0].lpszAddress = "me@me.net";
sender[0].lpszName = "Me";
sender[0].lpEntryID = 0;
sender[0].ulEIDSize = 0;
sender[0].ulReserved = 0;

iToCount = 0;
iIndex = 0;
while (iIndex < m_paTo.GetCount()) {
    recipient[iToCount].ulRecipClass = MAPI_TO;
    recipient[iToCount].lpszAddress = (char *) m_paTo.GetAt(iToCount);
    recipient[iToCount].lpszName = (char *) m_paTo.GetAt(iToCount);
    recipient[iToCount].lpEntryID = 0;
    recipient[iToCount].ulEIDSize = 0;
    recipient[iToCount].ulReserved = 0;
    iIndex++;
    iToCount++;
}

iIndex = 0;
while (iIndex < m_paCC.GetCount()) {
    recipient[iToCount].ulRecipClass = MAPI_CC;
    recipient[iToCount].lpszAddress = (char *) m_paCC.GetAt(iIndex);
    recipient[iToCount].lpszName = (char *) m_paCC.GetAt(iIndex);
    recipient[iToCount].lpEntryID = 0;
    recipient[iToCount].ulEIDSize = 0;
    recipient[iToCount].ulReserved = 0;
    iIndex++;
    iToCount++;
}

iIndex = 0;
while (iIndex < m_paBCC.GetCount()) {
    recipient[iToCount].ulRecipClass = MAPI_BCC;
    recipient[iToCount].lpszAddress = (char *) m_paBCC.GetAt(iIndex);
    recipient[iToCount].lpszName = (char *) m_paBCC.GetAt(iIndex);
    recipient[iToCount].lpEntryID = 0;
    recipient[iToCount].ulEIDSize = 0;
    recipient[iToCount].ulReserved = 0;
    iIndex++;
    iToCount++;
}

iFileCount = 0;
iIndex = 0;
while (iIndex < m_paAttachments.GetCount()) {
    fileDesc[iFileCount].flFlags = 0;
    fileDesc[iFileCount].lpFileType = 0;
    fileDesc[iFileCount].lpszFileName = (char *) m_paAttachments.GetAt(iIndex);
    fileDesc[iFileCount].lpszPathName = (char *) m_paAttachments.GetAt(iIndex);
    fileDesc[iFileCount].nPosition = -1;
    fileDesc[iFileCount].ulReserved = 0;
    iIndex++;
    iFileCount++;
}



TCHAR szSubject[_MAX_PATH];
TCHAR szMessage[5001];
::StrCpy(szSubject, m_sSubject);
::StrCpy(szMessage, m_sMessage);


MapiMessage message;
::ZeroMemory(&message, sizeof(message));
message.lpszSubject = szSubject;
message.nRecipCount = iToCount;
message.lpRecips = recipient;
message.nFileCount = iFileCount;
message.lpFiles = fileDesc;
message.lpszNoteText = szMessage;
message.flFlags = MAPI_SENT | MAPI_UNREAD;
message.lpszConversationID = "123";
message.lpOriginator = sender;



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

if (nError != SUCCESS_SUCCESS && 
    nError != MAPI_USER_ABORT && 
    nError != MAPI_E_LOGIN_FAILURE) {
    CString sMessage;
    CString sTest = recipient[0].lpszAddress;
    sMessage.Format("MapiMail:: SendMail Error code %d Recip count %d: first Recip: %s", nError, message.nRecipCount, sTest);
    AfxMessageBox(sMessage);
    lLog.WriteString(sMessage);
    return false;
}

1 Ответ

0 голосов
/ 16 февраля 2019

По совету Бармака Шемирани я выкладываю свой собственный ответ.Если кто-то еще ищет эту информацию, возможно, я смогу сэкономить время, разместив ее здесь в одном месте.

  1. "Ни одна из ваших учетных записей электронной почты не может быть отправлена ​​этому получателю«.Проблема может быть решена путем помещения адреса электронной почты получателя в заостренные скобки в поле имя в структуре получателя.Оставьте поле адреса пустым.Так, например,

    ::StrCpy(szTo, "<address@email.com>");
    recipient[iToCount].ulRecipClass = MAPI_TO;
    recipient[iToCount].lpszAddress = 0;
    recipient[iToCount].lpszName = szTo;
    recipient[iToCount].lpEntryID = 0;
    recipient[iToCount].ulEIDSize = 0;
    recipient[iToCount].ulReserved = 0;
    

    Я протестировал это в Outlook 2013 и 2016, а также в Outlook 6, Thunderbird и EM Client, и все они довольны.По-видимому, вы также можете указать имя PersonName <name@email.com>, но я его не проверял.

  2. Проблема с отображением Outlook:

    Программапопытка отправить электронное сообщение от вашего имени

    - это проблема конфигурации программного обеспечения.Большинство веб-сайтов советуют использовать Центр управления безопасностью для настройки Программного доступа, чтобы разрешить доступ другим приложениям через MAPI.Вы должны установить запуск программы от имени администратора, но вы также должны запустить Outlook от имени администратора, чтобы он работал

    Обходной путь - отредактировать реестр и добавить DWORD PromptSimpleMAPISend со значениемиз 2 в:

    Computer\HKEY_CURRENT_USER\Software\Policies\Microsoft\Office\x.0\Outlook\Security
    
  3. Бонусный ответ.Если кто-то интересуется HTML в MAPI, он не поддерживается.MAPI явно предшествует обычному использованию электронной почты в формате HTML.

    Есть обходной путь.Вы можете оставить тело сообщения пустым и вместо этого поместить свое сообщение в html в файл и поместить этот файл в качестве первого вложения в сообщение MAPI.Я назвал свой файл с расширением .html.

    Это немного ошибочно - почтовые клиенты его подбирают и отображают HTML в теле письма.Ваш html-файл все еще будет вложением, за которым следуют любые другие вложения.

Я тестировал с Thunderbird, Outlook и EM Client.Я быстро взглянул на одну программу чтения электронной почты в Интернете, и она не отображала HTML-текст (хотя вложение было доступно для чтения).

...