トップ回答者
PowerShellでメール送信ができない

質問
-
最近PowerShellを使用することになり、メールの送信を実施したかったのですが、
何度も "操作がタイムアウトしました。" との表示が出てしまい、メール送信ができません。
PowerShellの内容に不備があるのでしょうか。
解決策がありましたら、ご教授くださると助かります。
(telnetでの接続は可能となっております。)
-------------------------------------------------------------------------------------
【PowerShellの内容】
$user = "ユーザ名"
$pass = "パスワード"
$SmtpHost = "ホスト名"
$FromAddr = "メールアドレス"
$SmtpPort = ポート
$ToAddr = "メールアドレス"$mail = New-Object System.Net.Mail.MailMessage
$mail.from = $FromAddr
$mail.to.Add($ToAddr)
$mail.Subject = "Test Mail"
$mail.Body = "This is a test mail."$sc = New-Object Net.Mail.SmtpClient($SmtpHost)
$Credentials = new-object System.Net.networkCredential($user, $pass)$sc.UseDefaultCredentials = $false
$sc.EnableSsl = $true
$sc.Credentials=$Credentials
$sc.Port = $SmtpPort
$sc.Send($mail)【エラー内容】
"1" 個の引数を指定して "Send" を呼び出し中に例外が発生しました: "操作がタイムアウトしました。"
発生場所 行:1 文字:9
+ $sc.Send <<<< ($mail)
+ CategoryInfo : NotSpecified: (:) []、MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException-------------------------------------------------------------------------------------
回答
-
接続先のSMTPサーバーは自社でホストしているものですか?それともどこかのプロバイダでホスト(レンタルを含む)しているものですか?
前者なら、サーバーの管理者に接続についての詳細をレクチャーしてもらう必要があると思います。
後者なら、SSLで接続するなら、ポートの指定を行わず($sc.Port=$SmtpPortの行をカット)、OP25対応だけすれば平文送信でいいのなら、SSLを有効にしない($sc.EnableSsl=$trueの行をカット)ことで対応できると思います。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
- 回答としてマーク 牟田口大介Moderator 2013年7月18日 11:14
すべての返信
-
SmtpClient.EnableSslプロパティによるとポート465に接続するとのことですが。そもそもtelnetでsslが喋れるとは感服します。
-
接続先のSMTPサーバーは自社でホストしているものですか?それともどこかのプロバイダでホスト(レンタルを含む)しているものですか?
前者なら、サーバーの管理者に接続についての詳細をレクチャーしてもらう必要があると思います。
後者なら、SSLで接続するなら、ポートの指定を行わず($sc.Port=$SmtpPortの行をカット)、OP25対応だけすれば平文送信でいいのなら、SSLを有効にしない($sc.EnableSsl=$trueの行をカット)ことで対応できると思います。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
- 回答としてマーク 牟田口大介Moderator 2013年7月18日 11:14
-
あ、ちょっと文章があやふやすぎましたね。
一般的な(特殊な処理を施していない)サーバーなら
- SMTP over SSL で標準ポートに接続する(SSLを有効にする、接続ポートは指定しない)
- OP25対応ポートに接続する(SSLは有効にしない、接続ポートに587を指定する)
- 標準構成で接続する(SSLは有効にしない、接続ポートは指定しない)
のどれかになると思います。
組み合わせ的に、2番が試されていないようなので、2番を試してみるとよいかもしれません。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
-
パケットキャプチャツール (WireShark など) を使って、SmtpClient と SMTP サーバーのコマンド/レスポンスをキャプチャーして、どこで問題が起こっているのか調べられないのでしょうか?
以前、SmtpClient と自分が使用しているプロバイダの SMTP サーバーとの相性の問題で、SMTP 認証に失敗するという問題がありました。詳しくは以下のページを見てください。
http://surferonwww.info/Hobby/Computer/PcPage7.aspx
今回の問題とは関係ないかもしれませんが、パケットキャプチャツールなしで同種の問題の原因を探るのは難しいと思います。
-
佐祐理さま とっちゃんさま SurferOnWwwさま
さきほど、サーバー管理者に伺い、
ポートを開放していただくことで、
メール送信をすることができました。ご迷惑をおかけしまして、すみませんでした。
佐祐理さま
telnetでは、自社でホストしているSMTPサーバーに接続できたため、
PowerShellでメール送信が可能と考えておりました。SurferOnWwwさま
ツールに関して、教えていただき、ありがとうございます。
どこで問題が発生しているかわからなかったため、助かります。
今後はパケットキャプチャツールを使用し、
問題の原因を探ろうと思います。 -
解決して何よりですが、
telnetでは、自社でホストしているSMTPサーバーに接続できたため、
PowerShellでメール送信が可能と考えておりました。まさか「HTTPでつながるならFTPでもつながって当然」のような論理で「telnetでの接続は可能となっております」と書かれたのでしょうか? それはいくらなんでも横暴であり、誤解を招きます。
一般的に「telnetでの接続は可能」という場合、telnetクライアントを用いて当該サービスに接続し動作確認することを意味します。SMTPもHTTPもFTPも人間の可読な形式なため、例えばSMTPに於いてはHELOコマンドやHELPコマンドを入力しSMTPサーバーからの応答を確認します。
-
こんにちは。
投稿主様はもう解決されていることと思いますが、同様の問題が発生している他の方向けに...
$sc.EnableSsl = $true
と
・ポートを「465」に接続
を拝見した限り、接続方式はもしかして SMTPS (SMTP over SSL) ではないでしょうか?
一般に SSL 接続と称される場合、STARTTLS と SMTP over SSL の2種類がありますので、注意が必要です。System.Net.Smtp.SmtpClient オブジェクトは、STARTTLSは扱えますが、SMTPSは現在サポートされていないそうです(地道にTCP接続をして、SMTPSでメール送信をするサンプルコードをネット上でシェアして下さっている方もいらっしゃいます)。
http://msdn.microsoft.com/ja-jp/library/system.net.mail.smtpclient.enablessl.aspx
- 編集済み Always fresh 2014年1月8日 2:17