как найти почту, которая была отправлена ​​MailItem.Display () - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть следующее требование:

  • Разрешить пользователю перетаскивать электронное письмо из Outlook в сетку данных
  • Подготовить ответное письмо и показать его, чтобы пользователь мог просмотретьи отправьте
  • После отправки также получите отправляемое письмо и поместите его в сетку данных

Перетащите / отбросьте, что у меня есть
Подготовка электронного письма для воспроизведения и отображение его наПользователь, с которым я работаю, также работает с этим кодом:

MailItem mail = GetMailBySubject(dateReceived, subject);
if (mail != null)
{
    MailItem mailReply = mail.ReplyAll();
    // add text and stuff to mailReply...
    mailReply.Display();
}

Это откроет окно в Outlook, как если бы пользователь щелкнул по ответу в Outlook.

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

Но я понятия не имею, как это сделать.
Все, что у меня есть, - это исходное письмо, которое использовалось для подготовки ответа.
Есть ли способ найти ответ только с этим, или, может быть, это совершенно неправильный подход?
Чтобы сделать это более сложным, мне нужно показать ответное электронное письмо НЕ МОДАЛЬНО, поэтому у меня нет триггера, когда пользователь нажимает кнопку отправить в outlook.

для справки вот код для GetMailBySubject

private MailItem GetMailBySubject(DateTime dateReceived, string subject)
{
    MailItem Result = null;

    Microsoft.Office.Interop.Outlook.Application OutlookIns = new Microsoft.Office.Interop.Outlook.Application();
    Microsoft.Office.Interop.Outlook.NameSpace olNamespace = OutlookIns.GetNamespace("MAPI");
    MAPIFolder myInbox = olNamespace.GetDefaultFolder(OlDefaultFolders.olFolderInbox);

    Items items = myInbox.Items;
    int count = items.Count;
    MailItem mail = null;
    int i = 1; //DO NOT START ON 0

    while ((i < count) && (Result == null))
    {
        if (items[i] is MailItem)
        {
            mail = (MailItem)items[i];
            if ((mail.ReceivedTime.ToString("yyyyMMdd hh:mm:ss") == dateReceived.ToString("yyyyMMdd hh:mm:ss")) && (mail.Subject == subject))
            {
                Result = mail;
            }
        }
        i++;
    }

    return Result;
}

EDIT
Я попробовал этот код, как предложено, но событие Items.ItemAdd не запускается.
Так что ядолжно быть, все еще что-то не так, но я не вижу этого

теперь это мой код

MailItem mail = GetMailBySubject((DateTime)sentOn, msg.Subject);
if (mail != null)
{
    MailItem mailReply = mail.ReplyAll();
    mailReply.HTMLBody = GetDefaultReplyText() + Environment.NewLine + mailReply.HTMLBody;

    Guid guid = Guid.NewGuid();
    UserProperties mailUserProperties = null;
    UserProperty mailUserProperty = null;

    mailUserProperties = mailReply.UserProperties;
    mailUserProperty = mailUserProperties.Add("myproperty", OlUserPropertyType.olText);
    mailUserProperty.Value = guid.ToString(); ;
    // the code below gives error "The property cannot be parsed or has an invalid format"
    //mailReply.PropertyAccessor.SetProperty("myproperty", guid.ToString());

    mailReply.Display();
}


private MailItem GetMailBySubject(DateTime dateReceived, string subject)
{
    MailItem Result = null;

    Microsoft.Office.Interop.Outlook.Application OutlookIns = new Microsoft.Office.Interop.Outlook.Application();
    Microsoft.Office.Interop.Outlook.NameSpace olNamespace = OutlookIns.GetNamespace("MAPI");
    MAPIFolder myInbox = olNamespace.GetDefaultFolder(OlDefaultFolders.olFolderInbox);

    Items items = myInbox.Items;
    int count = items.Count;
    MailItem mail = null;
    int i = 1; //DO NOT START ON 0

    while ((i < count) && (Result == null))
    {
        if (items[i] is MailItem)
        {
            mail = (MailItem)items[i];
            if ((mail.ReceivedTime.ToString("yyyyMMdd hh:mm:ss") == dateReceived.ToString("yyyyMMdd hh:mm:ss")) && (mail.Subject == subject))
            {
                Result = mail;
                MAPIFolder mySent = olNamespace.GetDefaultFolder(OlDefaultFolders.olFolderSentMail);
                mySent.Items.ItemAdd += Items_SentMailItemAdd;
            }
        }
        i++;
    }
    return Result;
}

и наконец

private void Items_SentMailItemAdd(object Item)
{
    //throw new NotImplementedException();
    ; // this event is never fired
}

1 Ответ

1 голос
/ 27 апреля 2019

Вы можете использовать событие Items.ItemAdd в папке «Отправленные».Чтобы проверить, является ли это ваше сообщение, установите настраиваемое свойство для сообщения, которое вы создаете и отображаете.Вы можете использовать MailItem.UserProperties.Add, но это может привести к отправке сообщения в формате TNEF.Чтобы этого не произошло, вы можете использовать MailItem.PropertyAccessro.SetProperty для установки именованного свойства MAPI без использования коллекции UserProperties.Вы можете установить свойство тестового пользователя и посмотреть его DASL-имя (которое будет использоваться SetProperty) с помощью OutlookSpy (выберите сообщение, нажмите кнопку IMessage, выберите свое настраиваемое свойство, см. Поле редактирования DASL).

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