利用C#和SQL Server實現自動化解決郵件數據的處理
引言
在金融應用領域,通過電子郵件手動管理用戶分配數據不僅耗時而且容易出錯。傳統(tǒng)的人工處理方式需要工作人員每天檢查郵件、下載附件、解析數據并更新數據庫,這一系列重復性工作既低效又存在數據錄入錯誤的風險。本文將介紹如何利用 C# 和 SQL Server 構建一個自動化解決方案,實現從郵件讀取、附件下載到數據庫更新的全流程自動化處理。該系統(tǒng)特別適用于處理主題包含"AllotmentsFiles"的郵件,并更新 SQL Server 中的 bidfiledetails 表,顯著提高數據處理效率和準確性。
1. 系統(tǒng)概述與優(yōu)勢
1.1 處理流程
該自動化系統(tǒng)主要包含三個核心處理步驟:
- 連接郵件服務器:使用 POP3 協(xié)議連接到郵件服務器,支持 Gmail 等常見郵件服務提供商。
- 篩選目標郵件:自動篩選出當天收到的、主題包含"AllotmentsFiles"的郵件。
- 處理附件并更新數據庫:下載郵件中的 CSV 附件,解析內容并更新 SQL Server 數據庫中的分配數據。
1.2 系統(tǒng)優(yōu)勢
- 自動化重復工作:取代人工檢查郵件和處理附件的過程
- 減少人為錯誤:自動化的數據處理流程避免了手工錄入可能導致的錯誤
- 全天候運行:系統(tǒng)可配置為每日自動運行,無需人工干預
- 高效數據處理:批量處理大量分配數據,顯著提高工作效率
2. 開發(fā)環(huán)境與工具配置
2.1 所需工具
- 開發(fā)工具:Visual Studio(C#)
- 數據庫:SQL Server
- NuGet 包:
- OpenPop.NET:用于通過 POP3 協(xié)議讀取郵件
- System.Data.SqlClient:用于數據庫連接和操作
2.2 配置設置
系統(tǒng)配置存儲在 web.config 文件中,包含郵件服務器連接信息:
<appSettings> <add key="HostServer" value="pop.gmail.com" /> <add key="MailPort" value="995" /> <add key="MailUser" value="your-email@gmail.com" /> <add key="MailPwd" value="your-password" /> </appSettings>
此配置允許靈活更改郵件服務器設置而無需修改代碼。
3. 郵件處理核心代碼實現
讀取郵件功能
以下 C# 代碼實現了從郵件服務器讀取并處理目標郵件的功能:
public void ReadTheDataFromTheMail()
{
try
{
string mailHost = ConfigurationManager.AppSettings["HostServer"];
int mailPort = Convert.ToInt32(ConfigurationManager.AppSettings["MailPort"]);
string mailID = ConfigurationManager.AppSettings["MailUser"];
string mailPwd = ConfigurationManager.AppSettings["MailPwd"];
using (Pop3Client client = new Pop3Client())
{
client.Connect(mailHost, mailPort, true);
client.Authenticate(mailID, mailPwd);
int messageCount = client.GetMessageCount();
DateTime today = DateTime.UtcNow.Date;
for (int i = messageCount; i > 0; i--)
{
MessageHeader headers = client.GetMessageHeaders(i);
string subject = headers.Subject;
DateTime emailDate = headers.DateSent;
if (!string.IsNullOrEmpty(subject) && subject.Contains("AllotmentsFiles") && emailDate.Date == today)
{
OpenPop.Mime.Message message = client.GetMessage(i);
foreach (var attachment in message.FindAllAttachments())
{
if (attachment.FileName.Contains("AllotmentsFiles_") && attachment.FileName.EndsWith(".csv"))
{
string baseDirectory = @"E:\Allotment - Applns\Allotmentfiles";
string dateFolder = DateTime.Now.ToString("yyyy-MM-dd");
string fileFolder = Path.Combine(baseDirectory, dateFolder);
if (!Directory.Exists(fileFolder))
Directory.CreateDirectory(fileFolder);
string filePath = Path.Combine(fileFolder, attachment.FileName);
File.WriteAllBytes(filePath, attachment.Body);
errorlog($"CSV file '{attachment.FileName}'", "Downloaded successfully!");
ProcessAllotmentData(filePath);
}
}
}
}
}
}
catch (Exception ex)
{
errorlog("Error reading emails", ex.Message);
}
}
這段代碼實現了以下功能:
- 從配置讀取郵件服務器連接信息
- 使用 POP3 連接到郵件服務器
- 篩選當天且主題包含"AllotmentsFiles"的郵件
- 下載符合條件的 CSV 附件并保存到按日期組織的文件夾中
- 調用數據處理方法處理下載的附件
4. CSV數據處理與數據庫更新
數據處理流程
下載的 CSV 文件需要被解析并更新到數據庫中,以下是實現代碼:
public void ProcessAllotmentData(string filePath)
{
try
{
string fileName = Path.GetFileName(filePath);
string[] parts = fileName.Split('_');
string scriptName = parts.Length > 0 ? parts[0] : null;
using (StreamReader sr = new StreamReader(filePath))
{
string[] rows = sr.ReadToEnd().Split('\n');
for (int i = 1; i < rows.Length; i++)
{
string[] rowValues = rows[i].Split(',');
if (rowValues.Length > 7)
{
string appNo = rowValues[2].Trim();
string pan = rowValues[4].Trim();
string qty = rowValues[5].Trim();
string clientName = rowValues[6].Trim();
string reason = rowValues[7].Trim();
SqlParameter[] param = {
new SqlParameter("@symbol", scriptName),
new SqlParameter("@appno", appNo),
new SqlParameter("@pan", pan),
new SqlParameter("@qty", qty),
new SqlParameter("@reason", reason)
};
string statusQuery = @"SELECT * FROM bidfiledetails (NOLOCK)
WHERE AppNo=@appno AND Symbol=@symbol AND PanNo=@pan AND AllotmentFlag != 'Y'";
DataSet ds = SqlHelper.ExecuteDataset(SqlCon, CommandType.Text, statusQuery, param);
if (ds.Tables[0].Rows.Count > 0)
{
string updateQuery = @"UPDATE bidfiledetails
SET AllotmentFlag='Y', SharesAlloted=@qty, Sharesrej_reason=@reason
WHERE AppNo=@appno AND PanNo=@pan AND Symbol=@symbol";
SqlHelper.ExecuteNonQuery(SqlCon, CommandType.Text, updateQuery, param);
errorlog("Updated Record", $"PanNo: {pan}, ApplicationNo: {appNo}, Symbol: {scriptName}");
}
else
{
string header = "ApplicationNo|ClientName|Quantity|Reason|PanNo";
string message = $"{appNo}|{clientName}|{qty}|{reason}|{pan}{Environment.NewLine}";
errorlog(header, message);
}
}
else
{
errorlog("Row does not have enough columns", "");
}
}
}
}
catch (Exception ex)
{
ExceptionLogging.Exceptionlog("Exception in ProcessAllotmentData", ex.Message);
}
}
此代碼實現了:
- 從CSV文件名提取腳本名稱
- 逐行讀取CSV文件內容
- 驗證數據完整性(確保有足夠列數)
- 檢查數據庫中的記錄狀態(tài)
- 更新符合條件的記錄或記錄未匹配的情況
- 全面的錯誤處理和日志記錄
5. 關鍵技術與實現要點
5.1 核心技術組件
- 郵件處理:使用 OpenPop.NET 庫通過 POP3 協(xié)議讀取郵件
- 文件處理:系統(tǒng)自動按日期組織下載的附件文件
- 數據驗證:嚴格檢查CSV文件結構和數據完整性
- 數據庫操作:使用參數化查詢確保SQL注入防護
- 錯誤處理:全面的異常捕獲和日志記錄機制
5.2 系統(tǒng)部署方式
- 任務計劃程序:配置為每日自動運行的Windows計劃任務
- Windows服務:可轉換為服務實現24/7運行
- 日志監(jiān)控:通過日志文件監(jiān)控系統(tǒng)運行狀態(tài)
6. 系統(tǒng)擴展與優(yōu)化方向
6.1 功能增強建議
- 轉換為Windows服務:實現完全自動化的后臺處理
- 郵件通知功能:在處理完成或出現錯誤時發(fā)送通知郵件
- 日志數據庫存儲:將日志存入SQL表便于歷史查詢和分析
- 重試機制:為失敗的郵件下載實現自動重試邏輯
6.2 性能優(yōu)化建議
- 實現批量更新操作減少數據庫往返
- 添加并發(fā)處理能力提高大量郵件的處理速度
- 優(yōu)化內存使用處理超大附件文件
結論
本文詳細介紹了一個基于C#和SQL Server的自動化郵件處理系統(tǒng),能夠高效地從郵件中提取分配數據并更新數據庫。該系統(tǒng)通過自動化取代了繁瑣的手工操作,顯著提高了金融應用中分配數據處理的效率和準確性。核心功能包括郵件服務器連接、目標郵件篩選、CSV附件下載與解析以及數據庫更新等完整流程。系統(tǒng)采用模塊化設計,具有良好的可擴展性,可通過轉換為Windows服務、添加通知功能等方式進一步增強。該解決方案不僅適用于金融領域的分配數據處理,其設計思路和實現方法也可應用于其他需要從郵件自動提取數據并更新數據庫的類似場景。
以上就是利用C#和SQL Server實現自動化解決郵件數據的處理的詳細內容,更多關于C# SQL Server數據自動化處理的資料請關注腳本之家其它相關文章!
相關文章
C#利用Spire.XLS for .NET將Excel轉換為文本(TXT)的代碼步驟
在數據處理場景中,使用C#將Excel轉換為文本(TXT) 是常見需求,開發(fā)者往往遇到手動轉換效率低下、多Sheet數據難以整合、格式丟失等問題,本文基于Spire.XLS for .NET,分享完整代碼和步驟,解決Excel轉文本的痛點,需要的朋友可以參考下2026-03-03

