質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

2回答

26938閲覧

VBSでのメール送信(CDO.Message)で頻繁にエラーとなってしまう

masa_uchi

総合スコア9

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2020/02/10 08:07

編集2020/02/17 07:56

イメージ説明

VBScriptの機能を用いてメールの送信をサーバー側(Windows Serverv2016)でおこなっております。

現象としまして、
送信できるときもあれば失敗するときもあるような状況でして、
具体的に掘り下げますと、ユーザーがRemoteApp機能を用いて起動されたアプリケーションを操作し、
メールを一度に4通ほど送信すると失敗するときがあり、その際にはエラーメッセージが表示されます(エラー内容は下記に記載)。
※試行回数は少ないですが、8割方失敗。失敗するときは4通すべて失敗します。

2割成功するわけですが、そのときは大体、ユーザーからメールが送信されていないとお問い合わせいただき、
私がサーバーへとリモートで接続し、管理者権限を有するAdministratorユーザーでサーバーにログオン後、
ユーザーに全く同じ操作をしていただくと送信されるというような挙動をします。

これに関してはたまたま運が良く送信されただけで、
私の接続有無は関係がないかもしれません。
(管理者権限で誰かがログオンしていることがVBScriptの実行可否と関係があるとは思えないのですが・・)

ユーザーの環境下ということもあり、
SMTPサーバーのログを調べたりといったことが
なかなか難しく困っております。

とりあえず同じような環境を構築して
検証してみてもこういった問題は発生しませんでした。。
※同じような環境とは、サーバーを用意し、RemoteApp経由で同じプログラム且つ、
同じVBScriptを用意し実行できる環境。唯一異なる点といえばサーバーへと接続する際にに用いる
ユーザーは管理者権限を有するユーザー。

なんでも構いません。
「こういった可能性がある」や、「VBScriptはこういう仕様」といったり、
「コーディングに甘い箇所がありこうすべき」などございましたらアドバイスをいただけませんでしょうか。。

発生しているエラーメッセージ

Windows Script Host

スクリプト:D:\~(VBSの場所)
行:27
文字:1
エラー:転送においてサーバーに接続できませんでした。
コード:80040213
ソース:CDO.Message.1

VBScriptの内容 ※送信先のAddress、件名や本文は引数で渡ってきます

Dim oParam Dim strTo ' メール宛先 Dim strSubject ' 件名 Dim strBody ' 本文 Set oParam = WScript.Arguments strTo = oParam(0) strSubject = oParam(1) strBody = oParam(2) Set objMail = CreateObject("CDO.Message") objMail.From = "送信者 <send@xxxxxx.co.jp>" objMail.To = strTo objMail.Subject = strSubject objMail.TextBody = strBody objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "SMTPサーバー" objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "send@xxxxxx.co.jp" objMail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "パスワード" objMail.Configuration.Fields.Update objMail.Send

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/02/10 08:13

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
masa_uchi

2020/02/10 08:23

y_waiwai様 ご指摘くださいましてありがとうございます!
dodox86

2020/02/10 08:57

同じ送信先、あるいは送信用smtpサーバーに、短い間隔で何度も送っている、と言うことはありませんか。
ikapy

2020/02/10 09:52

dodox86様の通りだと思います。
masa_uchi

2020/02/10 10:23

dodox86様、ikapy様 ご親切に回答くださいまして本当にありがとうございます! たしかにこのVBScriptのファイルを一度に2回(=複数回。間隔は非常に短いです) 実行することがありまして、 その場合は2回ともエラーとなる挙動をしております。 2回目だけエラーではなく、  ・2回ともエラーとなってしまっていた  ・普通に送信できているときもある こうした背景から、短い間隔での送信が原因という選択肢は除外しておりました。。。 早速、実行間隔をそれなりに空けるようにたうえで 1日ほど様子をみてみたいと思います。 重ね重ねではございますが回答くださり本当にありがとうございます! 結果が分かり次第、追記させていただきます。
dodox86

2020/02/10 10:31 編集

smtpサーバーはスパムやその他、セキュリティ対策の為に一定時間内での同じクライアントからの接続を制限している場合があります。(単純に切断の後の再接続が早すぎるだけかもしれませんけど) teratailの過去の質問回答にも似たようなものがいくもありますので検索してみてください。もし解決に至ったら自己解決で良いと思いますので、ご自分で回答の上、質問を閉じてもらえると良いです。
CHERRY

2020/02/12 09:52

smtp サーバー側のログを見ることができるなら原因の特定が早いと思いますが、smtp サーバーのログを見ることは可能ですか?
masa_uchi

2020/02/17 05:33

dodox86様 CHERRY様 ご返信が大変遅くなりましてすみません。 状況としましては未だ解決しておらず、 送信されないといった状況が続いており調査している段階にあります。 不思議なことに全く送信されないわけではなく、 私がVBSが設置されているお客様のサーバーへとリモートで接続し、その状態でお客様がメールが一斉送信されるプログラムを実行すると送信されるという現象が発生しております。。 つまり関係があるのかは別として、私がサーバーへと接続している状況下では問題なく送信され、そうでないときには送信されないというそんな状況です。 smtpサーバー側のログは交渉に時間がかかりそうですが、早速お願いしてみようと思います! 状況のご報告が遅くなりましてすみません。 進展がございましたら改めてご報告させていただきます! ご親切にしていただき本当にありがとうございます。
dodox86

2020/02/17 05:40

> リモートで接続し、その状態でお客様がメールが一斉送信されるプログラムを実行すると送信されるという現象が発生しております。。 当該送信プログラムについて、リモートで接続しているときのアカウントと接続していないときに使われるアカウントが異なるということはありませんか。アカウントが違えば、実行時の環境変数その他、状況が変わります。
masa_uchi

2020/02/17 08:05

dodox86様 ご返信くださりありがとうございます! アカウントはたしかに異なります。 環境変数は私も真っ先に考え、もしかしたらそもそもVBScriptのファイルが起動ができていないのかな?(つまりVBSが設置されているパス)とも考えたのですが、調べますとVBS自体は起動はできており、VBSのコーディング自体には環境変数に関係しそうな要素もなかったため、環境変数の線は排除しました。。 ユーザーに管理者権限があるかどうかが影響しているという可能性もありますので、初心にかえり一度整理してみようと思います! 何度も親身になって考えてくださり本当にありがとうございます!
ikapy

2020/02/17 09:48

MTAでSMTPする時、1メール毎にEHLO~QUITしていませんか。 QUITするとセッションが切れるので、短い間に何回もSMTPするとメールサーバーの接続制限にひっかかるかもです。 一つのEHLO~QUITに複数のメールコンテンツを入れるのが肝です。
guest

回答2

0

自己解決

調査に時間が要してしまいましてすみません。

結論から申しますと先週、無事に解決することができました。
具体的には処理内容云々ではなく、タスクスケジューラーを実行させていた
Windowsユーザーに問題がありました。

設定していたユーザーは「ローカル管理者」にあたる
「administrator」でしたのですが、このユーザーをログオフの状態で実行させますと
プロセス「wscript.exe」がずっと居残り続けるのですが、
ドメイン管理者である「◯◯◯\Administrator」で実行させるとログオンしていなくとも
正常にメールが送信されるようになりました。

ただ、理屈は不明のままです。
推察ではございますが、メールサーバーへ送信する際にローカル管理者だと越権行為にあたる点があったのかなと考えております。

解決するまでに時間を要してしまいましてすみません。。
沢山のアイデアを出してくださり本当にありがとうございました!

投稿2020/04/27 03:05

masa_uchi

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

似たような問題が私のシステムでも発生しました。
メールの送信宛先に”)”半角の)が入っていると、CDOがエラーとなり、メールが発信されません。
)はCDOのヘッダでは禁則文字の様です。
参考になれば、幸いです。
送信出来ない例
To=総理大臣)安倍 <abeーsori@gmail.com>
送信できる例
To=総理大臣)安倍 <abeーsori@gmail.com>

他にも禁則文字があるか調査中です。

関係無ければ無視下さい。

投稿2020/02/19 08:01

RE-NA

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問