我为Outlook编写了一段时间的插件,它在Outlook消息中的签名下方添加/删除了可选的标语。此加载项没有问题。
我正在编写第二个加载项,该加载项可能需要在其下添加信息(无论是否存在可选签名),并再次从Word编辑器中引用_MailAutoSig书签。我遇到的问题是该书签似乎不再出现,我的其他加载项中的书签也不再出现。
以下两段代码的不同之处在于,第一段代码是从ItemSend传递的对象转换MailItem,而第二段代码是在ItemSend事件之前处理的。
这是我目前正在编写的代码:
Word.Document toMsg = msg.GetInspector.WordEditor as Word.Document;
foreach (Word.Bookmark b in toMsg.Bookmarks)
Debug.Print(b.ToString());
Word.Range r_toMsg;
try
{
string oBookmark = "_MailAutoSig"; // Outlook internal bookmark for location of the e-mail signature`
object oBookmarkObj = oBookmark;
if (toMsg.Bookmarks.Exists(oBookmark) == true)
Debug.Print("sigbookmark");
r_toMsg = toMsg.Bookmarks.get_Item(ref oBookmarkObj).Range;
}
catch
{
string oOffsiteBookmark = "OffsiteBookmark";
object oOffsiteBookmarkObj = oOffsiteBookmark;
if (toMsg.Bookmarks.Exists(oOffsiteBookmark) == true) // if the custom bookmark exists, remove it
Debug.Print("offsite bookmark");
}
finally
{
r_toMsg = toMsg.Range(missing,missing);
}
这是我工作的外接程序中的代码:
void InsertOffsiteSig(Outlook.MailItem oMsg)
{
object oBookmarkName = "_MailAutoSig"; // Outlook internal bookmark for location of the e-mail signature
string oOffsiteBookmark = "OffsiteBookmark"; // bookmark to be created in Outlook for the Offsite tagline
object oOffsiteBookmarkObj = oOffsiteBookmark;
Word.Document SigDoc = oMsg.GetInspector.WordEditor as Word.Document; // edit the message using Word
string bf = oMsg.BodyFormat.ToString(); // determine the message body format (text, html, rtf)
// Go to the e-mail signature bookmark, then set the cursor to the very end of the range.
// This is where we will insert/remove our tagline, and the start of the new range of text
Word.Range r = SigDoc.Bookmarks.get_Item(ref oBookmarkName).Range;
object collapseEnd = Word.WdCollapseDirection.wdCollapseEnd;
r.Collapse(ref collapseEnd);
string[] taglines = GetRssItem(); // Get tagline information from the RSS XML file and place into an array
// Loop through the array and insert each line of text separated by a newline
foreach (string taglineText in taglines)
r.InsertAfter(taglineText + "\n");
r.InsertAfter("\n");
// Add formatting to HTML/RTF messages
if (bf != "olFormatPlain" && bf != "olFormatUnspecified")
{
SigDoc.Hyperlinks.Add(r, taglines[2]); // turn the link text into a hyperlink
r.Font.Underline = 0; // remove the hyperlink underline
r.Font.Color = Word.WdColor.wdColorGray45; // change all text to Gray45
r.Font.Size = 8; // Change the font size to 8 point
r.Font.Name = "Arial"; // Change the font to Arial
}
r.NoProofing = -1; // turn off spelling/grammar check for this range of text
object range1 = r;
SigDoc.Bookmarks.Add(oOffsiteBookmark, ref range1); // define this range as our custom bookmark
if (bf != "olFormatPlain" && bf != "olFormatUnspecified")
{
// Make the first line BOLD only for HTML/RTF messages
Word.Find f = r.Find;
f.Text = taglines[0];
f.MatchWholeWord = true;
f.Execute();
while (f.Found)
{
r.Font.Bold = -1;
f.Execute();
}
}
else
{
// otherwise turn the plain text hyperlink into an active hyperlink
// this is done here instead of above due to the extra formatting needed for HTML/RTF text
Word.Find f = r.Find;
f.Text = taglines[2];
f.MatchWholeWord = true;
f.Execute();
SigDoc.Hyperlinks.Add(r, taglines[2]);
}
r.NoProofing = -1; // disable spelling/grammar checking on the updated range
r.Collapse(collapseEnd);
}
最佳答案
问题是Microsoft在触发ItemSend()事件之前将“Office HTML”(我不确定正确的术语)转换为普通HTML,这会导致_MailAutoSig书签消失。
取回_MailAutoSig书签的唯一方法是先取消CANCEL ItemSend()事件,然后触发计时器以运行一个函数,该函数将依次访问电子邮件对象并按需要操作它,并添加用户属性以标记电子邮件已处理,然后再次发送电子邮件。
例如:
Dim modItem As Object需要将该项目保存在某个地方,以便计时器可以访问它
Sub object_ItemSend(ByVal项作为对象,取消为 bool(boolean) 值)
如果Item.UserProperties.Item(“isModded”)什么都没有,
'用户撰写了一封邮件,然后点击“发送”,尽管如此,我们需要对签名进行修改
modItem =物品
取消= True'取消发送,因此我们可以进行修改
mytimer.Enabled = True'启动计时器进行修改
退出子
其他
Item.UserProperties.Item(“isModded”)。Delete'此标志将阻止电子邮件在ItemSend和计时器之间进行ping-poning
万一
结束子
'10毫秒计时器?我认为取消几乎是即时的,但请尝试
子mytimer_Timer()
mytimer.Enabled =假
如果不是modItem什么都没有,那么
modItem.HtmlBody = ......签名书签将再次保持原样,因此请进行修改......
modItem.UserProperties.Add(“isModded”,olText)'没有乒乓球
modItem.Send'再次发送
modItem =无
万一
结束子
对于不得不在ItemSend()事件中未设置某些Outlook字段的项目,我必须执行类似的操作,因此我迫使电子邮件发送,获取我的信息,然后取消发送。效果很好。
现在,这是我的头上写的,所以我确定上面的代码不是完美的,但是它应该让您知道需要做什么。