UserManager SendEmailAsync未发送邮件

本文关键字:SendEmailAsync UserManager | 更新日期: 2023-09-27 18:03:42

我正在使用以下代码尝试异步发送电子邮件,但没有发送电子邮件,我不确定正在做什么不正确。我还在网页上添加了第二段代码。配置邮件协议

<<p> SendEmailAsync代码/strong>
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");

网络。配置代码

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

* * * * * * * *更新

我测试了是否可以用通常的方法发送电子邮件,并且可以使用下面的代码发送电子邮件。

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);

UserManager SendEmailAsync未发送邮件

在你的应用程序中,你可能在App_Start文件夹中有一个名为IdentityConfig.cs的文件。该文件的顶部可能有这样的内容:

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);
    }
}

自定义发送代码

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("mailName@gmail.com", "mailPassword");
    return client.SendMailAsync("mailName@gmail.com", message.Destination, message.Subject, message.Body);
}

你可以在顶部看到Joe的解决方案注释,然后,对SmtpClient进行了大量配置(超时是由于我一直在做的一些测试而注释的,如果适合你的需要,你可以取消注释)。

之后,邮件以异步方式发送,注意发送者(Joe从AppSettings变量中获得)与凭证中指定的相同(您必须创建一个gmail[或任何您想要的邮件服务]帐户,并使用它的名称和密码来创建凭证)。

应该可以了!请记住,gmail可能会使您的生活复杂化,而试图以这种方式连接到您的新邮件帐户,为了解决这个问题,您必须登录该帐户并进入您的帐户配置并激活"不太安全的应用程序访问"(或类似的东西,我说西班牙语,所以我的教育可能不是那么好…)。

似乎这个解决方案不能正常工作,而工作背后的代理,应该有一种方法来配置它。在我的情况下,我发现禁用代理并继续使用更便宜,但对于那些负担不起的人来说,在实现此功能时预计会遇到此障碍。

我想你用的是Macrosoft ASP。. NET身份和SMTP邮件客户端服务器。那么您的完整配置将如下所示:

web . config

<system.net>
<mailSettings>
  <smtp from="xyz@gmail.com">
    <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("xxx@gmail.com");
    await UserManager.SendEmailAsync(user.Id, subject, body);
    return Ok();
}

可以得到如下错误:

SMTP服务器需要安全连接,或者客户端没有安全连接身份验证。

然后允许更少的安全应用&允许gmail帐户允许其他应用程序访问

更多详情和SendGrid客户端访问这里

很好。谢谢你!我有错误,因为ConfigurationManager.AppSettings["SupportEmailAddr"]是空的。你得把它放在你的网里。配置文件。有一个部分叫做:<appSettings>.这就是ConfigurationManager。AppSettings也在引用。["SupportEmailAddr"]正在查看一个名为SupportEmailAddr的特定设置。在你的网里。将其配置为如下所示:

<appSettings>
    <add key="SupportEmailAddr" value="someone@example.com" />
</appSettings>

使用VS2017的开箱即用构建,c# Web应用程序与Webforms和个人帐户,我发现这个评论帮助我解决了从ConfigurationManager返回的NULL值。AppSettings电话。

我确认邮件设置都是正确的,但是我无法从对ConfigurationManager的调用中获得有效的结果来检索字符串值。它总是返回NULL。

我发现,如果你使用应用程序设置(ProjectName ->属性→在解决方案资源管理器树中的Settings.Settings)中,您将始终得到NULL返回值,因为该部分位于Web中。配置文件将不存在,但该节存在,并且语法不同。

只要记住把这部分放在最后一个结束标签之前。

简单优雅,感谢Goran。