@strapi/provider-email-sendmail 5.48.0 → 5.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,6 +6,10 @@ var nodemailer = require('nodemailer');
6
6
  var addressing = require('./addressing.js');
7
7
  var logger = require('./logger.js');
8
8
 
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var nodemailer__default = /*#__PURE__*/_interopDefault(nodemailer);
12
+
9
13
  /**
10
14
  * Mirrors legacy `const devPort = options.devPort || -1` (guileen/node-sendmail).
11
15
  * `0` is falsy → `-1` (MX mode). `true` is truthy and was passed to `createConnection` (Node
@@ -70,7 +74,7 @@ var logger = require('./logger.js');
70
74
  }));
71
75
  }
72
76
  async function trySendViaHost(exchange, smtpPort, srcHost, fromEnvelope, recipients, mail, dkim, options) {
73
- const transporter = nodemailer.createTransport({
77
+ const transporter = nodemailer__default.default.createTransport({
74
78
  host: exchange,
75
79
  port: smtpPort,
76
80
  secure: false,
@@ -1 +1 @@
1
- {"version":3,"file":"direct-smtp.js","sources":["../src/direct-smtp.ts"],"sourcesContent":["import { resolveMx as dnsResolveMx } from 'dns/promises';\nimport { hostname as osHostname } from 'os';\nimport nodemailer from 'nodemailer';\nimport type { SentMessageInfo, SendMailOptions } from 'nodemailer';\n\nimport {\n collectRecipients,\n extractEmail,\n getHostFromAddress,\n groupRecipientsByDomain,\n} from './addressing';\nimport { createLogger } from './logger';\nimport type { ProviderSendmailOptions } from './types';\n\n/**\n * Mirrors legacy `const devPort = options.devPort || -1` (guileen/node-sendmail).\n * `0` is falsy → `-1` (MX mode). `true` is truthy and was passed to `createConnection` (Node\n * coerces port `true` to `1`).\n */\nfunction getEffectiveDevPort(options: ProviderSendmailOptions): number {\n const v = options.devPort;\n if (v === undefined || v === false || v === null) {\n return -1;\n }\n if (v === true) {\n return 1;\n }\n if (typeof v === 'number') {\n return v || -1;\n }\n return -1;\n}\n\n/**\n * Legacy `sendmail` connects with `createConnection(devPort, devHost)` in dev mode — the\n * dev port is the SMTP port. Otherwise use `smtpPort` (default 25).\n */\nfunction getOutboundSmtpPort(options: ProviderSendmailOptions): number {\n const dev = getEffectiveDevPort(options);\n if (dev !== -1) {\n return dev;\n }\n return options.smtpPort || 25;\n}\n\n/**\n * Build list of SMTP peers to try for a recipient domain (MX resolution or dev server),\n * matching guileen/node-sendmail `connectMx` + `smtpHost` append behavior.\n */\nexport async function resolveMxHosts(\n domain: string,\n options: ProviderSendmailOptions\n): Promise<Array<{ exchange: string }>> {\n const devPort = getEffectiveDevPort(options);\n const devHost = options.devHost || 'localhost';\n\n if (devPort !== -1) {\n return [{ exchange: devHost }];\n }\n\n let records: Awaited<ReturnType<typeof dnsResolveMx>>;\n try {\n records = await dnsResolveMx(domain);\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n throw new Error(`can not resolve Mx of <${domain}>: ${e.message}`);\n }\n\n if (!records || records.length === 0) {\n throw new Error(`can not resolve Mx of <${domain}>`);\n }\n\n records.sort((a, b) => a.priority - b.priority);\n\n // Mirror legacy `const smtpHost = options.smtpHost || -1` behavior: falsy (eg 0) disables.\n const smtpHost = options.smtpHost || -1;\n if (smtpHost !== -1) {\n records.push({ exchange: String(smtpHost), priority: 9999 });\n }\n\n return records.map((r) => ({\n exchange: r.exchange.replace(/\\.$/, ''),\n }));\n}\n\nasync function trySendViaHost(\n exchange: string,\n smtpPort: number,\n srcHost: string,\n fromEnvelope: string,\n recipients: string[],\n mail: SendMailOptions,\n dkim: SendMailOptions['dkim'],\n options: ProviderSendmailOptions\n): Promise<SentMessageInfo> {\n const transporter = nodemailer.createTransport({\n host: exchange,\n port: smtpPort,\n secure: false,\n // Legacy sendmail@1.6.1 uses plain SMTP sockets and does not attempt STARTTLS.\n ignoreTLS: true,\n requireTLS: false,\n name: srcHost,\n tls: {\n rejectUnauthorized: options.rejectUnauthorized,\n },\n connectionTimeout: 60_000,\n greetingTimeout: 30_000,\n socketTimeout: 60_000,\n });\n\n try {\n return await transporter.sendMail({\n ...mail,\n envelope: {\n from: fromEnvelope,\n to: recipients,\n },\n dkim,\n });\n } finally {\n transporter.close();\n }\n}\n\n/**\n * Direct SMTP delivery (per recipient domain, per MX with fallback), replacing the\n * unmaintained `sendmail` npm package while preserving the same routing semantics.\n */\nexport async function sendDirectSmtp(\n mail: SendMailOptions,\n providerOptions: ProviderSendmailOptions\n): Promise<void> {\n const logger = createLogger(providerOptions);\n const smtpPort = getOutboundSmtpPort(providerOptions);\n\n const fromHeader = String(mail.from || '');\n const fromAddr = extractEmail(fromHeader);\n const fromHost = getHostFromAddress(fromAddr);\n const srcHost = fromHost || osHostname() || 'localhost';\n\n const dkimOpt = providerOptions.dkim;\n const dkim: SendMailOptions['dkim'] =\n dkimOpt && typeof dkimOpt === 'object' && 'privateKey' in dkimOpt\n ? {\n domainName: srcHost,\n keySelector: dkimOpt.keySelector || 'dkim',\n privateKey: dkimOpt.privateKey,\n }\n : undefined;\n\n const recipients = collectRecipients({\n to: mail.to as string | string[] | undefined,\n cc: mail.cc as string | string[] | undefined,\n bcc: mail.bcc as string | string[] | undefined,\n });\n\n if (recipients.length === 0) {\n throw new Error('No recipients defined');\n }\n\n const groups = groupRecipientsByDomain(recipients);\n const fromEnvelope = fromAddr;\n\n let anyDomainDelivered = false;\n\n for (const domain of Object.keys(groups)) {\n const domainRecipients = groups[domain];\n let hosts: Array<{ exchange: string }>;\n try {\n hosts = await resolveMxHosts(domain, providerOptions);\n } catch (err) {\n logger.error('Sendmail provider: MX resolution failed', err);\n throw err instanceof Error ? err : new Error(String(err));\n }\n\n let lastError: Error | undefined;\n let sent = false;\n\n for (const { exchange } of hosts) {\n try {\n await trySendViaHost(\n exchange,\n smtpPort,\n srcHost,\n fromEnvelope,\n domainRecipients,\n mail,\n dkim,\n providerOptions\n );\n sent = true;\n break;\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n logger.error(`Sendmail provider: failed to send via ${exchange}:${smtpPort}`, lastError);\n }\n }\n\n if (sent) {\n anyDomainDelivered = true;\n } else {\n logger.error(`Sendmail provider: failed to deliver for domain ${domain}`, lastError);\n }\n }\n\n if (!anyDomainDelivered) {\n throw new Error('Failed to deliver mail for all recipient domains');\n }\n}\n"],"names":["getEffectiveDevPort","options","v","devPort","undefined","getOutboundSmtpPort","dev","smtpPort","resolveMxHosts","domain","devHost","exchange","records","dnsResolveMx","err","e","Error","String","message","length","sort","a","b","priority","smtpHost","push","map","r","replace","trySendViaHost","srcHost","fromEnvelope","recipients","mail","dkim","transporter","nodemailer","createTransport","host","port","secure","ignoreTLS","requireTLS","name","tls","rejectUnauthorized","connectionTimeout","greetingTimeout","socketTimeout","sendMail","envelope","from","to","close","sendDirectSmtp","providerOptions","logger","createLogger","fromHeader","fromAddr","extractEmail","fromHost","getHostFromAddress","osHostname","dkimOpt","domainName","keySelector","privateKey","collectRecipients","cc","bcc","groups","groupRecipientsByDomain","anyDomainDelivered","Object","keys","domainRecipients","hosts","error","lastError","sent"],"mappings":"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"}
1
+ {"version":3,"file":"direct-smtp.js","sources":["../src/direct-smtp.ts"],"sourcesContent":["import { resolveMx as dnsResolveMx } from 'dns/promises';\nimport { hostname as osHostname } from 'os';\nimport nodemailer from 'nodemailer';\nimport type { SentMessageInfo, SendMailOptions } from 'nodemailer';\n\nimport {\n collectRecipients,\n extractEmail,\n getHostFromAddress,\n groupRecipientsByDomain,\n} from './addressing';\nimport { createLogger } from './logger';\nimport type { ProviderSendmailOptions } from './types';\n\n/**\n * Mirrors legacy `const devPort = options.devPort || -1` (guileen/node-sendmail).\n * `0` is falsy → `-1` (MX mode). `true` is truthy and was passed to `createConnection` (Node\n * coerces port `true` to `1`).\n */\nfunction getEffectiveDevPort(options: ProviderSendmailOptions): number {\n const v = options.devPort;\n if (v === undefined || v === false || v === null) {\n return -1;\n }\n if (v === true) {\n return 1;\n }\n if (typeof v === 'number') {\n return v || -1;\n }\n return -1;\n}\n\n/**\n * Legacy `sendmail` connects with `createConnection(devPort, devHost)` in dev mode — the\n * dev port is the SMTP port. Otherwise use `smtpPort` (default 25).\n */\nfunction getOutboundSmtpPort(options: ProviderSendmailOptions): number {\n const dev = getEffectiveDevPort(options);\n if (dev !== -1) {\n return dev;\n }\n return options.smtpPort || 25;\n}\n\n/**\n * Build list of SMTP peers to try for a recipient domain (MX resolution or dev server),\n * matching guileen/node-sendmail `connectMx` + `smtpHost` append behavior.\n */\nexport async function resolveMxHosts(\n domain: string,\n options: ProviderSendmailOptions\n): Promise<Array<{ exchange: string }>> {\n const devPort = getEffectiveDevPort(options);\n const devHost = options.devHost || 'localhost';\n\n if (devPort !== -1) {\n return [{ exchange: devHost }];\n }\n\n let records: Awaited<ReturnType<typeof dnsResolveMx>>;\n try {\n records = await dnsResolveMx(domain);\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n throw new Error(`can not resolve Mx of <${domain}>: ${e.message}`);\n }\n\n if (!records || records.length === 0) {\n throw new Error(`can not resolve Mx of <${domain}>`);\n }\n\n records.sort((a, b) => a.priority - b.priority);\n\n // Mirror legacy `const smtpHost = options.smtpHost || -1` behavior: falsy (eg 0) disables.\n const smtpHost = options.smtpHost || -1;\n if (smtpHost !== -1) {\n records.push({ exchange: String(smtpHost), priority: 9999 });\n }\n\n return records.map((r) => ({\n exchange: r.exchange.replace(/\\.$/, ''),\n }));\n}\n\nasync function trySendViaHost(\n exchange: string,\n smtpPort: number,\n srcHost: string,\n fromEnvelope: string,\n recipients: string[],\n mail: SendMailOptions,\n dkim: SendMailOptions['dkim'],\n options: ProviderSendmailOptions\n): Promise<SentMessageInfo> {\n const transporter = nodemailer.createTransport({\n host: exchange,\n port: smtpPort,\n secure: false,\n // Legacy sendmail@1.6.1 uses plain SMTP sockets and does not attempt STARTTLS.\n ignoreTLS: true,\n requireTLS: false,\n name: srcHost,\n tls: {\n rejectUnauthorized: options.rejectUnauthorized,\n },\n connectionTimeout: 60_000,\n greetingTimeout: 30_000,\n socketTimeout: 60_000,\n });\n\n try {\n return await transporter.sendMail({\n ...mail,\n envelope: {\n from: fromEnvelope,\n to: recipients,\n },\n dkim,\n });\n } finally {\n transporter.close();\n }\n}\n\n/**\n * Direct SMTP delivery (per recipient domain, per MX with fallback), replacing the\n * unmaintained `sendmail` npm package while preserving the same routing semantics.\n */\nexport async function sendDirectSmtp(\n mail: SendMailOptions,\n providerOptions: ProviderSendmailOptions\n): Promise<void> {\n const logger = createLogger(providerOptions);\n const smtpPort = getOutboundSmtpPort(providerOptions);\n\n const fromHeader = String(mail.from || '');\n const fromAddr = extractEmail(fromHeader);\n const fromHost = getHostFromAddress(fromAddr);\n const srcHost = fromHost || osHostname() || 'localhost';\n\n const dkimOpt = providerOptions.dkim;\n const dkim: SendMailOptions['dkim'] =\n dkimOpt && typeof dkimOpt === 'object' && 'privateKey' in dkimOpt\n ? {\n domainName: srcHost,\n keySelector: dkimOpt.keySelector || 'dkim',\n privateKey: dkimOpt.privateKey,\n }\n : undefined;\n\n const recipients = collectRecipients({\n to: mail.to as string | string[] | undefined,\n cc: mail.cc as string | string[] | undefined,\n bcc: mail.bcc as string | string[] | undefined,\n });\n\n if (recipients.length === 0) {\n throw new Error('No recipients defined');\n }\n\n const groups = groupRecipientsByDomain(recipients);\n const fromEnvelope = fromAddr;\n\n let anyDomainDelivered = false;\n\n for (const domain of Object.keys(groups)) {\n const domainRecipients = groups[domain];\n let hosts: Array<{ exchange: string }>;\n try {\n hosts = await resolveMxHosts(domain, providerOptions);\n } catch (err) {\n logger.error('Sendmail provider: MX resolution failed', err);\n throw err instanceof Error ? err : new Error(String(err));\n }\n\n let lastError: Error | undefined;\n let sent = false;\n\n for (const { exchange } of hosts) {\n try {\n await trySendViaHost(\n exchange,\n smtpPort,\n srcHost,\n fromEnvelope,\n domainRecipients,\n mail,\n dkim,\n providerOptions\n );\n sent = true;\n break;\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n logger.error(`Sendmail provider: failed to send via ${exchange}:${smtpPort}`, lastError);\n }\n }\n\n if (sent) {\n anyDomainDelivered = true;\n } else {\n logger.error(`Sendmail provider: failed to deliver for domain ${domain}`, lastError);\n }\n }\n\n if (!anyDomainDelivered) {\n throw new Error('Failed to deliver mail for all recipient domains');\n }\n}\n"],"names":["getEffectiveDevPort","options","v","devPort","undefined","getOutboundSmtpPort","dev","smtpPort","resolveMxHosts","domain","devHost","exchange","records","dnsResolveMx","err","e","Error","String","message","length","sort","a","b","priority","smtpHost","push","map","r","replace","trySendViaHost","srcHost","fromEnvelope","recipients","mail","dkim","transporter","nodemailer","createTransport","host","port","secure","ignoreTLS","requireTLS","name","tls","rejectUnauthorized","connectionTimeout","greetingTimeout","socketTimeout","sendMail","envelope","from","to","close","sendDirectSmtp","providerOptions","logger","createLogger","fromHeader","fromAddr","extractEmail","fromHost","getHostFromAddress","osHostname","dkimOpt","domainName","keySelector","privateKey","collectRecipients","cc","bcc","groups","groupRecipientsByDomain","anyDomainDelivered","Object","keys","domainRecipients","hosts","error","lastError","sent"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/provider-email-sendmail",
3
- "version": "5.48.0",
3
+ "version": "5.49.0",
4
4
  "description": "Sendmail provider for strapi email",
5
5
  "keywords": [
6
6
  "email",
@@ -45,15 +45,15 @@
45
45
  "watch": "run -T rollup -c -w"
46
46
  },
47
47
  "dependencies": {
48
- "nodemailer": "8.0.5"
48
+ "nodemailer": "8.0.9"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@types/nodemailer": "7.0.11",
52
- "eslint-config-custom": "5.48.0",
53
- "tsconfig": "5.48.0"
52
+ "eslint-config-custom": "5.49.0",
53
+ "tsconfig": "5.49.0"
54
54
  },
55
55
  "engines": {
56
- "node": ">=20.0.0 <=24.x.x",
56
+ "node": ">=20.0.0 <=26.x.x",
57
57
  "npm": ">=6.0.0"
58
58
  }
59
59
  }