问题 无需硬编码用户名和密码即可发送电子邮件


有没有办法从C#发送电子邮件而无需使用Gmail SMTP手动编码我的用户名和密码?

我知道有一些软件可以看到源代码,我真的不喜欢他们看到我的Gmail密码。


7159
2017-09-01 12:31


起源

配置文件?只是一个想法,我不知道如何在c#中使用一个,所以我不会回答。 - sealz
@ harper89:与使用Reflector相比,配置文件可以更容易地查看用户名密码。 - Chandu
在配置文件中存储乱码然后写一些东西,将其翻译成你程序中的密码然后:) - sealz
@harper::)仍然可以使用反射器转换给定配置文件和exe的密码:) - Chandu
请注意将密码加密到配置文件中的所有建议。如果您的应用程序可以提取您的密码以便可以用于验证gmail事务,则可以由不道德的用户提取该密码以获取对您的Gmail帐户的访问权限。假设他们已经允许您这样做,那么通过用户SMTP中继发送电子邮件会更好。 - Mark Booth


答案:


您不应该在其他人正在运行的应用程序中使用您的用户名和密码。

修改应用程序,以便提示用户  电子邮件凭据并使用它们。

这必须存储在配置文件中,除非您存储,否则仍可由其他人读取 哈希加密密码。


7
2017-09-01 12:36



什么你可以做什么惠特哈希pswd? - Luka Rahne
详细说明ralu的观点....不要散列密码,加密密码。如果在Windows上,我将使用用户+机器DPAPI加密并存储在注册表中。 - Toby
谢谢这可能是解决方案,但我也想尝试app.config解决方案。 - funerr


第一个选项:在config中存储用户名和密码

using System.Net.Mail;

var fromEmail = ConfigurationSettings.AppSettings[ "mail" ]; 
var fromPassword = ConfigurationSettings.AppSettings[ "pass" ]; 

var fromAddress = new MailAddress(fromEmail, "From Name");
var toAddress = new MailAddress("to@example.com", "To Name");
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);
}

在app.config中:

  <appSettings>
    <add key="mail" value="somemail@gmail.com" />
    <add key="pass" value="password" />
  </appSettings>

您也可以通过加密来制作安全的配置文件。

第二个选项:从用户读取用户名和密码


3
2017-09-01 12:42



web.config文件有一个特殊的SMTP设置部分。这比在appsettings中做的更受青睐: blog.dotnetclr.com/archive/2009/08/18/511.aspx - KallDrexx
据我所知,只有当应用程序是ASP.Net(web.config)时,加密配置中的一个部分才是无缝的。如果您选择在app.config中为windows.Net应用程序加密某个部分,则可能必须编写代码来解密它。 - Arun


对您的Web服务器进行HTTP POST,该服务器将代表应用程序发送电子邮件。您可能需要一些方法来验证POST是否真的来自您的应用程序,因此您需要对应用程序的密钥进行硬编码,但由于您可以控制服务器部分,因此可以阻止发现被滥用的密钥。

或者,创建一个二次一次性Gmail帐户,您可以使用该帐户向主帐户发送电子邮件,然后将其转发给目标收件人。

所有这些对我来说似乎很愚蠢,最终最好的解决方案取决于你打算如何发送电子邮件。


2
2017-09-01 12:37





如果您在ASP.NET中运行,那么您可以 加密web.config文件的各个部分 使用 aspnet_regiis.exe工具

如果您正在运行带有app.config文件的常规应用程序,那么您可以加密整个文件,或仅加密文件的一部分,如Jon Galloway在其博客文章中所述 “加密.NET app.config文件中的密码”

一旦在配置文件中有了这个,就可以使用了 SecureString 类 从配置文件中获取您的用户名/密码选项,并将它们加密到内存中,直到它们需要/使用的最后一刻。


1
2017-09-01 12:38



我正在使用离线c# - funerr
@askingDude:见第二和第三段。 - casperOne


将用户名和密码存储在配置文件中......

在C#中使用设置


0
2017-09-01 12:35



不再安全,然后将它们保存在程序中 - rolls


在配置文件中外部化特定于环境的配置 - 尤其是诸如凭据之类的敏感配置。


0
2017-09-01 12:35



它安全吗?(config) - funerr


ASP.NET IIS注册工具可以为您做到这一点。您只需键入一行即可。检查 http://odetocode.com/blogs/scott/archive/2006/01/08/encrypting-custom-configuration-sections.aspx


0
2017-09-01 12:39