2

我正在编写一个需要发送 SMTP 电子邮件的 C# 类。我在这个 SO 问题中找到了代码,它给了我发送电子邮件所需的内容(SO 问题)

为方便起见,这是我根据上述问题的答案修改的代码:

using System.Net;
using System.Net.Mail;

var fromAddress = new MailAddress("from@gmail.com", "From Name");
var toAddress = new MailAddress("to@example.com", "To Name");
const string fromPassword = "fromPassword";
const string subject = "Subject";
const string body = "Body";

var smtp = new SmtpClient
           {
               Host = "smtp.gmail.com",
               Port = 587,
               EnableSsl = true,
               DeliveryMethod = SmtpDeliveryMethod.Network,
               UseDefaultCredentials = false,
               Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
           };
using (var message = new MailMessage(fromAddress, toAddress)
                     {
                         Subject = subject,
                         Body = body
                     })
{
    smtp.Send(message);
}

我遇到的问题是该问题中的代码需要将 smtp 密码存储在纯文本 C# 源文件中。问题之一是该代码将被签入团队基础服务,因此整个团队都必须/了解凭据。问题二是混淆是可能的,但它不能解决问题 1。

我发现最接近的解决方案是将应用程序配置加密作为安装步骤。这无法解决问题 1,但如有必要,可以完成。

这种情况是否出现在生产应用程序中,以及使用哪些最佳实践来存储实例化 C# 类所需的密码?

4

2 回答 2

1

我们使用我们的构建服务器 TeamCity 解决了这个问题。构建系统包含生产机密(密码、API 密钥等),只能由少数受信任的个人设置。然后,我们的构建系统负责使用脚本和/或密码构建参数在编译之前/之后更改配置(和其他敏感)文件。

这使我们可以自由地为我们的秘密提交暂存/测试值,但要知道生产构建将获得生产秘密。App/Web.Config 转换可以处理 URL 切换 (dev/qa/stage/prod),因此我们只将构建服务器用于我们不希望包含在源代码控制中的部分。

于 2013-12-23T17:41:39.967 回答
-1

它只接受纯文本,即

Credentials = new NetworkCredential(fromAddress.Address, "MY Password" )

部署项目时,任何人都无法看到您的密码。如果将其保存为文本文件,则可以使用加密方法来防止其他人查看您的密码,但如果将其作为凭据解析为参数,则必须将其解析为纯文本。这是我们专业的惯用方式。如果您不愿意提供您的邮件密码,请创建另一个电子邮件帐户进行测试并将其凭据放在那里。

于 2013-06-22T03:55:04.127 回答