Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added optionally providing BCC addresses to send a mail #823

Merged
merged 1 commit into from
Jan 18, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 112 additions & 7 deletions src/lib/PnP.Framework/Utilities/MailUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace PnP.Framework.Utilities
/// <summary>
/// Provides functions for sending email using either Office 365 SMTP service or SharePoint's SendEmail utility
/// </summary>
public class MailUtility
public static class MailUtility
{
/// <summary>
/// Sends an email via Office 365 SMTP
Expand All @@ -27,9 +27,27 @@ public class MailUtility
/// <param name="sendAsync">Sends the email asynchronous so as to not block the current thread (default: false).</param>
/// <param name="asyncUserToken">The user token that is used to correlate the asynchronous email message.</param>
public static void SendEmail(string servername, string fromAddress, string fromUserPassword, IEnumerable<String> to, IEnumerable<String> cc, string subject, string body, bool sendAsync = false, object asyncUserToken = null)
{
SendEmail(servername, fromAddress, fromUserPassword, to, cc, null, subject, body, sendAsync, asyncUserToken);
}

/// <summary>
/// Sends an email via Office 365 SMTP
/// </summary>
/// <param name="servername">Office 365 SMTP address. By default this is smtp.office365.com.</param>
/// <param name="fromAddress">The user setting up the SMTP connection. This user must have an EXO license.</param>
/// <param name="fromUserPassword">The password of the user.</param>
/// <param name="to">List of TO addresses.</param>
/// <param name="cc">List of CC addresses.</param>
/// <param name="bcc">List of BCC addresses.</param>
/// <param name="subject">Subject of the mail.</param>
/// <param name="body">HTML body of the mail.</param>
/// <param name="sendAsync">Sends the email asynchronous so as to not block the current thread (default: false).</param>
/// <param name="asyncUserToken">The user token that is used to correlate the asynchronous email message.</param>
public static void SendEmail(string servername, string fromAddress, string fromUserPassword, IEnumerable<String> to, IEnumerable<String> cc, IEnumerable<String> bcc, string subject, string body, bool sendAsync = false, object asyncUserToken = null)
{
// Get the secure password
var secureString = new SecureString();
using var secureString = new SecureString();
foreach (char c in fromUserPassword.ToCharArray())
{
secureString.AppendChar(c);
Expand All @@ -51,9 +69,27 @@ public static void SendEmail(string servername, string fromAddress, string fromU
/// <param name="sendAsync">Sends the email asynchronous so as to not block the current thread (default: false).</param>
/// <param name="asyncUserToken">The user token that is used to correlate the asynchronous email message.</param>
public static void SendEmail(string servername, string fromAddress, SecureString fromUserPassword, IEnumerable<String> to, IEnumerable<String> cc, string subject, string body, bool sendAsync = false, object asyncUserToken = null)
{
SendEmail(servername, fromAddress, fromUserPassword, to, cc, null, subject, body, sendAsync, asyncUserToken);
}

/// <summary>
/// Sends an email via Office 365 SMTP
/// </summary>
/// <param name="servername">Office 365 SMTP address. By default this is smtp.office365.com.</param>
/// <param name="fromAddress">The user setting up the SMTP connection. This user must have an EXO license.</param>
/// <param name="fromUserPassword">The secure password of the user.</param>
/// <param name="to">List of TO addresses.</param>
/// <param name="cc">List of CC addresses.</param>
/// <param name="bcc">List of BCC addresses.</param>
/// <param name="subject">Subject of the mail.</param>
/// <param name="body">HTML body of the mail.</param>
/// <param name="sendAsync">Sends the email asynchronous so as to not block the current thread (default: false).</param>
/// <param name="asyncUserToken">The user token that is used to correlate the asynchronous email message.</param>
public static void SendEmail(string servername, string fromAddress, SecureString fromUserPassword, IEnumerable<String> to, IEnumerable<String> cc, IEnumerable<String> bcc, string subject, string body, bool sendAsync = false, object asyncUserToken = null)
{
SmtpClient client = CreateSmtpClient(servername, fromAddress, fromUserPassword);
MailMessage mail = CreateMailMessage(fromAddress, to, cc, subject, body);
MailMessage mail = CreateMailMessage(fromAddress, to, cc, bcc, subject, body);
try
{
if (sendAsync)
Expand Down Expand Up @@ -98,6 +134,22 @@ public static void SendEmail(string servername, string fromAddress, SecureString
/// <param name="subject">Subject of the mail.</param>
/// <param name="body">HTML body of the mail.</param>
public static async Task SendEmailAsync(string servername, string fromAddress, string fromUserPassword, IEnumerable<String> to, IEnumerable<String> cc, string subject, string body)
{
await SendEmailAsync(servername, fromAddress, fromUserPassword, to, cc, null, subject, body);
}

/// <summary>
/// Sends an email via Office 365 SMTP as an asynchronous operation
/// </summary>
/// <param name="servername">Office 365 SMTP address. By default this is smtp.office365.com.</param>
/// <param name="fromAddress">The user setting up the SMTP connection. This user must have an EXO license.</param>
/// <param name="fromUserPassword">The password of the user.</param>
/// <param name="to">List of TO addresses.</param>
/// <param name="cc">List of CC addresses.</param>
/// <param name="bcc">List of BCC addresses.</param>
/// <param name="subject">Subject of the mail.</param>
/// <param name="body">HTML body of the mail.</param>
public static async Task SendEmailAsync(string servername, string fromAddress, string fromUserPassword, IEnumerable<String> to, IEnumerable<String> cc, IEnumerable<String> bcc, string subject, string body)
{
// Get the secure password
var secureString = new SecureString();
Expand All @@ -106,7 +158,7 @@ public static async Task SendEmailAsync(string servername, string fromAddress, s
secureString.AppendChar(c);
}

await SendEmailAsync(servername, fromAddress, secureString, to, cc, subject, body);
await SendEmailAsync(servername, fromAddress, secureString, to, cc, bcc, subject, body);
}

/// <summary>
Expand All @@ -120,9 +172,25 @@ public static async Task SendEmailAsync(string servername, string fromAddress, s
/// <param name="subject">Subject of the mail.</param>
/// <param name="body">HTML body of the mail.</param>
public static async Task SendEmailAsync(string servername, string fromAddress, SecureString fromUserPassword, IEnumerable<String> to, IEnumerable<String> cc, string subject, string body)
{
await SendEmailAsync(servername, fromAddress, fromUserPassword, to, cc, null, subject, body);
}

/// <summary>
/// Sends an email via Office 365 SMTP as an asynchronous operation
/// </summary>
/// <param name="servername">Office 365 SMTP address. By default this is smtp.office365.com.</param>
/// <param name="fromAddress">The user setting up the SMTP connection. This user must have an EXO license.</param>
/// <param name="fromUserPassword">The secure password of the user.</param>
/// <param name="to">List of TO addresses.</param>
/// <param name="cc">List of CC addresses.</param>
/// <param name="bcc">List of BCC addresses.</param>
/// <param name="subject">Subject of the mail.</param>
/// <param name="body">HTML body of the mail.</param>
public static async Task SendEmailAsync(string servername, string fromAddress, SecureString fromUserPassword, IEnumerable<String> to, IEnumerable<String> cc, IEnumerable<String> bcc, string subject, string body)
{
SmtpClient client = CreateSmtpClient(servername, fromAddress, fromUserPassword);
MailMessage mail = CreateMailMessage(fromAddress, to, cc, subject, body);
MailMessage mail = CreateMailMessage(fromAddress, to, cc, bcc, subject, body);
try
{
await client.SendMailAsync(mail);
Expand All @@ -147,6 +215,20 @@ public static async Task SendEmailAsync(string servername, string fromAddress, S
/// <param name="subject">Subject of the mail.</param>
/// <param name="body">HTML body of the mail.</param>
public static void SendEmail(ClientContext context, IEnumerable<String> to, IEnumerable<String> cc, string subject, string body)
{
SendEmail(context, to, cc, null, subject, body);
}

/// <summary>
/// Sends an email using the SharePoint SendEmail method
/// </summary>
/// <param name="context">Context for SharePoint objects and operations</param>
/// <param name="to">List of TO addresses.</param>
/// <param name="cc">List of CC addresses.</param>
/// <param name="bcc">List of BCC addresses.</param>
/// <param name="subject">Subject of the mail.</param>
/// <param name="body">HTML body of the mail.</param>
public static void SendEmail(ClientContext context, IEnumerable<String> to, IEnumerable<String> cc, IEnumerable<String> bcc, string subject, string body)
{
EmailProperties properties = new EmailProperties
{
Expand All @@ -158,6 +240,11 @@ public static void SendEmail(ClientContext context, IEnumerable<String> to, IEnu
properties.CC = cc;
}

if (bcc != null)
{
properties.BCC = bcc;
}

properties.Subject = subject;
properties.Body = body;

Expand Down Expand Up @@ -190,7 +277,17 @@ private static SmtpClient CreateSmtpClient(string serverName, string fromAddress
};
}

private static MailMessage CreateMailMessage(string fromAddress, IEnumerable<String> to, IEnumerable<String> cc, string subject, string body)
/// <summary>
/// Constructs a MailMessage based on the provided parameters
/// </summary>
/// <param name="fromAddress">Address to use as the sender</param>
/// <param name="to">One or more recipients of the e-mail</param>
/// <param name="cc">Recipients to include as Carbon Copies in the e-mail</param>
/// <param name="bcc">Recipients to cinlude as Blind Carbon Copies in the e-mail</param>
/// <param name="subject">Subjec to use for the e-mail</param>
/// <param name="body">Contents of the e-mail</param>
/// <returns>MailMessage instance</returns>
private static MailMessage CreateMailMessage(string fromAddress, IEnumerable<String> to, IEnumerable<String> cc, IEnumerable<String> bcc, string subject, string body)
{
MailMessage mail = new MailMessage()
{
Expand All @@ -203,7 +300,7 @@ private static MailMessage CreateMailMessage(string fromAddress, IEnumerable<Str
foreach (string user in to)
{
mail.To.Add(user);
}
}

if (cc != null)
{
Expand All @@ -213,6 +310,14 @@ private static MailMessage CreateMailMessage(string fromAddress, IEnumerable<Str
}
}

if (bcc != null)
{
foreach (string user in bcc)
{
mail.Bcc.Add(user);
}
}

return mail;
}
}
Expand Down