【问题标题】:SMTP email "Service" I can include in my C# project?SMTP 电子邮件“服务”可以包含在我的 C# 项目中吗?
【发布时间】:2012-02-15 05:04:51
【问题描述】:

我已经编写了几个从 C# 发送电子邮件的程序。这在winXP中效果很好,但我发现它在Win7中坏了。我的理解是,即使我引用的 SMTP 服务器在另一台计算机上,发送计算机也需要安装 SMTP 服务(而 win7 没有)。

我知道安装第三方 SMTP 服务器是可能的,但是我需要在每台运行我的程序的计算机上安装。相反,我想在我的项目中包含一个临时 SMTP 服务器,我可以完全从代码中使用它来完成相同的工作。有谁知道关于如何在我的项目中包含临时 SMTP 服务器的库(或示例代码)?

这是我的代码:

public static void sendEmail(String[] recipients, String sender, String subject, String body, String[] attachments)
    {
            MailMessage message;

            try
            {
                message = new MailMessage(sender, recipients[0]);
            }
            catch (Exception)
            {
                return;
            }

            foreach (String s in recipients)
            {
                if (!message.To.Contains(new MailAddress(s)))
                    message.To.Add(s);
            }

            message.From = new MailAddress(sender);
            message.Subject = subject;
            message.Body = body;
            message.IsBodyHtml = true;
            SmtpClient smtp = new SmtpClient("PRIVATE.PRIVATE.PRIVATE", 25);
            smtp.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;
            //smtp.DeliveryMethod = SmtpDeliveryMethod.Network;

            smtp.UseDefaultCredentials = true;

            if (attachments.Length > 0)
            {
                foreach (String a in attachments)
                {
                    message.Attachments.Add(new Attachment(a));
                }
            }
            try
            {
                smtp.SendAsync(message, null);

【问题讨论】:

    标签: c# email windows-7 smtp


    【解决方案1】:

    要从 c# 发送电子邮件,您确实不需要需要本地 SMTP 服务。您只需要 System.Net.Mail 库。使用远程 SMTP 服务器(可能是具有有效 PTR 设置的服务器,而不是网络中的服务器以避免被视为垃圾邮件发送者)就足够了。

    【讨论】:

    • 向我们展示您的脚本。也许您以某种方式使用本地 SMTP 服务。另一个原因可能是防火墙不允许本地程序发送电子邮件。
    • 好的,如果您使用的是(本地)分拣目录,则需要 SMTP 服务器。但你不必,真的。删除它,上面的代码应该适用于任何有效的 SMTP 服务器(前提是凭据正确并且您的防火墙允许)。并且不要从异步发送开始,只需使用发送即可。
    • 好的,我按照你的建议...但是异步有什么问题?
    • 基本上什么都没有。根据您的需要,它可能会更好,因为它不会阻塞程序流程,但会增加另一层复杂性。您必须实施一种方法来确保电子邮件已发送。最好从简单开始,以便于调试。
    【解决方案2】:

    这可能是凭据问题。将 SendAsync 更改为 Send 以查看您是否收到任何异常。或者为异步调用添加一个处理程序

    smtp.SendCompleted += delegate(object s, System.ComponentModel.AsyncCompletedEventArgs    e)
    {
        if (e.Error != null)
         {
            System.Diagnostics.Trace.TraceError(e.Error.ToString());
         }
    };
    

    在 Win7 中对您的代码进行更改后对我有用

    SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
    //smtp.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;
    smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
    smtp.Credentials = new NetworkCredential(GoogleUserEmail, GooglePassword);
    smtp.EnableSsl = true;
    
    // smtp.UseDefaultCredentials = true;
    
    if (attachments != null && attachments.Length > 0)
            {
                foreach (String a in attachments)
                {
                    message.Attachments.Add(new Attachment(a));
                }
            }
            try
            {
                smtp.Send(message);
            }
    

    【讨论】:

    • 而你在Win7中以原来的方式运行它时会报错吗?
    【解决方案3】:

    我从未找到可嵌入的 SMTP 服务器,但两者都很接近,您可以修改它们以满足您的需要。

    http://www.codeproject.com/KB/IP/smtppop3mailserver.aspx

    http://www.ericdaugherty.com/dev/cses/developers.html

    我会继续寻找,因为这也是我觉得有用的东西。如果我找到了,我会发布更多。

    【讨论】:

      【解决方案4】:

      如果您只是使用未配置的服务来发送电子邮件,由于反向 DNS 和 SPF 检查失败,您肯定会进入垃圾邮件文件夹。因此,您需要正确配置您的服务器。或者,您可以使用第 3 方服务,例如 Elastic Email。这是使用 HTTP 发送邮件的 Elastic Email 的示例代码:

          public static string SendEmail(string to, string subject, string bodyText, string bodyHtml, string from, string fromName)
          {
      
              WebClient client = new WebClient();
              NameValueCollection values = new NameValueCollection();
              values.Add("username", USERNAME);
              values.Add("api_key", API_KEY);
              values.Add("from", from);
              values.Add("from_name", fromName);
              values.Add("subject", subject);
              if (bodyHtml != null)
                  values.Add("body_html", bodyHtml);
              if (bodyText != null)
                  values.Add("body_text", bodyText);
              values.Add("to", to);
      
              byte[] response = client.UploadValues("https://api.elasticemail.com/mailer/send", values);
              return Encoding.UTF8.GetString(response);
          }
      

      【讨论】:

        【解决方案5】:

        您是否尝试过在 App.config 文件中指定 SMTP 设置?比如:

        <?xml version="1.0" encoding="utf-8" ?>
        <configuration>
            <system.net>
                <mailSettings>
                    <smtp deliveryMethod="Network">
                        <specifiedPickupDirectory pickupDirectoryLocation="C:\tmp"/>
                        <network host="smtp.example.com"/>
                    </smtp>
                </mailSettings>
            </system.net>
        </configuration>
        

        如果您更改deliveryMethod="SpecifiedPickupDirectory",那么它只会编写一个文件,表示将发送到您指定的目录的电子邮件。

        【讨论】:

        • -将电子邮件写入文件并没有真正的帮助。我需要发送它。
        • 要发送电子邮件,只需离开 deliveryMethod="Network" 并在 标签中指定正确的主机。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-11
        • 1970-01-01
        • 1970-01-01
        • 2012-09-08
        • 2017-08-09
        • 2019-12-16
        • 2020-05-01
        相关资源
        最近更新 更多