Skip to content

Commit 558b186

Browse files
author
Jijie Chen
committedSep 11, 2017
Supported showing headers in mail message detail view
1 parent f4f9b83 commit 558b186

File tree

7 files changed

+70
-6
lines changed

7 files changed

+70
-6
lines changed
 

‎src/Papercut.Module.WebUI/Controllers/MessageController.cs

+1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public HttpResponseMessage Get(string id)
6767
{
6868
return Request.CreateResponse(HttpStatusCode.NotFound);
6969
}
70+
7071
var dto = MimeMessageEntry.Dto.CreateFrom(new MimeMessageEntry(messageEntry, messageLoader.LoadMailMessage(messageEntry)));
7172
return Request.CreateResponse(HttpStatusCode.OK, dto);
7273
}

‎src/Papercut.Module.WebUI/Models/MimeMessageEntry.cs

+10-3
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ public static Dto CreateFrom(MimeMessageEntry messageEntry)
8080
BCc = ToAddressList(mail?.Bcc),
8181
HtmlBody = mail?.HtmlBody,
8282
TextBody = mail?.TextBody,
83+
Headers = (mail?.Headers ?? new HeaderList()).Select(h => new HeaderDto { Name = h.Field, Value = h.Value}).ToList()
8384
};
8485
}
8586

@@ -115,16 +116,22 @@ static List<EmailAddressDto> ToAddressList(IList<InternetAddress> mailAddresses)
115116

116117

117118
public string HtmlBody { get; set; }
118-
119-
public string TextBody { get; set; }
120119

121-
120+
public string TextBody { get; set; }
121+
public List<HeaderDto> Headers { get; set; }
122122
}
123123

124124
public class EmailAddressDto
125125
{
126126
public string Name { get; set; }
127127
public string Address { get; set; }
128128
}
129+
130+
public class HeaderDto
131+
{
132+
public string Name { get; set; }
133+
public string Value { get; set; }
134+
}
129135
}
136+
130137
}

‎src/Papercut.Module.WebUI/assets/css/style.css

+15
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,21 @@
134134
padding: 10px;
135135
}
136136

137+
#preview-headers ul{
138+
margin: 0;
139+
padding: 0;
140+
margin-top: 15px;
141+
}
142+
143+
#preview-headers ul li{
144+
list-style: none;
145+
margin: 5px 0;
146+
}
147+
148+
#preview-headers ul li .header-name{
149+
font-weight:bold;
150+
}
151+
137152
.preview .tab-content {
138153
overflow-y: visible;
139154
}

‎src/Papercut.Module.WebUI/assets/index.html

+11-3
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,22 @@
145145
</div>
146146

147147
<div class="mail-content">
148-
<ul class="nav nav-tabs">
149-
<li ng-if="hasHTML(preview)" ng-class="{ active: hasHTML(preview) }"><a href="#preview-html" data-toggle="tab">HTML</a></li>
150-
<li ng-class="{ active: !hasHTML(preview) }"><a href="#preview-plain" data-toggle="tab">Plain text</a></li>
148+
<ul class="nav nav-tabs">
149+
<li ng-if="hasHTML(preview)" ng-class="{ active: hasHTML(preview) }"><a href="#preview-html" data-toggle="tab">HTML</a></li>
150+
<li ng-class="{ active: !hasHTML(preview) }"><a href="#preview-plain" data-toggle="tab">Plain text</a></li>
151+
<li><a href="#preview-headers" data-toggle="tab">Headers</a></li>
151152
</ul>
152153

153154
<div class="tab-content">
154155
<iframe target-blank="" ng-if="hasHTML(preview)" ng-class="{ active: hasHTML(preview) }" class="tab-pane" id="preview-html" body-html="preview.previewHTML" seamless frameborder="0" style="width: 100%"></iframe>
155156
<div class="tab-pane" ng-class="{ active: !hasHTML(preview) }" id="preview-plain" ng-bind-html="formatMessagePlain(preview)"></div>
157+
<div class="tab-pane" id="preview-headers">
158+
<ul>
159+
<li ng-repeat="header in preview.Headers">
160+
<span class="header-name">{{header.Name}}</span>: {{header.Value}}
161+
</li>
162+
</ul>
163+
</div>
156164
</div>
157165
</div>
158166
</div>

‎test/Papercut.Module.WebUI.Tests/MessageFacts/LoadMessageFacts.cs

+25
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,31 @@ public void ShouldLoadMessageDetailByID()
149149
}
150150

151151
[Test, Order(4)]
152+
public void ShouldContainHeadersInMessageDetail()
153+
{
154+
var existedMail = new MimeMessage
155+
{
156+
Subject = "Test",
157+
From = {new MailboxAddress("mffeng@gmail.com")},
158+
To = {new MailboxAddress("xwliu@gmail.com")},
159+
Body = new TextPart("plain") {Text = "Hello Buddy"}
160+
};
161+
existedMail.Headers.Add(HeaderId.ReplyTo, "one@replyto.com");
162+
existedMail.Headers.Add("X-Extended", "extended value");
163+
this._messageRepository.SaveMessage(fs => existedMail.WriteTo(fs));
164+
var messages = Get<MessageListResponse>("/api/messages").Messages;
165+
var id = messages.First().Id;
166+
167+
168+
var detail = Get<MimeMessageEntry.Dto>($"/api/messages/{id}");
169+
Assert.AreEqual(id, detail.Id);
170+
171+
var headers = detail.Headers;
172+
Assert.AreEqual("one@replyto.com", headers.First(h => h.Name == "Reply-To").Value);
173+
Assert.AreEqual("extended value", headers.First(h => h.Name == "X-Extended").Value);
174+
}
175+
176+
[Test, Order(0)]
152177
public void ShouldReturn404IfNotFoundByID()
153178
{
154179
var response = Client.GetAsync("/api/messages/some-strange-id").Result;

‎test/Papercut.Module.WebUI.Tests/Papercut.Module.WebUI.Tests.csproj

+7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3+
<Import Project="..\..\packages\NUnit3TestAdapter.3.8.0\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\..\packages\NUnit3TestAdapter.3.8.0\build\net35\NUnit3TestAdapter.props')" />
34
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
45
<PropertyGroup>
56
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -99,6 +100,12 @@
99100
</ItemGroup>
100101
<ItemGroup />
101102
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
103+
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
104+
<PropertyGroup>
105+
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
106+
</PropertyGroup>
107+
<Error Condition="!Exists('..\..\packages\NUnit3TestAdapter.3.8.0\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\NUnit3TestAdapter.3.8.0\build\net35\NUnit3TestAdapter.props'))" />
108+
</Target>
102109
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
103110
Other similar extension points exist, see Microsoft.Common.targets.
104111
<Target Name="BeforeBuild">

‎test/Papercut.Module.WebUI.Tests/packages.config

+1
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@
77
<package id="MimeKit" version="1.16.2" targetFramework="net45" />
88
<package id="Newtonsoft.Json" version="10.0.3" targetFramework="net45" />
99
<package id="NUnit" version="3.5.0" targetFramework="net45" />
10+
<package id="NUnit3TestAdapter" version="3.8.0" targetFramework="net45" />
1011
<package id="Serilog" version="2.5.0" targetFramework="net45" />
1112
</packages>

0 commit comments

Comments
 (0)
Please sign in to comment.