Asp.Net - 身份2 - 附加EmailService触发的电子邮件中的文件

时间:2014-08-21 13:45:54

标签: c# asp.net-identity-2

我使用 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

1 个答案:

答案 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");