如何在发送邮件之前验证smtp凭据?

时间:2010-03-11 15:16:18

标签: .net smtpclient

我需要在发送邮件之前验证在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);

如何验证凭据所标识的用户是否可以连接并发送邮件?

6 个答案:

答案 0 :(得分:3)

没有办法。

SmtpClient基本上无法在不联系其连接的服务的情况下验证usernamepassword。

你可以做的是通过打开与服务器的TCP连接在SmtpClient外部进行...但是根据服务器的配置,身份验证可能很复杂。

在发送之前,我可以问你为什么需要知道?正常行为恕我直言将包装发送到适当的错误处理,以捕获异常。

答案 1 :(得分:2)

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

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;
    }

similar question答案中的更多细节。

Code on github

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

请注意,这些测试电子邮件会显示在您帐户的已发送文件夹中(如果有)

答案 4 :(得分:0)

我同意之前的答案,即SmtpClient无法在不发送的情况下进行验证。

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

答案 5 :(得分: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包围您的发送。