none
タスクスケジューラでの定期メール送信 RRS feed

  • 質問

  • お世話になります。

    Windows7proから10proにアップデート済みのPCから、毎日1回特定のファイルを添付ファイルとしてメール送信させたいと考えています。
    各種フォーラム等を参考にして以下の方法で試しているのですが、正常に実行できません。

    方法:
    vbsファイルを作成し、wscript.exeをプログラムとして引数にvbsファイルを指定

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

    Set olkApp = CreateObject("Outlook.Application")
    Set objMsg = olkApp.CreateItem(0) ' 0 = olMailItem
    objMsg.To = "送信先メールアドレス"
    objMsg.Subject = "添付ファイル送信テスト"
    objMsg.Body = "添付ファイルを送信します。"
    objMsg.Attachments.Add "添付ファイルのパス"
    objMsg.Send

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

    vbsファイルの保存先:C:\Temp\send.vbs 
    スクリプトを直接起動した場合、メールは遅滞なく送信できることを確認しました

    タスクスケジューラの設定:
    ユーザーがログインしているかどうかにかかわらず実行する:ON
    最上位の特権で実行する:ON
    操作:プログラムの開始
        プログラム/スクリプト:C:\Windows\System32\wscript.exe
                引数の追加:"C:\Temp\send.vbs"
        開始:空欄

    実行結果:(状態が「実行中」のままとなるため、手動で終了)

    102 タスクが完了しました (2)
    201 操作が完了しました (2)
    330 ユーザーの要求によりタスクが停止しています 情報
    110 ユーザーによってトリガーされるタスク 情報
    200 開始された操作 (1)
    100 タスクの開始 (1)
    129 タスクのプロセスが作成されました 情報

    入力や表示内容に問題点が無いか、ご指摘頂けるとありがたいです。
    よろしくお願いします。


    • 編集済み Motoki.U 2016年6月13日 1:13 書式調整
    2016年6月13日 1:06

回答

  • 多分、Outlookはフルユーザーセッションが必要なので、
    ログオンユーザーでないと、処理されないのだと思います。

    http://www.atmarkit.co.jp/ait/articles/1407/01/news018.html
    この辺りの方法ではどうでしょうか。

    2016年6月13日 5:00
  • PowerShellが不安でしたら、先述のURLにもあるCDOはどうでしょうか。

    添付ファイルについては以下のURLが参考になると思います。
    https://gallery.technet.microsoft.com/scriptcenter/e7dfcfb7-1f64-48ca-8d16-107091be99cc

    • 回答としてマーク 佐伯玲 2016年6月27日 2:19
    2016年6月13日 6:23
  • やきです。

    グレーアウトは「管理者として実行」すれば変更できそうです。ただ、ドメイン管理者によってポリシーが強制されている場合はこの限りではありません。

    その後調べてみましたが、送信できない理由の一つはこれのようですね。

    「電子メール アドレスの情報にアクセスしようとしているか、自分の代わりに電子メールを送信しようとしているプログラムに関する警告が表示される」

    で検索すると原因に以下が記載されていますので、今回はこれに相当したのではないでしょうか。

    ・これらのセキュリティ警告は、プログラムが Outlook アドレス帳の連絡先情報にアクセスしようとしたとき、または自動的にメールを送信しようとしたときに表示されます。既定では、信頼できるプログラムは COM アドインのみです。メール管理者によって、[信頼できるアドイン] の一覧に追加した特定のアドインのみが許可されている場合もあります。

    ・自動的に起動するプログラムの場合   当該プログラムは、自動的に起動したものである場合があります。たとえば、Outlook オブジェクト モデルの Item.Send メソッドを使用して電子メール メッセージの自動送信を試みるプログラムなどです。

    以上、参考まで。

    • 回答としてマーク 佐伯玲 2016年6月27日 2:20
    2016年6月13日 7:40
  • やきさま、LazyDoggさま ありがとうございました。
    頂いた回答を基に新たに検索する等して、以下の方法で希望の動作をさせることができました。

    ・PowerShellのセキュリティの設定を"RemoteSigned"に変更

    ・タスクスケジューラの操作設定
            プログラム/スクリプト:powershell.exe
            引数の追加:-command "ps1のフルパス"
            開始:ps1のあるフォルダのフルパス

    ・ps1ファイルの内容
    -------------------------------------------------------------------------------

    cd (Split-Path $MyInvocation.MyCommand.Path -Parent)
    # 送信内容
    $filedate1 = Get-Date -Format "MMdd-HHmm";
    $filedate2 = Get-Date -Format "MM";
    $filedate3 = Get-Date -Format "dd";
    $To="*****@*****.co.jp"
    $From="*****@*****.co.jp"
    $Subject="定期データ送信 $filedate1"
    $body="$filedate2 月 $filedate3 日のデータ定期送信"
    # 添付ファイル
    $FilePath="C:\*****.txt"

    # 送信サーバー設定
    $SMTPServer="*****"
    $Port="***"
    $User="*******"
    $Password="*****"

    # SMTP認証
    $str = ConvertTo-SecureString $Password -AsPlainText -Force
    $psc = New-Object System.Management.Automation.PsCredential($User, $str)

    # メール送信
    Send-MailMessage -To $To -From $From -Subject $Subject -Body $body -Attachments $FilePath -SmtpServer $SMTPServer -Port $Port -Credential $psc -Encoding UTF8
    -------------------------------------------------------------------------------

    当初は単純に「Outlookをタスクスケジューラで起動すれば何とかなりそう」程度の知識しか無かったので、ここでアドバイス頂かなければ未だに彷徨っていたかと思います。ありがとうございました。

    また、Outlookが(当たり前ですが)しっかりとしたセキュリティを有していることが判ったのも収穫でした。

    • 回答としてマーク 佐伯玲 2016年6月27日 2:20
    2016年6月13日 9:59

すべての返信

  • お世話になります。

    スクリプト自体は正常に動作しているのであれば

    タスクスケジューラに設定に問題がある可能性が高いですね。

    こちらのスレを参考に設定してみてはいかがですか?

    https://social.technet.microsoft.com/Forums/office/ja-JP/63c9dec2-3b2c-4218-bdaf-4bf2daebb86a?forum=windowsserver2008ja


    • 編集済み S_M_T 2016年6月13日 2:42
    2016年6月13日 2:41
  • ありがとうございます。

    タスクスケジューラの「タスク実行時に使うユーザーアカウント」を色々変更してみました。

    Administrators:変化なし
    SYSTEM:変化なし
    Administrator:変化なし

    色々試してみると、タスクスケジューラの履歴に出てくる「ユーザーによってトリガーされるタスク」で停まっているようなので、何か必要な入力(引数?)が抜け落ちているのかと思いますが、どうにも上手くいきません。

    2016年6月13日 4:12
  • やきです。

    どこかでダイアログが出ているのでしょうか。
    以下、ダイアログが出そうなポイントについていくつか思いついたところを列挙します。

    ・実行ユーザーのプロファイルは作成済みか(対話ログインしたことがあるか)
    → 一時ファイルが作れなくてエラーが出ているのかも

    ・実行ユーザーでOutlookを起動した場合、ユーザー名とパスワードは保存された状態になっているか
    → Outlok起動時の認証ダイアログでとまってるかも。資格情報マネージャーにてWindows認証情報にOutlookのパスワードを記憶させます。

    ・wscript ではなく cscript にしてみてはどうか
    → wsriptのダイアログがでてるかも

    ・「開始」のオプションに適当なパスを指定してみてはどうか
    → たとえばスクリプトのフォルダなど。手作業で実行したときとの違いにカレントパスがあるので。

    ・Outlookの[ファイル] - [オプション] - [セキュリティセンター] - [セキュリティセンターの設定] - [プログラムによるアクセス]  の表記はどうなっているか
    → 不審な動作扱いされて警告が表示されたかも

    ・メール送信にパスワード付きプロキシなどを経由していたりしないでしょうか

    以上、参考になれば幸いです。
    2016年6月13日 4:52
  • 多分、Outlookはフルユーザーセッションが必要なので、
    ログオンユーザーでないと、処理されないのだと思います。

    http://www.atmarkit.co.jp/ait/articles/1407/01/news018.html
    この辺りの方法ではどうでしょうか。

    2016年6月13日 5:00
  • やき 様ありがとうございます。

    ・実行ユーザーのプロファイルは作成済みか(対話ログインしたことがあるか)
    → 一時ファイルが作れなくてエラーが出ているのかも

    →→今実行しているユーザー(管理者)でも実施できません。
    実行ユーザーはadministratorやSYSTEMにすべきなのでしょうか?

    ・実行ユーザーでOutlookを起動した場合、ユーザー名とパスワードは保存された状態になっているか
    → Outlok起動時の認証ダイアログでとまってるかも。資格情報マネージャーにてWindows認証情報にOutlookのパスワードを記憶させます。

    →→現在実行しているユーザーでOutlookを日常的に使用していますが別途ということでしょうか。
    資格情報マネージャーにOutlookに関する項目はありませんでした。

    ・wscript ではなく cscript にしてみてはどうか
    → wsriptのダイアログがでてるかも

    →→変化ありませんでした。

    ・「開始」のオプションに適当なパスを指定してみてはどうか
    → たとえばスクリプトのフォルダなど。手作業で実行したときとの違いにカレントパスがあるので。

    →→スクリプトのフォルダ(C\Temp)を指定しましたが、変化ありませんでした。

    ・Outlookの[ファイル] - [オプション] - [セキュリティセンター] - [セキュリティセンターの設定] - [プログラムによるアクセス]  の表記はどうなっているか
    → 不審な動作扱いされて警告が表示されたかも

    →→ウイルス対策ソフトウェアの状態が有効となっており、選択できない状態となっています。

    ・メール送信にパスワード付きプロキシなどを経由していたりしないでしょうか

    →→使用していません。

    引き続き調べてみます。

    2016年6月13日 6:02
  • LazyDogg さまありがとうございます。

    そちらの記事も検索でたどり着いたのですが、PowerShellというものに全く馴染みが無く腰が引けておりました。
    添付ファイルを送る方法も調べないといけませんね…

    しかし1日1回メールさせるだけでこれ程難しいとは思いもしませんでした。

    2016年6月13日 6:09
  • PowerShellが不安でしたら、先述のURLにもあるCDOはどうでしょうか。

    添付ファイルについては以下のURLが参考になると思います。
    https://gallery.technet.microsoft.com/scriptcenter/e7dfcfb7-1f64-48ca-8d16-107091be99cc

    • 回答としてマーク 佐伯玲 2016年6月27日 2:19
    2016年6月13日 6:23
  • やきです。

    > 資格情報マネージャーにOutlookに関する項目はありませんでした。

    こちらですが、そのユーザーでOutlookを使う時、ユーザー名とIDを入力するダイアログは表示されますか?表示されずにメールの送受信等ができていればよいですが。

    > ウイルス対策ソフトウェアの状態が有効となっており、選択できない状態となっています

    これを一時的に「不審な動作に関する警告を表示しない(推奨しません)」にした状態でも、動作に変化なしでしょうか。
    # ちなみに「ウイルス対策ソフトウェアの状態」が有効でないと、このラジオボタンを変更できません。今回は変更できると思います。

    後は…フルユーザーセッション必須となると、そのユーザーがログオン済みであるとか、あらかじめOutlookが起動済みであるとか条件があるのかもしれません。

    あと、すでにご指摘ありましたが、個人的には私もPowershellを勧めします。いろいろ方法はありましたが、私はこんな感じで、メールを送る ps1 を実行してます。

    ■ Powershellを実行するVBS

    # 一時的にスクリプト実行ポリシーを無制限にしてしいてスクリプト実行(以下1行)
    CreateObject("WScript.Shell").Run "powershell -ExecutionPolicy Bypass """ & WScript.Arguments(0) & """", 0

    ■ タスクスケジューラの設定

    操作:プログラムの開始
    プログラム:wscript.exe
    引数の追加:"<上記VBSのフルパス>" "<Powershell スクリプトファイルのフルパス>"

    ■ Powershellスクリプト
    # スクリプト実行フォルダがカレントフォルダになるように冒頭に以下追加(任意)。

    cd (Split-Path $MyInvocation.MyCommand.Path -Parent)
    <以下、添付ファイルの準備やメールの送信を行うスクリプト処理>

    以上、参考まで。



    2016年6月13日 6:25
  • やき さまありがとうございます。

    Outlookは全て設定済みのため、普段入力を求められることはありません。
    また、セキュリティの設定はグレーになっており、ラジオボタンは選択できない状態です。

    PowerShell、早速調べて試しています。
    まずはLazyDoggさまに紹介頂いた@IT記事から”PowerShellのSend-MailMessageコマンドレットを使う方法”で試してみたところ、メールの送信に成功しました。
    タスクスケジューラの内容はvbsの時のまま(相変わらず「ユーザーによってトリガ…」のメッセージあり)で、何が違うのかさっぱりですが。

    やきさまの方法(vbsとps1をそれぞれ用意する)も試してみます。

    2016年6月13日 7:06
  • LazyDoggさまありがとうございます。

    先の返信で頂いた@ITの記事を基にタスクスケジューラの引数にPowerShellの構文を入力し、メールの送信(本当に"送るだけ"ですが)には成功しました。

    参考URLありがとうございます。
    CDOも試してみて、使いやすい方で最終的には実行してみます。

    2016年6月13日 7:11
  • やきです。

    グレーアウトは「管理者として実行」すれば変更できそうです。ただ、ドメイン管理者によってポリシーが強制されている場合はこの限りではありません。

    その後調べてみましたが、送信できない理由の一つはこれのようですね。

    「電子メール アドレスの情報にアクセスしようとしているか、自分の代わりに電子メールを送信しようとしているプログラムに関する警告が表示される」

    で検索すると原因に以下が記載されていますので、今回はこれに相当したのではないでしょうか。

    ・これらのセキュリティ警告は、プログラムが Outlook アドレス帳の連絡先情報にアクセスしようとしたとき、または自動的にメールを送信しようとしたときに表示されます。既定では、信頼できるプログラムは COM アドインのみです。メール管理者によって、[信頼できるアドイン] の一覧に追加した特定のアドインのみが許可されている場合もあります。

    ・自動的に起動するプログラムの場合   当該プログラムは、自動的に起動したものである場合があります。たとえば、Outlook オブジェクト モデルの Item.Send メソッドを使用して電子メール メッセージの自動送信を試みるプログラムなどです。

    以上、参考まで。

    • 回答としてマーク 佐伯玲 2016年6月27日 2:20
    2016年6月13日 7:40
  • やきさま、LazyDoggさま ありがとうございました。
    頂いた回答を基に新たに検索する等して、以下の方法で希望の動作をさせることができました。

    ・PowerShellのセキュリティの設定を"RemoteSigned"に変更

    ・タスクスケジューラの操作設定
            プログラム/スクリプト:powershell.exe
            引数の追加:-command "ps1のフルパス"
            開始:ps1のあるフォルダのフルパス

    ・ps1ファイルの内容
    -------------------------------------------------------------------------------

    cd (Split-Path $MyInvocation.MyCommand.Path -Parent)
    # 送信内容
    $filedate1 = Get-Date -Format "MMdd-HHmm";
    $filedate2 = Get-Date -Format "MM";
    $filedate3 = Get-Date -Format "dd";
    $To="*****@*****.co.jp"
    $From="*****@*****.co.jp"
    $Subject="定期データ送信 $filedate1"
    $body="$filedate2 月 $filedate3 日のデータ定期送信"
    # 添付ファイル
    $FilePath="C:\*****.txt"

    # 送信サーバー設定
    $SMTPServer="*****"
    $Port="***"
    $User="*******"
    $Password="*****"

    # SMTP認証
    $str = ConvertTo-SecureString $Password -AsPlainText -Force
    $psc = New-Object System.Management.Automation.PsCredential($User, $str)

    # メール送信
    Send-MailMessage -To $To -From $From -Subject $Subject -Body $body -Attachments $FilePath -SmtpServer $SMTPServer -Port $Port -Credential $psc -Encoding UTF8
    -------------------------------------------------------------------------------

    当初は単純に「Outlookをタスクスケジューラで起動すれば何とかなりそう」程度の知識しか無かったので、ここでアドバイス頂かなければ未だに彷徨っていたかと思います。ありがとうございました。

    また、Outlookが(当たり前ですが)しっかりとしたセキュリティを有していることが判ったのも収穫でした。

    • 回答としてマーク 佐伯玲 2016年6月27日 2:20
    2016年6月13日 9:59