Sending Email through Outlook 2010 via C#

前端 未结 3 1159
广开言路
广开言路 2020-12-05 05:31

I am trying to send an email from inside my C# console App. I have added the references and using statements but it seems I have not added everything I need. This is the f

相关标签:
3条回答
  • 2020-12-05 05:32

    replace the line

    Outlook.MailItem mailItem = (Outlook.MailItem)
    this.Application.CreateItem(Outlook.OlItemType.olMailItem);
    

    with

    Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
    Microsoft.Office.Interop.Outlook.MailItem mailItem = app.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
    

    Hope this helps,

    0 讨论(0)
  • 2020-12-05 05:42

    You need to cast the
    app.CreateItem(Outlook.OlItemType.olMailItem)
    object in
    Outlook.MailItem mailItem = app.CreateItem(Outlook.OlItemType.olMailItem)
    to
    Outlook.MailItem type
    since no implicit casting is available.

    Replace

    Outlook.MailItem mailItem = app.CreateItem(Outlook.OlItemType.olMailItem); 
    

    with

    Outlook.MailItem mailItem = (Outlook.MailItem)app.CreateItem(Outlook.OlItemType.olMailItem);
    
    0 讨论(0)
  • 2020-12-05 05:58

    This is how you can send an email via Microsoft Office Outlook. In my case I was using Office 2010, but I suppose it should work with newer versions.

    The upvoted sample above just displays the message. It does not send it out. Moreover it doesn't compile.

    So first you need to add these references to your .NET project:

    Like I said in my comment to his OP:

    You will need to add the following references: (1) From .NET tab add Microsoft.Office.Tools.Outlook for runtime v.4.0.*, then (2) again from .NET tab add Microsoft.Office.Interop.Outlook for version 14.0.0.0 in my case, and (3) COM object Microsoft Office 12.0 Object Library for Microsoft.Office.Core.

    Then here's the code to send out emails:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using System.Net;
    using System.Configuration;
    using System.IO;
    using System.Net.Mail;
    using System.Runtime.InteropServices;
    using Outlook = Microsoft.Office.Interop.Outlook;
    using Office = Microsoft.Office.Core;
    
    public enum BodyType
    {
        PlainText,
        RTF,
        HTML
    }
    
        //....
    
        public static bool sendEmailViaOutlook(string sFromAddress, string sToAddress, string sCc, string sSubject, string sBody, BodyType bodyType, List<string> arrAttachments = null, string sBcc = null)
        {
            //Send email via Office Outlook 2010
            //'sFromAddress' = email address sending from (ex: "me@somewhere.com") -- this account must exist in Outlook. Only one email address is allowed!
            //'sToAddress' = email address sending to. Can be multiple. In that case separate with semicolons or commas. (ex: "recipient@gmail.com", or "recipient1@gmail.com; recipient2@gmail.com")
            //'sCc' = email address sending to as Carbon Copy option. Can be multiple. In that case separate with semicolons or commas. (ex: "recipient@gmail.com", or "recipient1@gmail.com; recipient2@gmail.com")
            //'sSubject' = email subject as plain text
            //'sBody' = email body. Type of data depends on 'bodyType'
            //'bodyType' = type of text in 'sBody': plain text, HTML or RTF
            //'arrAttachments' = if not null, must be a list of absolute file paths to attach to the email
            //'sBcc' = single email address to use as a Blind Carbon Copy, or null not to use
            //RETURN:
            //      = true if success
            bool bRes = false;
    
            try
            {
                //Get Outlook COM objects
                Outlook.Application app = new Outlook.Application();
                Outlook.MailItem newMail = (Outlook.MailItem)app.CreateItem(Outlook.OlItemType.olMailItem);
    
                //Parse 'sToAddress'
                if (!string.IsNullOrWhiteSpace(sToAddress))
                {
                    string[] arrAddTos = sToAddress.Split(new char[] { ';', ',' });
                    foreach (string strAddr in arrAddTos)
                    {
                        if (!string.IsNullOrWhiteSpace(strAddr) &&
                            strAddr.IndexOf('@') != -1)
                        {
                            newMail.Recipients.Add(strAddr.Trim());
                        }
                        else
                            throw new Exception("Bad to-address: " + sToAddress);
                    }
                }
                else
                    throw new Exception("Must specify to-address");
    
                //Parse 'sCc'
                if (!string.IsNullOrWhiteSpace(sCc))
                {
                    string[] arrAddTos = sCc.Split(new char[] { ';', ',' });
                    foreach (string strAddr in arrAddTos)
                    {
                        if (!string.IsNullOrWhiteSpace(strAddr) &&
                            strAddr.IndexOf('@') != -1)
                        {
                            newMail.Recipients.Add(strAddr.Trim());
                        }
                        else
                            throw new Exception("Bad CC-address: " + sCc);
                    }
                }
    
                //Is BCC empty?
                if (!string.IsNullOrWhiteSpace(sBcc))
                {
                    newMail.BCC = sBcc.Trim();
                }
    
                //Resolve all recepients
                if (!newMail.Recipients.ResolveAll())
                {
                    throw new Exception("Failed to resolve all recipients: " + sToAddress + ";" + sCc);
                }
    
    
                //Set type of message
                switch (bodyType)
                {
                    case BodyType.HTML:
                        newMail.HTMLBody = sBody;
                        break;
                    case BodyType.RTF:
                        newMail.RTFBody = sBody;
                        break;
                    case BodyType.PlainText:
                        newMail.Body = sBody;
                        break;
                    default:
                        throw new Exception("Bad email body type: " + bodyType);
                }
    
    
                if (arrAttachments != null)
                {
                    //Add attachments
                    foreach (string strPath in arrAttachments)
                    {
                        if (File.Exists(strPath))
                        {
                            newMail.Attachments.Add(strPath);
                        }
                        else
                            throw new Exception("Attachment file is not found: \"" + strPath + "\"");
                    }
                }
    
                //Add subject
                if(!string.IsNullOrWhiteSpace(sSubject))
                    newMail.Subject = sSubject;
    
                Outlook.Accounts accounts = app.Session.Accounts;
                Outlook.Account acc = null;
    
                //Look for our account in the Outlook
                foreach (Outlook.Account account in accounts)
                {
                    if (account.SmtpAddress.Equals(sFromAddress, StringComparison.CurrentCultureIgnoreCase))
                    {
                        //Use it
                        acc = account;
                        break;
                    }
                }
    
                //Did we get the account
                if (acc != null)
                {
                    //Use this account to send the e-mail. 
                    newMail.SendUsingAccount = acc;
    
                    //And send it
                    ((Outlook._MailItem)newMail).Send();
    
                    //Done
                    bRes = true;
                }
                else
                {
                    throw new Exception("Account does not exist in Outlook: " + sFromAddress);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("ERROR: Failed to send mail: " + ex.Message);
            }
    
            return bRes;
        }
    

    And here's how you'd use it:

    List<string> arrAttachFiles = new List<string>() { @"C:\Users\User\Desktop\Picture.png" };
    
    bool bRes = sendEmailViaOutlook("senders_email@somewhere.com",
        "john.doe@hotmail.com, jane_smith@gmail.com", null,
        "Test email from script - " + DateTime.Now.ToString(),
        "My message body - " + DateTime.Now.ToString(),
        BodyType.PlainText,
        arrAttachFiles,
        null);
    
    0 讨论(0)
提交回复
热议问题