Configure SMTP - Version 3.1

Version Description

  • Add new debugging configuration option
  • Fix bug that resulted from WP 3.2's update to a new phpmailer
  • Fix bug with checking 'Use GMail?' did not auto-reset settings accordingly (jQuery bug regarding .attr() vs .prop() introduced in jQ 1.6 in WP 3.2)
  • Fix to call add_filter() instead of add_action() for 'wp_mail_from' (props Callum Macdonald)
  • Fix to call add_filter() instead of add_action() for 'wp_mail_from_name'
  • Store error messages for later display rather than immediately outputting (too early)
  • Save a static version of itself in class variable $instance
  • Deprecate use of global variable $c2c_configure_smtp to store instance
  • Add explicit empty() checks in a couple places
  • Delete plugin settings on uninstallation
  • Add __construct(), activation(), and uninstall()
  • Add more FAQ questions
  • Regenerate .pot
  • Update plugin framework to version 023
  • Note compatibility through WP 3.2+
  • Drop compatibility with versions of WP older than 3.0
  • Explicitly declare all functions as public and class variables as private
  • Minor code formatting changes (spacing)
  • Update copyright date (2011)
  • Add plugin homepage and author links in description in readme.txt
Download this release

Release Info

Developer coffee2code
Plugin Icon wp plugin Configure SMTP
Version 3.1
Comparing to
See all releases

Code changes from version 3.0.1 to 3.1

Files changed (3) hide show
  1. c2c-plugin.php +111 -66
  2. configure-smtp.php +90 -39
  3. readme.txt +42 -4
c2c-plugin.php CHANGED
@@ -2,12 +2,12 @@
2
/**
3
* @package C2C_Plugins
4
* @author Scott Reilly
5
- * @version 017
6
*/
7
/*
8
Basis for other plugins
9
10
- Compatible with WordPress 2.8+, 2.9+, 3.0+.
11
12
=>> Read the accompanying readme.txt file for more information. Also, visit the plugin's homepage
13
=>> for more information and the latest updates
@@ -17,7 +17,7 @@ Installation:
17
*/
18
19
/*
20
- Copyright (c) 2010 by Scott Reilly (aka coffee2code)
21
22
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
23
files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
@@ -32,15 +32,15 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRA
32
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33
*/
34
35
- if ( !class_exists( 'C2C_Plugin_017' ) ) :
36
37
- class C2C_Plugin_017 {
38
- var $plugin_css_version = '006';
39
- var $options = array();
40
- var $option_names = array();
41
- var $required_config = array( 'menu_name', 'name' );
42
- var $saved_settings = false;
43
- var $saved_settings_msg = '';
44
45
/**
46
* Handles installation tasks, such as ensuring plugin options are instantiated and saved to options table.
@@ -52,7 +52,7 @@ class C2C_Plugin_017 {
52
* @param array $plugin_options (optional) Array specifying further customization of plugin configuration.
53
* @return void
54
*/
55
- function C2C_Plugin_017( $version, $id_base, $author_prefix, $file, $plugin_options = array() ) {
56
global $pagenow;
57
$id_base = sanitize_title( $id_base );
58
if ( !file_exists( $file ) )
@@ -81,7 +81,7 @@ class C2C_Plugin_017 {
81
$this->$key = $settings[$key];
82
83
$this->author_prefix = $author_prefix;
84
- $this->id_base = $id_base;
85
$this->options_page = ''; // This will be set when the options is created
86
$this->plugin_basename = plugin_basename( $file );
87
$this->plugin_file = $file;
@@ -89,16 +89,15 @@ class C2C_Plugin_017 {
89
$this->u_id_base = $u_id_base; // Underscored version of id_base
90
$this->version = $version;
91
92
- add_action( 'init', array( &$this, 'init' ) );
93
$plugin_file = implode( '/', array_slice( explode( '/', $this->plugin_basename ), -2 ) );
94
- add_action( 'activate_' . $plugin_file, array( &$this, 'install' ) );
95
- add_action( 'deactivate_' . $plugin_file, array( &$this, 'deactivate' ) );
96
- register_uninstall_hook( $this->plugin_file, array( &$this, 'uninstall' ) );
97
98
- add_action( 'admin_init', array( &$this, 'init_options' ) );
99
100
if ( basename( $pagenow, '.php' ) == $this->settings_page )
101
- add_action( 'admin_head', array( &$this, 'add_c2c_admin_css' ) );
102
}
103
104
/**
@@ -108,22 +107,11 @@ class C2C_Plugin_017 {
108
*
109
* @return void
110
*/
111
- function install() {
112
$this->options = $this->get_options();
113
update_option( $this->admin_options_name, $this->options );
114
}
115
116
- /**
117
- * Handles uninstallation tasks, such as deleting plugin options.
118
- *
119
- * This can be overridden.
120
- *
121
- * @return void
122
- */
123
- function uninstall() {
124
- delete_option( $this->admin_options_name );
125
- }
126
-
127
/**
128
* Handles deactivation tasks
129
*
@@ -131,14 +119,14 @@ class C2C_Plugin_017 {
131
*
132
* @return void
133
*/
134
- function deactivate() { }
135
136
/**
137
* Handles actions to be hooked to 'init' action, such as loading text domain and loading plugin config data array.
138
*
139
* @return void
140
*/
141
- function init() {
142
global $c2c_plugin_max_css_version;
143
if ( !isset( $c2c_plugin_max_css_version ) || ( $c2c_plugin_max_css_version < $this->plugin_css_version ) )
144
$c2c_plugin_max_css_version = $this->plugin_css_version;
@@ -161,6 +149,55 @@ class C2C_Plugin_017 {
161
$this->register_filters();
162
}
163
164
/**
165
* Prevents this plugin from being included when WordPress phones home
166
* to check for plugin updates.
@@ -169,7 +206,7 @@ class C2C_Plugin_017 {
169
* @param string $url URL for the update check
170
* @return array The response array with this plugin removed, if present
171
*/
172
- function disable_update_check( $r, $url ) {
173
if ( 0 !== strpos( $url, 'http://api.wordpress.org/plugins/update-check' ) )
174
return $r; // Not a plugin update request. Bail immediately.
175
$plugins = unserialize( $r['body']['plugins'] );
@@ -184,7 +221,7 @@ class C2C_Plugin_017 {
184
*
185
* @return void
186
*/
187
- function init_options() {
188
register_setting( $this->admin_options_name, $this->admin_options_name, array( &$this, 'sanitize_inputs' ) );
189
add_settings_section( 'default', '', array( &$this, 'draw_default_section' ), $this->plugin_file );
190
add_filter( 'whitelist_options', array( &$this, 'whitelist_options' ) );
@@ -198,7 +235,7 @@ class C2C_Plugin_017 {
198
* @param array $options Array of options
199
* @return array The whitelist-amended $options array
200
*/
201
- function whitelist_options( $options ) {
202
$added = array( $this->admin_options_name => array( $this->admin_options_name ) );
203
$options = add_option_whitelist( $added, $options );
204
return $options;
@@ -209,7 +246,7 @@ class C2C_Plugin_017 {
209
*
210
* @return void
211
*/
212
- function draw_default_section() { }
213
214
/**
215
* Gets the label for a given option
@@ -217,7 +254,7 @@ class C2C_Plugin_017 {
217
* @param string $opt The option
218
* @return string The label for the option
219
*/
220
- function get_option_label( $opt ) {
221
return isset( $this->config[$opt]['label'] ) ? $this->config[$opt]['label'] : '';
222
}
223
@@ -226,7 +263,7 @@ class C2C_Plugin_017 {
226
*
227
* @return array
228
*/
229
- function reset_options() {
230
$options = $this->get_options( false );
231
return $options;
232
}
@@ -234,7 +271,7 @@ class C2C_Plugin_017 {
234
/**
235
* Sanitize user inputs prior to saving
236
*/
237
- function sanitize_inputs( $inputs ) {
238
do_action( $this->get_hook( 'before_save_options' ), $this );
239
if ( isset( $_POST['Reset'] ) ) {
240
$options = $this->reset_options();
@@ -274,13 +311,15 @@ class C2C_Plugin_017 {
274
case 'array':
275
if ( empty( $val ) )
276
$val = array();
277
elseif ( $input == 'text' )
278
$val = explode( ',', str_replace( array( ', ', ' ', ',' ), ',', $val ) );
279
else
280
$val = array_map( 'trim', explode( "\n", trim( $val ) ) );
281
break;
282
case 'hash':
283
- if ( !empty( $val ) && $input != 'select' ) {
284
$new_values = array();
285
foreach ( explode( "\n", $val ) AS $line ) {
286
list( $shortcut, $text ) = array_map( 'trim', explode( "=>", $line, 2 ) );
@@ -299,6 +338,7 @@ class C2C_Plugin_017 {
299
}
300
$options = apply_filters( $this->get_hook( 'before_update_option' ), $options, $this );
301
}
302
return $options;
303
}
304
@@ -307,16 +347,14 @@ class C2C_Plugin_017 {
307
*
308
* @return void
309
*/
310
- function load_config() {
311
- die( 'Function load_config() must be overridden in sub-class.' );
312
- }
313
314
/**
315
* Verify that the necessary configuration files were set in the inheriting class.
316
*
317
* @return void
318
*/
319
- function verify_config() {
320
// Ensure required configuration options have been configured via the sub-class. Die if any aren't.
321
foreach ( $this->required_config as $config ) {
322
if ( empty( $this->$config ) )
@@ -328,7 +366,7 @@ class C2C_Plugin_017 {
328
else {
329
// Initialize any option attributes that weren't specified by the plugin
330
foreach ( $this->get_option_names( true ) as $opt ) {
331
- foreach ( array( 'datatype', 'default', 'help', 'input', 'input_attributes', 'label', 'no_wrap', 'options', 'output' ) as $attrib ) {
332
if ( !isset( $this->config[$opt][$attrib] ) )
333
$this->config[$opt][$attrib] = '';
334
}
@@ -343,7 +381,7 @@ class C2C_Plugin_017 {
343
*
344
* @return void
345
*/
346
- function load_textdomain() {
347
$subdir = empty( $this->textdomain_subdir ) ? '' : '/'.$this->textdomain_subdir;
348
load_plugin_textdomain( $this->textdomain, false, basename( dirname( $this->plugin_file ) ) . $subdir );
349
}
@@ -354,7 +392,7 @@ class C2C_Plugin_017 {
354
*
355
* @return void
356
*/
357
- function register_filters() {
358
// This should be overridden in order to define filters.
359
}
360
@@ -370,7 +408,7 @@ class C2C_Plugin_017 {
370
* @param object $screen The screen object (only supplied in WP 3.0)
371
* @return void (Text is echoed)
372
*/
373
- function contextual_help( $contextual_help, $screen_id, $screen = null ) {
374
if ( $screen_id != $this->options_page )
375
return $contextual_help;
376
@@ -389,7 +427,7 @@ class C2C_Plugin_017 {
389
*
390
* @return void
391
*/
392
- function add_c2c_admin_css() {
393
global $c2c_plugin_max_css_version, $c2c_plugin_css_was_output;
394
if ( ( $c2c_plugin_max_css_version != $this->plugin_css_version ) || ( isset( $c2c_plugin_css_was_output ) && $c2c_plugin_css_was_output ) )
395
return;
@@ -432,7 +470,7 @@ class C2C_Plugin_017 {
432
.c2c-fieldset {border:1px solid #ccc; padding:2px 8px;}
433
.c2c-textarea, .c2c-inline_textarea {width:95%;font-family:"Courier New", Courier, mono;}
434
.c2c-nowrap {
435
- white-space:nowrap;overflow:scroll;overflow-y:hidden;overflow-x:scroll;overflow:-moz-scrollbars-horizontal
436
}
437
.see-help {font-size:x-small;font-style:italic;}
438
.more-help {display:block;margin-top:8px;}
@@ -446,7 +484,7 @@ CSS;
446
*
447
* @return void
448
*/
449
- function admin_menu() {
450
add_filter( 'plugin_action_links_' . $this->plugin_basename, array( &$this, 'plugin_action_links' ) );
451
switch ( $this->settings_page ) {
452
case 'options-general' :
@@ -469,7 +507,7 @@ CSS;
469
* @param int $limit The default limit value for the current posts query.
470
* @return array Links associated with a plugin on the admin Plugins page
471
*/
472
- function plugin_action_links( $action_links ) {
473
$settings_link = '<a href="' . $this->settings_page . '.php?page='.$this->plugin_basename.'">' . __( 'Settings', $this->textdomain ) . '</a>';
474
array_unshift( $action_links, $settings_link );
475
return $action_links;
@@ -483,7 +521,7 @@ CSS;
483
* @param string $opt The option name
484
* @return bool If the option is valid for this version of WP
485
*/
486
- function is_option_valid( $opt ) {
487
global $wp_version;
488
$valid = true;
489
$ver_operators = array( 'wpgt' => '>', 'wpgte' => '>=', 'wplt' => '<', 'wplte' => '<=' );
@@ -504,7 +542,7 @@ CSS;
504
* @param bool $include_non_options (optional) Should non-options be included? Default is false.
505
* @return array Array of option names.
506
*/
507
- function get_option_names( $include_non_options = false ) {
508
if ( !$include_non_options && !empty( $this->option_names ) )
509
return $this->option_names;
510
if ( $include_non_options )
@@ -524,7 +562,7 @@ CSS;
524
* @param bool $with_current_values (optional) Should the currently saved values be returned? If false, then the plugin's defaults are returned. Default is true.
525
* @return array The options array for the plugin (which is also stored in $this->options if !$with_options).
526
*/
527
- function get_options( $with_current_values = true ) {
528
if ( $with_current_values && !empty( $this->options ) )
529
return $this->options;
530
// Derive options from the config
@@ -535,6 +573,10 @@ CSS;
535
if ( !$with_current_values )
536
return $options;
537
$this->options = wp_parse_args( get_option( $this->admin_options_name ), $options );
538
// Un-escape fields
539
foreach ( $option_names as $opt ) {
540
if ( $this->config[$opt]['allow_html'] == true ) {
@@ -560,7 +602,7 @@ CSS;
560
* @param string $prefix A prefix string, unique to the form
561
* @return string The name
562
*/
563
- function get_form_submit_name( $prefix ) {
564
return $prefix . '_' . $this->u_id_base;
565
}
566
@@ -569,7 +611,7 @@ CSS;
569
*
570
* @return string The action URL
571
*/
572
- function form_action_url() {
573
return $_SERVER['PHP_SELF'] . '?page=' . $this->plugin_basename;
574
}
575
@@ -579,7 +621,7 @@ CSS;
579
* @param string $prefix The prefix for the form's unique submit hidden input field
580
* @return bool True if the plugin's settings have been submitted for saving, else false.
581
*/
582
- function is_submitting_form( $prefix ) {
583
return ( isset( $_POST['option_page'] ) && ( $_POST['option_page'] == $this->admin_options_name ) );
584
}
585
@@ -588,7 +630,7 @@ CSS;
588
*
589
* @return bool True if on the plugin's settings page, else false.
590
*/
591
- function is_plugin_admin_page() {
592
global $pagenow;
593
return ( basename( $pagenow, '.php' ) == $this->settings_page && isset( $_REQUEST['page'] ) && $_REQUEST['page'] == $this->plugin_basename );
594
}
@@ -599,7 +641,7 @@ CSS;
599
* @param string $opt The name/key of the option.
600
* @return void
601
*/
602
- function display_option( $opt ) {
603
do_action( $this->get_hook( 'pre_display_option' ), $opt );
604
605
$options = $this->get_options();
@@ -694,7 +736,7 @@ CSS;
694
* @param string $localized_heading_text (optional) Localized page heading text.
695
* @return void
696
*/
697
- function options_page_description( $localized_heading_text = '' ) {
698
if ( empty( $localized_heading_text ) )
699
$localized_heading_text = $this->name;
700
if ( $localized_heading_text )
@@ -709,13 +751,16 @@ CSS;
709
*
710
* @return void
711
*/
712
- function options_page() {
713
$options = $this->get_options();
714
715
if ( $this->saved_settings )
716
echo "<div id='message' class='updated fade'><p><strong>" . $this->saved_settings_msg . '</strong></p></div>';
717
718
- $logo = plugins_url( basename( $_GET['page'], '.php' ) . '/c2c_minilogo.png' );
719
720
echo "<div class='wrap'>\n";
721
echo "<div class='icon32' style='width:44px;'><img src='$logo' alt='" . esc_attr__( 'A plugin by coffee2code', $this->textdomain ) . "' /><br /></div>\n";
@@ -749,7 +794,7 @@ CSS;
749
* @param string $hook The name of a hook, to be made plugin-specific.
750
* @return string The plugin-specific version of the hook name.
751
*/
752
- function get_hook( $hook ) {
753
return $this->hook_prefix . '_' . $hook;
754
}
755
@@ -760,7 +805,7 @@ CSS;
760
*
761
* @return string The URL
762
*/
763
- function readme_url() {
764
return 'http://wordpress.org/extend/plugins/' . $this->id_base . '/tags/' . $this->version . '/readme.txt';
765
}
766
} // end class
2
/**
3
* @package C2C_Plugins
4
* @author Scott Reilly
5
+ * @version 023
6
*/
7
/*
8
Basis for other plugins
9
10
+ Compatible with WordPress 3.0+, 3.1+, 3.2+.
11
12
=>> Read the accompanying readme.txt file for more information. Also, visit the plugin's homepage
13
=>> for more information and the latest updates
17
*/
18
19
/*
20
+ Copyright (c) 2010-2011 by Scott Reilly (aka coffee2code)
21
22
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
23
files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
32
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33
*/
34
35
+ if ( !class_exists( 'C2C_Plugin_023' ) ) :
36
37
+ abstract class C2C_Plugin_023 {
38
+ protected $plugin_css_version = '007';
39
+ protected $options = array();
40
+ protected $option_names = array();
41
+ protected $required_config = array( 'menu_name', 'name' );
42
+ protected $saved_settings = false;
43
+ protected $saved_settings_msg = '';
44
45
/**
46
* Handles installation tasks, such as ensuring plugin options are instantiated and saved to options table.
52
* @param array $plugin_options (optional) Array specifying further customization of plugin configuration.
53
* @return void
54
*/
55
+ public function C2C_Plugin_023( $version, $id_base, $author_prefix, $file, $plugin_options = array() ) {
56
global $pagenow;
57
$id_base = sanitize_title( $id_base );
58
if ( !file_exists( $file ) )
81
$this->$key = $settings[$key];
82
83
$this->author_prefix = $author_prefix;
84
+ $this->id_base = $id_base;
85
$this->options_page = ''; // This will be set when the options is created
86
$this->plugin_basename = plugin_basename( $file );
87
$this->plugin_file = $file;
89
$this->u_id_base = $u_id_base; // Underscored version of id_base
90
$this->version = $version;
91
92
+ add_action( 'init', array( &$this, 'init' ) );
93
$plugin_file = implode( '/', array_slice( explode( '/', $this->plugin_basename ), -2 ) );
94
+ add_action( 'activate_' . $plugin_file, array( &$this, 'install' ) );
95
+ add_action( 'deactivate_' . $plugin_file, array( &$this, 'deactivate' ) );
96
97
+ add_action( 'admin_init', array( &$this, 'init_options' ) );
98
99
if ( basename( $pagenow, '.php' ) == $this->settings_page )
100
+ add_action( 'admin_head', array( &$this, 'add_c2c_admin_css' ) );
101
}
102
103
/**
107
*
108
* @return void
109
*/
110
+ public function install() {
111
$this->options = $this->get_options();
112
update_option( $this->admin_options_name, $this->options );
113
}
114
115
/**
116
* Handles deactivation tasks
117
*
119
*
120
* @return void
121
*/
122
+ public function deactivate() { }
123
124
/**
125
* Handles actions to be hooked to 'init' action, such as loading text domain and loading plugin config data array.
126
*
127
* @return void
128
*/
129
+ public function init() {
130
global $c2c_plugin_max_css_version;
131
if ( !isset( $c2c_plugin_max_css_version ) || ( $c2c_plugin_max_css_version < $this->plugin_css_version ) )
132
$c2c_plugin_max_css_version = $this->plugin_css_version;
149
$this->register_filters();
150
}
151
152
+ /**
153
+ * Checks to see if the plugin has been upgraded from an earlier version.
154
+ *
155
+ * Calls handle_plugin_update() if an upgrade was detected. Override that
156
+ * to do whatever needs done to bring older settings, etc up-to-date.
157
+ *
158
+ * @since 021
159
+ */
160
+ function check_if_plugin_was_upgraded() {
161
+ $_version = isset( $this->options['_version'] ) ? $this->options['_version'] : '0.0';
162
+ if ( $_version != $this->version ) {
163
+ // Save the original options into another option in case something goes wrong.
164
+ // TODO: Currently just saves one version back... should it save more?
165
+ update_option( 'bkup_' . $this->admin_options_name, $this->options );
166
+
167
+ $this->options['_version'] = $this->version;
168
+ $options = $this->handle_plugin_upgrade( $_version, $this->options );
169
+ update_option( $this->admin_options_name, $options );
170
+ $this->options = $options;
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Handle plugin updates. (To be implemented by inheriting class, if
176
+ * necessary.)
177
+ *
178
+ * Intended to be used for updating plugin options, etc.
179
+ *
180
+ * This is only called if the version stored in the db doesn't match the
181
+ * plugin's current version. At the very least the settings will get
182
+ * re-saved so that the new current version can be recorded.
183
+ *
184
+ * @since 021
185
+ * @param string $old_version The version number of the old version of
186
+ * the plugin. '0.0' indicates no version previously stored
187
+ * @param array $options Array of all plugin options
188
+ */
189
+ protected function handle_plugin_upgrade( $old_version, $options ) {
190
+ /* Example:
191
+ if ( version_compare( '1.2', $old_version ) > 0 ) {
192
+ // Plugin got upgraded from a version earlier than 1.2
193
+ // Which (for this example) is when a minimum value got raised
194
+ if ( $options['min_value'] < 5 )
195
+ $options['min_value'] = 5;
196
+ }
197
+ */
198
+ return $options; // Important!
199
+ }
200
+
201
/**
202
* Prevents this plugin from being included when WordPress phones home
203
* to check for plugin updates.
206
* @param string $url URL for the update check
207
* @return array The response array with this plugin removed, if present
208
*/
209
+ public function disable_update_check( $r, $url ) {
210
if ( 0 !== strpos( $url, 'http://api.wordpress.org/plugins/update-check' ) )
211
return $r; // Not a plugin update request. Bail immediately.
212
$plugins = unserialize( $r['body']['plugins'] );
221
*
222
* @return void
223
*/
224
+ public function init_options() {
225
register_setting( $this->admin_options_name, $this->admin_options_name, array( &$this, 'sanitize_inputs' ) );
226
add_settings_section( 'default', '', array( &$this, 'draw_default_section' ), $this->plugin_file );
227
add_filter( 'whitelist_options', array( &$this, 'whitelist_options' ) );
235
* @param array $options Array of options
236
* @return array The whitelist-amended $options array
237
*/
238
+ public function whitelist_options( $options ) {
239
$added = array( $this->admin_options_name => array( $this->admin_options_name ) );
240
$options = add_option_whitelist( $added, $options );
241
return $options;
246
*
247
* @return void
248
*/
249
+ public function draw_default_section() { }
250
251
/**
252
* Gets the label for a given option
254
* @param string $opt The option
255
* @return string The label for the option
256
*/
257
+ public function get_option_label( $opt ) {
258
return isset( $this->config[$opt]['label'] ) ? $this->config[$opt]['label'] : '';
259
}
260
263
*
264
* @return array
265
*/
266
+ public function reset_options() {
267
$options = $this->get_options( false );
268
return $options;
269
}
271
/**
272
* Sanitize user inputs prior to saving
273
*/
274
+ public function sanitize_inputs( $inputs ) {
275
do_action( $this->get_hook( 'before_save_options' ), $this );
276
if ( isset( $_POST['Reset'] ) ) {
277
$options = $this->reset_options();
311
case 'array':
312
if ( empty( $val ) )
313
$val = array();
314
+ elseif ( is_array( $val ) )
315
+ $val = array_map( 'trim', $val );
316
elseif ( $input == 'text' )
317
$val = explode( ',', str_replace( array( ', ', ' ', ',' ), ',', $val ) );
318
else
319
$val = array_map( 'trim', explode( "\n", trim( $val ) ) );
320
break;
321
case 'hash':
322
+ if ( !empty( $val ) && $input != 'select' && !is_array( $val ) ) {
323
$new_values = array();
324
foreach ( explode( "\n", $val ) AS $line ) {
325
list( $shortcut, $text ) = array_map( 'trim', explode( "=>", $line, 2 ) );
338
}
339
$options = apply_filters( $this->get_hook( 'before_update_option' ), $options, $this );
340
}
341
+ $options['_version'] = $this->version;
342
return $options;
343
}
344
347
*
348
* @return void
349
*/
350
+ abstract protected function load_config();
351
352
/**
353
* Verify that the necessary configuration files were set in the inheriting class.
354
*
355
* @return void
356
*/
357
+ protected function verify_config() {
358
// Ensure required configuration options have been configured via the sub-class. Die if any aren't.
359
foreach ( $this->required_config as $config ) {
360
if ( empty( $this->$config ) )
366
else {
367
// Initialize any option attributes that weren't specified by the plugin
368
foreach ( $this->get_option_names( true ) as $opt ) {
369
+ foreach ( array( 'datatype', 'default', 'help', 'input', 'input_attributes', 'label', 'no_wrap', 'options', 'output', 'required' ) as $attrib ) {
370
if ( !isset( $this->config[$opt][$attrib] ) )
371
$this->config[$opt][$attrib] = '';
372
}
381
*
382
* @return void
383
*/
384
+ protected function load_textdomain() {
385
$subdir = empty( $this->textdomain_subdir ) ? '' : '/'.$this->textdomain_subdir;
386
load_plugin_textdomain( $this->textdomain, false, basename( dirname( $this->plugin_file ) ) . $subdir );
387
}
392
*
393
* @return void
394
*/
395
+ public function register_filters() {
396
// This should be overridden in order to define filters.
397
}
398
408
* @param object $screen The screen object (only supplied in WP 3.0)
409
* @return void (Text is echoed)
410
*/
411
+ public function contextual_help( $contextual_help, $screen_id, $screen = null ) {
412
if ( $screen_id != $this->options_page )
413
return $contextual_help;
414
427
*
428
* @return void
429
*/
430
+ public function add_c2c_admin_css() {
431
global $c2c_plugin_max_css_version, $c2c_plugin_css_was_output;
432
if ( ( $c2c_plugin_max_css_version != $this->plugin_css_version ) || ( isset( $c2c_plugin_css_was_output ) && $c2c_plugin_css_was_output ) )
433
return;
470
.c2c-fieldset {border:1px solid #ccc; padding:2px 8px;}
471
.c2c-textarea, .c2c-inline_textarea {width:95%;font-family:"Courier New", Courier, mono;}
472
.c2c-nowrap {
473
+ white-space:nowrap;overflow:auto;
474
}
475
.see-help {font-size:x-small;font-style:italic;}
476
.more-help {display:block;margin-top:8px;}
484
*
485
* @return void
486
*/
487
+ public function admin_menu() {
488
add_filter( 'plugin_action_links_' . $this->plugin_basename, array( &$this, 'plugin_action_links' ) );
489
switch ( $this->settings_page ) {
490
case 'options-general' :
507
* @param int $limit The default limit value for the current posts query.
508
* @return array Links associated with a plugin on the admin Plugins page
509
*/
510
+ public function plugin_action_links( $action_links ) {
511
$settings_link = '<a href="' . $this->settings_page . '.php?page='.$this->plugin_basename.'">' . __( 'Settings', $this->textdomain ) . '</a>';
512
array_unshift( $action_links, $settings_link );
513
return $action_links;
521
* @param string $opt The option name
522
* @return bool If the option is valid for this version of WP
523
*/
524
+ protected function is_option_valid( $opt ) {
525
global $wp_version;
526
$valid = true;
527
$ver_operators = array( 'wpgt' => '>', 'wpgte' => '>=', 'wplt' => '<', 'wplte' => '<=' );
542
* @param bool $include_non_options (optional) Should non-options be included? Default is false.
543
* @return array Array of option names.
544
*/
545
+ protected function get_option_names( $include_non_options = false ) {
546
if ( !$include_non_options && !empty( $this->option_names ) )
547
return $this->option_names;
548
if ( $include_non_options )
562
* @param bool $with_current_values (optional) Should the currently saved values be returned? If false, then the plugin's defaults are returned. Default is true.
563
* @return array The options array for the plugin (which is also stored in $this->options if !$with_options).
564
*/
565
+ protected function get_options( $with_current_values = true ) {
566
if ( $with_current_values && !empty( $this->options ) )
567
return $this->options;
568
// Derive options from the config
573
if ( !$with_current_values )
574
return $options;
575
$this->options = wp_parse_args( get_option( $this->admin_options_name ), $options );
576
+
577
+ // Check to see if the plugin has been updated
578
+ $this->check_if_plugin_was_upgraded();
579
+
580
// Un-escape fields
581
foreach ( $option_names as $opt ) {
582
if ( $this->config[$opt]['allow_html'] == true ) {
602
* @param string $prefix A prefix string, unique to the form
603
* @return string The name
604
*/
605
+ protected function get_form_submit_name( $prefix ) {
606
return $prefix . '_' . $this->u_id_base;
607
}
608
611
*
612
* @return string The action URL
613
*/
614
+ protected function form_action_url() {
615
return $_SERVER['PHP_SELF'] . '?page=' . $this->plugin_basename;
616
}
617
621
* @param string $prefix The prefix for the form's unique submit hidden input field
622
* @return bool True if the plugin's settings have been submitted for saving, else false.
623
*/
624
+ protected function is_submitting_form( $prefix ) {
625
return ( isset( $_POST['option_page'] ) && ( $_POST['option_page'] == $this->admin_options_name ) );
626
}
627
630
*
631
* @return bool True if on the plugin's settings page, else false.
632
*/
633
+ protected function is_plugin_admin_page() {
634
global $pagenow;
635
return ( basename( $pagenow, '.php' ) == $this->settings_page && isset( $_REQUEST['page'] ) && $_REQUEST['page'] == $this->plugin_basename );
636
}
641
* @param string $opt The name/key of the option.
642
* @return void
643
*/
644
+ public function display_option( $opt ) {
645
do_action( $this->get_hook( 'pre_display_option' ), $opt );
646
647
$options = $this->get_options();
736
* @param string $localized_heading_text (optional) Localized page heading text.
737
* @return void
738
*/
739
+ protected function options_page_description( $localized_heading_text = '' ) {
740
if ( empty( $localized_heading_text ) )
741
$localized_heading_text = $this->name;
742
if ( $localized_heading_text )
751
*
752
* @return void
753
*/
754
+ public function options_page() {
755
$options = $this->get_options();
756
757
+ if ( function_exists( 'settings_errors' ) ) // Check for pre-3.0 compatibility
758
+ settings_errors();
759
+
760
if ( $this->saved_settings )
761
echo "<div id='message' class='updated fade'><p><strong>" . $this->saved_settings_msg . '</strong></p></div>';
762
763
+ $logo = plugins_url( 'c2c_minilogo.png', $this->plugin_file );
764
765
echo "<div class='wrap'>\n";
766
echo "<div class='icon32' style='width:44px;'><img src='$logo' alt='" . esc_attr__( 'A plugin by coffee2code', $this->textdomain ) . "' /><br /></div>\n";
794
* @param string $hook The name of a hook, to be made plugin-specific.
795
* @return string The plugin-specific version of the hook name.
796
*/
797
+ protected function get_hook( $hook ) {
798
return $this->hook_prefix . '_' . $hook;
799
}
800
805
*
806
* @return string The URL
807
*/
808
+ public function readme_url() {
809
return 'http://wordpress.org/extend/plugins/' . $this->id_base . '/tags/' . $this->version . '/readme.txt';
810
}
811
} // end class
configure-smtp.php CHANGED
@@ -2,27 +2,30 @@
2
/**
3
* @package Configure_SMTP
4
* @author Scott Reilly
5
- * @version 3.0.1
6
*/
7
/*
8
Plugin Name: Configure SMTP
9
- Version: 3.0.1
10
Plugin URI: http://coffee2code.com/wp-plugins/configure-smtp/
11
Author: Scott Reilly
12
Author URI: http://coffee2code.com
13
Text Domain: configure-smtp
14
Description: Configure SMTP mailing in WordPress, including support for sending e-mail via SSL/TLS (such as GMail).
15
16
- Compatible with WordPress 2.8+, 2.9+, 3.0+.
17
18
=>> Read the accompanying readme.txt file for instructions and documentation.
19
=>> Also, visit the plugin's homepage for additional information and updates.
20
=>> Or visit: http://wordpress.org/extend/plugins/configure-smtp/
21
22
*/
23
24
/*
25
- Copyright (c) 2004-2010 by Scott Reilly (aka coffee2code)
26
27
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
28
files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
@@ -37,26 +40,61 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRA
37
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
38
*/
39
40
- if ( !class_exists( 'c2c_ConfigureSMTP' ) ) :
41
42
require_once( 'c2c-plugin.php' );
43
44
- class c2c_ConfigureSMTP extends C2C_Plugin_017 {
45
46
- var $gmail_config = array(
47
'host' => 'smtp.gmail.com',
48
'port' => '465',
49
'smtp_auth' => true,
50
'smtp_secure' => 'ssl'
51
);
52
53
/**
54
* Constructor
55
*
56
* @return void
57
*/
58
- function c2c_ConfigureSMTP() {
59
- $this->C2C_Plugin_017( '3.0.1', 'configure-smtp', 'c2c', __FILE__, array() );
60
}
61
62
/**
@@ -64,8 +102,8 @@ class c2c_ConfigureSMTP extends C2C_Plugin_017 {
64
*
65
* @return void
66
*/
67
- function load_config() {
68
- $this->name = __( 'Configure SMTP', $this->textdomain );
69
$this->menu_name = __( 'SMTP', $this->textdomain );
70
71
$this->config = array(
@@ -95,6 +133,9 @@ class c2c_ConfigureSMTP extends C2C_Plugin_017 {
95
'wordwrap' => array( 'input' => 'short_text', 'default' => '',
96
'label' => __( 'Wordwrap length', $this->textdomain ),
97
'help' => __( 'Sets word wrapping on the body of the message to a given number of characters.', $this->textdomain ) ),
98
'hr' => array(),
99
'from_email' => array( 'input' => 'text', 'default' => '',
100
'label' => __( 'Sender e-mail', $this->textdomain ),
@@ -110,15 +151,15 @@ class c2c_ConfigureSMTP extends C2C_Plugin_017 {
110
*
111
* @return void
112
*/
113
- function register_filters() {
114
global $pagenow;
115
if ( 'options-general.php' == $pagenow )
116
- add_action( 'admin_print_footer_scripts', array( &$this, 'add_js' ) );
117
- add_action( 'admin_init', array( &$this, 'maybe_send_test' ) );
118
- add_action( 'phpmailer_init', array( &$this, 'phpmailer_init' ) );
119
- add_action( 'wp_mail_from', array( &$this, 'wp_mail_from' ) );
120
- add_action( 'wp_mail_from_name', array( &$this, 'wp_mail_from_name' ) );
121
- add_action( $this->get_hook( 'after_settings_form' ), array( &$this, 'send_test_form' ) );
122
add_filter( $this->get_hook( 'before_update_option' ), array( &$this, 'maybe_gmail_override' ) );
123
}
124
@@ -127,9 +168,11 @@ class c2c_ConfigureSMTP extends C2C_Plugin_017 {
127
*
128
* @return void (Text will be echoed.)
129
*/
130
- function options_page_description() {
131
$options = $this->get_options();
132
parent::options_page_description( __( 'Configure SMTP Settings', $this->textdomain ) );
133
$str = '<a href="#test">' . __( 'test', $this->textdomain ) . '</a>';
134
if ( empty( $options['host'] ) )
135
echo '<div class="error"><p>' . __( 'SMTP mailing is currently <strong>NOT ENABLED</strong> because no SMTP host has been specified.' ) . '</p></div>';
@@ -141,15 +184,20 @@ class c2c_ConfigureSMTP extends C2C_Plugin_017 {
141
*
142
* @return void (Text is echoed.)
143
*/
144
- function add_js() {
145
- $alert = __( 'Be sure to specify your GMail email address (with the @gmail.com) as the SMTP username, and your GMail password as the SMTP password.', $this->textdomain );
146
echo <<<JS
147
<script type="text/javascript">
148
function configure_gmail() {
149
- if (jQuery('#use_gmail').attr('checked') == true) {
150
jQuery('#host').val('{$this->gmail_config['host']}');
151
jQuery('#port').val('{$this->gmail_config['port']}');
152
- jQuery('#smtp_auth').attr('checked', {$this->gmail_config['smtp_auth']});
153
jQuery('#smtp_secure').val('{$this->gmail_config['smtp_secure']}');
154
if (!jQuery('#smtp_user').val().match(/.+@gmail.com#x2F;) ) {
155
jQuery('#smtp_user').val('USERNAME@gmail.com').focus().get(0).setSelectionRange(0,8);
@@ -169,7 +217,7 @@ JS;
169
* @param array $options The options array prior to saving
170
* @return array The options array with GMail settings taking precedence, if relevant
171
*/
172
- function maybe_gmail_override( $options ) {
173
// If GMail is to be used, those settings take precendence
174
if ( $options['use_gmail'] )
175
$options = wp_parse_args( $this->gmail_config, $options );
@@ -180,7 +228,7 @@ JS;
180
* Sends test e-mail if form was submitted requesting to do so.
181
*
182
*/
183
- function maybe_send_test() {
184
if ( isset( $_POST[$this->get_form_submit_name( 'submit_test_email' )] ) ) {
185
check_admin_referer( $this->nonce_field );
186
$user = wp_get_current_user();
@@ -196,15 +244,14 @@ JS;
196
// Check success
197
global $phpmailer;
198
if ( $phpmailer->ErrorInfo != "" ) {
199
- echo '<div class="error"><p>' . __( 'An error was encountered while trying to send the test e-mail.' ) . '</p>';
200
- echo '<blockquote style="font-weight:bold;">';
201
- echo '<p>' . $phpmailer->ErrorInfo . '</p>';
202
- echo '<p>' . $phpmailer->smtp->error['error'] . '<br />' . $phpmailer->smtp->error['errstr'] . '</p>';
203
- echo '</blockquote>';
204
- echo '</div>';
205
} else {
206
- echo '<div class="updated"><p>' . __( 'Test e-mail sent.', $this->textdomain ) . '</p>';
207
- echo '<p>' . sprintf( __( 'The body of the e-mail includes this time-stamp: %s.', $this->textdomain ), $timestamp ) . '</p></div>';
208
}
209
}
210
}
@@ -214,7 +261,7 @@ JS;
214
*
215
* @return void (Text will be echoed.)
216
*/
217
- function send_test_form() {
218
$user = wp_get_current_user();
219
$email = $user->user_email;
220
$action_url = $this->form_action_url();
@@ -235,7 +282,7 @@ JS;
235
* @param object $phpmailer PHPMailer object
236
* @return void
237
*/
238
- function phpmailer_init( $phpmailer ) {
239
$options = $this->get_options();
240
// Don't configure for SMTP if no host is provided.
241
if ( empty( $options['host'] ) )
@@ -252,6 +299,8 @@ JS;
252
$phpmailer->SMTPSecure = $options['smtp_secure'];
253
if ( $options['wordwrap'] > 0 )
254
$phpmailer->WordWrap = $options['wordwrap'];
255
}
256
257
/**
@@ -260,9 +309,9 @@ JS;
260
* @param string $from The "from" e-mail address used by WordPress by default
261
* @return string The potentially new "from" e-mail address, if overridden via the plugin's settings.
262
*/
263
- function wp_mail_from( $from ) {
264
$options = $this->get_options();
265
- if ( $options['from_email'] )
266
$from = $options['from_email'];
267
return $from;
268
}
@@ -273,15 +322,17 @@ JS;
273
* @param string $from The "from" name used by WordPress by default
274
* @return string The potentially new "from" name, if overridden via the plugin's settings.
275
*/
276
- function wp_mail_from_name( $from_name ) {
277
$options = $this->get_options();
278
- if ( $options['from_name'] )
279
$from_name = wp_specialchars_decode( $options['from_name'], ENT_QUOTES );
280
return $from_name;
281
}
282
283
} // end c2c_ConfigureSMTP
284
285
$GLOBALS['c2c_configure_smtp'] = new c2c_ConfigureSMTP();
286
287
endif; // end if !class_exists()
2
/**
3
* @package Configure_SMTP
4
* @author Scott Reilly
5
+ * @version 3.1
6
*/
7
/*
8
Plugin Name: Configure SMTP
9
+ Version: 3.1
10
Plugin URI: http://coffee2code.com/wp-plugins/configure-smtp/
11
Author: Scott Reilly
12
Author URI: http://coffee2code.com
13
Text Domain: configure-smtp
14
Description: Configure SMTP mailing in WordPress, including support for sending e-mail via SSL/TLS (such as GMail).
15
16
+ Compatible with WordPress 3.0+, 3.1+, 3.2+.
17
18
=>> Read the accompanying readme.txt file for instructions and documentation.
19
=>> Also, visit the plugin's homepage for additional information and updates.
20
=>> Or visit: http://wordpress.org/extend/plugins/configure-smtp/
21
22
+ TODO:
23
+ * Update screenshots for WP 3.2
24
+ * Add ability to configure plugin via defines in wp-config.php
25
*/
26
27
/*
28
+ Copyright (c) 2004-2011 by Scott Reilly (aka coffee2code)
29
30
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
31
files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
40
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
41
*/
42
43
+ if ( ! class_exists( 'c2c_ConfigureSMTP' ) ) :
44
45
require_once( 'c2c-plugin.php' );
46
47
+ class c2c_ConfigureSMTP extends C2C_Plugin_023 {
48
49
+ public static $instance;
50
+
51
+ private $gmail_config = array(
52
'host' => 'smtp.gmail.com',
53
'port' => '465',
54
'smtp_auth' => true,
55
'smtp_secure' => 'ssl'
56
);
57
+ private $error_msg = '';
58
59
/**
60
* Constructor
61
*
62
* @return void
63
*/
64
+ public function __construct() {
65
+ $this->c2c_ConfigureSMTP();
66
+ }
67
+
68
+ public function c2c_ConfigureSMTP() {
69
+ // Be a singleton
70
+ if ( ! is_null( self::$instance ) )
71
+ return;
72
+
73
+ $this->C2C_Plugin_023( '3.1', 'configure-smtp', 'c2c', __FILE__, array() );
74
+ register_activation_hook( __FILE__, array( __CLASS__, 'activation' ) );
75
+ self::$instance = $this;
76
+ }
77
+
78
+ /**
79
+ * Handles activation tasks, such as registering the uninstall hook.
80
+ *
81
+ * @since 3.1
82
+ *
83
+ * @return void
84
+ */
85
+ public function activation() {
86
+ register_uninstall_hook( __FILE__, array( __CLASS__, 'uninstall' ) );
87
+ }
88
+
89
+ /**
90
+ * Handles uninstallation tasks, such as deleting plugin options.
91
+ *
92
+ * @since 3.1
93
+ *
94
+ * @return void
95
+ */
96
+ public function uninstall() {
97
+ delete_option( 'c2c_configure_smtp' );
98
}
99
100
/**
102
*
103
* @return void
104
*/
105
+ public function load_config() {
106
+ $this->name = __( 'Configure SMTP', $this->textdomain );
107
$this->menu_name = __( 'SMTP', $this->textdomain );
108
109
$this->config = array(
133
'wordwrap' => array( 'input' => 'short_text', 'default' => '',
134
'label' => __( 'Wordwrap length', $this->textdomain ),
135
'help' => __( 'Sets word wrapping on the body of the message to a given number of characters.', $this->textdomain ) ),
136
+ 'debug' => array( 'input' => 'checkbox', 'default' => false,
137
+ 'label' => __( 'Enable debugging?', $this->textdomain ),
138
+ 'help' => __( 'Only check this if you are experiencing problems and would like more error reporting to occur. <em>Uncheck this once you have finished debugging.</em>', $this->textdomain ) ),
139
'hr' => array(),
140
'from_email' => array( 'input' => 'text', 'default' => '',
141
'label' => __( 'Sender e-mail', $this->textdomain ),
151
*
152
* @return void
153
*/
154
+ public function register_filters() {
155
global $pagenow;
156
if ( 'options-general.php' == $pagenow )
157
+ add_action( 'admin_print_footer_scripts', array( &$this, 'add_js' ) );
158
+ add_action( 'admin_init', array( &$this, 'maybe_send_test' ) );
159
+ add_action( 'phpmailer_init', array( &$this, 'phpmailer_init' ) );
160
+ add_filter( 'wp_mail_from', array( &$this, 'wp_mail_from' ) );
161
+ add_filter( 'wp_mail_from_name', array( &$this, 'wp_mail_from_name' ) );
162
+ add_action( $this->get_hook( 'after_settings_form' ), array( &$this, 'send_test_form' ) );
163
add_filter( $this->get_hook( 'before_update_option' ), array( &$this, 'maybe_gmail_override' ) );
164
}
165
168
*
169
* @return void (Text will be echoed.)
170
*/
171
+ public function options_page_description() {
172
$options = $this->get_options();
173
parent::options_page_description( __( 'Configure SMTP Settings', $this->textdomain ) );
174
+ if ( ! empty( $this->error_msg ) )
175
+ echo $this->error_msg;
176
$str = '<a href="#test">' . __( 'test', $this->textdomain ) . '</a>';
177
if ( empty( $options['host'] ) )
178
echo '<div class="error"><p>' . __( 'SMTP mailing is currently <strong>NOT ENABLED</strong> because no SMTP host has been specified.' ) . '</p></div>';
184
*
185
* @return void (Text is echoed.)
186
*/
187
+ public function add_js() {
188
+ $alert = __( 'Be sure to specify your full GMail email address (including the "@gmail.com") as the SMTP username, and your GMail password as the SMTP password.', $this->textdomain );
189
+ $checked = $this->gmail_config['smtp_auth'] ? '1' : '';
190
echo <<<JS
191
<script type="text/javascript">
192
function configure_gmail() {
193
+ // The .attr('checked') == true is only for pre-WP3.2
194
+ if (jQuery('#use_gmail').attr('checked') == 'checked' || jQuery('#use_gmail').attr('checked') == true) {
195
jQuery('#host').val('{$this->gmail_config['host']}');
196
jQuery('#port').val('{$this->gmail_config['port']}');
197
+ if (jQuery('#use_gmail').attr('checked') == 'checked')
198
+ jQuery('#smtp_auth').prop('checked', $checked);
199
+ else // pre WP-3.2 only
200
+ jQuery('#smtp_auth').attr('checked', {$this->gmail_config['smtp_auth']});
201
jQuery('#smtp_secure').val('{$this->gmail_config['smtp_secure']}');
202
if (!jQuery('#smtp_user').val().match(/.+@gmail.com#x2F;) ) {
203
jQuery('#smtp_user').val('USERNAME@gmail.com').focus().get(0).setSelectionRange(0,8);
217
* @param array $options The options array prior to saving
218
* @return array The options array with GMail settings taking precedence, if relevant
219
*/
220
+ public function maybe_gmail_override( $options ) {
221
// If GMail is to be used, those settings take precendence
222
if ( $options['use_gmail'] )
223
$options = wp_parse_args( $this->gmail_config, $options );
228
* Sends test e-mail if form was submitted requesting to do so.
229
*
230
*/
231
+ public function maybe_send_test() {
232
if ( isset( $_POST[$this->get_form_submit_name( 'submit_test_email' )] ) ) {
233
check_admin_referer( $this->nonce_field );
234
$user = wp_get_current_user();
244
// Check success
245
global $phpmailer;
246
if ( $phpmailer->ErrorInfo != "" ) {
247
+ $this->error_msg = '<div class="error"><p>' . __( 'An error was encountered while trying to send the test e-mail.', $this->textdomain ) . '</p>';
248
+ $this->error_msg .= '<blockquote style="font-weight:bold;">';
249
+ $this->error_msg .= '<p>' . $phpmailer->ErrorInfo . '</p>';
250
+ $this->error_msg .= '</p></blockquote>';
251
+ $this->error_msg .= '</div>';
252
} else {
253
+ $this->error_msg = '<div class="updated"><p>' . __( 'Test e-mail sent.', $this->textdomain ) . '</p>';
254
+ $this->error_msg .= '<p>' . sprintf( __( 'The body of the e-mail includes this time-stamp: %s.', $this->textdomain ), $timestamp ) . '</p></div>';
255
}
256
}
257
}
261
*
262
* @return void (Text will be echoed.)
263
*/
264
+ public function send_test_form() {
265
$user = wp_get_current_user();
266
$email = $user->user_email;
267
$action_url = $this->form_action_url();
282
* @param object $phpmailer PHPMailer object
283
* @return void
284
*/
285
+ public function phpmailer_init( $phpmailer ) {
286
$options = $this->get_options();
287
// Don't configure for SMTP if no host is provided.
288
if ( empty( $options['host'] ) )
299
$phpmailer->SMTPSecure = $options['smtp_secure'];
300
if ( $options['wordwrap'] > 0 )
301
$phpmailer->WordWrap = $options['wordwrap'];
302
+ if ( $options['debug'] )
303
+ $phpmailer->SMTPDebug = true;
304
}
305
306
/**
309
* @param string $from The "from" e-mail address used by WordPress by default
310
* @return string The potentially new "from" e-mail address, if overridden via the plugin's settings.
311
*/
312
+ public function wp_mail_from( $from ) {
313
$options = $this->get_options();
314
+ if ( ! empty( $options['from_email'] ) )
315
$from = $options['from_email'];
316
return $from;
317
}
322
* @param string $from The "from" name used by WordPress by default
323
* @return string The potentially new "from" name, if overridden via the plugin's settings.
324
*/
325
+ public function wp_mail_from_name( $from_name ) {
326
$options = $this->get_options();
327
+ if ( ! empty( $options['from_name'] ) )
328
$from_name = wp_specialchars_decode( $options['from_name'], ENT_QUOTES );
329
return $from_name;
330
}
331
332
} // end c2c_ConfigureSMTP
333
334
+ // NOTICE: The 'c2c_configure_smtp' global is deprecated and will be removed in the plugin's version 3.0.
335
+ // Instead, use: c2c_ConfigureSMTP::$instance
336
$GLOBALS['c2c_configure_smtp'] = new c2c_ConfigureSMTP();
337
338
endif; // end if !class_exists()
readme.txt CHANGED
@@ -2,10 +2,10 @@
2
Contributors: coffee2code
3
Donate link: http://coffee2code.com/donate
4
Tags: email, smtp, gmail, sendmail, wp_mail, phpmailer, outgoing mail, tls, ssl, security, privacy, wp-phpmailer, coffee2code
5
- Requires at least: 2.8
6
- Tested up to: 3.0.1
7
- Stable tag: 3.0.1
8
- Version: 3.0.1
9
10
Configure SMTP mailing in WordPress, including support for sending e-mail via SSL/TLS (such as GMail).
11
@@ -31,6 +31,8 @@ Regardless of whether SMTP is enabled, the plugin provides you the ability to de
31
32
A simple test button is also available that allows you to send a test e-mail to yourself to check if sending e-mail has been properly configured for your blog.
33
34
35
== Installation ==
36
@@ -54,6 +56,17 @@ Check out the settings for your local e-mail program. More than likely that is
54
55
If your settings worked, you should receive the test e-mail at the e-mail address associated with your WordPress blog user account. That e-mail contains a time-stamp which was reported to you by the plugin when the e-mail was sent. If you are trying out various setting values, be sure to record what your settings were and what the time-stamp was when sending with those settings.
56
57
58
== Screenshots ==
59
@@ -62,6 +75,28 @@ If your settings worked, you should receive the test e-mail at the e-mail addres
62
63
== Changelog ==
64
65
= 3.0.1 =
66
* Update plugin framework to 017 to use password input field instead of text field for SMTP password
67
@@ -134,6 +169,9 @@ If your settings worked, you should receive the test e-mail at the e-mail addres
134
135
== Upgrade Notice ==
136
137
= 3.0.1 =
138
Minor update. Use password input field for SMTP password instead of regular text input field.
139
2
Contributors: coffee2code
3
Donate link: http://coffee2code.com/donate
4
Tags: email, smtp, gmail, sendmail, wp_mail, phpmailer, outgoing mail, tls, ssl, security, privacy, wp-phpmailer, coffee2code
5
+ Requires at least: 3.0
6
+ Tested up to: 3.2
7
+ Stable tag: 3.1
8
+ Version: 3.1
9
10
Configure SMTP mailing in WordPress, including support for sending e-mail via SSL/TLS (such as GMail).
11
31
32
A simple test button is also available that allows you to send a test e-mail to yourself to check if sending e-mail has been properly configured for your blog.
33
34
+ Links: [Plugin Homepage](http://coffee2code.com/wp-plugins/configure-smtp/) | [Author Homepage](http://coffee2code.com)
35
+
36
37
== Installation ==
38
56
57
If your settings worked, you should receive the test e-mail at the e-mail address associated with your WordPress blog user account. That e-mail contains a time-stamp which was reported to you by the plugin when the e-mail was sent. If you are trying out various setting values, be sure to record what your settings were and what the time-stamp was when sending with those settings.
58
59
+ = Why am I getting this error when attempting to send a test message: `SMTP Error: Could not connect to SMTP host.`? =
60
+
61
+ There are a number of reasons you could be getting this error:
62
+ # Your server (or a router to which it is connected) may be blocking all outgoing SMTP traffic.
63
+ # Your mail server may be configured to allow SMTP connections only from certain servers.
64
+ # You have supplied incorrect server settings (hostname, port number, secure protocol type).
65
+
66
+ = What am I getting this error: `SMTP Error: Could not authenticate.`? =
67
+
68
+ The connection to the SMTP server was successful, but the credentials you provided (username and/or password) are not correct.
69
+
70
71
== Screenshots ==
72
75
76
== Changelog ==
77
78
+ = 3.1 =
79
+ * Add new debugging configuration option
80
+ * Fix bug that resulted from WP 3.2's update to a new phpmailer
81
+ * Fix bug with checking 'Use GMail?' did not auto-reset settings accordingly (jQuery bug regarding .attr() vs .prop() introduced in jQ 1.6 in WP 3.2)
82
+ * Fix to call add_filter() instead of add_action() for 'wp_mail_from' (props Callum Macdonald)
83
+ * Fix to call add_filter() instead of add_action() for 'wp_mail_from_name'
84
+ * Store error messages for later display rather than immediately outputting (too early)
85
+ * Save a static version of itself in class variable $instance
86
+ * Deprecate use of global variable $c2c_configure_smtp to store instance
87
+ * Add explicit empty() checks in a couple places
88
+ * Delete plugin settings on uninstallation
89
+ * Add __construct(), activation(), and uninstall()
90
+ * Add more FAQ questions
91
+ * Regenerate .pot
92
+ * Update plugin framework to version 023
93
+ * Note compatibility through WP 3.2+
94
+ * Drop compatibility with versions of WP older than 3.0
95
+ * Explicitly declare all functions as public and class variables as private
96
+ * Minor code formatting changes (spacing)
97
+ * Update copyright date (2011)
98
+ * Add plugin homepage and author links in description in readme.txt
99
+
100
= 3.0.1 =
101
* Update plugin framework to 017 to use password input field instead of text field for SMTP password
102
169
170
== Upgrade Notice ==
171
172
+ = 3.1 =
173
+ Recommended update. Highlights: fixed numerous bugs; added a debug mode; updated compatibility through WP 3.2; dropped compatibility with version of WP older than 3.0; updated plugin framework.
174
+
175
= 3.0.1 =
176
Minor update. Use password input field for SMTP password instead of regular text input field.
177