Skip to content

Commit

Permalink
fixes #24
Browse files Browse the repository at this point in the history
  • Loading branch information
AshleyMedway committed Feb 22, 2017
1 parent 5ebc706 commit ff3de77
Show file tree
Hide file tree
Showing 8 changed files with 133 additions and 47 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ bin
obj
*.userprefs
*.suo
.vs
.vs
/MailJet.Client.Tests/MailJet.Client.Tests.csproj.user
3 changes: 3 additions & 0 deletions MailJet.Client.Tests/MailJet.Client.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="TestData\TestImage.jpg">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="TestData\TextFile.txt">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
Expand Down
39 changes: 16 additions & 23 deletions MailJet.Client.Tests/SendMail.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
using MailJet.Client.Response;
using MailJet.Client.Response.Data;
using MailJet.Client.Response.Data;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Net.Mail;
using System.Net.Mime;
Expand Down Expand Up @@ -52,27 +49,22 @@ public void TemplateMessage()
public void MailMessage_Html_WithInlineAttachements()
{
var message = BaseMessage();
var body = "<html><head></head><body><img src=\"cid:test.jpg\"/></body></html>";
var body = "<h3>test<img src=\"cid:test.jpg\"/></h3>";
message.Body = body;
message.IsBodyHtml = true;
var view = AlternateView.CreateAlternateViewFromString(body, null, MediaTypeNames.Text.Html);
Response<DataItem> result;
using (var bmp = new Bitmap(128, 128))
var path = Path.Combine(Environment.CurrentDirectory, "TestData", "TestImage.jpg");
SentMessageData result;

using (var s = File.OpenRead(path))
{
using (var g = Graphics.FromImage(bmp))
{
using (var s = new MemoryStream())
{
g.FillRectangle(new SolidBrush(Color.Black), new Rectangle(0, 0, 128, 128));
bmp.Save(s, ImageFormat.Jpeg);
view.LinkedResources.Add(new LinkedResource(s, MediaTypeNames.Image.Jpeg) { ContentId = "test.jpg" });
message.AlternateViews.Add(view);
result = _client.SendMessage(message);
}
}
view.LinkedResources.Add(new LinkedResource(s, MediaTypeNames.Image.Jpeg) { ContentId = "test.jpg" });
message.AlternateViews.Add(view);
result = _client.SendMessage(message);
}

Assert.IsNotNull(result);
Assert.AreEqual(1, result.Count);
Assert.AreEqual(1, result.Sent.Length);
}

[Test]
Expand All @@ -82,7 +74,7 @@ public void MailMessage_Text_NoAttachements()
message.Body = "test";
var result = _client.SendMessage(message);
Assert.IsNotNull(result);
Assert.AreEqual(1, result.Count);
Assert.AreEqual(1, result.Sent.Length);
}

[Test]
Expand All @@ -102,19 +94,20 @@ public void MailMessage_Text_WithDisplayName()
message.Body = "test";
var result = _client.SendMessage(message);
Assert.IsNotNull(result);
Assert.AreEqual(1, result.Count);
Assert.AreEqual(1, result.Sent.Length);
}

[Test]
public void MailMessage_Text_WithAttachements()
{
var message = BaseMessage();
message.Subject = "Test with attachment";
message.Body = "test";
var path = Path.Combine(Environment.CurrentDirectory, "TestData", "TextFile.txt");
message.Attachments.Add(new Attachment(path));
var result = _client.SendMessage(message);
Assert.IsNotNull(result);
Assert.AreEqual(1, result.Count);
Assert.AreEqual(1, result.Sent.Length);
}

[Test]
Expand All @@ -125,7 +118,7 @@ public void MailMessage_Html_NoAttachements()
message.IsBodyHtml = true;
var result = _client.SendMessage(message);
Assert.IsNotNull(result);
Assert.AreEqual(1, result.Count);
Assert.AreEqual(1, result.Sent.Length);
}

private string FromAddress
Expand Down
Binary file added MailJet.Client.Tests/TestData/TestImage.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions MailJetClient/MailJet.Client.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@
<ConsolePause>false</ConsolePause>
</PropertyGroup>
<ItemGroup>
<Reference Include="MimeTypeMap, Version=2.1.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\MediaTypeMap.2.1.0.0\lib\net40\MimeTypeMap.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="RestSharp, Version=105.2.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\RestSharp.105.2.3\lib\net45\RestSharp.dll</HintPath>
<Private>True</Private>
Expand Down Expand Up @@ -62,6 +66,7 @@
<Compile Include="Response\Data\MessageData.cs" />
<Compile Include="Enum\MessageStatus.cs" />
<Compile Include="Response\Data\MetaSenderData.cs" />
<Compile Include="Response\Data\SentMessageData.cs" />
<Compile Include="Response\Data\TemplateContent.cs" />
<Compile Include="Response\Data\TemplateData.cs" />
<Compile Include="Response\ErrorResponse.cs" />
Expand Down
116 changes: 93 additions & 23 deletions MailJetClient/MailJetClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using System.Linq;
using System.Net;
using System.Net.Mail;
using MimeTypes;

namespace MailJet.Client
{
Expand Down Expand Up @@ -234,9 +235,15 @@ public Response<DataItem> SendTemplateMessage(long TemplateId, MailAddress[] To,
return ExecuteRequest<DataItem>(request);
}

public Response<DataItem> SendMessage(MailMessage Message)
public SentMessageData SendMessage(MailMessage Message)
{
var request = new RestRequest("send/message", Method.POST);
var request = new RestRequest("send/message", Method.POST)
{
RequestFormat = DataFormat.Json,
JsonSerializer = NewtonsoftJsonSerializer.Default
};

JObject message = new JObject();

if (Message.From == null)
throw new InvalidOperationException("You must specify the from address. http://dev.mailjet.com/guides/send-api-guide/");
Expand All @@ -256,74 +263,117 @@ public Response<DataItem> SendMessage(MailMessage Message)
throw new InvalidOperationException("Max Recipients is 50. http://dev.mailjet.com/guides/send-api-guide/");

if (String.IsNullOrWhiteSpace(Message.From.DisplayName))
request.AddParameter("from", Message.From.Address);
{
message.Add("FromEmail", Message.From.Address);
}
else
request.AddParameter("from", String.Format("{0} <{1}>", Message.From.DisplayName, Message.From.Address));
{
message.Add("FromEmail", Message.From.Address);
message.Add("FromName", Message.From.DisplayName);
}

request.AddParameter("subject", Message.Subject);
message.Add("Subject", Message.Subject);

string to = "";
foreach (var address in Message.To)
{
if (String.IsNullOrWhiteSpace(address.DisplayName))
request.AddParameter("to", address.Address);
{
to += address.Address + ",";
}
else
request.AddParameter("to", String.Format("\"{0}\" <{1}>", address.DisplayName, address.Address));
{
to += String.Format("{0} <{1}>,", address.DisplayName, address.Address);
}
}
message.Add("To", to);

string cc = "";
foreach (var address in Message.CC)
{
if (String.IsNullOrWhiteSpace(address.DisplayName))
request.AddParameter("cc", address.Address);
{
cc += address.Address + ",";
}
else
request.AddParameter("cc", String.Format("\"{0}\" <{1}>", address.DisplayName, address.Address));
{
cc += String.Format("{0} <{1}>,", address.DisplayName, address.Address);
}
}

if (!String.IsNullOrWhiteSpace(cc))
message.Add("CC", cc);

string bcc = "";
foreach (var address in Message.Bcc)
{
if (String.IsNullOrWhiteSpace(address.DisplayName))
request.AddParameter("bcc", address.Address);
{
bcc += address.Address + ",";
}
else
request.AddParameter("bcc", String.Format("\"{0}\" <{1}>", address.DisplayName, address.Address));
{
bcc += String.Format("{0} <{1}>,", address.DisplayName, address.Address);
}
}

if (!String.IsNullOrWhiteSpace(bcc))
message.Add("Bcc", bcc);

if (Message.IsBodyHtml)
request.AddParameter("html", Message.Body);
message.Add("Html-part", Message.Body);
else
request.AddParameter("text", Message.Body);
message.Add("Text-part", Message.Body);

if (Message.Attachments.Any())
{
if (Message.Attachments.Sum(x => x.ContentStream.Length) > 15000000)
throw new InvalidOperationException("Attachments cannot exceed 15MB. http://dev.mailjet.com/guides/send-api-guide/");

JArray attachments = new JArray();
foreach (var item in Message.Attachments)
{
using (MemoryStream ms = new MemoryStream())
{
item.ContentStream.CopyTo(ms);
request.AddFile("attachment", ms.ToArray(), item.Name);
JObject attachment = new JObject();
attachment.Add("Content-type", new JValue(MimeTypeMap.GetMimeType(Path.GetExtension(item.Name))));
attachment.Add("Filename", new JValue(item.Name));
string file = Convert.ToBase64String(ms.ToArray());
attachment.Add("content", new JValue(file));
attachments.Add(attachment);
}
}
message.Add("Attachments", attachments);
}

var view = Message.AlternateViews.FirstOrDefault();

if (view != null && view.LinkedResources != null && view.LinkedResources.Any())
{
JArray attachments = new JArray();
foreach (var item in view.LinkedResources)
{
using (var ms = new MemoryStream())
{
item.ContentStream.CopyTo(ms);
request.AddFile("inlineattachment", ms.ToArray(), item.ContentId, item.ContentType.MediaType);
JObject attachment = new JObject();
attachment.Add("Content-type", new JValue(MimeTypeMap.GetMimeType(Path.GetExtension(item.ContentId))));
attachment.Add("Filename", new JValue(item.ContentId));
string file = Convert.ToBase64String(ms.ToArray());
attachment.Add("content", new JValue(file));
attachments.Add(attachment);
}
}
message.Add("Inline_attachments", attachments);
}

if (Message.Sender != null && !String.IsNullOrWhiteSpace(Message.Sender.Address))
throw new NotImplementedException("Sender Address not yet supported.");

return ExecuteRequest<DataItem>(request);
request.AddJsonBody(message);

return SendMessage(request);
}

public Response<MessageData> GetMessageHistory(long MessageId)
Expand Down Expand Up @@ -552,22 +602,24 @@ public Response<ListRecipient> GetListRecipient(
/// <param name="CampaignAggregateID">Only show statistics for this aggregation.</param>
/// <param name="Range">The period of the aggregates (24 hours or 7 days).</param>
/// <returns>Aggregated campaign statistics grouped over intervals.</returns>
public Response<AggregateGraphStatistics> GetAggregateGraphStatistics(int? CampaignAggregateID = null, string Range = null) {
var request = new RestRequest("REST/aggregategraphstatistics", Method.GET);
public Response<AggregateGraphStatistics> GetAggregateGraphStatistics(int? CampaignAggregateID = null, string Range = null)
{
var request = new RestRequest("REST/aggregategraphstatistics", Method.GET);

if (CampaignAggregateID.HasValue)
request.AddParameter("CampaignAggregateID", CampaignAggregateID.Value);
if (CampaignAggregateID.HasValue)
request.AddParameter("CampaignAggregateID", CampaignAggregateID.Value);

if (!String.IsNullOrWhiteSpace(Range))
request.AddParameter("Range", Range);
if (!String.IsNullOrWhiteSpace(Range))
request.AddParameter("Range", Range);

return ExecuteRequest<AggregateGraphStatistics>(request);
return ExecuteRequest<AggregateGraphStatistics>(request);
}

private Response<T> ExecuteRequest<T>(RestRequest request) where T : DataItem
{
request.RequestFormat = DataFormat.Json;
request.JsonSerializer = NewtonsoftJsonSerializer.Default;

var result = WebClient.Execute(request);

if (result.ResponseStatus == ResponseStatus.Completed && (result.StatusCode == HttpStatusCode.NoContent))
Expand All @@ -581,6 +633,24 @@ private Response<T> ExecuteRequest<T>(RestRequest request) where T : DataItem
return data;
}

private SentMessageData SendMessage(RestRequest request)
{
request.RequestFormat = DataFormat.Json;
request.JsonSerializer = NewtonsoftJsonSerializer.Default;

var result = WebClient.Execute(request);

if (result.ResponseStatus == ResponseStatus.Completed && (result.StatusCode == HttpStatusCode.NoContent))
return null;

var error = JsonConvert.DeserializeObject<ErrorResponse>(result.Content);
if (!String.IsNullOrWhiteSpace(error.ErrorInfo) || !String.IsNullOrWhiteSpace(error.ErrorMessage))
throw new Exception(String.Format("{0}\n{1}", error.ErrorMessage, error.ErrorMessage));

var data = JsonConvert.DeserializeObject<SentMessageData>(result.Content);
return data;
}

private void ExecuteRequest(RestRequest request)
{
request.RequestFormat = DataFormat.Json;
Expand Down
13 changes: 13 additions & 0 deletions MailJetClient/Response/Data/SentMessageData.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace MailJet.Client.Response.Data
{
public class SentMessageData
{
public Sent[] Sent { get; set; }
}

public class Sent
{
public string Email { get; set; }
public long MessageID { get; set; }
}
}
1 change: 1 addition & 0 deletions MailJetClient/packages.config
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="MediaTypeMap" version="2.1.0.0" targetFramework="net45" />
<package id="Newtonsoft.Json" version="6.0.8" targetFramework="net45" />
<package id="RestSharp" version="105.2.3" targetFramework="net45" />
</packages>

0 comments on commit ff3de77

Please sign in to comment.