簡體   English   中英

ASP.NET Identity UserManager IIdentityMessageService將額外參數傳遞給SendAsync

[英]ASP.NET Identity UserManager IIdentityMessageService pass extra parameters to SendAsync

我通過擴展IIdentityMessageService成功為UserManager創建了自定義電子郵件服務提供程序:

public class ExchangeEmailService : IIdentityMessageService
{
    public async Task SendAsync(IdentityMessage message)
    {
        using (var client = new SmtpClient())
        {
            client.Host = "mail.example.com";
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.UseDefaultCredentials = false;
            client.Credentials = new NetworkCredential(@"noreply", "P@ssw0rd");

            var from = new MailAddress("no-reply@example.com");
            var to = new MailAddress(message.Destination);

            var mailMessage = new MailMessage(from, to)
            {
                Subject = message.Subject,
                Body = message.Body,
                IsBodyHtml = true
            };
            await client.SendMailAsync(mailMessage);
        }
    }
}

UserManager的內部創建我正在創建我的服務的新實例並將其分配給EmailService

userManager.EmailService = new ExchangeEmailService();

這一切都運行正常,但我要求從不同的電子郵件地址發送電子郵件,根據調用的地方,不幸的是UserManager.SendEmailAsync不允許我傳遞除userId,subject和body之外的任何內容。

理想情況下,我希望能夠在調用SendEmailAcync或枚舉值時指定電子郵件地址。

我在UserManager源代碼中搜索過,我考慮過創建自定義SendEmailAsync實現,但我必須更改多個位置--IIdentityMessageService,UserManager。

我知道我可以創建新界面並在其上構建我的電子郵件發送課程,但我希望將更改保持在最低限度。

我想得到什么:
我想要包含郵箱名稱的枚舉:

public enum Mailboxes
{
    Noreply = 0,
    Service = 1,
    Contact = 2
}

並能夠使用該附加參數調用SendEmailAsync

await UserManager.SendEmailAsync(user.Id, "Account created", "Nice email content.", Mailboxes.Noreply );

我知道我可以設置不同的標題並使用相同的電子郵件地址,但這是我得到的要求。

我怎樣才能做到這一點?

黑客就是創建一個模型來存儲您想要發送到服務的內容

public class MessageBody {
    public string Body { get; set; }
    public MailBoxes Source { get; set; }
}

然后將它序列化(可能是JSON)作為SendEmailAsync方法調用的body參數。

var message = new MessageBody {
    Body = "Nice email content.",
    Source = Mailboxes.Noreply
};

var body = JsonConvert.SerializeObject(message);

await UserManager.SendEmailAsync(user.Id, "Account created", body);

然后,該服務將反序列化模型,使用自定義信息構建電子郵件,然后發送電子郵件。

public class ExchangeEmailService : IIdentityMessageService {
    readonly IMailBoxProvider provider;

    public ExchangeEmailService(IMailBoxProvider provider) {
        this.provider = provider;
    }

    public async Task SendAsync(IdentityMessage message) {
        using (var client = new SmtpClient()) {
            client.Host = "mail.example.com";
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.UseDefaultCredentials = false;
            client.Credentials = new NetworkCredential(@"noreply", "P@ssw0rd");

            //Get the body and from address
            var fromEmailAddress = "default-email@example.com";
            var body = message.Body;
            try {
                var msg = JsonConvert.DeserializeObject<MessageBody>(body);
                if(msg != null) {
                    body = msg.Body;
                    fromEmailAddress = provider.GetMailbox(msg.Source);
                }
            } catch { }

            var from = new MailAddress(fromEmailAddress);
            var to = new MailAddress(message.Destination);

            var mailMessage = new MailMessage(from, to)
            {
                Subject = message.Subject,
                Body = body,
                IsBodyHtml = true
            };
            await client.SendMailAsync(mailMessage);
        }
    }
}

並確保將其分配給UserManager.EmailService

userManager.EmailService = new ExchangeEmailService(new MailBoxProvider());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM