Làm thế nào để thêm tiêu đề vào email gửi đi?


8

Tôi muốn thêm một tiêu đề bổ sung cho các email gửi đi trên các trang web của mình, vì vậy tôi có thể dễ dàng xác định trang web nào đã gửi một email nhất định. (Tôi đặt một plugin chức năng tiêu chuẩn trên tất cả các trang web của mình, vì vậy điều này đủ dễ thực hiện và định cấu hình ứng dụng email của tôi để lọc và nếu không thì hành động trên tiêu đề này sẽ là một trình tiết kiệm thời gian tuyệt vời.)

Tôi nghĩ rằng đây sẽ là một vấn đề đơn giản để cắm vào wp_mailchức năng, nhưng rõ ràng là không.

Đầu tiên, tôi đã thử điều này:

add_filter('wp_mail', 'ws_add_site_header');
function ws_add_site_header() {
    return array('headers' => 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST));
}

Ở đây, mảng của tôi được ưu tiên hơn bất kỳ thứ gì khác đã sửa đổi cài đặt thư (giả sử, Gravity Forms), vì vậy các email HTML bắt đầu hiển thị dưới dạng HTML trần và không được định dạng độc đáo. Có ý nghĩa, vì tiêu đề Kiểu nội dung: mà GF thêm vào đã bị loại bỏ. Nhưng tiêu đề của tôi đã được thêm vào email. Vì những người khác cũng phụ thuộc vào việc nhận các email đẹp (tất cả các nhà phát triển nội dung và người dùng cuối của trang web của tôi, trong số những người khác tôi chắc chắn), điều đó không thể chấp nhận được.

Một trong những đồng nghiệp của tôi sau đó đã đề xuất định tuyến nội dung của tôi thông qua wp_parse_args (), do đó:

add_filter('wp_mail', 'ws_add_site_header');
function ws_add_site_header($args) {
    $new_header = array('headers' => 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST));
    return wp_parse_args($args, $new_header);
}

Với điều đó, như thể chức năng của tôi không tồn tại - tiêu đề của tôi không được thêm, nhưng các tiêu đề và cài đặt thư của người khác cũng không bị tước.

Cách chính xác để thêm tiêu đề vào email gửi đi mà không làm xáo trộn bất kỳ bộ lọc nào khác có thể tồn tại là gì?


Nếu bạn muốn giải pháp đơn giản, vui lòng sử dụng Plugin
Word

Plugin đó không thực sự giải quyết vấn đề. Nó thêm một "tiêu đề" vào phần thân của các email được tạo bởi WordPress; Tôi đã cố gắng để thêm một tiêu đề SMTP, đó là một điều hoàn toàn khác.
David E. Smith

Câu trả lời:


7

Nhờ những điều trên, tôi đã nhận ra sai lầm trung tâm của mình - Tôi hoàn toàn không nhận ra rằng các đối số được truyền vào là một mảng đa chiều.

Hiện tại, tôi đã triển khai lại chức năng như vậy:

function ws_add_site_header($email) {
    $email['headers'][] = 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST) ;
    return $email;               
}

Việc tôi đọc nguồn wp_mail () (xem: https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/pluggable.php#L235 ) khiến tôi tin rằng các tiêu đề thành phần có thể là một mảng, hoặc một chuỗi lớn, hoặc có thể là một sự nhầm lẫn khủng khiếp của cả hai, nhưng sử dụng một mảng có lẽ là lựa chọn an toàn / chính xác hơn.

Tôi thích các câu trả lời phpmailer khác nhau, nhưng có vẻ như sẽ sạch hơn một chút khi cố gắng thực hiện mọi thứ bằng cách sử dụng các phần mềm dựng sẵn của WordPress.


6

Đây là một thay thế bằng cách sử dụng trực tiếp AddCustomHeaderphương thức của PHPMailerthể hiện:

/**
 * Add a custom header.
 * $name value can be overloaded to contain
 * both header name and value (name:value)
 * @access public
 * @param string $name Custom header name
 * @param string $value Header value
 * @return void
 */
public function addCustomHeader($name, $value = null)
{
    if ($value === null) {
        // Value passed in as name:value
        $this->CustomHeader[] = explode(':', $name, 2);
    } else {
        $this->CustomHeader[] = array($name, $value);
    }
}

Ở đây chúng ta có thể thấy rằng có hai cách để sử dụng nó:

Ví dụ 1:

Ở đây chúng tôi chỉ truyền thông tin tiêu đề trong $namechuỗi đầu vào, được phân tách bằng:

add_action( 'phpmailer_init', function( $phpmailer )
{   
    $phpmailer->AddCustomHeader( 
       'X-WU-Site: ' . parse_url( get_site_url(), PHP_URL_HOST ) 
    );  
} );

Ví dụ # 2:

Đây là cả hai $name$valuekhông trống:

add_action( 'phpmailer_init', function( $phpmailer )
{   
    $phpmailer->AddCustomHeader( 
       'X-WU-Site', parse_url( get_site_url(), PHP_URL_HOST ) 
    );  
} );

Rất vui được biết câu trả lời này :) Nhưng tôi tò mò muốn biết nó sẽ có tác dụng gì nếu ai đó thiết lập nó $args['headers'] = 'key: value'thông qua các bộ lọc WP?
Sumit

Các phpmailer_initvụ cháy móc muộn hơn khi wp_mailbộ lọc được áp dụng và các tiêu đề tùy chỉnh từ bộ lọc đó cũng được bổ sung thông qua các AddCustomHeader()phương pháp, như xa như tôi hiểu nó. @sumit
bạch dương

3

PHP headerslà các chuỗi. Bạn không thể phân tích chúng thành mảng. Bạn cần thêm cho bạn tiêu đề bổ sung dưới dạng chuỗi với \r\nđể đảm bảo nó được thêm vào dòng tiếp theo.

Thí dụ:

add_filter('wp_mail', 'ws_add_site_header', 99);
function ws_add_site_header($args) {
    $args['headers'] .= !empty($args['headers']) ? "\r\n" : '';
    $args['headers'] .= 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST);
    return $args;
}

Ngoài ra, vui lòng lưu ý thêm bạn vào các tiêu đề bổ sung cuối cùng với mức độ ưu tiên 99để không có plugin nào khác có thể thay thế nó nếu nó không kiểm tra các tiêu đề đã có. Nếu cần làm cho nó 999.


1
Tôi đã đào qua nguồn wp_mail () và dường như nó có thể chấp nhận các tiêu đề dưới dạng mảng hoặc là các đoạn văn bản lớn và đôi khi cả hai trộn lẫn với nhau. Sẽ không khuyên làm điều đó nói chung nhưng nó luôn luôn là một lựa chọn.
David E. Smith

@ DavidE.Smith là chính xác. wp_mailchấp nhận một mảng cho đối số tiêu đề và WP sẽ đảm nhiệm việc thêm \ r \ n
Jan Beck

Xin lưu ý tôi đã đề cập PHP headerskhông wp_mailchấp nhận những gì . Ở tiêu đề cuối cùng là chuỗi. Điều gì không wp_mailchấp nhận không phải là câu hỏi! @JanBeck
Sumit

1
Vâng, đó là câu hỏi. Tại sao bạn đưa lên tiêu đề PHP?
Jan Beck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.