private void _worker_DoWork(object sender, DoWorkEventArgs e) { //送信アカウント情報を取得 Account_DS.AccountRow accountRow = e.Argument as Account_DS.AccountRow; int counter = 0; int clusterCounter = 0; Address_DS.AddressDataTable dsAddress = new Address_DS.AddressDataTable(); for (int i = 0; i <= this._addressDs.Address.Count - 1; i++) { dsAddress.ImportRow(this._addressDs.Address[i]); counter += 1; //クラスタサイズに達し、すべてのアドレスの読み込みが終わっていなければメールを送信し、次の送信を待つ。 if (counter == HtmlMailSender.Properties.Settings.Default.ClusterSize && (i != (this._addressDs.Address.Count - 1))) { if (!SendMail(accountRow, dsAddress)) { e.Result = false; return; } //カウンタ関係を初期化 counter = 0; clusterCounter += 1; dsAddress.Clear(); //一定期間を停止 this._writer.Write(clusterCounter.ToString()); int sentNumber = clusterCounter * HtmlMailSender.Properties.Settings.Default.ClusterSize; this._writer.Write(sentNumber.ToString()); double percentage = 100 * sentNumber / this._addressDs.Address.Count; this._writer.Write(percentage.ToString()); this._writer.Write(((int)System.Math.Ceiling(percentage)).ToString()); this._worker.ReportProgress((int)System.Math.Ceiling(percentage), new object[] { sentNumber }); this._writer.Write(string.Format("インターバルで停止中です。")); this._writer.Flush(); System.Threading.Thread.Sleep((int)(HtmlMailSender.Properties.Settings.Default.Interval * 1000)); } else if (i == this._addressDs.Address.Count - 1) { //すべての読み込みが終わった場合は送信のみ行う。 if (!SendMail(accountRow, dsAddress)) { e.Result = false; return; } } } e.Result = true; #region // //送信アカウント情報を取得 //Account_DS.AccountRow accountRow = e.Argument as Account_DS.AccountRow; ////POP Before SMTPの場合 //if (accountRow.UsePopBeforeSmtp == true) //{ // this.DoPopBeforeSMTP(accountRow); //} ////SMTPクライアントの作成 //TKMP.Net.SmtpClient smtp = this.CreateSMTPClient(accountRow); ////接続に失敗したら、終了。 //if (!smtp.Connect()) //{ // System.Windows.Forms.MessageBox.Show("インターネット接続に失敗しました。インターネットに接続していないか、アカウント情報が間違っています。"); // this._isAccountError = true; // return; //} //try //{ // //TODO 決まった件数をまとめてメール送信する。 // //TODO メール送信後、一度接続を解除する。 // //メール送信を開始 // smtp.MessageReceive += new TKMP.Net.MessageReceiveHandler(smtp_MessageReceive); // smtp.MessageSend += new TKMP.Net.MessageSendHandler(smtp_MessageSend); // //あて先アドレスをセット // int totalCount = 0; // int clusterCount = 0; // foreach (Address_DS.AddressRow adder in this._addressDs.Address) // { // clusterCount ++; // totalCount++; // //メールオブジェクトの作成 // TKMP.Writer.MailWriter mail = new TKMP.Writer.MailWriter(); // //SMTPサーバーの問い合わせ用のアドレスをセット // mail.FromAddress = accountRow.SmtpSenderMail; // mail.ToAddressList.Add(adder.MailAddress); // //Toにメーラーに表示させるにはこの行を追加 // //mail.Headers.Add("To", adder.MailAddress); // //本文の作成。(HTMLとして認識) // this.CreateMailBody(mail); // //ヘッダ情報を追加 // this.CreateMailHeader(mail, accountRow); // smtp.SendMail(mail); // this._writer.Write(string.Format("{0}にメールを送信しました。", adder.MailAddress)); // double percentage = ((double)totalCount / (double)this._addressDs.Address.Count) * 100; // if (clusterCount == HtmlMailSender.Properties.Settings.Default.ClusterSize) // { // //クラスタサイズに達した場合はいったんとめる。 // this._worker.ReportProgress((int)System.Math.Ceiling(percentage), new object[] { totalCount, true }); // this._writer.Write(string.Format("インターバルで停止中です。")); // this._writer.Flush(); // System.Threading.Thread.Sleep((int)(HtmlMailSender.Properties.Settings.Default.Interval * 1000)); // clusterCount = 0; // } // else // { // //それ以外は情報のみを返す。 // this._worker.ReportProgress((int)System.Math.Ceiling(percentage), new object[] { totalCount, false }); // } // } //} //finally //{ // //サーバーから切断 // smtp.Close(); // this._writer.Dispose(); //} #endregion }
/// <summary> /// 引数のアカウントで引数のメールアドレスに対してメールを送信する。 /// </summary> /// <param name="accountRow">アカウント</param> /// <param name="address">メールアドレス</param> /// <returns>成功すればTrue、送信に失敗すればFalseを返す。</returns> private bool SendMail(Account_DS.AccountRow accountRow, Address_DS.AddressDataTable address) { //0件の場合は何もせずに終了。 if (address.Count == 0) { return(true); } //POP Before SMTPの場合 if (accountRow.UsePopBeforeSmtp == true) { this.DoPopBeforeSMTP(accountRow); } //SMTPクライアントの作成 TKMP.Net.SmtpClient smtp = this.CreateSMTPClient(accountRow); //接続に失敗したら、終了。 if (!smtp.Connect()) { return(false); } try { //TODO 決まった件数をまとめてメール送信する。 //TODO メール送信後、一度接続を解除する。 //メール送信を開始 smtp.MessageReceive += new TKMP.Net.MessageReceiveHandler(smtp_MessageReceive); smtp.MessageSend += new TKMP.Net.MessageSendHandler(smtp_MessageSend); //あて先アドレスをセット //メールオブジェクトの作成 TKMP.Writer.MailWriter mail = new TKMP.Writer.MailWriter(); //SMTPサーバーの問い合わせ用のアドレスをセット mail.FromAddress = accountRow.SmtpSenderMail; foreach (Address_DS.AddressRow adder in address) { mail.ToAddressList.Add(adder.MailAddress); } //Toにメーラーに表示させるにはこの行を追加 //mail.Headers.Add("To", adder.MailAddress); //本文の作成。(HTMLとして認識) this.CreateMailBody(mail); //ヘッダ情報を追加 this.CreateMailHeader(mail, accountRow); smtp.SendMail(mail); foreach (Address_DS.AddressRow adder in address) { this._writer.Write(string.Format("{0}にメールを送信しました。", adder.MailAddress)); } return(true); } finally { //サーバーから切断 smtp.Close(); this._writer.Dispose(); } }