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$/) ) {
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$/) ) {
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