这是我的错误:
IOException:无法从传输连接读取数据:连接已关闭。
这是我的代码:
public class EmailSender : IEmailSender
{
public async Task SendEmailAsync(EmailModel email)
{
MailMessage mail = new MailMessage()
{
From = new MailAddress("[email protected]", "username"),
To = { email.To },
Subject = email.Subject,
Body = email.Body,
IsBodyHtml = true,
};
SmtpClient smtpServer = new SmtpClient("smtp.gmail.com",25) // Host => for example: webmail.codeyad.com
{
Credentials = new System.Net.NetworkCredential("[email protected]", ""), // UserName == Email
EnableSsl = true
};
smtpServer.Send(mail);
await Task.CompletedTask;
}
}
EmailSender.cs 中的 Mmenta.Tools.EmailSender.SendEmailAsync(EmailModel 电子邮件)
smtpServer.Send(mail);
AccountController.cs中的MMenta.Controllers.AccountController.Register(RegisterVM模型)
await _emailSender.SendEmailAsync(new EmailModel(user.Email, "تایید حساب", body));`
[HttpPost]
public async Task<IActionResult> Register(RegisterVM model)
{
if (!ModelState.IsValid)
{
ViewBag.IsSent = false;
return View();
}
var result = await _userManager.CreateAsync(new ApplicationUser()
{
UserName = model.UserName,
Email = model.Email,
PhoneNumber = model.Phone,
NickName = model.UserName,
user_avatar = model.user_avatar,
}, model.Password);
if (!result.Succeeded)
{
foreach (var err in result.Errors)
{
ModelState.AddModelError(string.Empty, err.Description);
ViewBag.IsSent = false;
return View();
}
}
var user = await _userManager.FindByNameAsync(model.UserName);
// var mobileCode = await _userManager.GenerateTwoFactorTokenAsync(user, "Phone");
// return RedirectToAction("ConfirmMobile", new { phone = user.PhoneNumber, token = });
//
var token = await _userManager.GenerateEmailConfirmationTokenAsync(user);
token = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(token));
string? callBackUrl = Url.ActionLink("ConfirmEmail", "Account", new { userId = user.Id, token = token },
Request.Scheme);
string body = await _viewRenderService.RenderToStringAsync("_RegisterEmail", callBackUrl);
await _emailSender.SendEmailAsync(new EmailModel(user.Email, "تایید حساب", body));
ViewBag.IsSent = true;
return View();
}
您应该使用端口 587。
此外,您还需要启用“不太安全的应用程序”,但请确保您了解风险。然而,此功能在不久的将来将被弃用,因此您应该考虑替代方案:
从 2024 年 9 月 30 日开始,安全性较低的应用程序、第三方应用程序或 仅使用用户名和密码登录的设备 Google Workspace 帐号将不再受支持。为了准确 日期,请访问 Google Workspace 更新。继续使用特定 应用程序与您的 Google 帐户一起使用时,您需要使用更安全的类型 不共享密码数据的访问。了解如何使用登录方式 谷歌。
您可以在这里阅读更多相关信息。
如果您决定暂时继续走这条路...
如果启用了双因素身份验证,您将需要创建一个“应用程序密码”。您可以在此处阅读如何操作。