利用C#和SQL Server實(shí)現(xiàn)自動化解決郵件數(shù)據(jù)的處理
引言
在金融應(yīng)用領(lǐng)域,通過電子郵件手動管理用戶分配數(shù)據(jù)不僅耗時(shí)而且容易出錯(cuò)。傳統(tǒng)的人工處理方式需要工作人員每天檢查郵件、下載附件、解析數(shù)據(jù)并更新數(shù)據(jù)庫,這一系列重復(fù)性工作既低效又存在數(shù)據(jù)錄入錯(cuò)誤的風(fēng)險(xiǎn)。本文將介紹如何利用 C# 和 SQL Server 構(gòu)建一個(gè)自動化解決方案,實(shí)現(xiàn)從郵件讀取、附件下載到數(shù)據(jù)庫更新的全流程自動化處理。該系統(tǒng)特別適用于處理主題包含"AllotmentsFiles"的郵件,并更新 SQL Server 中的 bidfiledetails 表,顯著提高數(shù)據(jù)處理效率和準(zhǔn)確性。
1. 系統(tǒng)概述與優(yōu)勢
1.1 處理流程
該自動化系統(tǒng)主要包含三個(gè)核心處理步驟:
- 連接郵件服務(wù)器:使用 POP3 協(xié)議連接到郵件服務(wù)器,支持 Gmail 等常見郵件服務(wù)提供商。
- 篩選目標(biāo)郵件:自動篩選出當(dāng)天收到的、主題包含"AllotmentsFiles"的郵件。
- 處理附件并更新數(shù)據(jù)庫:下載郵件中的 CSV 附件,解析內(nèi)容并更新 SQL Server 數(shù)據(jù)庫中的分配數(shù)據(jù)。
1.2 系統(tǒng)優(yōu)勢
- 自動化重復(fù)工作:取代人工檢查郵件和處理附件的過程
- 減少人為錯(cuò)誤:自動化的數(shù)據(jù)處理流程避免了手工錄入可能導(dǎo)致的錯(cuò)誤
- 全天候運(yùn)行:系統(tǒng)可配置為每日自動運(yùn)行,無需人工干預(yù)
- 高效數(shù)據(jù)處理:批量處理大量分配數(shù)據(jù),顯著提高工作效率
2. 開發(fā)環(huán)境與工具配置
2.1 所需工具
- 開發(fā)工具:Visual Studio(C#)
- 數(shù)據(jù)庫:SQL Server
- NuGet 包:
- OpenPop.NET:用于通過 POP3 協(xié)議讀取郵件
- System.Data.SqlClient:用于數(shù)據(jù)庫連接和操作
2.2 配置設(shè)置
系統(tǒng)配置存儲在 web.config 文件中,包含郵件服務(wù)器連接信息:
<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>
此配置允許靈活更改郵件服務(wù)器設(shè)置而無需修改代碼。
3. 郵件處理核心代碼實(shí)現(xiàn)
讀取郵件功能
以下 C# 代碼實(shí)現(xiàn)了從郵件服務(wù)器讀取并處理目標(biāo)郵件的功能:
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);
}
}
這段代碼實(shí)現(xiàn)了以下功能:
- 從配置讀取郵件服務(wù)器連接信息
- 使用 POP3 連接到郵件服務(wù)器
- 篩選當(dāng)天且主題包含"AllotmentsFiles"的郵件
- 下載符合條件的 CSV 附件并保存到按日期組織的文件夾中
- 調(diào)用數(shù)據(jù)處理方法處理下載的附件
4. CSV數(shù)據(jù)處理與數(shù)據(jù)庫更新
數(shù)據(jù)處理流程
下載的 CSV 文件需要被解析并更新到數(shù)據(jù)庫中,以下是實(shí)現(xiàn)代碼:
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);
}
}
此代碼實(shí)現(xiàn)了:
- 從CSV文件名提取腳本名稱
- 逐行讀取CSV文件內(nèi)容
- 驗(yàn)證數(shù)據(jù)完整性(確保有足夠列數(shù))
- 檢查數(shù)據(jù)庫中的記錄狀態(tài)
- 更新符合條件的記錄或記錄未匹配的情況
- 全面的錯(cuò)誤處理和日志記錄
5. 關(guān)鍵技術(shù)與實(shí)現(xiàn)要點(diǎn)
5.1 核心技術(shù)組件
- 郵件處理:使用 OpenPop.NET 庫通過 POP3 協(xié)議讀取郵件
- 文件處理:系統(tǒng)自動按日期組織下載的附件文件
- 數(shù)據(jù)驗(yàn)證:嚴(yán)格檢查CSV文件結(jié)構(gòu)和數(shù)據(jù)完整性
- 數(shù)據(jù)庫操作:使用參數(shù)化查詢確保SQL注入防護(hù)
- 錯(cuò)誤處理:全面的異常捕獲和日志記錄機(jī)制
5.2 系統(tǒng)部署方式
- 任務(wù)計(jì)劃程序:配置為每日自動運(yùn)行的Windows計(jì)劃任務(wù)
- Windows服務(wù):可轉(zhuǎn)換為服務(wù)實(shí)現(xiàn)24/7運(yùn)行
- 日志監(jiān)控:通過日志文件監(jiān)控系統(tǒng)運(yùn)行狀態(tài)
6. 系統(tǒng)擴(kuò)展與優(yōu)化方向
6.1 功能增強(qiáng)建議
- 轉(zhuǎn)換為Windows服務(wù):實(shí)現(xiàn)完全自動化的后臺處理
- 郵件通知功能:在處理完成或出現(xiàn)錯(cuò)誤時(shí)發(fā)送通知郵件
- 日志數(shù)據(jù)庫存儲:將日志存入SQL表便于歷史查詢和分析
- 重試機(jī)制:為失敗的郵件下載實(shí)現(xiàn)自動重試邏輯
6.2 性能優(yōu)化建議
- 實(shí)現(xiàn)批量更新操作減少數(shù)據(jù)庫往返
- 添加并發(fā)處理能力提高大量郵件的處理速度
- 優(yōu)化內(nèi)存使用處理超大附件文件
結(jié)論
本文詳細(xì)介紹了一個(gè)基于C#和SQL Server的自動化郵件處理系統(tǒng),能夠高效地從郵件中提取分配數(shù)據(jù)并更新數(shù)據(jù)庫。該系統(tǒng)通過自動化取代了繁瑣的手工操作,顯著提高了金融應(yīng)用中分配數(shù)據(jù)處理的效率和準(zhǔn)確性。核心功能包括郵件服務(wù)器連接、目標(biāo)郵件篩選、CSV附件下載與解析以及數(shù)據(jù)庫更新等完整流程。系統(tǒng)采用模塊化設(shè)計(jì),具有良好的可擴(kuò)展性,可通過轉(zhuǎn)換為Windows服務(wù)、添加通知功能等方式進(jìn)一步增強(qiáng)。該解決方案不僅適用于金融領(lǐng)域的分配數(shù)據(jù)處理,其設(shè)計(jì)思路和實(shí)現(xiàn)方法也可應(yīng)用于其他需要從郵件自動提取數(shù)據(jù)并更新數(shù)據(jù)庫的類似場景。
以上就是利用C#和SQL Server實(shí)現(xiàn)自動化解決郵件數(shù)據(jù)的處理的詳細(xì)內(nèi)容,更多關(guān)于C# SQL Server數(shù)據(jù)自動化處理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#利用Spire.XLS for .NET將Excel轉(zhuǎn)換為文本(TXT)的代碼步驟
在數(shù)據(jù)處理場景中,使用C#將Excel轉(zhuǎn)換為文本(TXT) 是常見需求,開發(fā)者往往遇到手動轉(zhuǎn)換效率低下、多Sheet數(shù)據(jù)難以整合、格式丟失等問題,本文基于Spire.XLS for .NET,分享完整代碼和步驟,解決Excel轉(zhuǎn)文本的痛點(diǎn),需要的朋友可以參考下2026-03-03
C#中Winform獲取文件路徑的方法實(shí)例小結(jié)
這篇文章主要介紹了C#中Winform獲取文件路徑的方法,以實(shí)例形式較為詳細(xì)的總結(jié)了WinForm關(guān)于路徑操作的常用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
C#代碼實(shí)現(xiàn)添加或讀取Excel公式的完整指南
在日常的辦公數(shù)據(jù)處理任務(wù)中,Excel 公式和函數(shù)是自動化計(jì)算和數(shù)據(jù)分析的基石,本文將借助 Free Spire.XLS for .NET 這款輕量級且免費(fèi)的組件,詳細(xì)演示如何使用 C# 實(shí)現(xiàn) Excel 公式的添加與讀取操作,感興趣的小伙伴可以了解下2026-05-05

