2017-12-19 8 views
0

MVC5 응용 프로그램을 사용하여 전자 메일을 보내려고합니다. 이를 위해 NuGet 패키지 관리자를 통해 Mailkit v 1.22.0을 설치했습니다. 그리고이 같은 내 코드는 모습입니다 : 잘못된받는 사람 이메일 주소를 입력 한 경우를 제외하고 잘 작동MVC5 메일 키트가 잘못된 전자 메일 주소로 전자 메일을 보냅니다.

var FromAddress = "[email protected]"; 
    var FromAddressTitle = "My Org"; 
    var connection = ConfigurationManager.ConnectionStrings["SmtpServer"].ConnectionString; 

    var Email = new MimeMessage(); 
    Email.From.Add(new MailboxAddress(FromAddressTitle, FromAddress)); 

    var AddressArray = value.SentTo.Split(';'); 
    foreach (var item in AddressArray) 
    { 
     Email.To.Add(new MailboxAddress(item)); 
    } 

    Email.Subject = value.Subject;   
    Email.Body = new TextPart("html") 
    { 
     Text = value.Content 
    }; 

    using (var client = new SmtpClient()) 
    { 
     client.Connect(connection); 
     client.Send(Email); 
    } 

    return "Email Successfully Sent"; 

는 응용 프로그램이 이메일이 실제로 전송 된 경우 감지하지 않거나,하지 (client.Send (이메일) void를 반환합니다. 수신자에게 실제로 보내지는지 여부를 알 수있는 방법이 있습니까? Mailkit으로 가능하지 않다면, 이것을 할 수있는 다른 NuGet 패키지가 있습니까?

+0

가장 좋은 방법은 반송파 처리 및 처리 기능이있는 [SendGrid] (https://sendgrid.com)와 같은 외부 서비스를 사용하는 것입니다. –

답변

1

SmtpClient.Send()가 void를 반환하는 이유는 SMTP 프로토콜이 메시지 배달 성공 여부를 지정하지 않기 때문입니다. 클라이언트가 메시지를 서버에서 수락했는지 여부를 알 수있는 모든 것 (MailKit은 예외를 throw합니다).

메시지가 성공적으로 배달되었는지 여부를 알아야 할 경우 보낸 분개 메시지가 있는지 확인해야합니다. 몇 분에서 몇 시간이 걸릴 수 있습니다.

먼저해야 할 일은 SmtpClient이고 서브 클래스는 GetEnvelopeIdGetDeliveryStatusNotifications입니다.

그런 다음 바운스 메시지를 받으면 최상위 MIME 부분은 일반적으로 multipart/report (MimeKit을 사용할 때 MultipartReport 개체로 표시)입니다. 이 multipart/report은 하나 이상의 수신자에 대한 배달 상태에 대한 세부 정보를 지정하는 헤더와 유사한 필드 목록을 포함하는 message/delivery-status MIME 부분 (기타 포함 가능)을 포함합니다.

MimeKit가 (당신이 많이 구문 분석

예를 들어 (가. 당신이 사용하고자하는 StatusGroups 속성을 포함하는 MessageDeliveryStatus 클래스가 그러나 MimeKit가 무엇 하지 할 개별 필드 값을 구문 분석이다 그들은하지만,) 당신이 할 Split(';') 일반적으로 몇 년대는 몇 가지 빠른 & 더러운 분석을위한 충분한 IIRC해야합니다 위해 어려운해서는 안됩니다.

당신은 https://tools.ietf.org/html/rfc3464

MimeKit에서 이것에 대한 사양을 읽고 싶은 것

위에 링크 된 문서는 어느 섹션을 닫을 지 지정합니다. 나는 (2.2와 2.3을 생각한다).

Original-RecipientAction 필드를 구체적으로 살펴 보는 것이 좋습니다.

original-recipient-field = 
     "Original-Recipient" ":" address-type ";" generic-address 

    generic-address = *text 

    action-field = "Action" ":" action-value 

    action-value = 
     "failed"/"delayed"/"delivered"/"relayed"/"expanded" 

은 또한에보고되는 메시지를 파악하기 위해 Original-Envelope-Id 필드가 필요합니다

original-envelope-id-field = 
       "Original-Envelope-Id" ":" envelope-id 

    envelope-id = *text 

envelope-id 텍스트가 SmtpClient 클래스에 GetEnvelopeId 구현에 의해 반환 된 동일한 문자열입니다.

관련 문제