يُعد البريد الإلكتروني مكونًا حاسمًا في تطبيقات الويب الحديثة، حيث يُستخدم في كل شيء بدءًا من تسجيل المستخدمين والإشعارات وصولاً إلى إعادة تعيين كلمات المرور والحملات التسويقية. ومع ذلك، يمكن أن يكون بناء وإدارة بنية تحتية موثوقة لإرسال البريد الإلكتروني أمرًا معقدًا ويستغرق وقتًا طويلاً. هنا يأتي دور خدمات واجهة برمجة تطبيقات البريد الإلكتروني (Email API) مثل Resend.
تقدم Resend منصة سهلة الاستخدام للمطورين مصممة لتبسيط عملية إرسال رسائل البريد الإلكتروني الخاصة بالمعاملات والتسويق. توفر واجهات برمجة تطبيقات قوية، وتحليلات مفصلة، وقابلية توصيل ممتازة، مما يسمح للمطورين بالتركيز على بناء تطبيقاتهم بدلاً من القلق بشأن البنية التحتية للبريد الإلكتروني.
سيأخذك هذا الدليل الشامل في كل ما تحتاج لمعرفته للبدء باستخدام Resend API، بدءًا من فهم مفاهيمه الأساسية وتسعيره وصولاً إلى دمجه مع مختلف الأطر والمنصات الشائعة.
هل تريد منصة متكاملة وشاملة لفريق المطورين لديك للعمل معًا بأقصى إنتاجية؟
Apidog يلبي جميع متطلباتك، ويحل محل Postman بسعر معقول أكثر بكثير!
ما هو Resend؟

Resend هي منصة واجهة برمجة تطبيقات للبريد الإلكتروني (Email API) مصممة للمطورين. تهدف إلى توفير تجربة مطور متفوقة مقارنة بمقدمي خدمات البريد الإلكتروني (ESPs) الأقدم. تشمل الميزات الرئيسية:
- واجهة برمجة تطبيقات حديثة (Modern API): واجهة برمجة تطبيقات RESTful نظيفة وسهلة الدمج في أي تطبيق.
- قابلية توصيل عالية (High Deliverability): تركز على ضمان وصول رسائل البريد الإلكتروني الخاصة بك إلى صندوق الوارد، وليس مجلد البريد العشوائي، من خلال ميزات مثل التحقق من النطاق المخصص (DKIM، SPF، DMARC)، وعناوين IP المخصصة (كميزة إضافية)، وإدارة قائمة الحظر التلقائية.
- تكاملات الأطر (Framework Integrations): تقدم حزم SDK رسمية وأدلة للأطر الشائعة مثل Node.js، Next.js، Python، Ruby، PHP، Go، والمزيد.
- تكامل React Email: يتكامل بسلاسة مع React Email، مما يتيح لك بناء قوالب بريد إلكتروني جميلة ومتجاوبة باستخدام مكونات React.
- Webhooks: توفر إشعارات في الوقت الفعلي حول أحداث البريد الإلكتروني مثل التسليم، الارتدادات (bounces)، الفتح (opens)، النقرات (clicks)، وشكاوى البريد العشوائي (spam complaints).
- تحليلات مفصلة (Detailed Analytics): تقدم رؤى حول أداء البريد الإلكتروني من خلال لوحة تحكم سهلة الاستخدام.
- تركيز على المطور (Developer Focus): مصمم مع وضع المطورين في الاعتبار، حيث يقدم توثيقًا واضحًا، وحزم SDK مفيدة، وأدوات مثل رسائل البريد الإلكتروني الاختبارية لتسهيل التطوير وتصحيح الأخطاء.
تضع Resend نفسها كبديل أكثر حداثة وتركيزًا على المطورين للاعبين الراسخين مثل SendGrid، Mailgun، أو AWS SES، مع التركيز على سهولة الاستخدام، والموثوقية، والتكامل الجيد مع سير عمل تطوير الويب الحديث.
ما هو تسعير Resend؟

تقدم Resend هيكل تسعير متدرج يعتمد على عدد رسائل البريد الإلكتروني المرسلة شهريًا، مع اعتبارات منفصلة لرسائل البريد الإلكتروني الخاصة بالمعاملات والتسويق (على الرغم من أن صفحة التسعير تفصل بشكل أساسي خطط المعاملات).
فيما يلي تفصيل لخطط البريد الإلكتروني الخاصة بالمعاملات (اعتبارًا من وقت كتابة هذا الدليل):
الخطة المجانية (Free Plan):
- التكلفة: 0 دولار / شهر
- رسائل البريد الإلكتروني: حتى 3,000 رسالة بريد إلكتروني شهريًا
- الحد اليومي: 100 رسالة بريد إلكتروني يوميًا
- النطاقات: 1 نطاق مخصص
- الاحتفاظ بالبيانات: 1 يوم
- الدعم: دعم عبر التذاكر
- الميزات الرئيسية: واجهة برمجة تطبيقات RESTful، ترحيل SMTP، حزم SDK، تتبع الفتح/الروابط، تكامل React Email، قائمة الحظر التلقائية، مصادقة DKIM/SPF/DMARC، 1 نقطة نهاية Webhook.
- القيود: لا يوجد تسجيل دخول موحد (SSO)، لا توجد عناوين IP مخصصة، نطاقات وإرسال يومي محدود.
الخطة الاحترافية (Pro Plan):
- التكلفة: 20 دولارًا / شهر
- رسائل البريد الإلكتروني: حتى 50,000 رسالة بريد إلكتروني شهريًا (مع تطبيق رسوم تجاوز الحد بعد ذلك)
- الحد اليومي: لا يوجد حد يومي
- النطاقات: 10 نطاقات مخصصة
- الاحتفاظ بالبيانات: 3 أيام
- الدعم: دعم عبر التذاكر
- الميزات الرئيسية: جميع ميزات الخطة المجانية، بالإضافة إلى SSO، 10 نقاط نهاية Webhook.
- القيود: لا تتضمن عناوين IP مخصصة (متاحة كميزة إضافية لاحقًا)، لا يوجد دعم عبر Slack.
خطة التوسع (Scale Plan):
- التكلفة: 90 دولارًا / شهر
- رسائل البريد الإلكتروني: حتى 100,000 رسالة بريد إلكتروني شهريًا (مع رسوم تجاوز الحد)
- الحد اليومي: لا يوجد حد يومي
- النطاقات: 1,000 نطاق مخصص
- الاحتفاظ بالبيانات: 7 أيام
- الدعم: دعم عبر Slack وعبر التذاكر
- الميزات الرئيسية: جميع ميزات الخطة الاحترافية، بالإضافة إلى عنوان IP مخصص متاح كميزة إضافية (30 دولارًا / شهر، يتطلب >500 رسالة بريد إلكتروني يوميًا).
- القيود: عناوين IP المخصصة هي ميزة إضافية.
خطة المؤسسات (Enterprise Plan):
- التكلفة: تسعير مخصص
- الحجم: حجم مخصص
- الحد اليومي: لا يوجد حد يومي
- النطاقات: مرنة
- الاحتفاظ بالبيانات: مرنة
- الدعم: دعم ذو أولوية، اتفاقية مستوى خدمة للاستجابة العاجلة (Urgent Response SLA)، خبرة في قابلية التوصيل.
- الميزات الرئيسية: جميع ميزات خطة التوسع، بالإضافة إلى تسخين عنوان IP المخصص (Dedicated IP Warming)، رؤى قابلية التوصيل (Deliverability Insights)، Webhooks مرنة، SSO مضمن.
اعتبارات رئيسية:
- تجاوز الحد (Overage): سيؤدي إرسال عدد رسائل بريد إلكتروني أكثر مما تسمح به خطتك إلى تكبد تكاليف إضافية لكل رسالة بريد إلكتروني.
- عناوين IP المخصصة (Dedicated IPs): متاحة كميزة إضافية لخطط Scale و Enterprise مقابل رسوم شهرية إضافية، يوصى بها للمرسلين ذوي الحجم الكبير الذين يهتمون بسمعة عنوان IP المشترك.
- الاحتفاظ بالبيانات (Data Retention): تختلف المدة التي تحتفظ فيها Resend بالسجلات والتفاصيل حول رسائل البريد الإلكتروني المرسلة حسب الخطة.
- رسائل البريد الإلكتروني التسويقية (Marketing Emails): تحتوي صفحة التسعير على مفتاح تبديل لرسائل البريد الإلكتروني التسويقية، مما يشير إلى أنه قد يتم تطبيق خطط أو هياكل تسعير مختلفة، لكن التفاصيل كانت تركز على رسائل البريد الإلكتروني الخاصة بالمعاملات في المحتوى المستخلص. تحقق من موقع Resend للحصول على أحدث أسعار البريد الإلكتروني التسويقي.
الخطة المجانية سخية بما يكفي للمشاريع الصغيرة أو أغراض الاختبار. تلبي خطتا Pro و Scale احتياجات التطبيقات المتنامية ذات أحجام البريد الإلكتروني المتزايدة ومتطلبات الميزات. توفر خطة Enterprise حلولاً مخصصة للعمليات واسعة النطاق.
البدء باستخدام Resend
قبل أن تتمكن من إرسال رسائل البريد الإلكتروني، تحتاج إلى إعداد حساب Resend الخاص بك وتكوين نطاق الإرسال الخاص بك.
1. التسجيل وإنشاء مفتاح API
- انتقل إلى موقع Resend وقم بالتسجيل للحصول على حساب.
- انتقل إلى قسم مفاتيح API (API Keys) في لوحة تحكم Resend الخاصة بك (https://resend.com/api-keys).
- انقر على إنشاء مفتاح API (Create API Key).
- امنح مفتاح API الخاص بك اسمًا وصفيًا (على سبيل المثال،
my-app-key
). - اختر مستوى الأذونات:
- وصول كامل (Full access): يسمح بجميع إجراءات API (إنشاء، حذف، الحصول على، تحديث الموارد). استخدم بحذر، عادة ما يكون مطلوبًا فقط لمهام الإدارة الخلفية.
- وصول للإرسال (Sending access): يسمح فقط بإرسال رسائل البريد الإلكتروني. هذا هو الإذن الموصى به لمنطق إرسال تطبيقك. يمكنك اختياريًا تقييد هذا المفتاح للإرسال فقط من نطاق محدد تم التحقق منه.
- انقر على إنشاء (Create).
- هام: ستعرض لك Resend مفتاح API مرة واحدة فقط. انسخه فورًا وقم بتخزينه بأمان (على سبيل المثال، في متغير بيئة، مدير أسرار). لا تقم بتضمينه مباشرة في قاعدة التعليمات البرمجية الخاصة بك.
2. التحقق من نطاقك
لإرسال رسائل بريد إلكتروني تبدو احترافية وتجنب فلاتر البريد العشوائي، يجب عليك التحقق من نطاق تمتلكه. الإرسال من نطاقات غير محققة أو عناوين افتراضية مثل onboarding@resend.dev
مناسب فقط للاختبار الأولي.
- انتقل إلى قسم النطاقات (Domains) في لوحة تحكم Resend الخاصة بك (https://resend.com/domains).
- انقر على إضافة نطاق (Add Domain) وأدخل النطاق الذي تريد إرسال رسائل البريد الإلكتروني منه (على سبيل المثال،
yourcompany.com
). - اختر مزود DNS الخاص بك من القائمة أو حدد 'أخرى' (Other).
- ستوفر لك Resend سجلات DNS (عادة MX، TXT لـ SPF، و CNAME/TXT لـ DKIM) التي تحتاج إلى إضافتها إلى إعدادات DNS لنطاقك.
- SPF (Sender Policy Framework): يحدد خوادم البريد المسموح لها بإرسال البريد الإلكتروني نيابة عن نطاقك.
- DKIM (DomainKeys Identified Mail): يضيف توقيعًا رقميًا إلى رسائل البريد الإلكتروني، مما يسمح للخوادم المستقبلة بالتحقق من أن البريد الإلكتروني لم يتم التلاعب به وأنه نشأ من خادم مصرح به.
- قم بتسجيل الدخول إلى مسجل النطاق أو مزود DNS الخاص بك (على سبيل المثال، GoDaddy، Cloudflare، Namecheap) وأضف السجلات التي قدمتها Resend.
- قد تستغرق تغييرات DNS بعض الوقت للانتشار (من دقائق إلى ساعات، وأحيانًا تصل إلى 48 ساعة).
- بمجرد إضافة السجلات، عد إلى لوحة تحكم Resend Domains وانقر على زر تحقق (Verify) بجوار نطاقك. ستتحقق Resend مما إذا كانت سجلات DNS قد تم إعدادها بشكل صحيح. بمجرد التحقق منها، سيتم تحديث الحالة، ويمكنك البدء في إرسال رسائل البريد الإلكتروني من العناوين المرتبطة بهذا النطاق (على سبيل المثال،
support@yourcompany.com
،noreply@yourcompany.com
).
3. إرسال رسائل البريد الإلكتروني الاختبارية
أثناء التطوير، من الضروري اختبار إرسال البريد الإلكتروني دون التأثير على سمعة نطاقك أو الإرسال إلى مستخدمين حقيقيين عن طريق الخطأ. توفر Resend عناوين بريد إلكتروني خاصة لاختبار سيناريوهات مختلفة:
- اختبار التسليم (Test Delivered): أرسل إلى
delivered@resend.dev
. هذا يحاكي رسالة بريد إلكتروني تم تسليمها بنجاح. - اختبار الارتداد (Test Bounced): أرسل إلى
bounced@resend.dev
. هذا يحاكي ارتدادًا قويًا (على سبيل المثال، عنوان المستلم غير موجود)، مما يؤدي إلى حدث ارتداد. - اختبار وضع علامة كبريد عشوائي (Test Marked as Spam): أرسل إلى
complained@resend.dev
. هذا يحاكي قيام المستلم بوضع علامة على رسالة البريد الإلكتروني الخاصة بك كبريد عشوائي، مما يؤدي إلى حدث شكوى.
يسمح لك استخدام عناوين الاختبار هذه بالتحقق من تكاملك واختبار معالجات Webhook لأحداث الارتداد والشكوى بأمان.
دمج Resend مع الأطر
توفر Resend حزم SDK رسمية وطرق تكامل مباشرة لمختلف اللغات والأطر. سنغطي بعض الأمثلة الشائعة بناءً على التوثيق المقدم. المفهوم الأساسي عادة ما يتضمن:
- تثبيت Resend SDK (إذا كان متاحًا) أو استخدام طلبات HTTP القياسية.
- تهيئة عميل Resend باستخدام مفتاح API الخاص بك (يتم تحميله بأمان، عادة من متغيرات البيئة).
- استدعاء طريقة
emails.send
(أو ما يعادلها) مع معلمات مثلfrom
،to
،subject
، وhtml
أوreact
.
الإرسال باستخدام Next.js
Next.js هو إطار عمل React شائع. يتكامل Resend بشكل جيد، خاصة مع React Email.
1. التثبيت:
npm install resend
# or
yarn add resend
# or
pnpm add resend
2. إنشاء قالب بريد إلكتروني (اختياري ولكنه موصى به):استخدم React Email أو أنشئ مكون React بسيطًا لهيكل رسالة البريد الإلكتروني الخاصة بك.
// components/email-template.tsx
import * as React from 'react';
interface EmailTemplateProps {
firstName: string;
}
export const EmailTemplate: React.FC<Readonly<EmailTemplateProps>> = ({
firstName,
}) => (
<div>
<h1>Welcome, {firstName}!</h1>
</div>
);
3. إنشاء مسار API:أنشئ معالج مسار API لإرسال البريد الإلكتروني.
- App Router:
app/api/send/route.ts
- Pages Router:
pages/api/send.ts
// app/api/send/route.ts (مثال على App Router)
import { EmailTemplate } from '../../../components/email-template'; // عدّل المسار إذا لزم الأمر
import { Resend } from 'resend';
// تأكد من تعيين RESEND_API_KEY في ملف .env.local الخاص بك
const resend = new Resend(process.env.RESEND_API_KEY);
export async function POST() {
try {
const { data, error } = await resend.emails.send({
from: 'Your Name <you@yourverifieddomain.com>', // استخدم نطاقك الذي تم التحقق منه
to: ['delivered@resend.dev'], // استبدل بالمستلم أو عنوان الاختبار
subject: 'Hello from Resend and Next.js!',
react: EmailTemplate({ firstName: 'Test' }), // مرّر الخصائص إلى قالبك
// بدلاً من ذلك، استخدم `html`:
// html: '<strong>It works!</strong>'
});
if (error) {
return Response.json({ error }, { status: 400 });
}
return Response.json(data);
} catch (error) {
return Response.json({ error }, { status: 500 });
}
}
// pages/api/send.ts (مثال على Pages Router - عدّل الاستيرادات/الاستجابة)
// import type { NextApiRequest, NextApiResponse } from 'next';
// import { EmailTemplate } from '../../components/EmailTemplate';
// import { Resend } from 'resend';
//
// const resend = new Resend(process.env.RESEND_API_KEY);
//
// export default async (req: NextApiRequest, res: NextApiResponse) => {
// try { // أُضيفت try...catch لتحسين معالجة الأخطاء
// const { data, error } = await resend.emails.send({
// from: 'Your Name <you@yourverifieddomain.com>',
// to: ['delivered@resend.dev'],
// subject: 'Hello world',
// react: EmailTemplate({ firstName: 'John' }),
// });
//
// if (error) {
// return res.status(400).json(error);
// }
//
// res.status(200).json(data);
// } catch (e) {
// res.status(500).json({ error: 'Internal Server Error' });
// }
// };
4. التشغيل:استدعِ نقطة نهاية API هذه من الواجهة الأمامية لتطبيقك (على سبيل المثال، بعد إرسال نموذج) باستخدام fetch
أو مكتبة مثل axios
. تذكر استبدال القيم النائبة بنطاقك الفعلي الذي تم التحقق منه وقوائم المستلمين.
الإرسال باستخدام Astro
Astro هو منشئ مواقع ثابتة حديث يدعم أيضًا العرض من جانب الخادم (SSR).
1. تثبيت Resend:
npm install resend
# or
yarn add resend
# or
pnpm add resend
2. تثبيت محول SSR:يحتاج Astro إلى محول SSR لتشغيل كود من جانب الخادم عند الطلب. قم بتثبيت واحد مناسب لهدف النشر الخاص بك (على سبيل المثال، @astrojs/node
، @astrojs/vercel
، @astrojs/cloudflare
).
npx astro add node # مثال لمحور Node.js
اتبع تعليمات إعداد المحول في ملف astro.config.mjs
.
3. إضافة مفتاح API:قم بتخزين RESEND_API_KEY
الخاص بك في ملف .env
.
4. إنشاء إجراء Astro:استخدم إجراءات Astro (ميزة تجريبية اعتبارًا من وقت كتابة هذا الدليل، تحقق من وثائق Astro للحالة الحالية) أو نقاط نهاية API القياسية.
// src/actions/index.ts (باستخدام إجراءات Astro)
import { ActionError, defineAction, z } from 'astro:actions';
import { Resend } from 'resend';
// تأكد من أن RESEND_API_KEY متاح عبر import.meta.env
const resend = new Resend(import.meta.env.RESEND_API_KEY);
export const server = {
send: defineAction({
// مثال: تعريف التحقق من الإدخال إذا لزم الأمر
// input: z.object({ email: z.string().email() }),
handler: async (/* { email } - إذا كنت تستخدم الإدخال */) => {
try { // أُضيفت try...catch
const { data, error } = await resend.emails.send({
from: 'Your Name <you@yourverifieddomain.com>',
to: ['delivered@resend.dev'], // استبدل بالمستلم
subject: 'Hello from Resend and Astro!',
html: '<strong>Astro works!</strong>',
// يمكنك أيضًا استخدام قوالب React إذا قمت بإعداد React في Astro
// react: <YourAstroCompatibleReactEmail firstName="Astro" />
});
if (error) {
console.error("Resend Error:", error); // تسجيل الخطأ
// رمي ActionError يساعد Astro على معالجة الأخطاء بشكل سلس
throw new ActionError({
code: 'BAD_REQUEST', // أو كن أكثر تحديدًا بناءً على الخطأ
message: error.message || 'Failed to send email',
});
}
return data; // إرجاع بيانات النجاح
} catch (e) {
console.error("Handler Error:", e);
// إعادة رمي أو رمي ActionError جديد
throw new ActionError({
code: 'INTERNAL_SERVER_ERROR',
message: 'An unexpected error occurred.',
});
}
},
}),
};
// بديل: نقطة نهاية API (على سبيل المثال، src/pages/api/send.ts)
// import type { APIRoute } from 'astro';
// import { Resend } from 'resend';
//
// const resend = new Resend(import.meta.env.RESEND_API_KEY);
//
// export const POST: APIRoute = async ({ request }) => {
// // const body = await request.json(); // إذا كانت البيانات تأتي من جسم الطلب
// try {
// const { data, error } = await resend.emails.send({ /* ... معلمات البريد الإلكتروني ... */ });
// if (error) {
// return new Response(JSON.stringify(error), { status: 400 });
// }
// return new Response(JSON.stringify(data), { status: 200 });
// } catch (e) {
// return new Response(JSON.stringify({ message: "Server Error"}), { status: 500 });
// }
// }
5. التشغيل:استدعِ الإجراء أو نقطة النهاية من مكونات أو صفحات Astro الخاصة بك، عادة ضمن معالج إرسال نموذج.
الإرسال باستخدام Bun
Bun هو وقت تشغيل JavaScript سريع مع مجمع مدمج (bundler)، ومحول (transpiler)، ومشغل مهام (task runner)، وعميل npm.
1. التثبيت:
bun install resend
2. إنشاء قالب بريد إلكتروني (اختياري):على غرار Next.js، يمكنك إنشاء ملف .tsx
لقالب بريد React الإلكتروني الخاص بك.
// email-template.tsx
import * as React from 'react';
interface EmailTemplateProps {
firstName: string;
}
export const EmailTemplate: React.FC<Readonly<EmailTemplateProps>> = ({
firstName,
}) => (
<div>
<h1>Welcome, {firstName}!</h1>
</div>
);
3. إنشاء سكريبت خادم Bun:أنشئ سكريبت (على سبيل المثال، index.tsx
) لتشغيل خادم HTTP بسيط باستخدام Bun.
// index.tsx
import { Resend } from 'resend';
import { EmailTemplate } from './email-template'; // بافتراض أنه في نفس الدليل
// تحميل مفتاح API من متغيرات البيئة
const resendApiKey = process.env.RESEND_API_KEY;
if (!resendApiKey) {
console.error("Error: RESEND_API_KEY environment variable not set.");
process.exit(1); // خروج إذا كان المفتاح مفقودًا
}
const resend = new Resend(resendApiKey);
const server = Bun.serve({
port: 3000,
async fetch(req) { // أُضيفت وسيطة 'req'
// اختياري: تحقق من طريقة الطلب، المسار، إلخ.
// if (new URL(req.url).pathname !== '/send') {
// return new Response("Not Found", { status: 404 });
// }
// if (req.method !== 'POST') {
// return new Response("Method Not Allowed", { status: 405 });
// }
try {
const { data, error } = await resend.emails.send({
from: 'Your Name <you@yourverifieddomain.com>',
to: ['delivered@resend.dev'],
subject: 'Hello from Resend and Bun!',
react: EmailTemplate({ firstName: 'Bun User' }),
// أو استخدم html: '<strong>Bun works!</strong>'
});
if (error) {
console.error("Resend Error:", error);
// إرجاع استجابة خطأ JSON مناسبة
return new Response(JSON.stringify({ error: error.message || 'Failed to send email' }), {
status: 500, // أو 400 حسب نوع الخطأ
headers: { 'Content-Type': 'application/json' },
});
}
// إرجاع استجابة النجاح
return new Response(JSON.stringify(data), {
status: 200,
headers: { 'Content-Type': 'application/json' },
});
} catch (e) {
console.error("Server Error:", e);
return new Response(JSON.stringify({ error: 'Internal Server Error' }), {
status: 500,
headers: { 'Content-Type': 'application/json' },
});
}
},
error(error) { // أُضيف معالج أخطاء أساسي للخادم نفسه
return new Response(`<pre>${error}\\\\n${error.stack}</pre>`, {
headers: { "Content-Type": "text/html" },
});
},
});
console.log(`Listening on <http://localhost>:${server.port} ...`);
4. التشغيل:ابدأ تشغيل الخادم باستخدام RESEND_API_KEY=your_api_key bun run index.tsx
. الوصول إلى http://localhost:3000
(أو تشغيل المسار/الطريقة المحددة التي قمت بتعريفها) سيؤدي إلى إرسال البريد الإلكتروني.
الإرسال باستخدام Nuxt
Nuxt هو إطار عمل Vue.js شائع.
1. التثبيت:
npm install resend
# or
yarn add resend
# or
pnpm add resend
2. إنشاء مسار خادم:يستخدم Nuxt دليل server/
لمنطق الواجهة الخلفية. أنشئ ملفًا مثل server/api/send.post.ts
(يشير .post
إلى أنه يتعامل مع طلبات POST).
// server/api/send.post.ts
import { Resend } from 'resend';
// الوصول إلى مفتاح API بأمان (على سبيل المثال، عبر runtimeConfig في nuxt.config.ts)
// انظر: <https://nuxt.com/docs/guide/going-further/runtime-config>
const config = useRuntimeConfig();
const resend = new Resend(config.resendApiKey); // بافتراض أن المفتاح تم تعيينه في runtime config
export default defineEventHandler(async (event) => {
// اختياري: قراءة الجسم إذا كانت البيانات تأتي من الطلب
// const body = await readBody(event);
try {
const data = await resend.emails.send({
from: 'Your Name <you@yourverifieddomain.com>',
to: ['delivered@resend.dev'],
subject: 'Hello from Resend and Nuxt!',
html: '<strong>Nuxt works!</strong>',
// يمكنك دمج قوالب بريد Vue الإلكترونية (على سبيل المثال، باستخدام vue-email)
// انظر: <https://github.com/Dave136/vue-email>
});
// Nuxt 3 يعالج تلقائيًا إرجاع البيانات كـ JSON
return data;
} catch (error: any) { // التقاط أنواع أخطاء محددة إذا أمكن
console.error("Resend Error:", error);
// رمي خطأ يمكن لـ Nuxt معالجته، مع تعيين رمز الحالة
throw createError({
statusCode: 400, // أو 500
statusMessage: 'Failed to send email',
data: error // اختياريًا تضمين تفاصيل الخطأ
});
}
});
// في ملف nuxt.config.ts الخاص بك، عرّف runtimeConfig:
// export default defineNuxtConfig({
// runtimeConfig: {
// resendApiKey: process.env.NUXT_RESEND_API_KEY, // من جانب الخادم فقط
// public: {
// // مفاتيح عامة يمكن الوصول إليها من جانب العميل
// }
// }
// })
// وقم بتعيين NUXT_RESEND_API_KEY في ملف .env الخاص بك
3. التشغيل:استدعِ نقطة النهاية /api/send
(باستخدام طريقة POST) من صفحات أو مكونات Nuxt الخاصة بك باستخدام $fetch
أو useFetch
.
الإرسال باستخدام Vercel Functions
Vercel Functions هي دوال بلا خادم (serverless) تتكامل بسلاسة مع Next.js أو يمكن استخدامها بشكل مستقل. يوضح المثال أعلاه لـ Next.js بالفعل الاستخدام ضمن بيئة Vercel. إذا كنت تستخدم Vercel Functions بدون Next.js (على سبيل المثال، مع منشئ مواقع ثابتة أو إطار عمل آخر تم نشره على Vercel)، فإن النهج مشابه:
1. إنشاء دالة:أنشئ ملفًا في دليل api/
لمشروعك (على سبيل المثال، api/send.ts
).
// api/send.ts (مثال لدالة Vercel قياسية)
import type { VercelRequest, VercelResponse } from '@vercel/node';
import { Resend } from 'resend'; // قد تحتاج إلى تثبيت resend
// تأكد من تعيين RESEND_API_KEY كمتغير بيئة في Vercel
const resendApiKey = process.env.RESEND_API_KEY;
if (!resendApiKey) {
console.error("RESEND_API_KEY is not set");
// لا تتابع إذا كان المفتاح مفقودًا في بيئة الإنتاج
}
const resend = new Resend(resendApiKey);
export default async function handler(
request: VercelRequest,
response: VercelResponse,
) {
// موصى به: تحقق من طريقة POST
if (request.method !== 'POST') {
return response.status(405).json({ message: 'Method Not Allowed' });
}
try {
const { data, error } = await resend.emails.send({
from: 'Your Name <you@yourverifieddomain.com>',
to: ['delivered@resend.dev'],
subject: 'Hello from Resend & Vercel Functions!',
html: '<strong>It works on Vercel!</strong>',
// يمكن استخدام قوالب React إذا كانت دالتك تجمع React
});
if (error) {
console.error('Resend Error:', error);
return response.status(400).json(error);
}
return response.status(200).json(data);
} catch (e) {
console.error('Handler Error:', e);
return response.status(500).json({ message: 'Internal Server Error' });
}
}
2. تكوين متغير البيئة:أضف RESEND_API_KEY
الخاص بك كمتغير بيئة في إعدادات مشروع Vercel الخاص بك.
3. النشر:انشر مشروعك باستخدام Vercel CLI (vercel
) أو تكامل Git.
4. التشغيل:قم بإجراء طلب POST إلى عنوان URL الخاص بالدالة المنشورة (على سبيل المثال، https://your-project.vercel.app/api/send
).
الإرسال باستخدام Supabase Edge Functions
Supabase Edge Functions تعمل على Deno Deploy، بالقرب من المستخدمين لديك. تستخدم Deno و Web APIs القياسية مثل fetch
. لا تمتلك Resend حزمة SDK رسمية لـ Deno حتى الآن، لذا ستستخدم fetch
مباشرة.
1. إنشاء دالة Supabase:استخدم Supabase CLI:
supabase functions new resend-email-sender # اختر اسمًا
cd supabase/functions/resend-email-sender
2. تعديل المعالج:عدّل ملف index.ts
الذي تم إنشاؤه.
// supabase/functions/resend-email-sender/index.ts
import { serve } from "<https://deno.land/std@0.177.0/http/server.ts>"; // استخدم إصدار std المناسب
// الوصول إلى مفتاح API بأمان عبر متغيرات بيئة Supabase Edge Function
const RESEND_API_KEY = Deno.env.get('RESEND_API_KEY');
// معالج طلب أساسي
const handler = async (_request: Request): Promise<Response> => {
if (!RESEND_API_KEY) {
console.error("RESEND_API_KEY environment variable not set.");
return new Response(JSON.stringify({ error: "Server configuration error" }), {
status: 500, headers: { 'Content-Type': 'application/json' }
});
}
// اختياري: تحقق من طريقة _request، الرؤوس، أو الجسم إذا لزم الأمر
try {
const res = await fetch('<https://api.resend.com/emails>', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${RESEND_API_KEY}` // استخدم المفتاح هنا
},
body: JSON.stringify({
from: 'Your Name <you@yourverifieddomain.com>',
to: ['delivered@resend.dev'], // استبدل المستلم
subject: 'Hello from Resend & Supabase Edge!',
html: '<strong>It works! Edge Functions are cool.</strong>',
// ملاحظة: إرسال مكونات React مباشرة غير ممكن هنا
// بدون خطوة بناء في دالة الحافة لعرضها إلى HTML.
// أرسل HTML معروضًا مسبقًا أو نصًا عاديًا.
})
});
// معالجة الاستجابات المحتملة غير OK من Resend API
if (!res.ok) {
const errorData = await res.json().catch(() => ({ message: 'Failed to parse Resend error response' }));
console.error("Resend API Error:", res.status, errorData);
return new Response(JSON.stringify({ error: 'Failed to send email via Resend', details: errorData }), {
status: res.status, // إعادة توجيه رمز حالة Resend
headers: { 'Content-Type': 'application/json' },
});
}
// تحليل الاستجابة الناجحة
const data = await res.json();
// إرجاع استجابة النجاح
return new Response(JSON.stringify(data), {
status: 200,
headers: { 'Content-Type': 'application/json' },
});
} catch (error) {
console.error("Edge Function Error:", error);
return new Response(JSON.stringify({ error: 'Internal Server Error in Edge Function' }), {
status: 500,
headers: { 'Content-Type': 'application/json' },
});
}
};
// بدء تشغيل الخادم
serve(handler);
console.log("Supabase Edge Function 'resend-email-sender' is running...");
3. تعيين متغير البيئة:عيّن RESEND_API_KEY
محليًا باستخدام supabase secrets set RESEND_API_KEY your_actual_key
وقم بتعيينه أيضًا في إعدادات دالة مشروع Supabase الخاص بك للنشر.
4. النشر والاستدعاء:
# اختبار محليًا (اختياري)
supabase functions serve resend-email-sender --no-verify-jwt
# النشر
supabase functions deploy resend-email-sender --no-verify-jwt
استدعِ الدالة باستخدام عنوان URL الخاص بها، عادة عبر استدعاء مكتبة عميل Supabase من الواجهة الأمامية لتطبيقك أو خدمة خلفية أخرى.
الإرسال باستخدام Cloudflare Workers
Cloudflare Workers هي دوال بلا خادم تعمل على شبكة حافة Cloudflare. يمكن لحزمة Resend Node.js SDK غالبًا العمل في بيئات Workers مع التجميع المناسب.
1. إعداد مشروع Worker:ابدأ مشروع Worker، غالبًا باستخدام npm create cloudflare
. تأكد من إعداده للوحدات النمطية والتجميع (على سبيل المثال، باستخدام Wrangler مع Webpack أو esbuild).
2. تثبيت Resend:
npm install resend
# or yarn/pnpm
3. إنشاء قالب بريد إلكتروني (اختياري):إذا كنت تستخدم React، أنشئ ملف القالب الخاص بك (.tsx
).
4. تعديل سكريبت Worker:عدّل ملف Worker الرئيسي الخاص بك (على سبيل المثال، src/index.ts
أو src/index.tsx
إذا كنت تستخدم React).
// src/index.tsx (مثال باستخدام React)
import { Resend } from 'resend';
// بافتراض أن لديك مكون قالب React
import { EmailTemplate } from './emails/email-template'; // عدّل المسار
// تعريف متغيرات البيئة المتوقعة لسلامة النوع
export interface Env {
RESEND_API_KEY: string;
}
export default {
async fetch(
request: Request,
env: Env, // الوصول إلى متغيرات البيئة عبر 'env'
ctx: ExecutionContext
): Promise<Response> {
// إنشاء مثيل Resend باستخدام مفتاح API من متغيرات البيئة
const resend = new Resend(env.RESEND_API_KEY);
// اختياري: تحقق من طريقة الطلب، مسار URL، إلخ.
// مثال: السماح فقط بطلبات POST إلى مسار محدد
// const url = new URL(request.url);
// if (url.pathname !== '/send-email' || request.method !== 'POST') {
// return new Response('Not Found or Method Not Allowed', { status: 404 });
// }
try {
const { data, error } = await resend.emails.send({
from: 'Your Name <you@yourverifieddomain.com>',
to: ['delivered@resend.dev'], // استبدل المستلم
subject: 'Hello from Resend & Cloudflare Workers!',
// استخدم مكون React إذا كان قابلاً للتطبيق
react: <EmailTemplate firstName="Worker User" />,
// أو استخدم HTML
// html: '<strong>It works from the Edge!</strong>',
});
if (error) {
console.error("Resend Error:", JSON.stringify(error));
return Response.json({ error: 'Failed to send email via Resend' }, { status: 400 });
}
return Response.json(data);
} catch (e) {
console.error("Worker Error:", e);
// تسجيل مكدس الخطأ إذا أمكن
if (e instanceof Error) {
console.error(e.stack);
}
return Response.json({ error: 'Internal Server Error in Worker' }, { status: 500 });
}
},
} // satisfies ExportedHandler<Env>; // اختياري: استخدم satisfies لتحسين التحقق من النوع
5. تكوين متغير البيئة:عيّن RESEND_API_KEY
كسر لمشروع Worker الخاص بك باستخدام Wrangler:
npx wrangler secret put RESEND_API_KEY
# الصق مفتاحك عند المطالبة
6. النشر:
npx wrangler deploy # أو 'wrangler dev' للاختبار المحلي
استدعِ Worker باستخدام عنوان URL المخصص له.
الإرسال باستخدام AWS Lambda
انتهى وقت استخلاص البيانات لصفحة توثيق AWS Lambda، لذا يعتمد هذا القسم على المبادئ العامة.
يتبع إرسال رسائل البريد الإلكتروني من AWS Lambda باستخدام Resend نمطًا مشابهًا:
1. إعداد دالة Lambda:أنشئ دالة Lambda باستخدام وقت التشغيل المفضل لديك (Node.js شائع ويعمل جيدًا مع Resend SDK). تأكد من أن دالة Lambda الخاصة بك لديها وصول إلى الإنترنت (على سبيل المثال، تم تكوينها ضمن VPC مع NAT Gateway أو باستخدام إعدادات VPC الافتراضية التي تسمح بالخروج).
2. تثبيت Resend SDK:ضمّن resend
في حزمة نشر دالتك (على سبيل المثال، في package.json
وقم بتشغيل npm install
قبل الضغط أو استخدم Lambda Layers).
3. تخزين مفتاح API بأمان:استخدم AWS Secrets Manager أو AWS Systems Manager Parameter Store لتخزين RESEND_API_KEY
الخاص بك. امنح دور تنفيذ دالة Lambda الخاصة بك الإذن بقراءة هذا السر. لا تقم بتضمين المفتاح مباشرة في كود دالة Lambda.
4. كتابة كود معالج Lambda (مثال Node.js):
// lambda_function.js (مثال Node.js)
const { Resend } = require('resend');
// عملاء AWS SDK (إذا كنت تحصل على المفتاح من Secrets Manager/Parameter Store)
const { SecretsManagerClient, GetSecretValueCommand } = require("@aws-sdk/client-secrets-manager"); // V3 SDK
let resend; // تهيئة خارج المعالج لإعادة الاستخدام المحتملة
async function getApiKey() {
// استبدل باسم/ARN السر والمنطقة الخاصة بك
const secretName = "your/resend/api/key/secret";
const client = new SecretsManagerClient({ region: "your-region" });
try {
const command = new GetSecretValueCommand({ SecretId: secretName });
const response = await client.send(command);
if ('SecretString' in response) {
// بافتراض أن السر يخزن المفتاح مباشرة أو كـ JSON مثل {"apiKey": "re_..."}
const secret = JSON.parse(response.SecretString);
return secret.apiKey; // عدّل التحليل بناءً على كيفية تخزينك له
}
throw new Error("API Key not found in secret string");
} catch (error) {
console.error("Error retrieving API Key from Secrets Manager:", error);
throw error; // إعادة رمي للإشارة إلى الفشل
}
}
exports.handler = async (event, context) => {
// اختياري: تحليل بيانات الحدث إذا لزم الأمر (على سبيل المثال، من مشغل API Gateway)
// const body = JSON.parse(event.body || '{}');
// const recipient = body.to;
try {
if (!resend) {
const apiKey = await getApiKey();
if (!apiKey) {
return { statusCode: 500, body: JSON.stringify({ message: "API Key configuration error" }) };
}
resend = new Resend(apiKey);
}
const { data, error } = await resend.emails.send({
from: 'Your Name <you@yourverifieddomain.com>',
to: ['delivered@resend.dev'], // استخدم المستلم من الحدث أو قيمة ثابتة
subject: 'Hello from Resend & AWS Lambda!',
html: '<strong>Lambda email sent successfully!</strong>',
// يتطلب React خطوة بناء أو إعداد عرض من جانب الخادم داخل Lambda
});
if (error) {
console.error('Resend Error:', error);
return {
statusCode: 400, // أو حالة مناسبة بناءً على الخطأ
body: JSON.stringify(error),
};
}
return {
statusCode: 200,
body: JSON.stringify(data),
headers: { 'Content-Type': 'application/json' },
};
} catch (e) {
console.error('Lambda Handler Error:', e);
return {
statusCode: 500,
body: JSON.stringify({ message: 'Internal Server Error' }),
};
}
};
5. تكوين المشغل:قم بإعداد مشغل لدالة Lambda الخاصة بك (على سبيل المثال، API Gateway لطلبات HTTP، قائمة انتظار SQS، حدث EventBridge).
6. النشر:انشر دالة Lambda الخاصة بك وتبعياتها.
استخدام React Email مع Resend
ميزة رئيسية لـ Resend هي تكاملها السلس مع React Email. يسمح لك React Email ببناء قوالب بريد إلكتروني جميلة ومتجاوبة باستخدام مكونات React القياسية وبناء الجملة.
الفوائد:
- مبني على المكونات: هيكلة رسائل البريد الإلكتروني مثل تطبيقات الويب باستخدام مكونات قابلة لإعادة الاستخدام.
- سلامة النوع (Type Safety): استخدم TypeScript لقوالب أكثر قوة.
- التطوير المحلي: تطوير ومعاينة رسائل البريد الإلكتروني محليًا في متصفحك.
- لا توجد لغات قوالب معقدة: تجنب بناء جملة القوالب المملوك أو المعقد للبريد الإلكتروني.
الإعداد (بناءً على وثائق React Email - قد يختلف قليلاً):
التثبيت: أضف react-email
ومكوناته الأساسية إلى مشروعك. ستحتاج على الأرجح إلى resend
أيضًا إذا كنت ترسل من خلالها.
npm install react-email @react-email/components resend
# or yarn/pnpm
إنشاء قوالب بريد إلكتروني: أنشئ ملفات .tsx
لرسائل البريد الإلكتروني الخاصة بك، عادة في دليل مخصص emails/
.
// emails/welcome.tsx
import { Html, Button, Text } from '@react-email/components';
import * as React from 'react';
interface WelcomeEmailProps {
name: string;
signupLink: string;
}
export const WelcomeEmail: React.FC<Readonly<WelcomeEmailProps>> = ({ name, signupLink }) => (
<Html>
<Text>Hello {name},</Text>
<Text>Welcome aboard! Click the button below to get started.</Text>
<Button href={signupLink}>Complete Signup</Button>
</Html>
);
export default WelcomeEmail; // التصدير الافتراضي غالبًا ما يكون مفيدًا
الدمج مع منطق الإرسال: في مسار API الخلفي أو دالة بلا خادم، قم باستيراد مكون البريد الإلكتروني ومرره إلى خيار react
في Resend.
// مثال في مسار API لـ Next.js (app/api/send-welcome/route.ts)
import { Resend } from 'resend';
import WelcomeEmail from '../../../emails/welcome'; // عدّل المسار
const resend = new Resend(process.env.RESEND_API_KEY);
export async function POST(request: Request) {
try {
const body = await request.json(); // بافتراض { email: '...', name: '...' } في الجسم
const signupUrl = "<https://yoursite.com/signup-step2>"; // مثال URL
const { data, error } = await resend.emails.send({
from: 'Your App <welcome@yourverifieddomain.com>',
to: [body.email],
subject: 'Welcome to Our Platform!',
// مرّر مكون React مباشرة
react: WelcomeEmail({ name: body.name, signupLink: signupUrl }),
});
if (error) {
return Response.json({ error }, { status: 400 });
}
return Response.json(data);
} catch (error) {
return Response.json({ error }, { status: 500 });
}
}
تتولى Resend (وعملية بناء React Email إذا تم استخدامها بشكل مستقل) عرض مكون React إلى HTML آمن للبريد الإلكتروني خلف الكواليس. هذا يحسن بشكل كبير تجربة المطور لإنشاء قوالب البريد الإلكتروني وصيانتها.
الخلاصة
تقدم Resend حلاً حديثًا يركز على المطورين لإرسال رسائل البريد الإلكتروني. واجهة برمجة تطبيقاتها النظيفة، وتكاملاتها الممتازة مع الأطر (خاصة مع React Email)، والتركيز على قابلية التوصيل، والميزات المفيدة مثل رسائل البريد الإلكتروني الاختبارية و webhooks تجعلها خيارًا مقنعًا للتطبيقات بجميع أحجامها.
باتباع الخطوات الموضحة في هذا الدليل - إعداد حسابك، التحقق من نطاقك، اختيار طريقة التكامل المناسبة لإطار عملك، والاستفادة من أدوات مثل React Email - يمكنك دمج وظائف البريد الإلكتروني القوية في مشاريعك بسرعة وموثوقية. تذكر دائمًا التعامل مع مفاتيح API بأمان ومراقبة نشاط الإرسال الخاص بك من خلال لوحة تحكم Resend و webhooks لضمان قابلية توصيل مثالية وتجربة مستخدم ممتازة.
هل تريد منصة متكاملة وشاملة لفريق المطورين لديك للعمل معًا بأقصى إنتاجية؟
Apidog يلبي جميع متطلباتك، ويحل محل Postman بسعر معقول أكثر بكثير!