Version Description
- ADDED: Logging messages to trace bug where the stats don't get updated
- FIXED: Order of preference for tags.
- ADDED: Support for css inlining, recipient preservation, whether or not to have the view content link in your Mandrill dashboard, tracking, signing, and return-path domains, using subaccounts, per recipient metadata, pool of ips, email scheduling, and asynchronous sending in wpMandrill::mail().
- REMOVED: The concept of 'verified domains' was completely removed from the plugin.
- ADDED: Tracking options in the settings page
- ADDED: New filter, mandrill_nl2br, that can be used to modify the value of the "Replace Line Feeds by
" setting, for specific messages. Check the How-To to see how it works. - FIXED: Removing wrongly formatted attachments from the payload
Download this release
Release Info
Developer | MC_Will |
Plugin | wpMandrill |
Version | 1.33 |
Comparing to | |
See all releases |
Code changes from version 1.32 to 1.33
- how-tos.php +25 -2
- lib/mandrill.class.php +11 -3
- readme.txt +23 -6
- wpmandrill.php +152 -115
how-tos.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
class wpMandrill_HowTos {
|
4 |
static function show($section) {
|
5 |
$section = strtolower($section);
|
6 |
-
if ( !in_array($section, array('intro','auto','regular','filter','direct','regions') ) ) $section = 'auto';
|
7 |
|
8 |
$title = '';
|
9 |
|
@@ -19,6 +19,9 @@ class wpMandrill_HowTos {
|
|
19 |
case 'filter':
|
20 |
$title = __('Mandrill: How to modify a certain email using the <em>mandrill_payload</em> WordPress filter.', 'wpmandrill');
|
21 |
break;
|
|
|
|
|
|
|
22 |
case 'direct':
|
23 |
$title = __('Mandrill: How to send emails from within your plugins.', 'wpmandrill');
|
24 |
break;
|
@@ -129,7 +132,27 @@ HTML;
|
|
129 |
</span>
|
130 |
';
|
131 |
}
|
132 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
133 |
static function showSectionDirect() {
|
134 |
return '
|
135 |
<span class="setting-description">
|
3 |
class wpMandrill_HowTos {
|
4 |
static function show($section) {
|
5 |
$section = strtolower($section);
|
6 |
+
if ( !in_array($section, array('intro','auto','regular','filter', 'nl2br', 'direct','regions') ) ) $section = 'auto';
|
7 |
|
8 |
$title = '';
|
9 |
|
19 |
case 'filter':
|
20 |
$title = __('Mandrill: How to modify a certain email using the <em>mandrill_payload</em> WordPress filter.', 'wpmandrill');
|
21 |
break;
|
22 |
+
case 'nl2br':
|
23 |
+
$title = __('Mandrill: How to tell WordPress to change line feeds by BR tags in a certain email using the <em>mandrill_nl2br</em> WordPress filter.', 'wpmandrill');
|
24 |
+
break;
|
25 |
case 'direct':
|
26 |
$title = __('Mandrill: How to send emails from within your plugins.', 'wpmandrill');
|
27 |
break;
|
132 |
</span>
|
133 |
';
|
134 |
}
|
135 |
+
|
136 |
+
static function showSectionNl2br() {
|
137 |
+
return '
|
138 |
+
<span class="setting-description">
|
139 |
+
<p>'.__('That\'s easy! Just do something like this:', 'wpmandrill').'</p>
|
140 |
+
<p>
|
141 |
+
<blockquote><pre>
|
142 |
+
<?php
|
143 |
+
function forgotMyPasswordEmails($nl2br, $message) {
|
144 |
+
if ( in_array( \'wp-retrieve_password\', $message[\'tags\'][\'automatic\'] ) ) {
|
145 |
+
$nl2br = true;
|
146 |
+
}
|
147 |
+
return $nl2br;
|
148 |
+
}
|
149 |
+
add_filter( \'mandrill_nl2br\', \'forgotMyPasswordEmails\' );
|
150 |
+
?>
|
151 |
+
</pre></blockquote>
|
152 |
+
</p>
|
153 |
+
</span>
|
154 |
+
';
|
155 |
+
}
|
156 |
static function showSectionDirect() {
|
157 |
return '
|
158 |
<span class="setting-description">
|
lib/mandrill.class.php
CHANGED
@@ -385,16 +385,24 @@ class Mandrill {
|
|
385 |
* @return array|Mandrill_Exception
|
386 |
*/
|
387 |
function messages_send($message) {
|
388 |
-
|
|
|
|
|
|
|
|
|
389 |
}
|
390 |
-
|
391 |
/**
|
392 |
* @link https://mandrillapp.com/api/docs/messages.html#method=send-template
|
393 |
*
|
394 |
* @return array|Mandrill_Exception
|
395 |
*/
|
396 |
function messages_send_template($template_name, $template_content, $message) {
|
397 |
-
|
|
|
|
|
|
|
|
|
398 |
}
|
399 |
|
400 |
function http_request($url, $fields = array(), $method = 'POST') {
|
385 |
* @return array|Mandrill_Exception
|
386 |
*/
|
387 |
function messages_send($message) {
|
388 |
+
$async = $message['async'];
|
389 |
+
$ip_pool = $message['ip_pool'];
|
390 |
+
$send_at = $message['send_at'];
|
391 |
+
|
392 |
+
return $this->request('messages/send', array('message' => $message, 'async' => $async, 'ip_pool' => $ip_pool, 'send_at' => $send_at) );
|
393 |
}
|
394 |
+
|
395 |
/**
|
396 |
* @link https://mandrillapp.com/api/docs/messages.html#method=send-template
|
397 |
*
|
398 |
* @return array|Mandrill_Exception
|
399 |
*/
|
400 |
function messages_send_template($template_name, $template_content, $message) {
|
401 |
+
$async = $message['async'];
|
402 |
+
$ip_pool = $message['ip_pool'];
|
403 |
+
$send_at = $message['send_at'];
|
404 |
+
|
405 |
+
return $this->request('messages/send-template', compact('template_name', 'template_content','message', 'async', 'ip_pool', 'send_at') );
|
406 |
}
|
407 |
|
408 |
function http_request($url, $fields = array(), $method = 'POST') {
|
readme.txt
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
Contributors: MC_Will
|
3 |
Tags: mandrill, mailchimp, transactional email, email, email reliability, smtp, wp_mail, email templates
|
4 |
Requires at least: 3.0
|
5 |
-
Tested up to: 3.
|
6 |
Stable tag: trunk
|
7 |
License: GPLv2
|
8 |
|
@@ -10,12 +10,10 @@ The wpMandrill plugin sends emails that are generated by WordPress through Mandr
|
|
10 |
|
11 |
== Description ==
|
12 |
|
13 |
-
This plugin uses [Mandrill API](http://mandrillapp.com/api/docs/) to send outgoing emails from your Wordpress installation. It replaces the wp_mail function included with WordPress.
|
14 |
|
15 |
Emails are tracked and automatically tagged for statistics within the Mandrill Dashboard. You can also add general tags to every email sent, as well as particular tags based on selected emails defined by your requirements.
|
16 |
|
17 |
-
You can send certain types of attachments (image/*, text/* and application/pdf).
|
18 |
-
|
19 |
You can also use your own templates that have been added to your MailChimp account and shared with your Mandrill account.
|
20 |
|
21 |
There are a few levels of integrations between your WordPress installation and this plugin:
|
@@ -23,7 +21,6 @@ There are a few levels of integrations between your WordPress installation and t
|
|
23 |
1. The simplest option: Install it, configure it, and wpMandrill will start sending your emails through Mandrill.
|
24 |
1. If you need to fine tune certain emails, you can change any email by creating a filter for the **mandrill_payload** hook.
|
25 |
1. For further customization, we've exposed a function that allows you to send emails from within your plugins, instead of the regular wp_mail function: **wpMandrill::mail**
|
26 |
-
1. If you need Mandrill Powers, we've included a full-featured class in the file lib/mandrill.class.php, where you'll find every call that can be done through the Mandrill API.
|
27 |
|
28 |
This plugin is currently released as **beta** for early adopter evaluation and finalizing of the initial feature set.
|
29 |
|
@@ -59,7 +56,18 @@ $message['force_native'] = true;
|
|
59 |
|
60 |
= My emails are broken and show weird CSS code =
|
61 |
|
62 |
-
In version 1.09, we added a setting that allows you to tell the plugin if you want to replace your line feeds by <br/>. Try playing with that switch.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
63 |
|
64 |
= Is there any way to check what's going on? =
|
65 |
|
@@ -99,6 +107,15 @@ If your account has more than 20 senders registered or more than 40 tags used, t
|
|
99 |
4. Dashboard widget Settings
|
100 |
|
101 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
102 |
= 1.32 =
|
103 |
* FIXED: Reordering constructors of Mandrill class to prevent the "Redefining already defined constructor" message
|
104 |
* UPDATE: Favoring self:: instead of wpMandrill::
|
2 |
Contributors: MC_Will
|
3 |
Tags: mandrill, mailchimp, transactional email, email, email reliability, smtp, wp_mail, email templates
|
4 |
Requires at least: 3.0
|
5 |
+
Tested up to: 3.8
|
6 |
Stable tag: trunk
|
7 |
License: GPLv2
|
8 |
|
10 |
|
11 |
== Description ==
|
12 |
|
13 |
+
This plugin uses [Mandrill API](http://mandrillapp.com/api/docs/) to send outgoing emails, with or without attachments, from your Wordpress installation. It replaces the wp_mail function included with WordPress.
|
14 |
|
15 |
Emails are tracked and automatically tagged for statistics within the Mandrill Dashboard. You can also add general tags to every email sent, as well as particular tags based on selected emails defined by your requirements.
|
16 |
|
|
|
|
|
17 |
You can also use your own templates that have been added to your MailChimp account and shared with your Mandrill account.
|
18 |
|
19 |
There are a few levels of integrations between your WordPress installation and this plugin:
|
21 |
1. The simplest option: Install it, configure it, and wpMandrill will start sending your emails through Mandrill.
|
22 |
1. If you need to fine tune certain emails, you can change any email by creating a filter for the **mandrill_payload** hook.
|
23 |
1. For further customization, we've exposed a function that allows you to send emails from within your plugins, instead of the regular wp_mail function: **wpMandrill::mail**
|
|
|
24 |
|
25 |
This plugin is currently released as **beta** for early adopter evaluation and finalizing of the initial feature set.
|
26 |
|
56 |
|
57 |
= My emails are broken and show weird CSS code =
|
58 |
|
59 |
+
In version 1.09, we added a setting that allows you to tell the plugin if you want to replace your line feeds by <br/>. Try playing with that switch.
|
60 |
+
|
61 |
+
If it works for certain emails but doesn't work for others, you might want to modify this setting using the **mandrill_nl2br** filter. For example, if you don't want to use this filter for the "forgot password" emails, add something like this to your theme's functions.php file:
|
62 |
+
|
63 |
+
function my_function($nl2br, $message) {
|
64 |
+
if ( in_array('wp_retrieve_password', $message['tags']['automatic']) ) {
|
65 |
+
$nl2br = false;
|
66 |
+
}
|
67 |
+
return $nl2br;
|
68 |
+
}
|
69 |
+
add_filter('mandrill_nl2br', 'my_function');
|
70 |
+
|
71 |
|
72 |
= Is there any way to check what's going on? =
|
73 |
|
107 |
4. Dashboard widget Settings
|
108 |
|
109 |
== Changelog ==
|
110 |
+
= 1.33 =
|
111 |
+
* ADDED: Logging messages to trace bug where the stats don't get updated
|
112 |
+
* FIXED: Order of preference for tags.
|
113 |
+
* ADDED: Support for css inlining, recipient preservation, whether or not to have the view content link in your Mandrill dashboard, tracking, signing, and return-path domains, using subaccounts, per recipient metadata, pool of ips, email scheduling, and asynchronous sending in wpMandrill::mail().
|
114 |
+
* REMOVED: The concept of 'verified domains' was completely removed from the plugin.
|
115 |
+
* ADDED: Tracking options in the settings page
|
116 |
+
* ADDED: New filter, mandrill_nl2br, that can be used to modify the value of the "Replace Line Feeds by <br>" setting, for specific messages. Check the How-To to see how it works.
|
117 |
+
* FIXED: Removing wrongly formatted attachments from the payload
|
118 |
+
|
119 |
= 1.32 =
|
120 |
* FIXED: Reordering constructors of Mandrill class to prevent the "Redefining already defined constructor" message
|
121 |
* UPDATE: Favoring self:: instead of wpMandrill::
|
wpmandrill.php
CHANGED
@@ -5,7 +5,7 @@ Description: wpMandrill sends emails, generated by WordPress using Mandrill.
|
|
5 |
Author: Mandrill
|
6 |
Author URI: http://mandrillapp.com/
|
7 |
Plugin URI: http://connect.mailchimp.com/integrations/wpmandrill
|
8 |
-
Version: 1.
|
9 |
Text Domain: wpmandrill
|
10 |
*/
|
11 |
/* Copyright 2012 MailChimp (email : will@mailchimp.com )
|
@@ -105,6 +105,11 @@ class wpMandrill {
|
|
105 |
add_settings_field('from-email', __('FROM Email', 'wpmandrill'), array(__CLASS__, 'askFromEmail'), 'wpmandrill', 'wpmandrill-addresses');
|
106 |
add_settings_field('reply-to', __('Reply-To Email', 'wpmandrill'), array(__CLASS__, 'askReplyTo'), 'wpmandrill', 'wpmandrill-addresses');
|
107 |
|
|
|
|
|
|
|
|
|
|
|
108 |
// Template
|
109 |
add_settings_section('wpmandrill-templates', __('General Design', 'wpmandrill'), '__return_false', 'wpmandrill');
|
110 |
add_settings_field('template', __('Template', 'wpmandrill'), array(__CLASS__, 'askTemplate'), 'wpmandrill', 'wpmandrill-templates');
|
@@ -130,7 +135,7 @@ class wpMandrill {
|
|
130 |
add_action('wpm_update_stats', array(__CLASS__,'saveProcessedStats'));
|
131 |
|
132 |
if ( !wp_next_scheduled( 'wpm_update_stats' ) ) {
|
133 |
-
wp_schedule_event( current_time( 'timestamp' ), 'hourly', 'wpm_update_stats');
|
134 |
}
|
135 |
|
136 |
register_deactivation_hook( __FILE__, array(__CLASS__,'deactivate') );
|
@@ -214,15 +219,13 @@ class wpMandrill {
|
|
214 |
|
215 |
$ok = array();
|
216 |
$ok['account'] = ( !self::isConnected() ) ? ' class="missing"' : '';
|
217 |
-
$ok['domains'] = ( $ok['account'] != '' || !count(self::ListVerifiedDomains()) ) ? ' class="missing"' : '';
|
218 |
$ok['email'] = ( $ok['account'] != '' || !self::getFromEmail() ) ? ' class="missing"' : '';
|
219 |
|
220 |
$requirements = '';
|
221 |
-
if ($ok['account'] . $ok['
|
222 |
$requirements = '<p>' . __('To use this plugin you will need:', 'wpmandrill') . '</p>'
|
223 |
. '<ol>'
|
224 |
. '<li'.$ok['account'].'>'. __('Your Mandrill account.', 'wpmandrill') . '</li>'
|
225 |
-
. '<li'.$ok['domains'].'>' . __('At least one domain defined in your Mandrill account.', 'wpmandrill') . '</li>'
|
226 |
. '<li'.$ok['email'].'>' . __('A valid sender email address.', 'wpmandrill') . '</li>'
|
227 |
. '</ol>';
|
228 |
}
|
@@ -231,7 +234,7 @@ class wpMandrill {
|
|
231 |
. '<p>' . __('Once you have properly configured the settings, the plugin will take care of all the emails sent through your WordPress installation.', 'wpmandrill').'</p>'
|
232 |
. '<p>' . __('However, if you need to customize any part of the email before sending, you can do so by using the WordPress filter <strong>mandrill_payload</strong>.', 'wpmandrill').'</p>'
|
233 |
. '<p>' . __('This filter has the same structure as Mandrill\'s API call <a href="http://mandrillapp.com/api/docs/messages.html#method=send" target="_blank">/messages/send</a>, except that it can have one additional parameter when the email is based on a template. The parameter is called "<em>template</em>", which is an associative array of two elements (the first element, a string whose key is "<em>template_name</em>", and a second parameter whose key is "<em>template_content</em>". Its value is an array with the same structure of the parameter "<em>template_content</em>" in the call <a href="http://mandrillapp.com/api/docs/messages.html#method=send-template" target="_blank">/messages/send-template</a>.)', 'wpmandrill').'</p>'
|
234 |
-
. '<p>' . __('Note that if you\'re sending additional headers in your emails, the only valid headers are <em>From:</em>, <em>Reply-To:</em>, and <em>X-*:</em>. <em>Bcc:</em> is also valid, but Mandrill will send the blind carbon copy to only the first address, and the remaining will be silently
|
235 |
. '<p>' . __('Also note that if any error occurs while sending the email, the plugin will try to send the message again using the native WordPress mailing capabilities.', 'wpmandrill').'</p>'
|
236 |
. '<p>' . __('Confirm that any change you made to the payload is in line with the <a href="http://mandrillapp.com/api/docs/" target="_blank">Mandrill\'s API\'s documentation</a>. Also, the <em>X-*:</em> headers, must be in line with the <a href="http://help.mandrill.com/forums/20689696-smtp-integration" target="_blank">SMTP API documentation</a>. By using this plugin, you agree that you and your website will adhere to <a href="http://www.mandrill.com/terms/" target="_blank">Mandrill\'s Terms of Use</a> and <a href="http://mandrill.com/privacy/" target="_blank">Privacy Policy</a>.', 'wpmandrill').'</p>'
|
237 |
. '<p>' . __('if you have any question about Mandrill or this plugin, visit the <a href="http://help.mandrill.com/" target="_blank">Mandrill\'s Support Center</a>.', 'wpmandrill').'</p>'
|
@@ -373,6 +376,7 @@ class wpMandrill {
|
|
373 |
echo wpMandrill_HowTos::show('auto');
|
374 |
echo wpMandrill_HowTos::show('regular');
|
375 |
echo wpMandrill_HowTos::show('filter');
|
|
|
376 |
echo wpMandrill_HowTos::show('direct');
|
377 |
|
378 |
?>
|
@@ -390,7 +394,7 @@ class wpMandrill {
|
|
390 |
static function formValidate($input) {
|
391 |
self::getConnected();
|
392 |
|
393 |
-
if (
|
394 |
add_settings_error(
|
395 |
'wpmandrill',
|
396 |
'from-email',
|
@@ -400,7 +404,6 @@ class wpMandrill {
|
|
400 |
|
401 |
|
402 |
$input['from_username'] = '';
|
403 |
-
$input['from_domain'] = '';
|
404 |
}
|
405 |
|
406 |
// Preserving the Reply-To address
|
@@ -429,9 +432,8 @@ jQuery(document).bind( 'ready', function() {
|
|
429 |
|
430 |
/******************************************************************
|
431 |
** Helper functions
|
432 |
-
|
433 |
-
|
434 |
-
|
435 |
/**
|
436 |
* @return mixed
|
437 |
*/
|
@@ -498,21 +500,17 @@ jQuery(document).bind( 'ready', function() {
|
|
498 |
return self::getOption('from_username');
|
499 |
}
|
500 |
|
501 |
-
/**
|
502 |
-
* @return string|boolean
|
503 |
-
*/
|
504 |
-
static function getFromDomain() {
|
505 |
-
|
506 |
-
return self::getOption('from_domain');
|
507 |
-
}
|
508 |
-
|
509 |
/**
|
510 |
* @return string|boolean
|
511 |
*/
|
512 |
static function getFromEmail() {
|
513 |
-
|
514 |
-
|
|
|
|
|
|
|
515 |
}
|
|
|
516 |
}
|
517 |
|
518 |
/**
|
@@ -547,6 +545,22 @@ jQuery(document).bind( 'ready', function() {
|
|
547 |
return self::getOption('nl2br');
|
548 |
}
|
549 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
550 |
/**
|
551 |
* @return string|boolean
|
552 |
*/
|
@@ -600,42 +614,6 @@ jQuery(document).bind( 'ready', function() {
|
|
600 |
|
601 |
return ( isset( $_GET['page'] ) && $_GET['page'] == 'wpmandrill' . $sufix);
|
602 |
}
|
603 |
-
|
604 |
-
/**
|
605 |
-
* Return the list of the verified domains for the current users. Or false.
|
606 |
-
*
|
607 |
-
* @return array|bool
|
608 |
-
*/
|
609 |
-
static function listVerifiedDomains() {
|
610 |
-
$domains = array();
|
611 |
-
|
612 |
-
self::getConnected();
|
613 |
-
if ( !self::isConnected() ) return $domains;
|
614 |
-
|
615 |
-
try {
|
616 |
-
$domains = self::$mandrill->senders_domains();
|
617 |
-
if ( !empty($domains) ) $domains = array_values($domains);
|
618 |
-
} catch ( Exception $e ) {}
|
619 |
-
|
620 |
-
return $domains;
|
621 |
-
}
|
622 |
-
|
623 |
-
|
624 |
-
/**
|
625 |
-
* @return boolean
|
626 |
-
*/
|
627 |
-
static function isDomainEnabled($domain) {
|
628 |
-
if ( empty($domain) ) return false;
|
629 |
-
|
630 |
-
$domains = self::ListVerifiedDomains();
|
631 |
-
foreach ( $domains as $curdomain ) {
|
632 |
-
if ( strtolower($curdomain['domain']) == strtolower($domain) ) {
|
633 |
-
return true;
|
634 |
-
}
|
635 |
-
}
|
636 |
-
|
637 |
-
return false;
|
638 |
-
}
|
639 |
|
640 |
/**
|
641 |
* @return boolean
|
@@ -674,7 +652,6 @@ jQuery(document).bind( 'ready', function() {
|
|
674 |
<ol>
|
675 |
<li>That your web server has either cURL installed or is able to use fsock*() functions (if you don\'t know what this means, you may want to check with your hosting provider for more details);</li>
|
676 |
<li>That your API key is active (this can be viewed on the <a href="https://mandrillapp.com/settings/index" target="_blank">SMTP & API Credentials</a> page in your Mandrill account);</li>
|
677 |
-
<li>That the domain name you\'re using above is listed in the <a href="https://mandrillapp.com/settings/sending-domains" target="_blank">Sending Domains</a> for your Mandrill account.</li>
|
678 |
</ol>', 'wpmandrill') . $test->get_error_message());
|
679 |
|
680 |
return array_map('wp_strip_all_tags', $input);
|
@@ -726,31 +703,11 @@ jQuery(document).bind( 'ready', function() {
|
|
726 |
echo '<div class="inside">';
|
727 |
|
728 |
$from_username = self::getFromUsername();
|
729 |
-
$from_domain = self::getFromDomain();
|
730 |
$from_email = self::getFromEmail();
|
731 |
|
732 |
-
$domains = self::ListVerifiedDomains();
|
733 |
-
if ( !count($domains) ) {
|
734 |
-
|
735 |
-
_e('No domains found.', 'wpmandrill');
|
736 |
-
|
737 |
-
if ( $from_email ) {
|
738 |
-
self::setOption('from_username', false);
|
739 |
-
self::setOption('from_domain', false);
|
740 |
-
self::setOption('from_email', false);
|
741 |
-
}
|
742 |
-
|
743 |
-
echo '</div>';
|
744 |
-
return;
|
745 |
-
}
|
746 |
-
|
747 |
?><?php _e('This address will be used as the sender of the outgoing emails:', 'wpmandrill'); ?><br />
|
748 |
-
<input id="from_username" name="wpmandrill[from_username]" type="text" value="<?php esc_attr_e($from_username);?>"
|
749 |
-
<
|
750 |
-
foreach( $domains as $curdomain ) {
|
751 |
-
?><option value="<?php esc_attr_e($curdomain['domain']); ?>" <?php selected($curdomain['domain'], $from_domain); ?>><?php esc_html_e($curdomain['domain']); ?></option><?php
|
752 |
-
}
|
753 |
-
?></select><br/><span class="setting-description"><small><em><?php _e('If you need to add a new domain, please visit your <a href="https://mandrillapp.com/settings/sending-domains" target="_blank">Mandrill Settings</a>', 'wpmandrill'); ?></em></small></span><?php
|
754 |
|
755 |
echo '</div>';
|
756 |
}
|
@@ -761,7 +718,7 @@ jQuery(document).bind( 'ready', function() {
|
|
761 |
$from_name = self::getFromName();
|
762 |
|
763 |
?><?php _e('Name the recipients will see in their email clients:', 'wpmandrill'); ?><br />
|
764 |
-
<input name="wpmandrill[from_name]" type="text" value="<?php esc_attr_e($from_name); ?>">
|
765 |
<?php
|
766 |
|
767 |
echo '</div>';
|
@@ -805,7 +762,7 @@ jQuery(document).bind( 'ready', function() {
|
|
805 |
}
|
806 |
|
807 |
?><?php _e('Select the template to use:', 'wpmandrill'); ?><br />
|
808 |
-
<select name="wpmandrill[template]">
|
809 |
<option value="">-None-</option><?php
|
810 |
foreach( $templates as $curtemplate ) {
|
811 |
?><option value="<?php esc_attr_e($curtemplate['name']); ?>" <?php selected($curtemplate['name'], $template); ?>><?php esc_html_e($curtemplate['name']); ?></option><?php
|
@@ -814,14 +771,37 @@ jQuery(document).bind( 'ready', function() {
|
|
814 |
|
815 |
echo '</div>';
|
816 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
817 |
static function asknl2br() {
|
818 |
$nl2br = self::getnl2br();
|
819 |
if ( $nl2br == '' ) $nl2br = 0;
|
820 |
?>
|
821 |
<div class="inside">
|
822 |
<?php _e('Replace all line feeds ("\n") by <br/> in the message body?', 'wpmandrill'); ?>
|
823 |
-
<input name="wpmandrill[nl2br]" type="checkbox" <?php echo checked($nl2br,1); ?> value='1' /><br/>
|
824 |
-
<span class="setting-description"
|
|
|
|
|
|
|
|
|
825 |
</div><?php
|
826 |
}
|
827 |
|
@@ -831,7 +811,7 @@ jQuery(document).bind( 'ready', function() {
|
|
831 |
$tags = self::getTags();
|
832 |
|
833 |
?><?php _e('If there are tags that you want appended to every call, list them here, one per line:', 'wpmandrill'); ?><br />
|
834 |
-
<textarea name="wpmandrill[tags]" cols="25" rows="3"><?php echo $tags; ?></textarea><br/>
|
835 |
<span class="setting-description"><small><em><?php _e('Also keep in mind that you can add or remove tags using the <em><a href="#" onclick="jQuery(\'a#contextual-help-link\').trigger(\'click\');return false;">mandrill_payload</a></em> WordPress filter.', 'wpmandrill'); ?></em></small></span>
|
836 |
<?php
|
837 |
|
@@ -862,7 +842,7 @@ jQuery(document).bind( 'ready', function() {
|
|
862 |
*/
|
863 |
static function getTestEmailOption($field) {
|
864 |
|
865 |
-
$email = get_option('wpmandrill
|
866 |
|
867 |
if( isset( $email[$field] ) )
|
868 |
return $email[$field];
|
@@ -880,7 +860,10 @@ jQuery(document).bind( 'ready', function() {
|
|
880 |
*/
|
881 |
static function getRawStatistics() {
|
882 |
self::getConnected();
|
883 |
-
if ( !self::isConnected() )
|
|
|
|
|
|
|
884 |
|
885 |
$stats = array();
|
886 |
$final = array();
|
@@ -890,16 +873,21 @@ jQuery(document).bind( 'ready', function() {
|
|
890 |
$data = array();
|
891 |
$container = self::$mandrill->tags_list();
|
892 |
foreach ( $container as $tag ) {
|
893 |
-
|
894 |
-
|
|
|
|
|
895 |
}
|
896 |
$stats['tags'] = $data;
|
897 |
|
898 |
$data = array();
|
899 |
$container = self::$mandrill->senders_list();
|
900 |
foreach ( $container as $sender ) {
|
901 |
-
|
902 |
-
|
|
|
|
|
|
|
903 |
}
|
904 |
$stats['senders'] = $data;
|
905 |
|
@@ -941,8 +929,11 @@ jQuery(document).bind( 'ready', function() {
|
|
941 |
|
942 |
static function getProcessedStats() {
|
943 |
$stats = self::getRawStatistics();
|
944 |
-
if ( empty($stats) )
|
945 |
-
|
|
|
|
|
|
|
946 |
$graph_data = array();
|
947 |
for ( $i = 0; $i < 24; $i++ ) {
|
948 |
$graph_data['hourly']['delivered'][ sprintf('"%02s"',$i) ] = 0;
|
@@ -1023,12 +1014,15 @@ jQuery(document).bind( 'ready', function() {
|
|
1023 |
*/
|
1024 |
static function getCurrentStats() {
|
1025 |
|
1026 |
-
$stats = get_transient('wpmandrill
|
1027 |
if ( empty($stats) ) {
|
1028 |
-
|
1029 |
-
|
1030 |
-
if ( empty($stats) ) $stats = self::saveProcessedStats();
|
1031 |
|
|
|
|
|
|
|
|
|
1032 |
}
|
1033 |
|
1034 |
return $stats;
|
@@ -1042,8 +1036,10 @@ jQuery(document).bind( 'ready', function() {
|
|
1042 |
static function saveProcessedStats() {
|
1043 |
$stats = self::GetProcessedStats();
|
1044 |
if ( !empty($stats) ) {
|
1045 |
-
set_transient('wpmandrill
|
1046 |
-
update_option('wpmandrill
|
|
|
|
|
1047 |
}
|
1048 |
|
1049 |
return $stats;
|
@@ -1601,7 +1597,19 @@ JS;
|
|
1601 |
* @param array $merge_vars Per-recipient merge variables, which override global merge variables with the same name.
|
1602 |
* @param array $google_analytics_domains An array of strings indicating for which any matching URLs will automatically have Google Analytics parameters appended to their query string automatically.
|
1603 |
* @param array|string $google_analytics_campaign Optional string indicating the value to set for the utm_campaign tracking parameter. If this isn't provided the email's from address will be used instead.
|
1604 |
-
* @param array $meta_data Associative array of user metadata. Mandrill will store this metadata and make it available for retrieval. In addition, you can select up to 10 metadata fields to index and make searchable using the Mandrill search api.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1605 |
* @return array|WP_Error
|
1606 |
*/
|
1607 |
static function mail( $to, $subject, $html, $headers = '', $attachments = array(),
|
@@ -1609,8 +1617,8 @@ JS;
|
|
1609 |
$from_name = '',
|
1610 |
$from_email = '',
|
1611 |
$template_name = '',
|
1612 |
-
$track_opens =
|
1613 |
-
$track_clicks =
|
1614 |
$url_strip_qs = false,
|
1615 |
$merge = true,
|
1616 |
$global_merge_vars = array(),
|
@@ -1618,9 +1626,22 @@ JS;
|
|
1618 |
$google_analytics_domains = array(),
|
1619 |
$google_analytics_campaign = array(),
|
1620 |
$meta_data = array(),
|
1621 |
-
$important = false
|
1622 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1623 |
) {
|
|
|
|
|
|
|
1624 |
try {
|
1625 |
extract( apply_filters( 'wp_mail', compact( 'to', 'subject', 'html', 'headers', 'attachments' ) ) );
|
1626 |
$message = compact('html', 'subject', 'from_name', 'from_email', 'to', 'headers', 'attachments',
|
@@ -1631,7 +1652,18 @@ JS;
|
|
1631 |
'google_analytics_domains',
|
1632 |
'google_analytics_campaign',
|
1633 |
'meta_data',
|
1634 |
-
'important'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1635 |
);
|
1636 |
return self::sendEmail($message, $tags, $template_name, $track_opens, $track_clicks);
|
1637 |
} catch ( Exception $e ) {
|
@@ -1716,7 +1748,7 @@ JS;
|
|
1716 |
break;
|
1717 |
|
1718 |
case 'bcc':
|
1719 |
-
// TODO: Mandrill's API only accept one BCC address. Other addresses will be silently
|
1720 |
$bcc = array_merge( (array) $bcc, explode( ',', $content ) );
|
1721 |
|
1722 |
$message['bcc_address'] = $bcc[0];
|
@@ -1746,7 +1778,7 @@ JS;
|
|
1746 |
$message['headers']['Reply-To'] = trim(self::getReplyTo());
|
1747 |
}
|
1748 |
|
1749 |
-
// Checking
|
1750 |
if( !is_array($message['to']) ) $message['to'] = explode(',', $message['to']);
|
1751 |
|
1752 |
$processed_to = array();
|
@@ -1759,18 +1791,20 @@ JS;
|
|
1759 |
}
|
1760 |
$message['to'] = $processed_to;
|
1761 |
|
1762 |
-
// Checking
|
1763 |
if ( empty($message['from_email']) ) $message['from_email'] = self::getFromEmail();
|
1764 |
if ( empty($message['from_name'] ) ) $message['from_name'] = self::getFromName();
|
1765 |
|
1766 |
-
// Checking
|
1767 |
$message['tags'] = self::findTags($tags);
|
1768 |
|
1769 |
-
// Checking
|
1770 |
if ( !empty($message['attachments']) ) {
|
1771 |
$message['attachments'] = self::processAttachments($message['attachments']);
|
1772 |
if ( is_wp_error($message['attachments']) ) {
|
1773 |
throw new Exception('Invalid attachment (check http://eepurl.com/nXMa1 for supported file types).');
|
|
|
|
|
1774 |
}
|
1775 |
}
|
1776 |
// Default values for other parameters
|
@@ -1779,7 +1813,9 @@ JS;
|
|
1779 |
$message['track_clicks']= $track_clicks;
|
1780 |
|
1781 |
// Supporting editable sections: Common transformations for the HTML part
|
1782 |
-
|
|
|
|
|
1783 |
if ( is_array($message['html']) ) {
|
1784 |
foreach ($message['html'] as &$value){
|
1785 |
$value['content'] = preg_replace('#<(https?://[^*]+)>#', '$1', $value['content']);
|
@@ -1820,11 +1856,12 @@ JS;
|
|
1820 |
}
|
1821 |
}
|
1822 |
|
1823 |
-
// Letting
|
1824 |
$message['from_email'] = apply_filters('wp_mail_from', $message['from_email']);
|
1825 |
$message['from_name'] = apply_filters('wp_mail_from_name', $message['from_name']);
|
1826 |
$message = apply_filters('mandrill_payload', $message);
|
1827 |
|
|
|
1828 |
if ( isset($message['force_native']) && $message['force_native'] ) throw new Exception('Manually falling back to native wp_mail()');
|
1829 |
|
1830 |
// Setting the tags property correctly to be received by the Mandrill's API
|
@@ -1832,7 +1869,7 @@ JS;
|
|
1832 |
if ( !is_array($message['tags']['general']) ) $message['tags']['general'] = array();
|
1833 |
if ( !is_array($message['tags']['automatic']) ) $message['tags']['automatic'] = array();
|
1834 |
|
1835 |
-
$message['tags'] = array_merge( $message['tags']['
|
1836 |
|
1837 |
// Sending the message
|
1838 |
if ( empty($message['template']) || empty($message['template']['name']) || empty($message['template']['content']) ) {
|
@@ -1851,8 +1888,8 @@ JS;
|
|
1851 |
}
|
1852 |
}
|
1853 |
|
1854 |
-
static function processAttachments($attachments) {
|
1855 |
-
if ( !is_array($attachments) )
|
1856 |
$attachments = explode( "\n", str_replace( "\r\n", "\n", $attachments ) );
|
1857 |
|
1858 |
foreach ( $attachments as $index => $attachment ) {
|
5 |
Author: Mandrill
|
6 |
Author URI: http://mandrillapp.com/
|
7 |
Plugin URI: http://connect.mailchimp.com/integrations/wpmandrill
|
8 |
+
Version: 1.33
|
9 |
Text Domain: wpmandrill
|
10 |
*/
|
11 |
/* Copyright 2012 MailChimp (email : will@mailchimp.com )
|
105 |
add_settings_field('from-email', __('FROM Email', 'wpmandrill'), array(__CLASS__, 'askFromEmail'), 'wpmandrill', 'wpmandrill-addresses');
|
106 |
add_settings_field('reply-to', __('Reply-To Email', 'wpmandrill'), array(__CLASS__, 'askReplyTo'), 'wpmandrill', 'wpmandrill-addresses');
|
107 |
|
108 |
+
// Tracking
|
109 |
+
add_settings_section('wpmandrill-tracking', __('Tracking', 'wpmandrill'), '__return_false', 'wpmandrill');
|
110 |
+
add_settings_field('trackopens', __('Track opens', 'wpmandrill'), array(__CLASS__, 'askTrackOpens'), 'wpmandrill', 'wpmandrill-tracking');
|
111 |
+
add_settings_field('trackclicks', __('Track clicks', 'wpmandrill'), array(__CLASS__, 'askTrackClicks'), 'wpmandrill', 'wpmandrill-tracking');
|
112 |
+
|
113 |
// Template
|
114 |
add_settings_section('wpmandrill-templates', __('General Design', 'wpmandrill'), '__return_false', 'wpmandrill');
|
115 |
add_settings_field('template', __('Template', 'wpmandrill'), array(__CLASS__, 'askTemplate'), 'wpmandrill', 'wpmandrill-templates');
|
135 |
add_action('wpm_update_stats', array(__CLASS__,'saveProcessedStats'));
|
136 |
|
137 |
if ( !wp_next_scheduled( 'wpm_update_stats' ) ) {
|
138 |
+
wp_schedule_event( current_time( 'timestamp', 1 ), 'hourly', 'wpm_update_stats');
|
139 |
}
|
140 |
|
141 |
register_deactivation_hook( __FILE__, array(__CLASS__,'deactivate') );
|
219 |
|
220 |
$ok = array();
|
221 |
$ok['account'] = ( !self::isConnected() ) ? ' class="missing"' : '';
|
|
|
222 |
$ok['email'] = ( $ok['account'] != '' || !self::getFromEmail() ) ? ' class="missing"' : '';
|
223 |
|
224 |
$requirements = '';
|
225 |
+
if ($ok['account'] . $ok['email'] != '' ) {
|
226 |
$requirements = '<p>' . __('To use this plugin you will need:', 'wpmandrill') . '</p>'
|
227 |
. '<ol>'
|
228 |
. '<li'.$ok['account'].'>'. __('Your Mandrill account.', 'wpmandrill') . '</li>'
|
|
|
229 |
. '<li'.$ok['email'].'>' . __('A valid sender email address.', 'wpmandrill') . '</li>'
|
230 |
. '</ol>';
|
231 |
}
|
234 |
. '<p>' . __('Once you have properly configured the settings, the plugin will take care of all the emails sent through your WordPress installation.', 'wpmandrill').'</p>'
|
235 |
. '<p>' . __('However, if you need to customize any part of the email before sending, you can do so by using the WordPress filter <strong>mandrill_payload</strong>.', 'wpmandrill').'</p>'
|
236 |
. '<p>' . __('This filter has the same structure as Mandrill\'s API call <a href="http://mandrillapp.com/api/docs/messages.html#method=send" target="_blank">/messages/send</a>, except that it can have one additional parameter when the email is based on a template. The parameter is called "<em>template</em>", which is an associative array of two elements (the first element, a string whose key is "<em>template_name</em>", and a second parameter whose key is "<em>template_content</em>". Its value is an array with the same structure of the parameter "<em>template_content</em>" in the call <a href="http://mandrillapp.com/api/docs/messages.html#method=send-template" target="_blank">/messages/send-template</a>.)', 'wpmandrill').'</p>'
|
237 |
+
. '<p>' . __('Note that if you\'re sending additional headers in your emails, the only valid headers are <em>From:</em>, <em>Reply-To:</em>, and <em>X-*:</em>. <em>Bcc:</em> is also valid, but Mandrill will send the blind carbon copy to only the first address, and the remaining will be silently discarded.', 'wpmandrill').'</p>'
|
238 |
. '<p>' . __('Also note that if any error occurs while sending the email, the plugin will try to send the message again using the native WordPress mailing capabilities.', 'wpmandrill').'</p>'
|
239 |
. '<p>' . __('Confirm that any change you made to the payload is in line with the <a href="http://mandrillapp.com/api/docs/" target="_blank">Mandrill\'s API\'s documentation</a>. Also, the <em>X-*:</em> headers, must be in line with the <a href="http://help.mandrill.com/forums/20689696-smtp-integration" target="_blank">SMTP API documentation</a>. By using this plugin, you agree that you and your website will adhere to <a href="http://www.mandrill.com/terms/" target="_blank">Mandrill\'s Terms of Use</a> and <a href="http://mandrill.com/privacy/" target="_blank">Privacy Policy</a>.', 'wpmandrill').'</p>'
|
240 |
. '<p>' . __('if you have any question about Mandrill or this plugin, visit the <a href="http://help.mandrill.com/" target="_blank">Mandrill\'s Support Center</a>.', 'wpmandrill').'</p>'
|
376 |
echo wpMandrill_HowTos::show('auto');
|
377 |
echo wpMandrill_HowTos::show('regular');
|
378 |
echo wpMandrill_HowTos::show('filter');
|
379 |
+
echo wpMandrill_HowTos::show('nl2br');
|
380 |
echo wpMandrill_HowTos::show('direct');
|
381 |
|
382 |
?>
|
394 |
static function formValidate($input) {
|
395 |
self::getConnected();
|
396 |
|
397 |
+
if ( empty($input['from_username']) ) {
|
398 |
add_settings_error(
|
399 |
'wpmandrill',
|
400 |
'from-email',
|
404 |
|
405 |
|
406 |
$input['from_username'] = '';
|
|
|
407 |
}
|
408 |
|
409 |
// Preserving the Reply-To address
|
432 |
|
433 |
/******************************************************************
|
434 |
** Helper functions
|
435 |
+
*******************************************************************/
|
436 |
+
|
|
|
437 |
/**
|
438 |
* @return mixed
|
439 |
*/
|
500 |
return self::getOption('from_username');
|
501 |
}
|
502 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
503 |
/**
|
504 |
* @return string|boolean
|
505 |
*/
|
506 |
static function getFromEmail() {
|
507 |
+
$from_email = self::getOption('from_username');
|
508 |
+
if ( !empty($from_email) && !strpos($from_email, '@') ) {
|
509 |
+
$from_email = self::getOption('from_username') . '@' . self::getOption('from_domain');
|
510 |
+
self::setOption('from_username', $from_email);
|
511 |
+
self::setOption('from_domain', null);
|
512 |
}
|
513 |
+
return $from_email;
|
514 |
}
|
515 |
|
516 |
/**
|
545 |
return self::getOption('nl2br');
|
546 |
}
|
547 |
|
548 |
+
/**
|
549 |
+
* @return string|boolean
|
550 |
+
*/
|
551 |
+
static function getTrackOpens() {
|
552 |
+
|
553 |
+
return self::getOption('trackopens');
|
554 |
+
}
|
555 |
+
|
556 |
+
/**
|
557 |
+
* @return string|boolean
|
558 |
+
*/
|
559 |
+
static function getTrackClicks() {
|
560 |
+
|
561 |
+
return self::getOption('trackclicks');
|
562 |
+
}
|
563 |
+
|
564 |
/**
|
565 |
* @return string|boolean
|
566 |
*/
|
614 |
|
615 |
return ( isset( $_GET['page'] ) && $_GET['page'] == 'wpmandrill' . $sufix);
|
616 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
617 |
|
618 |
/**
|
619 |
* @return boolean
|
652 |
<ol>
|
653 |
<li>That your web server has either cURL installed or is able to use fsock*() functions (if you don\'t know what this means, you may want to check with your hosting provider for more details);</li>
|
654 |
<li>That your API key is active (this can be viewed on the <a href="https://mandrillapp.com/settings/index" target="_blank">SMTP & API Credentials</a> page in your Mandrill account);</li>
|
|
|
655 |
</ol>', 'wpmandrill') . $test->get_error_message());
|
656 |
|
657 |
return array_map('wp_strip_all_tags', $input);
|
703 |
echo '<div class="inside">';
|
704 |
|
705 |
$from_username = self::getFromUsername();
|
|
|
706 |
$from_email = self::getFromEmail();
|
707 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
708 |
?><?php _e('This address will be used as the sender of the outgoing emails:', 'wpmandrill'); ?><br />
|
709 |
+
<input id="from_username" name="wpmandrill[from_username]" type="text" value="<?php esc_attr_e($from_username);?>">
|
710 |
+
<br/><?php
|
|
|
|
|
|
|
|
|
711 |
|
712 |
echo '</div>';
|
713 |
}
|
718 |
$from_name = self::getFromName();
|
719 |
|
720 |
?><?php _e('Name the recipients will see in their email clients:', 'wpmandrill'); ?><br />
|
721 |
+
<input id="from_name" name="wpmandrill[from_name]" type="text" value="<?php esc_attr_e($from_name); ?>">
|
722 |
<?php
|
723 |
|
724 |
echo '</div>';
|
762 |
}
|
763 |
|
764 |
?><?php _e('Select the template to use:', 'wpmandrill'); ?><br />
|
765 |
+
<select id="template" name="wpmandrill[template]">
|
766 |
<option value="">-None-</option><?php
|
767 |
foreach( $templates as $curtemplate ) {
|
768 |
?><option value="<?php esc_attr_e($curtemplate['name']); ?>" <?php selected($curtemplate['name'], $template); ?>><?php esc_html_e($curtemplate['name']); ?></option><?php
|
771 |
|
772 |
echo '</div>';
|
773 |
}
|
774 |
+
|
775 |
+
static function askTrackOpens() {
|
776 |
+
$track = self::getTrackOpens();
|
777 |
+
if ( $track == '' ) $track = 0;
|
778 |
+
?>
|
779 |
+
<div class="inside">
|
780 |
+
<input id="trackopens" name="wpmandrill[trackopens]" type="checkbox" <?php echo checked($track,1); ?> value='1' /><br/>
|
781 |
+
</div><?php
|
782 |
+
}
|
783 |
+
|
784 |
+
static function askTrackClicks() {
|
785 |
+
$track = self::getTrackClicks();
|
786 |
+
if ( $track == '' ) $track = 0;
|
787 |
+
?>
|
788 |
+
<div class="inside">
|
789 |
+
<input id="trackclicks" name="wpmandrill[trackclicks]" type="checkbox" <?php echo checked($track,1); ?> value='1' /><br/>
|
790 |
+
</div><?php
|
791 |
+
}
|
792 |
+
|
793 |
static function asknl2br() {
|
794 |
$nl2br = self::getnl2br();
|
795 |
if ( $nl2br == '' ) $nl2br = 0;
|
796 |
?>
|
797 |
<div class="inside">
|
798 |
<?php _e('Replace all line feeds ("\n") by <br/> in the message body?', 'wpmandrill'); ?>
|
799 |
+
<input id="nl2br" name="wpmandrill[nl2br]" type="checkbox" <?php echo checked($nl2br,1); ?> value='1' /><br/>
|
800 |
+
<span class="setting-description">
|
801 |
+
<em>
|
802 |
+
<?php _e('<small>If you are sending HTML emails already keep this setting deactivated.<br/>But if you are sending text only emails (WordPress default) this option might help your emails look better.</small>', 'wpmandrill'); ?><br/>
|
803 |
+
<?php _e('<small>You can change the value of this setting on the fly by using the <strong><a href="#" onclick="jQuery(\'a#contextual-help-link\').trigger(\'click\');return false;">wpmandrill_nl2br</a></strong> filter.</small>', 'wpmandrill'); ?>
|
804 |
+
</em></span>
|
805 |
</div><?php
|
806 |
}
|
807 |
|
811 |
$tags = self::getTags();
|
812 |
|
813 |
?><?php _e('If there are tags that you want appended to every call, list them here, one per line:', 'wpmandrill'); ?><br />
|
814 |
+
<textarea id="tags" name="wpmandrill[tags]" cols="25" rows="3"><?php echo $tags; ?></textarea><br/>
|
815 |
<span class="setting-description"><small><em><?php _e('Also keep in mind that you can add or remove tags using the <em><a href="#" onclick="jQuery(\'a#contextual-help-link\').trigger(\'click\');return false;">mandrill_payload</a></em> WordPress filter.', 'wpmandrill'); ?></em></small></span>
|
816 |
<?php
|
817 |
|
842 |
*/
|
843 |
static function getTestEmailOption($field) {
|
844 |
|
845 |
+
$email = get_option('wpmandrill-test');
|
846 |
|
847 |
if( isset( $email[$field] ) )
|
848 |
return $email[$field];
|
860 |
*/
|
861 |
static function getRawStatistics() {
|
862 |
self::getConnected();
|
863 |
+
if ( !self::isConnected() ) {
|
864 |
+
error_log( date('Y-m-d H:i:s') . " wpMandrill::getRawStatistics: Not Connected to Mandrill \n" );
|
865 |
+
return array();
|
866 |
+
}
|
867 |
|
868 |
$stats = array();
|
869 |
$final = array();
|
873 |
$data = array();
|
874 |
$container = self::$mandrill->tags_list();
|
875 |
foreach ( $container as $tag ) {
|
876 |
+
try {
|
877 |
+
$data[$tag['tag']] = self::$mandrill->tags_info($tag['tag']);
|
878 |
+
if ( count($data) >= 40 ) break;
|
879 |
+
} catch ( Exception $e ) {}
|
880 |
}
|
881 |
$stats['tags'] = $data;
|
882 |
|
883 |
$data = array();
|
884 |
$container = self::$mandrill->senders_list();
|
885 |
foreach ( $container as $sender ) {
|
886 |
+
try {
|
887 |
+
$sender_info_data = self::$mandrill->senders_info($sender['address']);
|
888 |
+
$data[$sender['address']] = $sender_info_data;
|
889 |
+
if ( count($data) >= 20 ) break;
|
890 |
+
} catch ( Exception $e ) {}
|
891 |
}
|
892 |
$stats['senders'] = $data;
|
893 |
|
929 |
|
930 |
static function getProcessedStats() {
|
931 |
$stats = self::getRawStatistics();
|
932 |
+
if ( empty($stats) ) {
|
933 |
+
error_log( date('Y-m-d H:i:s') . " wpMandrill::getProcessedStats (Empty Response from ::getRawStatistics)\n" );
|
934 |
+
return $stats;
|
935 |
+
}
|
936 |
+
|
937 |
$graph_data = array();
|
938 |
for ( $i = 0; $i < 24; $i++ ) {
|
939 |
$graph_data['hourly']['delivered'][ sprintf('"%02s"',$i) ] = 0;
|
1014 |
*/
|
1015 |
static function getCurrentStats() {
|
1016 |
|
1017 |
+
$stats = get_transient('wpmandrill-stats');
|
1018 |
if ( empty($stats) ) {
|
1019 |
+
error_log( date('Y-m-d H:i:s') . " wpMandrill::getCurrentStats (Empty Transient. Getting persistent copy)\n" );
|
1020 |
+
$stats = get_option('wpmandrill-stats');
|
|
|
1021 |
|
1022 |
+
if ( empty($stats) ) {
|
1023 |
+
error_log( date('Y-m-d H:i:s') . " wpMandrill::getCurrentStats (Empty persistent copy. Getting data from Mandrill)\n" );
|
1024 |
+
$stats = self::saveProcessedStats();
|
1025 |
+
}
|
1026 |
}
|
1027 |
|
1028 |
return $stats;
|
1036 |
static function saveProcessedStats() {
|
1037 |
$stats = self::GetProcessedStats();
|
1038 |
if ( !empty($stats) ) {
|
1039 |
+
set_transient('wpmandrill-stats', $stats, 60 * 60);
|
1040 |
+
update_option('wpmandrill-stats', $stats);
|
1041 |
+
} else {
|
1042 |
+
error_log( date('Y-m-d H:i:s') . " wpMandrill::saveProcessedStats (Empty Response from ::GetProcessedStats)\n" );
|
1043 |
}
|
1044 |
|
1045 |
return $stats;
|
1597 |
* @param array $merge_vars Per-recipient merge variables, which override global merge variables with the same name.
|
1598 |
* @param array $google_analytics_domains An array of strings indicating for which any matching URLs will automatically have Google Analytics parameters appended to their query string automatically.
|
1599 |
* @param array|string $google_analytics_campaign Optional string indicating the value to set for the utm_campaign tracking parameter. If this isn't provided the email's from address will be used instead.
|
1600 |
+
* @param array $meta_data Associative array of user metadata. Mandrill will store this metadata and make it available for retrieval. In addition, you can select up to 10 metadata fields to index and make searchable using the Mandrill search api.
|
1601 |
+
* @param boolean $important Set the important flag to true for the current email
|
1602 |
+
* @param boolean $inline_css whether or not to automatically inline all CSS styles provided in the message HTML - only for HTML documents less than 256KB in size
|
1603 |
+
* @param boolean $preserve_recipients whether or not to expose all recipients in to "To" header for each email
|
1604 |
+
* @param boolean $view_content_link set to false to remove content logging for sensitive emails
|
1605 |
+
* @param string $tracking_domain a custom domain to use for tracking opens and clicks instead of mandrillapp.com
|
1606 |
+
* @param string $signing_domain a custom domain to use for SPF/DKIM signing instead of mandrill (for "via" or "on behalf of" in email clients)
|
1607 |
+
* @param string $return_path_domain a custom domain to use for the messages's return-path
|
1608 |
+
* @param string $subaccount the unique id of a subaccount for this message - must already exist or will fail with an error
|
1609 |
+
* @param array $recipient_metadata Per-recipient metadata that will override the global values specified in the metadata parameter.
|
1610 |
+
* @param string $ip_pool the name of the dedicated ip pool that should be used to send the message. If you do not have any dedicated IPs, this parameter has no effect. If you specify a pool that does not exist, your default pool will be used instead.
|
1611 |
+
* @param string $send_at when this message should be sent as a UTC timestamp in YYYY-MM-DD HH:MM:SS format. Read more about it at https://mandrillapp.com/api/docs/messages.JSON.html#method=send
|
1612 |
+
* @param boolean $async enable a background sending mode that is optimized for bulk sending. Read more about it at https://mandrillapp.com/api/docs/messages.JSON.html#method=send
|
1613 |
* @return array|WP_Error
|
1614 |
*/
|
1615 |
static function mail( $to, $subject, $html, $headers = '', $attachments = array(),
|
1617 |
$from_name = '',
|
1618 |
$from_email = '',
|
1619 |
$template_name = '',
|
1620 |
+
$track_opens = null,
|
1621 |
+
$track_clicks = null,
|
1622 |
$url_strip_qs = false,
|
1623 |
$merge = true,
|
1624 |
$global_merge_vars = array(),
|
1626 |
$google_analytics_domains = array(),
|
1627 |
$google_analytics_campaign = array(),
|
1628 |
$meta_data = array(),
|
1629 |
+
$important = false,
|
1630 |
+
$inline_css = null,
|
1631 |
+
$preserve_recipients=null,
|
1632 |
+
$view_content_link=null,
|
1633 |
+
$tracking_domain=null,
|
1634 |
+
$signing_domain=null,
|
1635 |
+
$return_path_domain=null,
|
1636 |
+
$subaccount=null,
|
1637 |
+
$recipient_metadata=null,
|
1638 |
+
$ip_pool=null,
|
1639 |
+
$send_at=null,
|
1640 |
+
$async=null
|
1641 |
) {
|
1642 |
+
if ( $track_opens === null ) $track_opens = self::getTrackOpens();
|
1643 |
+
if ( $track_clicks === null ) $track_clicks = self::getTrackClicks();
|
1644 |
+
|
1645 |
try {
|
1646 |
extract( apply_filters( 'wp_mail', compact( 'to', 'subject', 'html', 'headers', 'attachments' ) ) );
|
1647 |
$message = compact('html', 'subject', 'from_name', 'from_email', 'to', 'headers', 'attachments',
|
1652 |
'google_analytics_domains',
|
1653 |
'google_analytics_campaign',
|
1654 |
'meta_data',
|
1655 |
+
'important',
|
1656 |
+
'inline_css',
|
1657 |
+
'preserve_recipients',
|
1658 |
+
'view_content_link',
|
1659 |
+
'tracking_domain',
|
1660 |
+
'signing_domain',
|
1661 |
+
'return_path_domain',
|
1662 |
+
'subaccount',
|
1663 |
+
'recipient_metadata',
|
1664 |
+
'ip_pool',
|
1665 |
+
'send_at',
|
1666 |
+
'async'
|
1667 |
);
|
1668 |
return self::sendEmail($message, $tags, $template_name, $track_opens, $track_clicks);
|
1669 |
} catch ( Exception $e ) {
|
1748 |
break;
|
1749 |
|
1750 |
case 'bcc':
|
1751 |
+
// TODO: Mandrill's API only accept one BCC address. Other addresses will be silently discarded
|
1752 |
$bcc = array_merge( (array) $bcc, explode( ',', $content ) );
|
1753 |
|
1754 |
$message['bcc_address'] = $bcc[0];
|
1778 |
$message['headers']['Reply-To'] = trim(self::getReplyTo());
|
1779 |
}
|
1780 |
|
1781 |
+
// Checking To: field
|
1782 |
if( !is_array($message['to']) ) $message['to'] = explode(',', $message['to']);
|
1783 |
|
1784 |
$processed_to = array();
|
1791 |
}
|
1792 |
$message['to'] = $processed_to;
|
1793 |
|
1794 |
+
// Checking From: field
|
1795 |
if ( empty($message['from_email']) ) $message['from_email'] = self::getFromEmail();
|
1796 |
if ( empty($message['from_name'] ) ) $message['from_name'] = self::getFromName();
|
1797 |
|
1798 |
+
// Checking tags.
|
1799 |
$message['tags'] = self::findTags($tags);
|
1800 |
|
1801 |
+
// Checking attachments
|
1802 |
if ( !empty($message['attachments']) ) {
|
1803 |
$message['attachments'] = self::processAttachments($message['attachments']);
|
1804 |
if ( is_wp_error($message['attachments']) ) {
|
1805 |
throw new Exception('Invalid attachment (check http://eepurl.com/nXMa1 for supported file types).');
|
1806 |
+
} elseif ( !is_array($message['attachments']) ) { // some plugins return this value malformed.
|
1807 |
+
unset($message['attachments']);
|
1808 |
}
|
1809 |
}
|
1810 |
// Default values for other parameters
|
1813 |
$message['track_clicks']= $track_clicks;
|
1814 |
|
1815 |
// Supporting editable sections: Common transformations for the HTML part
|
1816 |
+
$nl2br = self::getnl2br() == 1;
|
1817 |
+
$nl2br = apply_filters('mandrill_nl2br', $nl2br, $message);
|
1818 |
+
if ( $nl2br ) {
|
1819 |
if ( is_array($message['html']) ) {
|
1820 |
foreach ($message['html'] as &$value){
|
1821 |
$value['content'] = preg_replace('#<(https?://[^*]+)>#', '$1', $value['content']);
|
1856 |
}
|
1857 |
}
|
1858 |
|
1859 |
+
// Letting user to filter/change the message payload
|
1860 |
$message['from_email'] = apply_filters('wp_mail_from', $message['from_email']);
|
1861 |
$message['from_name'] = apply_filters('wp_mail_from_name', $message['from_name']);
|
1862 |
$message = apply_filters('mandrill_payload', $message);
|
1863 |
|
1864 |
+
// if user doesn't want to process this email by wp_mandrill, so be it.
|
1865 |
if ( isset($message['force_native']) && $message['force_native'] ) throw new Exception('Manually falling back to native wp_mail()');
|
1866 |
|
1867 |
// Setting the tags property correctly to be received by the Mandrill's API
|
1869 |
if ( !is_array($message['tags']['general']) ) $message['tags']['general'] = array();
|
1870 |
if ( !is_array($message['tags']['automatic']) ) $message['tags']['automatic'] = array();
|
1871 |
|
1872 |
+
$message['tags'] = array_merge( $message['tags']['general'], $message['tags']['automatic'], $message['tags']['user'] );
|
1873 |
|
1874 |
// Sending the message
|
1875 |
if ( empty($message['template']) || empty($message['template']['name']) || empty($message['template']['content']) ) {
|
1888 |
}
|
1889 |
}
|
1890 |
|
1891 |
+
static function processAttachments($attachments = array()) {
|
1892 |
+
if ( !is_array($attachments) && $attachments )
|
1893 |
$attachments = explode( "\n", str_replace( "\r\n", "\n", $attachments ) );
|
1894 |
|
1895 |
foreach ( $attachments as $index => $attachment ) {
|