summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xSendGrid/SendGridMail/ISendGrid.cs13
-rwxr-xr-xSendGrid/SendGridMail/Transport/REST.cs134
-rwxr-xr-xSendGrid/Tests/TestSendgrid.cs39
-rwxr-xr-xSendGrid/Tests/TestUtils.cs18
-rwxr-xr-xSendGrid/Tests/Tests.csproj1
5 files changed, 147 insertions, 58 deletions
diff --git a/SendGrid/SendGridMail/ISendGrid.cs b/SendGrid/SendGridMail/ISendGrid.cs
index ced8830..3be707f 100755
--- a/SendGrid/SendGridMail/ISendGrid.cs
+++ b/SendGrid/SendGridMail/ISendGrid.cs
@@ -46,6 +46,13 @@ namespace SendGridMail
/// </summary>
/// <returns>MIME to be sent</returns>
MailMessage CreateMimeMessage();
+
+ /// <summary>
+ /// Creates a new transport object, and sends this message out.
+ /// </summary>
+ /// <param name="credentials">Sendgrid user credentials</param>
+ void Mail(NetworkCredential credentials);
+
#endregion
#region Methods for setting data
@@ -253,11 +260,5 @@ namespace SendGridMail
/// </summary>
void EnableBypassListManagement();
#endregion
-
- /// <summary>
- /// Creates a new transport object, and sends this message out.
- /// </summary>
- /// <param name="credentials">Sendgrid user credentials</param>
- void Mail(NetworkCredential credentials);
}
}
diff --git a/SendGrid/SendGridMail/Transport/REST.cs b/SendGrid/SendGridMail/Transport/REST.cs
index e60c2a2..7b8c361 100755
--- a/SendGrid/SendGridMail/Transport/REST.cs
+++ b/SendGrid/SendGridMail/Transport/REST.cs
@@ -4,21 +4,18 @@ using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Net;
-using System.Net.Mail;
using System.Text;
-using System.Web;
using System.Xml;
using CodeScales.Http;
using CodeScales.Http.Entity;
using CodeScales.Http.Entity.Mime;
using CodeScales.Http.Methods;
-using HttpResponse = System.Web.HttpResponse;
namespace SendGridMail.Transport
{
public class REST : ITransport
{
- // REST delivery settings
+ #region Properties
public const String Endpoint = "http://sendgrid.com/api/mail.send";
public const String JsonFormat = "json";
public const String XmlFormat = "xml";
@@ -28,12 +25,24 @@ namespace SendGridMail.Transport
private readonly NameValueCollection _queryParameters;
private readonly String _restEndpoint;
private readonly String _format;
-
+ #endregion
+
+ /// <summary>
+ /// Factory method for REST transport of sendgrid messages
+ /// </summary>
+ /// <param name="credentials">SendGrid credentials for sending mail messages</param>
+ /// <param name="url">The uri of the REST endpoint</param>
+ /// <returns>New instance of the transport mechanism</returns>
public static REST GetInstance(NetworkCredential credentials, String url = Endpoint)
{
return new REST(credentials, url);
}
+ /// <summary>
+ /// Creates a new REST interface for sending mail. Preference is using the Factory method.
+ /// </summary>
+ /// <param name="credentials">SendGrid user parameters</param>
+ /// <param name="url">The uri of the REST endpoint</param>
internal REST(NetworkCredential credentials, String url = Endpoint)
{
_credentials = credentials;
@@ -42,6 +51,73 @@ namespace SendGridMail.Transport
_restEndpoint = url + "." + _format;
}
+ /// <summary>
+ /// Delivers a message over SendGrid's REST interface
+ /// </summary>
+ /// <param name="message"></param>
+ public void Deliver(ISendGrid message)
+ {
+ MultipartEntity multipartEntity;
+ HttpPost postMethod;
+
+ var client = InitializeTransport(out multipartEntity, out postMethod);
+ AttachFormParams(message, multipartEntity);
+ AttachFiles(message, multipartEntity);
+ var response = client.Execute(postMethod);
+ CheckForErrors(response);
+ }
+
+ #region Support Methods
+
+ private HttpClient InitializeTransport(out MultipartEntity multipartEntity, out HttpPost postMethod)
+ {
+ var client = new HttpClient();
+ postMethod = new HttpPost(new Uri(_restEndpoint));
+
+ multipartEntity = new MultipartEntity();
+ postMethod.Entity = multipartEntity;
+ return client;
+ }
+
+ private void AttachFormParams(ISendGrid message, MultipartEntity multipartEntity)
+ {
+ var formParams = FetchFormParams(message);
+ formParams.ForEach(kvp => multipartEntity.AddBody(new StringBody(Encoding.UTF8, kvp.Key, kvp.Value)));
+ }
+
+ private void AttachFiles(ISendGrid message, MultipartEntity multipartEntity)
+ {
+ var files = FetchFileBodies(message);
+ files.ForEach(kvp => multipartEntity.AddBody(new FileBody("files[" + kvp.Key + "]", kvp.Key, kvp.Value)));
+ }
+
+ private void CheckForErrors(CodeScales.Http.Methods.HttpResponse response)
+ {
+ var status = EntityUtils.ToString(response.Entity);
+ var stream = new MemoryStream(Encoding.UTF8.GetBytes(status));
+
+ using (var reader = XmlReader.Create(stream))
+ {
+ while (reader.Read())
+ {
+ if (reader.IsStartElement())
+ {
+ switch (reader.Name)
+ {
+ case "result":
+ break;
+ case "message": // success
+ return;
+ case "error": // failure
+ throw new ProtocolViolationException(status);
+ default:
+ throw new ArgumentException("Unknown element: " + reader.Name);
+ }
+ }
+ }
+ }
+ }
+
private List<KeyValuePair<String, String>> FetchFormParams(ISendGrid message)
{
var result = new List<KeyValuePair<string, string>>()
@@ -83,52 +159,6 @@ namespace SendGridMail.Transport
return message.Attachments.Select(name => new KeyValuePair<String, FileInfo>(name, new FileInfo(name))).ToList();
}
- public void Deliver(ISendGrid message)
- {
- var client = new HttpClient();
- var postMethod = new HttpPost(new Uri(_restEndpoint));
-
- var multipartEntity = new MultipartEntity();
- postMethod.Entity = multipartEntity;
-
- var formParams = FetchFormParams(message);
-
- formParams.ForEach(kvp => multipartEntity.AddBody(new StringBody(Encoding.UTF8, kvp.Key, kvp.Value)));
-
- var files = FetchFileBodies(message);
- files.ForEach(kvp => multipartEntity.AddBody(new FileBody("files["+kvp.Key+"]", kvp.Key, kvp.Value)));
-
- CodeScales.Http.Methods.HttpResponse response = client.Execute(postMethod);
-
- Console.WriteLine("Response Code: " + response.ResponseCode);
- Console.WriteLine("Response Content: " + EntityUtils.ToString(response.Entity));
-
- Console.WriteLine("Res");
-
- var status = EntityUtils.ToString(response.Entity);
- var stream = new MemoryStream(Encoding.UTF8.GetBytes(status));
-
-
- using (var reader = XmlReader.Create(stream))
- {
- while (reader.Read())
- {
- if (reader.IsStartElement())
- {
- switch (reader.Name)
- {
- case "result":
- break;
- case "message": // success
- return;
- case "error": // failure
- throw new ProtocolViolationException(status);
- default:
- throw new ArgumentException("Unknown element: " + reader.Name);
- }
- }
- }
- }
- }
+ #endregion
}
}
diff --git a/SendGrid/Tests/TestSendgrid.cs b/SendGrid/Tests/TestSendgrid.cs
index 7d5ab7b..71160dc 100755
--- a/SendGrid/Tests/TestSendgrid.cs
+++ b/SendGrid/Tests/TestSendgrid.cs
@@ -1,7 +1,9 @@
using System;
using System.Collections.Generic;
using System.Globalization;
+using System.IO;
using System.Linq;
+using System.Net.Mail;
using System.Text;
using NUnit.Framework;
using SendGridMail;
@@ -285,5 +287,42 @@ namespace Tests
String json = header.AsJson();
Assert.AreEqual("{\"filters\" : {\"bypass_list_management\" : {\"settings\" : {\"enable\" : \"1\"}}}}", json);
}
+
+ [Test]
+ public void CreateMimeMessage()
+ {
+ var message = SendGrid.GenerateInstance();
+ var attachment = System.IO.Path.GetTempFileName();
+ var text = "this is a test";
+ var html = "<b>This<\b> is a better test";
+ var headers = new KeyValuePair<String, String>("custom", "header");
+ message.AddAttachment(attachment);
+ message.Text = text;
+ message.Html = html;
+ message.AddTo("foo@bar.com");
+ message.From = new MailAddress("foo@bar.com");
+ message.AddHeaders(new Dictionary<string, string>{{headers.Key, headers.Value}});
+ message.EnableGravatar();
+
+ var mime = message.CreateMimeMessage();
+
+ var sr = new StreamReader(mime.AlternateViews[0].ContentStream);
+ var result = sr.ReadToEnd();
+ Assert.AreEqual(text, result);
+
+ sr = new StreamReader(mime.AlternateViews[1].ContentStream);
+ result = sr.ReadToEnd();
+ Assert.AreEqual(html, result);
+
+ result = mime.Headers.Get(headers.Key);
+ Assert.AreEqual(headers.Value, result);
+
+ result = mime.Headers.Get("X-Smtpapi");
+ var expected = "{\"filters\" : {\"gravatar\" : {\"settings\" : {\"enable\" : \"1\"}}}}";
+ Assert.AreEqual(expected, result);
+
+ result = mime.Attachments[0].Name;
+ Assert.AreEqual(Path.GetFileName(attachment), result);
+ }
}
}
diff --git a/SendGrid/Tests/TestUtils.cs b/SendGrid/Tests/TestUtils.cs
new file mode 100755
index 0000000..dda9d19
--- /dev/null
+++ b/SendGrid/Tests/TestUtils.cs
@@ -0,0 +1,18 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using NUnit.Framework;
+
+namespace Tests
+{
+ [TestFixture]
+ public class TestUtils
+ {
+ [Test]
+ public void Test()
+ {
+
+ }
+ }
+}
diff --git a/SendGrid/Tests/Tests.csproj b/SendGrid/Tests/Tests.csproj
index 8009274..cd43bd1 100755
--- a/SendGrid/Tests/Tests.csproj
+++ b/SendGrid/Tests/Tests.csproj
@@ -58,6 +58,7 @@
<Compile Include="TestSendgrid.cs" />
<Compile Include="TestSendgridMessageSetup.cs" />
<Compile Include="TestTreeNode.cs" />
+ <Compile Include="TestUtils.cs" />
<Compile Include="Transport\TestREST.cs" />
<Compile Include="Transport\TestSMTP.cs" />
</ItemGroup>