2016-08-24 1 views
1

Mailkit을 사용하여 SMTP를 통해 이메일을 보내는 방법에 대한 좋은 예제가 있습니다.Mailkit 비동기 SMTP를 보내고 검사하는 방법

client.Authenticate(theSMTPUsername,theSMTPPassword); 
client.SendAsync(emailMessage); 
client.Disconnect(true); 

그러나, 내가 알고 싶은 것이 비동기 전송이 완료되면, 또는 경우 : 일반적으로 끝나는

: 비동기가 필요한 경우

client.Authenticate(theSMTPUsername,theSMTPPassword); 
client.Send(emailMessage); 
client.Disconnect(true); 

그러나이 좋지 않습니다 성공하지 못한다. .NET 기본 라이브러리에서는 콜백 (이벤트 핸들러)을 사용합니다.

MailKit SendAsync에 대해 'Completed'콜백 처리기를 정의하고 성공했는지 여부를 알아내는 것이 가장 좋은 방법이 아닌지를 정의 할 수 있습니까? 당신은 다음과 같은 코드를 가지고 싶지 않아

감사

답변

2

:

client.Authenticate(theSMTPUsername,theSMTPPassword); 
client.SendAsync(emailMessage); 
client.Disconnect(true); 

비동기 전송 작업이 완료되기 전에이 해제됩니다.

대신, 당신은이 작업을 수행 할 수 : 당신이 비동기 작업을 기다리고 일단

물론
client.Authenticate(theSMTPUsername,theSMTPPassword); 
await client.SendAsync(emailMessage); 
client.Disconnect(true); 

는 ... 지금 당신이, 완료된 이벤트 :

말했다 필요가 없습니다 조향에 대한

http://www.mimekit.org/docs/html/E_MailKit_MailTransport_MessageSent.htm

+0

감사합니다 : 당신이 연결할 수있는 MessageSent 이벤트입니다. 콜백이 더 좋을 것 같습니다. – Hughgo

+0

조금 더 가까이에서 보면 해결책이 효과가 있다는 것을 확신하지 못했습니다. 비동기 호출을 기다리는 중 비동기 부분이 반환 될 때까지 대기합니다. 메시지를 보낼 때까지 기다리지 않습니다. 위의 코드는 경주가 가능하며 작업이 완료되기 전에 연결을 끊을 수 있습니다. 더 나은 방법은 * synchronous * API를 기다리는 것입니다. 이렇게하면 진행하기 전에 각 단계가 완료됩니다. – Hughgo

+0

'client.Send()'가 반환되면, 메시지가 전송 될 것입니다. 마찬가지로,'await client.SendAsync()'후에 제어가 다시 시작되면 메시지가 전송됩니다. 경주는 없을 것입니다. 동기 API를 '대기'할 수 없습니다. – jstedfast

관련 문제