[請益] 程式寄信方面的問題
最近遇到一個問題,所以上來問問看有沒有人能解惑
我們的程式有時候會進行大量發信的動作
程式語言是C#,用微軟的Exchange.WebServices元件來做發信
發信伺服器是他們公司自己架的
我們寄信為了不影響使用者操作,所以寄信都是new一個Thread來做Send Mail的動作
問題來了
有寫Log紀錄信件對象和信件內容,所以可以確認發出SendMail要求的時候傳送的資料是
正確的(信件內容、對象、認證資料等)
當信件發送量過大的時候他們信件伺服器寄出的信件的內容和對象偶爾會錯亂的情況,像
是寄給A的信件內容卻是前一封發給B的信件內容
解決方式就是改成每5秒才做一次寄信動作(之前測2、3秒還是偶爾會有問題)
第一次遇到這種情況,雖然已經解決了,但是很好奇到底是他們家伺服器問題還是什麼原
因呢?
是否有人可以解惑一下
--
我覺得驅逐艦是艦隊裡最萌的艦種了 潛航戰正輕航重重輕驅 ◥▁▁▁▁ ◢ 真
其他的都應該重造 水空艦規空空巡雷巡逐 ◤ ██ /- 。
艦戰 空母巡洋裝洋艦 □–□◢◤ 紳
如果各位有興趣的話可以一起成為驅逐艦 艦 母 洋艦巡艦 ▼ㄑ ◢ 士
但是要經過蘿ㄏㄨ...改造 艦 洋 ▼ㄧ /◣ 提
因為我們只會接受蘿莉 絕對不會接受外觀超過14歲的BBA 艦 ◢ /◣– ◤ /█◣督
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.130.11.211
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1460103819.A.B02.html
※ 編輯: a47135 (220.130.11.211), 04/08/2016 16:24:11
推
04/08 16:28, , 1F
04/08 16:28, 1F
※ 編輯: a47135 (220.130.11.211), 04/08/2016 16:29:03
※ 編輯: a47135 (220.130.11.211), 04/08/2016 16:29:24
→
04/08 16:57, , 2F
04/08 16:57, 2F
應該是沒有共用的部分,每封信件都是new一個Email Obj再下去做Send
public void Send()
{
ThreadStart myRun = send_Thread;
Thread myThread = new Thread(myRun);
myThread.Start();
}
※ 編輯: a47135 (220.130.11.211), 04/08/2016 17:04:40
推
04/08 17:06, , 3F
04/08 17:06, 3F
→
04/08 17:07, , 4F
04/08 17:07, 4F
→
04/08 17:09, , 5F
04/08 17:09, 5F
你的意思是你覺得說明得很爛所以表示程式有問題嗎
------程式部分
基本上就是每一封信件都是一個物件
Email mail=new Email(略)
屬性給齊之後就是mail.Send();
Eamil物件不太重要的屬性就不貼了,貼比較主要的物件內容
private static SmtpClient smtp;
private MailMessage message_SMTP;
/// <summary>
/// 建構mail
/// </summary>
public Email(string strTo, List<string> strCC, string strSubject,string strBody
{
//strFrom一律由EmailSetting讀取
From = EmailSetting.Email_FromAddress;
_To = strTo;
_CC = strCC;
_Subject = strSubject;
_Body = strBody;
}
/// <summary>
/// 發信
/// </summary>
public void Send()
{
ThreadStart myRun = send_Thread;
Thread myThread = new Thread(myRun);
myThread.Start();
}
/// <summary>
/// 背景上傳寄信
/// </summary>
private void send_Thread()
{
if (string.IsNullOrEmpty(_EMAIL_Protocol))
{
_EMAIL_Protocol = FlowConfig.EmailSetting.EMAIL_Protocol;
//讀取預設的發信方式
}
try
{
//這邊是判斷寄件人收件人CC等資料有無齊全,為了不浪費各位時間就去掉了
if (flg)
{
Init_SMTPClient();
InitSMTP_MailMassage();
smtp.Send(message_SMTP);
}
}
catch (SmtpException e)
{
//將錯誤訊息存至Windows事件日誌
string error = e.Message;
ConfigApp.SystemLOG(error);
}
}
//-----------SMTP 發信模組--------------------START--------
/// <summary>
/// 初始化SMTP客戶端
/// </summary>
private void Init_SMTPClient()
{
smtp = new SmtpClient();
smtp.Host = EmailSetting.SMTP_Server;
smtp.Port = 25;
//smtp.EnableSsl = true; //是否使用SSL加密
}
/// <summary>
/// 初始化SMTP信件內容
/// </summary>
private void InitSMTP_MailMassage()
{
//初始化 Mail
message_SMTP = new MailMessage();
message_SMTP.SubjectEncoding = Encoding.UTF8;
message_SMTP.BodyEncoding = Encoding.UTF8;
message_SMTP.IsBodyHtml = true; //內容使用html方式
//以下為發信的地址與顯示名稱設定
message_SMTP.From =
new MailAddress(EmailSetting.Email_FromAddress, EmailSetting.Email_FromName);
message_SMTP.To.Add(new MailAddress(_To));
if (_CC != null)
{
foreach (string s in _CC)
{
if (s != null && s.Length > 0)
{
if (_CCMode)
{
message_SMTP.Bcc.Add(new MailAddress(s));
}
else
{
message_SMTP.CC.Add(new MailAddress(s));
}
}
}
}
message_SMTP.Subject = _Subject;
message_SMTP.Body = _Body;
}
//-----------SMTP 發信模組--------------------END--------
※ 編輯: a47135 (220.130.11.211), 04/08/2016 17:38:31
推
04/08 17:39, , 6F
04/08 17:39, 6F
一開始看到你推文的時候有考慮過是不是這裡,因為看起來也就這個有可能共用到
※ 編輯: a47135 (220.130.11.211), 04/08/2016 17:49:08
推
04/08 17:42, , 7F
04/08 17:42, 7F
推
04/08 17:44, , 8F
04/08 17:44, 8F
→
04/08 17:45, , 9F
04/08 17:45, 9F
→
04/08 17:46, , 10F
04/08 17:46, 10F
→
04/08 17:46, , 11F
04/08 17:46, 11F
推
04/08 17:49, , 12F
04/08 17:49, 12F
→
04/08 17:50, , 13F
04/08 17:50, 13F
推
04/08 17:53, , 14F
04/08 17:53, 14F
→
04/08 17:53, , 15F
04/08 17:53, 15F
剛剛去MSDN查了一下
上面有寫
這個類型的任何公用靜態 (在 Visual Basic 中為 Shared) 成員都是安全執行緒
所以這樣說應該不是SmtpClient用static的問題?
※ 編輯: a47135 (220.130.11.211), 04/08/2016 17:57:16
※ 編輯: a47135 (220.130.11.211), 04/08/2016 18:00:57
推
04/08 18:02, , 16F
04/08 18:02, 16F
→
04/08 18:08, , 17F
04/08 18:08, 17F
推
04/08 18:08, , 18F
04/08 18:08, 18F
→
04/08 18:16, , 19F
04/08 18:16, 19F
→
04/08 18:18, , 20F
04/08 18:18, 20F
→
04/08 18:18, , 21F
04/08 18:18, 21F
→
04/08 18:19, , 22F
04/08 18:19, 22F
→
04/08 18:22, , 23F
04/08 18:22, 23F
→
04/08 18:33, , 24F
04/08 18:33, 24F
→
04/08 18:33, , 25F
04/08 18:33, 25F
→
04/08 18:35, , 26F
04/08 18:35, 26F
→
04/08 18:35, , 27F
04/08 18:35, 27F
message_SMTP沒有用static,不管本身是物件屬性還是呼叫了才產生應該都沒有關係吧?
如果單純是說寫法的話.....我只能說我也是接坑的XD
→
04/08 18:36, , 28F
04/08 18:36, 28F
→
04/08 18:36, , 29F
04/08 18:36, 29F
我看的是中文MSDN,我中英兩邊都確認一下好了
※ 編輯: a47135 (114.32.94.97), 04/08/2016 18:45:20
※ 編輯: a47135 (114.32.94.97), 04/08/2016 18:46:11
→
04/08 18:48, , 30F
04/08 18:48, 30F
→
04/08 18:48, , 31F
04/08 18:48, 31F
我那兩句是回應qrtt1的啦XD,要回你的部分我還在看中英文MSDN看是不是我理解錯誤
貼一下中英文部分
執行緒安全
這個型別的任何 Public static (在 Visual Basic 中為 Shared) 成員都具備執行緒安全。
並非所有的執行個體成員都是安全執行緒。
Thread Safety
Any public static (Shared in Visual Basic) members of this type are thread safe.
Any instance members are not guaranteed to be thread safe.
這意思不是說被宣告為Public static的SmtpClient具有執行緒安全
但不保證所有SmtpClient都有執行緒安全,像是沒被宣告為Public static的SmtpClient
是我理解有誤嗎(抱歉英文不很好XD)
※ 編輯: a47135 (114.32.94.97), 04/08/2016 18:53:07
還有 17 則推文
還有 5 段內文
→
04/09 09:02, , 49F
04/09 09:02, 49F
推
04/09 10:38, , 50F
04/09 10:38, 50F
→
04/09 10:49, , 51F
04/09 10:49, 51F
→
04/09 10:51, , 52F
04/09 10:51, 52F
→
04/09 10:52, , 53F
04/09 10:52, 53F
→
04/09 17:48, , 54F
04/09 17:48, 54F
禮拜一打算寫支測試試看看w
※ 編輯: a47135 (114.32.94.97), 04/09/2016 18:49:56
推
04/09 20:20, , 55F
04/09 20:20, 55F
→
04/09 20:22, , 56F
04/09 20:22, 56F
→
04/09 20:22, , 57F
04/09 20:22, 57F
→
04/09 20:23, , 58F
04/09 20:23, 58F
→
04/09 20:43, , 59F
04/09 20:43, 59F
推
04/09 20:46, , 60F
04/09 20:46, 60F
推
04/09 20:50, , 61F
04/09 20:50, 61F
→
04/09 20:50, , 62F
04/09 20:50, 62F
→
04/09 20:51, , 63F
04/09 20:51, 63F
→
04/09 20:51, , 64F
04/09 20:51, 64F
推
04/09 20:53, , 65F
04/09 20:53, 65F
→
04/09 20:53, , 66F
04/09 20:53, 66F
→
04/09 20:53, , 67F
04/09 20:53, 67F
→
04/09 20:53, , 68F
04/09 20:53, 68F
→
04/09 20:53, , 69F
04/09 20:53, 69F
→
04/09 20:54, , 70F
04/09 20:54, 70F
→
04/09 20:54, , 71F
04/09 20:54, 71F
→
04/09 20:54, , 72F
04/09 20:54, 72F
→
04/09 20:54, , 73F
04/09 20:54, 73F
→
04/09 20:54, , 74F
04/09 20:54, 74F
→
04/09 20:54, , 75F
04/09 20:54, 75F
→
04/09 20:54, , 76F
04/09 20:54, 76F
→
04/09 20:56, , 77F
04/09 20:56, 77F
→
04/09 21:57, , 78F
04/09 21:57, 78F
→
04/09 21:57, , 79F
04/09 21:57, 79F
→
04/09 21:57, , 80F
04/09 21:57, 80F
→
04/09 21:57, , 81F
04/09 21:57, 81F
推
04/10 12:48, , 82F
04/10 12:48, 82F
→
04/10 12:51, , 83F
04/10 12:51, 83F
推
04/10 19:02, , 84F
04/10 19:02, 84F
→
04/10 19:02, , 85F
04/10 19:02, 85F
→
04/10 19:03, , 86F
04/10 19:03, 86F
我也只是個接坑的XD
不可能到手的案子都一行一行看吧,也只能有出現問題再來琢磨了,所以前面有人這樣
說過我也是回他我也覺得這感覺沒啥意義
※ 編輯: a47135 (114.32.94.97), 04/10/2016 21:06:43
最後爭取(說服?)上面的
把整個系統的發信系統改成Queue起來慢慢寄
※ 編輯: a47135 (220.130.11.211), 07/28/2016 09:31:42
Soft_Job 近期熱門文章
PTT職涯區 即時熱門文章
150
282
158
265