2009-12-08 4 views
0

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

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

ОК, теперь к проблеме ....

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

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

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

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

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

EDIT: Код

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() + " :: "); 
    } 
} 
+0

Не могли бы вы объяснить в al ittel более подробно ваш «быстрый рабочий процесс». как вы подключаетесь к отправке и т. д., так как существует несколько способов сделать это. – 76mel

+0

«prompt» Я имею в виду, что когда событие addItem запускается в папке отправленных предметов, он спрашивает пользователя, хотят ли они сохранить электронное письмо. Следовательно, электронная почта запускает событие после того, как оно перешло в папку «Исходящие» и в «Отправленные». Если пользователь говорит «да», что они хотели бы сохранить электронную почту, тогда открывается основная форма с ссылкой на письмо, которое в первую очередь инициировало событие. – Stuv

+0

Хорошо, Итак, как на ссылку, указанную в вашей основной форме? ваша «основная» форма, изменяющая электронную почту каким-либо образом, чтобы ее нужно было сохранить.Вы можете проверить свойство isSaved. Возможно, это будет идея опубликовать код. Поскольку это просто звучит как вещь заказа или вы каким-то образом загрязняете электронную почту. – 76mel

ответ

1

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

Пример кода:

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

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

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