_MailAutoSig Закладка отсутствует (Outlook 2010) - PullRequest
15 голосов
/ 13 мая 2011

Недавно я написал надстройку для Outlook, которая добавляет / удаляет необязательный слоган под подписью в сообщении Outlook. Эта надстройка работает без проблем.

Я пишу вторую надстройку, которая должна потенциально добавлять информацию ниже (независимо от того, имеется ли необязательная подпись) и снова ссылаюсь на закладку _MailAutoSig из редактора Word. Проблема, с которой я сталкиваюсь, заключается в том, что эта закладка больше не отображается, равно как и закладка из моей другой надстройки.

Одно из отличий в двух фрагментах кода ниже состоит в том, что первый из них имеет 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 Ответ

4 голосов
/ 22 июля 2011

Проблема заключается в том, что Microsoft преобразует «офисный HTML» (я не уверен, что правильный термин) в обычный HTML, прежде чем он запускает событие ItemSend (), которое вызывает исчезновение закладки _MailAutoSig.

Единственный способ вернуть закладку _MailAutoSig - это сначала ОТМЕНИТЬ событие ItemSend (), затем запустить таймер, чтобы запустить функцию, которая, в свою очередь, будет обращаться к объекту электронной почты и манипулировать им, как вам нужно, добавить свойство пользователя, чтобы пометитьэлектронная почта была обработана, а затем отправьте ее снова.

Например:

Dim modItem As Object 'need to hold the item somewhere so the timer can access it

Sub object_ItemSend(ByVal Item As Object, Cancel As Boolean)
    If Item.UserProperties.Item("isModded") Is Nothing Then
        'User has composed a mail and hit "Send", we need to make our modifications to the signature though
        modItem = item
        Cancel = True 'cancel the Send so we can make the modifications
        mytimer.Enabled = True 'fire off a timer to make the modifications
        Exit Sub
    Else
        Item.UserProperties.Item("isModded").Delete 'this flag will keep the email from ping-ponging between ItemSend and the timer
    End If
End Sub

'10 millisecond timer? I think the cancel is almost instant, but experiment
Sub mytimer_Timer()
    mytimer.Enabled = False
    If Not modItem Is Nothing Then
        modItem.HtmlBody = ...... the signature bookmark will be intact again, so make your modifications ......
        modItem.UserProperties.Add("isModded", olText) 'no ping-pong
        modItem.Send 'send it again
        modItem = Nothing
    End If
End Sub

Мне пришлось сделать что-то подобное для проекта, где некоторые поля Outlook не были установлены, пока я не был всобытие ItemSend (), поэтому я вынужден был отправить электронное письмо, получить информацию, а затем отменить отправку.Это сработало великолепно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...