我有一个静态帮助器方法,我将其包裹在SMTPClient中以发送电子邮件。
我将SMTP身份验证存储在web.config中 - >在System.Net命名空间对象查找的默认位置。
我将凭据传递给SMTPClient,因为我想在SMTPClient使用密码之前对密码运行密码解密。
我在这里遇到的问题是 - 当我运行一次时,密码会以某种方式存储在缓存中“解密”。当我尝试在同一个会话中第二次运行此方法时,我收到一个错误,因为它正在尝试解密第一次运行时已经解密的密码。有什么想法吗?
public static void SendEmail(MailMessage mailMessage)
{
SmtpClient smtpClient = new SmtpClient();
NetworkCredential nc = new NetworkCredential();
nc = (NetworkCredential)smtpClient.Credentials;
nc.Password = Tools.Decrypt(nc.Password);
smtpClient.Credentials = nc;
smtpClient.Send(mailMessage);
nc = null;
smtpClient.Credentials = null;
}
答案 0 :(得分:1)
由于NetworkCredentials是一个类,您正在传递对您的nc变量的引用,这意味着当您解密密码时,您正在原始对象上解密它。
您需要克隆对象,或者仅在应用程序启动时执行此操作。
答案 1 :(得分:0)
有点hacky但只是把
SmtpClient smtpClient = new SmtpClient();
NetworkCredential nc = new NetworkCredential();
nc = (NetworkCredential)smtpClient.Credentials;
nc.Password = Tools.Decrypt(nc.Password);
smtpClient.Credentials = nc;
smtpClient = null;
你在global.asax中可能会这样做。
SmtpClient smtpClient = new SmtpClient();
smtpClient.Send(mailMessage);
smtpClient = null;
在你的静态方法中,虽然我确信必须有一个更优雅的解决方案。
更新:您可以尝试使用SmtpNetworkElement并在global.asax中更新密码 - 我认为只要您在使用SmtpClient之前执行此操作,它就可以工作。