معاملات الدالة mail()
في PHP:
المعامل | تفاصيل |
---|---|
string $to | عنوان البريد الإلكتروني للمستقبل |
string $subject | الموضوع |
string $message | محتوى البريد الإلكتروني |
string $additional_headers | معامل اختياري: ترويسات لإضافتها إلى البريد الإلكتروني |
string $additional_parameters | معامل اختياري: وسائط لتمريرها إلى تطبيق البريد الإلكتروني المرسل المُعد في سطر الأوامر |
أساسيات إرسال بريد إلكتروني مع مثال
يتألف البريد الإلكتروني النموذجي من ثلاثة مكونات أساسية:
- مُستقبِل (يُمثَّل كعنوان بريد إلكتروني)
- موضوع
- جسم الرسالة
يمكن أن يكون إرسال بريد إلكتروني بسيطًا مثل استدعاء الدالة المضمنة mail()
، تأخذ هذه الدالة حتى 5 معاملات، أول ثلاث معاملات هي المطلوبة فقط لإرسال بريد إلكتروني (ومن الشائع استخدام المعامل الرابع كما سنوضح في المثال أدناه)، المعاملات الثلاثة الأولى هي:
- عنوان البريد الإلكتروني للمستقبل (سلسلة نصية).
- موضوع البريد الإلكتروني (سلسلة نصية).
- جسم البريد الإلكتروني (سلسلة نصية) (أي محتوى البريد الإلكتروني).
الشيفرة التالية توضح مثال بسيط:
mail('recipient@example.com', 'Email Subject', 'This is the email message body');
يعدّ المثال السابق جيدًا في بعض الحالات مثل توفير القيمة في شيفرة (بدلًا من جلبها من مصدر خارجي) عند إرسال بريد إلكتروني للتنبيه في نظام داخلي. لكن من الشائع وضع المعاملات الممررة كمعاملات للدالة mail()
في متغيرات لجعل الشيفرة أنظف وأسهل في الإدارة (مثلًا لإنشاء بريد إلكتروني ديناميكي بعد إرسال نموذج).
بالإضافة إلى ذلك تقبل الدالة mail()
معاملًا رابعًا يسمح لك بإضافة ترويسات في البريد الإلكتروني المرسل، يمكن أن تسمح لك هذه الترويسات بضبط:
- اسم المرسل وعنوان البريد الإلكتروني الذي سيظهر لدى المستخدم.
-
عنوان البريد الإلكتروني للحقل
Reply-To
والذي سيُرسل إليه رد المستخدم. -
ترويسات إضافية غير معيارية مثل
X-Mailer
والتي تخبر المستقبل أن هذا البريد الإلكتروني أُرسل عبر PHP.
// يمكن أن تكون $to = $_POST['recipient']; $to = 'recipient@example.com'; // يمكن أن تكون $subject = $_POST['subject']; $subject = 'Email Subject'; // يمكن أن تكون $message = $_POST['message']; $message = 'This is the email message body'; $headers = implode("\r\n", [ 'From: John Conde <webmaster@example.com>', 'Reply-To: webmaster@example.com', 'X-Mailer: PHP/' . PHP_VERSION ]);
يمكن أن يُستخدم المعامل الخامس الاختياري لتمرير رايات إضافية مثل خيارات سطر الأوامر إلى البرنامج المُعدّ ليستخدم عند إرسال بريد إلكتروني كما هو معرَّف في ضبط الإعداد sendmail_path
، يمكن استخدامه مثلًا لضبط عنوان المرسل عند استخدام الأمر sendmail/postfix
مع الخيار -f
لإرسال بريد إلكتروني.
$fifth = '-fno-reply@example.com';
على الرغم من أن استخدام الدالة mail()
يمكن أن يكون موثوقًا إلى حد كبير، إلا أنّه لا يوجد ما يضمن إرسال البريد الإلكتروني عند كل استدعاء لها، لذا يجب أن تلتقط القيمة المُرجعة منها لتعرف ما إذا كان هناك خطأ محتمل عند إرسال بريدك الإلكتروني، إذ أنّ الدالة ستُرجع القيمة TRUE
إذا قُبل البريد الإلكتروني بنجاح للتسليم وإلا ستُرجع القيمة FALSE
.
$result = mail($to, $subject, $message, $headers, $fifth);
ملاحظة: إنّ إرجاع الدالة mail()
للقيمة TRUE
لا يعني أنّ البريد الإلكتروني أُرسل أو أنّه سيُستقبَل بنجاح، إنما فقط يدل على أنّ البريد الإلكتروني سُلِّم بنجاح إلى نظام البريد الإلكتروني الخاص بك.
تحتاج إلى بعض الخطوات الإضافية لترسل بريد إلكتروني بصيغة HTML:
-
إضافة الترويسة
MIME-Version
. -
إضافة الترويسة
Content-Type
. - التأكد من أنّ محتوى البريد الإلكتروني بصيغة HTML.
$to = 'recipient@example.com'; $subject = 'Email Subject'; $message = '<html><body>This is the email message body</body></html>'; $headers = implode("\r\n", [ 'From: John Conde <webmaster@example.com>', 'Reply-To: webmaster@example.com', 'MIME-Version: 1.0', 'Content-Type: text/html; charset=ISO-8859-1', 'X-Mailer: PHP/' . PHP_VERSION ]);
إليك مثال كامل لاستخدام الدالة mail()
:
// أدوات تنقيح الأخطاء، شغّلها في بيئة التطوير الخاصة بك فقط. error_reporting(-1); ini_set('display_errors', 'On'); set_error_handler("var_dump"); // إعدادات بريد إلكتروني خاصة يمكن أن تقلل من احتمال جعل البريد الإلكتروني الخاص بك غير مرغوب فيه وتوفر تسجيل دخول في حالة وجود صعوبات تقنية. ini_set("mail.log", "/tmp/mail.log"); ini_set("mail.add_x_header", TRUE); // مكونات بريدنا الإلكتروني $to = 'recipient@example.com'; $subject = 'Email Subject'; $message = 'This is the email message body'; $headers = implode("\r\n", [ 'From: webmaster@example.com', 'Reply-To: webmaster@example.com', 'X-Mailer: PHP/' . PHP_VERSION ]); // إرسال البريد الإلكتروني $result = mail($to, $subject, $message, $headers); // التحقق من النتائج والتفاعل وفقًا لذلك. if ($result) { // (1) header('Location: http://example.com/path/to/thank-you.php', true, 303); exit; } else { // (2) }
في الموضع (1) تكون الدالة أرجعت القيمة TRUE
وسيُعاد التوجيه إلى صفحة thank-you
، نستخدم النمط POST/REDIRECT/GET
لمنع إعادة إرسال النموذج عندما يحدّث المستخدم الصفحة.
في الموضع (2) لم يُرسل البريد الإلكتروني، تحقق من السجلات لمعرفة السبب.
يمكنك الاطلاع أيضًا على: التوثيق الرسمي:
أسئلة ذات صلة من موقع stack overflow:
- الدالة mail لا تُكمل إرسال البريد الإلكتروني.
- كيف تتأكد من أنّ بريدك الإلكتروني المُرسل لا يُصنف ضمن البريد الإلكتروني غير المرغوب فيه.
- كيف تستخدم SMTP لإرسال بريد إلكتروني.
- ضبط إعدادات مرسل البريد الإلكتروني.
خدمات بريد إلكتروني بديلة:
مخدمات بريد إلكتروني:
مواضيع ذات صلة:
إرسال بريد إلكتروني يحتوي على صيغة HTML باستخدام الدالة mail()
<?php $to = 'recipent@example.com'; $subject = 'Sending an HTML email using mail() in PHP'; $message = '<html><body><p><b>This paragraph is bold.</b></p><p><i>This text is italic.</i></p></body></html>'; $headers = implode("\r\n", [ "From: John Conde <webmaster@example.com>", "Reply-To: webmaster@example.com", "X-Mailer: PHP/" . PHP_VERSION, "MIME-Version: 1.0", "Content-Type: text/html; charset=UTF-8" ]); mail($to, $subject, $message, $headers);
لا يختلف هذا كثيرًا عن إرسال بريد إلكتروني يحتوي على نص بسيط، الاختلافات الرئيسة هي أنّ المحتوى عبارة عن ملف HTML ويوجد ترويستين إضافيتين يجب تضمينهما حتى يعرف البريد الإلكتروني للعميل أنّ البريد الإلكتروني بصيغة HTML وهما:
-
MIME-Version: 1.0
-
Content-Type: text/html; charset=UTF-8
إرسال بريد إلكتروني مع مرفق باستخدام الدالة mail()
إليك المثال التالي:
<?php $to = 'recipient@example.com'; $subject = 'Email Subject'; $message = 'This is the email message body'; $attachment = '/path/to/your/file.pdf'; $content = file_get_contents($attachment); // (1) $content = chunk_split(base64_encode($content)); //(2) $prefix = "part_"; // (3) // (4) $boundary = uniqid($prefix, true); // الترويسات $headers = implode("\r\n", [ 'From: webmaster@example.com', 'Reply-To: webmaster@example.com', 'X-Mailer: PHP/' . PHP_VERSION, 'MIME-Version: 1.0', // معامل الحد مطلوب ويجب أن يكون ضمن علامات اقتباس 'Content-Type: multipart/mixed; boundary="' . $boundary . '"', "Content-Transfer-Encoding: 7bit", "This is a MIME encoded message." // message for restricted transports ]); // الرسالة والمرفق $message = implode("\r\n", [ "--" . $boundary, // (5) 'Content-Type: text/plain; charset="iso-8859-1"', "Content-Transfer-Encoding: 8bit", $message, "--" . $boundary, // (6) 'Content-Type: application/octet-stream; name="RenamedFile.pdf"', "Content-Transfer-Encoding: base64", "Content-Disposition: attachment", $content, "--" . $boundary . "--" // (7) ]); // إرسال البريد الإلكتروني $result = mail($to, $subject, $message, $headers); if ($result) { // (8) header('Location: http://example.com/path/to/thank-you.php', true, 303); exit; } else { // (9) }
في الموضع (1) يجب تقسيم محتوى المرفق المُرسل باستخدام تشفير Base64
إلى أجزاء بطول 76 محرفًا كما هو محدد في القسم 6.8 من RFC 2045، تستخدم الدالة chunk_split()
بشكلٍ افتراضي طول الجزء 76 مع CRLF
زائدة (\r\n)
، لا يتضمن متطلب 76 محرفًا المحارف carriage return
وline feed
.
في الموضع (2) تحدد الحدود الكيانات متعددة الأجزاء، يجب ألا يكون الحد في أي جزء مغلف كما هو مذكور في القسم 5.1 من RFC 2046 لذا يجب أن يكون فريدًا، وكما هو مذكور في القسم 5.1.1 التالي فإنّ الحدّ يُعرَّف على أنّه خط يتألف من موصلين ("--") وقيمة معامل ومسافة خطية اختيارية وCRLF
نهائية.
في الموضع (3) بادئة اختيارية.
في الموضع (4) إنشاء قيمة معامل حد فريدة مع البادئة باستخدام الدالة uniqid()
، المعامل الثاني يجعل قيمة المعامل فريدة أكثر.
في الموضع (5) محدد حد الترويسة
في الموضع (6) محدد حد المحتوى
في الموضع (7) محدد حد الإغلاق
في الموضع (8) تكون الدالة أرجعت القيمة TRUE
وسيُعاد التوجيه إلى صفحة thank-you
، نستخدم النمط POST/REDIRECT/GET
لمنع إعادة إرسال النموذج عندما يحدّث المستخدم الصفحة.
في الموضع (9) لم يُرسل البريد الإلكتروني، تحقق من السجلات لمعرفة السبب.
ترميز نقل المحتوى
الترميزات المتاحة هي 7 بت، 8 بت، الثنائي، مقتبس قابل للطباعة (quoted-printable)، الأساس 64 (base64)، ietf-token وx-token، من هذه الترميزات عندما يكون Content-Type
متعدد الأجزاء فإنّ ترميز نقل المحتوى يجب ألّا يكون أي قيمة أخرى غير 7 بت أو 8 بت أو ثنائي.
نختار في مثالنا ترميز 7 بت الذي يمثّل محارف US-ASCII للترويسة متعددة الأجزاء لأنّ بعض البروتوكولات تدعم هذا الترميز فقط، ويمكن بعدها تشفير البيانات ضمن الحدود على أساس كل جزء على حدة، وهذا ما يفعله هذا المثال بالضبط. الجزء الأول الذي يتضمن رسالة من النوع text/plain
يُعرَّف على أنّه 8 بت بما أنّه قد يكون من الضروري أن يدعم محارف إضافية، في هذه الحالة تُستخدم مجموعة المحارف Latin1 (iso-8859-1)
، الجزء الثاني هو المرفق لذا يُعرَّف على أنّه بترميز الأساس 64 application/octet-stream
. بما أنّ الأساس 64 يحوّل البيانات إلى المجال 7 بت، يمكن أن تُرسَل عبر عمليات نقل مقيدة.
إرسال بريد إلكتروني يحتوي على نص بسيط باستخدام PHPMailer
بريد إلكتروني يحتوي على نص بسيط
<?php $mail = new PHPMailer(); $mail->From = "from@example.com"; $mail->FromName = "Full Name"; $mail->addReplyTo("reply@example.com", "Reply Address"); $mail->Subject = "Subject Text"; $mail->Body = "This is a sample basic text email using PHPMailer."; if($mail->send()) { // (1) header('Location: http://example.com/path/to/thank-you.php', true, 303); exit; } else { echo "Mailer Error: " . $mail->ErrorInfo; }
في الموضع (1) تكون الدالة أرجعت القيمة TRUE
وسيُعاد التوجيه إلى صفحة thank-you
، نستخدم النمط POST/REDIRECT/GET
لمنع إعادة إرسال النموذج عندما يحدّث المستخدم الصفحة.
إضافة مستقبلين إضافيين، مستقبلين نسخة إضافية (CC)، مستقبلين نسخة إضافية محجوبين (BCC)
<?php $mail = new PHPMailer(); $mail->From = "from@example.com"; $mail->FromName = "Full Name"; $mail->addReplyTo("reply@example.com", "Reply Address"); $mail->addAddress("recepient1@example.com", "Recepient Name"); $mail->addAddress("recepient2@example.com"); $mail->addCC("cc@example.com"); $mail->addBCC("bcc@example.com"); $mail->Subject = "Subject Text"; $mail->Body = "This is a sample basic text email using PHPMailer."; if($mail->send()) { // (1) header('Location: http://example.com/path/to/thank-you.php', true, 303); exit; } else { echo "Error: " . $mail->ErrorInfo; }
في الموضع (1) تكون الدالة أرجعت القيمة TRUE
وسيُعاد التوجيه إلى صفحة thank-you
، نستخدم النمط POST/REDIRECT/GET
لمنع إعادة إرسال النموذج عندما يحدّث المستخدم الصفحة.
إرسال بريد إلكتروني باستخدام PHPMailer
إليك مثال عن إرسال بريد إلكتروني يحتوي على صيغة HTML باستخدام PHPMailer:
<?php $mail = new PHPMailer(); $mail->From = "from@example.com"; $mail->FromName = "Full Name"; $mail->addReplyTo("reply@example.com", "Reply Address"); $mail->addAddress("recepient1@example.com", "Recepient Name"); $mail->addAddress("recepient2@example.com"); $mail->addCC("cc@example.com"); $mail->addBCC("bcc@example.com"); $mail->Subject = "Subject Text"; $mail->isHTML(true); $mail->Body = "<html><body><p><b>This paragraph is bold.</b></p><p><i>This text is italic.</i></p></body></html>"; $mail->AltBody = "This paragraph is not bold.\n\nThis text is not italic."; if($mail->send()) { // (1) header('Location: http://example.com/path/to/thank-you.php', true, 303); exit; } else { echo "Error: " . $mail->ErrorInfo; }
في الموضع (1) تكون الدالة أرجعت القيمة TRUE
وسيُعاد التوجيه إلى صفحة thank-you
، نستخدم النمط POST/REDIRECT/GET
لمنع إعادة إرسال النموذج عندما يحدّث المستخدم الصفحة.
إرسال بريد إلكتروني مع مرفق باستخدام PHPMailer
<?php $mail = new PHPMailer(); $mail->From = "from@example.com"; $mail->FromName = "Full Name"; $mail->addReplyTo("reply@example.com", "Reply Address"); $mail->Subject = "Subject Text"; $mail->Body = "This is a sample basic text email with an attachment using PHPMailer."; // إضافة مرفق ثابت $attachment = '/path/to/your/file.pdf'; $mail->AddAttachment($attachment , 'RenamedFile.pdf'); // إضافة مرفق ثانٍ يُنشأ وقت التنفيذ مثل CSV ليُفتح باستخدام إكسل $csvHeader = "header1,header2,header3"; $csvData = "row1col1,row1col2,row1col3\nrow2col1,row2col2,row2col3"; $mail->AddStringAttachment($csvHeader ."\n" . $csvData, 'your-csv-file.csv', 'base64', 'application/vnd.ms-excel'); if($mail->send()) { // (1) header('Location: http://example.com/path/to/thank-you.php', true, 303); exit; } else { echo "Error: " . $mail->ErrorInfo; }
في الموضع (1) تكون الدالة أرجعت القيمة TRUE
وسيُعاد التوجيه إلى صفحة thank-you
، نستخدم النمط POST/REDIRECT/GET
لمنع إعادة إرسال النموذج عندما يحدّث المستخدم الصفحة.
إرسال بريد إلكتروني يحتوي على نص بسيط باستخدام Sendgrid
بريد إلكتروني يحتوي على نص بسيط
<?php $sendgrid = new SendGrid("YOUR_SENDGRID_API_KEY"); $email = new SendGrid\Email(); $email->addTo("recipient@example.com") ->setFrom("sender@example.com") ->setSubject("Subject Text") ->setText("This is a sample basic text email using "); $sendgrid->send($email);
إضافة مستقبلين إضافيين، مستقبلين نسخة إضافية (CC)، مستقبلين نسخة إضافية محجوبين (BCC)
<?php $sendgrid = new SendGrid("YOUR_SENDGRID_API_KEY"); $email = new SendGrid\Email(); $email->addTo("recipient@example.com") ->setFrom("sender@example.com") ->setSubject("Subject Text") ->setHtml("<html><body><p><b>This paragraph is bold.</b></p><p><i>This text is italic.</i></p></body></html>"); $personalization = new Personalization(); $email = new Email("Recepient Name", "recepient1@example.com"); $personalization->addTo($email); $email = new Email("RecepientCC Name", "recepient2@example.com"); $personalization->addCc($email); $email = new Email("RecepientBCC Name", "recepient3@example.com"); $personalization->addBcc($email); $email->addPersonalization($personalization); $sendgrid->send($email);
إرسال بريد إلكتروني مع مرفق باستخدام Sendgrid
إليك الشيفرة الكاملة:
<?php $sendgrid = new SendGrid("YOUR_SENDGRID_API_KEY"); $email = new SendGrid\Email(); $email->addTo("recipient@example.com") ->setFrom("sender@example.com") ->setSubject("Subject Text") ->setText("This is a sample basic text email using "); $attachment = '/path/to/your/file.pdf'; $content = file_get_contents($attachment); $content = chunk_split(base64_encode($content)); $attachment = new Attachment(); $attachment->setContent($content); $attachment->setType("application/pdf"); $attachment->setFilename("RenamedFile.pdf"); $attachment->setDisposition("attachment"); $email->addAttachment($attachment); $sendgrid->send($email);
ترجمة -وبتصرف- للفصل [Sending Email] من كتاب PHP Notes for Professionals book
اقرأ أيضًا
- المقال التالي: ملاحظات حول استعمال بروتوكول IMAP في PHP
- المقال السابق: استخدام MongoDB و Redis في PHP
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.