У меня есть метод действия контроллера при запуске данных публикации в метод ForgotPassword:
[ValidateAntiForgeryToken]
public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindByNameAsync(model.Email);
if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id)))
{
// Don't reveal that the user does not exist or is not confirmed
return View("ForgotPasswordConfirmation");
}
string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);
var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(user.Id, "Reset Password", "Please reset your password by clicking <a href=\"" + callbackUrl + "\">here</a>");
return RedirectToAction("ForgotPasswordConfirmation", "Account");
}
// If we got this far, something failed, redisplay form
return View(model);
}
файл web.config
<appSettings>
<add key = "webpages:Version" value = "3.0.0.0" />
<add key = "SendGridUsername" value = "XXXXXXXXXXXXXXXXXXXXXX" />
<add key = "SendGridPassword" value = "XXXXXXXXXXXXXX" />
<add key = "SendGridApiKey" value = "XXXXXXXXXXXXXXXXXXXXXXXXXXXX" />
</appSettings>
Мой файл IdentityConfig выглядит так:
public class EmailService : IIdentityMessageService
{
public async Task SendAsync(IdentityMessage message)
{
await configSendGridasync(message);
}
// Use NuGet to install SendGrid (Basic C# client lib)
private async Task configSendGridasync(IdentityMessage message)
{
var myMessage = new SendGridMessage();
myMessage.AddTo(message.Destination);
myMessage.From = new System.Net.Mail.MailAddress(
"[email protected]", "Joe S.");
myMessage.Subject = message.Subject;
myMessage.Text = message.Body;
myMessage.Html = message.Body;
var credentials = new NetworkCredential(
ConfigurationManager.AppSettings["SendGridUsername"],
ConfigurationManager.AppSettings["SendGridPassword"]
);
// Create a Web transport for sending email.
var transportWeb = new Web(credentials);
// Send the email.
if (transportWeb != null)
{
await transportWeb.DeliverAsync(myMessage);
}
else
{
Trace.TraceError("Failed to create Web transport.");
await Task.FromResult(0);
}
}
}
Однако электронное письмо не отправляется, что я делаю не так и как я могу это исправить, поскольку я выполнил инструкции из сообщения Рика Андерсона на msdn.
Нет ошибок, это как если бы электронное письмо было отправлено, и когда я проверяю, что отправленное электронное письмо на панели управления веб-сайта sendGrid равно 0
Можете ли вы показать нам получаемый вами ответ?
Сообщений об ошибках нет
Возможно, проблема в конфигурации SendGrid.
@ user2713535 вы никогда не должны раскрывать свой ключ API и учетные данные, я их замаскировал
@ user2713535 проверьте мой ответ вы следите за старой версией
Можете ли вы подтвердить в вашем файле IdentityConfig.cs, что есть строка: manager.EmailService = new EmailService();





Вы используете устаревшую версию sendgrid C# SDK, которая указывает на V2 api. Текущая версия API - V3. Документ, за которым вы следите, не обновляется. Я сейчас занимаюсь обновлением документа. Вам необходимо добавить в свою службу пространство имен ниже -
using SendGrid;
using SendGrid.Helpers.Mail; //optional if you want to use the MailHelper class
А затем используйте приведенный ниже код в своем методе configSendGridasync -
private async Task configSendGridasync(IdentityMessage message)
{
var apiKey = Convert.ToString(ConfigurationManager.AppSettings["SendGridApiKey"]);
var client = new SendGridClient(apiKey);
var myMessage = new SendGridMessage();
myMessage.AddTo(new EmailAddress(message.Destination));
myMessage.SetFrom(new EmailAddress("[email protected]", "Joe S."));
myMessage.SetSubject(message.Subject);
myMessage.AddContent(MimeType.Text, message.Body);
myMessage.AddContent(MimeType.Html, message.Body);
try
{
var response = await client.SendEmailAsync(msg);
}
catch(Exception err)
{
Trace.TraceError("Failed to create Web transport: ."+err.message);
await Task.FromResult(0);
}
}
Перед написанием кода вам необходимо установить пакет Sendgrid из nuget, используя следующую команду:
Install-Package Sendgrid -Version 9.10.0
Полный код приведен ниже -
using SendGrid;
using SendGrid.Helpers.Mail;
public class EmailService : IIdentityMessageService
{
public async Task SendAsync(IdentityMessage message)
{
await configSendGridasync(message);
}
// Use NuGet to install SendGrid (Basic C# client lib)
private async Task configSendGridasync(IdentityMessage message)
{
var apiKey = Convert.ToString(ConfigurationManager.AppSettings["SendGridApiKey"]);
var client = new SendGridClient(apiKey);
var myMessage = new SendGridMessage();
myMessage.AddTo(new EmailAddress(message.Destination));
myMessage.SetFrom(new EmailAddress("[email protected]", "Joe S."));
myMessage.SetSubject(message.Subject);
myMessage.AddContent(MimeType.Text, message.Body);
myMessage.AddContent(MimeType.Html, message.Body);
try
{
var response = await client.SendEmailAsync(msg);
}
catch(Exception err)
{
Trace.TraceError("Failed to create Web transport: ."+err.message);
await Task.FromResult(0);
}
}
}
Вот ссылка на пример кода:
https://github.com/sendgrid/sendgrid-csharp/blob/master/USE_CASES.md
Я не получил ни одного электронного письма. Пожалуйста, подтвердите, что я должен содержать в моем webconfig
@ user2713535 вам нужен только ключ API для V3 api
<add key = "SendGridApiKey" value = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" />
@ user2713535 также класс EmailAddress не из System.Net.Mail, а из Sendgrid
Как могло случиться, что в этом случае электронное письмо не было доставлено?
Некоторое время назад я также обновил пакет NuGet. Удалил сборку system.web.pages
@ user2713535 вы отладили значение message.Destination в configSendGridasync
Я поигрался с кодом и постом Рика Андерсона. @Nadir спасибо за новый ответ, он действительно работает.
вы получаете какую-нибудь ошибку? Не могли бы вы показать нам трассировку стека, пожалуйста