diff --git a/dashboard/src/components/MailDomainStatus.vue b/dashboard/src/components/MailDomainStatus.vue
index 59f6d28c0..ab1f8fcf6 100644
--- a/dashboard/src/components/MailDomainStatus.vue
+++ b/dashboard/src/components/MailDomainStatus.vue
@@ -85,7 +85,7 @@ onMounted(async () => {
| {{ $t('email.dnsStatus.current') }}: |
- {{ domainStatus[type].value ? domainStatus[type].value : ('['+$t('email.dnsStatus.recordNotSet')+']') }} |
+ {{ domainStatus[type].value ? domainStatus[type].value : ('['+$t('email.dnsStatus.recordNotSet')+']') }} {{ domainStatus[type].message }} |
diff --git a/src/mail.js b/src/mail.js
index c778b5889..0fa9818c5 100644
--- a/src/mail.js
+++ b/src/mail.js
@@ -277,7 +277,7 @@ async function checkSpf(mailDomain, mailFqdn) {
};
const [error, txtRecords] = await safe(dig.resolve(result.domain, result.type, DNS_OPTIONS));
- if (error) return Object.assign(result, { message: error.message });
+ if (error) return Object.assign(result, { status: 'failed', message: error.message });
let i;
for (i = 0; i < txtRecords.length; i++) {
@@ -364,7 +364,7 @@ async function checkDmarc(mailDomain) {
const [error, txtRecords] = await safe(dig.resolve(result.domain, result.type, DNS_OPTIONS));
if (error) return Object.assign(result, { status: 'failed', message: error.message });
- if (txtRecords.length === 0) return Object.assign(result, { status: 'failed', message: 'No DMARC records' });
+ if (txtRecords.length === 0) return Object.assign(result, { status: 'failed', message: 'No DMARC record' });
result.value = txtRecords[0].join('');
const actual = txtToDict(result.value);
@@ -596,12 +596,12 @@ async function checkConfiguration() {
const message = [];
- Object.keys(result.dns).forEach((type) => {
- const record = result.dns[type];
- if (!record.status) message.push(`${type.toUpperCase()} DNS record (${record.type}) did not match.\n * Hostname: \`${record.name}\`\n * Expected: \`${record.expected}\`\n * Actual: \`${record.value}\``);
+ [ 'mx', 'dmarc', 'spf', 'dkim', 'ptr4', 'ptr6' ].forEach((type) => {
+ const record = result[type];
+ if (record.status === 'failed') message.push(`${type.toUpperCase()} DNS record (${record.type}) did not match.\n * Hostname: \`${record.name}\`\n * Expected: \`${record.expected}\`\n * Actual: \`${record.value || record.message}\``);
});
- if (result.relay && result.relay.status === false) message.push(`Relay error: ${result.relay.value}`);
- if (result.rbl && result.rbl.status === false) { // rbl field contents is optional
+ if (result.relay.status === 'failed') message.push(`Relay error: ${result.relay.message}`);
+ if (result.rbl4.status === 'failed') {
const servers = result.rbl.servers.map((bs) => `[${bs.name}](${bs.site})`); // in markdown
message.push(`This server's IP \`${result.rbl.ip}\` is blocked in the following servers - ${servers.join(', ')}`);
}