Вызов погашения приводит к сбою Outlook, но только для некоторых получателей и пока только для ol 2013

Я взял этот код с сайта выкупа: http://www.dimastr.com/redemption/objects.htm

Function IsOneOffEntryID(EntryID)
'check the first 20 bytes
  OOEID = Array(0,0,0,0,&H81,&H2B,&H1F,&HA4,&HBE,&HA3,&H10,&H19,&H9D,&H6E,0,&HDD,&H01,&H0F,&H54,&H02)
  IsOneOffEntryID = true
  for i = 0 to 19
    if EntryID(i) <> OOEID(i) Then
      IsOneOffEntryID = false
      Exit Function
    End If
  Next
End Function

PR_ENTRYID = &HFFF0102
PR_SEND_RICH_INFO = &H3A40000B
set sItem = CreateObject("Redemption.SafeMailItem")
sItem.Item = MailItem
For i = 1 to sItem.Recipients.Count
  entryBytes = sItem.Recipients.Item(i).Fields(PR_ENTRYID)
  If IsOneOffEntryID(entryBytes) Then
    entryBytes(22) = 1
    sItem.Recipients.Item(i).Fields(PR_ENTRYID) = entryBytes
    sItem.Recipients.Item(i).Fields(PR_SEND_RICH_INFO) = false
    MailItem.Subject = MailItem.Subject   ' just to make Outlook think something has changed
    MailItem.Save
  End If
Next

и перекодировал его в С#:

private static bool IsOneOffEntryID(object[] EntryID)
{
    byte[] OOEID = new byte[]
            {
                0, 0, 0, 0, 0x81, 0x2B, 0x1F, 0xA4, 0xBE, 0xA3, 0x10, 0x19, 0x9D, 0x6E, 0, 0xDD, 0x01, 0x0F, 0x54,
                0x02
            };

    bool IsOneOffEntryID = true;
    for (int i = 0; i < 20; i++)
    {
        if ((byte)EntryID[i] != OOEID[i])
        {
            IsOneOffEntryID = false;
            break;

        }
    }
    return IsOneOffEntryID;
}

public static void ForcePlain(Outlook.MailItem item)
{
    Log.Debug("ForcePlain entry");
    int PR_ENTRYID = 0xFFF0102;
    int PR_SEND_RICH_INFO = 0x3A40000B;

    SafeMailItem smailItem = RedemptionLoader.new_SafeMailItem();
    SafeRecipients recpts = null;
    SafeRecipient recpt = null;
    smailItem.Item = item;

    recpts = smailItem.Recipients;

    for (int i = 1; i <= recpts.Count; i++)
    {
        recpt = recpts[i];

        object[] entryBytes = recpt.Fields[PR_ENTRYID] as object[];

        if (IsOneOffEntryID(entryBytes))
        {
            entryBytes[22] = 1;
            recpt.Fields[PR_ENTRYID] = entryBytes;
            Log.Debug("Just before setting flag ...");
            recpt.Fields[PR_SEND_RICH_INFO] = 0;
            item.Subject = item.Subject;
            item.Save();
        }

        Marshal.ReleaseComObject(recpt);
        recpt = null;
    }

    if (smailItem != null)
    {
        Marshal.ReleaseComObject(smailItem);
        smailItem = null;
    }

    if (recpts != null)
    {
        Marshal.ReleaseComObject(recpts);
        recpts = null;
    }


    Log.Debug("ForcePlain exit");
}

В большинстве случаев это работает. Однако звоните:

recpt.Fields[PR_SEND_RICH_INFO] = 0;

сбой Outlook, но только для определенных получателей. Как я уже сказал, в большинстве случаев это работает, но у нас есть 2 тестовых компьютера, на которых возникла эта проблема.

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

Очень плохая ситуация, так как она не генерирует исключение, которое я мог бы обработать, но просто вылетает из Outlook.

Спасибо, Веля.


person Velja Radenkovic    schedule 06.11.2015    source источник


Ответы (1)


«Сбой» как в «необработанном нарушении доступа»? Или ошибка COM?

Обратите внимание, что PR_SEND_RICH_INFO — это логическое свойство, а не целое число:

recpt.Fields[PR_SEND_RICH_INFO] = false;
person Dmitry Streblechenko    schedule 06.11.2015
comment
Outlook перерабатывает. Никаких исключений не выбрасывается. См. также screencast.com/t/nuOMIXhn70. Только в этом случае он тоже вылетает на моей машине с OL2013. Я прочитал о типе PT_BOOLEAN, который в основном является целым, измененным на 0, и он начал работать на моей машине. В любом случае, я верну его обратно в false, чтобы убедиться, что я ничего не пропустил, и подтвержу свои утверждения. - person Velja Radenkovic; 06.11.2015
comment
Отправьте электронное письмо по ссылке поддержки по адресу dimastr.com/redemption/contact.htm и Я вышлю вам отладочную версию. - person Dmitry Streblechenko; 06.11.2015