2017-06-15 23 views
2

PowerShellスクリプトから電子メールを送信しようとしていますが、SMTPサーバーで正しく認証されていないようです。SmtpClientがPowerShellスクリプトで認証されないのはなぜですか?

$fromEmail = '[email protected]'; 
$toEmail = '[email protected]'; 
$mailUser = 'myUsername'; 
$mailPassword = 'myPassword'; 
$smtpServer = 'smtp.example.com'; 
$smtpPort = 587; 
$content = 'Email message content'; 
$subject = 'Email message subject'; 

$credentials = New-Object System.Net.NetworkCredential $mailUser, $mailPassword; 

$server = New-Object System.Net.Mail.SmtpClient $smtpServer, $smtpPort; 
$server.UseDefaultCredentials = $false; 
$server.EnableSSL = $true; 
$server.Credentials = $credentials 
$server.Send($fromEmail, $toEmail, $subject, $content); 

上記をpowershellプロンプトで実行しようとすると、リレーアクセスが拒否されたというエラーが発生します。私はThunderbirdやPHPのではSwiftMailerと同じサーバーとクレデンシャルの設定を使用して電子メールを送信してください場合

Exception calling "Send" with "4" argument(s): "Client does not have permission to submit mail to this server. The 
server response was: 4.7.1 <[email protected]>: Relay access denied" 
At line:1 char:1 
+ $server.Send($fromEmail, $toEmail, $subject, $content); 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : SmtpException 

は、それが正常に動作します。後置ログを見ると、SmtpClientは認証しようとしていないのではなく、匿名でメールを送信しようとしているように見えます。

これは、サンダーバードで作られた優れたログエントリは次のようになります。私もGmailアドレスを経由して送信しようとしたテストとして

Jun 14 22:11:16 services postfix/submission/smtpd[16824]: connect from unknown[xxxx] 
Jun 14 22:11:16 services postfix/submission/smtpd[16824]: NOQUEUE: reject: RCPT from unknown[xxxx]: 454 4.7.1 <[email protected]>: Relay access denied; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<WTFv2> 

:SmtpClientによって作られたエントリがどのように見えるのに対し

Jun 14 21:17:42 services postfix/submission/smtpd[16653]: connect from unknown[xxxx] 
Jun 14 21:17:43 services postfix/submission/smtpd[16653]: 59074F96E: client=unknown[xxxx], sasl_method=PLAIN, [email protected] 

私のGmail資格情報を使用し、それも認証なしで失敗しました。

Exception calling "Send" with "4" argument(s): "The SMTP server requires a secure connection or the client was not 
authenticated. The server response was: 5.5.1 Authentication Required. Learn more at" 
At line:1 char:1 
+ $server.Send($fromEmail, $toEmail, $subject, $content); 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : SmtpException 

私はここで何が欠けていますか? .net SmtpClientがメールを通過させるために認証を送信しないのはなぜですか?

+0

[電子メールを送信するためのSend-MailMessageコマンドに資格情報を渡す方法](https://stackoverflow.com/questions/12460950/how-to-pass-credentials-to-the-send-mailmessage-メールを送信するためのコマンド) - 特にSSLを使う必要があるかもしれません。あるいは、新オブジェクトのパラメータを '$ credential = New-Object System.Net.NetworkCredential($ mailUser、$ mailPassword) ' – TessellatingHeckler

+0

私はSSLを有効にしています。かっこを追加しても差はありません。 – kicken

答えて

1

これを引き起こして少なくとも二つの問題がありました表示されます問題。結局、どのような組み合わせが最終的に問題を解決したのかよく分からないほど多くのことを試みました。

まず、私の問題はサーバがPLAIN認証方式のみを提供していることによるものだと判断しました。 SmtpClientは、TLS対応の接続であってもPLAINを使用しないようです。 SmtpClientが提供された認証方法のいずれもサポートしていない場合、SmtpClientは認証なしでそのまま続行します。

サポートされている認証方法のリストを検索しようとしましたが、これもできませんでした。 This blog postは、NTLMとLOGINの試行につながっています。 NTLMでは認証しようとしましたが、正常に実行できませんでした。最終的にLOGINは正常に動作しました。

問題の2番目の部分は、基本的な問題が何であるか完全にはわかりません。私はコードをC#に変換し、そこでコンパイルしてテストプログラムを走らせることにしました。そのプログラムはバットからすぐに働いた。私はPowershellに戻り、私のコードをもう一度試して、違いを見つけることができたかどうかを突き止め、突然それも働き始めました。

何とかC#バージョンをコンパイルして実行すると、Powershellバージョンも動作します。なぜ誰かがこれがなぜ私が知りたいと思うかも説明できるか。

1

あなたがこの方法を試すことができ、これは私がGmailに使用するもので、私は(私のC#コードから来る)資格情報System.Net.NetworkCredentialを使用します。

$smtpServer = "smtp.gmail.com" 
$smtpServerport = "587" 
$emailSmtpUser = "[email protected]" 
$emailSmtpPass = "toto.123" 

$emailMessage = New-Object System.Net.Mail.MailMessage 
$emailMessage.From = "[email protected]" 
foreach ($addr in $to) 
{ 
    $emailMessage.To.Add($addr) 
} 
foreach ($attachment in $attachments) 
{ 
    $emailMessage.Attachments.Add($attachment) 
} 
$emailMessage.Subject = "The subject" 
$emailMessage.IsBodyHtml = $true 
$emailMessage.Body = $body 

$smtpClient = New-Object System.Net.Mail.SmtpClient($smtpServer , $smtpServerport) 
$smtpClient.EnableSsl = $true 
$smtpClient.Credentials = New-Object System.Net.NetworkCredential($emailSmtpUser , $emailSmtpPass); 

$SMTPClient.Send($emailMessage) 
+0

これも私にとってはうまくいかないようです。私は自分のサーバーとgmailの両方を試してみましたが、どちらも質問と同じエラーで失敗します。 – kicken

関連する問題