🌳
pt0/serverF/emailF/sendDaEmailF.mts
1import nodemailer from 'nodemailer'
2import * as _ from 'lodash-es'
10import { getEnvConf } from '../envConfF.mts'
14import { doExec } from '../execF.mts'
16export const getEmailProps = (props: Record<string, unknown>) => {
17 let {fromName, fromEmail} = _.merge(props, nodeMailCtx.getStore()) as Record<string, string | undefined>
18 if (isSendExceptEmailCtx.getStore()) {
19 fromName ||= 'ptemail'
20 }
21 fromName ||= getEnvConf().fromName as string | undefined
22 fromEmail ||= getEnvConf().fromEmail as string | undefined
23 assertDefined(fromName)
24 assertDefined(fromEmail)
25 const gqEmailSentFromStr = `"${fromName}" <${fromEmail}>`
26 return {fromName, fromEmail, gqEmailSentFromStr}
29export const sendDaEmail = async ({
30 mailProps, isPostmarkBroadcast=false,
31 ...props
32}: {mailProps: Record<string, any>, isPostmarkBroadcast?: boolean, [k: string]: unknown}) => {
33 betLog('sendDaEmail', mailProps, props)
35 const transportProps = await getTransportProps({isPostmarkBroadcast})
37 const transporter = nodemailer.createTransport(transportProps)
39 const {gqEmailSentFromStr} = getEmailProps(props)
41 mailProps = {
42 from: gqEmailSentFromStr,
43 ...mailProps,
44 }
46 const isEthereal = transportProps?.host === 'smtp.ethereal.email'
48 if (isTestEmail(mailProps.to) && !isEthereal) {
49 console.log('skipping email send for test address', mailProps.to)
50 return {gqPrevEmailUrl: null, html: mailProps.html, gqEmailSentFromStr}
51 }
53 let resp
54 try {
55 const {text} = mailProps
56 throwIf(() => text && !_.isString(text), {text})
57 resp = await transporter.sendMail(mailProps)
58 } catch (ee: any) {
59 if (isEthereal && _.includes(ee.message, 'Invalid login: 535 Authentication failed')) {
60 console.log('clearEtherealCreds', ee)
62 }
63 throw ee
64 }
66 let gqPrevEmailUrl
67 if (isEthereal) {
68 gqPrevEmailUrl = nodemailer.getTestMessageUrl(resp)
69 console.log('etherealUrl', gqPrevEmailUrl)
70 if (isDevPc && !silenceEtherealCtx.getStore() && !isTestEmail(mailProps.to)) {
71 doExec(`open ${gqPrevEmailUrl}`).catch(() => {})
72 }
73 }
75 const {html} = mailProps
76 return {gqPrevEmailUrl, html, gqEmailSentFromStr}