Small SendEmail API enhancements

This commit is contained in:
Sipke Schoorstra 2021-02-17 21:40:50 +01:00
parent 86980a752e
commit 4d748c8371
3 changed files with 36 additions and 47 deletions

View file

@ -1,11 +1,13 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Elsa.Activities.Email.Options;
using Elsa.Activities.Email.Services;
using Elsa.ActivityResults;
using Elsa.Attributes;
using Elsa.Services;
using Elsa.Services.Models;
using Microsoft.Extensions.Options;
using MimeKit;
using MimeKit.Text;
@ -16,23 +18,25 @@ namespace Elsa.Activities.Email
public class SendEmail : Activity
{
private readonly ISmtpService _smtpService;
private readonly SmtpOptions _options;
public SendEmail(ISmtpService smtpService)
public SendEmail(ISmtpService smtpService, IOptions<SmtpOptions> options)
{
_smtpService = smtpService;
_options = options.Value;
}
[ActivityProperty(Hint = "The sender's email address.")]
public string? From { get; set; }
[ActivityProperty(Hint = "The recipients email addresses.")]
public string[] To { get; set; } = default!;
public ICollection<string> To { get; set; } = new List<string>();
[ActivityProperty(Hint = "The cc recipients email addresses. (Optional)")]
public string[]? Cc { get; set; }
public ICollection<string> Cc { get; set; } = new List<string>();
[ActivityProperty(Hint = "The Bcc recipients email addresses. (Optional)")]
public string[]? Bcc { get; set; }
public ICollection<string> Bcc { get; set; } = new List<string>();
[ActivityProperty(Hint = "The subject of the email message.")]
public string? Subject { get; set; }
@ -44,8 +48,9 @@ namespace Elsa.Activities.Email
protected override async ValueTask<IActivityExecutionResult> OnExecuteAsync(ActivityExecutionContext context)
{
var message = new MimeMessage();
var from = From is null or "" ? _options.DefaultSender : From;
message.From.Add(MailboxAddress.Parse(From));
message.From.Add(MailboxAddress.Parse(from));
message.Subject = Subject;
message.Body = new TextPart(TextFormat.Html)
@ -53,26 +58,15 @@ namespace Elsa.Activities.Email
Text = Body
};
SetRecipiensEmailAddresses(message.To, To);
SetRecipiensEmailAddresses(message.Cc, Cc);
SetRecipiensEmailAddresses(message.Bcc, Bcc);
SetRecipientsEmailAddresses(message.To, To);
SetRecipientsEmailAddresses(message.Cc, Cc);
SetRecipientsEmailAddresses(message.Bcc, Bcc);
await _smtpService.SendAsync(message, context.CancellationToken);
return Done();
}
private void SetRecipiensEmailAddresses(InternetAddressList list, string[]? addresses)
{
if (addresses == null)
{
return;
}
for (var i = 0; i < addresses.Length; i++)
{
list.Add(MailboxAddress.Parse(addresses[i]));
}
}
private void SetRecipientsEmailAddresses(InternetAddressList list, IEnumerable<string> addresses) => list.AddRange(addresses.Select(MailboxAddress.Parse));
}
}

View file

@ -15,12 +15,12 @@ namespace Elsa.Activities.Email
builder.SendEmail(setup => setup.WithSender(from).WithRecipient(to).WithSubject(subject).WithBody(body), lineNumber, sourceFile);
public static IActivityBuilder SendEmail(this IBuilder builder, string from, string[] to, string subject, string body, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.SendEmail(setup => setup.WithSender(from).WithRecipient(to).WithSubject(subject).WithBody(body), lineNumber, sourceFile);
builder.SendEmail(setup => setup.WithSender(from).WithRecipients(to).WithSubject(subject).WithBody(body), lineNumber, sourceFile);
public static IActivityBuilder SendEmail(this IBuilder builder, string from, string[] to, string[] cc, string subject, string body, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.SendEmail(setup => setup.WithSender(from).WithRecipient(to).WithCcRecipient(cc).WithSubject(subject).WithBody(body), lineNumber, sourceFile);
builder.SendEmail(setup => setup.WithSender(from).WithRecipients(to).WithCcRecipients(cc).WithSubject(subject).WithBody(body), lineNumber, sourceFile);
public static IActivityBuilder SendEmail(this IBuilder builder, string from, string[] to, string[] cc, string[] bcc, string subject, string body, [CallerLineNumber] int lineNumber = default,
[CallerFilePath] string? sourceFile = default) => builder.SendEmail(setup => setup.WithSender(from).WithRecipient(to).WithCcRecipient(cc).WithBccRecipient(bcc).WithSubject(subject).WithBody(body), lineNumber, sourceFile);
[CallerFilePath] string? sourceFile = default) => builder.SendEmail(setup => setup.WithSender(from).WithRecipients(to).WithCcRecipients(cc).WithBccRecipients(bcc).WithSubject(subject).WithBody(body), lineNumber, sourceFile);
}
}

View file

@ -1,5 +1,4 @@
using System;
using Elsa.Builders;
using Elsa.Services.Models;
@ -8,38 +7,34 @@ namespace Elsa.Activities.Email
{
public static class SendEmailExtensions
{
#region sendner
public static ISetupActivity<SendEmail> WithSender(this ISetupActivity<SendEmail> activity, Func<ActivityExecutionContext, string> value) => activity.Set(x => x.From, value);
public static ISetupActivity<SendEmail> WithSender(this ISetupActivity<SendEmail> activity, Func<string> value) => activity.Set(x => x.From, value);
public static ISetupActivity<SendEmail> WithSender(this ISetupActivity<SendEmail> activity, string value) => activity.Set(x => x.From, value);
#endregion
#region recipient
public static ISetupActivity<SendEmail> WithRecipient(this ISetupActivity<SendEmail> activity, Func<ActivityExecutionContext, string[]> value) => activity.Set(x => x.To, value);
public static ISetupActivity<SendEmail> WithRecipient(this ISetupActivity<SendEmail> activity, Func<string[]> value) => activity.Set(x => x.To, value);
public static ISetupActivity<SendEmail> WithRecipient(this ISetupActivity<SendEmail> activity, string[] value) => activity.Set(x => x.To, value);
public static ISetupActivity<SendEmail> WithRecipients(this ISetupActivity<SendEmail> activity, Func<ActivityExecutionContext, string[]> value) => activity.Set(x => x.To, value);
public static ISetupActivity<SendEmail> WithRecipients(this ISetupActivity<SendEmail> activity, Func<string[]> value) => activity.Set(x => x.To, value);
public static ISetupActivity<SendEmail> WithRecipients(this ISetupActivity<SendEmail> activity, string[] value) => activity.Set(x => x.To, value);
public static ISetupActivity<SendEmail> WithRecipient(this ISetupActivity<SendEmail> activity, Func<ActivityExecutionContext, string> value) => activity.Set(x => x.To, context => new[] { value(context) });
public static ISetupActivity<SendEmail> WithRecipient(this ISetupActivity<SendEmail> activity, Func<string> value) => activity.Set(x => x.To, () => new[] { value() });
public static ISetupActivity<SendEmail> WithRecipient(this ISetupActivity<SendEmail> activity, string value) => activity.Set(x => x.To, new[] { value });
#endregion
#region ccRecipient
public static ISetupActivity<SendEmail> WithCcRecipient(this ISetupActivity<SendEmail> activity, Func<ActivityExecutionContext, string[]> value) => activity.Set(x => x.Cc, value);
public static ISetupActivity<SendEmail> WithCcRecipient(this ISetupActivity<SendEmail> activity, Func<string[]> value) => activity.Set(x => x.Cc, value);
public static ISetupActivity<SendEmail> WithCcRecipients(this ISetupActivity<SendEmail> activity, Func<ActivityExecutionContext, string[]> value) => activity.Set(x => x.Cc, value);
public static ISetupActivity<SendEmail> WithCcRecipients(this ISetupActivity<SendEmail> activity, Func<string[]> value) => activity.Set(x => x.Cc, value);
public static ISetupActivity<SendEmail> WithCcRecipient(this ISetupActivity<SendEmail> activity, string value) => activity.Set(x => x.Cc, new[] { value });
public static ISetupActivity<SendEmail> WithCcRecipient(this ISetupActivity<SendEmail> activity, string[] value) => activity.Set(x => x.Cc, value);
#endregion
#region bccRecipient
public static ISetupActivity<SendEmail> WithBccRecipient(this ISetupActivity<SendEmail> activity, Func<ActivityExecutionContext, string[]> value) => activity.Set(x => x.Bcc, value);
public static ISetupActivity<SendEmail> WithBccRecipient(this ISetupActivity<SendEmail> activity, Func<string[]> value) => activity.Set(x => x.Bcc, value);
public static ISetupActivity<SendEmail> WithCcRecipients(this ISetupActivity<SendEmail> activity, string[] value) => activity.Set(x => x.Cc, value);
public static ISetupActivity<SendEmail> WithBccRecipients(this ISetupActivity<SendEmail> activity, Func<ActivityExecutionContext, string[]> value) => activity.Set(x => x.Bcc, value);
public static ISetupActivity<SendEmail> WithBccRecipients(this ISetupActivity<SendEmail> activity, Func<string[]> value) => activity.Set(x => x.Bcc, value);
public static ISetupActivity<SendEmail> WithBccRecipient(this ISetupActivity<SendEmail> activity, string value) => activity.Set(x => x.Bcc, new[] { value });
public static ISetupActivity<SendEmail> WithBccRecipient(this ISetupActivity<SendEmail> activity, string[] value) => activity.Set(x => x.Bcc, value);
#endregion
#region subject
public static ISetupActivity<SendEmail> WithBccRecipients(this ISetupActivity<SendEmail> activity, string[] value) => activity.Set(x => x.Bcc, value);
public static ISetupActivity<SendEmail> WithSubject(this ISetupActivity<SendEmail> activity, Func<ActivityExecutionContext, string> value) => activity.Set(x => x.Subject, value);
public static ISetupActivity<SendEmail> WithSubject(this ISetupActivity<SendEmail> activity, Func<string> value) => activity.Set(x => x.Subject, value);
public static ISetupActivity<SendEmail> WithSubject(this ISetupActivity<SendEmail> activity, string value) => activity.Set(x => x.Subject, value);
#endregion
#region body
public static ISetupActivity<SendEmail> WithBody(this ISetupActivity<SendEmail> activity, Func<ActivityExecutionContext, string> value) => activity.Set(x => x.Body, value);
public static ISetupActivity<SendEmail> WithBody(this ISetupActivity<SendEmail> activity, Func<string> value) => activity.Set(x => x.Body, value);
public static ISetupActivity<SendEmail> WithBody(this ISetupActivity<SendEmail> activity, string value) => activity.Set(x => x.Body, value);
#endregion
}
}