2011-05-13 16 views
15

Escribí un complemento para Outlook que agrega/elimina un lema opcional debajo de la firma en un mensaje de Outlook. Este complemento funciona sin problemas._MailAutoSig Marcador perdido (Outlook 2010)

Estoy escribiendo un segundo complemento que necesita potencialmente agregar información debajo de eso (si la firma opcional está allí o no) y vuelvo a hacer referencia al marcador _MailAutoSig del editor de Word. El problema al que me estoy enfrentando es que este marcador ya no parece aparecer, ni el marcador de mi otro complemento.

Una diferencia en los dos códigos siguientes es que el primero tiene el objeto MailItem convertido de un objeto pasado por ItemSend, mientras que el segundo se procesa ANTES del evento ItemSend.

Aquí está el código de lo que actualmente estoy escribiendo:

  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); 
     } 

y aquí está el código de mi trabajo de complemento:

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); 
} 

Respuesta

4

El problema es que Microsoft convierte el "HTML de Office "(No estoy seguro del término adecuado) para HTML normal antes de que se dispare el evento ItemSend(), que hace que desaparezca el marcador _MailAutoSig.

La única manera de conseguir el marcador _MailAutoSig vuelta es cancelar primer caso ItemSend(), y luego disparar un temporizador para ejecutar una función que a su acceso a su vez el objeto de correo electrónico y manipularlo cómo desea, agregue un usuario Se ha procesado la propiedad para marcar el correo electrónico y luego se vuelve a enviar el correo electrónico.

Por ejemplo:

 
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 

que tenía que hacer algo similar para un proyecto en el que algunos campos de Outlook no se establecieron hasta que estaba en el evento ItemSend(), así que estaba forzando el correo electrónico para enviar, recibir mi información, luego cancela el envío. Funcionó muy bien.

Ahora, esto fue escrito en la parte superior de mi cabeza, así que estoy seguro de que el código anterior no será perfecto, pero debería darle la idea de lo que hay que hacer.

+0

esta parte de mi proyecto ya pasó, pero el código es excelente. cuando encuentre algo de tiempo para convertirlo en C#, le contaré cómo funciona. –

+1

Esto puede convertir la mayor parte a C#: http://www.developerfusion.com/tools/convert/vb-to-csharp/ – Brain2000

+0

Lo he usado, pero no siempre es perfecto. –

Cuestiones relacionadas