
Security News
Attackers Are Hunting High-Impact Node.js Maintainers in a Coordinated Social Engineering Campaign
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.
strapi-plugin-magic-mail
Advanced tools
Multi-account email management with WhatsApp messaging, smart routing, failover, and analytics for Strapi v5
Professional-grade multi-account email management with smart routing, OAuth 2.0 support, and complete security compliance
Stop fighting with .env files and email configuration! MagicMail brings professional email management to Strapi v5 with:
Manage unlimited email accounts with live stats and real-time monitoring
Choose from 6 different email providers with OAuth 2.0 support
Configure SMTP settings or connect with OAuth
Complete setup with rate limits and test connection
Create and manage email templates with the visual designer
Drag-and-drop email editor with real-time preview
Track changes and restore previous template versions (ADVANCED+)
Test your templates before sending to production
Define intelligent routing rules based on email type, recipient, subject
Track email performance with detailed analytics and statistics
Simple API integration with your Strapi application
MagicMail now includes FREE WhatsApp messaging - send messages directly from your Strapi application!
| Feature | ||
|---|---|---|
| Open Rate | ~20% | ~98% |
| Delivery Speed | Minutes | Instant |
| Spam Folder Risk | High | None |
| User Preference | Declining | Growing |
| Cost | Varies | FREE |
Method 1: Direct WhatsApp Send
// Send WhatsApp message directly
await strapi.plugin('magic-mail').service('whatsapp').sendMessage(
'+491234567890', // Phone number with country code
'Hello! This is a test message from MagicMail.'
);
Method 2: Unified Messaging API
// Send via unified API - auto-detects channel
await strapi.plugin('magic-mail').service('email-router').sendMessage({
channel: 'whatsapp', // or 'email' or 'auto'
phoneNumber: '+491234567890',
message: 'Your order #12345 has been shipped!'
});
// Auto-detect: sends WhatsApp if phoneNumber provided, email if to provided
await strapi.plugin('magic-mail').service('email-router').sendMessage({
channel: 'auto',
phoneNumber: '+491234567890', // Has phone -> WhatsApp
message: 'Shipping notification'
});
await strapi.plugin('magic-mail').service('email-router').sendMessage({
channel: 'auto',
to: 'user@example.com', // Has email -> Email
subject: 'Shipping Notification',
message: 'Your order has been shipped!'
});
Method 3: REST API
// POST /api/magic-mail/send-whatsapp
await fetch('/api/magic-mail/send-whatsapp', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
phoneNumber: '+491234567890',
message: 'Hello from MagicMail!'
})
});
// POST /api/magic-mail/send-message (unified)
await fetch('/api/magic-mail/send-message', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
channel: 'whatsapp',
phoneNumber: '+491234567890',
message: 'Order confirmed!'
})
});
1. Email Fallback If email delivery fails, automatically send via WhatsApp:
// In Routing Rules, enable "WhatsApp Fallback"
// Set "WhatsApp Phone Field" to 'phoneNumber'
await strapi.plugin('magic-mail').service('email-router').send({
to: 'user@example.com',
phoneNumber: '+491234567890', // Fallback phone
subject: 'Important Update',
html: '<h1>Update</h1>',
type: 'transactional'
});
// If email fails -> auto-sends via WhatsApp!
2. Admin Notifications Get instant WhatsApp alerts for critical events:
// Example: Notify admin when email quota exceeded
const adminPhone = '+4917612345678';
await strapi.plugin('magic-mail').service('whatsapp').sendMessage(
adminPhone,
'[ALERT] Email quota exceeded for SendGrid account!'
);
3. Urgent Transactional Messages Send time-sensitive messages instantly:
// OTP/Verification codes
await strapi.plugin('magic-mail').service('whatsapp').sendMessage(
userPhone,
`Your verification code: 123456\n\nValid for 5 minutes.`
);
// Order updates
await strapi.plugin('magic-mail').service('whatsapp').sendMessage(
customerPhone,
`Order #${orderId} is out for delivery!\nTrack: ${trackingUrl}`
);
// Check connection status
const status = await strapi.plugin('magic-mail').service('whatsapp').getStatus();
// { isConnected: true, phoneNumber: '+49...', name: 'Business Account' }
// Check if phone number is on WhatsApp
const exists = await strapi.plugin('magic-mail').service('whatsapp').checkNumber('+491234567890');
// { exists: true, jid: '491234567890@s.whatsapp.net' }
When both MagicMail and Magic-Link are installed:
npm install strapi-plugin-magic-mail
# or
yarn add strapi-plugin-magic-mail
Create or update config/plugins.ts:
export default () => ({
'magic-mail': {
enabled: true,
},
});
npm run build
npm run develop
| Provider | Type | Authentication | Features |
|---|---|---|---|
| Gmail | OAuth 2.0 | Google OAuth | Gmail API, Attachments, Auto DKIM |
| Microsoft 365 | OAuth 2.0 | Azure AD | Graph API, Attachments, Tenant Support |
| Yahoo Mail | OAuth 2.0 | Yahoo OAuth | SMTP OAuth2, Attachments |
| SMTP | Credentials | Username/Password | Universal, DKIM Optional, Custom Servers |
| SendGrid | API Key | SendGrid API | Transactional, Marketing, Templates |
| Mailgun | API Key | Mailgun API | Bulk Sending, Analytics |
MagicMail automatically intercepts Strapi's email service - no code changes needed!
// This works in ANY Strapi plugin or controller:
await strapi.plugin('email').service('email').send({
to: 'user@example.com',
subject: 'Welcome to Our Platform!',
text: 'Plain text version',
html: '<h1>Welcome!</h1><p>Thanks for signing up!</p>',
});
// โ
MagicMail automatically:
// - Selects best account (via routing rules or priority)
// - Checks rate limits
// - Handles failover if needed
// - Logs the email
// - Updates statistics
Benefits:
For explicit control over account selection:
// Force a specific account
await strapi.plugin('magic-mail').service('email-router').send({
to: 'customer@example.com',
subject: 'Order Confirmation',
html: '<h1>Your Order #12345</h1>',
accountName: 'SendGrid Marketing', // Force this account
type: 'transactional',
priority: 'high',
});
await strapi.plugin('email').service('email').send({
to: 'customer@example.com',
subject: 'Invoice #12345',
html: '<h1>Invoice Attached</h1>',
attachments: [
{
filename: 'invoice.pdf',
path: './uploads/invoice-12345.pdf',
},
{
filename: 'receipt.pdf',
content: Buffer.from(pdfData),
contentType: 'application/pdf',
},
],
});
Supported attachment formats:
// High priority email
await strapi.plugin('magic-mail').service('email-router').send({
to: 'vip@example.com',
subject: 'Urgent: Action Required',
html: '<h1>Important Update</h1>',
priority: 'high', // Adds X-Priority and Importance headers
});
// Marketing email with unsubscribe (GDPR/CAN-SPAM compliant)
await strapi.plugin('magic-mail').service('email-router').send({
to: 'subscriber@example.com',
subject: 'Weekly Newsletter',
html: '<h1>This Week's Updates</h1>',
type: 'marketing',
unsubscribeUrl: 'https://yoursite.com/unsubscribe?id=123',
// Automatically adds List-Unsubscribe header!
});
Design beautiful emails visually with the integrated email designer!
| Feature | FREE | PREMIUM | ADVANCED |
|---|---|---|---|
| Visual Designer | โ Basic builder | โ + template library | โ Pro components |
| Templates Included | 25 | 100 | 500 |
| Drag & Drop + Mustache | โ | โ | โ |
| Import / Export | โ | โ | โ |
| Template Versioning | โ | โ | โ |
| Analytics | โ | Basic insights | Advanced dashboard |
| A/B Testing | โ | โ | โ |
1. Navigate to Email Templates Tab
Go to MagicMail โ Email Templates in the admin panel.
2. Create New Template
Click "Create Template" and use the visual designer to build your email.
3. Add Variables with Mustache
Use Mustache syntax for dynamic content:
<h1>Welcome {{user.firstName}}!</h1>
<p>Thanks for joining {{company.name}}</p>
4. Save & Use
Each template gets a unique Reference ID (e.g., 100) that you use when sending.
Method 1: Using Template ID
// Send email using template
await strapi.plugin('magic-mail').service('email-router').send({
to: 'user@example.com',
templateId: 100, // Your template reference ID
templateData: {
user: {
firstName: 'John',
lastName: 'Doe',
email: 'john@example.com',
},
company: {
name: 'ACME Corp',
url: 'https://acme.com',
},
orderNumber: '12345',
orderTotal: '$199.99',
},
});
// โ
MagicMail will:
// - Load template #100
// - Render it with your data (Mustache)
// - Route via smart routing
// - Send via best account
Method 2: Via Strapi Email Service
// Also works with standard Strapi email service!
await strapi.plugin('email').service('email').send({
to: 'user@example.com',
templateId: 100,
templateData: {
user: { firstName: 'Jane' },
resetUrl: 'https://yoursite.com/reset?token=xyz',
},
});
Templates can be categorized for automatic routing:
Automatic Routing by Category:
// Create routing rule: All marketing templates โ SendGrid
// Then just send:
await strapi.plugin('magic-mail').service('email-router').send({
to: 'subscriber@example.com',
templateId: 200, // Marketing category template
templateData: { offer: '50% OFF' },
});
// โ
Automatically routes via SendGrid (based on category)
Every time you save a template, a new version is created automatically:
// Get all versions
const versions = await strapi
.plugin('magic-mail')
.service('email-designer')
.getVersions(templateId);
// Restore old version
await strapi
.plugin('magic-mail')
.service('email-designer')
.restoreVersion(templateId, versionId);
Export all templates:
const templates = await strapi
.plugin('magic-mail')
.service('email-designer')
.exportTemplates();
// Save to file
fs.writeFileSync('templates.json', JSON.stringify(templates, null, 2));
Import templates:
const templates = JSON.parse(fs.readFileSync('templates.json'));
const results = await strapi
.plugin('magic-mail')
.service('email-designer')
.importTemplates(templates);
console.log(`Imported ${results.filter(r => r.success).length} templates`);
Powered by Unlayer Email Editor:
const stats = await strapi
.plugin('magic-mail')
.service('email-designer')
.getStats();
console.log(stats);
// {
// total: 15,
// active: 12,
// inactive: 3,
// byCategory: [
// { category: 'transactional', count: 8 },
// { category: 'marketing', count: 4 },
// { category: 'notification', count: 3 }
// ],
// maxTemplates: 3, // FREE tier limit
// remaining: 0 // Upgrade needed!
// }
1. Use Template Categories
// Set category when creating template
category: 'marketing' // Auto-routes to marketing account
2. Test Templates Before Using
// Test render before sending
const rendered = await strapi
.plugin('magic-mail')
.service('email-designer')
.renderTemplate(100, { user: { firstName: 'Test' } });
console.log(rendered.html); // Preview HTML
3. Version Control
// ADVANCED+: Keep version history
// Automatically enabled for ADVANCED and ENTERPRISE licenses
4. Organize with Tags
// Add tags to templates
tags: ['onboarding', 'welcome-series', 'v2']
Create intelligent routing rules to send emails through specific accounts based on conditions.
1. Route Marketing Emails via SendGrid:
Match Type: Email Type
Match Value: marketing
Target Account: SendGrid Marketing
Priority: 10
2. Route VIP Customers via Premium SMTP:
Match Type: Recipient
Match Value: @vip-customers.com
Target Account: Premium SMTP
Fallback Account: Gmail OAuth
Priority: 9
3. Route Password Reset Emails:
Match Type: Subject
Match Value: Password Reset
Target Account: Transactional SMTP
Priority: 8
Rules are evaluated from highest to lowest priority (1-10):
If no rule matches, the Primary Account is used.
1. Google Cloud Console
http://localhost:1337/magic-mail/oauth/gmail/callback2. In MagicMail
Required Scopes:
https://www.googleapis.com/auth/gmail.sendhttps://www.googleapis.com/auth/userinfo.email1. Azure Portal
2. Add Redirect URI
http://localhost:1337/magic-mail/oauth/microsoft/callback
3. API Permissions
Add these Delegated permissions under Microsoft Graph:
Mail.Send - Send emails as the signed-in userUser.Read - Read user profileoffline_access - Maintain access (refresh tokens)openid - Sign users inemail - View users' email address4. Grant Admin Consent (Required!)
5. Create Client Secret
6. In MagicMail
1. Yahoo Developer Console
2. Add Redirect URI
http://localhost:1337/magic-mail/oauth/yahoo/callback
3. API Permissions
Mail - Send and manage emailsOpenID Connect - User authentication4. In MagicMail
Works with ANY SMTP server:
Host: smtp.gmail.com (or your SMTP server)
Port: 587 (STARTTLS) or 465 (SSL/TLS)
Username: your-email@domain.com
Password: your-password (or App Password)
Popular SMTP Servers:
smtp.gmail.com:587 (use App Password!)smtp-mail.outlook.com:587smtp.office365.com:587Gmail App Password:
Optional: DKIM Signing
For custom domains, you can add DKIM:
// In config field (advanced users):
{
dkim: {
domainName: 'yourdomain.com',
keySelector: 'default',
privateKey: '-----BEGIN PRIVATE KEY-----\n...'
}
}
1. Get API Key
2. In MagicMail
1. Get API Key & Domain
2. In MagicMail
mg.yourdomain.com)<script> tags allowedAll configuration is done via the Admin Panel. However, for production deployments, you can set:
# Optional - Base URL for OAuth callbacks
URL=https://yourdomain.com
# Optional - Encryption key (auto-generated if not provided)
ENCRYPTION_KEY=your-32-character-secret-key
Each account can have:
Basic Settings:
Security:
Rate Limiting:
Status:
await strapi.plugin('email').service('email').send({
to: 'recipient@example.com',
from: 'sender@example.com', // Optional - uses account default
subject: 'Email Subject',
text: 'Plain text content',
html: '<h1>HTML content</h1>',
// Optional advanced options:
replyTo: 'reply@example.com',
type: 'transactional', // or 'marketing', 'notification'
priority: 'normal', // or 'high'
accountName: 'Specific Account', // Force specific account
unsubscribeUrl: 'https://site.com/unsubscribe', // For marketing emails
attachments: [
{
filename: 'document.pdf',
path: './path/to/file.pdf',
contentType: 'application/pdf',
},
],
});
await strapi.plugin('magic-mail').service('email-router').send({
to: 'user@example.com',
subject: 'Test Email',
html: '<p>Content</p>',
accountName: 'Gmail OAuth', // Optional - force specific account
type: 'transactional',
priority: 'normal',
});
const accounts = await strapi.plugin('magic-mail').service('account-manager').getAllAccounts();
const result = await strapi.plugin('magic-mail').service('account-manager').testAccount(
accountId,
'test@example.com',
{
priority: 'high',
type: 'marketing',
unsubscribeUrl: 'https://example.com/unsubscribe',
}
);
// Test email with all security features
await strapi.plugin('magic-mail').service('account-manager').testAccount(
accountId,
'your-email@example.com',
{
priority: 'high',
type: 'marketing',
unsubscribeUrl: 'https://yoursite.com/unsubscribe',
}
);
To verify security headers are applied:
In Gmail:
X-Mailer: MagicMail/1.0
X-Priority: 1 (Highest)
Importance: high
List-Unsubscribe: <https://...>
Message-ID: <...>
DKIM-Signature: ...
In Outlook/Microsoft:
| Standard | Status | Description |
|---|---|---|
| DKIM | โ | DomainKeys Identified Mail - Signature validation |
| SPF | โ | Sender Policy Framework - Sender verification |
| DMARC | โ | Domain-based Authentication - Policy enforcement |
| TLS 1.2+ | โ | Transport Layer Security - Encrypted transmission |
| AES-256-GCM | โ | Credential encryption at rest |
| Regulation | Status | Implementation |
|---|---|---|
| GDPR | โ | List-Unsubscribe header for marketing emails |
| CAN-SPAM | โ | One-click unsubscribe mechanism (RFC 8058) |
| RFC 5322 | โ | Proper email format and headers |
| RFC 3834 | โ | Auto-Submitted header prevents loops |
| RFC 2156 | โ | Priority and Importance headers |
Every email is validated for:
<script> tags in HTMLjavascript: protocol in linksGlobal Stats:
Per-Account Stats:
Every email is logged with:
Access logs via:
const logs = await strapi.entityService.findMany('plugin::magic-mail.email-log', {
filters: { status: 'sent' },
sort: { createdAt: 'desc' },
limit: 100,
});
MagicMail is fully compatible with strapi-plugin-email-designer-5!
Install Email Designer:
npm install strapi-plugin-email-designer-5
Create email templates in Email Designer
Send via template:
// Email Designer internally uses strapi.plugin('email').service('email').send()
// MagicMail automatically intercepts it!
Your email is automatically:
No configuration needed - it just works! ๐
1. Check Logs
# Look for errors in Strapi console
[magic-mail] โ Email send failed: ...
2. Check Account Status
3. Check Spam Folder
4. Verify Credentials
For Custom Domains:
Set up SPF record:
v=spf1 include:_spf.google.com ~all
Set up DKIM:
Set up DMARC:
v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com
For OAuth Providers (Gmail, Microsoft, Yahoo):
If you hit rate limits:
Gmail OAuth:
Microsoft OAuth:
Yahoo OAuth:
magic-mail/
โโโ admin/ # React Admin UI
โ โโโ src/
โ โโโ components/
โ โ โโโ AddAccountModal.jsx # Multi-step account setup
โ โ โโโ PluginIcon.jsx # Sidebar icon
โ โโโ pages/
โ โโโ App.jsx # Main app with tabs
โ โโโ HomePage.jsx # Email accounts page
โ โโโ RoutingRules.jsx # Routing rules page
โโโ server/ # Backend
โ โโโ src/
โ โโโ bootstrap.js # Overrides Strapi email service
โ โโโ controllers/
โ โ โโโ accounts.js # CRUD for accounts
โ โ โโโ oauth.js # OAuth flows
โ โ โโโ routing-rules.js # CRUD for routing rules
โ โโโ services/
โ โ โโโ email-router.js # Core routing logic
โ โ โโโ account-manager.js # Account management
โ โ โโโ oauth.js # OAuth token exchange
โ โโโ content-types/
โ โ โโโ email-account/ # Account schema
โ โ โโโ email-log/ # Email log schema
โ โ โโโ routing-rule/ # Routing rule schema
โ โโโ utils/
โ โโโ encryption.js # AES-256-GCM encryption
โโโ package.json
Email Request
โ
Strapi Email Service (intercepted!)
โ
MagicMail Email Router
โ
Routing Rules Engine
โ
Account Selection (priority/rules)
โ
Rate Limit Check
โ
Provider-Specific Sender
โ
Email Log & Stats Update
โ
Response
// Each tenant gets their own email account
// Route by custom field:
// Routing Rule:
// Match Type: Custom Field
// Match Value: tenant-123
// Target Account: Tenant 123 Gmail
await strapi.plugin('email').service('email').send({
to: 'customer@example.com',
subject: 'Order Confirmation',
html: '<h1>Order #456</h1>',
customField: 'tenant-123', // Matches routing rule
});
// Distribute load across multiple accounts
// Account 1: Priority 10, Limit 500/day
// Account 2: Priority 9, Limit 500/day
// Account 3: Priority 8, Limit 500/day
// โ Total: 1500 emails/day with automatic load balancing!
// Route marketing emails via SendGrid
// Routing Rule:
// Match Type: Email Type
// Match Value: marketing
// Target Account: SendGrid Marketing
await strapi.plugin('email').service('email').send({
to: 'subscriber@example.com',
subject: 'Weekly Newsletter',
html: template,
type: 'marketing',
unsubscribeUrl: 'https://yoursite.com/unsubscribe?id=123',
});
// โ
Automatically routes via SendGrid
// โ
Adds List-Unsubscribe header
// โ
GDPR/CAN-SPAM compliant
// Route VIP customers via premium account
// Routing Rule:
// Match Type: Recipient
// Match Value: @vip-domain.com
// Target Account: Premium SMTP
// Fallback Account: Gmail OAuth
await strapi.plugin('email').service('email').send({
to: 'ceo@vip-domain.com',
subject: 'Exclusive Offer',
html: content,
priority: 'high',
});
// โ
Routes via Premium SMTP
// โ
High priority headers added
// โ
Automatic fallback if premium account unavailable
| Feature | Gmail OAuth | Microsoft OAuth | Yahoo OAuth | SMTP | SendGrid | Mailgun |
|---|---|---|---|---|---|---|
| Auth Method | OAuth 2.0 | OAuth 2.0 | OAuth 2.0 | Password | API Key | API Key |
| Free Tier | 500/day | Varies | Limited | Varies | 100/day | 5000/month |
| Attachments | โ | โ | โ | โ | โ | โ |
| HTML Emails | โ | โ | โ | โ | โ | โ |
| DKIM Auto | โ | โ | โ | Optional | โ | โ |
| Custom Headers | โ | โ | โ | โ | โ | โ |
| Priority Headers | โ | โ | โ | โ | โ | โ |
| Security | Excellent | Excellent | Good | Good | Excellent | Excellent |
| Deliverability | Excellent | Excellent | Good | Varies | Excellent | Excellent |
| Best For | Personal/Small | Enterprise | Personal | Custom | Marketing | Bulk/Dev |
# Base URL (required for OAuth callbacks in production)
URL=https://yourdomain.com
# Database (Strapi default)
DATABASE_CLIENT=postgres
DATABASE_HOST=127.0.0.1
DATABASE_PORT=5432
DATABASE_NAME=strapi
DATABASE_USERNAME=strapi
DATABASE_PASSWORD=password
# Optional - Custom encryption key
ENCRYPTION_KEY=your-32-byte-secret-key-here
Update redirect URIs in your OAuth apps:
Gmail:
https://yourdomain.com/magic-mail/oauth/gmail/callback
Microsoft:
https://yourdomain.com/magic-mail/oauth/microsoft/callback
Yahoo:
https://yourdomain.com/magic-mail/oauth/yahoo/callback
For Production Apps:
| Use Case | Recommended Provider | Configuration |
|---|---|---|
| Transactional | SendGrid or Mailgun | High daily limit, dedicated IP |
| Marketing | SendGrid | List management, analytics |
| Notifications | SMTP or Gmail OAuth | Medium limits, reliable |
| Internal | Microsoft 365 | Company domain, OAuth |
| Development | Mailgun Sandbox | Free testing |
Create complex routing rules:
// Rule 1: VIP customers via premium account
{
name: "VIP Customer Emails",
matchType: "recipient",
matchValue: "@vip-customers.com",
accountName: "Premium SMTP",
fallbackAccountName: "Gmail OAuth",
priority: 10,
isActive: true
}
// Rule 2: Password resets via fast account
{
name: "Password Reset Emails",
matchType: "subject",
matchValue: "Password Reset",
accountName: "Fast Gmail",
priority: 9,
isActive: true
}
// Rule 3: Marketing via SendGrid
{
name: "Marketing Campaigns",
matchType: "emailType",
matchValue: "marketing",
accountName: "SendGrid Marketing",
priority: 8,
isActive: true
}
For custom domains with SMTP:
1. Generate DKIM Keys:
openssl genrsa -out dkim_private.pem 1024
openssl rsa -in dkim_private.pem -pubout -out dkim_public.pem
2. Add to DNS:
default._domainkey.yourdomain.com TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA..."
3. Add to MagicMail SMTP Account:
// In account config (edit account โ credentials):
{
host: "smtp.yourdomain.com",
port: 587,
user: "...",
pass: "...",
dkim: {
domainName: "yourdomain.com",
keySelector: "default",
privateKey: "-----BEGIN PRIVATE KEY-----\n..."
}
}
Best practices for high-volume sending:
// Account Setup:
// Account A: Priority 10, Daily Limit: 500
// Account B: Priority 9, Daily Limit: 500
// Account C: Priority 8, Daily Limit: 500
// โ Total capacity: 1500 emails/day
// MagicMail automatically:
// 1. Uses Account A until limit hit
// 2. Switches to Account B
// 3. Switches to Account C
// 4. All transparent to your code!
We welcome contributions!
Found a bug? Open an issue
Have a feature idea? Start a discussion
Want to contribute code?
MIT License
Copyright ยฉ 2025 Schero D.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
ADDITIONAL CONDITION: The license validation system (including but not limited to license-guard.js, license controller, and related API endpoints) must remain intact and functional. Removing, bypassing, or disabling the license validation system is strictly prohibited.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Built with:
Inspired by:
Need help?
If MagicMail helps your project, please:
Made for the Strapi Community
MagicMail - Because email management should be magical, not painful.
FAQs
Multi-account email management with WhatsApp messaging, smart routing, failover, and analytics for Strapi v5
The npm package strapi-plugin-magic-mail receives a total of 47 weekly downloads. As such, strapi-plugin-magic-mail popularity was classified as not popular.
We found that strapi-plugin-magic-mail 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.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Multiple high-impact npm maintainers confirm they have been targeted in the same social engineering campaign that compromised Axios.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.