সারাংশ
ডাব্লুপি কোরে একটি ত্রুটির কারণে ডাব্লুপি_মেল ( ) এর সাথে মাল্টিপার্ট ইমেলগুলি (এইচটিএমএল / পাঠ্য) প্রেরণ করা ( স্প্যাম ফোল্ডারগুলিতে ইমেলের সম্ভাবনা হ্রাস করতে) আপনার ডোমেনটি হটমেইল (এবং অন্যান্য মাইক্রোসফ্ট ইমেলগুলি) দ্বারা অবরুদ্ধ করার সাথে বিদ্রূপাত্মকভাবে ফলাফল করবে ।
এটি একটি জটিল সমস্যা যা আমি কাউকে একটি কার্যক্ষম সমাধান খুঁজে বের করতে সহায়তা করার প্রয়াসে দুর্দান্তভাবে বিশদে ভাঙ্গার লক্ষ্য করব যা শেষ পর্যন্ত মূলত প্রয়োগ করা যেতে পারে।
এটি একটি লাভজনক পড়া হতে চলেছে। চল শুরু করি...
পোকাটি
আপনার নিউজলেটার ইমেলগুলি স্প্যাম ফোল্ডারে শেষ না হওয়া এড়াতে সর্বাধিক সাধারণ পরামর্শ হ'ল মাল্টিপার্ট বার্তা প্রেরণ।
মাল্টি-পার্ট (মাইম) বলতে একক ইমেলটিতে ইমেল বার্তার একটি এইচটিএমএল এবং পাঠ্য উভয় অংশ প্রেরণকে বোঝায়। যখন কোনও ক্লায়েন্ট কোনও মাল্টিপার্ট বার্তা পায়, এটি এইচটিএমএল রেন্ডার করতে পারলে এটি HTML সংস্করণ গ্রহণ করে, অন্যথায় এটি সরল পাঠ্য সংস্করণ উপস্থাপন করে।
এটি কাজ প্রমাণিত। জিমেইলে প্রেরণ করার সময়, আমাদের সমস্ত ইমেলগুলি স্প্যাম ফোল্ডারে অবতীর্ণ হয় যতক্ষণ না আমরা মুখ্য বার্তাগুলি মূল ইনবক্সে আসার পরে মাল্টিপার্টে পরিবর্তন করি। দুর্দান্ত জিনিস।
এখন, wp_mail () এর মাধ্যমে মাল্টিপার্ট বার্তা প্রেরণ করার সময় এটি একবারে বাউন্ডারি (কাস্টমালি সেট করা থাকলে) এবং একবার ছাড়াই কন্টেন্ট টাইপ (মাল্টিপার্ট / *) দুবার আউটপুট করে। এই আচরণের ফলে ইমেলটি কাঁচা বার্তা হিসাবে প্রদর্শিত হয় এবং সমস্ত মাইক্রোসফ্ট (হটমেল, আউটলুক, ইত্যাদি ...) সহ কিছু ইমেলগুলিতে গুণিত হয় না results
মাইক্রোসফ্ট এই বার্তাটিকে জাঙ্ক হিসাবে পতাকাঙ্কিত করবে এবং যে কয়েকটি বার্তাগুলি আসবে তা প্রাপক নিজে হাতে পতাকাঙ্কিত করবেন। দুর্ভাগ্যক্রমে , মাইক্রোসফ্ট ইমেল ঠিকানাগুলি বহুল ব্যবহৃত হয়। আমাদের গ্রাহকদের 40% এটি ব্যবহার করে।
মাইক্রোসফ্ট আমাদের সম্প্রতি একটি ইমেল এক্সচেঞ্জের মাধ্যমে এটি নিশ্চিত করেছে।
বার্তাগুলির পতাকাঙ্কণের ফলে ডোমেন সম্পূর্ণরূপে অবরুদ্ধ হয়ে যাবে । এর অর্থ হ'ল বার্তা স্প্যাম ফোল্ডারে প্রেরণ করা হবে না, এমনকি এগুলি প্রাপকের কাছে মোটেও বিতরণ করা হবে না ।
আমরা এখনও পর্যন্ত আমাদের মূল ডোমেনটি 3 বার অবরুদ্ধ করেছি।
যেহেতু এটি ডাব্লুপি কোরে একটি ত্রুটি, তাই প্রতিটি ডোমেন যে বহুগুণ বার্তা প্রেরণ করে তা অবরুদ্ধ করা হচ্ছে। সমস্যাটি হ'ল বেশিরভাগ ওয়েবমাস্টাররা কেন তা জানেন না। আমি আমার গবেষণাটি করার সময় এবং অন্যান্য ব্যবহারকারীদের ফোরাম ইত্যাদিতে এই বিষয়ে আলোচনা করার সময় আমি এটি নিশ্চিত করেছিলাম এর জন্য কাঁচা কোডটি অনুসন্ধান করা এবং এই ধরণের ইমেল বার্তাগুলি কীভাবে কাজ করে, যা আমরা পরের দিকে চলেছি তার একটি ভাল জ্ঞান থাকা দরকার ...
কোডে এটি ভেঙে দেওয়া যাক
একটি হটমেল / আউটলুক অ্যাকাউন্ট তৈরি করুন। তারপরে, নিম্নলিখিত কোডটি চালান:
// Set $to to an hotmail.com or outlook.com email
$to = "YourEmail@hotmail.com";
$subject = 'wp_mail testing multipart';
$message = '------=_Part_18243133_1346573420.1408991447668
Content-Type: text/plain; charset=UTF-8
Hello world! This is plain text...
------=_Part_18243133_1346573420.1408991447668
Content-Type: text/html; charset=UTF-8
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<p>Hello World! This is HTML...</p>
</body>
</html>
------=_Part_18243133_1346573420.1408991447668--';
$headers = "MIME-Version: 1.0\r\n";
$headers .= "From: Foo <foo@bar.com>\r\n";
$headers .= 'Content-Type: multipart/alternative;boundary="----=_Part_18243133_1346573420.1408991447668"';
// send email
wp_mail( $to, $subject, $message, $headers );
এবং আপনি যদি ডিফল্ট সামগ্রীর প্রকারটি পরিবর্তন করতে চান তবে ব্যবহার করুন:
add_filter( 'wp_mail_content_type', 'set_content_type' );
function set_content_type( $content_type ) {
return 'multipart/alternative';
}
এটি একাধিক বার্তা প্রেরণ করবে।
সুতরাং আপনি যদি বার্তার পুরো কাঁচা উত্সটি পরীক্ষা করেন তবে আপনি খেয়াল করবেন যে সামগ্রীটির ধরণটি একবার বাউন্ডারি ছাড়াই একবার যুক্ত করা হয়েছে:
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary="====f230673f9d7c359a81ffebccb88e5d61=="
MIME-Version: 1.0
Content-Type: multipart/alternative; charset=
এটাই সমস্যা।
সমস্যার উত্স নিহিত pluggable.php
- যদি আমরা এখানে কোথাও দেখি:
// Set Content-Type and charset
// If we don't have a content-type from the input headers
if ( !isset( $content_type ) )
$content_type = 'text/plain';
/**
* Filter the wp_mail() content type.
*
* @since 2.3.0
*
* @param string $content_type Default wp_mail() content type.
*/
$content_type = apply_filters( 'wp_mail_content_type', $content_type );
$phpmailer->ContentType = $content_type;
// Set whether it's plaintext, depending on $content_type
if ( 'text/html' == $content_type )
$phpmailer->IsHTML( true );
// If we don't have a charset from the input headers
if ( !isset( $charset ) )
$charset = get_bloginfo( 'charset' );
// Set the content-type and charset
/**
* Filter the default wp_mail() charset.
*
* @since 2.3.0
*
* @param string $charset Default email charset.
*/
$phpmailer->CharSet = apply_filters( 'wp_mail_charset', $charset );
// Set custom headers
if ( !empty( $headers ) ) {
foreach( (array) $headers as $name => $content ) {
$phpmailer->AddCustomHeader( sprintf( '%1$s: %2$s', $name, $content ) );
}
if ( false !== stripos( $content_type, 'multipart' ) && ! empty($boundary) )
$phpmailer->AddCustomHeader( sprintf( "Content-Type: %s;\n\t boundary=\"%s\"", $content_type, $boundary ) );
}
if ( !empty( $attachments ) ) {
foreach ( $attachments as $attachment ) {
try {
$phpmailer->AddAttachment($attachment);
} catch ( phpmailerException $e ) {
continue;
}
}
}
সম্ভাব্য সমাধান
সুতরাং আপনি ভাবছেন, কেন আপনি ট্র্যাকে এটি রিপোর্ট করেন নি ? আমি ইতিমধ্যে আছে । আমার আশ্চর্যের বিষয় হল, 5 বছর আগে একই সমস্যাটির রূপরেখা তৈরি করে একটি আলাদা টিকিট তৈরি করা হয়েছিল।
আসুন এটির মুখোমুখি হয়ে, দেড় দশক কেটে গেছে। ইন্টারনেট বছরগুলিতে, এটি 30 টির মতো। সমস্যাটি পরিষ্কারভাবে ছেড়ে দেওয়া হয়েছে এবং মূলত কখনই স্থির করা হবে না (... যদি না আমরা এখানে সমাধান না করি)।
আমি এখানে একটি দুর্দান্ত থ্রেড পেয়েছি যেখানে একটি সমাধান প্রস্তাব দেওয়া হচ্ছে, তবে তার সমাধানটি কাজ করার সময় এটি কাস্টম $headers
সেট নেই এমন ইমেলগুলি ভেঙে দেয় ।
আমরা এখানে প্রতিবার ক্রাশ। হয় মাল্টিপার্ট সংস্করণ সূক্ষ্মভাবে কাজ করে, এবং সাধারণ আনসেট $headers
বার্তাগুলি না করে বা শ্লোকটি দেয়।
আমরা যে সমাধানটি নিয়ে এসেছি তা হ'ল:
if ( false !== stripos( $content_type, 'multipart' ) && ! empty($boundary) ) {
$phpmailer->ContentType = $content_type . "; boundary=" . $boundary;
}
else {
$content_type = apply_filters( 'wp_mail_content_type', $content_type );
$phpmailer->ContentType = $content_type;
// Set whether it's plaintext, depending on $content_type
if ( 'text/html' == $content_type )
$phpmailer->IsHTML( true );
// If we don't have a charset from the input headers
if ( !isset( $charset ) )
$charset = get_bloginfo( 'charset' );
}
// Set the content-type and charset
/**
* Filter the default wp_mail() charset.
*
* @since 2.3.0
*
* @param string $charset Default email charset.
*/
$phpmailer->CharSet = apply_filters( 'wp_mail_charset', $charset );
// Set custom headers
if ( !empty( $headers ) ) {
foreach( (array) $headers as $name => $content ) {
$phpmailer->AddCustomHeader( sprintf( '%1$s: %2$s', $name, $content ) );
}
}
হ্যাঁ, আমি জানি, মূল ফাইলগুলি সম্পাদনা করা নিষিদ্ধ, আবার বসুন ... এটি মরিয়া ফিক্স এবং মূলটির জন্য কোনও স্থির সরবরাহের একটি দুর্বল প্রচেষ্টা ছিল।
আমাদের ফিক্সের সমস্যাটি হ'ল নতুন রেজিস্ট্রেশন, মন্তব্য, পাসওয়ার্ড রিসেট ইত্যাদির মতো ডিফল্ট ইমেলগুলি ফাঁকা বার্তা হিসাবে সরবরাহ করা হবে। সুতরাং আমাদের কাছে একটি ওয়ার্কিং wp_mail () স্ক্রিপ্ট রয়েছে যা মাল্টিপার্ট বার্তা প্রেরণ করবে তবে কিছুই নয় else
কি করো
মূল উদ্দেশ্যটি হ'ল মূল wp_mail () ফাংশন (কোনও কাস্টম সেন্ডমেল ফাংশন নয় ) ব্যবহার করে উভয় সাধারণ (প্লেইন পাঠ্য) এবং মাল্টিপার্ট বার্তাগুলি প্রেরণের একটি উপায় অনুসন্ধান করা ।
এটি সমাধান করার চেষ্টা করার সময়, আপনি যে মুখ্য সমস্যাটির মুখোমুখি হবেন তা হ'ল আপনি ডামি বার্তা প্রেরণে যে পরিমাণ সময় ব্যয় করেছেন তা পরীক্ষা করে এবং মূলত অ্যাসপিরিনের একটি বাক্স খোলার এবং মাইক্রোসফ্টে অভিশাপ দেওয়ার কারণ আপনি তাদের অভ্যস্ত দুর্ভাগ্যক্রমে ওয়ার্ডপ্রেস থাকাকালীন IE সমস্যাগুলি।
হালনাগাদ
@ ব্রোঞ্জার পোস্ট করা সমাধানটি $message
কন্টেন্ট-টাইপ কীড বিকল্পযুক্ত অ্যারে হতে দেয় । আমি নিশ্চিত করেছি যে এটি সমস্ত পরিস্থিতিতে কাজ করে।
সমস্যা সম্পর্কে সচেতনতা বাড়াতে অনুগ্রহ না হওয়া পর্যন্ত আমরা এই প্রশ্নটি উন্মুক্ত থাকতে দেব, সম্ভবত এটি এমন একটি স্তরে যেখানে এটি মূল স্থির করা হবে। $message
একটি স্ট্রিং হতে পারে এমন বিকল্প সমাধান পোস্ট করতে নির্দ্বিধায় ।
wp_mail()
ফাংশন প্লাগেবল আপনি (এবং অন্য সবাই, ব্যর্থ কোর ফিক্স) একজন ভাল সমাধান একটি আবশ্যক ব্যবহারযোগ্য প্লাগইন হিসাবে আপনার প্রতিস্থাপন সংজ্ঞা না হয় (WP- বিষয়বস্তু / মিউ-প্লাগ মধ্যে) না? কোন ক্ষেত্রে সেটিংয়ের পরে$phpmailer->ContentType = $content_type;
মাল্টপার্ট / বাউন্ডারি চেকটি সরানো হবে না (এলসিংয়ের চেয়ে) কাজ করবে না?