özet
Çünkü gönderen WP Çekirdek bir hata, bir çok parçalı olan e-postalar (html / metin) wp_mail () (istenmeyen klasörleri içinde biten e-postalar olasılığını azaltmak için) olacaktır ironik alan adı Hotmail (ve diğer Microsoft e-postalar) tarafından engellenmiş olan sonuçlanır.
Bu, birinin özünde sonunda uygulanabilecek uygulanabilir bir çözüm bulmasına yardımcı olmak amacıyla, ayrıntılı olarak parçalara ayırmayı hedefleyeceğim karmaşık bir sorundur.
Ödüllendirici bir okuma olacak. Hadi başlayalım...
Böcek
Bülteninizin e-postalarının spam klasörlerinde sona ermesini önlemek için en yaygın tavsiye, çok parçalı iletiler göndermektir.
Çok parçalı (mime), bir e-posta mesajının hem HTML hem de METİN kısmını tek bir e-posta ile göndermeyi ifade eder. Bir istemci çok parçalı bir mesaj aldığında, HTML oluşturabilirse HTML sürümünü kabul eder, aksi halde düz metin sürümünü sunar.
Bu iş kanıtlanmış. Gmail’e gönderirken, tüm e-postalarımız ana gelen kutusuna geldiklerinde iletileri çok parçalı olarak değiştirinceye kadar spam klasörlerine indi. Harika şeyler.
Şimdi, wp_mail () üzerinden çok parçalı mesajlar gönderilirken, İçerik Türünü (çok parçalı / *) iki kez, bir kez sınırla (özel olarak ayarlanmışsa) ve bir kez de çıktı olarak verir. Bu davranış, e-postanın ham bir mesaj olarak görüntülenmesine ve tüm Microsoft (Hotmail, Outlook vb. Gibi) bazı e-postalarda çok parçalı olmamasına neden olur.
Microsoft bu mesajı önemsiz olarak işaretler ve gelen birkaç mesaj alıcı tarafından manuel olarak işaretlenir. Ne yazık ki , Microsoft e-posta adresleri yaygın olarak kullanılmaktadır. Abonelerimizin% 40'ı kullanıyor.
Bu, yakın zamanda sahip olduğumuz bir e-posta alışverişi yoluyla Microsoft tarafından onaylandı.
Mesajların işaretlenmesi, alanın tamamen bloke olmasıyla sonuçlanacaktır . Bu, mesajın spam klasörüne gönderilmeyeceği , alıcıya bile teslim edilmeyeceği anlamına gelir .
Ana etki alanımız şimdiye kadar 3 kez engellendi.
Bu WP çekirdeğinde bir hata olduğundan, çok parçalı mesajlar gönderen her alan engelleniyor. Sorun şu ki çoğu webmaster nedenini bilmiyor. Araştırmamı yaptığım ve forumlardaki vb. Tartışan diğer kullanıcıları gördüğümde bunu doğruladım. Ham koda girmeyi ve bu tür e-posta iletilerinin nasıl çalıştığı hakkında iyi bir bilgiye sahip olmayı gerektirir.
Hadi koda koyalım
Bir hotmail / outlook hesabı oluşturun. Ardından, aşağıdaki kodu çalıştırın:
// 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 );
Varsayılan içerik türünü değiştirmek istiyorsanız , şunu kullanın:
add_filter( 'wp_mail_content_type', 'set_content_type' );
function set_content_type( $content_type ) {
return 'multipart/alternative';
}
Bu çok parçalı bir mesaj gönderir.
Dolayısıyla, mesajın tüm kaynak kodunu kontrol ederseniz, içerik türünün bir kez sınırlama olmadan iki kez eklendiğini fark edeceksiniz:
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary="====f230673f9d7c359a81ffebccb88e5d61=="
MIME-Version: 1.0
Content-Type: multipart/alternative; charset=
Sorun bu.
Sorunun kaynağı yatıyor pluggable.php
- eğer burada bir yere bakarsak:
// 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;
}
}
}
Potansiyel çözümler
Merak ediyorsun, neden bunu Trac'te bildirmedin ? Bende zaten var . Benim için büyük sürpriz bir farklı bilet 5 yıl aynı sorunu özetleyen önce oluşturuldu.
Kabul edelim, yarım on yıl oldu. İnternet yıllarında, bu daha çok 30'a benziyor. Sorun açıkça terk edildi ve temelde asla çözülmeyecek (… burada çözemezsek).
Burada bir çözüm öneren harika bir konu buldum , ancak çözümü işe yarıyorken, özel $headers
ayarları olmayan e-postaları kırıyor .
Her seferinde kaza yaptığımız yer burasıdır. Çok parçalı sürüm iyi çalışıyor ve normal olarak ayarlanmamış $headers
mesajlar çalışmıyor ya da ayeti yok.
Karşılaştığımız çözüm şuydu:
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 ) );
}
}
Evet, biliyorum, çekirdek dosyaları düzenlemek tabudur, arkanıza yaslanın ... bu çaresiz bir düzeltme ve çekirdek için bir düzeltme sağlamak için kötü bir girişimdi.
Düzeltmemizdeki sorun, yeni kayıtlar, yorum, şifre sıfırlama vb. Gibi varsayılan e-postaların boş mesajlar olarak gönderilmesidir. Böylece, çok parçalı mesajlar gönderecek ancak başka bir şey göndermeyecek çalışan bir wp_mail () betiğimiz var.
Ne yapalım
Buradaki amaç , çekirdek wp_mail () işlevini (özel bir sendmail işlevi değil ) kullanarak hem normal (düz metin) hem de çok parçalı iletiler göndermenin bir yolunu bulmaktır .
Bunu çözmeye çalışırken, karşılaşacağınız asıl sorun, sahte mesajlar göndermek, alıp almadıklarını kontrol etmek ve temelde bir aspirin kutusu açmak ve Microsoft'ta küfür etmek için harcayacağınız zamandır. IE gremlin burada ne yazık ki WordPress ise sorunları.
Güncelleme
@Bonger tarafından yayınlanan çözüm $message
, içerik tipi anahtarlı alternatifler içeren bir dizi olmasına izin verir . Tüm senaryolarda işe yaradığını onayladım.
Bu sorunun, sorunla ilgili farkındalığı artırmak için, belki de çekirdeğin sabitleneceği bir seviyeye gelene kadar açık kalmasına izin vereceğiz. $message
Bir dize olabilir alternatif bir çözüm göndermek için çekinmeyin .
wp_mail
olduğunu takılabilir . Orijinal işlevi bir eklentiye kopyalayın, istediğiniz gibi düzenleyin ve eklentiyi etkinleştirin. WordPress, düzenlenmiş işlevinizi orijinal yerine kullanmak üzere kullanır ve çekirdek düzenlemeye gerek kalmaz.
wp_mail()
işlev size (ve herkes, başarısız çekirdek düzeltme) için iyi bir çözüm değildir fişlidir (wp-content / mu-plugins) mutlaka kullanılması eklentisi olarak değiştirilmesini tanımlayan değil? Bu durumda, çok parçalı / sınır kontrolünü ayardan sonra ayarlamaya$phpmailer->ContentType = $content_type;
(hareket etmektense) hareket ettirmek işe yaramaz mıydı?