HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpMinor

C# helper class - mailto

Submitted by: @import:stackexchange-codereview··
0
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

Solution

We could probably use existing .NET classes here:

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.