2011-09-01 18 views
20

ASP MVC3プロジェクト経由でSmtpClientクラスを使用して電子メールを送信しようとしているときに、私のサーバーで奇妙なことが起こっています。これは私が使用しているコードです。.NET SMTPクライアント - クライアントにこの送信者として送信するアクセス許可がありません

try 
{ 
    var client = new SmtpClient("MailServer"); 
    client.UseDefaultCredentials = true; 

    MailMessage message = new MailMessage("[email protected]", "[email protected]", "Test Message", "Test Body"); 
    client.Send(message); 
} 
catch (Exception ex) 
{ 
    // Do Nothing 
} 

私は3つの環境に導入しました。

Mailbox unavailable. The server response was: 5.7.1 Client does not have permissions to send as this sender using username 

ことができます誰:Windows 7の上(VS 2010 IISを使用して)それは最終的に私は次のエラーを取得するのWindows 2008 R2 II7サーバー上で、電子メールの罰金を送り、Windows 2003のIIS6マシン上で、電子メールの罰金を送信しますこれを引き起こしている可能性のあることについて助言する。私はUser.Identity.Nameを見ると、空の文字列を返していることに気付きました。

+0

奇妙なことに、匿名のアカウントを無効にして、特定のユーザーを偽装して動作するかどうかを確認してください。 –

+0

こんにちは、次のように置き換えてください:client.UseDefaultCredentials = false; client.Credentials = new NetworkCredential( "myAccount"、 "myPassword"、 "myDomain"); 電子メールは正常に送信されます。 – StrictlySocial

+0

okですが、コードにpwdとusernameを入れないで、最低限のWeb設定で使用してください! –

答えて

15

メールサーバーは匿名電子メールの送信をサポートしておらず、メールサーバーに登録されている資格情報を指定する必要があります。

あなたはそうのような資格情報を指定することができます。

client.UseDefaultCredentials = false; 
client.Credentials = new System.Net.NetworkCredential("username", "password"); 

は、この情報がお役に立てば幸いです。

+1

こんにちは、私は私のdevのマシンまたは私たちの他のサーバーのいずれかにいるときにネットワーク資格情報を提供せずにメールサーバーを使用することができます。それは私が問題を抱えているWin2008サーバー上にのみです。 – StrictlySocial

+0

@ StrictlySocial - アプリケーションプールIDに使用される構成済みのアカウントに十分な特権がない可能性はありますか? – jdavies

+0

現時点ではApplicationPoolIdentityに設定されています。IISでこのレベルに達したときに迷子になります。 – StrictlySocial

0

User.Identity.IsAuthenticatedは、問題がfalseである場合は何を返しますか?認証されていないユーザーとしてメールを送信しようとしています。

+0

こんにちは、それはfalseを返します。私はどのように真実に戻ることになるでしょうか?私の知る限り、Windows認証は有効です。 web.config内では次のような認証モードがあります。 – StrictlySocial

+0

匿名認証も無効にする必要があります。私は通常、web.configではなくIIS管理GUIを通じてIISレベルでこれを行います。また、この場合、User.Identity.Nameは空の文字列であり、nullであると予想します。 –

+0

IIS7 GUI内で、私は匿名認証、ASP.NET偽装、およびフォーム認証を無効にしました。 Windows認証のみが有効です。 – StrictlySocial

6

交換サーバーを使用していて、ログオンアカウントと送信者電子メールが異なる場合は、「送信する権限がありません...」というエラーが表示されます。これはアカウント権限のためです。ログオンアカウントに「送信者」アクセス許可を与える必要があります。あなたはすべてのものを試してみて、それがまだ失敗しているしている場合

+0

ありがとう、それは役立ちます。http://tom.603global.com/KB/a8/how-to-grant-send-as-permissions-one-account-ms-exchange.aspxにアクセス許可を与える方法についての記事があります。注意するには、ADとメールサーバーにアクセスする必要があります。これは必ずしも利用可能ではありません。 –

5

私はweb.configファイル

<system.net> 
<mailSettings> 
    <smtp from="[email protected]"> 
    <!--network host="EXCH-SERVER" port="25" userName="userName" password="password" defaultCredentials="false" /--> 
    <network host="EXCH-SERVER" port="25" /> 
    </smtp> 
</mailSettings> 

1

から認証情報を削除し、この問題を解決するため、一つの可能​​性は、サーバが唯一の匿名ユーザーを受け入れるということです。あなたが資格情報を使用して接続しようとした場合:

  • defaultCredentials="true"
  • defaultCredentials="false" userName="foo" password="false"

次に、サーバがエラー.NET SMTP Client - Client does not have permissions to send as this senderを返します。

奇妙だが、最後の手段として、単純な方法を試してください。

  • defaultCredentials="false"
0

は同じ問題を持っていた - ASP.Netから資格情報は何かするつもりはありませんし、私の環境で電子メールを送信する可能性があります。だから私は(もNTLMが常に正しい仕事と私はweb.configファイルでのメール設定情報を入れていたことはありませんという可能性を含む)混乱してこのパスを考え出し:

System.Net.Configuration.SmtpSection section = ConfigurationManager.GetSection("system.net/mailSettings/smtp") as System.Net.Configuration.SmtpSection; 

// set up SMTP client 
SmtpClient smtp = new SmtpClient(); 
System.Net.CredentialCache myCache = new System.Net.CredentialCache(); 
NetworkCredential myCred = new NetworkCredential(section.Network.UserName, section.Network.Password); 
string host = section.Network.Host; 
int port = section.Network.Port; 

// do this because NTLM doesn't work in all environments.... 
if (myCred != null) 
{ 
    myCache.Add(host, port, "Digest", myCred); 
    myCache.Add(host, port, "Basic", myCred); 
    myCache.Add(host, port, "Digest-MD5", myCred); 
    myCache.Add(host, port, "Digest MD5", myCred); 
    myCache.Add(host, port, "Plain", myCred); 
    myCache.Add(host, port, "Cram-MD5", myCred); 
    myCache.Add(host, port, "Cram MD5", myCred); 
    myCache.Add(host, port, "Login", myCred); 

    //myCache.Add(host, port, "NTLM", myCred); 
} 
smtp.Credentials = myCache; 
smtp.UseDefaultCredentials = false; 
//smtp.EnableSsl = true; 

構成に応じて、最後の行のコメントを解除する必要があるかもしれません。

0

私にとって、それは別の資格情報使用していた - 私が使用していたネットワーク資格情報に

-

new NetworkCredential(smtpUser, smtpPassword) 

とFROMADDRESS

電子メールを送信するときにFROMADDRESSが実際と異なる
var fromAddress = new MailAddress("[email protected]", string.Empty); 

中をネットワーク資格情報によってこの問題が解決されます。 下記を参照してください -

using (var message = new System.Net.Mail.MailMessage(fromAddress, toAddress) 
       { 
        Subject = Keys.MailSubject, 
        Body = body, 
        IsBodyHtml = true 
       }) 
       { 
        smtp.Send(message); 

       } 

簡単な修正は、ネットワーク資格情報の一つとして同じメールの両方を維持することです。

+0

私は同じ問題があります。差出人アドレスがネットワーク資格情報と異なるため、認証が失敗します。これを回避する方法はありますか?ご案内ください。 – juilee

0

Visual Studio 2013を実行しているパッケージを使用して1つのことができました。 SMTP接続マネージャーエディターで 'Use Windows Authentication'タグを削除しました。

関連する問題