요약
때문에 전송 WP 코어의 버그들로 여러 부분 과 함께 이메일 (HTML / 텍스트) wp_mail () (스팸 폴더에서 끝나는 이메일의 기회를 줄이기 위해)됩니다 아이러니하게도 도메인이 핫메일 (및 기타 Microsoft 이메일)에 의해 차단되면서 발생합니다.
이것은 누군가가 궁극적으로 핵심으로 구현 될 수있는 실행 가능한 솔루션을 찾도록 돕기 위해 세분화하려는 복잡한 문제입니다.
보람있는 독서가 될 것입니다. 의 시작하자...
버그
뉴스 레터 이메일이 스팸 폴더로 끝나지 않도록하는 가장 일반적인 조언은 여러 부분으로 된 메시지를 보내는 것입니다.
다중 부분 (mime)은 전자 메일 메시지의 HTML 및 TEXT 부분을 단일 전자 메일로 보내는 것을 말합니다. 클라이언트가 여러 부분으로 된 메시지를 받으면 HTML을 렌더링 할 수 있으면 HTML 버전을 수락하고 그렇지 않으면 일반 텍스트 버전을 표시합니다.
이것은 작동하는 것으로 입증되었습니다. Gmail로 보낼 때 모든 이메일은 기본받은 편지함을 통해 메시지를 여러 부분으로 변경할 때까지 스팸 폴더에 들어갔습니다. 좋은 물건.
이제 wp_mail ()을 통해 멀티 파트 메시지를 보낼 때 컨텐츠 유형 (multipart / *)을 경계와 함께 (사용자 정의로 설정 한 경우) 한 번,없는 경우와 함께 두 번 출력합니다. 이 동작은 전자 메일이 원시 메시지로 표시되고 모든 Microsoft (Hotmail, Outlook 등)를 포함한 일부 전자 메일에는 여러 부분으로 표시되지 않습니다 .
Microsoft는이 메시지를 정크로 표시하고, 수신되는 일부 메시지는 수동으로 플래그를 지정합니다. 불행히도 Microsoft 전자 메일 주소가 널리 사용됩니다. 가입자의 40 %가 사용합니다.
이것은 최근에 우리가 보낸 이메일 교환을 통해 Microsoft에 의해 확인됩니다.
메시지 플래그가 지정되면 도메인이 완전히 차단 됩니다. 이는 메시지가 스팸 폴더로 전송 되지 않으며 수신자에게 전혀 전달되지 않음 을 의미합니다.
지금까지 주요 도메인을 3 번 차단했습니다.
이것은 WP 코어의 버그이므로 멀티 파트 메시지를 보내는 모든 도메인이 차단되고 있습니다. 문제는 대부분의 웹 마스터가 이유를 모른다는 것입니다. 나는 연구를하고 포럼에서 다른 사용자가 이것을 논의 할 때 이것을 확인했습니다. 원시 코드를 탐구하고 이러한 유형의 전자 메일 메시지가 어떻게 작동하는지 잘 알고 있어야합니다.
코드로 나누자
핫메일 / 아웃룩 계정을 만듭니다. 그런 다음 다음 코드를 실행하십시오.
// 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;
}
}
}
잠재적 인 솔루션
당신이 궁금해 그래서, 왜에서이 문제를보고하지 않은 TRAC ? 나는 이미있다 . 놀랍게도, 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 () 스크립트가 있습니다.
해야 할 일
여기서 목표 는 핵심 wp_mail () 함수 (사용자 정의 sendmail 함수가 아님 )를 사용하여 일반 (일반 텍스트) 메시지와 멀티 파트 메시지 를 모두 보내는 방법을 찾는 것 입니다.
이 문제를 해결하려고 할 때 발생하는 가장 큰 문제는 더미 메시지를 보내고 받는지 확인하고 기본적으로 아스피린 상자를 열고 기본적으로 Microsoft에 대한 저주를받는 데 소비하는 시간입니다. gremlin이 불행히도 WordPress 인 동안 IE 문제가 발생합니다.
최신 정보
@bonger가 게시 한 솔루션을 사용하면 $message
콘텐츠 유형 키 대체가 포함 된 배열이 될 수 있습니다. 모든 시나리오에서 작동한다는 것을 확인했습니다.
현상금이 다가올 때까지이 질문을 계속 열어두고 문제에 대한 인식을 제고 할 수 있습니다. $message
문자열이 될 수 있는 대체 솔루션을 자유롭게 게시하십시오 .
wp_mail()
기능은 (그리고 다른 사람, 실패의 핵심 수정)에 대한 좋은 솔루션이없는 플러그 인 (WP - 콘텐츠 / MU-플러그인에) 반드시 사용 플러그인으로 교체를 정의되지 않는 이유는 무엇입니까?$phpmailer->ContentType = $content_type;
(엘싱 대신) 설정 후 멀티 파트 / 경계 검사를 이동하지 않는 경우는 ?