{"_id":"@teliagen/plugin-mail","_rev":"34-acf49fd8786ece656bb32f532a2654db","name":"@teliagen/plugin-mail","dist-tags":{"latest":"0.4.2"},"versions":{"0.4.0":{"name":"@teliagen/plugin-mail","version":"0.4.0","keywords":["teliagen","mail","email","plugin","smtp"],"author":{"name":"Teliagen"},"license":"MIT","_id":"@teliagen/plugin-mail@0.4.0","maintainers":[{"name":"teliagen_off","email":"admin@teliagen.org"}],"homepage":"https://docs.teliagen.org","bugs":{"url":"https://github.com/teliagen/teliagen-framework/issues"},"dist":{"shasum":"f6dd170d3a81ddf3c52d60aa870bf9ccb09f359c","tarball":"https://registry.npmjs.org/@teliagen/plugin-mail/-/plugin-mail-0.4.0.tgz","fileCount":55,"integrity":"sha512-HT4f+SlffBiNWqypy74STSgUduATiHJv9N09zcsb83sy9QU4xH8MRC4yg0y6+8LcUgNs7TjYcTE9Xkyqrb2GOg==","signatures":[{"sig":"MEUCIDdhT+uFcTCNBk8KmWsjQfPTn8z9cCH/m48msSQes9VKAiEA+vw9RwYSkg3k3gselcZyXrPXW+o37jDk87pGI5Fd8wI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":65345},"main":"dist/index.js","type":"module","_from":"file:teliagen-plugin-mail-0.4.0.tgz","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js"},"./common/types":{"types":"./dist/common/types/index.d.ts","import":"./dist/common/types/index.js","require":"./dist/common/types/index.js"},"./common/tokens":{"types":"./dist/common/tokens/index.d.ts","import":"./dist/common/tokens/index.js","require":"./dist/common/tokens/index.js"},"./common/drivers":{"types":"./dist/common/drivers/index.d.ts","import":"./dist/common/drivers/index.js","require":"./dist/common/drivers/index.js"},"./modules/email/actions":{"types":"./dist/modules/email/actions/index.d.ts","import":"./dist/modules/email/actions/index.js","require":"./dist/modules/email/actions/index.js"},"./modules/email/entities":{"types":"./dist/modules/email/entities/index.d.ts","import":"./dist/modules/email/entities/index.js","require":"./dist/modules/email/entities/index.js"},"./modules/email/services":{"types":"./dist/modules/email/services/index.d.ts","import":"./dist/modules/email/services/index.js","require":"./dist/modules/email/services/index.js"}},"private":false,"scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc"},"_npmUser":{"name":"teliagen_off","email":"admin@teliagen.org"},"_resolved":"C:\\Users\\ABDOUL~1\\AppData\\Local\\Temp\\acba53af45f42e62ae055d6a9229aa05\\teliagen-plugin-mail-0.4.0.tgz","_integrity":"sha512-HT4f+SlffBiNWqypy74STSgUduATiHJv9N09zcsb83sy9QU4xH8MRC4yg0y6+8LcUgNs7TjYcTE9Xkyqrb2GOg==","repository":{"url":"git+https://github.com/teliagen/teliagen-plugin.git","type":"git","directory":"packages/plugin-mail"},"_npmVersion":"11.6.2","description":"Mail plugin for Teliagen Framework","directories":{},"_nodeVersion":"24.12.0","dependencies":{"handlebars":"^4.7.8","nodemailer":"^6.9.8","@teliagen/logger":"^0.4.0","@teliagen/commons":"^0.4.0","@teliagen/persistence":"^0.4.0"},"publishConfig":{"access":"restricted"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.2.1","typescript":"^5.7.3","@types/node":"^22.10.7","@types/nodemailer":"^6.4.14"},"_npmOperationalInternal":{"tmp":"tmp/plugin-mail_0.4.0_1770858379530_0.9628358517018261","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@teliagen/plugin-mail","version":"0.4.2","private":false,"publishConfig":{"access":"restricted"},"description":"Mail plugin for Teliagen Framework","main":"dist/index.js","types":"dist/index.d.ts","type":"module","exports":{".":{"import":"./dist/index.js","require":"./dist/index.js","types":"./dist/index.d.ts"},"./common/drivers":{"import":"./dist/common/drivers/index.js","require":"./dist/common/drivers/index.js","types":"./dist/common/drivers/index.d.ts"},"./common/tokens":{"import":"./dist/common/tokens/index.js","require":"./dist/common/tokens/index.js","types":"./dist/common/tokens/index.d.ts"},"./common/types":{"import":"./dist/common/types/index.js","require":"./dist/common/types/index.js","types":"./dist/common/types/index.d.ts"},"./modules/email/actions":{"import":"./dist/modules/email/actions/index.js","require":"./dist/modules/email/actions/index.js","types":"./dist/modules/email/actions/index.d.ts"},"./modules/email/entities":{"import":"./dist/modules/email/entities/index.js","require":"./dist/modules/email/entities/index.js","types":"./dist/modules/email/entities/index.d.ts"},"./modules/email/services":{"import":"./dist/modules/email/services/index.js","require":"./dist/modules/email/services/index.js","types":"./dist/modules/email/services/index.d.ts"}},"keywords":["teliagen","mail","email","plugin","smtp"],"author":{"name":"Teliagen"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/teliagen/teliagen-plugin.git","directory":"packages/plugin-mail"},"homepage":"https://docs.teliagen.org","bugs":{"url":"https://github.com/teliagen/teliagen-framework/issues"},"dependencies":{"@teliagen/commons":"^0.4.2","@teliagen/persistence":"^0.4.2","@teliagen/logger":"^0.4.2","nodemailer":"^6.9.8","handlebars":"^4.7.8"},"devDependencies":{"typescript":"^5.7.3","@types/node":"^22.10.7","@types/nodemailer":"^6.4.14","vitest":"^1.2.1"},"scripts":{"build":"tsc","dev":"tsc --watch","test":"vitest run"},"_id":"@teliagen/plugin-mail@0.4.2","_integrity":"sha512-6jrPcViUgH1elqFv9tDm3+iiYGPJkeBWhWQChC+cltH2n8Pvo6CWCEIztxEiYRAAyb7xzxIy7wgiJvN6UQiFIQ==","_resolved":"C:\\Users\\ABDOUL~1\\AppData\\Local\\Temp\\640a6735f67880ef478bd8281a0267d9\\teliagen-plugin-mail-0.4.2.tgz","_from":"file:teliagen-plugin-mail-0.4.2.tgz","_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-6jrPcViUgH1elqFv9tDm3+iiYGPJkeBWhWQChC+cltH2n8Pvo6CWCEIztxEiYRAAyb7xzxIy7wgiJvN6UQiFIQ==","shasum":"8553a6433e1553a1beb8cbfe856018a80d3eb730","tarball":"https://registry.npmjs.org/@teliagen/plugin-mail/-/plugin-mail-0.4.2.tgz","fileCount":55,"unpackedSize":65345,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIA3bMWZxOh0Ti2zlI+ifV+z0KtxHSiE3+GUeHzf0mG2BAiEAhPV3K/SmgX5Dex4unPASZPRorj16mk/JHKnwAt5l2d0="}]},"_npmUser":{"name":"teliagen_off","email":"admin@teliagen.org"},"directories":{},"maintainers":[{"name":"teliagen_off","email":"admin@teliagen.org"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/plugin-mail_0.4.2_1770928633966_0.17746164181141233"},"_hasShrinkwrap":false}},"time":{"created":"2026-02-12T01:06:19.064Z","modified":"2026-02-12T20:37:14.274Z","0.1.0":"2026-01-19T19:17:27.624Z","0.1.1":"2026-01-19T19:55:52.460Z","0.1.2":"2026-01-19T21:14:37.073Z","0.1.3":"2026-01-19T21:27:28.635Z","0.1.4":"2026-01-19T22:50:39.922Z","0.1.5":"2026-01-20T02:45:38.117Z","0.1.6":"2026-01-25T07:47:49.837Z","0.1.7":"2026-01-25T16:04:26.620Z","0.1.8":"2026-01-25T16:42:24.057Z","0.1.9":"2026-01-25T16:47:11.291Z","0.1.10":"2026-01-25T17:39:00.789Z","0.1.11":"2026-01-25T18:20:17.127Z","0.1.12":"2026-01-25T19:33:50.653Z","0.1.13":"2026-01-25T23:49:55.528Z","0.1.14":"2026-01-26T00:07:33.570Z","0.1.15":"2026-01-26T00:11:01.794Z","0.1.16":"2026-01-26T00:14:34.693Z","0.1.17":"2026-01-26T00:18:46.043Z","0.1.18":"2026-01-26T00:40:06.350Z","0.1.19":"2026-01-26T00:52:54.179Z","0.1.20":"2026-01-26T00:57:06.317Z","0.1.22":"2026-01-26T01:17:35.274Z","0.1.23":"2026-01-26T01:22:02.947Z","0.1.24":"2026-01-26T01:43:06.147Z","0.1.25":"2026-01-26T02:17:35.380Z","0.1.26":"2026-01-26T02:26:11.753Z","0.4.0":"2026-02-12T01:06:19.729Z","0.4.2":"2026-02-12T20:37:14.118Z"},"bugs":{"url":"https://github.com/teliagen/teliagen-framework/issues"},"author":{"name":"Teliagen"},"license":"MIT","homepage":"https://docs.teliagen.org","keywords":["teliagen","mail","email","plugin","smtp"],"repository":{"type":"git","url":"git+https://github.com/teliagen/teliagen-plugin.git","directory":"packages/plugin-mail"},"description":"Mail plugin for Teliagen Framework","maintainers":[{"name":"teliagen_off","email":"admin@teliagen.org"}],"readme":"# @teliagen/plugin-mail\r\n\r\n> Email sending plugin for the Teliagen Framework.\r\n\r\n[![npm version](https://img.shields.io/npm/v/@teliagen/plugin-mail.svg)](https://www.npmjs.com/package/@teliagen/plugin-mail)\r\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue.svg)](https://www.typescriptlang.org/)\r\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\r\n\r\n## Overview\r\n\r\n`@teliagen/plugin-mail` provides email sending capabilities:\r\n\r\n- **Multiple Drivers** – Console, SMTP, SendGrid, Resend\r\n- **Template Support** – Handlebars templates for HTML emails\r\n- **Queue Support** – Background email sending\r\n- **Attachments** – File attachments support\r\n- **Event-Driven** – Listen to send events\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @teliagen/plugin-mail\r\n# or\r\npnpm add @teliagen/plugin-mail\r\n```\r\n\r\nFor specific providers:\r\n```bash\r\n# nodemailer (for SMTP)\r\nnpm install nodemailer\r\nnpm install -D @types/nodemailer\r\n\r\n# SendGrid\r\nnpm install @sendgrid/mail\r\n\r\n# Resend\r\nnpm install resend\r\n```\r\n\r\n## Quick Start\r\n\r\n```typescript\r\nimport { TeliagenApp } from '@teliagen/server';\r\nimport { MailPlugin } from '@teliagen/plugin-mail';\r\n\r\nconst app = new TeliagenApp();\r\nawait app.initialize();\r\n\r\nconst mailPlugin = MailPlugin({\r\n  name: 'mail',\r\n  default: 'smtp',\r\n  from: {\r\n    name: 'My App',\r\n    email: 'noreply@example.com'\r\n  },\r\n  drivers: {\r\n    smtp: {\r\n      driver: 'smtp',\r\n      host: 'smtp.example.com',\r\n      port: 587,\r\n      secure: false,\r\n      auth: {\r\n        user: process.env.SMTP_USER!,\r\n        pass: process.env.SMTP_PASS!\r\n      }\r\n    }\r\n  }\r\n});\r\n\r\nawait app.registerPlugins([mailPlugin]);\r\nawait app.start();\r\n```\r\n\r\n## Configuration\r\n\r\n```typescript\r\ninterface MailPluginOptions {\r\n  name: string;                  // Plugin instance name\r\n  default: string;               // Default driver name\r\n  from: {\r\n    name: string;                // Default sender name\r\n    email: string;               // Default sender email\r\n  };\r\n  drivers: Record<string, DriverConfig>;\r\n  templatesPath?: string;        // Path to email templates\r\n}\r\n\r\n// Console Driver (Development)\r\ninterface ConsoleDriverConfig {\r\n  driver: 'console';\r\n}\r\n\r\n// SMTP Driver\r\ninterface SmtpDriverConfig {\r\n  driver: 'smtp';\r\n  host: string;\r\n  port: number;\r\n  secure?: boolean;\r\n  auth: {\r\n    user: string;\r\n    pass: string;\r\n  };\r\n}\r\n\r\n// SendGrid Driver\r\ninterface SendGridDriverConfig {\r\n  driver: 'sendgrid';\r\n  apiKey: string;\r\n}\r\n\r\n// Resend Driver\r\ninterface ResendDriverConfig {\r\n  driver: 'resend';\r\n  apiKey: string;\r\n}\r\n```\r\n\r\n## Complete Example\r\n\r\n```typescript\r\nconst mailPlugin = MailPlugin({\r\n  name: 'mail',\r\n  default: process.env.NODE_ENV === 'production' ? 'sendgrid' : 'console',\r\n  from: {\r\n    name: 'My App',\r\n    email: 'noreply@myapp.com'\r\n  },\r\n  templatesPath: './src/templates/emails',\r\n  drivers: {\r\n    // Console (development - logs to stdout)\r\n    console: {\r\n      driver: 'console'\r\n    },\r\n    \r\n    // SMTP\r\n    smtp: {\r\n      driver: 'smtp',\r\n      host: process.env.SMTP_HOST!,\r\n      port: parseInt(process.env.SMTP_PORT || '587'),\r\n      secure: process.env.SMTP_SECURE === 'true',\r\n      auth: {\r\n        user: process.env.SMTP_USER!,\r\n        pass: process.env.SMTP_PASS!\r\n      }\r\n    },\r\n    \r\n    // SendGrid\r\n    sendgrid: {\r\n      driver: 'sendgrid',\r\n      apiKey: process.env.SENDGRID_API_KEY!\r\n    },\r\n    \r\n    // Resend\r\n    resend: {\r\n      driver: 'resend',\r\n      apiKey: process.env.RESEND_API_KEY!\r\n    }\r\n  }\r\n});\r\n```\r\n\r\n## MailService API\r\n\r\n```typescript\r\nconst mail = mailPlugin.Service;\r\n\r\n// Simple email\r\nawait mail.send({\r\n  to: 'user@example.com',\r\n  subject: 'Welcome to My App',\r\n  html: '<h1>Welcome!</h1><p>Thanks for signing up.</p>'\r\n});\r\n\r\n// With text fallback\r\nawait mail.send({\r\n  to: 'user@example.com',\r\n  subject: 'Welcome',\r\n  html: '<h1>Welcome!</h1>',\r\n  text: 'Welcome!'\r\n});\r\n\r\n// Multiple recipients\r\nawait mail.send({\r\n  to: ['user1@example.com', 'user2@example.com'],\r\n  cc: 'manager@example.com',\r\n  bcc: 'archive@example.com',\r\n  subject: 'Team Update',\r\n  html: '<p>Team update content...</p>'\r\n});\r\n\r\n// Custom from address\r\nawait mail.send({\r\n  from: { name: 'Support', email: 'support@example.com' },\r\n  to: 'user@example.com',\r\n  subject: 'Support Response',\r\n  html: '<p>Your ticket has been resolved.</p>'\r\n});\r\n\r\n// With attachments\r\nawait mail.send({\r\n  to: 'user@example.com',\r\n  subject: 'Invoice',\r\n  html: '<p>Please find your invoice attached.</p>',\r\n  attachments: [\r\n    { filename: 'invoice.pdf', content: pdfBuffer },\r\n    { filename: 'logo.png', path: './assets/logo.png' }\r\n  ]\r\n});\r\n\r\n// Use specific driver\r\nawait mail.driver('sendgrid').send({\r\n  to: 'user@example.com',\r\n  subject: 'Important',\r\n  html: '<p>Sent via SendGrid</p>'\r\n});\r\n```\r\n\r\n## Templates\r\n\r\nCreate Handlebars templates for reusable emails:\r\n\r\n```\r\nsrc/templates/emails/\r\n├── welcome.hbs\r\n├── password-reset.hbs\r\n├── invoice.hbs\r\n└── partials/\r\n    ├── header.hbs\r\n    └── footer.hbs\r\n```\r\n\r\n### Template Example\r\n\r\n```handlebars\r\n{{!-- welcome.hbs --}}\r\n<!DOCTYPE html>\r\n<html>\r\n<head>\r\n  <title>Welcome to {{appName}}</title>\r\n</head>\r\n<body>\r\n  {{> header}}\r\n  \r\n  <h1>Welcome, {{user.name}}!</h1>\r\n  <p>Thanks for joining {{appName}}.</p>\r\n  \r\n  <a href=\"{{verifyUrl}}\">Verify your email</a>\r\n  \r\n  {{> footer}}\r\n</body>\r\n</html>\r\n```\r\n\r\n### Using Templates\r\n\r\n```typescript\r\nconst mail = mailPlugin.Service;\r\n\r\nawait mail.sendTemplate({\r\n  to: user.email,\r\n  subject: 'Welcome to My App',\r\n  template: 'welcome',\r\n  data: {\r\n    appName: 'My App',\r\n    user: { name: user.name },\r\n    verifyUrl: `https://myapp.com/verify?token=${token}`\r\n  }\r\n});\r\n\r\n// Password reset\r\nawait mail.sendTemplate({\r\n  to: user.email,\r\n  subject: 'Reset Your Password',\r\n  template: 'password-reset',\r\n  data: {\r\n    user: { name: user.name },\r\n    resetUrl: `https://myapp.com/reset?token=${resetToken}`,\r\n    expiresIn: '1 hour'\r\n  }\r\n});\r\n```\r\n\r\n## Common Patterns\r\n\r\n### User Registration\r\n\r\n```typescript\r\nEventBus.on('auth:registered', async ({ user }) => {\r\n  await mail.sendTemplate({\r\n    to: user.email,\r\n    subject: 'Welcome to My App',\r\n    template: 'welcome',\r\n    data: { user }\r\n  });\r\n});\r\n```\r\n\r\n### Password Reset\r\n\r\n```typescript\r\nEventBus.on('auth:passwordResetRequested', async ({ user, token }) => {\r\n  await mail.sendTemplate({\r\n    to: user.email,\r\n    subject: 'Password Reset Request',\r\n    template: 'password-reset',\r\n    data: {\r\n      user,\r\n      resetUrl: `${process.env.APP_URL}/reset-password?token=${token}`\r\n    }\r\n  });\r\n});\r\n```\r\n\r\n### Tenant Invitation\r\n\r\n```typescript\r\nEventBus.on('tenant:invitationSent', async ({ invitation, tenant }) => {\r\n  await mail.sendTemplate({\r\n    to: invitation.email,\r\n    subject: `You've been invited to join ${tenant.name}`,\r\n    template: 'tenant-invitation',\r\n    data: {\r\n      tenant,\r\n      acceptUrl: `${process.env.APP_URL}/accept-invite?token=${invitation.token}`\r\n    }\r\n  });\r\n});\r\n```\r\n\r\n## Using in Actions\r\n\r\n```typescript\r\nimport { Action, ActionProvider, Input } from '@teliagen/commons';\r\n\r\n@ActionProvider('notifications', 'NotificationActions')\r\nclass NotificationActions {\r\n  @Action('sendContactForm')\r\n  async sendContactForm(@Input() input: ContactFormInput) {\r\n    const mail = mailPlugin.Service;\r\n    \r\n    await mail.send({\r\n      to: 'support@example.com',\r\n      subject: `Contact Form: ${input.subject}`,\r\n      html: `\r\n        <p><strong>From:</strong> ${input.name} (${input.email})</p>\r\n        <p><strong>Message:</strong></p>\r\n        <p>${input.message}</p>\r\n      `,\r\n      replyTo: input.email\r\n    });\r\n    \r\n    return { success: true };\r\n  }\r\n}\r\n```\r\n\r\n## Events\r\n\r\n```typescript\r\nimport { EventBus } from '@teliagen/commons';\r\n\r\nEventBus.on('mail:sent', async ({ to, subject, driver }) => {\r\n  console.log(`Email sent to ${to}: ${subject} (via ${driver})`);\r\n});\r\n\r\nEventBus.on('mail:failed', async ({ to, subject, error }) => {\r\n  console.error(`Failed to send email to ${to}: ${error.message}`);\r\n});\r\n```\r\n\r\n## Testing\r\n\r\nUse console driver in tests:\r\n\r\n```typescript\r\n// test.config.ts\r\nconst mailPlugin = MailPlugin({\r\n  name: 'mail',\r\n  default: 'console',\r\n  from: { name: 'Test', email: 'test@test.com' },\r\n  drivers: {\r\n    console: { driver: 'console' }\r\n  }\r\n});\r\n\r\n// Emails will be logged to console instead of sent\r\n```\r\n\r\n## Requirements\r\n\r\n- **Node.js** >= 18.0.0\r\n- **@teliagen/server** >= 0.1.0\r\n\r\n## Related Packages\r\n\r\n- **[@teliagen/plugin-auth](../plugin-auth)** – Authentication (password reset emails)\r\n- **[@teliagen/plugin-tenant](../plugin-tenant)** – Multi-tenancy (invitation emails)\r\n\r\n## Documentation\r\n\r\nFor full documentation, visit [docs.teliagen.org](https://docs.teliagen.org).\r\n\r\n## License\r\n\r\nMIT © Teliagen Contributors\r\n\r\n---\r\n\r\n<p align=\"center\">\r\n  <strong>Part of the <a href=\"https://github.com/teliagen/teliagen-framework\">Teliagen Framework</a></strong>\r\n</p>\r\n","readmeFilename":"README.md"}