通过 C# 通过 Outlook 2010 发送电子邮件
Posted
技术标签:
【中文标题】通过 C# 通过 Outlook 2010 发送电子邮件【英文标题】:Sending Email through Outlook 2010 via C# 【发布时间】:2013-11-23 13:01:21 【问题描述】:我正在尝试从我的 C# 控制台应用程序中发送电子邮件。我已经添加了引用和使用语句,但似乎我没有添加我需要的一切。这是我第一次尝试这样做,所以我想我忘记了一些东西。
我从 MSDN 站点 http://msdn.microsoft.com/en-us/library/vstudio/ms269113(v=vs.100).aspx 获得了这个代码 sn-p
这是我在 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 = "someone@example.com";
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);
【问题讨论】:
请将您的代码简单地发布为文本,而不是截图。对于我们这些使用低分辨率显示器的人来说,它会缩小,并且如果不将图像本身打开到新标签中就难以辨认......然后我们必须重新输入如果有人建议修改您的代码,而不是复制-粘贴并更改它。 OK 现在可以了.. Edit Inc. 我只是想显示“红色波浪线”,所以我将在屏幕截图下方添加代码 this.application 有问题。 'this' 指的是您当时的“程序”。您需要创建它的一个实例,或者它可能是(类似于)Microsoft.Office.Outlook.CreateItem 上的静态方法。 @MarvinSmit 你能举个例子吗?我已经更新了上面的代码以反映我目前拥有的内容,this.application 是我遇到的最后一个问题。 我不得不删除“Microsoft.Office.Tools.Outlook”。从分配到“重要性”以使其编译。 【参考方案1】:换行
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);
希望这会有所帮助,
【讨论】:
知道为什么我使用此代码会出现异常,除非 Outlook 已关闭? “由于以下错误,检索具有 CLSID 0006F03A-0000-0000-C000-000000000046 的组件的 COM 类工厂失败:80080005 服务器执行失败(来自 HRESULT 的异常:0x80080005 (CO_E_SERVER_EXEC_FAILURE))。” 看看:social.msdn.microsoft.com/Forums/vstudio/en-US/…。它基本上是“你不能在 1 台机器上运行 2 个 Outlook 实例”。 Link 有部分解决方案,但有限制。【参考方案2】:这是您可以通过 Microsoft Office Outlook 发送电子邮件的方式。就我而言,我使用的是 Office 2010,但我想它应该适用于较新的版本。
上面赞成的示例仅显示消息。它不会发送出去。而且它不会编译。
所以首先你需要将这些引用添加到你的.NET
项目中:
就像我在对他的 OP 的评论中所说的:
您将需要添加以下引用:(1) 从 .NET 选项卡添加 Microsoft.Office.Tools.Outlook for runtime v.4.0.*,然后再次 (2) 从 .NET 选项卡添加 Microsoft.Office.Interop.Outlook 的版本 14.0.0.0 在我的情况下,以及 (3) COM 对象 Microsoft Office 12.0 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: "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;
下面是你如何使用它:
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);
【讨论】:
我收到此错误:无法将类型为“Microsoft.Office.Interop.Outlook.ApplicationClass”的 COM 对象转换为接口类型“Microsoft.Office.Interop.Outlook._Application”。此操作失败,因为 IID 为“00063001-0000-0000-C000-000000000046”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:加载类型库/DLL 时出错。 (来自 HRESULT 的异常:0x80029C4A (TYPE_E_CANTLOADLIBRARY))。【参考方案3】:你需要投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);
【讨论】:
这在 Outlook 2016 中不起作用,它给出了无效的强制转换异常'...ApplicationClass to interface type Outlook._Application'以上是关于通过 C# 通过 Outlook 2010 发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章
使用 Outlook 2010 和 2013 C# 从 winform 实现发送邮件
C# 如何从 Outlook 的共享邮箱发送邮件并将其保存在已发送文件夹中
使用 Zend_mail 时,我的电子邮件似乎被视为垃圾邮件,通过 Outlook 发送而没有?
C# SMTP 无法在 Outlook.com 端口 587 上进行身份验证。“服务器响应为:5.7.1 客户端未通过身份验证”