2016-08-24 4 views
1

Итак, есть несколько отличных примеров в сети, как использовать Mailkit для отправки электронной почты через SMTP.Mailkit Как отправить и проверить aysynchronous SMTP

Обычно заканчивается:

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

Однако это не хорошо, если асинхронной требуется:

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

Однако то, что я хотел бы знать, когда асинхронная Отправить завершена, или если это не получается. В .Net родных библиотеках это достигается с помощью обратного вызова (обработчик событий).

Возможно ли определить обработчик обратного вызова «Завершено» для MailKit SendAsync, а если нет, то лучше всего обнаружить, удалось ли это или нет.

Благодаря

ответ

2

Вы не хотите иметь такой код:

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

Это отключит до завершения операции асинхронной отправки.

Вместо этого, вы хотите сделать это:

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

Конечно, когда вы ждете задачу асинхронной ... Теперь вам не нужно завершенное событие :)

Это сказало, есть это событие MessageSent, что вы можете подключиться к:

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

+0

Спасибо за бычка. Ожидание лучше, чем обратный вызов. – Hughgo

+0

Смотря чуть ближе, я не уверен, что решение будет работать. Ожидание асинхронного вызова будет только ждать возвращения части Async. Это не будет ждать отправки сообщения. Приведенный выше код может участвовать в гонке и отключать до завершения работы. Лучшим способом сделать это было бы ожидание * синхронных * API. Это гарантирует, что каждый этап будет выполнен до продолжения. – Hughgo

+0

Когда 'client.Send()' возвращается, сообщение будет отправлено. Аналогично, когда управление возобновляется после 'wait client.SendAsync()', сообщение будет отправлено. Не будет никакой гонки. Синхронный API не может «ждать». – jstedfast