【问题标题】:SmtpClient send mailSmtpClient 发送邮件
【发布时间】:2012-05-03 05:38:58
【问题描述】:

我正在尝试使用以下代码通过 gmail 发送邮件,但我不断收到一条错误消息,指出“无法连接到远程主机”。我已经仔细检查了我的配置,对我来说一切都很好。有人看到我缺少的东西吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            SmtpClient client = new SmtpClient();
            client.UseDefaultCredentials = false;
            client.Credentials = new NetworkCredential("mymail@gmail.com", "mypass");
            client.Port = 587;
            client.Host = "smtp.gmail.com";
            client.EnableSsl = true;
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress("mymail@gmail.com");
            mail.To.Add("tomail@tomail.org");
            mail.Subject = "subject thing";
            mail.Body = "dubbly doo";
            try
            {
                client.Send(mail);
            }
            catch(SmtpException e)
            {
                Console.Write(e.InnerException.Message);
                Console.ReadLine();
            }
        }
    }
}

【问题讨论】:

  • 错误出现在哪一行?
  • @KendallFrey client.Send(mail) 是发生错误的地方
  • 你可能也应该从你的配置中显示相应的代码。
  • @jmein 我将其作为控制台应用程序运行,而不是 Web 应用程序。

标签: c# email smtp smtpclient


【解决方案1】:

您很可能在访问指定的主机和端口时遇到问题。这可能是一系列事情,其中​​一个被防火墙阻止。首先从命令提示符使用 telnet 程序连接到主机和端口,即telnet smtp.gmail.com 587。如果它确实连接,那么您可以通过按 ctrl+] 并在收到提示时键入 quit 来断开连接。如果 telnet 连接失败,请开始查看与防火墙/网络相关的问题。

您还可以通过将以下内容添加到应用程序的 .config 文件中来获取包含详细调试信息的文件:

<system.diagnostics>
  <sources>
    <source name="System.Net">
      <listeners>
        <add name="TraceFile"/>
      </listeners>
    </source>
    <source name="System.Net.Sockets" maxdatasize="1024">
      <listeners>
        <add name="TraceFile"/>
      </listeners>
    </source>
  </sources>
  <sharedListeners>
    <add name="TraceFile" type="System.Diagnostics.TextWriterTraceListener" initializeData="System.Net.trace.log" traceOutputOptions="DateTime"/>
  </sharedListeners>
  <switches>
    <add name="System.Net" value="Verbose"/>
    <!--<add name="System.Net.Sockets" value="Verbose"/>-->
  </switches>
  <trace autoflush="true" />
</system.diagnostics>

【讨论】:

  • 优秀的提示@JamieSee !我可能会补充一点,您可以在“initializeData”中的输出文件上放置完整路径,其中 AppPool 身份具有写入权限。
【解决方案2】:

您是否已将您的电子邮件帐户设置为允许使用 smtp.gmail.com?

http://support.google.com/mail/bin/answer.py?hl=en&answer=13273

【讨论】:

  • 是的,我已设置为允许 smtp.gmail.com
  • 由于您的帐户已配置为允许 smtp.gmail.com,您是否检查了本地防火墙以确保您可以通过 TCP 587 访问出站端口?
  • @lukiffer 我不确定,但我认为您可能走在正确的轨道上。这里的防火墙非常坚固。明天我必须和我们的系统管理员确认一下。
【解决方案3】:

将您的代码与sending-email-in-net-through-gmail 的答案进行比较。如果这是问题,则不是肯定的,但是您在创建 SmtpClient 时缺少以下内容:

DeliveryMethod = SmtpDeliveryMethod.Network

来自链接问题的示例:

var smtp = new SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};

【讨论】:

  • 这实际上是DeliveryMethod的默认值。
猜你喜欢
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
相关资源
最近更新 更多