我的网络应用程序没有错误,但我的 Smtp 服务器不发送任何电子邮件

问题描述 投票:0回答:1

这是我的错误:

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();
}
c# asp.net-core asp.net-core-mvc
1个回答
0
投票

您应该使用端口 587。

此外,您还需要启用“不太安全的应用程序”,但请确保您了解风险。然而,此功能在不久的将来将被弃用,因此您应该考虑替代方案:

从 2024 年 9 月 30 日开始,安全性较低的应用程序、第三方应用程序或 仅使用用户名和密码登录的设备 Google Workspace 帐号将不再受支持。为了准确 日期,请访问 Google Workspace 更新。继续使用特定 应用程序与您的 Google 帐户一起使用时,您需要使用更安全的类型 不共享密码数据的访问。了解如何使用登录方式 谷歌。

您可以在这里阅读更多相关信息

如果您决定暂时继续走这条路...

如果启用了双因素身份验证,您将需要创建一个“应用程序密码”。您可以在此处阅读如何操作

© www.soinside.com 2019 - 2024. All rights reserved.