SmtpClient发送邮件

3
我尝试使用以下代码通过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();
            }
        }
    }
}

可能是重复问题:https://dev59.com/tXVD5IYBdhLWcg3wRpeX - Josh Mein
@KendallFrey 客户端.Send(mail) 是发生错误的地方。 - steventnorris
你可能应该同时展示你的配置文件中相应的代码。 - Josh Mein
@jmein 我正在将其作为控制台应用程序运行,而不是Web应用程序。 - steventnorris
@AntonioBakula 谢谢。我开始觉得这可能是防火墙问题,导致整个事情陷入僵局。 - steventnorris
显示剩余3条评论
3个回答

8
很可能你无法连接到你指定的主机和端口,可能有多种原因,其中之一可能是被防火墙阻止。首先,可以使用命令提示符下的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身份具有写入权限。 - Todd H.

1

将您的代码与通过Gmail在.NET中发送电子邮件的答案进行比较。不确定是否是问题,但在创建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的默认值。 - Joshua Frank

1

是的,我已经设置好允许使用smtp.gmail.com。 - steventnorris
由于您的帐户已配置为允许smtp.gmail.com,您是否检查了本地防火墙以确保您可以在TCP 587上进行出站访问? - lukiffer
@lukiffer 我不确定,但我认为你可能是正确的。这里的防火墙非常强大。我明天必须与我们的首席系统管理员核实。 - steventnorris

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