从C#中打开新的Outlook邮件

3
我希望从我的程序中生成Outlook消息,我可以在程序内部构建并发送消息,也可以构建并保存。但是我想先构建邮件,然后显示给用户手动选择AD列表中的收件人。下面的代码混合了这里和其他教程网站的样本,但没有找到只构建然后“显示”电子邮件而不在程序内部保存草稿或发送的方法。
另外,我正在寻找一种在电子邮件中创建UNC链接的方法,例如:编写到用户文件夹路径的路径\\unc\path\%USERNAME%或类似内容。
private void sendEmailOutlook(string savedLocation, string packageName)
    {
        try
        {
            Microsoft.Office.Interop.Outlook.Application oApp = new Microsoft.Office.Interop.Outlook.Application();
            Microsoft.Office.Interop.Outlook.MailItem oMsg = (Microsoft.Office.Interop.Outlook.MailItem)oApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);

            oMsg.HTMLBody = "Attached is the required setup files for your <i><b>soemthing</i></b> deployment package.";
            oMsg.HTMLBody += "\nPlease save this file to your network user folder located.<br /><br/>\\\\UNC\\data\\users\\%USER%\\";
            oMsg.HTMLBody += "\nOnce saved please boot your Virtual machine, locate and execute the file at <br /> <br />\\\\UNC\\users\\%USER%\\";

            int pos = (int)oMsg.Body.Length +1;
            int attachType = (int)Microsoft.Office.Interop.Outlook.OlAttachmentType.olByValue;

            Microsoft.Office.Interop.Outlook.Attachment oAttach = oMsg.Attachments.Add(savedLocation, attachType, pos, packageName);

            oMsg.Subject = "something deployment package instructions";
            oMsg.Save();

        }
        catch(Exception ex)
        {
            Console.WriteLine("Email Failed", ex.Message);
        }

1
这个链接无效吗? - Herdo
@Herdo 它给我抛出了一个错误,但我可以解决它,它似乎是我正在寻找的第一部分,您能回答关于最终用户的 UNC 路径的第二部分吗? - asuppa
1
由于您正在使用HTML格式:您是否尝试使用简单的HTML链接元素(<a></a>)? - Herdo
1
我必须让你失望了。由于电子邮件客户端不解析任何带有“占位符”的路径,因此您的尝试不会像这样起作用。您在公司中使用吗?如果是的话,我猜每个人都有一个与用户文件夹匹配的特定SMTP帐户? - Herdo
1
对于你来说,我目前遇到了两个选择(在我的解决方案中我选择了第一个):1.: 让用户编辑模板。当用户发送模板时,用用户特定的数据替换路径并为每个收件人发送1封电子邮件。然后撤回该模板(注意:每个收件人将会收到一封已发送的电子邮件)。2.: 为所有同事的电子邮件客户端编写一个插件,在接收电子邮件时解析路径。我知道,这些可能不是最好的解决方案,但它们能够完成工作 :) - Herdo
显示剩余3条评论
1个回答

4
Microsoft.Office.Interop.Outlook.Application oApp = new Microsoft.Office.Interop.Outlook.Application();
Microsoft.Office.Interop.Outlook.MailItem oMsg = (Microsoft.Office.Interop.Outlook.MailItem)oApp.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);

oMsg.Subject = "something deployment package instructions";
oMsg.BodyFormat = OlBodyFormat.olFormatHTML;
oMsg.HTMLBody = //Here comes your body;
oMsg.Display(false); //In order to display it in modal inspector change the argument to true

关于链接到文件夹的使用(如果您知道用户名):
<a href="C:\Users\*UserName*">Link</a>

许多公司将员工的用户名附加到地址条目中(看起来像“John Doe(Jdoe)”,其中Jdoe是用户名)。当您的用户选择收件人或尝试发送电子邮件时,您可以捕获这些事件,并执行以下操作:
foreach (Outlook.Recipient r in oMsg.Recipients)
{
    string username = getUserName(r.Name);//  or r.AddressEntry.Name instead of r.Name
    oMsg.HTMLBody += "<a href='C:\\Users\\" + username  + "'>Link</a>"
}
oMsg.Save();
oMsg.Send();

这里的getUserName()是一个方法,它提取了用户名(可以使用substring或RegEx)。

  • 确保邮件正文是有效的HTML
  • /n不会给你一个新行,你应该使用<br>替代。

谢谢,我已经和@Herdo之前的对话中解决了所有问题,除了链接。然而,用户名在运行时是未知的,它将在通过Outlook AD添加后才能得知。 - asuppa

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