_MailAutoSig 书签丢失(Outlook 2010)

Posted

技术标签:

【中文标题】_MailAutoSig 书签丢失(Outlook 2010)【英文标题】:_MailAutoSig Bookmark missing (Outlook 2010) 【发布时间】:2011-08-25 01:23:29 【问题描述】:

我不久前为 Outlook 编写了一个插件,用于在 Outlook 消息的签名下方添加/删除可选标语。此插件可以正常工作。

我正在编写第二个加载项,该加载项可能需要在其下方添加信息(无论是否存在可选签名),并且再次从 Word 编辑器中引用 _MailAutoSig 书签。我遇到的问题是这个书签似乎不再出现,我的其他加载项中的书签也没有出现。

下面两段代码的一个不同之处在于,第一段的 MailItem 是从 ItemSend 传递的对象转换而来的,而第二段是在 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);

【问题讨论】:

【参考方案1】:

问题在于,Microsoft 在触发 ItemSend() 事件之前将“Office HTML”(我不确定正确的术语)转换为普通 HTML,这会导致 _MailAutoSig 书签消失。

获取 _MailAutoSig 书签的唯一方法是首先取消 ItemSend() 事件,然后触发计时器以运行一个函数,该函数将依次访问电子邮件对象并按照您的需要操作它,添加一个用户属性标记邮件已处理,然后重新发送邮件。

例如:

Dim modItem As Object '需要将项目保存在某处,以便计时器可以访问它 Sub object_ItemSend(ByVal Item As Object, Cancel As Boolean) 如果 Item.UserProperties.Item("isModded") 什么都不是,那么 '用户写了一封邮件并点击“发送”,我们需要对签名进行修改 modItem = 物品 Cancel = True '取消发送以便我们进行修改 mytimer.Enabled = True '触发计时器进行修改 退出子 别的 Item.UserProperties.Item("isModded").Delete '此标志将阻止电子邮件在 ItemSend 和计时器之间进行乒乓球 万一 结束子 '10 毫秒计时器?我认为取消几乎是即时的,但实验 子 mytimer_Timer() mytimer.Enabled = False If Not modItem Is Nothing Then modItem.HtmlBody = ......签名书签将再次完好无损,所以请进行修改...... modItem.UserProperties.Add("isModded", olText) '没有乒乓球 modItem.Send '再次发送 modItem = 没有 万一 结束子

我不得不为一个项目做类似的事情,直到我在 ItemSend() 事件中才设置一些 Outlook 字段,所以我强制发送电子邮件,获取我的信息,然后取消发送。效果很好。

现在,这是在我脑海中写下的,所以我确信上面的代码不会完美,但它应该让你知道需要做什么。

【讨论】:

我项目的这一部分已经过去了,但是代码很棒。当我找到一些时间将其转换为 c# 时,我会告诉你它是怎么回事。 这可以将大部分转换为c#:developerfusion.com/tools/convert/vb-to-csharp 我用过,但并不总是完美的。 是的,复杂的代码有时是一场灾难。我尝试转换上面的内容,看起来效果很好,只需删除其中包含 6 个点的行,否则会出错。

以上是关于_MailAutoSig 书签丢失(Outlook 2010)的主要内容,如果未能解决你的问题,请参考以下文章

google浏览器 书签全部丢失

谷歌浏览器书签丢失后的恢复方法

outlook 邮箱满了,设置了自动存档但还是满咋样处理,千万不要丢失邮件啊、 求帮忙.

[转]火狐升级后配置(书签/保存的密码等)丢失问题解决

Visual Studio 2013 自动恢复断点和书签

Firefox恢复书签