2017-01-16 13 views
0

Я пытаюсь отправить электронное письмо с SmtpClient.SendMailAsync, и он не работает, хотя работает синхронная версия (SmtpClient.Send).UserManager.SendEmailAsync не отправляет

Мой синхронный код:

  MailMessage msg = new MailMessage(); 
      msg.To.Add(new MailAddress("[email protected]", "SomeOne")); 
      msg.From = new MailAddress("[email protected]", "You2"); 
      msg.Subject = "This is a Test Mail"; 
      msg.Body = "This is a test message"; 
      msg.IsBodyHtml = true; 

      SmtpClient client = new SmtpClient(); 
      client.UseDefaultCredentials = true; 
      client.Port = 25; 
      client.Host = "mail.group.com"; 
      client.DeliveryMethod = SmtpDeliveryMethod.Network; 
      client.EnableSsl = true; 
      client.Send(msg); 

Мой асинхронный код электронной почты (я просто модифицировали EmailService: класс IIdentityMessageService):

public Task SendAsync(IdentityMessage message) 
{ 

    const string sentFrom = "[email protected]"; 

    // Configure the client: 
    var client = new SmtpClient("mail.group.com") 
    { 
     Port = 25, 
     DeliveryMethod = SmtpDeliveryMethod.Network, 
     UseDefaultCredentials = true, 
     EnableSsl = true 
    }; 

    // Create the message: 
    var mail = new MailMessage(sentFrom, message.Destination, message.Subject, message.Body); 

    // Send: 
    return client.SendMailAsync(mail); 
} 

Edit: код вызова генерируется Visual Studio, вот это это:

public async Task<ActionResult> Register(RegisterViewModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; 
       var result = await UserManager.CreateAsync(user, model.Password); 
       if (result.Succeeded) 
       { 
        await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false); 

        // Send an email with this link 
        string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); 
        var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); 
        await UserManager.SendEmailAsync(user.Id, "Confirmer votre compte", "S'il vous plaît, cliquez le lien suivant : <a href=\"" + callbackUrl + "\">Activation</a>"); 

        return RedirectToAction("Index", "Home"); 
       } 
       AddErrors(result); 
      } 

      // If we got this far, something failed, redisplay form 
      return View(model); 
     } 
+0

Почему бы не пожариться и не забыть? просто измените метод на 'async void' и вызовите wait в' client.SendMailAsync (mail) ' – Lucas

+0

Потому что это уже похоже на код, сгенерированный MVC. Хорошее имя :-) – MusicAndCode

+0

Это, скорее всего, комбинация http://stackoverflow.com/questions/22797845/asp-net-identity-2-0-how-to-implement-iidentitymessageservice-to-do-async-smtp и http://stackoverflow.com/questions/15021304/an-async-await-example-that-causes-a-deadlock –

ответ

0

В настоящий момент вы возвращаете Task вместо void, вам необходимо убедиться в том, что вы указали код await, возвращенный Task, или используйте .Wait().

В этом случае нет необходимости, чтобы сделать ваш SendAsync метод async и awaitSendMailAsync вызова, но если у вас есть сомнения, то, как правило, нужно просто, чтобы избежать некоторых неприятных случаев краев.

+0

Да, это то, что я пробовал до этой версии, но до сих пор не добился успеха – MusicAndCode

+0

Пожалуйста, покажите нам код вызова – Stuart

+0

Итак, что происходит, когда вы его отлаживаете, он проходит через эти методы в порядке? Есть ли исключение? – Stuart