トップ回答者
CDO.Messageでメール送信した際、タイムアウトになる場合がある。

質問
-
お世話になります。
CDO.Messageを使ってサーバの起動メールおよび定期報告メールを通知しようとしているのですが、
起動メールが配信されません。
仕組みとしては以下になります。
・以下の場合にメールを通知するよう、タスクスケジューラで設定
①起動時
②毎日定期時刻
②については毎日正しく通知されるのですが、①がタイムアウトでエラーになってしまいます。
試しに①を①のタスクを複製し、起動後、起動10分後、起動20分後と実施してみたところ、
10分後と20分後は通知されました。
そのため、起動直後が問題なのかと想定し、起動30分後に通知するようタスクを設定しましたが、
結局通知メールは通知されませんでした。
そのため、起動後1発目のメールの場合に、タイムアウトで通知されないように思われるのですが、
調査しても原因の解決に至らなかったため、こちらでお知恵を拝借させていただきたく、書き込みいたしました。
以下、メール送信プログラム(VBScript)の内容になります。
-------------------------------------------------------------------------------------------------
'決まり文句 SMTPサーバ名のみ設定
Dim oMsg
Set oMsg = CreateObject("CDO.Message")
oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = SMTPサーバ名
oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = SMTPポート番号
oMsg.Configuration.Fields.Update
'メール固定部
oMsg.From = 送信元メールアドレス
oMsg.To = 送信先メールアドレス
oMsg.Subject = 件名
'本文は引数によって可変
Dim objParm
Dim strArgument
Set objParm = Wscript.Arguments
strArgument = objParm(0)
If strArgument = 1 Then
'定期報告
oMsg.TextBody = "サーバからの定期報告です。"
ElseIf strArgument = 2 Then
'起動
oMsg.TextBody = "サーバが起動しました。"
End If
'送信
oMsg.Send--------------------------------------------------------------------------------
よろしくお願いいたします。
回答
-
掲載されたコードには認証の設定が見当たらないようですし、確かに「POP Before SMTP」の可能性はありますね。最初のPOP認証から30分程度は送信可能になっている可能性があります。この場合、2回目の送信が30分以内の場合は成功します。ただ、1回目で成功していませんから、1回目から2回目の間にOutlook等、何らかの方法でPOPで接続していなければなりません。
もし、「POP Before SMTP」が原因の場合、CDOそのものは対応していませんから、以下などを参考にしてSMTP認証されると良いかもしれません。Gmail の SMTP サーバと CDO コンポーネントを使ってメール送信
http://www.technodoor.com/entry/gmail-smtp-cdo-
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 編集済み trapemiyaModerator 2015年3月30日 5:58 URL訂正
- 回答の候補に設定 星 睦美 2015年4月1日 1:28
- 回答としてマーク 星 睦美 2015年4月6日 4:54
すべての返信
-
trapemiya様
ご返信いただきありがとうございます。
履歴では以下のようになっております。
----------------------------------------------------------------------------------
・イベントID:100 タスクの開始 オペコード:(1)
・イベントID:200 開始された操作 オペコード:(1)
・イベントID:129 タスクのプロセスが作成されました オペコード:情報
↓以下、タスクの開始から1時間後
・イベントID:329 タイムアウトに達したため、タスクが停止しています オペコード:情報
・イベントID:111 タスクが終了しました オペコード:強制終了
----------------------------------------------------------------------------------
また、「全般」での設定では、
【ユーザーがログオンしているかどうかにかかわらず実行する】にチェックを入れております。
(【最上位の特権で実行する】にもチェックあり)
よろしくお願いいたします。
-
タイムアウトがどこで発生しているのかわかりますでしょうか? もし、わからなければ、ネットーワークの問題なのか、何かのサービス等の問題なのか切り分ける必要があります。
とりあえず、サーバーの起動直後に、手動でタスクを実行した場合にどうなるかを確認されてみてはいかがでしょうか? 手動の場合でも2回目ならば成功するということになると、本当に初回起動時に問題がありそうです。その場合、DNS等の問題があるのかもしれませんので、サーバー起動時にメールサーバーにpingやtracertでパケットが届くか確認してみて下さい。
ネットワークに問題がありそうな場合、Microsoft Network MonitorやMicrosoft Message Analyzerで調査されると良いかもしれません。★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
-
質問文を私が解釈したところによると、2回目なら10分後でも20分後でもOKで、1回目なら30分後でもダメのようですから、起動直後の問題ではなく、また、ある程度起動から時間が経ったら解決する問題でもないようです。となると、得られている情報だけから判断すると、やはり1回目がダメということになりそうです。
また、1回目のタイムアウトが約60分で、60分しないうちに、例えば10分後でも2回目なら成功するわけですから、1回目がトリガーになって、その後に正常にメールを送信できる状態になるようです。しかし、考えてみると、この状況でも1回目はタイムアウトするわけですから、ネットワークの回復ではなさそうです。となると、1回目が固有に使用する何かがタイムアウトしていることになるわけですから、果たして・・・。
そう言えば、Windowsのイベントログには何か出ていないのでしょうか?#ご質問の解釈を私が誤っていたらご指摘下さい。
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 編集済み trapemiyaModerator 2015年3月30日 4:25 追記
-
掲載されたコードには認証の設定が見当たらないようですし、確かに「POP Before SMTP」の可能性はありますね。最初のPOP認証から30分程度は送信可能になっている可能性があります。この場合、2回目の送信が30分以内の場合は成功します。ただ、1回目で成功していませんから、1回目から2回目の間にOutlook等、何らかの方法でPOPで接続していなければなりません。
もし、「POP Before SMTP」が原因の場合、CDOそのものは対応していませんから、以下などを参考にしてSMTP認証されると良いかもしれません。Gmail の SMTP サーバと CDO コンポーネントを使ってメール送信
http://www.technodoor.com/entry/gmail-smtp-cdo-
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 編集済み trapemiyaModerator 2015年3月30日 5:58 URL訂正
- 回答の候補に設定 星 睦美 2015年4月1日 1:28
- 回答としてマーク 星 睦美 2015年4月6日 4:54