Outlook MailItem Сохранить/Сохранить как

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

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

Ладно, теперь к проблеме....

В процессе сохранения письма я использую метод mailItem.SaveAs, чтобы поместить его в хранилище файлов. После того, как это успешно завершено, я хочу изменить тему электронного письма, которое все еще существует в Outlook, чтобы сказать, что оно было успешно сохранено. Я делаю это, изменяя myItem.Subject, а затем используя метод mailItem.Save для сохранения изменений.

Вышеприведенное отлично работает, когда электронная почта не сохраняется с помощью метода подсказки. Поэтому, когда пользователь пытается сохранить электронное письмо после его отправки, метод mailItem.Save не работает.

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

Итак, кто-нибудь знает причину, по которой метод mailItem.Save не хочет работать после вызова метода mailItem.SaveAs?

Заранее благодарю за любые предложения, в чем может быть проблема.

РЕДАКТИРОВАТЬ: Код

if (_item is Outlook.MailItem) { // if the incoming item is an Outlook mail Item
    // cast as a mail item
    Outlook.MailItem myItem = (Outlook.MailItem)_item;
    if (directoryExists(directoryTemp)) { // if the temporary directory exists
        bool _profiled = true;
        // copy the item as type .msg in the temporary location
        myItem.SaveAs(saveTemp, Outlook.OlSaveAsType.olMSG);
        // setup impersonation to copy the file to a secure location
        PImpersonateUser _iU = new PImpersonateUser();
        // do impersonation
        try {
            _iU.Impersonate("******", "******", "******");
            if (File.Exists(savefile)) { // if file already exists in the location
                // delete existing file
                File.Delete(savefile);
            }
            // move the temporary file to the secure location with the proper name
            File.Move(saveTemp, savefile);
            string year = "";
            if (ipt_year.SelectedItem != null) { // else if year has been selected
                year = ipt_year.SelectedItem.ToString();
            }
            _profile.profileEmail(folderString(_subject_), _fileName, year);
        } catch (Exception e) {
            _profiled = false;
            // if impersonation fails cancel the impersonation
            _iU.Undo();
            // show error
            MessageBox.Show(e.Source + "\n\n" + e.Message + "\n\n" + e.StackTrace, "SaveAs() Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
        } finally {
            _iU.Undo();
        }
        if (_profiled) { // if the email was profiled successfully
            // mark the original email as being profiled
            markAsProfiled();
        }
    } else {
        // if temporary file save fails throw error
        MessageBox.Show("Temporary Directory (" + directoryTemp + ") Does Not Exist!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

и функция markAsProfiled...


private void markAsProfiled() {
    if (_item is Outlook.MailItem) { // if the incoming item is an Outlook mail Item
        // cast as a mail item
        Outlook.MailItem myItem = (Outlook.MailItem)_item;
        // make sure subject doesnt already have a profiled flag in the subject
        _subject_ = _subject_.Replace("[PROFILED] - ", "");
        // add a profiled flag in the subject of the email
        myItem.Subject = "[PROFILED] - " + _subject_;
        // add a yellow flag to the email
        myItem.FlagIcon = Microsoft.Office.Interop.Outlook.OlFlagIcon.olYellowFlagIcon;
        // save email with changes made
        myItem.Save();
        //MessageBox.Show("Mark as Profiled :: " + myItem.Subject + " :: " + myItem.Saved.ToString() + " :: ");
    }
}

person Stuv    schedule 08.12.2009    source источник
comment
Можете ли вы объяснить более подробно свой оперативный рабочий процесс. как вы подключаетесь к отправке и т. д., поскольку есть несколько способов сделать это.   -  person 76mel    schedule 08.12.2009
comment
под приглашением я имею в виду, что когда событие addItem запускается в папке отправленных элементов, оно спрашивает пользователя, хотят ли они сохранить электронное письмо. Следовательно, электронное письмо запускает событие после того, как оно прошло через папку «Исходящие» и попало в «Отправленные». Если пользователь говорит да, что он хотел бы сохранить электронное письмо, то открывается главная форма со ссылкой на электронное письмо, которое в первую очередь инициировало событие.   -  person Stuv    schedule 09.12.2009
comment
Хорошо, так как же ссылка на электронную почту в вашей основной форме? ваша основная форма каким-либо образом меняет адрес электронной почты, поэтому его необходимо сохранить. Вы можете проверить свойство isSaved. Может быть идея опубликовать код. Поскольку это просто звучит как заказ, или вы каким-то образом загрязняете электронную почту.   -  person 76mel    schedule 10.12.2009
comment
эй, спасибо за ваш ответ и извините, что вам потребовалось так много времени, чтобы вернуться к вам. Я отредактировал вопрос выше, чтобы включить код. функция markAsProfiled изменяет тему письма, а затем сохраняет его, и, как уже упоминалось, она делает это после подтверждения того, что электронное письмо было профилировано. если я перемещаю эту функцию для запуска до myIem.SaveAs, она работает нормально!   -  person Stuv    schedule 23.12.2009


Ответы (1)


если это все еще актуально для вас: вы можете использовать самоопределяемый столбец, в котором вы можете написать, было ли сохранение успешным или нет.

Пример кода:

 mail.UserProperties.Add("Profiled", Outlook.OlUserPropertyType.olText, true);
 mail.UserProperties["Profiled"].Value = "Yes";
 mail.Save();

Единственным недостатком является то, что вы должны добавить поле в отображаемые столбцы в Outlook. (возможно, это можно сделать программно)

О том, почему ваш метод не работает: я могу представить, что Outlook не любит, когда вы меняете тему электронного письма после его отправки.

person Steffen Winkler    schedule 20.11.2012