如何在C#中打开Outlook新邮件窗口

36

我正在寻找一种方法来打开一个新的 Outlook 邮件窗口。

我需要以编程的方式填写:发件人、收件人、主题、正文等信息,但是要保留这个新邮件窗口,以便用户可以验证内容/添加内容,然后像普通 Outlook 信息一样发送。

发现:

Process.Start(String.Format(
 "mailto:{0}?subject={1}&cc={2}&bcc={3}&body={4}", 
  address, subject, cc, bcc, body))

但是没有“发件人”选项(我的用户有多个邮箱...)

有什么建议吗?


1
你没有使用vbscript来编写 Outlook 应用程序,有什么原因吗?如果你想的话,可以很容易地从c#开始启动 Outlook 应用程序,在 Outlook 中设置一个启动时运行的规则,并从 vbscript 宏中填充此内容。由于你希望在 GUI 中进行编辑,我的问题依然存在:你需要一种 c# 特定的解决方案,还是只是因为你认为必须使用 c# 而提出这个问题? - tjborromeo
3个回答

57

我终于解决了这个问题。 这里是一段用Outlook interops解决我的问题的代码片段。

Outlook.Application oApp    = new Outlook.Application ();
Outlook._MailItem oMailItem = (Outlook._MailItem)oApp.CreateItem ( Outlook.OlItemType.olMailItem );
oMailItem.To    = address;
// body, bcc etc...
oMailItem.Display ( true );

1
当我在Outlook未打开时运行类似的东西,Outlook会打开并显示模态电子邮件对话框,但是当用户点击发送后,Outlook立即关闭,邮件被卡在发件箱中。有人遇到过这个问题吗? - user1198049
需要哪些程序集/引用?谢谢。 - Taersious
仅限于Outlook互操作性。 - Maciej
1
@Taersious 在我的电脑上,Interop文件在这里:C:\Program Files (x86)\Microsoft Visual Studio 10.0\Visual Studio Tools for Office\PIA\Office12\Microsoft.Office.Interop.Outlook.dll。我通过在VS的引用管理器中搜索Outlook的框架程序集来添加它作为引用。 - TinyRacoon
谢谢,这很有帮助。我还有一个问题,就是除非我发送电子邮件或关闭新的电子邮件窗口,否则应用程序的下一条语句不会运行。如果我想要同时打开多个新的电子邮件窗口呢? - Ram Mehta

10

这是我尝试过的内容,它按预期工作。

该应用程序可以添加收件人、添加抄送和添加主题,并打开一个新的邮件窗口。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;
using Outlook = Microsoft.Office.Interop.Outlook;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void ButtonSendMail_Click(object sender, EventArgs e)
    {
        try
        {
            List<string> lstAllRecipients = new List<string>();
            //Below is hardcoded - can be replaced with db data
            lstAllRecipients.Add("sanjeev.kumar@testmail.com");
            lstAllRecipients.Add("chandan.kumarpanda@testmail.com");

            Outlook.Application outlookApp = new Outlook.Application();
            Outlook._MailItem oMailItem = (Outlook._MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
            Outlook.Inspector oInspector = oMailItem.GetInspector;
           // Thread.Sleep(10000);

            // Recipient
            Outlook.Recipients oRecips = (Outlook.Recipients)oMailItem.Recipients;
            foreach (String recipient in lstAllRecipients)
            {
                Outlook.Recipient oRecip = (Outlook.Recipient)oRecips.Add(recipient);
                oRecip.Resolve();
            }

            //Add CC
            Outlook.Recipient oCCRecip = oRecips.Add("THIYAGARAJAN.DURAIRAJAN@testmail.com");
            oCCRecip.Type = (int)Outlook.OlMailRecipientType.olCC;
            oCCRecip.Resolve();

            //Add Subject
            oMailItem.Subject = "Test Mail";

            // body, bcc etc...

            //Display the mailbox
            oMailItem.Display(true);
        }
        catch (Exception objEx)
        {
            Response.Write(objEx.ToString());
        }
    }
}

如果用户使用Outlook取消按钮取消发送电子邮件,您如何取消发送电子邮件? - singhswat
该代码只是生成一个新的电子邮件窗口,并填充收件人和主题字段并显示出来。由用户决定是否发送电子邮件,如果关闭了电子邮件窗口(未发送),则电子邮件将不会被发送。 - Steve Goossens

0

你不能使用mailto来实现这个功能。要么你的客户端必须选择他们要发送的账户,这默认为他们的默认账户,要么你需要提供一个邮件表单并在发送电子邮件时设置头部。


我知道我不能那样做 - 这就是为什么我在寻找不同的选择 - 看到一些应用程序可以管理那样的操作,所以一定有办法... - Maciej

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接