none
CDO.Messageでメール送信した際、タイムアウトになる場合がある。 RRS feed

  • 質問

  • お世話になります。

    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

    --------------------------------------------------------------------------------

    よろしくお願いいたします。

    2015年3月30日 0:25

回答

  • こんにちは。

    全く経験が無く調べただけで恐縮なのですが、

    SMTPのメール送信1回目に失敗といえば、POP Before SMTPが疑わしいようなのですが、
    POP認証後であれば1回目でも成功したりするでしょうか。
    ※ただ、2回目送信時だと何故認証済みで成功するのかについて説明が私にはできませんが…。

    的外れかどうかすら私には判断できませんが可能性のひとつとして投稿しておきます。

    • 回答の候補に設定 星 睦美 2015年4月1日 1:28
    • 回答としてマーク 星 睦美 2015年4月6日 4:54
    2015年3月30日 4:38
    モデレータ
  • 掲載されたコードには認証の設定が見当たらないようですし、確かに「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/

    2015年3月30日 5:56
    モデレータ

すべての返信

  • タスクの「履歴」にはどのように記述されているのでしょうか? 他のタイミングでは正常に実行されるようですから、実行ユーザーの権限は問題ないようです。となると、例えばログオフ中は実行しないようになっているなどでしょうか?

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年3月30日 0:47
    モデレータ
  • trapemiya様

    ご返信いただきありがとうございます。

    履歴では以下のようになっております。

    ----------------------------------------------------------------------------------

    ・イベントID:100 タスクの開始 オペコード:(1)

    ・イベントID:200 開始された操作 オペコード:(1)

    ・イベントID:129 タスクのプロセスが作成されました オペコード:情報

    ↓以下、タスクの開始から1時間後

    ・イベントID:329 タイムアウトに達したため、タスクが停止しています オペコード:情報

    ・イベントID:111 タスクが終了しました オペコード:強制終了

    ----------------------------------------------------------------------------------

    また、「全般」での設定では、

    【ユーザーがログオンしているかどうかにかかわらず実行する】にチェックを入れております。

    (【最上位の特権で実行する】にもチェックあり)

    よろしくお願いいたします。

    2015年3月30日 0:58
  • タイムアウトがどこで発生しているのかわかりますでしょうか? もし、わからなければ、ネットーワークの問題なのか、何かのサービス等の問題なのか切り分ける必要があります。
    とりあえず、サーバーの起動直後に、手動でタスクを実行した場合にどうなるかを確認されてみてはいかがでしょうか? 手動の場合でも2回目ならば成功するということになると、本当に初回起動時に問題がありそうです。その場合、DNS等の問題があるのかもしれませんので、サーバー起動時にメールサーバーにpingやtracertでパケットが届くか確認してみて下さい。
    ネットワークに問題がありそうな場合、Microsoft Network MonitorやMicrosoft Message Analyzerで調査されると良いかもしれません。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年3月30日 2:47
    モデレータ
  • 単純に起動直後でネットワークを正しく認識出来ていないのでは?

    同じ起動条件でSMTPサーバへのPINGコマンドを実行してみてはいかがでしょうか。

    2015年3月30日 3:57
  • 質問文を私が解釈したところによると、2回目なら10分後でも20分後でもOKで、1回目なら30分後でもダメのようですから、起動直後の問題ではなく、また、ある程度起動から時間が経ったら解決する問題でもないようです。となると、得られている情報だけから判断すると、やはり1回目がダメということになりそうです。
    また、1回目のタイムアウトが約60分で、60分しないうちに、例えば10分後でも2回目なら成功するわけですから、1回目がトリガーになって、その後に正常にメールを送信できる状態になるようです。しかし、考えてみると、この状況でも1回目はタイムアウトするわけですから、ネットワークの回復ではなさそうです。となると、1回目が固有に使用する何かがタイムアウトしていることになるわけですから、果たして・・・。
    そう言えば、Windowsのイベントログには何か出ていないのでしょうか?

    #ご質問の解釈を私が誤っていたらご指摘下さい。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年3月30日 4:23
    モデレータ
  • こんにちは。

    全く経験が無く調べただけで恐縮なのですが、

    SMTPのメール送信1回目に失敗といえば、POP Before SMTPが疑わしいようなのですが、
    POP認証後であれば1回目でも成功したりするでしょうか。
    ※ただ、2回目送信時だと何故認証済みで成功するのかについて説明が私にはできませんが…。

    的外れかどうかすら私には判断できませんが可能性のひとつとして投稿しておきます。

    • 回答の候補に設定 星 睦美 2015年4月1日 1:28
    • 回答としてマーク 星 睦美 2015年4月6日 4:54
    2015年3月30日 4:38
    モデレータ
  • 掲載されたコードには認証の設定が見当たらないようですし、確かに「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/

    2015年3月30日 5:56
    モデレータ
  • aviator様

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

    起動10分後でも2通目であればメールは配信され、

    起動30分後でも1通目であればメールが配信されない状態です。

    ファイルサーバに関する設定のため、頻繁に起動を実施することができないのですが、

    タイミングを見て1通目前後でのping確認を行ってみたいと思います。

    2015年3月30日 8:11
  • Tak1wa様

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

    POP Before SMTP、お恥ずかしい限りですが初めて耳にしました。

    調査させていただきたいと存じます。

    2015年3月30日 8:13
  • trapemiya様

    重ね重ねのご返信、まことにありがとうございます。

    trapemiya様のご解釈で相違ありません。

    POP Before SMTPについては恥ずかしながら全く知識がないため、

    その点からも調査してみたいと存じます。

    ちなみに、起動はAM1:00頃、定期報告メールはAM8:00頃となっています。

    2015年3月30日 8:19
  • ご返信いただきました皆様方、まことにありがとうございました。

    現状では起動後2通目以降は正常に配信されているため、

    一先ず起動メールを2通配信することで、暫定対応としています。

    引き続き、ご返信いただきました内容を参考にし、調査を行いたいと存じます。

    ありがとうございました。

    以上です。失礼いたします。

    2015年3月30日 8:21