8

我需要SmtpClient在发送邮件之前验证实例中设置的用户名和密码。使用此代码:

SmtpClient client = new SmtpClient(host);
client.Credentials = new NetworkCredential(username,password);
client.UseDefaultCredentials = false;

// Here I need to verify the credentials(i.e. username and password)
client.Send(mail);

如何验证凭据标识的用户是否被允许连接和发送邮件?

4

6 回答 6

3

不可能。

SmtpClient 基本上无法在不联系它所连接的服务器的情况下验证用户名密码。

您可以做的是在 SmtpClient 之外通过打开与服务器的 TCP 连接来执行此操作......但身份验证可能会很复杂,具体取决于服务器的配置方式。

请问为什么在发送之前您需要知道这一点?恕我直言,正常行为是将发送包装在适当的错误处理中以在此处捕获异常。

于 2010-03-11T15:19:40.563 回答
3

我在发送邮件前验证用户名和密码的生产代码:

public static bool ValidateCredentials(string login, string password, string server, int port, bool enableSsl) {
        SmtpConnectorBase connector;
        if (enableSsl) {
            connector = new SmtpConnectorWithSsl(server, port);
        } else {
            connector = new SmtpConnectorWithoutSsl(server, port);
        }

        if (!connector.CheckResponse(220)) {
            return false;
        }

        connector.SendData($"HELO {Dns.GetHostName()}{SmtpConnectorBase.EOF}");
        if (!connector.CheckResponse(250)) {
            return false;
        }

        connector.SendData($"AUTH LOGIN{SmtpConnectorBase.EOF}");
        if (!connector.CheckResponse(334)) {
            return false;
        }

        connector.SendData(Convert.ToBase64String(Encoding.UTF8.GetBytes($"{login}")) + SmtpConnectorBase.EOF);
        if (!connector.CheckResponse(334)) {
            return false;
        }

        connector.SendData(Convert.ToBase64String(Encoding.UTF8.GetBytes($"{password}")) + SmtpConnectorBase.EOF);
        if (!connector.CheckResponse(235)) {
            return false;
        }

        return true;
    }

类似问题的答案中的更多详细信息。

github上的代码

于 2016-03-20T09:06:52.800 回答
1

.NetSmtpClient不允许您在不发送消息的情况下登录。

您可以通过向某个忽略传入电子邮件的现有地址发送测试消息并检查您是否收到异常来检查凭据。

请注意,这些测试电子邮件将出现在您帐户的已发送文件夹中(如果有)(例如 Gmail)

于 2010-03-11T15:28:48.637 回答
1

之前进行验证,无法使用 .net 2.0 中的 SMTP 客户端类发送邮件。

尝试手动验证,通过打开端口与编写自己的 SMTP 客户端一样好,但很复杂。

于 2010-03-11T15:24:35.373 回答
0

我同意之前的答案,即 SmtpClient 不发送就无法验证。

但也许你的问题无论如何都可以解决:如果用户名或密码错误,client.Send(mail);将抛出异常。您可以围绕发送构建一个while循环和一个try-catch-block,捕获异常并询问用户正确的用户名和密码,然后重试。如果用户单击对话框上的取消或发送无异常成功,则退出 while 循环。

于 2010-04-29T10:32:50.733 回答
0

尝试这个:

try
{
   smtpClient.Send(new MailMessage("test@test.com", "test@test.com", "test", "test"));
   return string.Empty;
}
catch (SmtpFailedRecipientException)
{
   return string.Empty;
}
catch (Exception ex)
{
   return string.Format("SMTP server connection test failed: {0}", ex.InnerException != null ? ex.InnerException.Message : ex.Message);
}

它适用于我的验证方法。但是,如果您只需要在发送电子邮件时检查凭据,那么只需在您的发送周围加上 try...catch。

于 2013-09-10T08:47:53.793 回答