none
PowerShellでメール送信ができない RRS feed

  • 質問

  • 最近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

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

    2013年7月16日 9:58

回答

  • 接続先のSMTPサーバーは自社でホストしているものですか?それともどこかのプロバイダでホスト(レンタルを含む)しているものですか?

    前者なら、サーバーの管理者に接続についての詳細をレクチャーしてもらう必要があると思います。

    後者なら、SSLで接続するなら、ポートの指定を行わず($sc.Port=$SmtpPortの行をカット)、OP25対応だけすれば平文送信でいいのなら、SSLを有効にしない($sc.EnableSsl=$trueの行をカット)ことで対応できると思います。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    2013年7月17日 2:15

すべての返信

  • SmtpClient.EnableSslプロパティによるとポート465に接続するとのことですが。そもそもtelnetでsslが喋れるとは感服します。
    2013年7月16日 11:19
  • 接続先のSMTPサーバーは自社でホストしているものですか?それともどこかのプロバイダでホスト(レンタルを含む)しているものですか?

    前者なら、サーバーの管理者に接続についての詳細をレクチャーしてもらう必要があると思います。

    後者なら、SSLで接続するなら、ポートの指定を行わず($sc.Port=$SmtpPortの行をカット)、OP25対応だけすれば平文送信でいいのなら、SSLを有効にしない($sc.EnableSsl=$trueの行をカット)ことで対応できると思います。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    2013年7月17日 2:15
  • 左祐理さま とっちゃんさま

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

    ・ポートを「465」に接続
    ・ポート指定を行わない
    ・SSLを有効にしない

    それぞれテストさせていただきましたが、
    タイムアウトのエラーが発生しました。


    接続先のSMTPサーバーは自社でホストしているため、
    サーバー管理者に接続の詳細を伺い、再度テストしようと思います。

    2013年7月17日 3:15
  • あ、ちょっと文章があやふやすぎましたね。

    一般的な(特殊な処理を施していない)サーバーなら

    1. SMTP over SSL で標準ポートに接続する(SSLを有効にする、接続ポートは指定しない)
    2. OP25対応ポートに接続する(SSLは有効にしない、接続ポートに587を指定する)
    3. 標準構成で接続する(SSLは有効にしない、接続ポートは指定しない)

    のどれかになると思います。

    組み合わせ的に、2番が試されていないようなので、2番を試してみるとよいかもしれません。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    2013年7月17日 4:36
  • とっちゃんさま

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

    2番を試させていただきましたが、
    やはりタイムアウトエラーとなってしまったため、
    一般的な処理では、難しいのかもしれません。

    ご提案くださいまして、ありがとうございました。

    2013年7月17日 9:51
  • telnetではどこに接続したのでしょうか?
    2013年7月17日 12:12
  • パケットキャプチャツール (WireShark など) を使って、SmtpClient と SMTP サーバーのコマンド/レスポンスをキャプチャーして、どこで問題が起こっているのか調べられないのでしょうか?

    以前、SmtpClient と自分が使用しているプロバイダの SMTP サーバーとの相性の問題で、SMTP 認証に失敗するという問題がありました。詳しくは以下のページを見てください。

    http://surferonwww.info/Hobby/Computer/PcPage7.aspx

    今回の問題とは関係ないかもしれませんが、パケットキャプチャツールなしで同種の問題の原因を探るのは難しいと思います。

    2013年7月18日 1:11
  • 佐祐理さま とっちゃんさま SurferOnWwwさま

    さきほど、サーバー管理者に伺い、
    ポートを開放していただくことで、
    メール送信をすることができました。

    ご迷惑をおかけしまして、すみませんでした。

     

    佐祐理さま

    telnetでは、自社でホストしているSMTPサーバーに接続できたため、
    PowerShellでメール送信が可能と考えておりました。

     

    SurferOnWwwさま

    ツールに関して、教えていただき、ありがとうございます。
    どこで問題が発生しているかわからなかったため、助かります。
    今後はパケットキャプチャツールを使用し、
    問題の原因を探ろうと思います。

    2013年7月18日 8:10
  • 解決して何よりですが、

    telnetでは、自社でホストしているSMTPサーバーに接続できたため、
    PowerShellでメール送信が可能と考えておりました。

    まさか「HTTPでつながるならFTPでもつながって当然」のような論理で「telnetでの接続は可能となっております」と書かれたのでしょうか? それはいくらなんでも横暴であり、誤解を招きます。

    一般的に「telnetでの接続は可能」という場合、telnetクライアントを用いて当該サービスに接続し動作確認することを意味します。SMTPもHTTPもFTPも人間の可読な形式なため、例えばSMTPに於いてはHELOコマンドやHELPコマンドを入力しSMTPサーバーからの応答を確認します。

    2013年7月18日 10:10
  • 佐祐理さま

    動作確認ができておらず、
    あまり理解せずに誤解を招く質問をしてしまい、
    大変申し訳ございませんでした。

    今後は動作確認をし、発言に気を付けます。
    すみませんでした。

    2013年7月19日 1:22
  • こんにちは。

    投稿主様はもう解決されていることと思いますが、同様の問題が発生している他の方向けに...

    $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



    2014年1月8日 2:16