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);
Ответы
Ответ 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 посетитель клиента здесь