【问题标题】:Sending email using smtp works only after sending it by outlook使用 smtp 发送电子邮件仅在通过 Outlook 发送后有效
【发布时间】:2012-12-17 07:46:01
【问题描述】:

我正在尝试使用 asp.net mvc 应用程序发送电子邮件。 smtp 客户端在 web.config 中配置,例如:

<mailSettings>
    <smtp from="noreply@test.sk">
        <network host="mail.test.sk" defaultCredentials="false" userName="noreply@test.sk" password="pass" port="25"/>
</smtp>
</mailSettings>

C#:

using (SmtpClient client = new SmtpClient())
{
    MailMessage message = new MailMessage(from, to, subject, body);
    client.Timeout = 10000;
    client.Send(message);
    return false;
}

问题是,在我尝试使用 Outlook 发送电子邮件之前,它不起作用(我收到超时异常)。通过 Outlook 发送电子邮件后,它也通过我的 Web 应用程序成功发送。是否有某种特殊类型的身份验证,Outlook 正在执行该身份验证,然后允许对来自我 IP 的所有电子邮件进行身份验证?是什么原因只能通过outlook发送后才起作用?

顺便说一句: 我在 VS asp.net 开发服务器中运行该应用程序。当我将它部署到虚拟主机服务器时,它不起作用(超时)。 我的虚拟主机提供商告诉我,该服务器上有一个经典的 smtp 身份验证(不是 smtp 之前的 pop3)。

已编辑:

我发现,当它工作时,我通过 telnet 尝试或通过 wireshark 跟踪它,通信开始于:

220 mail2.hostmaster.sk ESMTP Postfix
EHLO fernet-PC
250-mail2.hostmaster.sk
250-PIPELINING
250-SIZE 104857600
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
...

与不工作时(前一天刚试过)相比,整个通信看起来像:

220-mail2.hostmaster.sk ESMTP Postfix
EHLO fernet-PC
250-mail2.hostmaster.sk
250-SIZE 104857600
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN

因此支持的身份验证方法和对流水线的支持存在差异。我猜 System.Net.Mail.SmtpClient 然后不知道它应该使用哪种身份验证方法,所以它卡住了,因此我得到了超时异常。

有趣的是,Outlook 连接和发送电子邮件没有问题。

我没有使用他们的 smtp 服务器解决了我的问题,因为我的时间不多了。我正在使用 gmail 的 smtp 服务器。我创建了新的 gmail 帐户,并在其中将别名设置为我需要的,因此电子邮件看起来不像来自 gmail 的第一眼。

【问题讨论】:

  • 您是否正在运行防病毒软件来检查端口 25(Norton、McAfee 等)上的出站连接
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 您的问题是在本地和服务器上,还是在其中一个上?
  • 杀毒软件已关闭。我在 VS 开发服务器、IIS 7.5 和托管服务器上也有本地问题,但有时它可以在 localhost 上运行,但不能同时在托管服务器上运行,反之亦然。

标签: asp.net-mvc c#-4.0 smtpclient smtp-auth


【解决方案1】:

我在一个网站上修复了一个类似的问题,并在研究该问题时遇到了这个问题。

以下代码适用于 Google Apps for Business;

public class SendSMTPEmail
    {
    public static void SendText(string ToName, string ToEmail, string FromName, string FromEmail, string Subject, string Content)
    {
        MailAddress from = new MailAddress(ToEmail, ToName);
        MailAddress to = new MailAddress(ToEmail, ToName);

        var smtp = new SmtpClient
        {
            Host = "smtp.gmail.com",
            Port = 587,
            EnableSsl = true,
            DeliveryMethod = SmtpDeliveryMethod.Network,
            Credentials = new NetworkCredential("username@googlemail.com", "yourpassword"),
            Timeout = 20000
        };

        MailMessage message = new MailMessage()
        {
            From = from,
            Body = Content,
            Subject = Subject
        };

        message.To.Add(to);

        smtp.Send(message);

    }
}

这有帮助吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2016-02-09
    • 2016-08-27
    • 2022-07-20
    • 2011-04-06
    • 2017-05-12
    • 2011-10-28
    相关资源
    最近更新 更多