hooks - Is there a way to send HTML formatted emails with WordPress' wp_mail() function?

admin2025-01-07  6

Is there an action_hook or something similar that could help me achieve this?

I tried adding markup in a PHP string variable and just fired off an email with the wp_mail() function like so:

$email_to = '[email protected]';
$email_subject = 'Email subject';
$email_body = "<html><body><h1>Hello World!</h1></body></html>";
$send_mail = wp_mail($email_to, $email_subject, $email_body);

But it showed up as plain text?

Any ideas?

Is there an action_hook or something similar that could help me achieve this?

I tried adding markup in a PHP string variable and just fired off an email with the wp_mail() function like so:

$email_to = '[email protected]';
$email_subject = 'Email subject';
$email_body = "<html><body><h1>Hello World!</h1></body></html>";
$send_mail = wp_mail($email_to, $email_subject, $email_body);

But it showed up as plain text?

Any ideas?

Share Improve this question edited Dec 13, 2019 at 17:13 butlerblog 5,0713 gold badges26 silver badges42 bronze badges asked Sep 6, 2011 at 21:08 racl101racl101 1,5652 gold badges12 silver badges15 bronze badges 1
  • Check this amazing article on wp_mail() phparticles.com/wordpress/how-to-use-wp-mail-with-wordpress – Mr.Happy Commented Oct 4, 2020 at 12:34
Add a comment  | 

5 Answers 5

Reset to default 79

from wp_mail codex page:

The default content type is 'text/plain' which does not allow using HTML. However, you can set the content type of the email by using the 'wp_mail_content_type' filter.

// In theme's functions.php or plug-in code:

function wpse27856_set_content_type(){
    return "text/html";
}
add_filter( 'wp_mail_content_type','wpse27856_set_content_type' );

Now, every time that wp_mail is called, whether it is in your code, in WordPress's code, in a plugin's code, or in a theme's code, then MIME type will be set to text/html. If there are any invocations of wp_mail that send plain text, those invocations will now break. So be warned.

As an alternative, you can specify the Content-Type HTTP header in the $headers parameter:

$to = '[email protected]';
$subject = 'The subject';
$body = 'The email body content';
$headers = array('Content-Type: text/html; charset=UTF-8');

wp_mail( $to, $subject, $body, $headers );

Don't forget to remove the content type filter after you use the wp_mail function. Following the accepted answer naming you should do this after wp_mail is executed:

remove_filter( 'wp_mail_content_type','wpse27856_set_content_type' );

Check this ticket here - Reset content-type to avoid conflicts -- http://core.trac.wordpress.org/ticket/23578

Another easy way I'm going to share below. Even you can style your mail body as your wish. Maybe it's helpful for you.

$email_to = '[email protected]';
$email_subject = 'Email subject';

// <<<EOD it is PHP heredoc syntax
$email_body = <<<EOD
This is your new <b style="color: red; font-style: italic;">password</b> : {$password}
EOD;

$headers = ['Content-Type: text/html; charset=UTF-8'];

$send_mail = wp_mail( $email_to, $email_subject, $email_body, $headers );

More about PHP heredoc syntax https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

Use ob_start, because this will allow you to use WP variables/functions like bloginfo etc.

make a PHP file and paste your HTML in that file(use wp variables inside that php file if needed).

Use the below code:

 $to = 'Email Address';
 $subject = 'Your Subject';

 ob_start();
 include(get_stylesheet_directory() . '/email-template.php');//Template File Path
 $body = ob_get_contents();
 ob_end_clean();

 $headers = array('Content-Type: text/html; charset=UTF-8','From: Test <[email protected]>');
 wp_mail( $to, $subject, $body, $headers );

this will keep your code clean and due to ob_start we will also save the time of loading the file.

转载请注明原文地址:http://conceptsofalgorithm.com/Algorithm/1736263744a915.html

最新回复(0)