Подтвердить что ты не робот

UserManager SendEmailAsync Отправлено электронной почты

Я использую следующий код, чтобы попытаться отправить сообщение асинхронно, но не отправляется электронное письмо, и я не уверен, что происходит неправильно. Я также добавил второй сегмент кода в web.config для протокола электронной почты.

Код SendEmailAsync

await UserManager.SendEmailAsync(username.Id, "MTSS-B: Forgot Password", "Here is your new password. Please go back to the MTSS-B web tool and sign in. You will be prompted to create your own password.<br/><br/>" + tmpPass + "<br/><br/>MTSS-B Administrator");

Код Web.config

<system.net>
<mailSettings>
  <smtp>
    <network host="smtp1.airws.org" userName="" password="" />
  </smtp>
</mailSettings>
</system.net>

**** **** UPDATE

Я тестировал, если электронное письмо можно отправить обычным способом, и письмо было отправлено с помощью следующего кода.

MailMessage m = new MailMessage(new MailAddress(ConfigurationManager.AppSettings["SupportEmailAddr"]), new MailAddress(model.Email));
m.Subject = "MTSS-B: Forgot Password"; 
m.Body = string.Format("Here is your new password. Please go back to the MTSS-B web tool and sign in. You will be prompted to create your own password.<br/><br/>Password: " + tmpPass + "<br/><br/>MTSS-B Administrator"); 
m.IsBodyHtml = true;
SmtpClient smtp = new SmtpClient("smtp2.airws.org"); 
smtp.Send(m);
4b9b3361

Ответ 1

В вашем приложении у вас, вероятно, есть файл с именем IdentityConfig.cs в папке App_Start. Вероятно, этот файл имеет что-то похожее вверху:

public class EmailService : IIdentityMessageService
{
    public Task SendAsync(IdentityMessage message)
    {
        // Plug in your email service here to send an email.
        return Task.FromResult(0);
    }
}

измените его на:

public class EmailService : IIdentityMessageService
{
    public Task SendAsync(IdentityMessage message)
    {
        SmtpClient client = new SmtpClient();
        return client.SendMailAsync(ConfigurationManager.AppSettings["SupportEmailAddr"], 
                                    message.Destination, 
                                    message.Subject, 
                                    message.Body);
    }
}

Настройка кода отправки по своему усмотрению.

Ответ 2

Решение Joe очень меня вдохновило, спасибо за это! Однако, чтобы внести свой вклад, вы должны включить следующие пространства имен:

using System.Configuration;
using System.Net.Mail;

Я немного изменил свое решение, после многих попыток я достиг некоторого кода, который работал (он все равно должен быть восстановлен, но это не меняет идею), так выглядит мой метод SendAsync

public Task SendAsync(IdentityMessage message) {
    //SmtpClient client = new SmtpClient();
    //return client.SendMailAsync(ConfigurationManager.AppSettings["SupportEmailAddr"],
    //                            message.Destination,
    //                            message.Subject,
    //                            message.Body);

    SmtpClient client = new SmtpClient();
    client.Port = 587;
    client.Host = "smtp.gmail.com";
    client.EnableSsl = true;
    //client.Timeout = 10000;
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.UseDefaultCredentials = false;
    client.Credentials = new NetworkCredential("[email protected]", "mailPassword");

    return client.SendMailAsync("[email protected]", message.Destination, message.Subject, message.Body);
}

Вы можете увидеть, что решение Joe прокомментировано в верхней части страницы, затем в SmtpClient добавлено множество конфигураций (тайм-аут прокомментирован из-за некоторого тестирования, которое я делал, вы можете раскомментировать его, если оно соответствует вашим потребностям).

После этого почта отправляется асинхронным способом, обратите внимание, что отправитель (который Joe получает из переменной AppSettings) тот же, что указан в учетных данных (вы должны создать учетную запись gmail [или вашу учетную запись, которая вам нужна] и используйте его имя и пароль для создания учетных данных).

Это должно сделать трюк! Имейте в виду, что gmail может осложнить вашу жизнь при попытке подключиться к вашей новой учетной записи электронной почты таким образом, чтобы ее решить, вы должны войти в эту учетную запись и перейти на ваш конфигурации учетных записей и активировать "менее безопасные приложения" (или, например, я говорю по-испански, поэтому мое поведение может быть не таким хорошим...).

Редактировать 22/04/16: Похоже, это решение не работает должным образом во время работы с прокси-сервером, должен быть способ его настройки. В моем случае я считаю, что дешевле отключить прокси-сервер и продолжать, но для тех из вас, кто не может этого позволить, ожидайте, что это препятствие будет реализовано при этом.

Ответ 3

Я думаю, вы используете Macrosoft ASP.NET Identity и SMTP-почтовый клиентский сервер. Тогда ваша полная конфигурация будет выглядеть следующим образом:

Web.config

<system.net>
<mailSettings>
  <smtp from="[email protected]">
    <network host="smtp.gmail.com" userName="xyz" defaultCredentials="false" password="xyz" port="587" enableSsl="true" />
  </smtp>
</mailSettings>
</system.net>

Создать класс SmtpEmailService.cs

public class SmtpEmailService : IIdentityMessageService
{
    readonly ConcurrentQueue<SmtpClient> _clients = new ConcurrentQueue<SmtpClient>();

    public async Task SendAsync(IdentityMessage message)
    {
        var client = GetOrCreateSmtpClient();
        try
        {
            MailMessage mailMessage = new MailMessage();

            mailMessage.To.Add(new MailAddress(message.Destination));
            mailMessage.Subject = message.Subject;
            mailMessage.Body = message.Body;

            mailMessage.BodyEncoding = Encoding.UTF8;
            mailMessage.SubjectEncoding = Encoding.UTF8;
            mailMessage.IsBodyHtml = true;

            // there can only ever be one-1 concurrent call to SendMailAsync
            await client.SendMailAsync(mailMessage);
        }
        finally
        {
            _clients.Enqueue(client);
        }
    }


    private SmtpClient GetOrCreateSmtpClient()
    {
        SmtpClient client = null;
        if (_clients.TryDequeue(out client))
        {
            return client;
        }

        client = new SmtpClient();
        return client;
    }
}

IdentityConfig.cs

// Configure the application user manager used in this application. 
//UserManager is defined in ASP.NET Identity and is used by the application.
public class ApplicationUserManager : UserManager<User>
{
    public ApplicationUserManager(IUserStore<User> store, IIdentityMessageService emailService)
        : base(store)
    {
        this.EmailService = emailService;
    }

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
    {
        var manager = new ApplicationUserManager(new UserStore<User>(context.Get<ApplicationDbContext>()), new SmtpEmailService());
        .
        .
        .
        .
        return manager;
    }
}

Если вы используете инъекцию зависимостей (DI), тогда настройте ее. Я использую UnityContainer (UnityConfig.cs), поэтому моя конфигурация:

container.RegisterType<IIdentityMessageService, SmtpEmailService>();

Наконец, используйте его у своего контроллера:

public async Task<IHttpActionResult> TestSmtpMail()
{
    var subject = "Your subject";
    var body = "Your email body it can be html also";
    var user = await UserManager.FindByEmailAsync("[email protected]");
    await UserManager.SendEmailAsync(user.Id, subject, body);
    return Ok();
}

Вы можете получить сообщение об ошибке:

Для SMTP-сервера требуется безопасное соединение или клиент не был проверку подлинности.

Затем Разрешить меньше приложений для обеспечения безопасности и Разрешить учетную запись gmail, позволяющую другим приложениям получить доступа

Для получения более подробной информации и SendGrid посетитель клиента здесь