مشكلة تنسيق بريد PHP - لماذا تنهار خطوط خط CRLF HTML في Outlook؟

StackOverflow https://stackoverflow.com/questions/3449431

سؤال

أنا أستخدم مواطن PHP mail() وظيفة لإرسال رسائل البريد الإلكتروني HTML ولديها مشكلة التنسيق في عميل البريد الإلكتروني الأكثر شيوعًا للمستخدمين - Outlook 2007 (بالإضافة إلى بعض عملاء البريد الإلكتروني الآخرين)-يتم كشف جميع علامات HTML ، لذا يبدو الأمر وكأنه رطوبة لمطور غير ويب.

سأرسل بريدًا إلكترونيًا HTML بنفس الطريقة دليل PHP تجريبي. مثال:

$message  = get_HTML_email_with_valid_formatting();
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/html; charset=UTF-8\r\n";
$headers .= "From: example.com <info@example.com>\r\n";
$headers .= "Reply-To: donotreply@example.com\r\n";
mail('me@example.com', 'test', $message, $headers);

لأن اختبار العديد من عملاء البريد الإلكتروني صعب ، فقد اشتركت مع http://litmusapp.com/ حتى أتمكن من رؤية لقطة شاشة لرسائل البريد الإلكتروني في 47 من عملاء البريد الإلكتروني المختلفين. معظمهم على ما يرام (على سبيل المثال Gmail ، Thunderbird ، ملاحظات لوتس) ولكن جميع الإصدارات المختلفة من Outlook ليست على ما يرام.

لإصلاح مشكلة التنسيق التي قمت بها بما يلي:

  1. مسح ال $headers = "MIME-Version: 1.0\r\n"; رأس البريد.
  2. تأكد من إنهاء رأسي مع فقط "\n" بدلاً من "\r\n".

هل يعرف أي شخص لماذا أحصل على نتائج أفضل مع رسائل البريد الإلكتروني HTML عندما لا أتوافق مع الدليل؟

معلومات:

  • أنا استخدم postfix الإصدار 2.3.3 على RHEL 5.5.
  • الإصدار PHP 5.3.2
هل كانت مفيدة؟

المحلول

لديك حلان:

  1. ترقية postfix إلى +2.9 التي تحتوي على "sendmail_fix_line_endings" (أخيرًا !!!) راجع: وثائق postfix
  2. تثبيت SendMail (العمل بشكل جيد!)

لدي صورة VMware مع مكدس المصباح. من أجل إرسال بريد إلكتروني ، قررت أخيرًا:

  • تثبيت SendMail
  • استخدم SMTP الخاص بـ ISP الخاص بي (لأنه مجرد مربع DEV).

بالنسبة لجزء SendMail ، يمكنك متابعة هذا: http://www.geoffke.be/nieuws/13/

الأهمية: يجوز لبعض أجهزة الويب استخدام حزم مستقرة فقط مما يعني أنه يمكنك الحصول على ... postfix أقدم من 2.9 !!! exemple: http://packages.debian.org/search؟keywords=postfix

نصائح أخرى

إذا كنت تستخدم postfix <2.9 ، يمكنك فقط وضع sendmail_path = "tr -d '\r'|sendmail -t -i" في php.ini.

أظن أنه إصدار PostFix - الإصدار 2.3.3 هو 5 سنوات وربما يتم تحويل LF إلى CRLF ولكن رؤية كما كان لدي CRLF بالفعل ، أعتقد أنني كنت أرسل CRCRLF إلى عملاء البريد.

لسوء الحظ ، أنا لست في الموقف لترقية Postfix. لذلك في الوقت الحالي ، قمت بتحويل الكود لاستخدام متغير قابل للتكوين لنهايات الخط بحيث يكون من السهل تغييرها في المستقبل:

$eol = "\n";
$message  = get_HTML_email_with_valid_formatting();
$headers  = "MIME-Version: 1.0".$eol;
$headers .= "Content-Type: text/html; charset=UTF-8".$eol;
$headers .= "From: example.com <info@example.com>".$eol;
$headers .= "Reply-To: donotreply@example.com".$eol;
mail('me@example.com', 'test', $message, $headers);

تم تفسير البريد الإلكتروني على أنه نص/عادي بدلاً من HTML المقصود. السبب في ذلك هو ذلك النص/html هو نوع فرعي متعدد ، وبالتالي يتطلب إعلانات الحدود.

الرمز الخاص بك مفقود حدود الرأس تصريح:

$message  = get_HTML_email_with_valid_formatting();
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "--$boundary\r\n"."Content-Type: text/html; charset=ISO-8859-1\r\n";
$headers .= "From: example.com <info@example.com>\r\n";
$headers .= "Reply-To: donotreply@example.com\r\n";
mail('me@example.com', 'test', $message, $headers);

تحقق من هذا الويكي حول رسائل MIME & Multipart:http://en.wikipedia.org/wiki/mime#multipart_messages

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top