Skip to content

Commit 3ffc81c

Browse files
committed
feat(email): include notification level in email subject line
Adds the NotificationRule's level (e.g. [WARNING], [ERROR]) to the subject of outgoing SMTP emails. Improves clarity and urgency of notifications received by users. Uses ctx.ruleLevel() for formatting. Signed-off-by: ch8matt <g.matthieu49@gmail.com>
1 parent cd32c89 commit 3ffc81c

2 files changed

Lines changed: 15 additions & 14 deletions

File tree

src/main/java/org/dependencytrack/notification/publisher/SendMailPublisher.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,12 +130,13 @@ private void sendNotification(final PublishContext ctx, Notification notificatio
130130
return;
131131
}
132132
String unescapedContent = StringEscapeUtils.unescapeHtml4(content);
133-
133+
String subject = emailSubjectPrefix.trim() + " [" + ctx.notificationLevel() + "] " + notification.getTitle();
134+
134135
try {
135136
final SendMail sendMail = new SendMail()
136137
.from(smtpFrom)
137138
.to(destinations)
138-
.subject(emailSubjectPrefix + " " + notification.getTitle())
139+
.subject(subject)
139140
.body(MediaType.TEXT_HTML.equals(mimeType) ? StringEscapeUtils.escapeHtml4(unescapedContent) : unescapedContent)
140141
.bodyMimeType(mimeType)
141142
.host(smtpHostname)

src/test/java/org/dependencytrack/notification/publisher/SendMailPublisherTest.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ public void testMailSubjectIsSetCorrectly() {
129129

130130
assertThat(greenMail.getReceivedMessages()).satisfiesExactly(message ->
131131
assertThat(message.getSubject())
132-
.isEqualTo("[Dependency-Track] New Vulnerability Identified on Project: [projectName : projectVersion]")
132+
.isEqualTo("[Dependency-Track] [INFORMATIONAL] New Vulnerability Identified on Project: [projectName : projectVersion]")
133133
);
134134
}
135135

@@ -138,7 +138,7 @@ public void testInformWithBomConsumedNotification() {
138138
super.baseTestInformWithBomConsumedNotification();
139139

140140
assertThat(greenMail.getReceivedMessages()).satisfiesExactly(message -> {
141-
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] Bill of Materials Consumed");
141+
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] [INFORMATIONAL] Bill of Materials Consumed");
142142
assertThat(message.getContent()).isInstanceOf(MimeMultipart.class);
143143
final MimeMultipart content = (MimeMultipart) message.getContent();
144144
assertThat(content.getCount()).isEqualTo(1);
@@ -170,7 +170,7 @@ public void testInformWithBomProcessingFailedNotification() {
170170
super.baseTestInformWithBomProcessingFailedNotification();
171171

172172
assertThat(greenMail.getReceivedMessages()).satisfiesExactly(message -> {
173-
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] Bill of Materials Processing Failed");
173+
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] [ERROR] Bill of Materials Processing Failed");
174174
assertThat(message.getContent()).isInstanceOf(MimeMultipart.class);
175175
final MimeMultipart content = (MimeMultipart) message.getContent();
176176
assertThat(content.getCount()).isEqualTo(1);
@@ -206,7 +206,7 @@ public void testInformWithBomValidationFailedNotification() {
206206
super.baseTestInformWithBomValidationFailedNotification();
207207

208208
assertThat(greenMail.getReceivedMessages()).satisfiesExactly(message -> {
209-
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] Bill of Materials Validation Failed");
209+
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] [ERROR] Bill of Materials Validation Failed");
210210
assertThat(message.getContent()).isInstanceOf(MimeMultipart.class);
211211
final MimeMultipart content = (MimeMultipart) message.getContent();
212212
assertThat(content.getCount()).isEqualTo(1);
@@ -238,7 +238,7 @@ public void testInformWithBomProcessingFailedNotificationAndNoSpecVersionInSubje
238238
super.baseTestInformWithBomProcessingFailedNotificationAndNoSpecVersionInSubject();
239239

240240
assertThat(greenMail.getReceivedMessages()).satisfiesExactly(message -> {
241-
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] Bill of Materials Processing Failed");
241+
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] [ERROR] Bill of Materials Processing Failed");
242242
assertThat(message.getContent()).isInstanceOf(MimeMultipart.class);
243243
final MimeMultipart content = (MimeMultipart) message.getContent();
244244
assertThat(content.getCount()).isEqualTo(1);
@@ -274,7 +274,7 @@ public void testInformWithDataSourceMirroringNotification() {
274274
super.baseTestInformWithDataSourceMirroringNotification();
275275

276276
assertThat(greenMail.getReceivedMessages()).satisfiesExactly(message -> {
277-
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] GitHub Advisory Mirroring");
277+
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] [ERROR] GitHub Advisory Mirroring");
278278
assertThat(message.getContent()).isInstanceOf(MimeMultipart.class);
279279
final MimeMultipart content = (MimeMultipart) message.getContent();
280280
assertThat(content.getCount()).isEqualTo(1);
@@ -304,7 +304,7 @@ public void testInformWithNewVulnerabilityNotification() {
304304
super.baseTestInformWithNewVulnerabilityNotification();
305305

306306
assertThat(greenMail.getReceivedMessages()).satisfiesExactly(message -> {
307-
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] New Vulnerability Identified on Project: [projectName : projectVersion]");
307+
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] [INFORMATIONAL] New Vulnerability Identified on Project: [projectName : projectVersion]");
308308
assertThat(message.getContent()).isInstanceOf(MimeMultipart.class);
309309
final MimeMultipart content = (MimeMultipart) message.getContent();
310310
assertThat(content.getCount()).isEqualTo(1);
@@ -341,7 +341,7 @@ public void testPublishWithScheduledNewVulnerabilitiesNotification() {
341341
super.baseTestPublishWithScheduledNewVulnerabilitiesNotification();
342342

343343
assertThat(greenMail.getReceivedMessages()).satisfiesExactly(message -> {
344-
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] New Vulnerabilities Summary");
344+
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] [INFORMATIONAL] New Vulnerabilities Summary");
345345
assertThat(message.getContent()).isInstanceOf(MimeMultipart.class);
346346
final MimeMultipart content = (MimeMultipart) message.getContent();
347347
assertThat(content.getCount()).isEqualTo(1);
@@ -399,7 +399,7 @@ public void testPublishWithScheduledNewPolicyViolationsNotification() {
399399
super.baseTestPublishWithScheduledNewPolicyViolationsNotification();
400400

401401
assertThat(greenMail.getReceivedMessages()).satisfiesExactly(message -> {
402-
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] New Policy Violations Summary");
402+
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] [INFORMATIONAL] New Policy Violations Summary");
403403
assertThat(message.getContent()).isInstanceOf(MimeMultipart.class);
404404
final MimeMultipart content = (MimeMultipart) message.getContent();
405405
assertThat(content.getCount()).isEqualTo(1);
@@ -458,7 +458,7 @@ public void testInformWithNewVulnerableDependencyNotification() {
458458
super.baseTestInformWithNewVulnerableDependencyNotification();
459459

460460
assertThat(greenMail.getReceivedMessages()).satisfiesExactly(message -> {
461-
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] Vulnerable Dependency Introduced");
461+
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] [INFORMATIONAL] Vulnerable Dependency Introduced");
462462
assertThat(message.getContent()).isInstanceOf(MimeMultipart.class);
463463
final MimeMultipart content = (MimeMultipart) message.getContent();
464464
assertThat(content.getCount()).isEqualTo(1);
@@ -500,7 +500,7 @@ public void testInformWithProjectAuditChangeNotification() {
500500
super.baseTestInformWithProjectAuditChangeNotification();
501501

502502
assertThat(greenMail.getReceivedMessages()).satisfiesExactly(message -> {
503-
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] Analysis Decision: Finding Suppressed");
503+
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] [INFORMATIONAL] Analysis Decision: Finding Suppressed");
504504
assertThat(message.getContent()).isInstanceOf(MimeMultipart.class);
505505
final MimeMultipart content = (MimeMultipart) message.getContent();
506506
assertThat(content.getCount()).isEqualTo(1);
@@ -541,7 +541,7 @@ public void testInformWithEscapedData() {
541541
super.baseTestInformWithEscapedData();
542542

543543
assertThat(greenMail.getReceivedMessages()).satisfiesExactly(message -> {
544-
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] Notification Test");
544+
assertThat(message.getSubject()).isEqualTo("[Dependency-Track] [ERROR] Notification Test");
545545
assertThat(message.getContent()).isInstanceOf(MimeMultipart.class);
546546
final MimeMultipart content = (MimeMultipart) message.getContent();
547547
assertThat(content.getCount()).isEqualTo(1);

0 commit comments

Comments
 (0)