@strapi/provider-email-sendmail 5.52.3 → 5.53.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.
@@ -1 +1 @@
1
- {"version":3,"file":"direct-smtp.d.ts","sourceRoot":"","sources":["../src/direct-smtp.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAmB,eAAe,EAAE,MAAM,YAAY,CAAC;AASnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAiCvD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CA+BtC;AA0CD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,eAAe,EACrB,eAAe,EAAE,uBAAuB,GACvC,OAAO,CAAC,IAAI,CAAC,CA6Ef"}
1
+ {"version":3,"file":"direct-smtp.d.ts","sourceRoot":"","sources":["../src/direct-smtp.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAmB,eAAe,EAAE,MAAM,YAAY,CAAC;AASnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAiCvD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CA+BtC;AA+CD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,eAAe,EACrB,eAAe,EAAE,uBAAuB,GACvC,OAAO,CAAC,IAAI,CAAC,CA6Ef"}
@@ -96,7 +96,12 @@ async function trySendViaHost(exchange, smtpPort, srcHost, fromEnvelope, recipie
96
96
  from: fromEnvelope,
97
97
  to: recipients
98
98
  },
99
- dkim
99
+ dkim,
100
+ // Prevent nodemailer from reading local files or fetching URLs referenced by
101
+ // `attachments[].path` / `attachments[].href`. Set after the spread so a caller
102
+ // cannot re-enable file/URL access through the passed mail options.
103
+ disableFileAccess: true,
104
+ disableUrlAccess: true
100
105
  });
101
106
  } finally{
102
107
  transporter.close();
@@ -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 // Prevent nodemailer from reading local files or fetching URLs referenced by\n // `attachments[].path` / `attachments[].href`. Set after the spread so a caller\n // cannot re-enable file/URL access through the passed mail options.\n disableFileAccess: true,\n disableUrlAccess: true,\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","disableFileAccess","disableUrlAccess","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":";;;;;;;;;;;;AAcA;;;;IAKA,SAASA,oBAAoBC,OAAgC,EAAA;IAC3D,MAAMC,CAAAA,GAAID,QAAQE,OAAO;AACzB,IAAA,IAAID,CAAAA,KAAME,SAAAA,IAAaF,CAAAA,KAAM,KAAA,IAASA,MAAM,IAAA,EAAM;AAChD,QAAA,OAAO,EAAC;AACV,IAAA;AACA,IAAA,IAAIA,MAAM,IAAA,EAAM;QACd,OAAO,CAAA;AACT,IAAA;IACA,IAAI,OAAOA,MAAM,QAAA,EAAU;AACzB,QAAA,OAAOA,KAAK,EAAC;AACf,IAAA;AACA,IAAA,OAAO,EAAC;AACV;AAEA;;;IAIA,SAASG,oBAAoBJ,OAAgC,EAAA;AAC3D,IAAA,MAAMK,MAAMN,mBAAAA,CAAoBC,OAAAA,CAAAA;IAChC,IAAIK,GAAAA,KAAQ,EAAC,EAAG;QACd,OAAOA,GAAAA;AACT,IAAA;IACA,OAAOL,OAAAA,CAAQM,QAAQ,IAAI,EAAA;AAC7B;AAEA;;;AAGC,IACM,eAAeC,cAAAA,CACpBC,MAAc,EACdR,OAAgC,EAAA;AAEhC,IAAA,MAAME,UAAUH,mBAAAA,CAAoBC,OAAAA,CAAAA;IACpC,MAAMS,OAAAA,GAAUT,OAAAA,CAAQS,OAAO,IAAI,WAAA;IAEnC,IAAIP,OAAAA,KAAY,EAAC,EAAG;QAClB,OAAO;AAAC,YAAA;gBAAEQ,QAAAA,EAAUD;AAAQ;AAAE,SAAA;AAChC,IAAA;IAEA,IAAIE,OAAAA;IACJ,IAAI;AACFA,QAAAA,OAAAA,GAAU,MAAMC,kBAAAA,CAAaJ,MAAAA,CAAAA;AAC/B,IAAA,CAAA,CAAE,OAAOK,GAAAA,EAAK;AACZ,QAAA,MAAMC,IAAID,GAAAA,YAAeE,KAAAA,GAAQF,GAAAA,GAAM,IAAIE,MAAMC,MAAAA,CAAOH,GAAAA,CAAAA,CAAAA;QACxD,MAAM,IAAIE,KAAAA,CAAM,CAAC,uBAAuB,EAAEP,OAAO,GAAG,EAAEM,CAAAA,CAAEG,OAAO,CAAA,CAAE,CAAA;AACnE,IAAA;AAEA,IAAA,IAAI,CAACN,OAAAA,IAAWA,OAAAA,CAAQO,MAAM,KAAK,CAAA,EAAG;AACpC,QAAA,MAAM,IAAIH,KAAAA,CAAM,CAAC,uBAAuB,EAAEP,MAAAA,CAAO,CAAC,CAAC,CAAA;AACrD,IAAA;IAEAG,OAAAA,CAAQQ,IAAI,CAAC,CAACC,CAAAA,EAAGC,IAAMD,CAAAA,CAAEE,QAAQ,GAAGD,CAAAA,CAAEC,QAAQ,CAAA;;AAG9C,IAAA,MAAMC,QAAAA,GAAWvB,OAAAA,CAAQuB,QAAQ,IAAI,EAAC;IACtC,IAAIA,QAAAA,KAAa,EAAC,EAAG;AACnBZ,QAAAA,OAAAA,CAAQa,IAAI,CAAC;AAAEd,YAAAA,QAAAA,EAAUM,MAAAA,CAAOO,QAAAA,CAAAA;YAAWD,QAAAA,EAAU;AAAK,SAAA,CAAA;AAC5D,IAAA;AAEA,IAAA,OAAOX,OAAAA,CAAQc,GAAG,CAAC,CAACC,KAAO;AACzBhB,YAAAA,QAAAA,EAAUgB,CAAAA,CAAEhB,QAAQ,CAACiB,OAAO,CAAC,KAAA,EAAO,EAAA;SACtC,CAAA,CAAA;AACF;AAEA,eAAeC,cAAAA,CACblB,QAAgB,EAChBJ,QAAgB,EAChBuB,OAAe,EACfC,YAAoB,EACpBC,UAAoB,EACpBC,IAAqB,EACrBC,IAA6B,EAC7BjC,OAAgC,EAAA;IAEhC,MAAMkC,WAAAA,GAAcC,2BAAAA,CAAWC,eAAe,CAAC;QAC7CC,IAAAA,EAAM3B,QAAAA;QACN4B,IAAAA,EAAMhC,QAAAA;QACNiC,MAAAA,EAAQ,KAAA;;QAERC,SAAAA,EAAW,IAAA;QACXC,UAAAA,EAAY,KAAA;QACZC,IAAAA,EAAMb,OAAAA;QACNc,GAAAA,EAAK;AACHC,YAAAA,kBAAAA,EAAoB5C,QAAQ4C;AAC9B,SAAA;QACAC,iBAAAA,EAAmB,KAAA;QACnBC,eAAAA,EAAiB,KAAA;QACjBC,aAAAA,EAAe;AACjB,KAAA,CAAA;IAEA,IAAI;QACF,OAAO,MAAMb,WAAAA,CAAYc,QAAQ,CAAC;AAChC,YAAA,GAAGhB,IAAI;YACPiB,QAAAA,EAAU;gBACRC,IAAAA,EAAMpB,YAAAA;gBACNqB,EAAAA,EAAIpB;AACN,aAAA;AACAE,YAAAA,IAAAA;;;;YAIAmB,iBAAAA,EAAmB,IAAA;YACnBC,gBAAAA,EAAkB;AACpB,SAAA,CAAA;IACF,CAAA,QAAU;AACRnB,QAAAA,WAAAA,CAAYoB,KAAK,EAAA;AACnB,IAAA;AACF;AAEA;;;AAGC,IACM,eAAeC,cAAAA,CACpBvB,IAAqB,EACrBwB,eAAwC,EAAA;AAExC,IAAA,MAAMC,WAASC,mBAAAA,CAAaF,eAAAA,CAAAA;AAC5B,IAAA,MAAMlD,WAAWF,mBAAAA,CAAoBoD,eAAAA,CAAAA;AAErC,IAAA,MAAMG,UAAAA,GAAa3C,MAAAA,CAAOgB,IAAAA,CAAKkB,IAAI,IAAI,EAAA,CAAA;AACvC,IAAA,MAAMU,WAAWC,uBAAAA,CAAaF,UAAAA,CAAAA;AAC9B,IAAA,MAAMG,WAAWC,6BAAAA,CAAmBH,QAAAA,CAAAA;IACpC,MAAM/B,OAAAA,GAAUiC,YAAYE,WAAAA,EAAAA,IAAgB,WAAA;IAE5C,MAAMC,OAAAA,GAAUT,gBAAgBvB,IAAI;AACpC,IAAA,MAAMA,OACJgC,OAAAA,IAAW,OAAOA,OAAAA,KAAY,QAAA,IAAY,gBAAgBA,OAAAA,GACtD;QACEC,UAAAA,EAAYrC,OAAAA;QACZsC,WAAAA,EAAaF,OAAAA,CAAQE,WAAW,IAAI,MAAA;AACpCC,QAAAA,UAAAA,EAAYH,QAAQG;KACtB,GACAjE,SAAAA;AAEN,IAAA,MAAM4B,aAAasC,4BAAAA,CAAkB;AACnClB,QAAAA,EAAAA,EAAInB,KAAKmB,EAAE;AACXmB,QAAAA,EAAAA,EAAItC,KAAKsC,EAAE;AACXC,QAAAA,GAAAA,EAAKvC,KAAKuC;AACZ,KAAA,CAAA;IAEA,IAAIxC,UAAAA,CAAWb,MAAM,KAAK,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAIH,KAAAA,CAAM,uBAAA,CAAA;AAClB,IAAA;AAEA,IAAA,MAAMyD,SAASC,kCAAAA,CAAwB1C,UAAAA,CAAAA;AACvC,IAAA,MAAMD,YAAAA,GAAe8B,QAAAA;AAErB,IAAA,IAAIc,kBAAAA,GAAqB,KAAA;AAEzB,IAAA,KAAK,MAAMlE,MAAAA,IAAUmE,MAAAA,CAAOC,IAAI,CAACJ,MAAAA,CAAAA,CAAS;QACxC,MAAMK,gBAAAA,GAAmBL,MAAM,CAAChE,MAAAA,CAAO;QACvC,IAAIsE,KAAAA;QACJ,IAAI;YACFA,KAAAA,GAAQ,MAAMvE,eAAeC,MAAAA,EAAQgD,eAAAA,CAAAA;AACvC,QAAA,CAAA,CAAE,OAAO3C,GAAAA,EAAK;YACZ4C,QAAAA,CAAOsB,KAAK,CAAC,yCAAA,EAA2ClE,GAAAA,CAAAA;AACxD,YAAA,MAAMA,GAAAA,YAAeE,KAAAA,GAAQF,GAAAA,GAAM,IAAIE,MAAMC,MAAAA,CAAOH,GAAAA,CAAAA,CAAAA;AACtD,QAAA;QAEA,IAAImE,SAAAA;AACJ,QAAA,IAAIC,IAAAA,GAAO,KAAA;AAEX,QAAA,KAAK,MAAM,EAAEvE,QAAQ,EAAE,IAAIoE,KAAAA,CAAO;YAChC,IAAI;AACF,gBAAA,MAAMlD,eACJlB,QAAAA,EACAJ,QAAAA,EACAuB,SACAC,YAAAA,EACA+C,gBAAAA,EACA7C,MACAC,IAAAA,EACAuB,eAAAA,CAAAA;gBAEFyB,IAAAA,GAAO,IAAA;AACP,gBAAA;AACF,YAAA,CAAA,CAAE,OAAOpE,GAAAA,EAAK;AACZmE,gBAAAA,SAAAA,GAAYnE,GAAAA,YAAeE,KAAAA,GAAQF,GAAAA,GAAM,IAAIE,MAAMC,MAAAA,CAAOH,GAAAA,CAAAA,CAAAA;gBAC1D4C,QAAAA,CAAOsB,KAAK,CAAC,CAAC,sCAAsC,EAAErE,QAAAA,CAAS,CAAC,EAAEJ,QAAAA,CAAAA,CAAU,EAAE0E,SAAAA,CAAAA;AAChF,YAAA;AACF,QAAA;AAEA,QAAA,IAAIC,IAAAA,EAAM;YACRP,kBAAAA,GAAqB,IAAA;QACvB,CAAA,MAAO;AACLjB,YAAAA,QAAAA,CAAOsB,KAAK,CAAC,CAAC,gDAAgD,EAAEvE,QAAQ,EAAEwE,SAAAA,CAAAA;AAC5E,QAAA;AACF,IAAA;AAEA,IAAA,IAAI,CAACN,kBAAAA,EAAoB;AACvB,QAAA,MAAM,IAAI3D,KAAAA,CAAM,kDAAA,CAAA;AAClB,IAAA;AACF;;;;;"}
@@ -90,7 +90,12 @@ async function trySendViaHost(exchange, smtpPort, srcHost, fromEnvelope, recipie
90
90
  from: fromEnvelope,
91
91
  to: recipients
92
92
  },
93
- dkim
93
+ dkim,
94
+ // Prevent nodemailer from reading local files or fetching URLs referenced by
95
+ // `attachments[].path` / `attachments[].href`. Set after the spread so a caller
96
+ // cannot re-enable file/URL access through the passed mail options.
97
+ disableFileAccess: true,
98
+ disableUrlAccess: true
94
99
  });
95
100
  } finally{
96
101
  transporter.close();
@@ -1 +1 @@
1
- {"version":3,"file":"direct-smtp.mjs","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.mjs","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 // Prevent nodemailer from reading local files or fetching URLs referenced by\n // `attachments[].path` / `attachments[].href`. Set after the spread so a caller\n // cannot re-enable file/URL access through the passed mail options.\n disableFileAccess: true,\n disableUrlAccess: true,\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","disableFileAccess","disableUrlAccess","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.52.3",
3
+ "version": "5.53.0",
4
4
  "description": "Sendmail provider for strapi email",
5
5
  "keywords": [
6
6
  "email",
@@ -52,10 +52,10 @@
52
52
  "devDependencies": {
53
53
  "@types/node": "20.19.41",
54
54
  "@types/nodemailer": "7.0.11",
55
- "eslint-config-custom": "5.52.3",
56
- "tsconfig": "5.52.3",
55
+ "eslint-config-custom": "5.53.0",
56
+ "tsconfig": "5.53.0",
57
57
  "vitest": "catalog:",
58
- "vitest-config": "5.52.3"
58
+ "vitest-config": "5.53.0"
59
59
  },
60
60
  "engines": {
61
61
  "node": ">=20.0.0 <=26.x.x",