发送电子邮件时不需要硬编码用户名和密码

11
有没有办法在不手动编写 Gmail SMTP 用户名和密码的情况下,使用 C# 发送电子邮件?
我知道有一些可以查看源代码的软件,但我不想让它们看到我的 Gmail 密码。

1
一个配置文件?只是一个想法,我不知道如何在C#中使用它,所以我不会回答。 - sealz
@harper89:使用配置文件比使用反射器更容易查看用户名和密码。 - Chandu
@Cybernate 看来我们陷入了困境。 - sealz
@askingDude:您是代表用户发送电子邮件还是代表应用程序(或者更确切地说,不是代表用户)发送电子邮件? - casperOne
1
请注意,不要听信将密码加密到配置文件中的所有建议。如果您的应用程序可以提取您的密码以便用于验证 Gmail 交易,则不道德的用户也可以提取它以访问您的 Gmail 帐户。假设用户已经允许您这样做,那么通过用户的 SMTP 中继发送电子邮件会更好。 - Mark Booth
显示剩余3条评论
8个回答

7

在运行别人的应用程序时,您不应该使用自己的用户名和密码。

修改应用程序,以便提示用户输入他们的电子邮件凭据并使用这些凭据。

这些凭据将需要存储在配置文件中,但除非您存储了散列加密密码,否则仍然可以被其他人读取。


4
你可以用哈希密码做什么? - Luka Rahne
2
进一步阐述ralu的观点...不要哈希密码,而是加密它。如果在Windows上,我会使用用户+机器DPAPI进行加密,并将其存储在注册表中。 - Toby
谢谢,这可能是解决方案,但我还想尝试app.config的解决方案。 - funerr

5

第一选项:将用户名和密码存储在配置文件中

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>

您可以通过加密来创建安全的配置文件。
第二个选项:从用户读取用户名和密码。

2
web.config文件有一个专门的SMTP设置部分。这比在appsettings中进行设置更好:http://blog.dotnetclr.com/archive/2009/08/18/511.aspx - KallDrexx
据我所知,如果应用程序是ASP.Net(web.config),加密配置中的某个部分是无缝的。如果您选择加密Windows.Net应用程序中app.config中的某个部分,则可能需要编写解密代码。 - Arun

2

向您的Web服务器进行HTTP POST请求,该请求将代表应用程序发送电子邮件。您可能需要某种方式来验证POST确实来自您的应用程序,因此您需要将一个密钥硬编码到应用程序中,但由于您控制服务器部分,因此可以阻止发现被滥用的密钥。

或者,创建一个次要的临时Gmail帐户,您可以使用它向您的主帐户发送电子邮件,然后再将其转发给预期的收件人。

尽管所有这些对我来说似乎很傻,但最终最佳解决方案取决于您打算如何发送电子邮件。


1

如果您正在运行ASP.NET,则可以使用aspnet_regiis.exe工具加密web.config文件的部分内容

如果您正在运行带有app.config文件的常规应用程序,则可以像Jon Galloway在他的博客文章"Encrypting Passwords in a .NET app.config File"中所述那样加密整个文件或文件的某些部分。

一旦您在配置文件中完成了这些操作,您可以使用SecureString从配置文件中获取用户名/密码选项,并将它们加密保存在内存中,直到它们被需要/使用的最后一刻。


1
@askingDude:请看第二和第三段。 - casperOne

0

我在发表评论后进行了一些研究,现在感觉更有信心回答问题。

您可以使用配置文件,可以使用这些说明进行设置。

然后,您可以传递任何想要的变量信息。这将在程序外部存储它们,尽管它们仍以纯文本形式编写。

配置文件的示例类似于此:

<?xml version ="1.0"?>
    </configuration>
            </appSettings>     
               <add key="password" value="Jdas7#8SL" />    
            </appSettings>       
    </configuration>

关于将这些信息引入您的程序,在此提供一个链接,这应该是一个不错的例子。

C#使用配置设置

如果您担心安全问题,不希望密码被写在任何地方,那么您需要使其每次由您个人输入。或者您可以使用我评论中提到的某些公式来转换密码。但正如评论中所述,您仍然会陷入困境。

祝好运。


0

0

将特定于环境的配置(特别是敏感配置,如凭据)外部化到配置文件中。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接