簡體   English   中英

c#在單獨的類中使用靜態方法發送電子郵件

[英]c# emailing using static method in separate class

我有一個小程序,檢查幾個文件夾中的舊文件,如果找到它們,它會發送一封電子郵件給我。 一切正常,但我的電子郵件用戶名和密碼硬編碼如下:

SmtpServer.Credentials = new System.Net.NetworkCredential(
    "uname@domain.com", "password");

一位朋友看了它並提到他會使用一個單獨的類來使用靜態方法重用電子郵件代碼,但我不確定這是否有用(或如何實現)。 我將開始使用Git / GitHub進行更改跟蹤,我不希望將我的電子郵件硬編碼到公共存儲庫中。

我知道smtp密碼需要在純文本的某個地方才能工作,但是我可以在我的代碼之外隱藏它並用“使用”或其他選項調用它,這樣密碼就不會存儲在代碼中嗎?

使用Visual Studio Express 2012編寫的程序

編輯1:應該說這只是一個控制台應用程序.exe文件,由Windows計划任務調用,以便在遠程服務器上進行一些文件夾監視。 所以它在我的電腦上編譯,但是exe文件被保存並計划遠程運行。

對於諸如憑證(用戶名和密碼)之類的東西,通常最好將它們視為環境配置細節。 也就是說,對於在任何給定環境中運行的應用程序的任何給定實例,它需要一些可配置的值來與郵件服務器交互:

  • 主機名
  • 用戶名
  • 密碼

環境配置通常位於App.configWeb.config文件中。 最簡單的,你可能在配置文件中有這樣的東西:

<appSettings>
  <add key="SMTPUsername" value="uname@domain.com" />
  <add key="SMTPPassword" value="password" />
</appSettings>

然后從代碼中的配置中拉出它們,你會做這樣的事情:

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

您可以在自定義配置類后面抽象這些設置,在配置中為空值時具有代碼內默認值,對配置值執行各種錯誤檢查等。但最終您從配置文件中提取值。

然后,配置文件可以與公開可見的源代碼分開。 您需要包含在源代碼中的配置文件,其中包含示例配置數據,因此使用該項目的人現在可以如何配置它。 但是,您可以根據自己的需要保留未簽入的本地配置,並將自定義配置文件部署到運行此應用程序的任何生產服務器。 (這就是配置文件的用途,存儲同一應用程序實例之間不同的值。)

是否創建static輔助方法來處理這個問題與隱藏這些值並不相關。 你當然可以創造這樣一種方法。 如果你更喜歡你實例化的郵件程序對象,它不需要是靜態的。 (也許是實現IDisposable並使用它來內部處理SMTP對象資源的東西?真的可以根據需要獲得創意。)但是這種抽象本身並不會隱藏你的值,它只是將它們從源代碼中的一個類移到另一個。 您想要完全從源代碼中刪除它們。

將其移動到另一個DLL將無助於隱藏此信息,為此,一個非常簡單(但基本)的方法來保護它是首先將此信息移動到您的應用程序配置的用戶信息

<appSettings>
  <add key="user" value="user@mydomain.com" />
  <add key="pwd" value="some password" />
</appSettings>

接下來你需要加密那個部分,如果它是一個web應用程序,你可以運行下面的它,它將為你做的工作

aspnet_regiis -pe "WebConfigSectionName" -app "/WebAppName"

如果您的應用程序不是Web應用程序,那么您仍然可以對其進行加密,但是您需要編寫自己的加密例程,請參閱此MSDN文章

最后在你的代碼中,你應該能夠從配置中讀取數據,請注意,自從我上次這樣做以來已經有一段時間了,所以試驗了一下,但我認為你不需要任何特別的東西來閱讀它

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

警告:如果我沒記錯的話,運行加密的用戶上下文和您的應用必須相同或有權訪問相同的密鑰,這意味着,如果您運行應用程序(或aspnet_regiis)來加密應用程序配置部分為“ MySecurityUser“,那么當需要讀取加密部分時運行應用程序的帳戶必須是”MySecurityUser“,它不能是”DaveUserId“(你將無法解密它)

我可以隱藏在我的代碼之外,並使用'使用'或其他選項調用它,以便密碼不存儲在代碼中?

當然,將信息存儲在某個配置文件中。 以編程方式讀入文件。 這里的問題當然是在許多情況下,單獨的配置文件比編譯代碼暴露。

您可以加密信息,然后只將加密版本存儲在配置文件中,但是您的配置文件或程序中的其他位置,您需要存儲私鑰以解密密碼。 你現在基本上提出了這個問題,因為你現在需要知道在哪里安全存儲私鑰。 這使得這個問題實際上無法解決。 您可以通過深入掩埋來獲取更難找到的信息,或者要求某人跳過很多箍來獲取信息,但是如果有一些方法可以讓程序獲得一些敏感信息,並且您擁有智能信息,堅定的,有權訪問該程序的惡意人員,然后他們最終將能夠獲得它。

我確定有很多解決方案,但您可以做的一件事是將您的電子郵件憑據存儲在您的app.config中,並按如下方式訪問它們:

string email = ConfigurationManager.AppSettings["Email"];
string password = ConfigurationManager.AppSettings["Password"];

您是否嘗試將值添加到應用程序設置中?

您可以從“項目”菜單訪問設置,查找“屬性...”。 這將打開屬性頁面,在左側您將看到“設置”。 填寫您的設置名稱(例如“密碼”)並輸入(可能是字符串)。 該值將保留在項目中名為“app.config”的xml文件中。 編譯完成后,您將看到該文件為“.exe.config”。 您可以在部署后修改該配置文件。

在代碼中按名稱訪問該值:

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

這樣,您可以修改設置,而無需將機密信息提交到某個存儲庫。

是否要求他們輸入自己的電子郵件信息?

一種選擇是將其放入注冊表中:

http://www.codeproject.com/Articles/3389/Read-write-and-delete-from-registry-with-C

另一個選擇是使用web.debug.config並且不包含在存儲庫中:

如何在內置的visual studio調試器服務器中使用Web.debug.config?

如果您將在同一台PC上運行您的應用程序,則可以使用ProtectedData。

因此,首先加密您的用戶名和密碼(即在調試模式下,保存它然后在.cs文件中使用加密字符串)。

SmtpServer.Credentials = new System.Net.NetworkCredential(ProtectedData.Unprotect([encrypted]),ProtectedData.Unprotect([here encrypted data]));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM