2016-06-30 3 views
5

MailKit을 사용하여 프로세스의 자격 증명을 사용하여 Exchange 서버를 통해 전자 메일을 보내고 싶습니다. 작동 도메인/사용자 이름/암호와 NetworkCredential을 구축Mailkit 및 Exchange에서 기본 네트워크 자격 증명을 사용할 수 있습니까?

:

using (var client = new SmtpClient(ProtocolLogger)) 
{ 
    client.Connect(server, port); 

    // Works 
    var creds = new NetworkCredential(username, password, domain); 
    client.Authenticate(creds); 

    client.Send(msg);   
} 

동일한 사용자로 실행하는 동안 나는 CredentialCache.DefaultNetworkCredentials를 사용하는 경우 MailKit.Security.AuthenticationException 실패 :

using (var client = new SmtpClient(ProtocolLogger)) 
{ 
    client.Connect(server, port); 

    // Authentication failure 
    client.Authenticate(CredentialCache.DefaultNetworkCredentials); 

    client.Send(msg);   
} 

ProtocolLogger은 다음을 출력합니다 (메일 서버 및 base64 변경 인코딩 된 문자열) :

Connected to smtp://mymailserver:25/?starttls=when-available 
S: 220 mymailserver Microsoft ESMTP MAIL Service ready at Thu, 30 Jun 2016 12:45:04 +0930 
C: EHLO [172.1.1.2] 
S: 250-mymailserver Hello [172.1.1.2] 
S: 250-SIZE 51200000 
S: 250-PIPELINING 
S: 250-DSN 
S: 250-ENHANCEDSTATUSCODES 
S: 250-STARTTLS 
S: 250-X-ANONYMOUSTLS 
S: 250-AUTH NTLM LOGIN 
S: 250-X-EXPS GSSAPI NTLM 
S: 250-8BITMIME 
S: 250-BINARYMIME 
S: 250-CHUNKING 
S: 250-XEXCH50 
S: 250 XRDST 
C: STARTTLS 
S: 220 2.0.0 SMTP server ready 
C: EHLO [172.1.1.2] 
S: 250-mymailserver Hello [172.1.1.2] 
S: 250-SIZE 51200000 
S: 250-PIPELINING 
S: 250-DSN 
S: 250-ENHANCEDSTATUSCODES 
S: 250-AUTH NTLM LOGIN 
S: 250-X-EXPS GSSAPI NTLM 
S: 250-8BITMIME 
S: 250-BINARYMIME 
S: 250-CHUNKING 
S: 250-XEXCH50 
S: 250 XRDST 
C: AUTH NTLM {EncodedStringRemoved} 
S: 334 {EncodedStringRemoved} 
C: {EncodedStringRemoved} 
S: 535 5.7.3 Authentication unsuccessful 
C: AUTH LOGIN 
S: 334 {EncodedStringRemoved} 
C: 
S: 334 {EncodedStringRemoved} 
C: 
S: 334 {EncodedStringRemoved} 
C: QUIT 
S: 334 {EncodedStringRemoved} 

그것은 true로 UseDefaultCredentials 속성을 설정할 때 System.Net.Mail.SmtpClientDefaultNetworkCredentials를 사용하는 주목할 가치, 그리고이 나를 위해 작동합니다. ProtocolLogging과 같은 추가 기능 때문에 MailKit을 사용하고 싶습니다.

+0

PC에 Outlook 계정이 설정되어 있습니까? 기본 자격 증명이 작동하려면 Outlook 계정이 PC에 설정되어 있어야합니다. 따라서 먼저 사용자 이름과 이메일 계정이있는 로컬 PC에서 Outlook 계정을 설정하여 Outlook 계정을 실행해야합니다. 사용자 이름은 암호를 포함한 사용자 자격 증명이있는 PC의 사용자 계정에 연결됩니다. Windows 자격 증명은 기본 네트워크 자격 증명으로 사용됩니다. 메일 서버와 PC는 그룹 정책을 사용하여 네트워크 암호 서버로 암호를 확인합니다. – jdweng

+0

정보 주셔서 감사합니다. 나에 대한 Outlook 설정을 가지고 내 dev 워크 스테이션에서 테스트 중이 야. 나는 또한이 과정을 실행하고있다. 흥미롭게도, 내장 된'System.Net.Mail.Smt.SClip'을 사용할 때, 작동하기 때문에 MailKit과 기본'SmtpClient'가 전선을 통해 전송하는 것과 차이가 있어야합니다. MailKil에서 할 수있는 것처럼 System.Net.Mail.SmtpClient가 보내고받는 것을 보는 방법을 모르겠습니다. 그것은 이상적 일 수있어서 나는 그들을 비방 할 수있다. – JamesD

+0

데이터 패킷을보기 위해 바이올린과 같은 스니퍼를 사용할 수 있습니다. 일반적으로 Corp Networks는 587과 같은 메일 전자 메일 포트 번호를 차단합니다. Exchange가 작동하는 방식은 전자 메일을 교환기로 전달하는 프록시 서버를 사용한다는 것입니다. Mailkit 사용은 아마도 587을 사용하고 Pop Server입니다. 팝 서버는 DefaultCredentials를 사용하지 않고 사용자 이름과 암호를 포함하며 대개 차단됩니다. – jdweng

답변

3

MailKit이 Credential에게 서버에 보내야하는 사용자 이름과 암호 문자열을 제공하도록 요청할 때 DefaultNetworkCredentials가 MailKit에 사용자 이름과 암호 문자열이 비어있어 MailKit에서 인증을 시도하므로 Mail 키를 사용하여 메시지를 보낼 수 없으므로 CredentialCache.DefaultNetworkCredentials을 MailKit으로 설정할 수 없습니다. 빈 문자열.

System.Net.Mail은 MailKit에서 액세스 할 수없는 실제 문자열을 얻기 위해 내부 API를 사용할 수있는 것 같습니다.

+0

그 이유는 알지만 이해할 수 있습니다.사용자 자격 증명을 저장하지 않아도되므로 내장 클라이언트의 훌륭한 기능입니다. mailkit과 관련된 다른 옵션이 있습니까? – JamesD

관련 문제