如何静默发送 Outlook 电子邮件?

How can I silently send Outlook email?

我有这段代码可以发送带附件的电子邮件[s]:

internal static bool EmailGeneratedReport(List<string> recipients)
{
    bool success = true;
    try
    {
        Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
        MailItem mailItem = app.CreateItem(OlItemType.olMailItem);
        Recipients _recipients = mailItem.Recipients;
        foreach (string recip in recipients)
        {
            Recipient outlookRecipient = _recipients.Add(recip);
            outlookRecipient.Type = (int)OlMailRecipientType.olTo;
            outlookRecipient.Resolve();
        }
        mailItem.Subject = String.Format("Platypus Reports generated {0}", GetYYYYMMDDHHMM());
        List<String> htmlBody = new List<string>
        {
            "<html><body><img src=\"http://www.platypus.com/wp-content/themes/duckbill/images/pa_logo_notag.png\" alt=\"Pro*Act logo\" ><p>Your Platypus reports are attached.</p>"
        };
        htmlBody.Add("</body></html>");
        mailItem.HTMLBody = string.Join(Environment.NewLine, htmlBody.ToArray());

        . . . // un-Outlook-specific code elided for brevity

        FileInfo[] rptsToEmail = GetLastReportsGenerated(uniqueFolder);
        foreach (var file in rptsToEmail)
        {
            String fullFilename = Path.Combine(uniqueFolder, file.Name);
            if (!File.Exists(fullFilename)) continue;
            if (!file.Name.Contains(PROCESSED_FILE_APPENDAGE))
            {
                mailItem.Attachments.Add(fullFilename);
            }
            MarkFileAsSent(fullFilename);
        }
        mailItem.Importance = OlImportance.olImportanceHigh;
        mailItem.Display(false);
    }
    catch (System.Exception ex)
    {
        String exDetail = String.Format(ExceptionFormatString, ex.Message,
            Environment.NewLine, ex.Source, ex.StackTrace, ex.InnerException);
        MessageBox.Show(exDetail);
        success = false;
    }
    return success;
}

但是,它会在准备就绪时弹出电子邮件 window,用户必须通过发送或取消来回复。由于这是在一个基于计时器生成要发送的报告发送电子邮件的应用程序中,我不能依赖在场的人点击 "Send" 按钮。

可以发送 Outlook 电子邮件"silently"吗?如果可以,怎么做?

我可以用 gmail 静默发送电子邮件:

private void EmailMessage(string msg)
{
    string FROM_EMAIL = "sharedhearts@gmail.com";
    string TO_EMAIL = "cshannon@platypus.com";
    string FROM_EMAIL_NAME = "B. Clay Shannon";
    string TO_EMAIL_NAME = "Clay Shannon";
    string GMAIL_PASSWORD = "theRainNSpainFallsMainlyOnDonQuixotesHelmet";

    var fromAddress = new MailAddress(FROM_EMAIL, FROM_EMAIL_NAME);
    var toAddress = new MailAddress(TO_EMAIL, TO_EMAIL_NAME);
    string fromPassword = GMAIL_PASSWORD;
    string subject = string.Format("Log msg from ReportScheduler app sent 
{0}", DateTime.Now.ToLongDateString());
    string body = msg;

    var smtp = new SmtpClient
    {
        Host = "smtp.gmail.com",
        Port = 587,
        EnableSsl = true,
        DeliveryMethod = SmtpDeliveryMethod.Network,
        UseDefaultCredentials = false,
        Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
    };
    using (var message = new MailMessage(fromAddress, toAddress)
    {
        Subject = subject,
        Body = body
    })
    {
        smtp.Send(message);
    }
}

...但是当我这样做时,我必须提供我的 gmail 密码,而我真的不想这样做(在源代码中公开我的密码)。

那么,我怎样才能获得 gmailing(沉默)和 Outlook(保密密码)的好处?

如果你想要最短的路:

System.Web.Mail.SmtpMail.SmtpServer="SMTP Host Address";
System.Web.Mail.SmtpMail.Send("from","To","Subject","MessageText");

这是我从另一个项目中重用的代码,在该项目中我希望 显示发送对话框,并且只有在用户点击 [=17] 时才发送电子邮件=] 按钮。因此,它没有调用 "send"

要获取要发送的电子邮件 silently/unattended,我只需要像这样添加对 "mailItem.Send()" 的调用:

mailItem.Importance = OlImportance.olImportanceHigh;
mailItem.Display(false);
mailItem.Send(); // This was missing