Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在单独的类中使用静态方法发送电子邮件_C#_Git - Fatal编程技术网

C# 在单独的类中使用静态方法发送电子邮件

C# 在单独的类中使用静态方法发送电子邮件,c#,git,C#,Git,我有一个小程序,可以检查一些文件夹中的旧文件,如果找到了,它会给我发一封电子邮件。一切正常,但我的电子邮件用户名和密码已硬编码为: SmtpServer.Credentials = new System.Net.NetworkCredential( "uname@domain.com", "password"); 一位朋友查看了它,并提到他将使用一个单独的类来使用静态方法重用电子邮件代码,但我不确定这是否有帮助(或者如何实现)。我将开始使用Git/GitHub进行更改跟踪,我不想让我的

我有一个小程序,可以检查一些文件夹中的旧文件,如果找到了,它会给我发一封电子邮件。一切正常,但我的电子邮件用户名和密码已硬编码为:

SmtpServer.Credentials = new System.Net.NetworkCredential(
    "uname@domain.com", "password");
一位朋友查看了它,并提到他将使用一个单独的类来使用静态方法重用电子邮件代码,但我不确定这是否有帮助(或者如何实现)。我将开始使用Git/GitHub进行更改跟踪,我不想让我的电子邮件硬编码到公共存储库中

我知道smtp密码必须是纯文本才能工作,但是我可以将其隐藏在代码之外,并使用“using”或其他选项调用它,这样密码就不会存储在代码中了吗

使用Visual Studio Express 2012编写的程序

编辑1:应该说这只是一个控制台应用程序.exe文件,由Windows计划任务调用,用于在远程服务器上执行某些文件夹监视。所以它是在我的电脑上编译的,但是exe文件被保存并计划远程运行

我是否可以将其隐藏在代码之外,并使用“使用”或其他选项调用它,这样密码就不会存储在代码中

当然,将信息存储在某个配置文件中。以编程方式读入文件。当然,这里的问题是,在许多情况下,单独的配置文件比编译代码中的配置文件更容易公开


您可以对信息进行加密,然后只将加密版本存储在配置文件中,但无论是配置文件还是程序中的其他地方,都需要存储私钥来解密密码。您现在基本上已经提出了这个问题,因为您现在需要知道在哪里安全地存储私钥。这使得这个问题实际上无法解决。你可以通过将某些信息深埋起来,或者要求某人跳过许多障碍才能找到它,从而使某些信息更难找到,但是如果程序有某种方法获取某些敏感信息,并且你有一个聪明、坚定、恶意的人可以访问该程序,然后,他们最终将能够访问它。

我确信有很多解决方案,但您可以做的一件事是将您的电子邮件凭据存储在app.config中,并按如下方式访问它们:

string email = ConfigurationManager.AppSettings["Email"];
string password = ConfigurationManager.AppSettings["Password"];
SmtpServer.Credentials = new System.Net.NetworkCredential(
    System.Configuration.ConfigurationManager.AppSettings["SMTPUsername"],
    System.Configuration.ConfigurationManager.AppSettings["SMTPPassword"]);

对于凭证(用户名和密码)之类的内容,通常最好将其视为环境配置详细信息。也就是说,对于在任何给定环境中运行的应用程序的任何给定实例,它需要一些可配置的值来与邮件服务器交互:

  • 主机名
  • 用户名
  • 密码
环境配置通常位于
App.config
Web.config
文件中。在最简单的情况下,配置文件中可能有如下内容:

<appSettings>
  <add key="SMTPUsername" value="uname@domain.com" />
  <add key="SMTPPassword" value="password" />
</appSettings>
您可以在自定义配置类后面抽象这些设置,在配置中出现空值时使用代码内默认值,对配置值执行各种错误检查,等等。但最终您将从配置文件中提取这些值

然后,可以将配置文件与公开可见的源代码分开保存。您希望在源代码中包含一个配置文件,其中包含示例配置数据,以便使用该项目的人员现在可以了解如何配置它。但您可以根据自己的需要保留未签入的本地配置,并将自定义配置文件部署到运行此应用程序的任何生产服务器。(这就是配置文件的真正用途,存储同一应用程序实例之间不同的值。)


是否创建一个
static
helper方法来处理这个问题与隐藏这些值并不相关。您当然可以创建这样的方法。如果您希望实例化一个mailer对象,那么它不需要是静态的。(可能是实现了
IDisposable
并使用它在内部处理SMTP对象资源的东西?真的,要想有创意就有创意。)但这种抽象本身并不能隐藏您的值,它只是将它们从源代码中的一个类移到另一个类。您想从源代码中完全删除它们。

您是否尝试过将这些值添加到应用程序设置中

您可以从项目菜单访问设置,查找“属性…”。这将打开属性页,在左侧您将看到“设置”。填写设置名称(例如“密码”)并键入(可能是字符串)。该值将保存在项目中名为“app.config”的xml文件中。编译后,您将看到该文件的名称为“.exe.config”。您可以在部署后修改该配置文件

在代码中按名称访问该值:

SmtpServer.Credentials = new System.Net.NetworkCredential(
    "uname@domain.com", Properties.Settings.Default.Password);

通过这种方式,您可以修改设置,而无需将机密信息提交到某个存储库。

将其移动到另一个DLL中无助于隐藏此信息,为此,一种非常简单(但基本)的保护方法是首先将此信息移动到您的应用程序配置中

<appSettings>
  <add key="user" value="user@mydomain.com" />
  <add key="pwd" value="some password" />
</appSettings>
如果您的应用程序不是web应用程序,那么您仍然可以对其进行加密,但您需要编写自己的加密例程,请参见此

最后,在您的代码中,您应该能够从配置中读取数据,请注意,自从我上次这样做已经有一段时间了,所以进行一些实验,但我认为您不需要任何特殊的东西来读取它

string user = ConfigurationManager.AppSettings["user"];
string pwd = ConfigurationManager.AppSettings["pwd"];

警告:如果我没记错的话,运行加密和应用程序的用户上下文必须相同,或者可以访问相同的密钥,这意味着,如果运行应用程序(或aspnet_regis)将应用程序配置部分加密为“MySecurityUser”,然后,当需要读取加密部分时,运行应用程序的帐户必须是“MySecurityUser”,而不能是“DaveUserId”(您将无法解密)

要求他们输入自己的电子邮件信息
string user = ConfigurationManager.AppSettings["user"];
string pwd = ConfigurationManager.AppSettings["pwd"];