我需要在发送邮件之前验证在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);
如何验证凭据所标识的用户是否可以连接并发送邮件?
答案 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答案中的更多细节。
答案 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包围您的发送。