我有一个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() + " :: ");
}
}
答案 0 :(得分:1)
如果这仍然与您相关:您可以使用自定义列,您可以在其中写下保存成功与否。
示例代码:
mail.UserProperties.Add("Profiled", Outlook.OlUserPropertyType.olText, true);
mail.UserProperties["Profiled"].Value = "Yes";
mail.Save();
唯一的缺点是您要将字段添加到Outlook中显示的列中。 (也许这可以通过编程方式完成)
关于你的方法无法运作的原因:我可以想象当你在发送电子邮件后更改电子邮件的主题时,Outlook并不喜欢它。