
Company News
Socket Joins New OpenJS Program to Fund Node.js Security Work
Socket is joining the OpenJS Security Stewardship Program to fund Node.js vulnerability research, maintainer remediation, and security releases.
@wraps.dev/email
Advanced tools
Beautiful email SDK for AWS SES with React.email support.
pnpm add @wraps.dev/email
import { WrapsEmail } from '@wraps.dev/email';
const email = new WrapsEmail({ region: 'us-east-1' });
await email.send({
from: 'you@company.com',
to: 'user@example.com',
subject: 'Welcome!',
html: '<h1>Hello World</h1>',
});
This package supports both CommonJS and ES Modules:
ESM (modern):
import { WrapsEmail } from '@wraps.dev/email';
CommonJS (Node.js):
const { WrapsEmail } = require('@wraps.dev/email');
Wraps Email uses the AWS credential chain in the following order:
AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)~/.aws/credentials)const email = new WrapsEmail({
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
sessionToken: process.env.AWS_SESSION_TOKEN, // optional
},
region: 'us-west-2',
});
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_key
export AWS_REGION=us-east-1
const email = new WrapsEmail(); // Credentials auto-detected
const result = await email.send({
from: 'you@company.com',
to: 'user@example.com',
subject: 'Welcome!',
html: '<h1>Hello World</h1>',
text: 'Hello World', // optional
});
console.log('Message ID:', result.messageId);
await email.send({
from: 'you@company.com',
to: ['user1@example.com', 'user2@example.com'],
cc: ['manager@company.com'],
bcc: ['archive@company.com'],
subject: 'Team Update',
html: '<p>Important announcement</p>',
});
import { EmailTemplate } from './emails/Welcome';
await email.send({
from: 'you@company.com',
to: 'user@example.com',
subject: 'Welcome to our platform',
react: <EmailTemplate name="John" orderId="12345" />,
});
Send emails with file attachments (PDFs, images, documents, etc.). The SDK automatically handles MIME encoding and uses AWS SES SendRawEmail under the hood.
// Single attachment
const result = await email.send({
from: 'you@company.com',
to: 'user@example.com',
subject: 'Your invoice',
html: '<p>Please find your invoice attached.</p>',
attachments: [
{
filename: 'invoice.pdf',
content: Buffer.from('...'), // Buffer or base64 string
contentType: 'application/pdf', // Optional - auto-detected from filename
},
],
});
// Multiple attachments
await email.send({
from: 'you@company.com',
to: 'user@example.com',
subject: 'Monthly Report',
html: '<h1>Monthly Report</h1><p>Reports attached</p>',
attachments: [
{
filename: 'report.pdf',
content: pdfBuffer,
contentType: 'application/pdf',
},
{
filename: 'chart.png',
content: imageBuffer,
contentType: 'image/png',
},
{
filename: 'data.csv',
content: csvBuffer,
contentType: 'text/csv',
},
],
});
// Attachment with base64 string
await email.send({
from: 'you@company.com',
to: 'user@example.com',
subject: 'Document',
html: '<p>Document attached</p>',
attachments: [
{
filename: 'document.pdf',
content: 'JVBERi0xLjQKJeLjz9MK...', // base64 string
contentType: 'application/pdf',
},
],
});
Supported attachment features:
await email.send({
from: 'you@company.com',
to: 'user@example.com',
subject: 'Newsletter',
html: '<p>Content</p>',
tags: {
campaign: 'newsletter-2025-01',
type: 'marketing',
},
});
SES templates allow you to store reusable email designs with variables in your AWS account.
await email.templates.create({
name: 'welcome-email',
subject: 'Welcome to {{companyName}}, {{name}}!',
html: `
<h1>Welcome {{name}}!</h1>
<p>Click to confirm: <a href="{{confirmUrl}}">Confirm Account</a></p>
`,
text: 'Welcome {{name}}! Click to confirm: {{confirmUrl}}',
});
await email.templates.createFromReact({
name: 'welcome-email-v2',
subject: 'Welcome to {{companyName}}, {{name}}!',
react: <WelcomeEmailTemplate />,
// React component should use {{variable}} syntax for SES placeholders
});
const result = await email.sendTemplate({
from: 'you@company.com',
to: 'user@example.com',
template: 'welcome-email',
templateData: {
name: 'John',
companyName: 'Acme Corp',
confirmUrl: 'https://app.com/confirm/abc123',
},
});
const results = await email.sendBulkTemplate({
from: 'you@company.com',
template: 'weekly-digest',
destinations: [
{
to: 'user1@example.com',
templateData: { name: 'Alice', unreadCount: 5 },
},
{
to: 'user2@example.com',
templateData: { name: 'Bob', unreadCount: 12 },
},
],
});
await email.templates.update({
name: 'welcome-email',
subject: 'Welcome aboard, {{name}}!',
html: '<h1>Welcome {{name}}!</h1>...',
});
const template = await email.templates.get('welcome-email');
console.log(template.name, template.subject);
const templates = await email.templates.list();
templates.forEach(t => console.log(t.name, t.createdTimestamp));
await email.templates.delete('welcome-email');
import { WrapsEmailError, ValidationError, SESError } from '@wraps.dev/email';
try {
await email.send({ ... });
} catch (error) {
if (error instanceof ValidationError) {
// Invalid email address, missing required fields, etc.
console.error('Validation error:', error.message);
console.error('Field:', error.field);
} else if (error instanceof SESError) {
// AWS SES error (rate limit, unverified sender, etc.)
console.error('SES error:', error.message);
console.error('Code:', error.code); // 'MessageRejected', 'Throttling', etc.
console.error('Request ID:', error.requestId);
console.error('Retryable:', error.retryable);
} else {
// Other errors (network, auth, etc.)
console.error('Unknown error:', error);
}
}
interface WrapsEmailConfig {
region?: string; // AWS region (defaults to us-east-1)
credentials?: {
accessKeyId: string;
secretAccessKey: string;
sessionToken?: string;
};
endpoint?: string; // Custom SES endpoint (for testing with LocalStack)
}
const email = new WrapsEmail({
region: 'us-east-1',
endpoint: 'http://localhost:4566',
});
WrapsEmailMain client class for sending emails via AWS SES.
send(params: SendEmailParams): Promise<SendEmailResult> - Send an emailsendTemplate(params: SendTemplateParams): Promise<SendEmailResult> - Send using SES templatesendBulkTemplate(params: SendBulkTemplateParams): Promise<SendBulkTemplateResult> - Bulk send with templatetemplates.create(params: CreateTemplateParams): Promise<void> - Create SES templatetemplates.createFromReact(params: CreateTemplateFromReactParams): Promise<void> - Create template from Reacttemplates.update(params: UpdateTemplateParams): Promise<void> - Update templatetemplates.get(name: string): Promise<Template> - Get template detailstemplates.list(): Promise<TemplateMetadata[]> - List all templatestemplates.delete(name: string): Promise<void> - Delete templatedestroy(): void - Close SES client and clean up resourcesMIT
FAQs
Send email via AWS SES with TypeScript. Bounce and complaint handling, suppression lists, delivery and open tracking, templates, batch sending, inbound email, attachments, and React Email support. Your AWS account, no vendor lock-in.
The npm package @wraps.dev/email receives a total of 1,869 weekly downloads. As such, @wraps.dev/email popularity was classified as popular.
We found that @wraps.dev/email demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Company News
Socket is joining the OpenJS Security Stewardship Program to fund Node.js vulnerability research, maintainer remediation, and security releases.

Security News
Two compromised GitHub Actions were re-enabled with malicious tags intact, exposing thousands of downstream repositories to Mini Shai-Hulud.

Research
/Security News
A malicious Firefox extension fetches its payload after installation to evade detection, steal Google session cookies, and automate account takeover.