我使用 Asp.Net-Identity-2 来管理我应用中的用户访问权限。
我使用EmailService(UserManager.SendEmail)发送确认电子邮件,我想发送格式化的HTML邮件,我想在其中附加图片。
我该怎么做?
设置Identity User Manager EmailService
public class AppUserManager : UserManager<AppUser>
{
public AppUserManager(IUserStore<AppUser> store) : base(store) { }
public static AppUserManager Create(IdentityFactoryOptions<AppUserManager> options, IOwinContext context)
{
AppUserManager manager = new AppUserManager(new UserStore<AppUser>(db));
//Some setup code here ....
//Hook to my EmailService (see class MyEmailService.cs)
manager.EmailService = new MyEmailService();
return manager;
} //Create
} //class
MyEmailService
public class MyEmailService : IIdentityMessageService
{
public Task SendAsync(IdentityMessage message)
{
MailMessage email = new MailMessage("me@sample.com", message.Destination);
email.Subject = message.Subject;
email.Body = message.Body;
email.IsBodyHtml = true;
var mailClient = new SmtpClient();
mailClient.Host = "EmailServer";
mailClient.Port = 25;
return mailClient.SendMailAsync(email);
} //SendAsync
} //class
发送电子邮件的行动
public ActionResult ForgotPassword(string email)
{
if (ModelState.IsValid)
{
AppUser user = UserManager.FindByEmail(email);
if (user == null || !(UserManager.IsEmailConfirmed(user.Id)))
{
return View("../Home/Index");
} //if
string code = UserManager.GenerateEmailConfirmationToken(user.Id);
string callbackUrl = Url.Action("ResetPassword", "Admin", new { Id = user.Id, code = code }, protocol: Request.Url.Scheme);
string strMessage = getHTMLMessage(); //variable Html message here, with images references in it (ex. "<img src='cid:IMAGE_TITLE'>")
UserManager.SendEmail(user.Id, "Message Subject", strMessage);
return View("../Home/Index");
}
// If we got this far, something failed, redisplay form
return View();
} //ForgotPassword
我怀疑如何在该讯息中附加图像......
感谢您的帮助..
Julio Schurt
答案 0 :(得分:1)
我必须在我的服务中创建另一个方法并直接调用它
public Task SendAsync(IdentityMessage message, IEnumerable<KeyValuePair<string, Stream>> attach)
{
var myMessage = new SendGridMessage() { From = new MailAddress("my@email.com") };
myMessage.AddTo(message.Destination);
myMessage.Subject = message.Subject;
myMessage.Html = message.Body;
myMessage.Text = message.Body;
var credentials = new NetworkCredential("myuser", "mypassword");
var transportWeb = new Web(credentials);
foreach (var file in attach)
{
myMessage.AddAttachment(file.Value,file.Key);
}
return transportWeb.DeliverAsync(myMessage);
}
编辑:(2015-08-14)
最后一堂课:
public class EmailService : IIdentityMessageService
{
const string from = "mail@domain.com";
const string username = "username";//Environment.GetEnvironmentVariable("SENDGRID_USER");
const string pswd = "password";//Environment.GetEnvironmentVariable("SENDGRID_PASS");
private List<KeyValuePair<string, Stream>> _attachments;
private List<KeyValuePair<string, string>> _recipients;
public Task SendAsync(IdentityMessage message)
{
var myMessage = new SendGridMessage() { From = new MailAddress(from) };
var credentials = new NetworkCredential(username, pswd);
var transportWeb = new Web(credentials);
myMessage.AddTo(message.Destination);
if (_recipients != null)
{
_recipients.ForEach(r => myMessage.AddTo(string.Format("{0} {1}", r.Key, r.Value)));
}
myMessage.Subject = message.Subject;
myMessage.Html = message.Body;
myMessage.Text = message.Body;
if (_attachments != null)
{
foreach (var attachment in _attachments)
{
myMessage.AddAttachment(attachment.Value, attachment.Key);
}
}
return transportWeb.DeliverAsync(myMessage);
}
public Task SendAsync(IdentityMessage message, IEnumerable<KeyValuePair<string, Stream>> attachments)
{
var myMessage = new SendGridMessage() { From = new MailAddress(from) };
var credentials = new NetworkCredential(username, pswd);
var transportWeb = new Web(credentials);
myMessage.AddTo(message.Destination);
myMessage.Subject = message.Subject;
myMessage.Html = message.Body;
myMessage.Text = message.Body;
foreach (var attachment in attachments)
{
myMessage.AddAttachment(attachment.Value, attachment.Key);
}
return transportWeb.DeliverAsync(myMessage);
}
public Task SendAsync(IdentityMessage message, KeyValuePair<string, Stream> attachment)
{
var myMessage = new SendGridMessage() { From = new MailAddress(from) };
var credentials = new NetworkCredential(username, pswd);
var transportWeb = new Web(credentials);
myMessage.AddTo(message.Destination);
myMessage.Subject = message.Subject;
myMessage.Html = message.Body;
myMessage.Text = message.Body;
myMessage.AddAttachment(attachment.Value, attachment.Key);
return transportWeb.DeliverAsync(myMessage);
}
public void AddTo(string name,string mail)
{
_recipients = _recipients ?? new List<KeyValuePair<string, string>>();
_recipients.Add(new KeyValuePair<string, string>(name, string.Format("<{0}>", mail)));
}
public void AddAttachment(string name, Stream file)
{
_attachments = _attachments ?? new List<KeyValuePair<string, Stream>>();
_attachments.Add(new KeyValuePair<string, Stream>(name, file));
}
public void AddAttachment<T>(string name, T records)
{
var jsonSerialiser = new JavaScriptSerializer();
var json = jsonSerialiser.Serialize(records);
var bytes = Encoding.UTF8.GetBytes(json);
var ms = new MemoryStream(bytes);
ms.Flush();
ms.Seek(0, SeekOrigin.Begin);
_attachments = _attachments ?? new List<KeyValuePair<string, Stream>>();
_attachments.Add(new KeyValuePair<string, Stream>(name, ms));
}
}
然后可以使用它......
// use it directly
var emailService = new EmailService();
IdentityMessage msg = new IdentityMessage()
{
Destination = "test <test@domain.com>",
Subject = "Subject",
Body = "Body"
};
emailService.AddTo("Name1", "mail1@domain.com");
emailService.AddTo("Name2", "mail2@domain.com");
emailService.AddTo("Name3", "mail3@domaincom");
emailService.AddAttachment(filename", stream);
await emailService.SendAsync(msg);
// Or use it from UserManager
(UserManager.EmailService as EmailService).AddAttachment("name", yourStream);
await UserManager.SendEmailAsync("userid", "subject", "body");