Skip to content

Commit 97c4b9d

Browse files
committed
Fix mentions in front-end + email spam
1 parent dad5c82 commit 97c4b9d

File tree

3 files changed

+18
-9
lines changed

3 files changed

+18
-9
lines changed

api/app/Notifications/Forms/FormEmailNotification.php

+14-5
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,23 @@ private function addCustomHeaders(Email $message): void
127127
$formId = $this->event->form->id;
128128
$submissionId = $this->event->data['submission_id'] ?? 'unknown';
129129
$domain = Str::after(config('app.url'), '://');
130+
$timestamp = time();
130131

131-
$uniquePart = substr(md5($formId . $submissionId), 0, 8);
132-
$messageId = "form-{$formId}-{$uniquePart}@{$domain}";
133-
$references = "form-{$formId}@{$domain}";
132+
// Create a unique Message-ID for each submission
133+
$messageId = "<form-{$formId}-submission-{$submissionId}-{$timestamp}@{$domain}>";
134134

135-
$message->getHeaders()->remove('Message-ID');
136-
$message->getHeaders()->addIdHeader('Message-ID', $messageId);
135+
// Create a References header that links to the form, but not to specific submissions
136+
$references = "<form-{$formId}@{$domain}>";
137+
138+
// Add our custom Message-ID as X-Custom-Message-ID
139+
$message->getHeaders()->addTextHeader('X-Custom-Message-ID', $messageId);
140+
141+
// Add References header
137142
$message->getHeaders()->addTextHeader('References', $references);
143+
144+
// Add a unique Thread-Index to further prevent grouping
145+
$threadIndex = base64_encode(pack('H*', md5($formId . $submissionId . $timestamp)));
146+
$message->getHeaders()->addTextHeader('Thread-Index', $threadIndex);
138147
}
139148

140149
private function getMailData(): array

client/composables/useParseMention.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export function useParseMention(content, mentionsAllowed, form, formData) {
1414
const doc = parser.parseFromString(content, 'text/html')
1515

1616
// Find all elements with mention attribute
17-
const mentionElements = doc.querySelectorAll('[mention]')
17+
const mentionElements = doc.querySelectorAll('[mention], [mention=""]')
1818

1919
mentionElements.forEach(element => {
2020
const fieldId = element.getAttribute('mention-field-id')
@@ -36,4 +36,4 @@ export function useParseMention(content, mentionsAllowed, form, formData) {
3636

3737
// Return the processed HTML content
3838
return doc.body.innerHTML
39-
}
39+
}

client/lib/quill/quillMentionExtension.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export default function registerMentionExtension(Quill) {
1818
node.setAttribute('mention', 'true')
1919

2020
if (data && typeof data === 'object') {
21-
node.setAttribute('mention-field-id', data.field?.nf_id || '')
21+
node.setAttribute('mention-field-id', data.field?.id || '')
2222
node.setAttribute('mention-field-name', data.field?.name || '')
2323
node.setAttribute('mention-fallback', data.fallback || '')
2424
node.textContent = data.field?.name || ''
@@ -53,7 +53,7 @@ export default function registerMentionExtension(Quill) {
5353
static value(domNode) {
5454
return {
5555
field: {
56-
nf_id: domNode.getAttribute('mention-field-id') || '',
56+
id: domNode.getAttribute('mention-field-id') || '',
5757
name: domNode.getAttribute('mention-field-name') || ''
5858
},
5959
fallback: domNode.getAttribute('mention-fallback') || ''

0 commit comments

Comments
 (0)