2013-11-11 4 views
15

Я пытаюсь отправить электронное письмо из моего приложения консоли C#. Я добавил ссылки и использовал заявления, но, похоже, я не добавил все, что мне нужно. Это первый раз, когда я когда-либо пытался сделать это, поэтому считаю, что я забыл.Отправка электронной почты через Outlook 2010 через C#

Я получил этот фрагмент кода с сайта MSDN http://msdn.microsoft.com/en-us/library/vstudio/ms269113(v=vs.100).aspx

ScreenShot of code from VS2010 showing the build errors

Вот код, который я получаю проблемы с в VS 2010

using System; 
using System.Configuration; 
using System.IO; 
using System.Net; 
using System.Net.Mail; 
using System.Runtime.InteropServices; 
using Outlook = Microsoft.Office.Interop.Outlook; 
using Office = Microsoft.Office.Core; 

namespace FileOrganizer 
{ 
    class Program 
    { 
     private void CreateMailItem() 
     { 
      //Outlook.MailItem mailItem = (Outlook.MailItem) 
      // this.Application.CreateItem(Outlook.OlItemType.olMailItem); 
      Outlook.Application app = new Outlook.Application(); 
      Outlook.MailItem mailItem = app.CreateItem(Outlook.OlItemType.olMailItem); 
      mailItem.Subject = "This is the subject"; 
      mailItem.To = "[email protected]"; 
      mailItem.Body = "This is the message."; 
      mailItem.Attachments.Add(logPath);//logPath is a string holding path to the log.txt file 
      mailItem.Importance = Outlook.OlImportance.olImportanceHigh; 
      mailItem.Display(false); 
     } 
    } 
} 
+0

Пожалуйста, просто разместить свой код в виде текста, а не скриншот этого. Он сжимается для тех из нас, у которых есть мониторы с более низким разрешением, и неразборчив, не открывая сам образ в новую вкладку ... Затем мы должны повторно ввести, если кто-то предложит вам модификацию кода, а не копию - отбросить и изменить его. – sab669

+0

OK Сделаю теперь .. Edit Inc.Я только пытался показать «красные squigglies», поэтому я добавлю код ниже скриншота – SteveAnselment

+0

this.application - проблема. «это» относится к вашей «Программе» в этот момент времени. Вам нужно создать экземпляр, или это может быть статический метод (например, Microsoft.Office.Outlook.CreateItem. –

ответ

26

заменить строку

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

с

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

Надеется, что это помогает,

+0

Любая идея, почему я получаю исключение, используя этот код, если Outlook не закрыт? {«Извлечение фабрики COM-класса для компонента с CLSID {0006F03A-0000-0000-C000-000000000046} не удалось из-за следующей ошибки: 80080005 Выполнение сервера не выполнено (Исключение из HRESULT: 0x80080005 (CO_E_SERVER_EXEC_FAILURE))."} –

+0

Имейте посмотрите: https://social.msdn.microsoft.com/Forums/vstudio/en-US/870d6093-a7fb-4431-a38f-1896ce4cf963/failing-to-create-an-email-with-outlook-interop-when -Outlook-был-был открыт, по-другому-пользователя учетной записи? форум = VSTO. Это в основном «Вы не можете запустить 2 экземпляра Outlook на 1 машине». Ссылка имеет частичное решение с ограничениями. –

2

Это, как вы можете отправить по электронной почте с помощью Microsoft Office Outlook. В моем случае я использовал Office 2010, но я полагаю, что он должен работать с более новыми версиями.

Приведенный выше пример показывает сообщение. Он не отправляет его. Более того, он не компилируется.

Поэтому сначала нужно добавить эти ссылки на ваш .NET проекта:

enter image description here

Как я уже сказал в своем комментарии к его 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.

Тогда вот код, чтобы отправить электронные письма:

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: "[email protected]") -- 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: "[email protected]", or "[email protected]; [email protected]") 
     //'sCc' = email address sending to as Carbon Copy option. Can be multiple. In that case separate with semicolons or commas. (ex: "[email protected]", or "[email protected]; [email protected]") 
     //'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; 
    } 

А вот как вы бы использовать:

List<string> arrAttachFiles = new List<string>() { @"C:\Users\User\Desktop\Picture.png" }; 

bool bRes = sendEmailViaOutlook("[email protected]", 
    "[email protected], [email protected]", null, 
    "Test email from script - " + DateTime.Now.ToString(), 
    "My message body - " + DateTime.Now.ToString(), 
    BodyType.PlainText, 
    arrAttachFiles, 
    null); 
+0

Я получаю эту ошибку: Невозможно нанести COM-объект типа «Microsoft.Office.Interop.Outlook.ApplicationClass» на тип интерфейса «Microsoft.Office.Interop.Outlook._Application». Эта операция завершилась неудачно, потому что вызов QueryInterface на COM-компоненте для интерфейса с IID '{00063001-0000-0000-C000-000000000046} не удался из-за следующей ошибки: Ошибка загрузки библиотеки типов/DLL. (Исключение из HRESULT: 0x80029C4A (TYPE_E_CANTLOADLIBRARY)). – Fwd079

1

Вы должны привести объект
app.CreateItem(Outlook.OlItemType.olMailItem)
в
Outlook.MailItem mailItem = app.CreateItem(Outlook.OlItemType.olMailItem)
к
Outlook.MailItem типа
, поскольку не неявное приведение не доступно.

Заменить

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

с

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

Это не работает в Outlook 2016, оно дает недопустимое исключение литья '... ApplicationClass для типа интерфейса Outlook._Application' – Fwd079

Смежные вопросы