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);
在你的应用程序中,你可能在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。