{"version":3,"sources":["meteor://💻app/packages/email/email.js"],"names":["_objectSpread","module1","link","default","v","export","Email","EmailTest","EmailInternals","Meteor","Log","Hook","Future","url","nodemailer","wellKnow","NpmModules","mailcomposer","version","Npm","require","module","MailComposer","makeTransport","mailUrlString","mailUrl","URL","protocol","Error","port","debug","query","pool","transport","createTransport","format","_syncSendMail","wrapAsync","sendMail","knownHostsTransport","settings","undefined","service","user","password","hasSettings","Object","keys","length","host","split","urlObject","hostname","username","temp","pathname","substring","temp2","auth","pass","knowHostsTransport","getTransport","packageSettings","packages","email","process","env","MAIL_URL","cacheKey","cache","nextDevModeMailId","output_stream","stdout","overrideOutputStream","stream","restoreOutputStream","devModeSend","mail","devModeMailId","write","readStream","compile","createReadStream","pipe","end","future","on","return","wait","smtpSend","sendHooks","hookSend","f","register","customTransport","send","options","mailComposer","forEach","hook","mailUrlEnv","mailUrlSettings","isProduction"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,MAAIA,aAAJ;;AAAkBC,SAAO,CAACC,IAAR,CAAa,sCAAb,EAAoD;AAACC,WAAO,CAACC,CAAD,EAAG;AAACJ,mBAAa,GAACI,CAAd;AAAgB;;AAA5B,GAApD,EAAkF,CAAlF;AAAlBH,SAAO,CAACI,MAAR,CAAe;AAACC,SAAK,EAAC,MAAIA,KAAX;AAAiBC,aAAS,EAAC,MAAIA,SAA/B;AAAyCC,kBAAc,EAAC,MAAIA;AAA5D,GAAf;AAA4F,MAAIC,MAAJ;AAAWR,SAAO,CAACC,IAAR,CAAa,eAAb,EAA6B;AAACO,UAAM,CAACL,CAAD,EAAG;AAACK,YAAM,GAACL,CAAP;AAAS;;AAApB,GAA7B,EAAmD,CAAnD;AAAsD,MAAIM,GAAJ;AAAQT,SAAO,CAACC,IAAR,CAAa,gBAAb,EAA8B;AAACQ,OAAG,CAACN,CAAD,EAAG;AAACM,SAAG,GAACN,CAAJ;AAAM;;AAAd,GAA9B,EAA8C,CAA9C;AAAiD,MAAIO,IAAJ;AAASV,SAAO,CAACC,IAAR,CAAa,sBAAb,EAAoC;AAACS,QAAI,CAACP,CAAD,EAAG;AAACO,UAAI,GAACP,CAAL;AAAO;;AAAhB,GAApC,EAAsD,CAAtD;AAAyD,MAAIQ,MAAJ;AAAWX,SAAO,CAACC,IAAR,CAAa,eAAb,EAA6B;AAACC,WAAO,CAACC,CAAD,EAAG;AAACQ,YAAM,GAACR,CAAP;AAAS;;AAArB,GAA7B,EAAoD,CAApD;AAAuD,MAAIS,GAAJ;AAAQZ,SAAO,CAACC,IAAR,CAAa,KAAb,EAAmB;AAACC,WAAO,CAACC,CAAD,EAAG;AAACS,SAAG,GAACT,CAAJ;AAAM;;AAAlB,GAAnB,EAAuC,CAAvC;AAA0C,MAAIU,UAAJ;AAAeb,SAAO,CAACC,IAAR,CAAa,YAAb,EAA0B;AAACC,WAAO,CAACC,CAAD,EAAG;AAACU,gBAAU,GAACV,CAAX;AAAa;;AAAzB,GAA1B,EAAqD,CAArD;AAAwD,MAAIW,QAAJ;AAAad,SAAO,CAACC,IAAR,CAAa,2BAAb,EAAyC;AAACC,WAAO,CAACC,CAAD,EAAG;AAACW,cAAQ,GAACX,CAAT;AAAW;;AAAvB,GAAzC,EAAkE,CAAlE;AASzd,QAAME,KAAK,GAAG,EAAd;AACA,QAAMC,SAAS,GAAG,EAAlB;AAEA,QAAMC,cAAc,GAAG;AAC5BQ,cAAU,EAAE;AACVC,kBAAY,EAAE;AACZC,eAAO,EAAEC,GAAG,CAACC,OAAJ,CAAY,yBAAZ,EAAuCF,OADpC;AAEZG,cAAM,EAAEF,GAAG,CAACC,OAAJ,CAAY,8BAAZ;AAFI,OADJ;AAKVN,gBAAU,EAAE;AACVI,eAAO,EAAEC,GAAG,CAACC,OAAJ,CAAY,yBAAZ,EAAuCF,OADtC;AAEVG,cAAM,EAAEF,GAAG,CAACC,OAAJ,CAAY,YAAZ;AAFE;AALF;AADgB,GAAvB;AAaP,QAAME,YAAY,GAAGd,cAAc,CAACQ,UAAf,CAA0BC,YAA1B,CAAuCI,MAA5D;;AAEA,QAAME,aAAa,GAAG,UAASC,aAAT,EAAwB;AAC5C,UAAMC,OAAO,GAAG,IAAIC,GAAJ,CAAQF,aAAR,CAAhB;;AAEA,QAAIC,OAAO,CAACE,QAAR,KAAqB,OAArB,IAAgCF,OAAO,CAACE,QAAR,KAAqB,QAAzD,EAAmE;AACjE,YAAM,IAAIC,KAAJ,CACJ,kCACEJ,aADF,GAEE,6BAHE,CAAN;AAKD;;AAED,QAAIC,OAAO,CAACE,QAAR,KAAqB,OAArB,IAAgCF,OAAO,CAACI,IAAR,KAAiB,KAArD,EAA4D;AAC1DnB,SAAG,CAACoB,KAAJ,CACE,yCACE,yDADF,GAEE,yCAHJ;AAKD,KAjB2C,CAmB5C;;;AACA,QAAI,CAACL,OAAO,CAACM,KAAb,EAAoB;AAClBN,aAAO,CAACM,KAAR,GAAgB,EAAhB;AACD;;AAED,QAAI,CAACN,OAAO,CAACM,KAAR,CAAcC,IAAnB,EAAyB;AACvBP,aAAO,CAACM,KAAR,CAAcC,IAAd,GAAqB,MAArB;AACD;;AAED,UAAMC,SAAS,GAAGnB,UAAU,CAACoB,eAAX,CAA2BrB,GAAG,CAACsB,MAAJ,CAAWV,OAAX,CAA3B,CAAlB;AAEAQ,aAAS,CAACG,aAAV,GAA0B3B,MAAM,CAAC4B,SAAP,CAAiBJ,SAAS,CAACK,QAA3B,EAAqCL,SAArC,CAA1B;AACA,WAAOA,SAAP;AACD,GAhCD,C,CAkCA;;;AACA,QAAMM,mBAAmB,GAAG,YAAgD;AAAA,QAAvCC,QAAuC,uEAA5BC,SAA4B;AAAA,QAAjB5B,GAAiB,uEAAX4B,SAAW;AAC1E,QAAIC,OAAJ,EAAaC,IAAb,EAAmBC,QAAnB;AAEA,UAAMC,WAAW,GAAGL,QAAQ,IAAIM,MAAM,CAACC,IAAP,CAAYP,QAAZ,EAAsBQ,MAAtD;;AAEA,QAAInC,GAAG,IAAI,CAACgC,WAAZ,EAAyB;AACvB,UAAII,IAAI,GAAGpC,GAAG,CAACqC,KAAJ,CAAU,GAAV,EAAe,CAAf,CAAX;AACA,YAAMC,SAAS,GAAG,IAAIzB,GAAJ,CAAQb,GAAR,CAAlB;;AACA,UAAIoC,IAAI,KAAK,MAAT,IAAmBA,IAAI,KAAK,OAAhC,EAAyC;AACvC;AACAA,YAAI,GAAGE,SAAS,CAACC,QAAjB;AACAT,YAAI,GAAGQ,SAAS,CAACE,QAAjB;AACAT,gBAAQ,GAAGO,SAAS,CAACP,QAArB;AACD,OALD,MAKO,IAAIO,SAAS,CAACxB,QAAV,IAAsBwB,SAAS,CAACE,QAAhC,IAA4CF,SAAS,CAACP,QAA1D,EAAoE;AACzE;AACAK,YAAI,GAAGE,SAAS,CAACxB,QAAV,CAAmBuB,KAAnB,CAAyB,GAAzB,EAA8B,CAA9B,CAAP;AACAP,YAAI,GAAGQ,SAAS,CAACE,QAAjB;AACAT,gBAAQ,GAAGO,SAAS,CAACP,QAArB;AACD,OALM,MAKA;AAAA;;AACL;AACA;AACA,cAAMU,IAAI,4BAAGH,SAAS,CAACI,QAAV,CAAmBC,SAAnB,CAA6B,CAA7B,CAAH,0DAAG,sBAAiCN,KAAjC,CAAuC,GAAvC,CAAb;AACAP,YAAI,GAAGW,IAAI,CAAC,CAAD,CAAX,CAJK,CAKL;;AACA,cAAMG,KAAK,GAAGH,IAAI,CAAC,CAAD,CAAJ,CAAQJ,KAAR,CAAc,GAAd,CAAd;AACAN,gBAAQ,GAAGa,KAAK,CAAC,CAAD,CAAhB;AACAR,YAAI,GAAGQ,KAAK,CAAC,CAAD,CAAZ;AACD;;AACDf,aAAO,GAAGO,IAAV;AACD;;AAED,QAAI,CAAClC,QAAQ,CAAC,CAAAyB,QAAQ,SAAR,IAAAA,QAAQ,WAAR,YAAAA,QAAQ,CAAEE,OAAV,KAAqBA,OAAtB,CAAb,EAA6C;AAC3C,YAAM,IAAId,KAAJ,CACJ,qIADI,CAAN;AAGD;;AAED,UAAMK,SAAS,GAAGnB,UAAU,CAACoB,eAAX,CAA2B;AAC3CQ,aAAO,EAAE,CAAAF,QAAQ,SAAR,IAAAA,QAAQ,WAAR,YAAAA,QAAQ,CAAEE,OAAV,KAAqBA,OADa;AAE3CgB,UAAI,EAAE;AACJf,YAAI,EAAE,CAAAH,QAAQ,SAAR,IAAAA,QAAQ,WAAR,YAAAA,QAAQ,CAAEG,IAAV,KAAkBA,IADpB;AAEJgB,YAAI,EAAE,CAAAnB,QAAQ,SAAR,IAAAA,QAAQ,WAAR,YAAAA,QAAQ,CAAEI,QAAV,KAAsBA;AAFxB;AAFqC,KAA3B,CAAlB;AAQAX,aAAS,CAACG,aAAV,GAA0B3B,MAAM,CAAC4B,SAAP,CAAiBJ,SAAS,CAACK,QAA3B,EAAqCL,SAArC,CAA1B;AACA,WAAOA,SAAP;AACD,GA/CD;;AAgDA1B,WAAS,CAACqD,kBAAV,GAA+BrB,mBAA/B;;AAEA,QAAMsB,YAAY,GAAG,YAAW;AAAA;;AAC9B,UAAMC,eAAe,GAAG,0BAAArD,MAAM,CAAC+B,QAAP,CAAgBuB,QAAhB,gFAA0BC,KAA1B,KAAmC,EAA3D,CAD8B,CAE9B;AACA;AACA;;AACA,UAAMnD,GAAG,GAAGoD,OAAO,CAACC,GAAR,CAAYC,QAAxB;;AACA,QACE,KAAKC,QAAL,KAAkB3B,SAAlB,IACA,KAAK2B,QAAL,KAAkBvD,GADlB,IAEA,KAAKuD,QAAL,KAAkBN,eAAe,CAACpB,OAFlC,IAGA,KAAK0B,QAAL,KAAkB,UAJpB,EAKE;AACA,UACGN,eAAe,CAACpB,OAAhB,IAA2B3B,QAAQ,CAAC+C,eAAe,CAACpB,OAAjB,CAApC,IACC7B,GAAG,IAAIE,QAAQ,CAAC,IAAIW,GAAJ,CAAQb,GAAR,EAAauC,QAAd,CADhB,IAEArC,QAAQ,CAAC,CAAAF,GAAG,SAAH,IAAAA,GAAG,WAAH,YAAAA,GAAG,CAAEqC,KAAL,CAAW,GAAX,EAAgB,CAAhB,MAAsB,EAAvB,CAHV,EAIE;AACA,aAAKkB,QAAL,GAAgBN,eAAe,CAACpB,OAAhB,IAA2B,UAA3C;AACA,aAAK2B,KAAL,GAAa9B,mBAAmB,CAACuB,eAAD,EAAkBjD,GAAlB,CAAhC;AACD,OAPD,MAOO;AACL,aAAKuD,QAAL,GAAgBvD,GAAhB;AACA,aAAKwD,KAAL,GAAaxD,GAAG,GAAGU,aAAa,CAACV,GAAD,EAAMiD,eAAN,CAAhB,GAAyC,IAAzD;AACD;AACF;;AACD,WAAO,KAAKO,KAAZ;AACD,GAzBD;;AA2BA,MAAIC,iBAAiB,GAAG,CAAxB;AACA,MAAIC,aAAa,GAAGN,OAAO,CAACO,MAA5B,C,CAEA;;AACAjE,WAAS,CAACkE,oBAAV,GAAiC,UAASC,MAAT,EAAiB;AAChDJ,qBAAiB,GAAG,CAApB;AACAC,iBAAa,GAAGG,MAAhB;AACD,GAHD;;AAKAnE,WAAS,CAACoE,mBAAV,GAAgC,YAAW;AACzCJ,iBAAa,GAAGN,OAAO,CAACO,MAAxB;AACD,GAFD;;AAIA,QAAMI,WAAW,GAAG,UAASC,IAAT,EAAe;AACjC,QAAIC,aAAa,GAAGR,iBAAiB,EAArC;AAEA,UAAMI,MAAM,GAAGH,aAAf,CAHiC,CAKjC;;AACAG,UAAM,CAACK,KAAP,CAAa,wBAAwBD,aAAxB,GAAwC,WAArD;AACAJ,UAAM,CAACK,KAAP,CACE,yDACE,0BAFJ;AAIA,UAAMC,UAAU,GAAG,IAAI1D,YAAJ,CAAiBuD,IAAjB,EAAuBI,OAAvB,GAAiCC,gBAAjC,EAAnB;AACAF,cAAU,CAACG,IAAX,CAAgBT,MAAhB,EAAwB;AAAEU,SAAG,EAAE;AAAP,KAAxB;AACA,UAAMC,MAAM,GAAG,IAAIzE,MAAJ,EAAf;AACAoE,cAAU,CAACM,EAAX,CAAc,KAAd,EAAqB,YAAW;AAC9BZ,YAAM,CAACK,KAAP,CAAa,sBAAsBD,aAAtB,GAAsC,WAAnD;AACAO,YAAM,CAACE,MAAP;AACD,KAHD;AAIAF,UAAM,CAACG,IAAP;AACD,GAnBD;;AAqBA,QAAMC,QAAQ,GAAG,UAASxD,SAAT,EAAoB4C,IAApB,EAA0B;AACzC5C,aAAS,CAACG,aAAV,CAAwByC,IAAxB;AACD,GAFD;;AAIA,QAAMa,SAAS,GAAG,IAAI/E,IAAJ,EAAlB;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACAL,OAAK,CAACqF,QAAN,GAAiB,UAASC,CAAT,EAAY;AAC3B,WAAOF,SAAS,CAACG,QAAV,CAAmBD,CAAnB,CAAP;AACD,GAFD;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACAtF,OAAK,CAACwF,eAAN,GAAwBrD,SAAxB;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACAnC,OAAK,CAACyF,IAAN,GAAa,UAASC,OAAT,EAAkB;AAAA;;AAC7B,QAAIA,OAAO,CAACC,YAAZ,EAA0B;AACxBD,aAAO,GAAGA,OAAO,CAACC,YAAR,CAAqBpB,IAA/B;AACD;;AAED,QAAIkB,IAAI,GAAG,IAAX;AACAL,aAAS,CAACQ,OAAV,CAAkBC,IAAI,IAAI;AACxBJ,UAAI,GAAGI,IAAI,CAACH,OAAD,CAAX;AACA,aAAOD,IAAP;AACD,KAHD;AAIA,QAAI,CAACA,IAAL,EAAW;AAEX,UAAMD,eAAe,GAAGxF,KAAK,CAACwF,eAA9B;;AACA,QAAIA,eAAJ,EAAqB;AAAA;;AACnB,YAAMhC,eAAe,GAAG,2BAAArD,MAAM,CAAC+B,QAAP,CAAgBuB,QAAhB,kFAA0BC,KAA1B,KAAmC,EAA3D;AACA8B,qBAAe;AAAGhC;AAAH,SAAuBkC,OAAvB,EAAf;AACA;AACD;;AAED,UAAMI,UAAU,GAAGnC,OAAO,CAACC,GAAR,CAAYC,QAA/B;AACA,UAAMkC,eAAe,6BAAG5F,MAAM,CAAC+B,QAAP,CAAgBuB,QAAnB,2DAAG,uBAA0BC,KAAlD;;AAEA,QAAIvD,MAAM,CAAC6F,YAAP,IAAuB,CAACF,UAAxB,IAAsC,CAACC,eAA3C,EAA4D;AAC1D;AACA;AACA,YAAM,IAAIzE,KAAJ,CACJ,4LADI,CAAN;AAGD;;AAED,QAAIwE,UAAU,IAAIC,eAAlB,EAAmC;AACjC,YAAMpE,SAAS,GAAG4B,YAAY,EAA9B;AACA4B,cAAQ,CAACxD,SAAD,EAAY+D,OAAZ,CAAR;AACA;AACD;;AACDpB,eAAW,CAACoB,OAAD,CAAX;AACD,GApCD","file":"/packages/email.js","sourcesContent":["import { Meteor } from 'meteor/meteor';\nimport { Log } from 'meteor/logging';\nimport { Hook } from 'meteor/callback-hook';\n\nimport Future from 'fibers/future';\nimport url from 'url';\nimport nodemailer from 'nodemailer';\nimport wellKnow from 'nodemailer/lib/well-known';\n\nexport const Email = {};\nexport const EmailTest = {};\n\nexport const EmailInternals = {\n NpmModules: {\n mailcomposer: {\n version: Npm.require('nodemailer/package.json').version,\n module: Npm.require('nodemailer/lib/mail-composer'),\n },\n nodemailer: {\n version: Npm.require('nodemailer/package.json').version,\n module: Npm.require('nodemailer'),\n },\n },\n};\n\nconst MailComposer = EmailInternals.NpmModules.mailcomposer.module;\n\nconst makeTransport = function(mailUrlString) {\n const mailUrl = new URL(mailUrlString);\n\n if (mailUrl.protocol !== 'smtp:' && mailUrl.protocol !== 'smtps:') {\n throw new Error(\n 'Email protocol in $MAIL_URL (' +\n mailUrlString +\n \") must be 'smtp' or 'smtps'\"\n );\n }\n\n if (mailUrl.protocol === 'smtp:' && mailUrl.port === '465') {\n Log.debug(\n \"The $MAIL_URL is 'smtp://...:465'. \" +\n \"You probably want 'smtps://' (The 's' enables TLS/SSL) \" +\n \"since '465' is typically a secure port.\"\n );\n }\n\n // Allow overriding pool setting, but default to true.\n if (!mailUrl.query) {\n mailUrl.query = {};\n }\n\n if (!mailUrl.query.pool) {\n mailUrl.query.pool = 'true';\n }\n\n const transport = nodemailer.createTransport(url.format(mailUrl));\n\n transport._syncSendMail = Meteor.wrapAsync(transport.sendMail, transport);\n return transport;\n};\n\n// More info: https://nodemailer.com/smtp/well-known/\nconst knownHostsTransport = function(settings = undefined, url = undefined) {\n let service, user, password;\n\n const hasSettings = settings && Object.keys(settings).length;\n\n if (url && !hasSettings) {\n let host = url.split(':')[0];\n const urlObject = new URL(url);\n if (host === 'http' || host === 'https') {\n // Look to hostname for service\n host = urlObject.hostname;\n user = urlObject.username;\n password = urlObject.password;\n } else if (urlObject.protocol && urlObject.username && urlObject.password) {\n // We have some data from urlObject\n host = urlObject.protocol.split(':')[0];\n user = urlObject.username;\n password = urlObject.password;\n } else {\n // We need to disect the URL ourselves to get the data\n // First get rid of the leading '//' and split to username and the rest\n const temp = urlObject.pathname.substring(2)?.split(':');\n user = temp[0];\n // Now we split by '@' to get password and hostname\n const temp2 = temp[1].split('@');\n password = temp2[0];\n host = temp2[1];\n }\n service = host;\n }\n\n if (!wellKnow(settings?.service || service)) {\n throw new Error(\n 'Could not recognize e-mail service. See list at https://nodemailer.com/smtp/well-known/ for services that we can configure for you.'\n );\n }\n\n const transport = nodemailer.createTransport({\n service: settings?.service || service,\n auth: {\n user: settings?.user || user,\n pass: settings?.password || password,\n },\n });\n\n transport._syncSendMail = Meteor.wrapAsync(transport.sendMail, transport);\n return transport;\n};\nEmailTest.knowHostsTransport = knownHostsTransport;\n\nconst getTransport = function() {\n const packageSettings = Meteor.settings.packages?.email || {};\n // We delay this check until the first call to Email.send, in case someone\n // set process.env.MAIL_URL in startup code. Then we store in a cache until\n // process.env.MAIL_URL changes.\n const url = process.env.MAIL_URL;\n if (\n this.cacheKey === undefined ||\n this.cacheKey !== url ||\n this.cacheKey !== packageSettings.service ||\n this.cacheKey !== 'settings'\n ) {\n if (\n (packageSettings.service && wellKnow(packageSettings.service)) ||\n (url && wellKnow(new URL(url).hostname)) ||\n wellKnow(url?.split(':')[0] || '')\n ) {\n this.cacheKey = packageSettings.service || 'settings';\n this.cache = knownHostsTransport(packageSettings, url);\n } else {\n this.cacheKey = url;\n this.cache = url ? makeTransport(url, packageSettings) : null;\n }\n }\n return this.cache;\n};\n\nlet nextDevModeMailId = 0;\nlet output_stream = process.stdout;\n\n// Testing hooks\nEmailTest.overrideOutputStream = function(stream) {\n nextDevModeMailId = 0;\n output_stream = stream;\n};\n\nEmailTest.restoreOutputStream = function() {\n output_stream = process.stdout;\n};\n\nconst devModeSend = function(mail) {\n let devModeMailId = nextDevModeMailId++;\n\n const stream = output_stream;\n\n // This approach does not prevent other writers to stdout from interleaving.\n stream.write('====== BEGIN MAIL #' + devModeMailId + ' ======\\n');\n stream.write(\n '(Mail not sent; to enable sending, set the MAIL_URL ' +\n 'environment variable.)\\n'\n );\n const readStream = new MailComposer(mail).compile().createReadStream();\n readStream.pipe(stream, { end: false });\n const future = new Future();\n readStream.on('end', function() {\n stream.write('====== END MAIL #' + devModeMailId + ' ======\\n');\n future.return();\n });\n future.wait();\n};\n\nconst smtpSend = function(transport, mail) {\n transport._syncSendMail(mail);\n};\n\nconst sendHooks = new Hook();\n\n/**\n * @summary Hook that runs before email is sent.\n * @locus Server\n *\n * @param f {function} receives the arguments to Email.send and should return true to go\n * ahead and send the email (or at least, try subsequent hooks), or\n * false to skip sending.\n * @returns {{ stop: function, callback: function }}\n */\nEmail.hookSend = function(f) {\n return sendHooks.register(f);\n};\n\n/**\n * @summary Overrides sending function with your own.\n * @locus Server\n * @since 2.2\n * @param f {function} function that will receive options from the send function and under `packageSettings` will\n * include the package settings from Meteor.settings.packages.email for your custom transport to access.\n */\nEmail.customTransport = undefined;\n\n/**\n * @summary Send an email. Throws an `Error` on failure to contact mail server\n * or if mail server returns an error. All fields should match\n * [RFC5322](http://tools.ietf.org/html/rfc5322) specification.\n *\n * If the `MAIL_URL` environment variable is set, actually sends the email.\n * Otherwise, prints the contents of the email to standard out.\n *\n * Note that this package is based on **nodemailer**, so make sure to refer to\n * [the documentation](http://nodemailer.com/)\n * when using the `attachments` or `mailComposer` options.\n *\n * @locus Server\n * @param {Object} options\n * @param {String} [options.from] \"From:\" address (required)\n * @param {String|String[]} options.to,cc,bcc,replyTo\n * \"To:\", \"Cc:\", \"Bcc:\", and \"Reply-To:\" addresses\n * @param {String} [options.inReplyTo] Message-ID this message is replying to\n * @param {String|String[]} [options.references] Array (or space-separated string) of Message-IDs to refer to\n * @param {String} [options.messageId] Message-ID for this message; otherwise, will be set to a random value\n * @param {String} [options.subject] \"Subject:\" line\n * @param {String} [options.text|html] Mail body (in plain text and/or HTML)\n * @param {String} [options.watchHtml] Mail body in HTML specific for Apple Watch\n * @param {String} [options.icalEvent] iCalendar event attachment\n * @param {Object} [options.headers] Dictionary of custom headers - e.g. `{ \"header name\": \"header value\" }`. To set an object under a header name, use `JSON.stringify` - e.g. `{ \"header name\": JSON.stringify({ tracking: { level: 'full' } }) }`.\n * @param {Object[]} [options.attachments] Array of attachment objects, as\n * described in the [nodemailer documentation](https://nodemailer.com/message/attachments/).\n * @param {MailComposer} [options.mailComposer] A [MailComposer](https://nodemailer.com/extras/mailcomposer/#e-mail-message-fields)\n * object representing the message to be sent. Overrides all other options.\n * You can create a `MailComposer` object via\n * `new EmailInternals.NpmModules.mailcomposer.module`.\n */\nEmail.send = function(options) {\n if (options.mailComposer) {\n options = options.mailComposer.mail;\n }\n\n let send = true;\n sendHooks.forEach(hook => {\n send = hook(options);\n return send;\n });\n if (!send) return;\n\n const customTransport = Email.customTransport;\n if (customTransport) {\n const packageSettings = Meteor.settings.packages?.email || {};\n customTransport({ packageSettings, ...options });\n return;\n }\n\n const mailUrlEnv = process.env.MAIL_URL;\n const mailUrlSettings = Meteor.settings.packages?.email;\n\n if (Meteor.isProduction && !mailUrlEnv && !mailUrlSettings) {\n // This check is mostly necessary when using the flag --production when running locally.\n // And it works as a reminder to properly set the mail URL when running locally.\n throw new Error(\n 'You have not provided a mail URL. You can provide it by using the environment variable MAIL_URL or your settings. You can read more about it here: https://docs.meteor.com/api/email.html.'\n );\n }\n\n if (mailUrlEnv || mailUrlSettings) {\n const transport = getTransport();\n smtpSend(transport, options);\n return;\n }\n devModeSend(options);\n};\n"]}