【问题标题】:Send Email (with Attachments) from .Net App without opening Desktop Mail Software or Browser?从 .Net 应用程序发送电子邮件(带附件)而不打开桌面邮件软件或浏览器?
【发布时间】:2019-07-08 16:23:39
【问题描述】:

我正在编写一个 WPF (C#) 应用程序,它接收用户的反馈并通过电子邮件发送给他们。

我希望我的程序在不使用任何桌面邮件软件(Outlook Express 或 Microsoft Outlook 或 Windows Mail 或任何其他软件)且不打开任何浏览器窗口的情况下将此邮件发送到固定地址。

事实上,我想在不被发现的情况下发送它们。这意味着用户不应该知道发送邮件。 (这是一个可选要求,可以忽略)。

谁能告诉我怎么做。提前致谢。

【问题讨论】:

  • 代码见其他问题。请注意,您很可能必须对邮件密码进行硬编码。为什么不使用网络服务来接收反馈?

标签: c# .net


【解决方案1】:

作为框架提供的标准System.Net.Mail.SmtpClient 类的替代方案,您可以使用DnSmtp 之类的东西。它允许您的应用程序直接发送电子邮件,而无需配置 SMTP 服务器(它嵌入了所有 SMTP 服务器的“魔法”)。如果这真的需要不可见地运行(假设也没有用户配置或必须硬编码值),那么这可能是一个值得的选择。

【讨论】:

    【解决方案2】:

    你绝对应该尝试使用

    using System.Net.Mail;
    

    这是您可以用来执行此操作的方法:

        /// <summary>
        /// Send an Email
        /// </summary>
        /// <param name="host">Example: smtp.gmail.com</param>
        /// <param name="port">Port to send email</param>
        /// <param name="from">Example: Email@gmail.com</param>
        /// <param name="password">Password</param>
        /// <param name="toList">List of people to send to</param>
        /// <param name="subject">Subject of email</param>
        /// <param name="messsage">Meddage of emial</param>
        /// <param name="deliveryMethod">Deliever type</param>
        /// <param name="isHtml">Is email HTML</param>
        /// <param name="useSSL">Is email SSL</param>
        /// <param name="ccList">List of people to cc</param>
        /// <param name="atachmentList">List of attachment files</param>
        public void SendMessage(string host, int port, string from, string password, List<string> toList, string subject, string messsage,
            SmtpDeliveryMethod deliveryMethod, bool isHtml, bool useSSL, List<string> ccList, List<string> atachmentList)
        {
            try
            {
                SmtpClient smtpClient = new SmtpClient(host);
                smtpClient.DeliveryMethod = deliveryMethod;
                smtpClient.Port = port;
                smtpClient.EnableSsl = useSSL;
                if (!string.IsNullOrEmpty(password))
                    smtpClient.Credentials = new NetworkCredential(from, password);
    
                MailMessage mailMessage = new MailMessage();
                mailMessage.From = new MailAddress(from);
                mailMessage.Subject = subject;
                mailMessage.IsBodyHtml = isHtml;
                mailMessage.Body = messsage;
    
                if (toList != null)
                {
                    for (int i = 0; i < toList.Count; i++)
                    {
                        if (!string.IsNullOrEmpty(toList[i]))
                            mailMessage.To.Add(toList[i]);
                    }
                }
    
                if (ccList != null)
                {
                    for (int i = 0; i < ccList.Count; i++)
                    {
                        if (!string.IsNullOrEmpty(ccList[i]))
                            mailMessage.CC.Add(ccList[i]);
                    }
                }
    
                if (atachmentList != null)
                {
                    for (int i = 0; i < atachmentList.Count; i++)
                    {
                        if (!string.IsNullOrEmpty(atachmentList[i]))
                            mailMessage.Attachments.Add(new Attachment(atachmentList[i]));
                    }
                }
    
                try
                {
                    smtpClient.Send(mailMessage);
                }
    
                catch
                {
                }
            }
            catch
            {
            }
        }
    

    我只是对所有内容进行了尝试,并进行了最少的错误检查。悬停,这就是我希望的解决方案。

    【讨论】:

      【解决方案3】:

      您可以使用System.Net.Mail 命名空间。

      SmtpClient topic in MSDN 有一个很好的例子来说明如何做到这一点。

      这将要求您在应用程序中嵌入 SMTP 服务器名称或地址,并且此电子邮件发送很容易被公司或 ISP 政策阻止(即,某些 ISP 只允许对其特定 SMTP 服务器的请求,在很大程度上阻止或阻止控制垃圾邮件)。

      【讨论】:

        【解决方案4】:

        您可以使用 Chilkat 之类的库,也可以使用 system.net.mail 之类的内置 .Net 内容(例如 this)连接到 SMTP 服务器。

        如果您的客户正在运行防病毒程序,这将被阻止,但如果您使用谷歌搜索,则有一些解决方法。

        【讨论】:

          【解决方案5】:

          如果您通过 Exchange 2010 服务器发送电子邮件,那么您还有另一个选择,在 Exchange 2010 中,它提供 Web 服务,让您可以完全控制邮箱。

          您可以从Exchange server SDK下载SDK

          【讨论】:

          • 很少需要直接实现 Exchange SDK。这提供了一个可扩展性较差的解决方案,只有在您的应用程序范围仅限于 LAN 时才应考虑。
          • Exchange Server SDK,是基于Web Service的,当然不限于局域网,制作cmet前请先做调查,以免迷惑他人。当然,人们选择什么样的解决方案取决于需求。我只是为他们指出了另一种方式。
          猜你喜欢
          • 2011-01-03
          • 2016-10-08
          • 1970-01-01
          • 1970-01-01
          • 2016-09-08
          • 1970-01-01
          • 2015-01-01
          • 1970-01-01
          相关资源
          最近更新 更多