كيفية إرسال بريد إلكتروني باستخدام PHP باستخدام Twilio SendGrid و Mezzio
نشرت: 2021-03-24البريد الإلكتروني أداة اتصال مهمة كما كانت دائمًا. لمساعدتك على الاستفادة بشكل أفضل من البريد الإلكتروني ، سأوضح لك كيفية إرسال بريد إلكتروني باستخدام إطار عمل Mezzio في PHP وواجهة برمجة تطبيقات Twilio SendGrid.
على وجه التحديد ، ستتعلم كيفية إرسال رسائل البريد الإلكتروني مع نص عادي ونصوص HTML ، وهذا يتضمن مرفق PDF. ستتعلم أيضًا كيفية استخدام وظيفة قوالب المعاملات في Twilio SendGrid لجعل إنشاء هيئات البريد الإلكتروني أبسط من قبل فريق التطوير وأي فريق آخر داخل مؤسستك.
يبدو ذلك جيدا؟ هيا نبدأ.
نظرة عامة سريعة على التطبيق
كطريقة لجعل هذا البرنامج التعليمي أكثر جدوى ، تخيل أن الكود الذي سنكتبه هو جزء من متجر وهمي للتجارة الإلكترونية عبر الإنترنت تم إنشاؤه باستخدام Mezzio ، ويُسمى The Little PHP Shop - على وجه التحديد ، الجزء الذي يلي قيام العميل بعملية الشراء مباشرة. في هذه المرحلة من تدفق المستخدم ، يتلقى العميل بريدًا إلكترونيًا يشكره على شرائه ويتضمن فاتورة بتنسيق PDF لسجلاته.
سننشئ فئة Handler لإرسال البريد الإلكتروني بعد الشراء ، والذي سيتلقى تفاصيل الشراء من أمر أكمله العميل. باستخدام معلومات الشراء هذه ، ستستخدم فئة المعالج بعد ذلك عدة فئات في SendGrid PHP API لإنشاء وإرسال البريد الإلكتروني لتأكيد الشراء.
من بين هؤلاء ، أهمها "SendGrid \ Mail \ Mail" و "SendGrid." "SendGrid \ Mail \ Mail" هو الكائن الذي يخزن جميع الخصائص لرسالة بريد إلكتروني سنرسلها عبر Twilio SendGrid. يشكل كائن "SendGrid" طبقة النقل ، مما يسهل إرسال رسائل البريد الإلكتروني من خلال Twilio SendGrid.
المتطلبات الأساسية
لإكمال هذا البرنامج التعليمي ، ستحتاج إلى الأشياء الأربعة التالية في بيئة التطوير المحلية الخاصة بك:
- حساب Twilio SendGrid
- PHP 7.4 مع تثبيت وتمكين امتدادات cURL و mbstring و O pen SSL
- تم تثبيت الملحن عالميًا
- لفة
سقالة تطبيق Mezzio
نحتاج أولاً إلى إنشاء التطبيق الأساسي. للقيام بذلك ، كما هو الحال دائمًا ، سنستخدم Mezzio Skeleton للقيام بذلك من أجلنا. بمجرد قيامنا بسقالة التطبيق الأساسي ، سننتقل إلى دليل المشروع الذي تم إنشاؤه حديثًا. ثم قم بتشغيل الأوامر التالية في الجهاز الخاص بك ، باتباع المطالبات الخاصة بالأول:
قم بتثبيت التبعيات المطلوبة
مع سقالة المشروع ، نحتاج إلى إضافة 3 تبعيات إضافية لإكمال المشروع. وهذه هي:
- مكتبة PHP API في Twilio SendGrid للتفاعل مع Twilio SendGrid API
- عميل PHP HTTP لإرسال طلبات HTTP
- PHP Dotenv لتخزين واسترجاع متغيرات البيئة
لتثبيتها ، قم بتشغيل الأمر التالي في جهازك الطرفي:
قم بتهيئة PHP Dotenv
بعد تثبيت التبعيات ، نقوم بتحميل PHP Dotenv بحيث يقرأ المتغيرات المحددة في “.env” ونجعلها متاحة لـ PHP كمتغيرات بيئة. للقيام بذلك ، أدخل الكود التالي في "public / index.php ،" مباشرة بعد "request vendor / autoload.php."
أضف تفاصيل حساب Twilio SendGrid
أنت الآن بحاجة إلى تزويد التطبيق بمفتاح SendGrid API الخاص بك. للقيام بذلك ، بعد تسجيل الدخول إلى Twilio SendGrid ، انتقل إلى "الإعدادات -> مفاتيح API . " كان هناك:
- انقر فوق " إنشاء مفتاح API " لإنشاء مفتاح API
- امنح مفتاح واجهة برمجة التطبيقات الجديد اسمًا ، واقبل الإذن الافتراضي لمفتاح واجهة برمجة التطبيقات لـ " الوصول الكامل " ، وانقر على " إنشاء وعرض "
مع إنشاء مفتاح API ، انقر فوق المفتاح وانسخه ، ثم انقر فوق " تم . "
بعد ذلك ، أضف مفتاحين آخرين إلى الملف: "SENDGRID_DEFAULT_SENDER_ADDRESS" و "SENDGRID_DEFAULT_SENDER_NAME." كما تشير الأسماء ، فهذان هما عنوان البريد الإلكتروني والاسم الذي سنستخدمه لأية رسائل بريد إلكتروني مرسلة من تطبيقنا ما لم يتم تجاوزها.
ملاحظة: للقيام بذلك ، في مصادقة المرسل ، تأكد من أنه "تم التحقق" في جدول "التحقق من المرسل الفردي".
تعيين تفاصيل تكوين بريد التطبيق
بالإضافة إلى مفتاح Twilio SendGrid API ، سنقوم بتخزين بعض إعدادات تكوين البريد العالمية الأخرى. على وجه التحديد ، سنقوم بتعيين "من" والرد على عنوان البريد الإلكتروني والاسم الذي سنستخدمه في كل رسالة بريد إلكتروني. بهذه الطريقة ، لا يتعين علينا ضبطها في كل مرة.
سنقوم أيضًا بإنشاء نموذجين لهيكل البريد الإلكتروني: أحدهما لرسائل البريد الإلكتروني ذات النص العادي والآخر لرسائل البريد الإلكتروني بتنسيق HTML. للقيام بذلك ، في "config / autoload" ، أنشئ ملفًا جديدًا باسم "mail.global.php ،" وفيه ، أضف الكود التالي.
قم بإنشاء فئة لإنشاء مثيل لكائن بريد
مع تعيين تفاصيل تكوين التطبيق الرئيسي ، فلنقم الآن بإنشاء فئة تقوم بإنشاء مثيل لكائن بريد أساسي مع تعيين الخصائص الافتراضية. للقيام بذلك ، في دليل جديد ، "src / App / src / Mailer" ، أنشئ ملفًا جديدًا يسمى "SendGridMailMessageFactory.php" ، وفيه أضف الكود أدناه.
عندما نستدعي الصنف ، يكون لديه حق الوصول إلى حاوية حقن التبعية (DI) للتطبيق ، والتي ستسترجع منها تفاصيل التكوين التي قمنا بتخزينها في "config / autoload / mail.global.php."
بعد ذلك ، سيتم إنشاء كائن "SendGrid \ Mail \ Mail" جديد وتعيين من والرد على التفاصيل عن طريق تمرير تفاصيل التكوين المعنية إلى المكالمات إلى أساليب "Mail" و "setFrom" و "setReplyTo" ، على التوالي. بعد ذلك ، سيعيد الكائن "Mail" الذي تم إنشاء مثيل له.
لاستخدامه ، يجب عليك تسجيله في حاوية DI. للقيام بذلك ، في "src / App / src / ConfigProvider" ، أضف الإدخال التالي إلى عنصر "plants" في المصفوفة التي تم إرجاعها من طريقة "getDependencies".
قم بإنشاء معالج لإرسال البريد الإلكتروني
نحتاج بعد ذلك إلى إنشاء فئة Handler لإنشاء رسائل البريد الإلكتروني وإرسالها. للقيام بذلك ، سنستخدم أدوات Mezzio's CLI ، المتوفرة عبر Composer ، عن طريق تشغيل الأمر أدناه.
يؤدي تشغيل الأمر أعلاه إلى أربعة أشياء بالنسبة لنا:
- يُنشئ C فئة معالج جديدة ، "src / App / Handler / EmailSenderHandler.php"
- يُنشئ فئة مصنع لإنشاء مثيل لفئة المعالج ، "src / App / Handler / EmailSenderHandlerFactory.php"
- لإنشاء ملف نموذج (“src / App / Templates / app / email-sender.html. <ext>”) ، لن نحتاج إليه . يتم تحديد اسم الملف "<ext>" بواسطة محرك النموذج الذي اخترته أثناء مرحلة "إنشاء المشروع".
- يتم تسجيل فئة المعالج الجديدة كخدمة في حاوية DI عن طريق إضافة إدخال إلى "config / autoload / mezzio-tooling-plants.global.php"
إعادة تشكيل المعالج لإرسال رسائل البريد الإلكتروني
مع إنشاء "EmailSenderHandler.php" ، نحتاج الآن إلى إعادة بنائه بحيث يمكنه إرسال رسائل بريد إلكتروني. للقيام بذلك ، سنقوم أولاً بإعادة بناء مُنشئ "EmailSenderHandler's" ، واستبدال المعلمة "TemplateRendererInterface" بثلاث معاملات جديدة. سيؤدي ذلك إلى تهيئة 3 متغيرات جديدة لأعضاء الفصل الدراسي:
- كائن “\ SendGrid \ Mail \ Mail”
- كائن “\ SendGrid”
- مصفوفة تحتوي على تفاصيل التكوين المطلوبة
يمكنك رؤية المُنشئ الذي تمت مراجعته في المثال أدناه ، جنبًا إلى جنب مع متغيرات أعضاء الفصل الدراسي ذات الصلة. استبدل متغير عضو الفئة الحالي والمنشئ بهذا الرمز.
ملاحظة: بعد ذلك ، نحتاج إلى إعادة تشكيل طريقة "التعامل". استبدل المحتويات الحالية لطريقة “EmailSenderHandler” “handle” بالكود أدناه ، ثم دعنا نتعرف على ما يفعله.
يبدأ باستخدام "request-> getParsedBody () $" لاسترداد أي معاملات متوفرة في نص الطلب ، والتي ستعيد مصفوفة ترابطية ، وتهيئة "تفاصيل $". مع توفر المعلمات ، فإنه يستدعي طريقة "addTo" للكائن "SendGrid \ Mail \ Mail" لتعيين مستلم البريد الإلكتروني ، وتمرير عنوان البريد الإلكتروني للمستلم واسمه في الوسيطتين الأوليين ومجموعة من الاستبدالات في الوسيطة الثالثة.
تسمح لك البدائل بتخصيص رسائل البريد الإلكتروني لكل مستلم. في رسائل البريد الإلكتروني ذات النص العادي ، تعتبر أي سلسلة محاطة على الفور بواصلات ، على سبيل المثال ، "-first_name-" بديلاً. في رسائل البريد الإلكتروني بتنسيق HTML ، تستخدم بنية المقاود ، والتي تحيط بالسلاسل ذات الأقواس المزدوجة ، على سبيل المثال ، "{{first_name}}".
بعد ذلك ، قمنا بتعيين موضوع الرسالة وإضافة نص عادي ونص رسالة HTML. مع ذلك ، بريدنا الإلكتروني جاهز للإرسال. لذلك نستخدم الكائن "SendGrid" ، "$ this-> mailer ،" لإرساله ، وتهيئة متغير جديد ، "استجابة $" ، مع الاستجابة من محاولة إرسال الرسالة. أخيرًا ، نعيد كائن JsonResponse ، الذي يحتوي على كود الحالة والجسم من الاستجابة.
ملاحظة: طريقة __invoke الخاصة بإعادة فاكتور EmailSenderHandlerFactory
الآن بعد أن أكملنا إعادة هيكلة "EmailSenderHandler" ، نحتاج إلى إعادة بناء "EmailSenderHandlerFactory". سيؤدي هذا إلى إنشاء مثيل "EmailSenderHandler" بشكل صحيح. للقيام بذلك ، استبدل التعريف الحالي لطريقة “__invoke`” بالتعليمة البرمجية التالية.
يؤدي هذا إلى استرداد كائن "\ SendGrid \ Mail \ Mail" من حاوية DI ، مهيأ مسبقًا مع المرسل والرد على تفاصيل البريد الإلكتروني ، وتهيئة كائن جديد باسم "$ message". ثم يقوم بإنشاء كائن "SendGrid" جديد ، يسمى "$ mailer" لإرسال رسالة البريد. أخيرًا ، يقوم باسترداد تكوين البريد من تكوين التطبيق. ثم يستخدمها لتهيئة وإرجاع كائن "EmailSenderHandler".
قم بتحديث جدول التوجيه
مع كل هذه التغييرات ، هناك تغيير أخير يجب إجراؤه قبل أن نتمكن من اختبار الكود وإرسال بريد إلكتروني. يتعين علينا تحديث جدول التوجيه بحيث يستخدم المسار الافتراضي فئة Handler الجديدة الخاصة بنا كمعالج المسار ، بدلاً من "HomePageHandler". للقيام بذلك ، استبدل تعريف المسار الافتراضي في "config / links.php" بالمثال التالي.
أرسل أول بريد إلكتروني
حان الوقت الآن لإرسال أول بريد إلكتروني. للقيام بذلك ، ابدأ أولاً بتشغيل التطبيق عن طريق تشغيل الأمر أدناه في المحطة.
بعد ذلك ، باستخدام cURL ، قم بتقديم طلب GET إلى " http: // localhost: 8080 " ، كما في المثال أدناه ، مع استبدال القيم الموجودة بين قوسين زاوية بالتفاصيل ذات الصلة ببريدك الإلكتروني.
يجب أن ترى إخراج "{" status ": 202،" message ":" "}" إلى المحطة ، ويجب أن تتلقى بريدًا إلكترونيًا يشبه الصورة أدناه.
ملاحظة: استخدم قوالب البريد الإلكتروني للمعاملات بدلاً من سلاسل النموذج
بينما تمكنا من إرسال بريد إلكتروني يحتوي على نص عادي وجسم HTML ، فإن الطريقة التي قمنا بها بذلك ، مع ذلك ، ليست مثالية. لكل بريد إلكتروني نرسله - وقد ينتهي تطبيقنا بإرسال عدد غير قليل - سنحتاج إلى إضافة نص عادي ونص HTML لهم.
لكن تخزين تعريفات نص البريد الإلكتروني في رمز يضع غالبية الجهد على فريق التطوير. ومع ذلك ، على الأقل من واقع خبرتي ، غالبًا ما تقوم الفرق الأخرى ، التي تقوم غالبًا بالتسويق ، بإنشاء قوالب البريد الإلكتروني وصيانتها.
لهذا السبب ، ولأنه سيسرع التطوير ومشاركة العبء عبر فرق متعددة ، سنقوم بإعادة تشكيل التطبيق لاستخدام قوالب البريد الإلكتروني للمعاملات . يمكنك إنشاء هذه العناصر وصيانتها من خلال Twilio SendGrid UI بواسطة أعضاء الفريق الذين قد يكون لديهم خبرة تقنية قليلة أو معدومة ، بدلاً من الكود.
إذا لم تكن قد سمعت بها ، فإن مسرد Twilio SendGrid يحددها على النحو التالي:
قوالب البريد الإلكتروني للمعاملات عبارة عن تخطيطات بريد إلكتروني مشفرة مسبقًا يمكن للمسوقين والمصممين والمطورين استخدامها لإنشاء حملات بريد إلكتروني للمعاملات بسرعة وسهولة. تسمح قوالب البريد الإلكتروني للمعاملات في Twilio SendGrid للأشخاص غير التقنيين والتقنيين على حد سواء بإجراء تغييرات في الوقت الفعلي على البريد الإلكتروني الذي يتلقاه المستلمون.
بالنسبة لهذه المقالة ، نحتاج فقط إلى مقال أساسي إلى حد ما. للقيام بذلك ، اتبع التفاصيل الموجودة في وثائق Twilio SendGrid وأنشئ محتوى يحتوي على محتواه فقط في وحدة نصية واحدة. ثم ، للنص الأساسي ، استخدم النص أدناه.
لاحظ أن هناك 6 استبدالات في البريد الإلكتروني:
- "first_name": الاسم الأول للعميل
- "Last_name": الاسم الأخير للعميل
- "sender_name": اسم متجر التجارة الإلكترونية (The Little PHP Shop)
- "sender_state": حالة متجر التجارة الإلكترونية
- "sender_country": بلد متجر التجارة الإلكترونية
- "support_email": البريد الإلكتروني للدعم الذي يمكن للعملاء استخدامه للحصول على دعم ما بعد البيع
بالنظر إلى ذلك ، نحتاج إلى إتاحة هذه المعلومات لتطبيقنا. الاسم الأول والأخير للعميل لدينا بالفعل. ستكون البدائل الأربعة المتبقية عامة ، لذا كما فعلنا سابقًا ، سنضيف التكوين أدناه إلى " config / autoload / mail.global.php " ، بعد عنصر "قوالب".
مع إنشاء ملف التكوين الجديد ، في طريقة "EmailSenderHandler" "handle" ، استبدل الاستدعائين بـ "$ this-> mail-> addContent () ،" بالشفرة التالية.
تضيف مكالمات الطريقة الثانية تفاصيل المرسل وتدعم عنوان البريد الإلكتروني كبدائل عالمية. تنطبق هذه الاستبدالات على نص البريد الإلكتروني قبل أي بدائل أخرى ولكن يتم تجاوزها إذا كانت هناك استبدالات بالمفتاح نفسه لمستلم البريد الإلكتروني.
بعد ذلك ، تحتاج إلى استرداد معرف قالب البريد الإلكتروني للمعاملات. يمكنك العثور عليه عن طريق النقر فوق اسم النموذج في قائمة القوالب ، كما ترى في لقطة الشاشة أدناه.
انسخه وخزنه في "config / autoload / mail.global.php" في عنصر جديد بالمفتاح "template_id" ثم أزل "عادي" و "HTML". عند الانتهاء ، سيبدو عنصر "البريد / القوالب" للمصفوفة التي تم إرجاعها مثل الكود أدناه ، حيث يحل "<معرف القالب>" محل معرف القالب الخاص بك.
مع تحديث التكوين ، نحتاج الآن إلى إضافة استدعاء إلى طريقة "Mail" "setTemplateId" في طريقة "التعامل" "EmailSenderHandler" ، لتمرير معرف النموذج الذي أضفناه للتو إلى "config / autoload / mail.global. بي أتش بي." يمكنك رؤية مثال في الكود أدناه.
دعونا نختبر التغييرات
كما كان من قبل ، باستخدام cURL ، قم بتقديم طلب GET إلى " http: // localhost: 8080 " لاختبار ما إذا كانت التغييرات تعمل كما هو متوقع. يجب أن ترى إخراج "{" status ": 202،" message ":" "}" إلى المحطة ، كما في المثال السابق. في صندوق البريد الإلكتروني الخاص بك ، يجب أن ترى رسالة بريد إلكتروني رائعة ، مع استبدال البدائل ، كما في لقطة الشاشة أدناه.
إرفاق فاتورة PDF
الآن بعد أن استخدمنا قوالب ديناميكية ، دعنا نرفق فاتورة PDF التي تحدثنا عنها في الجزء العلوي من المقالة. لتوفير الوقت والجهد في البحث عن أو إنشاء واحدة بنفسك ، قمت بإنشاء نموذج فاتورة PDF يمكنك استخدامها في هذه المقالة. احفظه في دليل " البيانات" للتطبيق .
ملاحظة: لإرفاق فاتورة ، نحتاج إلى استخدام طريقة "Mail" "addAttachment" ، والتي يمكنك رؤيتها في مثال الرمز التالي. تأخذ الطريقة 5 وسيطات ، لكننا نقدم فقط أول 4. وهذه هي:
- كائن " مرفق" أو سلسلة Base64 المشفرة . إذا لم تكن قيمة هذه المعلمة مشفرة base64 ، فإن الطريقة ستفعل ذلك لنا.
- نوع الملف المرفق (المعروف الآن باسم نوع الوسائط ).
- اسم ملف المرفق . هذا هو الاسم الذي سيحفظ الملف باسمه ، افتراضيًا ، ما لم يغيره المستخدم.
- التصرف في محتوى المرفق . إذا لم تكن معتادًا على التصرف في المحتوى ، فإن ترتيب المحتوى المضمن يعني أنه يجب عرض المرفق تلقائيًا عند عرض الرسالة ، ويعني التصرف في محتوى المرفق أن المرفق لا يتم عرضه تلقائيًا ويتطلب شكلاً من الإجراءات من المستخدم إلى افتحه.
في مثال الكود أدناه ، تقرأ طريقة file_get_contents في PHP محتويات الملف في متغير جديد باسم "الفاتورة $." بعد ذلك ، يتم إرفاق ملف PDF بالرسالة عن طريق استدعاء طريقة "addAttachment".
نحن هنا:
- قم بتمرير محتويات الفاتورة ، والتي ستكون بتشفير Base64
- اضبط نوع MIME على "application / pdf" لأننا نرفق ملف PDF
- عيّن اسم ملف الفاتورة على اسم وهمي قد يتوقعه العميل بشكل معقول
- اضبط ترتيب المحتوى على "مرفق"
الآن بعد أن انتهينا من هذه التغييرات ، دعنا نختبر أنها تعمل. قم بتشغيل نفس طلب cURL الذي قمنا بتشغيله في المرتين السابقتين. بعد ذلك ، في صندوق البريد الإلكتروني الخاص بك ، يجب أن ترى بريدًا إلكترونيًا رائعًا مع نموذج فاتورة PDF مرئيًا عند عرض البريد الإلكتروني.
هذه هي طريقة إرسال بريد إلكتروني باستخدام PHP باستخدام Twilio SendGrid و Mezzio
بينما قمنا فقط بخدش ما هو ممكن عند إرسال رسائل بريد إلكتروني باستخدام Twilio SendGrid و Mezzio ، يمكنك الآن إرسال بريد إلكتروني بنص عادي ونص HTML ، بالإضافة إلى مرفق. لقد تعلمت أيضًا كيفية استخدام قوالب المعاملات والبدائل التي يمكنك تعيينها عالميًا وعلى أساس كل مستلم.
أشجعك بشدة على إلقاء نظرة على وثائق مكتبة PHP لمعرفة ما هو متاح أيضًا ، مثل جدولة إرسال البريد الإلكتروني ، وإرفاق ملف من Amazon S3 ، وإضافة رؤوس ، وإضافة أقسام وفئات.
Matthew Setter هو محرر PHP في فريق Twilio Voices وهو مطور PHP بطبيعة الحال. وهو أيضًا مؤلف كتاب Mezzio Essentials . عندما لا يكتب كود PHP ، فإنه يعدل مقالات PHP الرائعة هنا في Twilio. يمكن الوصول إليه عبر:
- البريد الإلكتروني: [email protected]
- الويب: http://matthewsetter.com
- تويتر: settermjd
- جيثب: https://github.com/settermjd