/**
  * Display SendGrid settings page content
  */
 public static function show_settings_page()
 {
     if ('POST' == $_SERVER['REQUEST_METHOD']) {
         if (isset($_POST['email_test']) and $_POST['email_test']) {
             $to = $_POST['sendgrid_to'];
             $subject = $_POST['sendgrid_subj'];
             $body = $_POST['sendgrid_body'];
             $headers = $_POST['sendgrid_headers'];
             $sent = wp_mail($to, $subject, $body, $headers);
             if ('api' == Sendgrid_Tools::get_send_method()) {
                 $sent = json_decode($sent['body']);
                 if ("success" == $sent->message) {
                     $message = 'Email sent.';
                     $status = 'updated';
                 } else {
                     $errors = $sent->errors[0] ? $sent->errors[0] : $sent;
                     $message = 'Email not sent. ' . $errors;
                     $status = 'error';
                 }
             } elseif ('smtp' == Sendgrid_Tools::get_send_method()) {
                 if (true === $sent) {
                     $message = 'Email sent.';
                     $status = 'updated';
                 } else {
                     $message = 'Email not sent. ' . $sent;
                     $status = 'error';
                 }
             }
         } else {
             $message = 'Options saved.';
             $status = 'updated';
             if (isset($_POST['sendgrid_user'])) {
                 $user = $_POST['sendgrid_user'];
                 update_option('sendgrid_user', $user);
             }
             if (isset($_POST['sendgrid_pwd'])) {
                 $password = $_POST['sendgrid_pwd'];
                 update_option('sendgrid_pwd', $password);
             }
             if (isset($_POST['sendgrid_api'])) {
                 $method = $_POST['sendgrid_api'];
                 update_option('sendgrid_api', $method);
             }
             if (isset($_POST['sendgrid_name'])) {
                 $name = $_POST['sendgrid_name'];
                 update_option('sendgrid_from_name', $name);
             }
             if (isset($_POST['sendgrid_email'])) {
                 $email = $_POST['sendgrid_email'];
                 update_option('sendgrid_from_email', $email);
             }
             if (isset($_POST['sendgrid_reply_to'])) {
                 $reply_to = $_POST['sendgrid_reply_to'];
                 update_option('sendgrid_reply_to', $reply_to);
             }
             if (isset($_POST['sendgrid_categories'])) {
                 $categories = $_POST['sendgrid_categories'];
                 update_option('sendgrid_categories', $categories);
             }
         }
     }
     $user = Sendgrid_Tools::get_username();
     $password = Sendgrid_Tools::get_password();
     $method = Sendgrid_Tools::get_send_method();
     $name = Sendgrid_Tools::get_from_name();
     $email = Sendgrid_Tools::get_from_email();
     $reply_to = Sendgrid_Tools::get_reply_to();
     $categories = Sendgrid_Tools::get_categories();
     $allowed_methods = array('smtp', 'api');
     if (!in_array($method, $allowed_methods)) {
         $message = 'Invalid send method, available methods are: "api" or "smtp".';
         $status = 'error';
     }
     if ('smtp' == $method and !class_exists('Swift')) {
         $message = 'You must have <a href="http://wordpress.org/plugins/swift-mailer/" target="_blank">' . 'Swift-mailer plugin</a> installed and activated';
         $status = 'error';
     }
     if ($user and $password) {
         if (!Sendgrid_Tools::check_username_password($user, $password)) {
             $message = 'Invalid username/password';
             $status = 'error';
         }
     }
     $are_global_credentials = (defined('SENDGRID_USERNAME') and defined('SENDGRID_PASSWORD'));
     require_once dirname(__FILE__) . '/../view/sendgrid_settings.php';
 }
示例#2
0
/**
 * Send mail, similar to PHP's mail
 *
 * A true return value does not automatically mean that the user received the
 * email successfully. It just only means that the method used was able to
 * process the request without any errors.
 *
 * Using the two 'wp_mail_from' and 'wp_mail_from_name' hooks allow from
 * creating a from address like 'Name <*****@*****.**>' when both are set. If
 * just 'wp_mail_from' is set, then just the email address will be used with no
 * name.
 *
 * The default content type is 'text/plain' which does not allow using HTML.
 * However, you can set the content type of the email by using the
 * 'wp_mail_content_type' filter.
 *
 * The default charset is based on the charset used on the blog. The charset can
 * be set using the 'wp_mail_charset' filter.
 *
 * @since 1.2.1
 * @uses apply_filters() Calls 'wp_mail' hook on an array of all of the parameters.
 * @uses apply_filters() Calls 'wp_mail_from' hook to get the from email address.
 * @uses apply_filters() Calls 'wp_mail_from_name' hook to get the from address name.
 * @uses apply_filters() Calls 'wp_mail_content_type' hook to get the email content type.
 * @uses apply_filters() Calls 'wp_mail_charset' hook to get the email charset
 *
 * @param   string|array  $to           Array or comma-separated list of email addresses to send message.
 * @param   string        $subject      Email subject
 * @param   string        $message      Message contents
 * @param   string|array  $headers      Optional. Additional headers.
 * @param   string|array  $attachments  Optional. Files to attach.
 * @return  bool                        Whether the email contents were sent successfully.
 */
function wp_mail($to, $subject, $message, $headers = '', $attachments = array())
{
    $header_is_object = false;
    if ($headers instanceof SendGrid\Email) {
        $header_is_object = true;
        $mail = $headers;
        // Compact the input, apply the filters, and extract them back out - empty header
        extract(apply_filters('wp_mail', compact('to', 'subject', 'message', '', 'attachments')));
    } else {
        $mail = new SendGrid\Email();
        // Compact the input, apply the filters, and extract them back out
        extract(apply_filters('wp_mail', compact('to', 'subject', 'message', 'headers', 'attachments')));
    }
    $method = Sendgrid_Tools::get_send_method();
    // prepare attachments
    $attached_files = array();
    if (!empty($attachments)) {
        if (!is_array($attachments)) {
            $pos = strpos(',', $attachments);
            if (false !== $pos) {
                $attachments = preg_split('/,\\s*/', $attachments);
            } else {
                $attachments = explode("\n", str_replace("\r\n", "\n", $attachments));
            }
        }
        if (is_array($attachments)) {
            foreach ($attachments as $attachment) {
                if (file_exists($attachment)) {
                    $attached_files[] = $attachment;
                }
            }
        }
    }
    // Headers
    $cc = array();
    $bcc = array();
    $unique_args = array();
    $from_name = $mail->getFromName();
    $from_email = $mail->getFrom();
    $replyto = $mail->getReplyTo();
    if (false === $header_is_object) {
        if (empty($headers)) {
            $headers = array();
        } else {
            if (!is_array($headers)) {
                // Explode the headers out, so this function can take both
                // string headers and an array of headers.
                $tempheaders = explode("\n", str_replace("\r\n", "\n", $headers));
            } else {
                $tempheaders = $headers;
            }
            $headers = array();
            // If it's actually got contents
            if (!empty($tempheaders)) {
                // Iterate through the raw headers
                foreach ((array) $tempheaders as $header) {
                    if (false === strpos($header, ':')) {
                        if (false !== stripos($header, 'boundary=')) {
                            $parts = preg_split('/boundary=/i', trim($header));
                            $boundary = trim(str_replace(array("'", '"'), '', $parts[1]));
                        }
                        continue;
                    }
                    // Explode them out
                    list($name, $content) = explode(':', trim($header), 2);
                    // Cleanup crew
                    $name = trim($name);
                    $content = trim($content);
                    switch (strtolower($name)) {
                        // Mainly for legacy -- process a From: header if it's there
                        case 'from':
                            if (false !== strpos($content, '<')) {
                                // So... making my life hard again?
                                $from_name = substr($content, 0, strpos($content, '<') - 1);
                                $from_name = str_replace('"', '', $from_name);
                                $from_name = trim($from_name);
                                $from_email = substr($content, strpos($content, '<') + 1);
                                $from_email = str_replace('>', '', $from_email);
                                $from_email = trim($from_email);
                            } else {
                                $from_email = trim($content);
                            }
                            break;
                        case 'content-type':
                            if (false !== strpos($content, ';')) {
                                list($type, $charset) = explode(';', $content);
                                $content_type = trim($type);
                                if (false !== stripos($charset, 'charset=')) {
                                    $charset = trim(str_replace(array('charset=', '"'), '', $charset));
                                } elseif (false !== stripos($charset, 'boundary=')) {
                                    $boundary = trim(str_replace(array('BOUNDARY=', 'boundary=', '"'), '', $charset));
                                    $charset = '';
                                }
                            } else {
                                $content_type = trim($content);
                            }
                            break;
                        case 'cc':
                            $cc = array_merge((array) $cc, explode(',', $content));
                            foreach ($cc as $key => $recipient) {
                                $cc[$key] = trim($recipient);
                            }
                            break;
                        case 'bcc':
                            $bcc = array_merge((array) $bcc, explode(',', $content));
                            foreach ($bcc as $key => $recipient) {
                                $bcc[$key] = trim($recipient);
                            }
                            break;
                        case 'reply-to':
                            $replyto = $content;
                            break;
                        case 'unique-args':
                            if (false !== strpos($content, ';')) {
                                $unique_args = explode(';', $content);
                            } else {
                                $unique_args = (array) trim($content);
                            }
                            foreach ($unique_args as $unique_arg) {
                                if (false !== strpos($content, '=')) {
                                    list($key, $val) = explode('=', $unique_arg);
                                    $mail->addUniqueArg(trim($key), trim($val));
                                }
                            }
                            break;
                        case 'template':
                            $template_ok = Sendgrid_Tools::check_template(trim($content));
                            if ($template_ok) {
                                $mail->setTemplateId(trim($content));
                            } elseif (Sendgrid_Tools::get_template()) {
                                $mail->setTemplateId(Sendgrid_Tools::get_template());
                            }
                            break;
                        case 'categories':
                            $categories = explode(',', trim($content));
                            foreach ($categories as $category) {
                                $mail->addCategory($category);
                            }
                            break;
                        case 'x-smtpapi-to':
                            $xsmtpapi_tos = explode(',', trim($content));
                            foreach ($xsmtpapi_tos as $xsmtpapi_to) {
                                $mail->addSmtpapiTo($xsmtpapi_to);
                            }
                            break;
                        case 'substitutions':
                            if (false !== strpos($content, ';')) {
                                $substitutions = explode(';', $content);
                            } else {
                                $substitutions = (array) trim($content);
                            }
                            foreach ($substitutions as $substitution) {
                                if (false !== strpos($content, '=')) {
                                    list($key, $val) = explode('=', $substitution);
                                    $mail->addSubstitution('%' . trim($key) . '%', explode(',', trim($val)));
                                }
                            }
                            break;
                        case 'sections':
                            if (false !== strpos($content, ';')) {
                                $sections = explode(';', $content);
                            } else {
                                $sections = (array) trim($content);
                            }
                            foreach ($sections as $section) {
                                if (false !== strpos($content, '=')) {
                                    list($key, $val) = explode('=', $section);
                                    $mail->addSection('%' . trim($key) . '%', trim($val));
                                }
                            }
                            break;
                        default:
                            // Add it to our grand headers array
                            $headers[trim($name)] = trim($content);
                            break;
                    }
                }
            }
        }
    }
    // From email and name
    // If we don't have a name from the input headers
    if (!isset($from_name) or !$from_name) {
        $from_name = stripslashes(Sendgrid_Tools::get_from_name());
    }
    /* If we don't have an email from the input headers default to wordpress@$sitename
     * Some hosts will block outgoing mail from this address if it doesn't exist but
     * there's no easy alternative. Defaulting to admin_email might appear to be another
     * option but some hosts may refuse to relay mail from an unknown domain. See
     * http://trac.wordpress.org/ticket/5007.
     */
    if (!isset($from_email)) {
        $from_email = trim(Sendgrid_Tools::get_from_email());
        if (!$from_email) {
            // Get the site domain and get rid of www.
            $sitename = strtolower($_SERVER['SERVER_NAME']);
            if (!$sitename and 'smtp' == $method) {
                return false;
            }
            if ('www.' == substr($sitename, 0, 4)) {
                $sitename = substr($sitename, 4);
            }
            $from_email = "wordpress@{$sitename}";
        }
    }
    // Plugin authors can override the potentially troublesome default
    $from_email = apply_filters('wp_mail_from', $from_email);
    $from_name = apply_filters('wp_mail_from_name', $from_name);
    // Set destination addresses
    if (!is_array($to)) {
        $to = explode(',', $to);
    }
    // Add any CC and BCC recipients
    if (!empty($cc)) {
        foreach ((array) $cc as $key => $recipient) {
            // Break $recipient into name and address parts if in the format "Foo <*****@*****.**>"
            if (preg_match('/(.*)<(.+)>/', $recipient, $matches)) {
                if (count($matches) == 3) {
                    $cc[$key] = trim($matches[2]);
                }
            }
        }
    }
    if (!empty($bcc)) {
        foreach ((array) $bcc as $key => $recipient) {
            // Break $recipient into name and address parts if in the format "Foo <*****@*****.**>"
            if (preg_match('/(.*)<(.+)>/', $recipient, $matches)) {
                if (3 == count($matches)) {
                    $bcc[$key] = trim($matches[2]);
                }
            }
        }
    }
    $toname = array();
    foreach ((array) $to as $key => $recipient) {
        $toname[$key] = " ";
        // Break $recipient into name and address parts if in the format "Foo <*****@*****.**>"
        if (preg_match('/(.*)<(.+)>/', $recipient, $matches)) {
            if (3 == count($matches)) {
                $to[$key] = trim($matches[2]);
                $toname[$key] = trim($matches[1]);
            }
        }
    }
    // Set Content-Type from header of from global variable
    $global_content_type = Sendgrid_Tools::get_content_type();
    if (!isset($content_type)) {
        if (!$global_content_type or 'plaintext' == $global_content_type) {
            $content_type = 'text/plain';
        } elseif ('html' == $global_content_type) {
            $content_type = 'text/html';
        } else {
            $content_type = 'text/plain';
        }
    }
    if (!array_key_exists('sendgrid_override_template', $GLOBALS['wp_filter'])) {
        $template = Sendgrid_Tools::get_template();
        if ($template) {
            $mail->setTemplateId($template);
        }
    } else {
        $message = apply_filters('sendgrid_override_template', $message, $content_type);
    }
    $content_type = apply_filters('wp_mail_content_type', $content_type);
    $mail->setSubject($subject)->setText($message)->addCategory(SENDGRID_CATEGORY)->setFrom($from_email);
    if ('api' == $method) {
        $mail->addTo($to, $toname);
    } else {
        $mail->addTo($to);
    }
    $categories = explode(',', Sendgrid_Tools::get_categories());
    foreach ($categories as $category) {
        $mail->addCategory($category);
    }
    // send HTML content
    if ('text/plain' !== $content_type) {
        $mail->setHtml(Sendgrid_Tools::remove_all_tag_urls($message));
    }
    // set from name
    if ($from_email) {
        $mail->setFromName($from_name);
    }
    // set from cc
    if (count($cc)) {
        $mail->setCcs($cc);
    }
    // set from bcc
    if (count($bcc)) {
        $mail->setBccs($bcc);
    }
    if (!isset($replyto)) {
        $replyto = trim(Sendgrid_Tools::get_reply_to());
    }
    $reply_to_found = preg_match('/.*<(.*)>.*/i', $replyto, $result);
    if ($reply_to_found) {
        $replyto = $result[1];
    }
    $mail->setReplyTo($replyto);
    // add attachemnts
    if (count($attached_files)) {
        $mail->setAttachments($attached_files);
    }
    $sendgrid = Sendgrid_WP::get_instance();
    if (!$sendgrid) {
        return false;
    }
    return $sendgrid->send($mail);
}
 /**
  * Display SendGrid settings page content
  */
 public static function show_settings_page()
 {
     if ('POST' == $_SERVER['REQUEST_METHOD']) {
         if (isset($_POST['email_test']) and $_POST['email_test']) {
             $to = $_POST['sendgrid_to'];
             $subject = stripslashes($_POST['sendgrid_subj']);
             $body = stripslashes($_POST['sendgrid_body']);
             $headers = $_POST['sendgrid_headers'];
             if (preg_match("/content-type:\\s*text\\/html/i", $headers)) {
                 $body_br = nl2br($body);
             } else {
                 $body_br = $body;
             }
             $sent = wp_mail($to, $subject, $body_br, $headers);
             if ('api' == Sendgrid_Tools::get_send_method()) {
                 $sent = json_decode($sent['body']);
                 if ("success" == $sent->message) {
                     $message = 'Email sent.';
                     $status = 'updated';
                 } else {
                     $errors = $sent->errors[0] ? $sent->errors[0] : $sent;
                     $message = 'Email not sent. ' . $errors;
                     $status = 'error';
                     $error_type = 'sending';
                 }
             } elseif ('smtp' == Sendgrid_Tools::get_send_method()) {
                 if (true === $sent) {
                     $message = 'Email sent.';
                     $status = 'updated';
                 } else {
                     $message = 'Email not sent. ' . $sent;
                     $status = 'error';
                     $error_type = 'sending';
                 }
             }
         } else {
             if (isset($_POST['auth_method'])) {
                 if ($_POST['auth_method'] == 'apikey') {
                     if (!$_POST['sendgrid_api_key']) {
                         $message = 'Api key is required';
                         $status = 'error';
                     } else {
                         if (!Sendgrid_Tools::check_api_key($_POST['sendgrid_api_key'])) {
                             $message = 'Invalid or without permissions api key';
                             $status = 'error';
                         }
                     }
                 } else {
                     if (!$_POST['sendgrid_user'] or !$_POST['sendgrid_pwd']) {
                         $message = 'Username/Password are required';
                         $status = 'error';
                     } else {
                         if (!Sendgrid_Tools::check_username_password($_POST['sendgrid_user'], $_POST['sendgrid_pwd'])) {
                             $message = 'Invalid username/password';
                             $status = 'error';
                         }
                     }
                 }
             }
             if (isset($_POST['sendgrid_name'])) {
                 $name = $_POST['sendgrid_name'];
                 update_option('sendgrid_from_name', $name);
             }
             if (isset($_POST['sendgrid_email'])) {
                 $email = $_POST['sendgrid_email'];
                 update_option('sendgrid_from_email', $email);
             }
             if (isset($_POST['sendgrid_reply_to'])) {
                 $reply_to = $_POST['sendgrid_reply_to'];
                 update_option('sendgrid_reply_to', $reply_to);
             }
             if (isset($_POST['sendgrid_categories'])) {
                 $categories = $_POST['sendgrid_categories'];
                 update_option('sendgrid_categories', $categories);
             }
             if (isset($_POST['sendgrid_template'])) {
                 $template = $_POST['sendgrid_template'];
                 update_option('sendgrid_template', $template);
             }
             if (isset($_POST['sendgrid_api'])) {
                 $method = $_POST['sendgrid_api'];
                 update_option('sendgrid_api', $method);
             }
             if (isset($_POST['auth_method'])) {
                 $auth_method = $_POST['auth_method'];
                 update_option('sendgrid_auth_method', $auth_method);
             }
             if (isset($_POST['sendgrid_port'])) {
                 $port = $_POST['sendgrid_port'];
                 update_option('sendgrid_port', $port);
             }
             if (!isset($status) or isset($status) and $status != 'error') {
                 $message = 'Options saved.';
                 $status = 'updated';
                 if (isset($_POST['sendgrid_api_key'])) {
                     $user = $_POST['sendgrid_api_key'];
                     update_option('sendgrid_api_key', $user);
                 }
                 if (isset($_POST['sendgrid_user'])) {
                     $user = $_POST['sendgrid_user'];
                     update_option('sendgrid_user', $user);
                 }
                 if (isset($_POST['sendgrid_pwd'])) {
                     $password = $_POST['sendgrid_pwd'];
                     update_option('sendgrid_pwd', $password);
                 }
             }
         }
     }
     $user = Sendgrid_Tools::get_username();
     $password = Sendgrid_Tools::get_password();
     $api_key = Sendgrid_Tools::get_api_key();
     $method = Sendgrid_Tools::get_send_method();
     $auth_method = Sendgrid_Tools::get_auth_method();
     $name = stripslashes(Sendgrid_Tools::get_from_name());
     $email = Sendgrid_Tools::get_from_email();
     $reply_to = Sendgrid_Tools::get_reply_to();
     $categories = stripslashes(Sendgrid_Tools::get_categories());
     $template = stripslashes(Sendgrid_Tools::get_template());
     $port = Sendgrid_Tools::get_port();
     $allowed_methods = array('smtp', 'api');
     if (!in_array($method, $allowed_methods)) {
         $message = 'Invalid send method, available methods are: "api" or "smtp".';
         $status = 'error';
     }
     if ('smtp' == $method and !class_exists('Swift')) {
         $message = 'You must have <a href="http://wordpress.org/plugins/swift-mailer/" target="_blank">' . 'Swift-mailer plugin</a> installed and activated';
         $status = 'error';
     }
     if ($api_key) {
         if (!Sendgrid_Tools::check_api_key($api_key)) {
             $message = 'Invalid api key';
             $status = 'error';
         }
     } else {
         if ($user and $password) {
             if (!Sendgrid_Tools::check_username_password($user, $password)) {
                 $message = 'Invalid username/password';
                 $status = 'error';
             }
         }
     }
     if ($template) {
         if (!Sendgrid_Tools::check_template($template)) {
             $message = 'Template not found';
             $status = 'error';
         }
     }
     $are_global_credentials = (defined('SENDGRID_USERNAME') and defined('SENDGRID_PASSWORD'));
     $is_global_api_key = defined('SENDGRID_API_KEY');
     $has_port = defined('SENDGRID_PORT');
     require_once dirname(__FILE__) . '/../view/sendgrid_settings.php';
 }
 /**
  * Display SendGrid settings page content
  *
  * @return void
  */
 public static function show_settings_page()
 {
     $response = null;
     $error_from_update = false;
     if ('POST' == $_SERVER['REQUEST_METHOD'] and !isset($_POST['sg_dismiss_widget_notice'])) {
         $response = self::do_post($_POST);
         if (isset($response['status']) and $response['status'] == 'error') {
             $error_from_update = true;
         }
     }
     $status = '';
     $message = '';
     $user = Sendgrid_Tools::get_username();
     $password = Sendgrid_Tools::get_password();
     $api_key = Sendgrid_Tools::get_api_key();
     $send_method = Sendgrid_Tools::get_send_method();
     $auth_method = Sendgrid_Tools::get_auth_method();
     $name = stripslashes(Sendgrid_Tools::get_from_name());
     $email = Sendgrid_Tools::get_from_email();
     $reply_to = Sendgrid_Tools::get_reply_to();
     $categories = stripslashes(Sendgrid_Tools::get_categories());
     $template = stripslashes(Sendgrid_Tools::get_template());
     $port = Sendgrid_Tools::get_port();
     $content_type = Sendgrid_Tools::get_content_type();
     $unsubscribe_group_id = Sendgrid_Tools::get_unsubscribe_group();
     $stats_categories = stripslashes(Sendgrid_Tools::get_stats_categories());
     $mc_api_key = Sendgrid_Tools::get_mc_api_key();
     $mc_list_id = Sendgrid_Tools::get_mc_list_id();
     $mc_opt_use_transactional = Sendgrid_Tools::get_mc_opt_use_transactional();
     $mc_opt_incl_fname_lname = Sendgrid_Tools::get_mc_opt_incl_fname_lname();
     $mc_opt_req_fname_lname = Sendgrid_Tools::get_mc_opt_req_fname_lname();
     $mc_signup_confirmation_page = Sendgrid_Tools::get_mc_signup_confirmation_page();
     $mc_signup_email_subject = Sendgrid_Tools::get_mc_signup_email_subject();
     if (false == $mc_signup_email_subject) {
         $mc_signup_email_subject = self::DEFAULT_SIGNUP_EMAIL_SUBJECT . get_bloginfo('name');
     }
     $mc_signup_email_content = Sendgrid_Tools::get_mc_signup_email_content();
     if (false == $mc_signup_email_content) {
         $mc_signup_email_content = self::DEFAULT_SIGNUP_EMAIL_CONTENT . get_bloginfo('name') . '&lt;/p&gt;';
     }
     $mc_signup_email_content = stripslashes($mc_signup_email_content);
     $mc_signup_email_content_text = Sendgrid_Tools::get_mc_signup_email_content_text();
     if (false == $mc_signup_email_content_text) {
         $mc_signup_email_content_text = self::DEFAULT_SIGNUP_EMAIL_CONTENT_TEXT . get_bloginfo('name');
     }
     $mc_signup_email_content_text = stripslashes($mc_signup_email_content_text);
     $confirmation_pages = get_pages(array('parent' => 0));
     $checked_use_transactional = '';
     if ('true' == $mc_opt_use_transactional) {
         $checked_use_transactional = 'checked';
     }
     $checked_incl_fname_lname = '';
     if ('true' == $mc_opt_incl_fname_lname) {
         $checked_incl_fname_lname = 'checked';
     }
     $checked_req_fname_lname = '';
     if ('true' == $mc_opt_req_fname_lname) {
         $checked_req_fname_lname = 'checked';
     }
     $contact_lists = Sendgrid_NLVX::get_all_lists();
     $contact_list_id_is_valid = false;
     if (false != $contact_lists) {
         foreach ($contact_lists as $key => $list) {
             if ($mc_list_id == $list['id']) {
                 $contact_list_id_is_valid = true;
                 break;
             }
         }
     }
     $allowed_send_methods = array('API');
     if (class_exists('Swift')) {
         $allowed_send_methods[] = 'SMTP';
     }
     $is_mc_api_key_valid = true;
     if ('true' == $mc_opt_use_transactional and 'apikey' == $auth_method and !empty($api_key)) {
         if (!Sendgrid_Tools::check_api_key_mc($api_key)) {
             $is_mc_api_key_valid = false;
         }
     } else {
         if ('true' != $mc_opt_use_transactional) {
             if (!Sendgrid_Tools::check_api_key_mc($mc_api_key)) {
                 $is_mc_api_key_valid = false;
             }
         }
     }
     if ($is_mc_api_key_valid) {
         Sendgrid_Tools::set_mc_auth_valid('true');
     } else {
         Sendgrid_Tools::set_mc_auth_valid('false');
     }
     if (!$error_from_update) {
         if (!in_array(strtoupper($send_method), $allowed_send_methods)) {
             $message = 'Invalid send method configured in the config file, available methods are: ' . join(", ", $allowed_send_methods);
             $status = 'error';
         }
         if ('apikey' == $auth_method and !empty($api_key)) {
             if (!Sendgrid_Tools::check_api_key($api_key, true)) {
                 $message = 'API Key is invalid or without permissions.';
                 $status = 'error';
             } elseif ('true' == $mc_opt_use_transactional and !$is_mc_api_key_valid) {
                 $message = 'The configured API Key for subscription widget is invalid, empty or without permissions.';
                 $status = 'error';
             } elseif ('error' != $status) {
                 $status = 'valid_auth';
             }
         } elseif ('credentials' == $auth_method and !empty($user) and !empty($password)) {
             if (!Sendgrid_Tools::check_username_password($user, $password, true)) {
                 $message = 'Username and password are invalid.';
                 $status = 'error';
             } elseif ('error' != $status) {
                 $status = 'valid_auth';
             }
         }
         if ($template and !Sendgrid_Tools::check_template($template)) {
             $message = 'Template not found.';
             $status = 'error';
         }
         if (!in_array($port, Sendgrid_Tools::$allowed_ports)) {
             $message = 'Invalid port configured in the config file, available ports are: ' . join(",", Sendgrid_Tools::$allowed_ports);
             $status = 'error';
         }
         if (!in_array($auth_method, Sendgrid_Tools::$allowed_auth_methods)) {
             $message = 'Invalid authentication method configured in the config file, available options are: ' . join(", ", Sendgrid_Tools::$allowed_auth_methods);
             $status = 'error';
         }
         if (defined('SENDGRID_CONTENT_TYPE')) {
             if (!in_array(SENDGRID_CONTENT_TYPE, Sendgrid_Tools::$allowed_content_type)) {
                 $message = 'Invalid content type, available content types are: "plaintext" or "html".';
                 $status = 'error';
             }
         }
         if (defined('SENDGRID_FROM_EMAIL')) {
             if (!Sendgrid_Tools::is_valid_email(SENDGRID_FROM_EMAIL)) {
                 $message = 'Sending email address is not valid in config file.';
                 $status = 'error';
             }
         }
         if (defined('SENDGRID_REPLY_TO')) {
             if (!Sendgrid_Tools::is_valid_email(SENDGRID_REPLY_TO)) {
                 $message = 'Reply email address is not valid in config file.';
                 $status = 'error';
             }
         }
     }
     // get unsubscribe groups
     $unsubscribe_groups = Sendgrid_Tools::get_all_unsubscribe_groups();
     $no_permission_on_unsubscribe_groups = false;
     if ('apikey' == $auth_method and 'true' != Sendgrid_Tools::get_asm_permission()) {
         $no_permission_on_unsubscribe_groups = true;
     }
     $is_env_auth_method = defined('SENDGRID_AUTH_METHOD');
     $is_env_send_method = defined('SENDGRID_SEND_METHOD');
     $is_env_username = defined('SENDGRID_USERNAME');
     $is_env_password = defined('SENDGRID_PASSWORD');
     $is_env_api_key = defined('SENDGRID_API_KEY');
     $is_env_port = defined('SENDGRID_PORT');
     $is_env_content_type = defined('SENDGRID_CONTENT_TYPE');
     $is_env_unsubscribe_group = defined('SENDGRID_UNSUBSCRIBE_GROUP');
     $is_env_mc_api_key = defined('SENDGRID_MC_API_KEY');
     $is_env_mc_list_id = defined('SENDGRID_MC_LIST_ID');
     $is_env_mc_opt_use_transactional = defined('SENDGRID_MC_OPT_USE_TRANSACTIONAL');
     $is_env_mc_opt_incl_fname_lname = defined('SENDGRID_MC_OPT_INCL_FNAME_LNAME');
     $is_env_mc_opt_req_fname_lname = defined('SENDGRID_MC_OPT_REQ_FNAME_LNAME');
     $is_env_mc_signup_email_subject = defined('SENDGRID_MC_SIGNUP_EMAIL_SUBJECT');
     $is_env_mc_signup_email_content = defined('SENDGRID_MC_SIGNUP_EMAIL_CONTENT');
     $is_env_mc_signup_email_content_text = defined('SENDGRID_MC_SIGNUP_EMAIL_CONTENT_TEXT');
     $is_env_mc_signup_confirmation_page = defined('SENDGRID_MC_SIGNUP_CONFIRMATION_PAGE');
     if ($response and $status != 'error') {
         $message = $response['message'];
         $status = $response['status'];
         if (array_key_exists('error_type', $response)) {
             $error_type = $response['error_type'];
         }
     }
     require_once dirname(__FILE__) . '/../view/sendgrid_settings.php';
 }
 /**
  * Send mail, similar to PHP's mail
  *
  * A true return value does not automatically mean that the user received the
  * email successfully. It just only means that the method used was able to
  * process the request without any errors.
  *
  * Using the two 'wp_mail_from' and 'wp_mail_from_name' hooks allow from
  * creating a from address like 'Name <*****@*****.**>' when both are set. If
  * just 'wp_mail_from' is set, then just the email address will be used with no
  * name.
  *
  * The default content type is 'text/plain' which does not allow using HTML.
  * However, you can set the content type of the email by using the
  * 'wp_mail_content_type' filter.
  *
  * The default charset is based on the charset used on the blog. The charset can
  * be set using the 'wp_mail_charset' filter.
  *
  * @since 1.2.1
  * @uses apply_filters() Calls 'wp_mail' hook on an array of all of the parameters.
  * @uses apply_filters() Calls 'wp_mail_from' hook to get the from email address.
  * @uses apply_filters() Calls 'wp_mail_from_name' hook to get the from address name.
  * @uses apply_filters() Calls 'wp_mail_content_type' hook to get the email content type.
  * @uses apply_filters() Calls 'wp_mail_charset' hook to get the email charset
  *
  * @param   string|array  $to           Array or comma-separated list of email addresses to send message.
  * @param   string        $subject      Email subject
  * @param   string        $message      Message contents
  * @param   string|array  $headers      Optional. Additional headers.
  * @param   string|array  $attachments  Optional. Files to attach.
  * @return  bool                        Whether the email contents were sent successfully.
  */
 function wp_mail($to, $subject, $message, $headers = '', $attachments = array())
 {
     $sendgrid = new SendGrid(Sendgrid_Tools::get_username(), Sendgrid_Tools::get_password());
     $mail = new SendGrid\Email();
     $method = Sendgrid_Tools::get_send_method();
     // Compact the input, apply the filters, and extract them back out
     extract(apply_filters('wp_mail', compact('to', 'subject', 'message', 'headers', 'attachments')));
     // prepare attachments
     $attached_files = array();
     if (!empty($attachments)) {
         if (!is_array($attachments)) {
             $pos = strpos(',', $attachments);
             if (false !== $pos) {
                 $attachments = preg_split('/,\\s*/', $attachments);
             } else {
                 $attachments = explode("\n", str_replace("\r\n", "\n", $attachments));
             }
         }
         if (is_array($attachments)) {
             foreach ($attachments as $attachment) {
                 if (file_exists($attachment)) {
                     $attached_files[] = $attachment;
                 }
             }
         }
     }
     // Headers
     $cc = array();
     $bcc = array();
     if (empty($headers)) {
         $headers = array();
     } else {
         if (!is_array($headers)) {
             // Explode the headers out, so this function can take both
             // string headers and an array of headers.
             $tempheaders = explode("\n", str_replace("\r\n", "\n", $headers));
         } else {
             $tempheaders = $headers;
         }
         $headers = array();
         // If it's actually got contents
         if (!empty($tempheaders)) {
             // Iterate through the raw headers
             foreach ((array) $tempheaders as $header) {
                 if (false === strpos($header, ':')) {
                     if (false !== stripos($header, 'boundary=')) {
                         $parts = preg_split('/boundary=/i', trim($header));
                         $boundary = trim(str_replace(array("'", '"'), '', $parts[1]));
                     }
                     continue;
                 }
                 // Explode them out
                 list($name, $content) = explode(':', trim($header), 2);
                 // Cleanup crew
                 $name = trim($name);
                 $content = trim($content);
                 switch (strtolower($name)) {
                     // Mainly for legacy -- process a From: header if it's there
                     case 'from':
                         if (false !== strpos($content, '<')) {
                             // So... making my life hard again?
                             $from_name = substr($content, 0, strpos($content, '<') - 1);
                             $from_name = str_replace('"', '', $from_name);
                             $from_name = trim($from_name);
                             $from_email = substr($content, strpos($content, '<') + 1);
                             $from_email = str_replace('>', '', $from_email);
                             $from_email = trim($from_email);
                         } else {
                             $from_email = trim($content);
                         }
                         break;
                     case 'content-type':
                         if (false !== strpos($content, ';')) {
                             list($type, $charset) = explode(';', $content);
                             $content_type = trim($type);
                             if (false !== stripos($charset, 'charset=')) {
                                 $charset = trim(str_replace(array('charset=', '"'), '', $charset));
                             } elseif (false !== stripos($charset, 'boundary=')) {
                                 $boundary = trim(str_replace(array('BOUNDARY=', 'boundary=', '"'), '', $charset));
                                 $charset = '';
                             }
                         } else {
                             $content_type = trim($content);
                         }
                         break;
                     case 'cc':
                         $cc = array_merge((array) $cc, explode(',', $content));
                         foreach ($cc as $key => $recipient) {
                             $cc[$key] = trim($recipient);
                         }
                         break;
                     case 'bcc':
                         $bcc = array_merge((array) $bcc, explode(',', $content));
                         foreach ($bcc as $key => $recipient) {
                             $bcc[$key] = trim($recipient);
                         }
                         break;
                     case 'reply-to':
                         $replyto = $content;
                         break;
                     default:
                         // Add it to our grand headers array
                         $headers[trim($name)] = trim($content);
                         break;
                 }
             }
         }
     }
     // From email and name
     // If we don't have a name from the input headers
     if (!isset($from_name)) {
         $from_name = Sendgrid_Tools::get_from_name();
     }
     /* If we don't have an email from the input headers default to wordpress@$sitename
      * Some hosts will block outgoing mail from this address if it doesn't exist but
      * there's no easy alternative. Defaulting to admin_email might appear to be another
      * option but some hosts may refuse to relay mail from an unknown domain. See
      * http://trac.wordpress.org/ticket/5007.
      */
     if (!isset($from_email)) {
         $from_email = trim(Sendgrid_Tools::get_from_email());
         if (!$from_email) {
             // Get the site domain and get rid of www.
             $sitename = strtolower($_SERVER['SERVER_NAME']);
             if ('www.' == substr($sitename, 0, 4)) {
                 $sitename = substr($sitename, 4);
             }
             $from_email = "wordpress@{$sitename}";
         }
     }
     // Plugin authors can override the potentially troublesome default
     $from_email = apply_filters('wp_mail_from', $from_email);
     $from_name = apply_filters('wp_mail_from_name', $from_name);
     // Set destination addresses
     if (!is_array($to)) {
         $to = explode(',', $to);
     }
     // Add any CC and BCC recipients
     if (!empty($cc)) {
         foreach ((array) $cc as $key => $recipient) {
             // Break $recipient into name and address parts if in the format "Foo <*****@*****.**>"
             if (preg_match('/(.*)<(.+)>/', $recipient, $matches)) {
                 if (count($matches) == 3) {
                     $cc[$key] = trim($matches[2]);
                 }
             }
         }
     }
     if (!empty($bcc)) {
         foreach ((array) $bcc as $key => $recipient) {
             // Break $recipient into name and address parts if in the format "Foo <*****@*****.**>"
             if (preg_match('/(.*)<(.+)>/', $recipient, $matches)) {
                 if (3 == count($matches)) {
                     $bcc[$key] = trim($matches[2]);
                 }
             }
         }
     }
     if ('api' == $method and (count($cc) or count($bcc))) {
         foreach ((array) $to as $key => $recipient) {
             // Break $recipient into name and address parts if in the format "Foo <*****@*****.**>"
             if (preg_match('/(.*)<(.+)>/', $recipient, $matches)) {
                 if (3 == count($matches)) {
                     $to[$key] = trim($matches[2]);
                 }
             }
         }
     }
     // Set Content-Type and charset
     // If we don't have a content-type from the input headers
     if (!isset($content_type)) {
         $content_type = 'text/plain';
     }
     $content_type = apply_filters('wp_mail_content_type', $content_type);
     $mail->setTos($to)->setSubject($subject)->setText($message)->addCategory(SENDGRID_CATEGORY)->setFrom($from_email);
     $categories = explode(',', Sendgrid_Tools::get_categories());
     foreach ($categories as $category) {
         $mail->addCategory($category);
     }
     // send HTML content
     if ('text/plain' !== $content_type) {
         $mail->setHtml($message);
     }
     // set from name
     if ($from_email) {
         $mail->setFromName($from_name);
     }
     // set from cc
     if (count($cc)) {
         $mail->setCcs($cc);
     }
     // set from bcc
     if (count($bcc)) {
         $mail->setBccs($bcc);
     }
     if (!isset($replyto)) {
         $replyto = trim(Sendgrid_Tools::get_reply_to());
     }
     $reply_to_found = preg_match('/.*<(.*)>.*/i', $replyto, $result);
     if ($reply_to_found) {
         $replyto = $result[1];
     }
     $mail->setReplyTo($replyto);
     // add attachemnts
     if (count($attached_files)) {
         $mail->setAttachments($attached_files);
     }
     // Send!
     try {
         if ('api' == $method) {
             return wp_send($mail, $sendgrid);
         } elseif ('smtp' == $method) {
             if (class_exists('Swift')) {
                 $smtp = new Smtp(Sendgrid_Tools::get_username(), Sendgrid_Tools::get_password());
                 return $smtp->send($mail);
             } else {
                 return 'Error: Swift Class not loaded. Please activate Swift plugin or use API.';
             }
         }
     } catch (Exception $e) {
         return $e->getMessage();
     }
     return false;
 }
示例#6
0
 /**
  * Display SendGrid settings page content
  */
 public static function show_settings_page()
 {
     $response = null;
     $error_from_update = false;
     if ('POST' == $_SERVER['REQUEST_METHOD']) {
         $response = self::do_post($_POST);
         if (isset($response['status']) and $response['status'] == 'error') {
             $error_from_update = true;
         }
     }
     $status = '';
     $message = '';
     $user = Sendgrid_Tools::get_username();
     $password = Sendgrid_Tools::get_password();
     $api_key = Sendgrid_Tools::get_api_key();
     $send_method = Sendgrid_Tools::get_send_method();
     $auth_method = Sendgrid_Tools::get_auth_method();
     $name = stripslashes(Sendgrid_Tools::get_from_name());
     $email = Sendgrid_Tools::get_from_email();
     $reply_to = Sendgrid_Tools::get_reply_to();
     $categories = stripslashes(Sendgrid_Tools::get_categories());
     $template = stripslashes(Sendgrid_Tools::get_template());
     $port = Sendgrid_Tools::get_port();
     $content_type = Sendgrid_Tools::get_content_type();
     $stats_categories = stripslashes(Sendgrid_Tools::get_stats_categories());
     $allowed_send_methods = array('API');
     if (class_exists('Swift')) {
         $allowed_send_methods[] = 'SMTP';
     }
     if (!$error_from_update) {
         if (!in_array(strtoupper($send_method), $allowed_send_methods)) {
             $message = 'Invalid send method configured in the config file, available methods are: ' . join(", ", $allowed_send_methods);
             $status = 'error';
         }
         if ('apikey' == $auth_method and !empty($api_key)) {
             if (!Sendgrid_Tools::check_api_key($api_key, true)) {
                 $message = 'API Key is invalid or without permissions.';
                 $status = 'error';
             } else {
                 $status = 'valid_auth';
             }
         } elseif ('credentials' == $auth_method and !empty($user) and !empty($password)) {
             if (!Sendgrid_Tools::check_username_password($user, $password, true)) {
                 $message = 'Username and password are invalid.';
                 $status = 'error';
             } else {
                 $status = 'valid_auth';
             }
         }
         if ($template and !Sendgrid_Tools::check_template($template)) {
             $message = 'Template not found.';
             $status = 'error';
         }
         if (!in_array($port, Sendgrid_Tools::$allowed_ports)) {
             $message = 'Invalid port configured in the config file, available ports are: ' . join(",", Sendgrid_Tools::$allowed_ports);
             $status = 'error';
         }
         if (!in_array($auth_method, Sendgrid_Tools::$allowed_auth_methods)) {
             $message = 'Invalid authentication method configured in the config file, available options are: ' . join(", ", Sendgrid_Tools::$allowed_auth_methods);
             $status = 'error';
         }
         if (defined('SENDGRID_CONTENT_TYPE')) {
             if (!in_array(SENDGRID_CONTENT_TYPE, Sendgrid_Tools::$allowed_content_type)) {
                 $message = 'Invalid content type, available content types are: "plaintext" or "html".';
                 $status = 'error';
             }
         }
         if (defined('SENDGRID_FROM_EMAIL')) {
             if (!Sendgrid_Tools::is_valid_email(SENDGRID_FROM_EMAIL)) {
                 $message = 'Sending email address is not valid in config file.';
                 $status = 'error';
             }
         }
         if (defined('SENDGRID_REPLY_TO')) {
             if (!Sendgrid_Tools::is_valid_email(SENDGRID_REPLY_TO)) {
                 $message = 'Reply email address is not valid in config file.';
                 $status = 'error';
             }
         }
     }
     $is_env_auth_method = defined('SENDGRID_AUTH_METHOD');
     $is_env_send_method = defined('SENDGRID_SEND_METHOD');
     $is_env_username = defined('SENDGRID_USERNAME');
     $is_env_password = defined('SENDGRID_PASSWORD');
     $is_env_api_key = defined('SENDGRID_API_KEY');
     $is_env_port = defined('SENDGRID_PORT');
     $is_env_content_type = defined('SENDGRID_CONTENT_TYPE');
     if ($response && $status != 'error') {
         $message = $response['message'];
         $status = $response['status'];
         if (array_key_exists('error_type', $response)) {
             $error_type = $response['error_type'];
         }
     }
     require_once dirname(__FILE__) . '/../view/sendgrid_settings.php';
 }