Solución:
Entonces, ¿por qué establecería explícitamente la propiedad en falso para lanzar una excepción?
La razón de esto es porque el colocador de UseDefaultCredentials
establece el Credentials
propiedad en nulo si lo establece en falso, o lo establece en el CredentialCache.DefaultNetworkCredentials
propiedad si se establece en verdadero. los DefaultNetworkCredentials
MSDN define la propiedad como:
Las credenciales devueltas por DefaultNetworkCredentials representan las credenciales de autenticación para el contexto de seguridad actual en el que se ejecuta la aplicación. Para una aplicación del lado del cliente, estas suelen ser las credenciales de Windows (nombre de usuario, contraseña y dominio) del usuario que ejecuta la aplicación. Para las aplicaciones ASP.NET, las credenciales de red predeterminadas son las credenciales de usuario del usuario que inició sesión o el usuario que se está suplantando.
Cuando estableces UseDefaultCredentials
en verdad, está usando su usuario de IIS, y supongo que su usuario de IIS no tiene las mismas credenciales de autenticación que su cuenta para cualquier servidor SMTP que esté usando. Configuración UseDefaultCredentials
a falso nulo salen las credenciales que se establecen. Entonces, de cualquier manera, obtienes ese error.
Aquí hay un vistazo al setter para UseDefaultCredentials
usando dotPeek:
set
{
if (this.InCall)
{
throw new InvalidOperationException(
SR.GetString("SmtpInvalidOperationDuringSend"));
}
this.transport.Credentials = value
? (ICredentialsByHost) CredentialCache.DefaultNetworkCredentials
: (ICredentialsByHost) null;
}
Recibía el mismo mensaje y me estaba volviendo loco. Después de leer este hilo, me di cuenta de que el orden importaba al establecer mis credenciales. Esto funcionó:
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential(smtpSettings.Username, smtpSettings.Password);
Si bien esto generó el error que describe:
client.Credentials = new NetworkCredential(smtpSettings.Username, smtpSettings.Password);
client.UseDefaultCredentials = false;
Esto es solo una información para cualquier otra persona que tenga el mismo problema.