public async Task <string> WaitForEmailWithConfirmationCode() { var timeBetweenReceiveAttempts = TimeSpan.FromMilliseconds(100); using (var client = new HttpClient()) { MailHogMessage message = null; while (message == null) { var response = await client.GetAsync( new UriBuilder(this.Services.SmtpServerHttpEndpoint) { Path = "/api/v1/messages" }.Uri); var messages = await MailHogMessage.FromResponse(response.EnsureSuccessStatusCode()); // TODO: Improve the predicate to match on more specific attributes. message = messages.OrderByDescending(m => m.Created).FirstOrDefault(m => m.To.Any(to => to.Equals(new MailAddress(this.CurrentUser.Email)))); if (message == null) { await Task.Delay(timeBetweenReceiveAttempts); } } return(message.Body.Trim()); } }
private static async Task <MailHogMessage> FromReader(JsonReader json) { async Task <string> ReadBody() { await json.ReadAsync(); var body = string.Empty; while (await json.ReadAsync() && json.TokenType != JsonToken.EndObject) { switch (json.Value) { case "Body": body = await json.ReadAsStringAsync(); break; default: await json.SkipAsync(); break; } } return(body); } async Task <MailAddress> ReadMailAddress() { await json.ReadAsync(); var mailbox = string.Empty; var domain = string.Empty; while (await json.ReadAsync() && json.TokenType != JsonToken.EndObject) { switch (json.Value) { case "Mailbox": mailbox = await json.ReadAsStringAsync(); break; case "Domain": domain = await json.ReadAsStringAsync(); break; default: await json.SkipAsync(); break; } } return(!string.IsNullOrEmpty(mailbox) && !string.IsNullOrEmpty(domain) ? new MailAddress(mailbox + "@" + domain) : null); } var message = new MailHogMessage(); await json.ReadAsync(); while (await json.ReadAsync() && json.TokenType != JsonToken.EndObject) { switch (json.Value) { case "ID": message.Id = await json.ReadAsStringAsync(); break; case "From": message.From = await ReadMailAddress(); break; case "To": var addresses = new List <MailAddress>(); while (await json.ReadAsync() && json.TokenType != JsonToken.EndArray) { addresses.Add(await ReadMailAddress()); } message.To = addresses.ToArray(); break; case "Content": message.Body = await ReadBody(); break; case "Created": message.Created = await json.ReadAsDateTimeAsync(); break; default: await json.SkipAsync(); break; } } return(message); }