قوالب البريد الإلكتروني المتقدمة
Bird
25/03/2016
البريد الإلكتروني
1 min read

النقاط الرئيسية
تدعم قوالب SparkPost تكوين البريد الإلكتروني البسيط والمتقدم، بما في ذلك HTML والنص والمنطق الشرطي والحلقات والبيانات الديناميكية لكل مستلم من خلال متغيرات الاستبدال.
يمكن تمرير المصفوفات إلى بيانات الاستبدال، مما يسمح لك بالتنقل عبر العناصر (على سبيل المثال، قوائم الملفات، النشاط الأخير، صفوف الجدول المخصص) لإنشاء أقسام مخصصة لكل مستلم.
تسمح الأقواس الثلاثية المجعدة
{{{ }}}بإدخال HTML الخام غير المفلت، وهو أمر ضروري عندما تحتوي بيانات الاستبدال بالفعل على علامات.يمكن إرسال المرفقات بسهولة عند استخدام نقطة نهاية النقل (
content.attachments)، والتي تقوم بتجريد حدود MIME والترميز من أجلك.تعمل الصور المضمنة بشكل مشابه للمرفقات ولكنها تعرض في الجسم باستخدام مراجع
cid:.لا تدعم القوالب المرفقات نادياً، لكنك يمكنك إدراجها عن طريق إنشاء بريد إلكتروني كامل RFC 5322 مع أجزاء MIME وتخزين ذلك كقالب
email_rfc822.عند بناء قوالب RFC 5322 الخام، لا تزال تبديلات الاستبدال تعمل — ولكن فقط في العناوين، وأول أجزاء MIME للنص وHTML.
يوفر استخدام عميل البريد في لغة البرمجة الخاصة بك (على سبيل المثال، JavaMail) مسارًا آخر: قم بإنشاء رسائل بريد إلكتروني كاملة MIME برمجياً وأرسلها عبر SparkPost transmissions API.
للحفاظ على الصيانة، قم بفصل العلامات والبيانات كلما أمكن — خاصة عند بناء القوالب التي تتضمن حلقات أو أقسام MIME متعددة.
تسمح ميزات القوالب المتقدمة (الشرطية، التعابير، تكرار المصفوفات) للمطورين ببناء رسائل بريد إلكتروني متطورة وشخصية دون إعادة كتابة القوالب بالكامل لكل حالة استخدام.
أبرز الأسئلة والأجوبة
هل يمكن لقوالب SparkPost التعامل مع الحلقات والمصفوفات؟
نعم. يمكن للنماذج أن تكرر عبر المصفوفات باستخدام تراكيب
for each. يتيح ذلك إنشاء جداول ديناميكية أو قوائم أو كتل HTML مكررة لكل مستلم.لما تستخدم الأقواس الثلاثية المتعرجة؟
{{{ variable }}}يقوم بإدراج HTML الخام دون الهروب. إنه مطلوب عندما تتضمن بيانات الاستبدال الخاصة بك بالفعل ترميز HTML.هل يمكنني إرسال مرفقات مع القوالب؟
ليس مباشرة من خلال حقول القوالب — ولكن يمكنك عن طريق تخزين قالب
email_rfc822الذي يتضمن أجزاء مرفقات MIME.هل لا يزال الاستبدال يعمل في قوالب RFC 5322؟
نعم، ولكن فقط ضمن الرؤوس وأجزاء MIME النصية + HTML الأولى.
متى يجب أن أستخدم نقطة النهاية لنقل البيانات بدلاً من القوالب؟
عند إرسال المرفقات الديناميكية، أو الصور الداخلية، أو عندما تحتاج إلى SparkPost للتعامل تلقائيًا مع MIME.
هل من الأفضل دمج منطق العرض أو إبقائه منفصلًا؟
أفضل الممارسات هي الحفاظ على تمييز العرض والبيانات الخاص بك منفصلين. استخدم القوالب للتقديم وتمرير بيانات الاستبدال النظيفة والمهيكلة.
هل يمكنني إنشاء بريد إلكتروني كامل بطريقة MIME باستخدام مكتبة برمجية؟
نعم. تتيح لك المكتبات مثل JavaMail إنشاء رسائل RFC 5322 برمجيًا وإرسالها من خلال واجهة برمجة تطبيقات الإرسال لـ SparkPost.
هل تُستخدم ميزات القوالب المتقدمة على نطاق واسع؟
من المدهش أن عددًا قليلاً من المطورين يستخدمونها، لكنها تفتح إمكانيات تخصيص قوية: الحلقات، الشروط، المنطق المضمن، وهياكل MIME المخصصة.
لماذا سأحتاج إلى قوالب RFC 5322 في أي وقتٍ؟
فقط عند إرسال رسائل بريد إلكتروني معقدة متعددة الأجزاء (مرفقات، أنواع MIME مخصصة) والتي لا يدعمها تجريد القوالب القياسي لـ SparkPost.
هذا المقال موجه للمطور الذي يريد الاستفادة القصوى من القدرات المسوداة لقوالب البريد الإلكتروني في SparkPost. يُفترض أنك مرتاح لقراءة محتوى JSON واتباع تدفق البرمجة الأساسي. حيث يتم إدخال مصطلحات جديدة لك مثل RFC 5322, النص مرتبط بمصدره المرجعي.
مع وجود ذلك بعيداً عن الطريق، دعونا نبدأ مباشرة.
قدرات SparkPost لقوالب وإرسال البريد الإلكتروني تجعل إرسال الرسائل الإلكترونية عملية سهلة. هذه القدرات توفر تجريدًا لمحتوى النص وHTML مما يعني أنه في معظم الأوقات لا توجد حاجة لترميز صيغة البريد الإلكتروني الخام مباشرة المعرّفة في RFC 5322 المعروفة سابقًا باسم (RFC 822). ولكن في بعض الأحيان قد ترغب في إنشاء رسائل أكثر تعقيدًا تحتوي على أجزاء أخرى من ملحقات البريد عبر الإنترنت متعددة الأغراض (MIME) التي لا يتم الكشف عنها مباشرة عبر واجهة RESTful الخاصة بـ SparkPost.
هذا المقال موجه للمطور الذي يريد الاستفادة القصوى من القدرات المسوداة لقوالب البريد الإلكتروني في SparkPost. يُفترض أنك مرتاح لقراءة محتوى JSON واتباع تدفق البرمجة الأساسي. حيث يتم إدخال مصطلحات جديدة لك مثل RFC 5322, النص مرتبط بمصدره المرجعي.
مع وجود ذلك بعيداً عن الطريق، دعونا نبدأ مباشرة.
قدرات SparkPost لقوالب وإرسال البريد الإلكتروني تجعل إرسال الرسائل الإلكترونية عملية سهلة. هذه القدرات توفر تجريدًا لمحتوى النص وHTML مما يعني أنه في معظم الأوقات لا توجد حاجة لترميز صيغة البريد الإلكتروني الخام مباشرة المعرّفة في RFC 5322 المعروفة سابقًا باسم (RFC 822). ولكن في بعض الأحيان قد ترغب في إنشاء رسائل أكثر تعقيدًا تحتوي على أجزاء أخرى من ملحقات البريد عبر الإنترنت متعددة الأغراض (MIME) التي لا يتم الكشف عنها مباشرة عبر واجهة RESTful الخاصة بـ SparkPost.
هذا المقال موجه للمطور الذي يريد الاستفادة القصوى من القدرات المسوداة لقوالب البريد الإلكتروني في SparkPost. يُفترض أنك مرتاح لقراءة محتوى JSON واتباع تدفق البرمجة الأساسي. حيث يتم إدخال مصطلحات جديدة لك مثل RFC 5322, النص مرتبط بمصدره المرجعي.
مع وجود ذلك بعيداً عن الطريق، دعونا نبدأ مباشرة.
قدرات SparkPost لقوالب وإرسال البريد الإلكتروني تجعل إرسال الرسائل الإلكترونية عملية سهلة. هذه القدرات توفر تجريدًا لمحتوى النص وHTML مما يعني أنه في معظم الأوقات لا توجد حاجة لترميز صيغة البريد الإلكتروني الخام مباشرة المعرّفة في RFC 5322 المعروفة سابقًا باسم (RFC 822). ولكن في بعض الأحيان قد ترغب في إنشاء رسائل أكثر تعقيدًا تحتوي على أجزاء أخرى من ملحقات البريد عبر الإنترنت متعددة الأغراض (MIME) التي لا يتم الكشف عنها مباشرة عبر واجهة RESTful الخاصة بـ SparkPost.
تأليف البريد الإلكتروني المبسط
أولاً، دعنا نراجع سيناريو يوم مشمس لإرسال البريد الإلكتروني. استخدم نقطة النهاية transmission لتوفير text و HTML المحتوى. خلف الكواليس، يهتم SparkPost بتكوين بريد إلكتروني صالح وفقًا لـ RFC 5322. يقوم SparkPost بإدراج متغيرات الاستبدال من substitution_data في النص ومحتوى HTML. هذه طريقة قوية لتوليد محتوى مخصص لكل مستلم في قالب مشترك.
هنا مثال transmission مع محتوى HTML ونص مع substitution_data.
{ "options": { "open_tracking": true, "click_tracking": true }, "campaign_id": "christmas_campaign", "return_path": "bounces-christmas-campaign@domain.com", "metadata": { "user_type": "students" }, "substitution_data": { "sender": "Big Store Team" }, "recipients": [ { "return_path": "123@bounces.domain.com", "address": { "email": "wilma@domain.com", "name": "Wilma Flintstone" }, "tags": [ "greeting", "prehistoric", "fred", "flintstone" ], "metadata": { "place": "Bedrock" }, "substitution_data": { "customer_type": "Platinum" } } ], "content": { "from": { "name": "Fred Flintstone", "email": "fred@domain.com" }, "subject": "Big Christmas savings!", "reply_to": "Christmas Sales <sales@domain.com>", "headers": { "X-Customer-Campaign-ID": "christmas_campaign" }, "text": "Hi {{address.name}} \nSave big this Christmas in your area {{place}}! \nClick http://www.mysite.com and get huge discount\n Hurry, this offer is only to {{user_type}}\n {{sender}}", "html": "<p>Hi {{address.name}} <br>Save big this Christmas in your area {{place}}! <br>Click <a href=\"http://www.mysite.com\">here</a> and get huge discount</p><p>Hurry, this offer is only to {{user_type}}</p><p>{{sender}}</p>" } }
أولاً، دعنا نراجع سيناريو يوم مشمس لإرسال البريد الإلكتروني. استخدم نقطة النهاية transmission لتوفير text و HTML المحتوى. خلف الكواليس، يهتم SparkPost بتكوين بريد إلكتروني صالح وفقًا لـ RFC 5322. يقوم SparkPost بإدراج متغيرات الاستبدال من substitution_data في النص ومحتوى HTML. هذه طريقة قوية لتوليد محتوى مخصص لكل مستلم في قالب مشترك.
هنا مثال transmission مع محتوى HTML ونص مع substitution_data.
{ "options": { "open_tracking": true, "click_tracking": true }, "campaign_id": "christmas_campaign", "return_path": "bounces-christmas-campaign@domain.com", "metadata": { "user_type": "students" }, "substitution_data": { "sender": "Big Store Team" }, "recipients": [ { "return_path": "123@bounces.domain.com", "address": { "email": "wilma@domain.com", "name": "Wilma Flintstone" }, "tags": [ "greeting", "prehistoric", "fred", "flintstone" ], "metadata": { "place": "Bedrock" }, "substitution_data": { "customer_type": "Platinum" } } ], "content": { "from": { "name": "Fred Flintstone", "email": "fred@domain.com" }, "subject": "Big Christmas savings!", "reply_to": "Christmas Sales <sales@domain.com>", "headers": { "X-Customer-Campaign-ID": "christmas_campaign" }, "text": "Hi {{address.name}} \nSave big this Christmas in your area {{place}}! \nClick http://www.mysite.com and get huge discount\n Hurry, this offer is only to {{user_type}}\n {{sender}}", "html": "<p>Hi {{address.name}} <br>Save big this Christmas in your area {{place}}! <br>Click <a href=\"http://www.mysite.com\">here</a> and get huge discount</p><p>Hurry, this offer is only to {{user_type}}</p><p>{{sender}}</p>" } }
أولاً، دعنا نراجع سيناريو يوم مشمس لإرسال البريد الإلكتروني. استخدم نقطة النهاية transmission لتوفير text و HTML المحتوى. خلف الكواليس، يهتم SparkPost بتكوين بريد إلكتروني صالح وفقًا لـ RFC 5322. يقوم SparkPost بإدراج متغيرات الاستبدال من substitution_data في النص ومحتوى HTML. هذه طريقة قوية لتوليد محتوى مخصص لكل مستلم في قالب مشترك.
هنا مثال transmission مع محتوى HTML ونص مع substitution_data.
{ "options": { "open_tracking": true, "click_tracking": true }, "campaign_id": "christmas_campaign", "return_path": "bounces-christmas-campaign@domain.com", "metadata": { "user_type": "students" }, "substitution_data": { "sender": "Big Store Team" }, "recipients": [ { "return_path": "123@bounces.domain.com", "address": { "email": "wilma@domain.com", "name": "Wilma Flintstone" }, "tags": [ "greeting", "prehistoric", "fred", "flintstone" ], "metadata": { "place": "Bedrock" }, "substitution_data": { "customer_type": "Platinum" } } ], "content": { "from": { "name": "Fred Flintstone", "email": "fred@domain.com" }, "subject": "Big Christmas savings!", "reply_to": "Christmas Sales <sales@domain.com>", "headers": { "X-Customer-Campaign-ID": "christmas_campaign" }, "text": "Hi {{address.name}} \nSave big this Christmas in your area {{place}}! \nClick http://www.mysite.com and get huge discount\n Hurry, this offer is only to {{user_type}}\n {{sender}}", "html": "<p>Hi {{address.name}} <br>Save big this Christmas in your area {{place}}! <br>Click <a href=\"http://www.mysite.com\">here</a> and get huge discount</p><p>Hurry, this offer is only to {{user_type}}</p><p>{{sender}}</p>" } }
استبدال مجموعات البيانات
يدرك الكثير من الناس أن نقاط النهاية لنقل وقوالب SparkPost يمكن أن تقوم بإجراء استبدال بسيط للمحتوى في رؤوس البريد الإلكتروني وأجسام رسائل البريد الإلكتروني. لكن الكثيرين يتجاهلون القدرة على توفير محتوى شرطي أو مصفوفات من البيانات التي يمكن استبدالها أيضًا. يمكنك أيضًا توفير محتوى فريد لكل مستلم. في هذا المثال، نقوم بإرسال مجموعة من الروابط الفريدة لكل مستلم.
يتم تحقيق ذلك من خلال توفير مصفوفة JSON من البيانات التي سيتم تعبئتها في جسم البريد الإلكتروني. بمجرد تقديم البيانات، سوف تستخدم SparkPost المنطق في القالب لملء البيانات.
في هذا المثال، ستبحث SparkPost عن بيانات استبدال تسمى "files_html" وتقوم بالإجراء "for each" على كل عنصر في المصفوفة. سوف تنشئ صفًا بقيمة "file" في عنصر "files_html". لاحظ الثلاثة أقواس المعقوفة حول "loop_var.file". ذلك لأن كل عنصر في المصفوفة يحتوي على HTML ونحتاج إلى إخبار الخادم باستخدامه كما هو وعدم التهرب منه. سيكون الجزء النصي عبارة عن تسمية نصية بسيطة ورابط URL للملف.
<table> {{each files_html}} <tr> <td>{{{loop_var.file}}}</td> </tr> {{ end }} </table>
إليك المثال المكتمل العامل:
{ "recipients": [ { "address": { "email": "recipient1@domain.com" }, "substitution_data": { "files_html": [ { "file": "<a href=\"http://domain.com/file1a.txt\">File 1a Description</a>" }, { "file": "<a href=\"http://domain.com/file2a.txt\">File 2a Description</a>" } ], "files_plain": [ { "file": "File 1a -- http://domain.com/file1a.txt" }, { "file": "File 2a -- http://domain.com/file2a.txt" } ] } }, { "address": { "email": "recipient2@domain.com" }, "substitution_data": { "files_html": [ { "file": "<a href=\"http://domain.com/file1b.txt\">File 1b Description</a>" }, { "file": "<a href=\"http://domain.com/file2b.txt\">File 2b Description</a>" } ], "files_plain": [ { "file": "File 1b -- http://domain.com/file1b.txt" }, { "file": "File 2b -- http://domain.com/file2b.txt" } ] } } ], "return_path": "chris@test.domain.com", "content": { "from": { "name": "chris@test.domain.com", "email": "chris@test.domain.com" }, "subject": "Sending with SparkPost is Fun", "html": "<b>Your Files:</b><br>\n<table>\n {{each files_html}}\n <tr><td>{{{loop_var.file}}}</td></tr>\n {{ end }}\n</table>\n", "text": "Your Files:\n{{each files_plain}} {{loop_var.file}}\n{{ end }}\n" } }
نصيحة احترافية: من المستحسن في الكود الخاص بك إبقاء ترميز العرض منفصلًا عن البيانات ولكن الهدف هنا هو إبقاء المثال بسيطًا وسهل الفهم قدر الإمكان لذلك قمنا بإنشاء مصفوفتين. واحدة للجزء الذي يحتوي على HTML وأخرى للجزء النصي. في الاستخدام الفعلي، من الشائع أن يكون هناك مجموعة بيانات واحدة وكتابة المنطق في كود القالب.
يدرك الكثير من الناس أن نقاط النهاية لنقل وقوالب SparkPost يمكن أن تقوم بإجراء استبدال بسيط للمحتوى في رؤوس البريد الإلكتروني وأجسام رسائل البريد الإلكتروني. لكن الكثيرين يتجاهلون القدرة على توفير محتوى شرطي أو مصفوفات من البيانات التي يمكن استبدالها أيضًا. يمكنك أيضًا توفير محتوى فريد لكل مستلم. في هذا المثال، نقوم بإرسال مجموعة من الروابط الفريدة لكل مستلم.
يتم تحقيق ذلك من خلال توفير مصفوفة JSON من البيانات التي سيتم تعبئتها في جسم البريد الإلكتروني. بمجرد تقديم البيانات، سوف تستخدم SparkPost المنطق في القالب لملء البيانات.
في هذا المثال، ستبحث SparkPost عن بيانات استبدال تسمى "files_html" وتقوم بالإجراء "for each" على كل عنصر في المصفوفة. سوف تنشئ صفًا بقيمة "file" في عنصر "files_html". لاحظ الثلاثة أقواس المعقوفة حول "loop_var.file". ذلك لأن كل عنصر في المصفوفة يحتوي على HTML ونحتاج إلى إخبار الخادم باستخدامه كما هو وعدم التهرب منه. سيكون الجزء النصي عبارة عن تسمية نصية بسيطة ورابط URL للملف.
<table> {{each files_html}} <tr> <td>{{{loop_var.file}}}</td> </tr> {{ end }} </table>
إليك المثال المكتمل العامل:
{ "recipients": [ { "address": { "email": "recipient1@domain.com" }, "substitution_data": { "files_html": [ { "file": "<a href=\"http://domain.com/file1a.txt\">File 1a Description</a>" }, { "file": "<a href=\"http://domain.com/file2a.txt\">File 2a Description</a>" } ], "files_plain": [ { "file": "File 1a -- http://domain.com/file1a.txt" }, { "file": "File 2a -- http://domain.com/file2a.txt" } ] } }, { "address": { "email": "recipient2@domain.com" }, "substitution_data": { "files_html": [ { "file": "<a href=\"http://domain.com/file1b.txt\">File 1b Description</a>" }, { "file": "<a href=\"http://domain.com/file2b.txt\">File 2b Description</a>" } ], "files_plain": [ { "file": "File 1b -- http://domain.com/file1b.txt" }, { "file": "File 2b -- http://domain.com/file2b.txt" } ] } } ], "return_path": "chris@test.domain.com", "content": { "from": { "name": "chris@test.domain.com", "email": "chris@test.domain.com" }, "subject": "Sending with SparkPost is Fun", "html": "<b>Your Files:</b><br>\n<table>\n {{each files_html}}\n <tr><td>{{{loop_var.file}}}</td></tr>\n {{ end }}\n</table>\n", "text": "Your Files:\n{{each files_plain}} {{loop_var.file}}\n{{ end }}\n" } }
نصيحة احترافية: من المستحسن في الكود الخاص بك إبقاء ترميز العرض منفصلًا عن البيانات ولكن الهدف هنا هو إبقاء المثال بسيطًا وسهل الفهم قدر الإمكان لذلك قمنا بإنشاء مصفوفتين. واحدة للجزء الذي يحتوي على HTML وأخرى للجزء النصي. في الاستخدام الفعلي، من الشائع أن يكون هناك مجموعة بيانات واحدة وكتابة المنطق في كود القالب.
يدرك الكثير من الناس أن نقاط النهاية لنقل وقوالب SparkPost يمكن أن تقوم بإجراء استبدال بسيط للمحتوى في رؤوس البريد الإلكتروني وأجسام رسائل البريد الإلكتروني. لكن الكثيرين يتجاهلون القدرة على توفير محتوى شرطي أو مصفوفات من البيانات التي يمكن استبدالها أيضًا. يمكنك أيضًا توفير محتوى فريد لكل مستلم. في هذا المثال، نقوم بإرسال مجموعة من الروابط الفريدة لكل مستلم.
يتم تحقيق ذلك من خلال توفير مصفوفة JSON من البيانات التي سيتم تعبئتها في جسم البريد الإلكتروني. بمجرد تقديم البيانات، سوف تستخدم SparkPost المنطق في القالب لملء البيانات.
في هذا المثال، ستبحث SparkPost عن بيانات استبدال تسمى "files_html" وتقوم بالإجراء "for each" على كل عنصر في المصفوفة. سوف تنشئ صفًا بقيمة "file" في عنصر "files_html". لاحظ الثلاثة أقواس المعقوفة حول "loop_var.file". ذلك لأن كل عنصر في المصفوفة يحتوي على HTML ونحتاج إلى إخبار الخادم باستخدامه كما هو وعدم التهرب منه. سيكون الجزء النصي عبارة عن تسمية نصية بسيطة ورابط URL للملف.
<table> {{each files_html}} <tr> <td>{{{loop_var.file}}}</td> </tr> {{ end }} </table>
إليك المثال المكتمل العامل:
{ "recipients": [ { "address": { "email": "recipient1@domain.com" }, "substitution_data": { "files_html": [ { "file": "<a href=\"http://domain.com/file1a.txt\">File 1a Description</a>" }, { "file": "<a href=\"http://domain.com/file2a.txt\">File 2a Description</a>" } ], "files_plain": [ { "file": "File 1a -- http://domain.com/file1a.txt" }, { "file": "File 2a -- http://domain.com/file2a.txt" } ] } }, { "address": { "email": "recipient2@domain.com" }, "substitution_data": { "files_html": [ { "file": "<a href=\"http://domain.com/file1b.txt\">File 1b Description</a>" }, { "file": "<a href=\"http://domain.com/file2b.txt\">File 2b Description</a>" } ], "files_plain": [ { "file": "File 1b -- http://domain.com/file1b.txt" }, { "file": "File 2b -- http://domain.com/file2b.txt" } ] } } ], "return_path": "chris@test.domain.com", "content": { "from": { "name": "chris@test.domain.com", "email": "chris@test.domain.com" }, "subject": "Sending with SparkPost is Fun", "html": "<b>Your Files:</b><br>\n<table>\n {{each files_html}}\n <tr><td>{{{loop_var.file}}}</td></tr>\n {{ end }}\n</table>\n", "text": "Your Files:\n{{each files_plain}} {{loop_var.file}}\n{{ end }}\n" } }
نصيحة احترافية: من المستحسن في الكود الخاص بك إبقاء ترميز العرض منفصلًا عن البيانات ولكن الهدف هنا هو إبقاء المثال بسيطًا وسهل الفهم قدر الإمكان لذلك قمنا بإنشاء مصفوفتين. واحدة للجزء الذي يحتوي على HTML وأخرى للجزء النصي. في الاستخدام الفعلي، من الشائع أن يكون هناك مجموعة بيانات واحدة وكتابة المنطق في كود القالب.
المرفقات في قدرات النقل
يوفر نقطة النهاية للإرسال أيضًا تجريدًا لإرسال المرفقات. أدناه سترى المرفقات محددة في content.attachments array حيث يصف كل كائن داخل المصفوفة عنصر مرفق فردي. كما كان من قبل، سوف تتولى SparkPost تشفير النص , HTML , الاستبدالات وتكرار المصفوفة المرفقة لتشفير رسالة البريد الإلكتروني بشكل صحيح.
تملي الممارسات الجيدة أن يتم تجنب إرسال المرفقات إلا إذا كانت مطلوبة بشكل صريح كجزء من خدمتك.
فيما يلي الحقول المطلوبة للملحق:
النوع: نوع MIME للمرفق
الاسم: اسم الملف للمرفق
بيانات: بيانات الملف المشفرة بـBase64
هذا هو مظهر المرفق داخل وصف محتوى الإرسال:
"content": { "attachments": [ { "type": "audio/mp3", "name": "voicemail.mp3", "data": "TVAzIERhdGEK" } ] }
يمكنك أيضًا إرسال "صور مضمنة" في الإرسال. هذه الصور مشابهة جدًا للمرفقات ويتم تحديدها في content.inline_images array حيث أن كل كائنات inline_image تشبه كائن المرفق الموضح أعلاه.
يوفر نقطة النهاية للإرسال أيضًا تجريدًا لإرسال المرفقات. أدناه سترى المرفقات محددة في content.attachments array حيث يصف كل كائن داخل المصفوفة عنصر مرفق فردي. كما كان من قبل، سوف تتولى SparkPost تشفير النص , HTML , الاستبدالات وتكرار المصفوفة المرفقة لتشفير رسالة البريد الإلكتروني بشكل صحيح.
تملي الممارسات الجيدة أن يتم تجنب إرسال المرفقات إلا إذا كانت مطلوبة بشكل صريح كجزء من خدمتك.
فيما يلي الحقول المطلوبة للملحق:
النوع: نوع MIME للمرفق
الاسم: اسم الملف للمرفق
بيانات: بيانات الملف المشفرة بـBase64
هذا هو مظهر المرفق داخل وصف محتوى الإرسال:
"content": { "attachments": [ { "type": "audio/mp3", "name": "voicemail.mp3", "data": "TVAzIERhdGEK" } ] }
يمكنك أيضًا إرسال "صور مضمنة" في الإرسال. هذه الصور مشابهة جدًا للمرفقات ويتم تحديدها في content.inline_images array حيث أن كل كائنات inline_image تشبه كائن المرفق الموضح أعلاه.
يوفر نقطة النهاية للإرسال أيضًا تجريدًا لإرسال المرفقات. أدناه سترى المرفقات محددة في content.attachments array حيث يصف كل كائن داخل المصفوفة عنصر مرفق فردي. كما كان من قبل، سوف تتولى SparkPost تشفير النص , HTML , الاستبدالات وتكرار المصفوفة المرفقة لتشفير رسالة البريد الإلكتروني بشكل صحيح.
تملي الممارسات الجيدة أن يتم تجنب إرسال المرفقات إلا إذا كانت مطلوبة بشكل صريح كجزء من خدمتك.
فيما يلي الحقول المطلوبة للملحق:
النوع: نوع MIME للمرفق
الاسم: اسم الملف للمرفق
بيانات: بيانات الملف المشفرة بـBase64
هذا هو مظهر المرفق داخل وصف محتوى الإرسال:
"content": { "attachments": [ { "type": "audio/mp3", "name": "voicemail.mp3", "data": "TVAzIERhdGEK" } ] }
يمكنك أيضًا إرسال "صور مضمنة" في الإرسال. هذه الصور مشابهة جدًا للمرفقات ويتم تحديدها في content.inline_images array حيث أن كل كائنات inline_image تشبه كائن المرفق الموضح أعلاه.
المرفقات في القوالب
الآن بعد أن أصبح لدينا الخلفية المناسبة لإرسال المرفقات مع نقطة نهاية الإرسال، دعونا نلقي نظرة على كيفية القيام بذلك باستخدام القوالب. في وقت كتابة هذه المقالة، لا يوجد تجريد للمرفقات كما تجده بالنسبة للإرسال الداخلي. قد يستنتج أحدهم أن القوالب لا يمكن إنشاؤها مع المرفقات. ستكون على صواب جزئيًا ولكن هناك حلاً بديلاً، رغم أنك لن تكون معزولًا عن تنسيق RFC 5322.
يمكنك تحقيق المرفقات في القوالب عن طريق ترميز محتوى RFC 5322 بنفسك والذي يتضمن المرفقات. الأخبار الجيدة أنه لن تفقد القدرة على استخدام بيانات الاستبدال في رؤوس البريد الإلكتروني، وأجزاء HTML والنص. كن على علم بأن هذا النوع من القوالب يحد من الاستبدالات إلى الرؤوس وأول جزء HTML وأول جزء نص.
إليك مثال حول كيفية القيام بذلك.
الآن بعد أن أصبح لدينا الخلفية المناسبة لإرسال المرفقات مع نقطة نهاية الإرسال، دعونا نلقي نظرة على كيفية القيام بذلك باستخدام القوالب. في وقت كتابة هذه المقالة، لا يوجد تجريد للمرفقات كما تجده بالنسبة للإرسال الداخلي. قد يستنتج أحدهم أن القوالب لا يمكن إنشاؤها مع المرفقات. ستكون على صواب جزئيًا ولكن هناك حلاً بديلاً، رغم أنك لن تكون معزولًا عن تنسيق RFC 5322.
يمكنك تحقيق المرفقات في القوالب عن طريق ترميز محتوى RFC 5322 بنفسك والذي يتضمن المرفقات. الأخبار الجيدة أنه لن تفقد القدرة على استخدام بيانات الاستبدال في رؤوس البريد الإلكتروني، وأجزاء HTML والنص. كن على علم بأن هذا النوع من القوالب يحد من الاستبدالات إلى الرؤوس وأول جزء HTML وأول جزء نص.
إليك مثال حول كيفية القيام بذلك.
الآن بعد أن أصبح لدينا الخلفية المناسبة لإرسال المرفقات مع نقطة نهاية الإرسال، دعونا نلقي نظرة على كيفية القيام بذلك باستخدام القوالب. في وقت كتابة هذه المقالة، لا يوجد تجريد للمرفقات كما تجده بالنسبة للإرسال الداخلي. قد يستنتج أحدهم أن القوالب لا يمكن إنشاؤها مع المرفقات. ستكون على صواب جزئيًا ولكن هناك حلاً بديلاً، رغم أنك لن تكون معزولًا عن تنسيق RFC 5322.
يمكنك تحقيق المرفقات في القوالب عن طريق ترميز محتوى RFC 5322 بنفسك والذي يتضمن المرفقات. الأخبار الجيدة أنه لن تفقد القدرة على استخدام بيانات الاستبدال في رؤوس البريد الإلكتروني، وأجزاء HTML والنص. كن على علم بأن هذا النوع من القوالب يحد من الاستبدالات إلى الرؤوس وأول جزء HTML وأول جزء نص.
إليك مثال حول كيفية القيام بذلك.
بريد الإلكترونيات RFC822
قم بإنشاء بريدك الإلكتروني RFC 5322 مع بيانات الاستبدال التي تريدها. لقد أنشأت هذا في عميل البريد الإلكتروني الخاص بي وأرسلته إلى نفسي. بمجرد استلامه قمت بنسخ المصدر واستبدال الحقول التي أريد استبدالها ديناميكيًا.
MIME-Version: 1.0 Reply-To: {{replyto}} Subject: {{subject}} From: {{from}} To: {{address.email}} Content-Type: multipart/mixed; boundary="001a113c48b0b89d92052d3051da" --001a113c48b0b89d92052d3051da Content-Type: multipart/alternative; boundary="001a113c48b0b89d89052d3051d8" --001a113c48b0b89d89052d3051d8 Content-Type: text/plain; charset=UTF-8 Email with a *text attachment*. {{body2}} --001a113c48b0b89d89052d3051d8 Content-Type: text/html; charset=UTF-8 <div dir="ltr"> <div>Email with a <i>text attachment</i>.</div> {{body1}} <
الجزء الأخير من MIME في هذه الرسالة ستشاهد Content-Disposition: attachment; filename=myfile.txt”. هذا هو المكان الذي يتم فيه تحديد اسم الملف. من المؤكد أن محتوى المرفق الخاص بك سيكون أكثر تعقيدًا بكثير لكن هذا المثال يحاول أن يبقيه بسيطًا.
قم بإنشاء بريدك الإلكتروني RFC 5322 مع بيانات الاستبدال التي تريدها. لقد أنشأت هذا في عميل البريد الإلكتروني الخاص بي وأرسلته إلى نفسي. بمجرد استلامه قمت بنسخ المصدر واستبدال الحقول التي أريد استبدالها ديناميكيًا.
MIME-Version: 1.0 Reply-To: {{replyto}} Subject: {{subject}} From: {{from}} To: {{address.email}} Content-Type: multipart/mixed; boundary="001a113c48b0b89d92052d3051da" --001a113c48b0b89d92052d3051da Content-Type: multipart/alternative; boundary="001a113c48b0b89d89052d3051d8" --001a113c48b0b89d89052d3051d8 Content-Type: text/plain; charset=UTF-8 Email with a *text attachment*. {{body2}} --001a113c48b0b89d89052d3051d8 Content-Type: text/html; charset=UTF-8 <div dir="ltr"> <div>Email with a <i>text attachment</i>.</div> {{body1}} <
الجزء الأخير من MIME في هذه الرسالة ستشاهد Content-Disposition: attachment; filename=myfile.txt”. هذا هو المكان الذي يتم فيه تحديد اسم الملف. من المؤكد أن محتوى المرفق الخاص بك سيكون أكثر تعقيدًا بكثير لكن هذا المثال يحاول أن يبقيه بسيطًا.
قم بإنشاء بريدك الإلكتروني RFC 5322 مع بيانات الاستبدال التي تريدها. لقد أنشأت هذا في عميل البريد الإلكتروني الخاص بي وأرسلته إلى نفسي. بمجرد استلامه قمت بنسخ المصدر واستبدال الحقول التي أريد استبدالها ديناميكيًا.
MIME-Version: 1.0 Reply-To: {{replyto}} Subject: {{subject}} From: {{from}} To: {{address.email}} Content-Type: multipart/mixed; boundary="001a113c48b0b89d92052d3051da" --001a113c48b0b89d92052d3051da Content-Type: multipart/alternative; boundary="001a113c48b0b89d89052d3051d8" --001a113c48b0b89d89052d3051d8 Content-Type: text/plain; charset=UTF-8 Email with a *text attachment*. {{body2}} --001a113c48b0b89d89052d3051d8 Content-Type: text/html; charset=UTF-8 <div dir="ltr"> <div>Email with a <i>text attachment</i>.</div> {{body1}} <
الجزء الأخير من MIME في هذه الرسالة ستشاهد Content-Disposition: attachment; filename=myfile.txt”. هذا هو المكان الذي يتم فيه تحديد اسم الملف. من المؤكد أن محتوى المرفق الخاص بك سيكون أكثر تعقيدًا بكثير لكن هذا المثال يحاول أن يبقيه بسيطًا.
القالب المخزن
بمجرد أن يكون لديك بريد إلكتروني صالح وفقًا لـ RFC 5322، قم بتخزينه باستخدام صيغة email_rfc822 لنقطة نهاية القالب بدلاً من استخدام حقول text وHTML. إليك مثال لما يبدو عليه المحتوى لتلك الرسالة:
{ "content": { "email_rfc822": "MIME-Version: 1.0\nReply-To: {{replyto}}\nSubject: {{subject}}\nFrom: {{from}}\nTo: {{address.email}}\nContent-Type: multipart/mixed; boundary=001a113c48b0b89d92052d3051da\n\n--001a113c48b0b89d92052d3051da\nContent-Type: multipart/alternative; boundary=001a113c48b0b89d89052d3051d8\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/plain; charset=UTF-8\n\nEmail with a *text attachment*.\n\n{{body2}}\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/html; charset=UTF-8\n\n<div dir=\"ltr\"><div>Email with a <i>text attachment</i>.</div>\n\n{{body1}}\n</div>\n\n--001a113c48b0b89d89052d3051d8--\n--001a113c48b0b89d92052d3051da\nContent-Type: text/plain; charset=US-ASCII; name=\"myfile.txt\"\nContent-Disposition: attachment; filename=\"myfile.txt\"\nContent-Transfer-Encoding: base64\nX-Attachment-Id: f_ild455ce0\n\nVGhpcyBpcyBteSBzaW1wbGUgdGV4dCBmaWxlLgo=\n--001a113c48b0b89d92052d3051da--" }, "name": "_TMP_TEMPLATE_TEST" }
عند اكتمال الطلب، ستستجيب SparkPost بمعرف فريد للقالب الجديد الخاص بك. على سبيل المثال xxxxxxx.
بمجرد أن يكون لديك بريد إلكتروني صالح وفقًا لـ RFC 5322، قم بتخزينه باستخدام صيغة email_rfc822 لنقطة نهاية القالب بدلاً من استخدام حقول text وHTML. إليك مثال لما يبدو عليه المحتوى لتلك الرسالة:
{ "content": { "email_rfc822": "MIME-Version: 1.0\nReply-To: {{replyto}}\nSubject: {{subject}}\nFrom: {{from}}\nTo: {{address.email}}\nContent-Type: multipart/mixed; boundary=001a113c48b0b89d92052d3051da\n\n--001a113c48b0b89d92052d3051da\nContent-Type: multipart/alternative; boundary=001a113c48b0b89d89052d3051d8\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/plain; charset=UTF-8\n\nEmail with a *text attachment*.\n\n{{body2}}\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/html; charset=UTF-8\n\n<div dir=\"ltr\"><div>Email with a <i>text attachment</i>.</div>\n\n{{body1}}\n</div>\n\n--001a113c48b0b89d89052d3051d8--\n--001a113c48b0b89d92052d3051da\nContent-Type: text/plain; charset=US-ASCII; name=\"myfile.txt\"\nContent-Disposition: attachment; filename=\"myfile.txt\"\nContent-Transfer-Encoding: base64\nX-Attachment-Id: f_ild455ce0\n\nVGhpcyBpcyBteSBzaW1wbGUgdGV4dCBmaWxlLgo=\n--001a113c48b0b89d92052d3051da--" }, "name": "_TMP_TEMPLATE_TEST" }
عند اكتمال الطلب، ستستجيب SparkPost بمعرف فريد للقالب الجديد الخاص بك. على سبيل المثال xxxxxxx.
بمجرد أن يكون لديك بريد إلكتروني صالح وفقًا لـ RFC 5322، قم بتخزينه باستخدام صيغة email_rfc822 لنقطة نهاية القالب بدلاً من استخدام حقول text وHTML. إليك مثال لما يبدو عليه المحتوى لتلك الرسالة:
{ "content": { "email_rfc822": "MIME-Version: 1.0\nReply-To: {{replyto}}\nSubject: {{subject}}\nFrom: {{from}}\nTo: {{address.email}}\nContent-Type: multipart/mixed; boundary=001a113c48b0b89d92052d3051da\n\n--001a113c48b0b89d92052d3051da\nContent-Type: multipart/alternative; boundary=001a113c48b0b89d89052d3051d8\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/plain; charset=UTF-8\n\nEmail with a *text attachment*.\n\n{{body2}}\n\n--001a113c48b0b89d89052d3051d8\nContent-Type: text/html; charset=UTF-8\n\n<div dir=\"ltr\"><div>Email with a <i>text attachment</i>.</div>\n\n{{body1}}\n</div>\n\n--001a113c48b0b89d89052d3051d8--\n--001a113c48b0b89d92052d3051da\nContent-Type: text/plain; charset=US-ASCII; name=\"myfile.txt\"\nContent-Disposition: attachment; filename=\"myfile.txt\"\nContent-Transfer-Encoding: base64\nX-Attachment-Id: f_ild455ce0\n\nVGhpcyBpcyBteSBzaW1wbGUgdGV4dCBmaWxlLgo=\n--001a113c48b0b89d92052d3051da--" }, "name": "_TMP_TEMPLATE_TEST" }
عند اكتمال الطلب، ستستجيب SparkPost بمعرف فريد للقالب الجديد الخاص بك. على سبيل المثال xxxxxxx.
إرسال القالب
الخبر السار هو أن إنشاء محتوى RFC 5322 كان الجزء الصعب. من الآن فصاعدًا، إرسال هذا النموذج مع SparkPost هو تمامًا مثل إرسال أي نموذج آخر.
إليك كيفية إرسال هذا النموذج وتعبئة بيانات الاستبدال:
{ "campaign_id": "MyCampaign", "return_path": "myReturnPath@yourdomain.com", "substitution_data": { "replyto": "myReplyToh@yourdomain.com", "from": "MyFrom@yourdomain.com", "subject": "my subject", "body1": "Extra content for the HTML part", "body2": "Extra content for the text part" }, "recipients": [ { "substitution_data": {}, "address": { "email": "test1@domain.com", "name": "test1" } } ], "content": { "template_id": "xxxxxxx", "use_draft_template": true } }
الخبر السار هو أن إنشاء محتوى RFC 5322 كان الجزء الصعب. من الآن فصاعدًا، إرسال هذا النموذج مع SparkPost هو تمامًا مثل إرسال أي نموذج آخر.
إليك كيفية إرسال هذا النموذج وتعبئة بيانات الاستبدال:
{ "campaign_id": "MyCampaign", "return_path": "myReturnPath@yourdomain.com", "substitution_data": { "replyto": "myReplyToh@yourdomain.com", "from": "MyFrom@yourdomain.com", "subject": "my subject", "body1": "Extra content for the HTML part", "body2": "Extra content for the text part" }, "recipients": [ { "substitution_data": {}, "address": { "email": "test1@domain.com", "name": "test1" } } ], "content": { "template_id": "xxxxxxx", "use_draft_template": true } }
الخبر السار هو أن إنشاء محتوى RFC 5322 كان الجزء الصعب. من الآن فصاعدًا، إرسال هذا النموذج مع SparkPost هو تمامًا مثل إرسال أي نموذج آخر.
إليك كيفية إرسال هذا النموذج وتعبئة بيانات الاستبدال:
{ "campaign_id": "MyCampaign", "return_path": "myReturnPath@yourdomain.com", "substitution_data": { "replyto": "myReplyToh@yourdomain.com", "from": "MyFrom@yourdomain.com", "subject": "my subject", "body1": "Extra content for the HTML part", "body2": "Extra content for the text part" }, "recipients": [ { "substitution_data": {}, "address": { "email": "test1@domain.com", "name": "test1" } } ], "content": { "template_id": "xxxxxxx", "use_draft_template": true } }
القوالب من واجهة برمجة تطبيقات عميل البريد
إذا كنت تستخدم لغة برمجة تحتوي على مكتبة لإنشاء بريد إلكتروني، يمكنك استخدام ذلك لإنشاء النموذج برمجيًا أو حتى إرسال الرسالة مباشرة. إليك مثال على استخدام JavaMail من خلال نقطة النقل الخاصة بـ SparkPost. يجب أن تكون هذه الطريقة سهلة الترجمة إلى PHP أو لغتك المفضلة.
/** * Demonstration of using JavaMail MIME message with the SparkPost RESTful interface */ public class App extends SparkPostBaseApp { public static void main(String[] args) throws Exception { Logger.getRootLogger().setLevel(Level.DEBUG); App app = new App(); app.runApp(); } private void runApp() throws Exception { Message message = createMultipartMessage(); // Convert JavaMail message into a string for transmission String rfc822Content = getMessageAsString(message); // Add dynamic To and From using SparkPost substitution syntax rfc822Content = "To: {{address.email}}\r\nFrom: {{from}}\r\n" + rfc822Content; String fromAddress = getFromAddress(); String[] recipients = getTestRecipients(); sendEmail(fromAddress, recipients, rfc822Content); } private void sendEmail(String from, String[] recipients, String email) throws SparkPostException, IOException { Client sparkpostClient = newConfiguredClient(); TransmissionWithRecipientArray transmission = new TransmissionWithRecipientArray(); // Populate Recipients List<RecipientAttributes> recipientArray = new ArrayList<>(); for (String recipient : recipients) { RecipientAttributes recipientAttribs = new RecipientAttributes(); recipientAttribs.setAddress(new AddressAttributes(recipient)); recipientArray.add(recipientAttribs); } transmission.setRecipientArray(recipientArray); transmission.setReturnPath(from); // Populate Substitution Data Map<String, String> substitutionData = new HashMap<>(); substitutionData.put("from", from); substitutionData.put("name", "Your Name Here"); transmission.setSubstitutionData(substitutionData); // Populate Email Body with RFC822 MIME TemplateContentAttributes contentAttributes = new TemplateContentAttributes(); contentAttributes.setEmailRFC822(email); transmission.setContentAttributes(contentAttributes); // Send Email RestConnection connection = new RestConnection(sparkpostClient, getEndPoint()); Response response = ResourceTransmissions.create(connection, 0, transmission); if (response.getResponseCode() == 200) { System.out.println("✅ Transmission Response: " + response); } else { System.err.println("❌ TRANSMISSION ERROR: " + response); } } /** * Builds an email with text, HTML, and attachment parts */ private Message createMultipartMessage() throws MessagingException { Properties props = new Properties(); props.put("mail.smtp.host", "none"); // Required for JavaMail to work Session session = Session.getDefaultInstance(props, null); Message message = new MimeMessage(session); message.setSubject("A multipart MIME message demo"); // Main multipart container Multipart multiPart = new MimeMultipart("mixed"); // Sub multipart for text + HTML MimeMultipart altPart = new MimeMultipart("alternative"); // Text part MimeBodyPart textPart = new MimeBodyPart(); textPart.setText("{{name}},\r\nplain text content", "utf-8"); // HTML part MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent("<b>{{name}},<br><br>Our HTML content</b>", "text/html; charset=utf-8"); // Add text and HTML to the alternative container altPart.addBodyPart(textPart); altPart.addBodyPart(htmlPart); // Wrap alternative part in a MimeBodyPart so it can be added to mixed container MimeBodyPart altBodyPart = new MimeBodyPart(); altBodyPart.setContent(altPart); // Add alternative section to mixed container multiPart.addBodyPart(altBodyPart); // Add attachment MimeBodyPart attachmentPart = new MimeBodyPart(); String filename = "java_SparkPost_background.pdf"; DataSource source = new FileDataSource(filename); attachmentPart.setDataHandler(new DataHandler(source)); attachmentPart.setFileName(filename); multiPart.addBodyPart(attachmentPart); // Set full content message.setContent(multiPart); return message; } /** * Converts a JavaMail message into an RFC822 string */ private String getMessageAsString(Message msg) throws IOException, MessagingException { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { msg.writeTo(out); return out.toString("UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException("UTF-8 not found! " + e.getMessage()); } finally { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } }
إذا كنت تستخدم لغة برمجة تحتوي على مكتبة لإنشاء بريد إلكتروني، يمكنك استخدام ذلك لإنشاء النموذج برمجيًا أو حتى إرسال الرسالة مباشرة. إليك مثال على استخدام JavaMail من خلال نقطة النقل الخاصة بـ SparkPost. يجب أن تكون هذه الطريقة سهلة الترجمة إلى PHP أو لغتك المفضلة.
/** * Demonstration of using JavaMail MIME message with the SparkPost RESTful interface */ public class App extends SparkPostBaseApp { public static void main(String[] args) throws Exception { Logger.getRootLogger().setLevel(Level.DEBUG); App app = new App(); app.runApp(); } private void runApp() throws Exception { Message message = createMultipartMessage(); // Convert JavaMail message into a string for transmission String rfc822Content = getMessageAsString(message); // Add dynamic To and From using SparkPost substitution syntax rfc822Content = "To: {{address.email}}\r\nFrom: {{from}}\r\n" + rfc822Content; String fromAddress = getFromAddress(); String[] recipients = getTestRecipients(); sendEmail(fromAddress, recipients, rfc822Content); } private void sendEmail(String from, String[] recipients, String email) throws SparkPostException, IOException { Client sparkpostClient = newConfiguredClient(); TransmissionWithRecipientArray transmission = new TransmissionWithRecipientArray(); // Populate Recipients List<RecipientAttributes> recipientArray = new ArrayList<>(); for (String recipient : recipients) { RecipientAttributes recipientAttribs = new RecipientAttributes(); recipientAttribs.setAddress(new AddressAttributes(recipient)); recipientArray.add(recipientAttribs); } transmission.setRecipientArray(recipientArray); transmission.setReturnPath(from); // Populate Substitution Data Map<String, String> substitutionData = new HashMap<>(); substitutionData.put("from", from); substitutionData.put("name", "Your Name Here"); transmission.setSubstitutionData(substitutionData); // Populate Email Body with RFC822 MIME TemplateContentAttributes contentAttributes = new TemplateContentAttributes(); contentAttributes.setEmailRFC822(email); transmission.setContentAttributes(contentAttributes); // Send Email RestConnection connection = new RestConnection(sparkpostClient, getEndPoint()); Response response = ResourceTransmissions.create(connection, 0, transmission); if (response.getResponseCode() == 200) { System.out.println("✅ Transmission Response: " + response); } else { System.err.println("❌ TRANSMISSION ERROR: " + response); } } /** * Builds an email with text, HTML, and attachment parts */ private Message createMultipartMessage() throws MessagingException { Properties props = new Properties(); props.put("mail.smtp.host", "none"); // Required for JavaMail to work Session session = Session.getDefaultInstance(props, null); Message message = new MimeMessage(session); message.setSubject("A multipart MIME message demo"); // Main multipart container Multipart multiPart = new MimeMultipart("mixed"); // Sub multipart for text + HTML MimeMultipart altPart = new MimeMultipart("alternative"); // Text part MimeBodyPart textPart = new MimeBodyPart(); textPart.setText("{{name}},\r\nplain text content", "utf-8"); // HTML part MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent("<b>{{name}},<br><br>Our HTML content</b>", "text/html; charset=utf-8"); // Add text and HTML to the alternative container altPart.addBodyPart(textPart); altPart.addBodyPart(htmlPart); // Wrap alternative part in a MimeBodyPart so it can be added to mixed container MimeBodyPart altBodyPart = new MimeBodyPart(); altBodyPart.setContent(altPart); // Add alternative section to mixed container multiPart.addBodyPart(altBodyPart); // Add attachment MimeBodyPart attachmentPart = new MimeBodyPart(); String filename = "java_SparkPost_background.pdf"; DataSource source = new FileDataSource(filename); attachmentPart.setDataHandler(new DataHandler(source)); attachmentPart.setFileName(filename); multiPart.addBodyPart(attachmentPart); // Set full content message.setContent(multiPart); return message; } /** * Converts a JavaMail message into an RFC822 string */ private String getMessageAsString(Message msg) throws IOException, MessagingException { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { msg.writeTo(out); return out.toString("UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException("UTF-8 not found! " + e.getMessage()); } finally { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } }
إذا كنت تستخدم لغة برمجة تحتوي على مكتبة لإنشاء بريد إلكتروني، يمكنك استخدام ذلك لإنشاء النموذج برمجيًا أو حتى إرسال الرسالة مباشرة. إليك مثال على استخدام JavaMail من خلال نقطة النقل الخاصة بـ SparkPost. يجب أن تكون هذه الطريقة سهلة الترجمة إلى PHP أو لغتك المفضلة.
/** * Demonstration of using JavaMail MIME message with the SparkPost RESTful interface */ public class App extends SparkPostBaseApp { public static void main(String[] args) throws Exception { Logger.getRootLogger().setLevel(Level.DEBUG); App app = new App(); app.runApp(); } private void runApp() throws Exception { Message message = createMultipartMessage(); // Convert JavaMail message into a string for transmission String rfc822Content = getMessageAsString(message); // Add dynamic To and From using SparkPost substitution syntax rfc822Content = "To: {{address.email}}\r\nFrom: {{from}}\r\n" + rfc822Content; String fromAddress = getFromAddress(); String[] recipients = getTestRecipients(); sendEmail(fromAddress, recipients, rfc822Content); } private void sendEmail(String from, String[] recipients, String email) throws SparkPostException, IOException { Client sparkpostClient = newConfiguredClient(); TransmissionWithRecipientArray transmission = new TransmissionWithRecipientArray(); // Populate Recipients List<RecipientAttributes> recipientArray = new ArrayList<>(); for (String recipient : recipients) { RecipientAttributes recipientAttribs = new RecipientAttributes(); recipientAttribs.setAddress(new AddressAttributes(recipient)); recipientArray.add(recipientAttribs); } transmission.setRecipientArray(recipientArray); transmission.setReturnPath(from); // Populate Substitution Data Map<String, String> substitutionData = new HashMap<>(); substitutionData.put("from", from); substitutionData.put("name", "Your Name Here"); transmission.setSubstitutionData(substitutionData); // Populate Email Body with RFC822 MIME TemplateContentAttributes contentAttributes = new TemplateContentAttributes(); contentAttributes.setEmailRFC822(email); transmission.setContentAttributes(contentAttributes); // Send Email RestConnection connection = new RestConnection(sparkpostClient, getEndPoint()); Response response = ResourceTransmissions.create(connection, 0, transmission); if (response.getResponseCode() == 200) { System.out.println("✅ Transmission Response: " + response); } else { System.err.println("❌ TRANSMISSION ERROR: " + response); } } /** * Builds an email with text, HTML, and attachment parts */ private Message createMultipartMessage() throws MessagingException { Properties props = new Properties(); props.put("mail.smtp.host", "none"); // Required for JavaMail to work Session session = Session.getDefaultInstance(props, null); Message message = new MimeMessage(session); message.setSubject("A multipart MIME message demo"); // Main multipart container Multipart multiPart = new MimeMultipart("mixed"); // Sub multipart for text + HTML MimeMultipart altPart = new MimeMultipart("alternative"); // Text part MimeBodyPart textPart = new MimeBodyPart(); textPart.setText("{{name}},\r\nplain text content", "utf-8"); // HTML part MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent("<b>{{name}},<br><br>Our HTML content</b>", "text/html; charset=utf-8"); // Add text and HTML to the alternative container altPart.addBodyPart(textPart); altPart.addBodyPart(htmlPart); // Wrap alternative part in a MimeBodyPart so it can be added to mixed container MimeBodyPart altBodyPart = new MimeBodyPart(); altBodyPart.setContent(altPart); // Add alternative section to mixed container multiPart.addBodyPart(altBodyPart); // Add attachment MimeBodyPart attachmentPart = new MimeBodyPart(); String filename = "java_SparkPost_background.pdf"; DataSource source = new FileDataSource(filename); attachmentPart.setDataHandler(new DataHandler(source)); attachmentPart.setFileName(filename); multiPart.addBodyPart(attachmentPart); // Set full content message.setContent(multiPart); return message; } /** * Converts a JavaMail message into an RFC822 string */ private String getMessageAsString(Message msg) throws IOException, MessagingException { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { msg.writeTo(out); return out.toString("UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException("UTF-8 not found! " + e.getMessage()); } finally { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } }
الخاتمة
الآن بعد أن رأيت كيف يمكن استخدام SparkPost لإرسال البريد الإلكتروني بأي تعقيد تقريبًا، قد ترغب في إلقاء نظرة على “SparkPost يدعم إرسال البريد الإلكتروني على Apple Watch” أو إلقاء نظرة على تركيبة الاستبدال لترى كيف يمكن استخدامها مع “if then else”، “التعبيرات في الشروط” أو “تكرار المصفوفات” داخل قالبك أو محتوى الإرسال.
الآن بعد أن رأيت كيف يمكن استخدام SparkPost لإرسال البريد الإلكتروني بأي تعقيد تقريبًا، قد ترغب في إلقاء نظرة على “SparkPost يدعم إرسال البريد الإلكتروني على Apple Watch” أو إلقاء نظرة على تركيبة الاستبدال لترى كيف يمكن استخدامها مع “if then else”، “التعبيرات في الشروط” أو “تكرار المصفوفات” داخل قالبك أو محتوى الإرسال.
الآن بعد أن رأيت كيف يمكن استخدام SparkPost لإرسال البريد الإلكتروني بأي تعقيد تقريبًا، قد ترغب في إلقاء نظرة على “SparkPost يدعم إرسال البريد الإلكتروني على Apple Watch” أو إلقاء نظرة على تركيبة الاستبدال لترى كيف يمكن استخدامها مع “if then else”، “التعبيرات في الشروط” أو “تكرار المصفوفات” داخل قالبك أو محتوى الإرسال.



