Search code examples
outlookvstoadd-insignature

Outlook add-in: Automatically changing signature won't display images


I've had to write my first Outlook add-in.

Basically, I have two signatures to choose from: "oferta" and "default". Depending on the words contained in the mail subject, a different signature will be used.

Everything works fine with text-only signatures, but when pictures are included, these are never sent and ares displayed as blank squares instead.

However, if I manually select any of the signatures in Outlook, the pictures are properly displayed.

I guess the problem is in the GetSignature() method, which I borrowed form someone else's answer (sorry, I can't find where I got this from!).

How could I solve this? Is there a better way to automatically change the signatures?

This is my code:

public partial class ThisAddIn
{
    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        Application.ItemSend += new Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend);
    }


    // When an email is sent a different signature is appended depending on the subject.        
    private void Application_ItemSend(object Item, ref bool Cancel)
    {
        MailItem mail = (MailItem)Item;

        string subject = mail.Subject;
        string firma = subject.ToUpper().Contains("PEDIDO") ? GetSignature("oferta") : GetSignature("default");

        mail.HTMLBody += firma;

        if (mail != null) Marshal.ReleaseComObject(mail);

    }


    // Finds and returns the .htm signature file.       
    private string GetSignature(string signatureName)
    {
        string appDataDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Microsoft\\Signatures";
        string signature = string.Empty;
        DirectoryInfo diInfo = new DirectoryInfo(appDataDir);

        if (diInfo.Exists)
        {
            FileInfo[] fiSignature = diInfo.GetFiles(signatureName + ".htm");

            if (fiSignature.Length > 0)
            {
                StreamReader sr = new StreamReader(fiSignature[0].FullName, Encoding.Default);
                signature = sr.ReadToEnd();

                if (!string.IsNullOrEmpty(signature))
                {
                    string fileName = fiSignature[0].Name.Replace(fiSignature[0].Extension, string.Empty);
                    signature = signature.Replace(fileName + "_files/", appDataDir + "/" + fileName + "_files/");
                }
            }
        }
        return signature;
    }

}

Solution

  • Of course - pictures are added as separate attachments, and you never deal with them.

    Also, concatenating two HTML strings (mail.HTMLBody += firma;) does not necessarily produce a valid HTML string.

    If using Redemption is an option (I am its author), it exposes RDOSignature.ApplyTo method, whcih inserts a signature including its attachments and styles.