diff --git a/Apis/api/Services/EmailApiEmailSender.cs b/Apis/api/Services/EmailApiEmailSender.cs
index cd51feb..384515d 100644
--- a/Apis/api/Services/EmailApiEmailSender.cs
+++ b/Apis/api/Services/EmailApiEmailSender.cs
@@ -6,6 +6,7 @@ using EmailApi.Models.Requests;
using Microsoft.Extensions.Options;
using Models.Requests;
using Models.Settings;
+using System.Net;
namespace Api.Services;
@@ -194,31 +195,35 @@ public sealed class EmailApiEmailSender : IEmailSender
///
—
"; + : "—
"; var gaps = result.Gaps?.Count > 0 - ? "—
"; + : "—
"; var recommendations = result.Recommendations?.Count > 0 - ? "—
"; + : "—
"; + // Render the HTML template with substituted values + // email.match.body is now stored as HTML in the database var body = _emailTemplates.Render("email.match.body", language, ("cvDocumentId", cvDocumentId), ("jobLabel", jobLabel ?? "N/A"), ("jobUrl", result.JobUrl ?? "N/A"), ("score", result.Score.ToString()), - ("summary", result.Summary ?? string.Empty), + ("summary", WebUtility.HtmlEncode(result.Summary ?? string.Empty)), ("strengths", strengths), ("gaps", gaps), ("recommendations", recommendations)); + // Append the job search footer if link is provided if (!string.IsNullOrWhiteSpace(jobSearchLink)) { body += _emailTemplates.Render("email.match.job-search-footer", language, diff --git a/Apis/email-data/Migrations/20260601133043_InitialSchema.cs b/Apis/email-data/Migrations/20260601133043_InitialSchema.cs index 0568ed2..b790a60 100644 --- a/Apis/email-data/Migrations/20260601133043_InitialSchema.cs +++ b/Apis/email-data/Migrations/20260601133043_InitialSchema.cs @@ -44,33 +44,117 @@ namespace Email.Data.Migrations Row("email.match.subject", "en", "MyAi.ro CV Match: {{score}}% - {{jobLabel}}", "Subject for the CV match result email"); Row("email.match.subject", "ro", "MyAi.ro Potrivire CV: {{score}}% - {{jobLabel}}", "Subiect email rezultat potrivire CV"); - // Match result email — body + // Match result email — body (HTML formatted) Row("email.match.body", "en", - "CV Matcher result\n\nCV Document ID: {{cvDocumentId}}\nJob: {{jobLabel}}\nJob URL: {{jobUrl}}\nScore: {{score}}%\n\nSummary:\n{{summary}}\n\nStrengths:\n{{strengths}}\n\nGaps:\n{{gaps}}\n\nRecommendations:\n{{recommendations}}", - "Body for the CV match result email"); + @"| CV ID | +{{cvDocumentId}} | +
| Job | +{{jobLabel}} | +
| URL | +{{jobUrl}} | +
| Score | +{{score}}% | +
{{summary}}
+| ID Document CV | +{{cvDocumentId}} | +
| Job | +{{jobLabel}} | +
| URL | +{{jobUrl}} | +
| Scor | +{{score}}% | +
{{summary}}
+Want to find more jobs matching your CV?
+ +(link valid for {{expiryDays}} days)
", + "Job search CTA appended to match result email (HTML formatted)"); Row("email.match.job-search-footer", "ro", - "\n\n---\nVrei sa gasesti mai multe joburi potrivite CV-ului tau?\nClick: {{jobSearchLink}}\n(link valabil {{expiryDays}} zile)", - "CTA cautare joburi adaugat la emailul de potrivire CV"); + @"Vrei să găsești mai multe joburi potrivite CV-ului tău?
+ +(link valabil {{expiryDays}} zile)
", + "CTA cautare joburi adaugat la emailul de potrivire CV (format HTML)"); // Job search results email — subject Row("email.search-results.subject", "en", "MyAi.ro: {{count}} jobs matching your CV", "Subject for job search results email"); Row("email.search-results.subject", "ro", "MyAi.ro: {{count}} joburi potrivite CV-ului tau", "Subiect email rezultate cautare joburi"); - // Job search results email — body preamble (items appended in code) - Row("email.search-results.body", "en", "MyAi.ro found {{count}} jobs matching your CV:\n\n{{items}}", "Body preamble for job search results email"); - Row("email.search-results.body", "ro", "MyAi.ro a gasit {{count}} joburi potrivite CV-ului tau:\n\n{{items}}", "Corpul emailului de rezultate cautare joburi"); + // Job search results email — body preamble (items appended in code) - HTML formatted + Row("email.search-results.body", "en", + @"MyAi.ro found {{count}} jobs matching your CV:
+MyAi.ro a găsit {{count}} joburi potrivite CV-ului tău:
+
+No jobs found
+MyAi.ro found no jobs matching your CV at this moment. Please try again later or update your CV to improve your match results.
+
+Niciun job găsit
+MyAi.ro nu a găsit joburi potrivite CV-ului tău în acest moment. Te rugăm să încerci din nou mai târziu sau să-ți actualizezi CV-ul pentru a obține rezultate mai bune.
+