patterncsharpMinor
C# helper class - mailto
Viewed 0 times
helpermailtoclass
Problem
I'm looking for input, advice, criticism. This is my first helper class. While use of mailto URLs should most often be trivial, I have a real world need to send to multiple recipients and with a body of text something more than just a one liner. Doing so gets sticky and there are some pitfalls with reserved characters, etc.
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace mailto
{
public class MailtoURL
{
public string Subject { get; set; }
private string _uri = "mailto:";
private string _toField = "?to=";
private string _ccField = "cc=";
private string _bccField = "bcc=";
private string _subjectField = "subject=";
private string _bodyField = "body=";
private string _seperator = "&";
private string _recipientDelimeter = ",";
private string _linebreak = "%0D%0A";
private string _replacePercent = "%25";
private string _replaceAmpersand = "%26";
private string _replaceSpace = "%20";
private string _replaceQuestionMark = "%3F";
private List Recipients;
private List BodyText;
public MailtoURL()
{
Recipients = new List();
BodyText = new List();
}
public string getMailtoUrl()
{
StringBuilder mailtoUrl = new StringBuilder();
mailtoUrl.Append(_uri)
.Append(RecipientString())
.Append(_seperator)
.Append(_subjectField)
.Append(Subject.Replace("%", _replacePercent).Replace("&", _replaceAmpersand).Replace(" ", _replaceSpace))
.Append(_seperator)
.Append(_bodyField)
.Append(BodyTextString().Replace(" ", _replaceSpace).Replace("&", _replaceAmpersand));
return mailtoUrl.ToString();
}
///Add an empt
```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace mailto
{
public class MailtoURL
{
public string Subject { get; set; }
private string _uri = "mailto:";
private string _toField = "?to=";
private string _ccField = "cc=";
private string _bccField = "bcc=";
private string _subjectField = "subject=";
private string _bodyField = "body=";
private string _seperator = "&";
private string _recipientDelimeter = ",";
private string _linebreak = "%0D%0A";
private string _replacePercent = "%25";
private string _replaceAmpersand = "%26";
private string _replaceSpace = "%20";
private string _replaceQuestionMark = "%3F";
private List Recipients;
private List BodyText;
public MailtoURL()
{
Recipients = new List();
BodyText = new List();
}
public string getMailtoUrl()
{
StringBuilder mailtoUrl = new StringBuilder();
mailtoUrl.Append(_uri)
.Append(RecipientString())
.Append(_seperator)
.Append(_subjectField)
.Append(Subject.Replace("%", _replacePercent).Replace("&", _replaceAmpersand).Replace(" ", _replaceSpace))
.Append(_seperator)
.Append(_bodyField)
.Append(BodyTextString().Replace(" ", _replaceSpace).Replace("&", _replaceAmpersand));
return mailtoUrl.ToString();
}
///Add an empt
Solution
We could probably use existing .NET classes here:
Where
var message = new MailMessage();
message.Subject = "This is my excellent &%? subject% & here is more text!";
message.CC.Add("r%eba@gmail.com");
message.To.Add("zamdrist@gmail.com");
message.To.Add("joe@gmail.com");
message.To.Add("j?anet@gmail.com");
message.CC.Add("jim@gmail.com");
message.Bcc.Add("cory@gmail.com");
var writer = new StringWriter();
writer.WriteLine("This is my body of text & here we are.");
writer.WriteLine();
writer.WriteLine("And here is yet more text. 100%!");
message.Body = writer.ToString();
Console.WriteLine(message.ToUrl());Where
ToUrl() is our extension method:using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using static System.Uri;
namespace System.Net.Mail
{
public static class Mailto
{
public static string ToUrl(this MailMessage message) =>
"mailto:?" + string.Join("&", Parameters(message));
static IEnumerable Parameters(MailMessage message)
{
if (message.To.Any())
yield return "to=" + Recipients(message.To);
if (message.CC.Any())
yield return "cc=" + Recipients(message.CC);
if (message.Bcc.Any())
yield return "bcc=" + Recipients(message.Bcc);
if (!string.IsNullOrWhiteSpace(message.Subject))
yield return "subject=" + EscapeDataString(message.Subject);
if (!string.IsNullOrWhiteSpace(message.Body))
yield return "body=" + EscapeDataString(message.Body);
}
static string Recipients(MailAddressCollection addresses) =>
string.Join(",", from r in addresses
select EscapeDataString(r.Address));
}
}Code Snippets
var message = new MailMessage();
message.Subject = "This is my excellent &%? subject% & here is more text!";
message.CC.Add("r%eba@gmail.com");
message.To.Add("zamdrist@gmail.com");
message.To.Add("joe@gmail.com");
message.To.Add("j?anet@gmail.com");
message.CC.Add("jim@gmail.com");
message.Bcc.Add("cory@gmail.com");
var writer = new StringWriter();
writer.WriteLine("This is my body of text & here we are.");
writer.WriteLine();
writer.WriteLine("And here is yet more text. 100%!");
message.Body = writer.ToString();
Console.WriteLine(message.ToUrl());using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using static System.Uri;
namespace System.Net.Mail
{
public static class Mailto
{
public static string ToUrl(this MailMessage message) =>
"mailto:?" + string.Join("&", Parameters(message));
static IEnumerable<string> Parameters(MailMessage message)
{
if (message.To.Any())
yield return "to=" + Recipients(message.To);
if (message.CC.Any())
yield return "cc=" + Recipients(message.CC);
if (message.Bcc.Any())
yield return "bcc=" + Recipients(message.Bcc);
if (!string.IsNullOrWhiteSpace(message.Subject))
yield return "subject=" + EscapeDataString(message.Subject);
if (!string.IsNullOrWhiteSpace(message.Body))
yield return "body=" + EscapeDataString(message.Body);
}
static string Recipients(MailAddressCollection addresses) =>
string.Join(",", from r in addresses
select EscapeDataString(r.Address));
}
}Context
StackExchange Code Review Q#129594, answer score: 6
Revisions (0)
No revisions yet.