Version: 8.0
Is it possible to change the default emailing address for different needs within the product? For example, if we want 2FA emails and reporting emails to go to different addresses, can we do this?
I reviewed the document here but could not find an answer.
Thanks,
1 Answer(s)
-
0
Hi,
It can be managed by different sending logics. Here an example about how you can achieve it.
Using ABP's IEmailSender with Customization
ABP's
IEmailSender
interface and its default implementation are a good starting point. You can customize theMailMessage
before it's sent. This is suitable if you primarily need to change the "From" address or add custom headers while still relying on ABP's configured SMTP settings.// 2 interfaces for 2 different requirements: public interface I2FAEmailSender { Task Send2FAEmailAsync(string emailAddress, string code); } public interface IReportingEmailSender { Task SendReportEmailAsync(string emailAddress, string reportData); }
public class TwoFAEmailSender : ITransientDependency, I2FAEmailSender // Mark as transient for DI { private readonly IEmailSender _emailSender; public TwoFAEmailSender(IEmailSender emailSender) { _emailSender = emailSender; } public async Task Send2FAEmailAsync(string emailAddress, string code) { await _emailSender.SendAsync( "2fa@yourdomain.com", // Override the from address here emailAddress, "Your 2FA Code", $"Your 2FA code is: {code}", isBodyHtml: true, // You can also add custom headers here if needed // mailMessage => { mailMessage.Headers.Add("X-Custom-Header", "value"); } ); } } public class ReportingEmailSender : ITransientDependency, IReportingEmailSender { private readonly IEmailSender _emailSender; public ReportingEmailSender(IEmailSender emailSender) { _emailSender = emailSender; } public async Task SendReportEmailAsync(string emailAddress, string reportData) { await _emailSender.SendAsync( "reports@yourdomain.com", // Override from address emailAddress, "Your Report", $"Here is your Report: {reportData}", isBodyHtml: true ); } }
And use them in your service separately:
public class MyService { private readonly I2FAEmailSender _2faEmailSender; private readonly IReportingEmailSender _reportingEmailSender; public MyService( I2FAEmailSender _2faEmailSender, IReportingEmailSender _reportingEmailSender) { this._2faEmailSender = _2faEmailSender; this._reportingEmailSender = _reportingEmailSender; } // ... public async Task DoSomethingAsync() { // Send 2FA code await _2faEmailSender.Send2FAEmailAsync(/*...*/); } public async Task SendReportAsync() { // Send report await _reportingEmailSender.SendReportEmailAsync(/*...*/); } }
You can even more customize those 2 sending logic by adding additional logics to their own services independently.