/// <summary> /// 画面のアカウント設定を取得する。 /// </summary> private void SetAccount() { Account_DS.AccountRow row = null; switch (this._type) { case AccountSettingType.New: //新規の場合は新規行を作成 row = this._ads.Account.NewAccountRow(); break; case AccountSettingType.Edit: //編集の場合は編集行を設定 row = this._ads.Account.FindByAccountName(this._beforeAccountName); break; } //画面の情報を取り込む row.AccountName = this.txtAccount.Text; row.SmtpServer = this.txtSmtpServer.Text; row.SmtpSenderName = this.txtSenderName.Text; row.SmtpSenderMail = this.txtSenderMail.Text; row.SmtpPort = int.Parse(this.txtSmtpPort.Text); row.UsePopBeforeSmtp = this.chkPopBeforeSmtp.Checked; row.UseSmtpAuth = this.chkSmtpAuth.Checked; row.PopServer = this.txtPopServer.Text; row.PopUserId = this.txtPopUser.Text; row.PopPassword = CryptographyUtil.EncryptString(this.txtPopPassword.Text); row.PopPort = int.Parse(this.txtPopPort.Text); if (this._type == AccountSettingType.New) { this._ads.Account.AddAccountRow(row); } }
//private bool _isAccountError = false; public ProgressForm(Account_DS.AccountRow accountRow, Address_DS addressDs, string mailSubject, string mailBody) { InitializeComponent(); this._accountRow = accountRow; this._addressDs = addressDs; this._mailBody = mailBody; this._mailSubject = mailSubject; }
/// <summary> /// smtpクライアントを作成する。 /// </summary> /// <param name="accountRow">アカウント情報</param> /// <returns>smtpクライアント</returns> private TKMP.Net.SmtpClient CreateSMTPClient(Account_DS.AccountRow accountRow) { TKMP.Net.SmtpClient smtp = null; if (accountRow.UseSmtpAuth == true) { //SMTPサーバーで認証を利用する場合 TKMP.Net.ISmtpLogon logon = new TKMP.Net.AuthLogin(accountRow.PopUserId, CryptographyUtil.DecryptString(accountRow.PopPassword)); smtp = new TKMP.Net.SmtpClient(accountRow.SmtpServer, accountRow.SmtpPort, logon); } else { //通常送信 smtp = new TKMP.Net.SmtpClient(accountRow.SmtpServer, accountRow.SmtpPort); } return(smtp); }
/// <summary> /// ドロップダウンに表示されている設定情報を表示する。 /// </summary> private void ShowAccount() { Account_DS.AccountRow row = this._ads.Account.FindByAccountName(this.cboAccount.SelectedValue.ToString()); this.txtAccount.Text = row.AccountName; this.txtSmtpServer.Text = row.SmtpServer; this.txtSenderName.Text = row.SmtpSenderName; this.txtSenderMail.Text = row.SmtpSenderMail; this.txtSmtpPort.Text = row.SmtpPort.ToString(); this.chkPopBeforeSmtp.Checked = row.UsePopBeforeSmtp; this.chkSmtpAuth.Checked = row.UseSmtpAuth; this.txtPopServer.Text = row.PopServer; this.txtPopUser.Text = row.PopUserId; this.txtPopPassword.Text = CryptographyUtil.DecryptString(row.PopPassword); this.txtPopPort.Text = row.PopPort.ToString(); this._isAccountEdited = false; this._beforeAccountName = this.cboAccount.SelectedValue.ToString(); }
/// <summary> /// メールを送信する。 /// </summary> private void SendMail() { if (this.IsValid() == false) { return; } //送信確認を行い、OKでなければ中止する。 if (MessageBox.Show(this, "メールを送信しますか?", "送信確認", MessageBoxButtons.OKCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) != DialogResult.OK) { return; } //送信処理を実行 Account_DS.AccountRow accountRow = this._accountds.Account.FindByAccountName(this.cboAccount.SelectedValue.ToString()); using (ProgressForm f = new ProgressForm(accountRow, this._addressds, this.txtSubject.Text, this.txtSource.Text)) { f.ShowDialog(); } }
/// <summary> /// Pop Before SMTPを行う。 /// </summary> /// <param name="accountRow">アカウント情報</param> private void DoPopBeforeSMTP(Account_DS.AccountRow accountRow) { System.Net.Sockets.TcpClient tcp = new System.Net.Sockets.TcpClient(); tcp.Connect(accountRow.PopServer, accountRow.PopPort); Stream ns = tcp.GetStream(); using (StreamWriter sw = new StreamWriter(ns)) using (StreamReader sr = new StreamReader(ns)) { sw.NewLine = "\r\n"; sw.AutoFlush = true; sr.ReadLine(); sw.WriteLine("USER {0}", accountRow.PopUserId); sr.ReadLine(); sw.WriteLine("PASS {0}", CryptographyUtil.DecryptString(accountRow.PopPassword)); sr.ReadLine(); if (tcp.Connected) { sw.WriteLine("QUIT"); sr.ReadLine(); } tcp.Close(); } }
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="mail">ヘッダーをつけたいメールオブジェクト</param> /// <param name="accountRow">アカウント情報</param> private void CreateMailHeader(TKMP.Writer.MailWriter mail, Account_DS.AccountRow accountRow) { //ヘッダ情報を追加します mail.Headers.Add("From", string.Format("{0} <{1}>", accountRow.SmtpSenderName, accountRow.SmtpSenderMail)); //「差出人」 mail.Headers.Add("Subject", this._mailSubject); //メールの件名 }
/// <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(); } }