The project of U-WA-
http://uwa.potetihouse.com/
トップページ > 記事閲覧
アイコン 【TKMP.DLL】メール送信を別スレッドで行う方法
日時: 2012/08/03 17:50
名前: cdg

TKMP.DLLを使わせて頂いております。m(__)m

主に、GMailのメール受信や送信をプログラムから行う際に使っていますが、メール送信時に時間がかかるため、出来れば別スレッドで行おうかと検討中です。

メール送信を別スレッドで行うサンプルなど有りましたら、教えて頂ければ幸いです。

環境は、Win7でVC# 2008です。

また、TKMP.DLLの非同期受信の様に、TKMP内で
smtp.Connect();
smtp.SendMail(mr);

この命令の非同期処理として

smtp.ConnectAsync();
→OnConnect()

smtp.SendMailAsync(mr);
→OnSendMailResult()・・・正常時、trueを返す?

の様な感じの命令が増える事を期待してます。

逆に、非同期処理を作らない理由とか、意味が無い?などの情報が有りましたら、教えて頂けないでしょうか?

よろしくお願いします。
メンテ

Page: 1 |

ファイル Re: 【TKMP.DLL】メール送信を別スレッドで行う方法 ( No.1 )
日時: 2012/08/06 07:46
名前: Toki◆pRU.c9X.EOI

メールの非同期送信は以下のコードを参考にしてください

TKMP.Writer.MailWriter mail = new TKMP.Writer.MailWriter();
TKMP.Net.SmtpClient client = new TKMP.Net.SmtpClient(host, port);
定義と接続は省略
System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(delegate
{
client.SendMail(mail);
}));
thread.Start();

メール受信にのみ非同期命令を実装しているのは、処理時間の問題ではなく
非同期処理キューが多数ある状態でも同期処理を割り込んで実行できるようにするためです。
POP接続ではメール受信以外にもメールの削除などを行うことがあるので、
非同期受信中に目的のメールの操作を同期で処理するために実装してあります。

これに対し、SMTPでは送信処理以外に命令がないので、
ライブラリ側での実装は意味がないと判断しています。





メンテ
ファイル Re: 【TKMP.DLL】メール送信を別スレッドで行う方法 ( No.2 )
日時: 2012/08/12 18:09
名前: cdg

返事をありがとうございます。

なるほど、送信処理の非同期処理をライブラリに入れてない理由も判りました。

それと、サンプルプログラム、ありがとうございます。
さくっと、これが書けるのなら問題無いのですが・・・助かりました。m(__)m

これからも、よろしくお願いします。
メンテ
ファイル Re: 【TKMP.DLL】メール送信を別スレッドで行う方法 ( No.3 )
日時: 2012/08/12 18:36
名前: cdg

さっそく、試してみましたが・・・

「サーバーからのレスポンスがありませんでした。\r\n通信はタイムアウトしました。」というエラーが発生します。

以下のコードは、別スレッドにしない状態で正常にメール送信できているソースです。

コメントアウトしている部分が、別スレッドによる送信とした部分です。

別ThreadでのTimeOutで色々と検索してみましたが、イマイチ、参考となる所が無かったので、再度、教えて頂けると助かります。m(__)m

// サーバーへ接続
if (smtp.Connect())
{
//System.Threading.Thread thread =
// new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(delegate{ smtp.SendMail(mr);}));
//thread.Start();
smtp.SendMail(mr);
smtp.Close();
}
else
{
throw new Exception("smtpサーバーへ接続出来ません。");
}
メンテ
ファイル Re: 【TKMP.DLL】メール送信を別スレッドで行う方法 ( No.4 )
日時: 2012/08/12 23:33
名前: Toki◆pRU.c9X.EOI

サンプルの書き方が悪かったようですね。

たぶん、別スレッドの通信開始前にCloseメソッドが実行されてしまっているのではないでしょうか

別スレッドのdelegate内でsmtp.close()を実行してはどうでしょうか?

メンテ
ファイル Re: 【TKMP.DLL】メール送信を別スレッドで行う方法 ( No.5 )
日時: 2013/10/10 17:10
名前: cdg

大変、遅くなりました。
結局、別スレッドで動作させる事は可能になりましたが、送信結果により再送が必要か?などの処理が必要ですので、元のコードに戻してます。^_^;

どなたかの参考になれば・・・と思いますので、成功したコードを載せておきます。

ちなみに、時間がかかってるのはSendMailよりConnectの方でしたので、Connectまで別スレッドにしてます。

※スペースが削除されるので、全角スペースを使ってます。・・・注意して下さい。

bool bResult = false;
System.Threading.Thread thread =
 new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(delegate
 {
  if (smtp.Connect())
  {
   smtp.SendMail(mr);
   smtp.Close();
   bResult = true;
  }
  else
  {
   bResult = false;
  }
 }
 ));
thread.Start();
// thread.Join(); //これをコメントアウトすると・・・待ち時間は同じ^_^;


// これ以下の処理は、Join()を使わないと有効ではありません。
if (bResult)
{
 return true;
}
else
{
 log("smtpサーバーへ接続出来ません。");
 return false;
}


これを、きちんと動作するように作るなら、別スレッド用に送信成功時、失敗時のイベントを持ったクラスを作るしか無いと思われます。

メール送信中の操作ブロック・・・バグったか?と勘違いするので、焦りますね^^;

自分でクラスを作るという方法も考えましたが、TKMPに送信に関するAsync命令が実装されるのを待つ事にしました。m(__)m
メンテ

Page: 1 |

題名 スレッドをトップへソート (必ず題名内に日本語を使用してください)
名前
E-Mail
URL
パスワード (記事メンテ時に使用)
コメント 顔smile01.gif 顔smile02.gif 顔smile03.gif 顔smile04.gif 顔smile05.gif 顔smile06.gif 顔smile07.gif

   クッキー保存