WordPress.org

Ready to get started?Download WordPress

Forums

WP Better Emails
[resolved] Converts html emails if sent after a plain text (fix provided) (8 posts)

  1. maximinime
    Member
    Posted 1 year ago #

    The check for whether an email is plain text is done in the set_content_type() method, but this permanently attaches the send_html() method as soon as it gets 1 plain text email. If a subsequent email is already html, the send_html() will still try to convert it.

    To fix this I added a check that runs per email:
    I added

    var $convert_this_email;

    after

    var $options = array();
    		var $page = '';

    and in set_content_type() I changed

    return $content_type = 'text/html';
    			}

    to

    $this->convert_this_email = true;
    				return 'text/html';
    			}
    			$this->convert_this_email = false;

    and in send_html() I changed

    function send_html($phpmailer) {

    to

    function send_html($phpmailer) {
    			if (!$this->convert_this_email)
    				return;

    http://wordpress.org/extend/plugins/wp-better-emails/

  2. hellonico
    Member
    Plugin Author

    Posted 1 year ago #

    Hi,

    HTML emails are not wrapped if they are already "text/html".

    Can you provide me the situation that make this happen ?

  3. maximinime
    Member
    Posted 1 year ago #

    wp_mail($email, $subject, $message, $message_headers);
    ...
    add_filter('wp_mail_content_type',create_function('', 'return "text/html";'));
    wp_mail($different_email, $different_subject, $html_message, $message_headers);

    The first call sends a plain text email that is converted by better emails. set_content_type() switched on converting for the first email, and left it on for all subsequent emails. The second call will now try to send its own html mail but better emails will still try to convert it.

  4. hellonico
    Member
    Plugin Author

    Posted 1 year ago #

    Yes, it will try but won't if the email is already text/html.

  5. maximinime
    Member
    Posted 1 year ago #

    I don't think you understand. The wp_mail_content_type filter is fired for every email send, and can be different each time. Your code attaches to phpmailer_init as soon as the first text/plain is encountered. It isn't reset after each email is sent, it stays attached. If another email is being sent that is already html, the function that is still attached to phpmailer_init fires anyway.

    Imagine a doorman. He asks everyone if they need help with their bags when he opens the door. As soon as one person says "yes", he will help everyone. If the next person says no, he will try to help them anyway, because one person said "yes".

  6. hellonico
    Member
    Plugin Author

    Posted 1 year ago #

    You're right, sorry, I read and answered so fast I didn't take the time to have a depth look at it. I'll had the fix in the next update.

    Thanks for your feedback.

  7. krbvroc1
    Member
    Posted 1 year ago #

    The patch provided above works but is not quite optimal. The problem is that set_content_type() calls add_action(). If you are sending 100 emails in a loop, you do not want to call add_action 100 times (even though WP will simply replace the existing hook)

    Below is my patch. How come this plugin has not been fixed yet? maximinime reported this 2 months ago and I emailed the author 1 month ago with the below patch.

    diff -Naur wp-better-emails/wpbe.php wp-better-emails-krb/wpbe.php
    --- wp-better-emails/wpbe.php	2013-03-18 10:33:38.944313476 -0400
    +++ wp-better-emails-krb/wpbe.php	2013-03-18 10:35:22.584185730 -0400
    @@ -1,6 +1,6 @@
     <?php
     /*
    -  Plugin Name: WP Better Emails
    +  Plugin Name: WP Better Emails (FIXED)
       Plugin URI: http://wordpress.org/extend/plugins/wp-better-emails/
       Description: Beautify the default text/plain WP mails into fully customizable HTML emails.
       Version: 0.2.4.1
    @@ -38,6 +38,7 @@
    
     		var $options = array();
     		var $page = '';
    +		var $send_as_html; //KRB
    
     		/**
     		 * Construct function (old way)
    @@ -63,6 +64,8 @@
     			add_filter('wp_mail_from', array($this, 'set_from_email'));
     			add_filter('wp_mail_content_type', array(&$this, 'set_content_type'), 100);
    
    +			add_action('phpmailer_init', array(&$this, 'send_html')); //KRB
    +
     			if (!is_admin())
     				return;
    
    @@ -77,7 +80,7 @@
     				add_action('admin_head', array(&$this, 'load_wp_tiny_mce'));
     			if( version_compare($wp_version, '3.2', '<') && version_compare($wp_version, '3.0.6', '>') )
     				add_action( 'admin_print_footer_scripts', 'wp_tiny_mce_preload_dialogs');
    -
    +
     			// Filters
     			add_filter('plugin_action_links_' . plugin_basename(__FILE__), array(&$this, 'settings_link'));
     			add_filter('contextual_help', array(&$this, 'contextual_help'), 10, 3);
    @@ -363,8 +366,10 @@
     		function set_content_type($content_type) {
     			// Only convert if the message is text/plain and the template is ok
     			if ($content_type == 'text/plain' && $this->check_template() === true) {
    -				add_action('phpmailer_init', array(&$this, 'send_html'));
    +				$this->send_as_html = true;  //KRB
     				return $content_type = 'text/html';
    +			} else {
    +				$this->send_as_html = false;		//KRB
     			}
     			return $content_type;
     		}
    @@ -376,16 +381,18 @@
     		 * @param object $phpmailer
     		 */
     		function send_html($phpmailer) {
    -			// Set the original plain text message
    -			$phpmailer->AltBody = wp_specialchars_decode($phpmailer->Body, ENT_QUOTES);
    -			// Clean < and > around text links in WP 3.1
    -			$phpmailer->Body = $this->esc_textlinks($phpmailer->Body);
    -			// Convert line breaks & make links clickable
    -			$phpmailer->Body = nl2br(make_clickable($phpmailer->Body));
    -			// Add template to message
    -			$phpmailer->Body = $this->set_email_template($phpmailer->Body);
    -			// Replace variables in email
    -			$phpmailer->Body = $this->template_vars_replacement($phpmailer->Body);
    +			if ( $this->send_as_html ) {
    +				// Set the original plain text message
    +				$phpmailer->AltBody = wp_specialchars_decode( $phpmailer->Body, ENT_QUOTES );
    +				// Clean < and > around text links in WP 3.1
    +				$phpmailer->Body = $this->esc_textlinks( $phpmailer->Body );
    +				// Convert line breaks & make links clickable
    +				$phpmailer->Body = nl2br( make_clickable( $phpmailer->Body ) );
    +				// Add template to message
    +				$phpmailer->Body = $this->set_email_template( $phpmailer->Body );
    +				// Replace variables in email
    +				$phpmailer->Body = $this->template_vars_replacement( $phpmailer->Body );
    +			}
     		}
    
     		/**
  8. hellonico
    Member
    Plugin Author

    Posted 1 year ago #

    Hi there,

    Sorry for the late update, I had no time for side projects.

    The plugin has just been updated, containing your fix. Thanks for your contribution.

    N.

Topic Closed

This topic has been closed to new replies.

About this Plugin

About this Topic

Tags

No tags yet.