Sending email from the specified Outlook Account

c#, email, mailitem, office-interop, outlook

Solution

Yes, you can use the SendUsingAccount property to set up the correct account you need to send items from.

 public static Outlook.Account GetAccountForEmailAddress(Outlook.Application application, string smtpAddress) 
 { 

     // Loop over the Accounts collection of the current Outlook session. 
     Outlook.Accounts accounts = application.Session.Accounts; 
     foreach (Outlook.Account account in accounts) 
     { 
         // When the e-mail address matches, return the account. 
         if (account.SmtpAddress == smtpAddress) 
         { 
            return account; 
         } 
     } 
     throw new System.Exception(string.Format("No Account with SmtpAddress: {0} exists!", smtpAddress)); 
 } 

public static string Send_Email_Outlook(string _recipient, string _message, string _subject, string _cc, string _bcc, string accountname)
{
    try
    {

        Microsoft.Office.Interop.Outlook.Application oApp = new Microsoft.Office.Interop.Outlook.Application();

        // Get the NameSpace and Logon information.
        Microsoft.Office.Interop.Outlook.NameSpace oNS = oApp.GetNamespace("mapi");

        // Log on by using a dialog box to choose the profile.
        oNS.Logon(Missing.Value, Missing.Value, true, true);

        // Create a new mail item.
        Microsoft.Office.Interop.Outlook.MailItem oMsg = (Microsoft.Office.Interop.Outlook.MailItem)oApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);

        // Set the subject.
        oMsg.Subject = _subject;

        // Set HTMLBody.
        oMsg.HTMLBody = _message;

        oMsg.To = _recipient;
        oMsg.CC = _cc;
        oMsg.BCC = _bcc;


        #region Send via another account

         // Retrieve the account that has the specific SMTP address. 
        Outlook.Account account = GetAccountForEmailAddress(oApp , "support@mydomain.com"); 
        // Use this account to send the e-mail. 
        oMsg.SendUsingAccount = account; 

        // Send.
        (oMsg as Microsoft.Office.Interop.Outlook._MailItem).Send();

        // Log off.
        oNS.Logoff();

        // Clean up.
        //oRecip = null;
        //oRecips = null;
        oMsg = null;
        oNS = null;
        oApp = null;


    }

 // Return Error Message
    catch (Exception e)
    {
        return e.Message;
    }

    // Default return value.
    return "";

}

Problem

I am using Outlook2013 which has a number of mailboxes from both exchange and pop servers.(Rob@mydomain.com[default exchange], rob@somethingdifferent.com[POP], support@mydomain.com[exchange]) I am trying to use Outlook automation to send an email using the support@mydomain.com account. The problem I am having is the below code creates a mail item in the support outbox but the from field is rob@mydomain.com not support@mydomain.com. This stops it from being sent. I would like to change the from address to support@mydomain.com. I thought that by setting the Sendusingaccount property did this. Any help is greatly appreciated. ``` public static string Send_Email_Outlook(string _recipient, string _message, string _subject, string _cc, string _bcc, string accountname) { try { Microsoft.Office.Interop.Outlook.Application oApp = new Microsoft.Office.Interop.Outlook.Application(); // Get the NameSpace and Logon information. Microsoft.Office.Interop.Outlook.NameSpace oNS = oApp.GetNamespace("mapi"); // Log on by using a dialog box to choose the profile. oNS.Logon(Missing.Value, Missing.Value, true, true); // Create a new mail item. Microsoft.Office.Interop.Outlook.MailItem oMsg = (Microsoft.Office.Interop.Outlook.MailItem)oApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem); // Set the subject. oMsg.Subject = _subject; // Set HTMLBody. oMsg.HTMLBody = _message; oMsg.To = _recipient; oMsg.CC = _cc; oMsg.BCC = _bcc; #region Send via another account if (accountname.Trim().Length != 0) { Microsoft.Office.Interop.Outlook.Accounts accounts = oMsg.Session.Accounts; for (int i = 1; i <= accounts.Count; i++) { string accountfound = accounts[i].DisplayName.ToLower(); if (accountname.ToLower() == accountfound) { oMsg.SendUsingAccount = accounts[i]; // Send using support account Microsoft.Office.Interop.Outlook.Recipient recipient = oMsg.Session.CreateRecipient(accountfound); oMsg.Sender = recipient.AddressEntry; break; } } } #endregion // Send. (oMsg as Microsoft.Office.Interop.Outlook._MailItem).Send(); // Log off. oNS.Logoff(); // Clean up. //oRecip = null; //oRecips = null; oMsg = null; oNS = null; oApp = null; } // Return Error Message catch (Exception e) { return e.Message; } // Default return value. return ""; } ```

Original source