مشكلة تنسيق بريد PHP - لماذا تنهار خطوط خط CRLF HTML في Outlook؟
-
27-09-2019 - |
سؤال
أنا أستخدم مواطن 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 ليست على ما يرام.
لإصلاح مشكلة التنسيق التي قمت بها بما يلي:
- مسح ال
$headers = "MIME-Version: 1.0\r\n";
رأس البريد. - تأكد من إنهاء رأسي مع فقط "
\n
" بدلاً من "\r\n
".
هل يعرف أي شخص لماذا أحصل على نتائج أفضل مع رسائل البريد الإلكتروني HTML عندما لا أتوافق مع الدليل؟
معلومات:
- أنا استخدم postfix الإصدار 2.3.3 على RHEL 5.5.
- الإصدار PHP 5.3.2
المحلول
لديك حلان:
- ترقية postfix إلى +2.9 التي تحتوي على "sendmail_fix_line_endings" (أخيرًا !!!) راجع: وثائق postfix
- تثبيت 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