2012-03-20 18 views
5

私はc#.NET 4.0(私の開発ワークステーションはWindows 7)を使用してWindowsサービスを作成しています。 処理中にエラーが発生した場合は、サービスから直接電子メールを送信することを目的としています。 私は私が達成しようとしていますかを示すためにコードスニペットを含めました:Win7のWindowsサービスからSMTPメールを送信できません

try 
     { 
       string emailAddresses = "[email protected]"; 
       string emailCCAddresses = "[email protected]"; 

       //Send the email 
       using (MailMessage mailMsg = new MailMessage()) 
       { 
        mailMsg.To.Add(emailAddresses); 
        mailMsg.From = new MailAddress("[email protected]"); 
        mailMsg.CC.Add(emailCCAddresses); 
        mailMsg.Subject = " Error Message "; 
        mailMsg.Body = DateTime.Now + " : Invalid File Encountered." ; 

        ////Creating the file attachment 
        using (Attachment data = new Attachment("C:\\users\\sample.xml", MediaTypeNames.Application.Octet)) 
        { 
         //Add timestamp info for the file 
         ContentDisposition disposition = data.ContentDisposition; 
         disposition.ModificationDate = File.GetLastWriteTime("C:\\users\\sample.xml"); 
         mailMsg.Attachments.Add(data); 

        SmtpClient emailClient = new SmtpClient("example.Sample.com", 25); 
        emailClient.DeliveryMethod = SmtpDeliveryMethod.Network; 
        emailClient.UseDefaultCredentials = true; 
        emailClient.Send(mailMsg); 
        } 
       }//end using 

      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.ToString()); 
      } 

私が直面しています問題がある - 電子メールオプションは、任意のWindows 7マシンで勝利サービスから動作しません。しかし、まったく同じコードは完全にうまくWin XPマシンで動作します。警告、これはコンソールアプリケーションとしてテストすることはできません。この動作を確認するには、サービスとして実行する必要があります。私はコンソールアプリケーションに同じコードを入れ、それは私の勝利7マシンで正常に働いた。

さらに、私はtelnetクライアントとサーバーウィンドウの機能を有効にし、コマンドプロンプトから電子メールを正常に送信できました。明示的NetworkCredentialの設定および= falseをUseDefaultCredentialsを設定

  • -

    は、私は(何も働いていない)試してみて、原因を特定するためにいくつかのことを試してみました。 emailClient.Credentials = new System.Net.NetworkCredential( "username"、 "pwd"、 "Domain1");

  • から、私のユーザーIDとPWD

  • ザ・するとアドレスを電子メールで送信するには、サービスのオプションとしてログオンを変更するには、本物の、ダミーではないアドレス(ある私の実際のコードで!)
です

私が見つけることができる唯一の違いは、Windowsサービスがローカルシステムアカウントの下にインストールされていることです。しかしのログをに変更すると、コードに指定されている認証の詳細/資格情報が使用されているはずです。私のオフィスのIT担当者は、自分のメッセージがリレーとして送信されたことがわかりました(私のログインに更新されたときのアカウントとしてのfrom/toとログオンの意味はわかりません)

私が捕まる見る

例外は次のとおりです。

SMTP例外がスローさ:System.Net.Mail.SmtpException:失敗メール送信します。 ---> System.Net.WebException:リモートサーバーに接続できません---> System.Net.Sockets.SocketException:アクセス許可XXX.XXX.XXXによって禁止されている方法でソケットにアクセスしようとしましたSystem.Net.ServicePoint.ConnectSocketInternal(ブールconnectFailure、ソケットS4、S6ソケット、ソケット&ソケットたIPAddress &アドレス、ConnectSocketState状態でSystem.Net.Sockets.Socket.DoConnect(エンドポイントendPointSnapshot、のSocketAddressのSocketAddress)で.XXX XX 、IAsyncResult asyncResult、Int32 timeout、例外&例外)

すべてのアイデアがありがとう!

私はそれがWindows 7のセキュリティポリシー/機能と関係があり、うまくいけばデフォルト設定を変更するように簡単かもしれないと感じています。

+0

ファイアウォールを実行していますか?最初にスローされたSocketExceptionのメッセージ(「アクセス許可で禁止されている方法でソケットにアクセスしようとしました...」)のための簡単なGoogleでは、同じ問題を経験した多くの人々が、ファイアウォールソフトウェアは、ファイアウォールを無効にするか、またはその構成でそのサービスの許可ルールを追加することによって、メールを送信しているサービスを妨げていました。 – Iridium

+0

私はそれについて考えました..しかし、私は、コンソールアプリケーション(同じコード、ちょうどサービスではない)とコマンドプロンプト経由でsmtp電子メールを送信することができました。また、Windows XPマシンでサービスを実行した同僚(同じチームとアクセス権)が電子メールを送信できました。私たちはITでチェックし、ブロックされていないことを彼らに伝えます。 – PreethaA

+0

私はそれが問題の原因となっているサービスが実行されているアイデンティティーであると確信しています。彼らがXPとWin 7の間のデフォルトを変更したかどうかは分かりませんが、IISアプリケーションプールの場合はそれがわかりました。 –

答えて

0

新しい仕事用ノートパソコンのセキュリティポリシーがわかっていて、IT部門が私たちに変更を許可することを拒否しました。私たちのテストサーバーには同じ問題はありません。私たちは、Windows 7でもないので、100%確実にすることはできません。コマンドラインからsmtpがあなたのPCから許可されているかどうかを確認するために電子メールを送信してみてください。

同じコードを使用すると、現在のユーザーとしてサービスを実行することができます任意の制限

1

を肝炎なかった勝利XPまたはWindows Serverマシン上で罰金WHN実行を働きました。サービスインストーラでオプションUSERを選択するだけで、現在のユーザーとして機能します。私は今日同じエラーがあり、私はこの解決策を見つけました。私はそれが誰にとっても役立つことを願っています。 enter image description here

関連する問題