private static function smtp_instance($auth_method) { if (!class_exists('Swift')) { self::$error = array("success" => false, "message" => "Swift Class not loaded. Please activate Swift plugin or use API."); return null; } switch ($auth_method) { case 'apikey': $smtp = new Sendgrid_SMTP("apikey", Sendgrid_Tools::get_api_key()); break; case 'credentials': $smtp = new Sendgrid_SMTP(Sendgrid_Tools::get_username(), Sendgrid_Tools::get_password()); break; default: return null; break; } if (Sendgrid_Tools::get_port()) { if (in_array(Sendgrid_Tools::get_port(), Sendgrid_Tools::$allowed_ports)) { $smtp->set_port(Sendgrid_Tools::get_port()); } else { $smtp->set_port(Sendgrid_SMTP::TLS); } } return $smtp; }
public function bp_email(BP_Email $email) { $recipients = $email->get_to(); $to = array(); foreach ($recipients as $recipient) { $to[] = $recipient->get_address(); } $subject = $email->get_subject('replace-tokens'); $message = normalize_whitespace($email->get_content_plaintext('replace-tokens')); $filter_set = false; if ('plaintext' != Sendgrid_Tools::get_content_type()) { add_filter('wp_mail_content_type', array($this, 'set_html_content_type'), 100); $filter_set = true; $message = $email->get_template('add-content'); } $result = wp_mail($to, $subject, $message); if ($filter_set) { remove_filter('wp_mail_content_type', array($this, 'set_html_content_type')); } return $result; }
/** * Check apikey stats permissions * * @param string $apikey sendgrid apikey * @return bool */ public static function check_api_key_stats($apikey) { $required_scopes = array('stats.read', 'categories.stats.read', 'categories.stats.sums.read'); return Sendgrid_Tools::check_api_key_scopes($apikey, $required_scopes); }
/** * 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'; }
/** * Send OptIn email * * @param string $email Email of subscribed user * @param string $first_name First Name of subscribed user * @param string $last_name Last Name of subscribed user * @return bool */ public static function send_confirmation_email($email, $first_name = '', $last_name = '', $from_settings = false) { $subject = Sendgrid_Tools::get_mc_signup_email_subject(); $content = Sendgrid_Tools::get_mc_signup_email_content(); $content_text = Sendgrid_Tools::get_mc_signup_email_content_text(); if (false == $subject or false == $content or false == $content_text) { return false; } $subject = stripslashes($subject); $content = stripslashes($content); $content_text = stripslashes($content_text); $to = array($email); $token = Sendgrid_OptIn_API_Endpoint::generate_email_token($email, $first_name, $last_name); $transient = get_transient($token); if ($transient and isset($transient['email']) and !$from_settings) { return false; } if (false == set_transient($token, array('email' => $email, 'first_name' => $first_name, 'last_name' => $last_name), 24 * 60 * 60) and !$from_settings and $transient) { return false; } $confirmation_link = site_url() . '?__sg_api=1&token=' . $token; $headers = new SendGrid\Email(); $headers->addSubstitution('%confirmation_link%', array($confirmation_link))->addCategory('wp_sendgrid_subscription_widget'); add_filter('sendgrid_mail_text', function () use(&$content_text) { return $content_text; }); $result = wp_mail($to, $subject, $content, $headers); return $result; }
/** * Get SendGrid stats from API and return JSON response, * this function work like a page and is used for ajax request by javascript functions * * @return void; */ public static function get_ajax_statistics() { if (!isset($_POST['sendgrid_nonce']) || !wp_verify_nonce($_POST['sendgrid_nonce'], 'sendgrid-nonce')) { die('Permissions check failed'); } $parameters = array(); $parameters['api_user'] = Sendgrid_Tools::get_username(); $parameters['api_key'] = Sendgrid_Tools::get_password(); $api_key = Sendgrid_Tools::get_api_key(); if ("apikey" == Sendgrid_Tools::get_auth_method()) { $parameters['apikey'] = $api_key; } $parameters['data_type'] = 'global'; if (array_key_exists('days', $_POST)) { $parameters['days'] = $_POST['days']; } else { $parameters['start_date'] = $_POST['start_date']; $parameters['end_date'] = $_POST['end_date']; } $endpoint = 'v3/stats'; if (isset($_POST['type']) && 'general' != $_POST['type']) { if ('wordpress' == $_POST['type']) { $parameters['categories'] = 'wp_sendgrid_plugin'; } else { $parameters['categories'] = urlencode($_POST['type']); } $endpoint = 'v3/categories/stats'; } echo Sendgrid_Tools::curl_request($endpoint, $parameters); die; }
/** * 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); }
private static function save_settings($params) { if (!isset($params['auth_method'])) { $params['auth_method'] = Sendgrid_Tools::get_auth_method(); } switch ($params['auth_method']) { case 'apikey': if (!isset($params['sendgrid_apikey'])) { break; } if (!$params['sendgrid_apikey']) { $response = array("message" => "API Key is empty.", "status" => "error"); } elseif (!Sendgrid_Tools::check_api_key($params['sendgrid_apikey'], true)) { $response = array("message" => "API Key is invalid or without permissions.", "status" => "error"); break; } Sendgrid_Tools::set_api_key($params['sendgrid_apikey']); break; case 'credentials': if (!isset($params['sendgrid_username']) and !isset($params['sendgrid_password'])) { break; } $save_username = true; $save_password = true; if (!isset($params['sendgrid_username'])) { $save_username = false; $params['sendgrid_username'] = Sendgrid_Tools::get_username(); } if (!isset($params['sendgrid_password'])) { $save_password = false; $params['sendgrid_password'] = Sendgrid_Tools::get_username(); } if (isset($params['sendgrid_username']) and !$params['sendgrid_username'] or isset($params['sendgrid_password']) and !$params['sendgrid_password']) { $response = array("message" => "Username or password is empty.", "status" => "error"); } elseif (!Sendgrid_Tools::check_username_password($params['sendgrid_username'], $params['sendgrid_password'], true)) { $response = array("message" => "Username and password are invalid.", "status" => "error"); break; } if ($save_username) { Sendgrid_Tools::set_username($params['sendgrid_username']); } if ($save_password) { Sendgrid_Tools::set_password($params['sendgrid_password']); } break; } if (isset($params['sendgrid_name'])) { update_option('sendgrid_from_name', $params['sendgrid_name']); } if (isset($params['sendgrid_email'])) { update_option('sendgrid_from_email', $params['sendgrid_email']); } if (isset($params['sendgrid_reply_to'])) { update_option('sendgrid_reply_to', $params['sendgrid_reply_to']); } if (isset($params['sendgrid_categories'])) { update_option('sendgrid_categories', $params['sendgrid_categories']); } if (isset($params['sendgrid_stats_categories'])) { update_option('sendgrid_stats_categories', $params['sendgrid_stats_categories']); } if (isset($params['sendgrid_template'])) { if (!Sendgrid_Tools::check_template($params['sendgrid_template'])) { $response = array("message" => "Template not found.", "status" => "error"); } else { update_option('sendgrid_template', $params['sendgrid_template']); } } if (isset($params['send_method'])) { update_option('sendgrid_api', $params['send_method']); } if (isset($params['auth_method']) && in_array($params['auth_method'], Sendgrid_Tools::$allowed_auth_methods)) { update_option('sendgrid_auth_method', $params['auth_method']); } if (isset($params['sendgrid_port'])) { update_option('sendgrid_port', $params['sendgrid_port']); } if (isset($params['content_type'])) { update_option('sendgrid_content_type', $params['content_type']); } if (isset($response) and $response['status'] == 'error') { return $response; } return array("message" => "Options are saved.", "status" => "updated"); }
/** * Get SendGrid stats from API and return JSON response, * this function work like a page and is used for ajax request by javascript functions * * @return void; */ public static function get_ajax_statistics() { if (!isset($_POST['sendgrid_nonce']) || !wp_verify_nonce($_POST['sendgrid_nonce'], 'sendgrid-nonce')) { die('Permissions check failed'); } $parameters = array(); $parameters['api_user'] = get_option('sendgrid_user'); $parameters['api_key'] = get_option('sendgrid_pwd'); $parameters['data_type'] = 'global'; $parameters['metric'] = 'all'; if (array_key_exists('days', $_POST)) { $parameters['days'] = $_POST['days']; } else { $parameters['start_date'] = $_POST['start_date']; $parameters['end_date'] = $_POST['end_date']; } if ($_POST['type'] and 'wordpress' == $_POST['type']) { $parameters['category'] = 'wp_sendgrid_plugin'; } echo Sendgrid_Tools::curl_request('api/stats.get.json', $parameters); die; }
/** * Adds a recipient in the SendGrid MC contact db and adds it to the list * * @param string $email The email of the recipient * @param string $first_name The first name of the recipient * @param string $last_name The last name of the recipient * * @return bool True if successful, false otherwise. */ public static function create_and_add_recipient_to_list($email, $first_name = '', $last_name = '') { $list_id = Sendgrid_Tools::get_mc_list_id(); if (false == $list_id) { return false; } $recipient_id = Sendgrid_NLVX::add_recipient($email, $first_name, $last_name); if (false == $recipient_id) { return false; } return Sendgrid_NLVX::add_recipient_to_list($recipient_id, $list_id); }
/** * 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'; }
/** * Uploads a contact using the parameters specified in the settings page * * @param mixed $params array of parameters from $_POST * * @return mixed response array with message and status */ private static function send_contact_upload_test($params) { $email = $params['sendgrid_test_email']; if (!Sendgrid_Tools::is_valid_email($email)) { return array('message' => 'Email address provided is invalid.', 'status' => 'error', 'error_type' => 'upload'); } switch (Sendgrid_Tools::get_auth_method()) { case 'apikey': $apikey = Sendgrid_Tools::get_api_key(); if (!Sendgrid_Tools::check_api_key($apikey, true)) { return array('message' => 'API Key used for mail send is invalid or without permissions.', 'status' => 'error', 'error_type' => 'upload'); } break; case 'credentials': $username = Sendgrid_Tools::get_username(); $password = Sendgrid_Tools::get_password(); if (!Sendgrid_Tools::check_username_password($params['sendgrid_username'], $params['sendgrid_password'], true)) { return array('message' => 'Credentials used for mail send are invalid.', 'status' => 'error', 'error_type' => 'upload'); } break; default: return array('message' => 'An error occured when trying to check your transactional credentials. Please check that they are correct on the General Settings tab.', 'status' => 'error', 'error_type' => 'upload'); } if (false == Sendgrid_OptIn_API_Endpoint::send_confirmation_email($email, '', '', true)) { return array('message' => 'An error occured when trying send the subscription email. Please make sure you have configured all settings properly.', 'status' => 'error', 'error_type' => 'upload'); } return array('message' => 'Subscription confirmation email was sent.', 'status' => 'updated'); }
/** * 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; }
<div class="wrap clearfix" id="sendgrid-statistics-page"> <div class="pull-left sendgrid-statistics-header"> <div id="icon-sendgrid" class="icon32"><br></div> <h2 id="sendgrid-wordpress-statistics-header" class="sendgrid-statistics-header-toggle">SendGrid Wordpress Statistics</h2> <h2 id="sendgrid-general-statistics-header" class="sendgrid-statistics-header-toggle" style="display: none;">SendGrid General Statistics</h2> <a href="https://app.sendgrid.com/statistics" target="_blank" class="more-statistics">SendGrid Portal</a> </div> <div class="pull-right sendgrid-statistics-change-type"> <select id="sendgrid-statistics-change-type"> <option value="general">General statistics</option> <option value="wordpress" selected="selected">Wordpress statistics</option> <?php $categories = Sendgrid_Tools::get_categories_array(); ?> <?php if (is_array($categories) and count($categories) > 0) { ?> <optgroup label="Categories:"> <?php foreach ($categories as $cateogry) { ?> <option value="<?php echo $cateogry; ?> "><?php echo $cateogry; ?> </option> <?php } ?>
private static function send_test_email($params) { $to = $params['sendgrid_to']; if (!Sendgrid_Tools::is_valid_email($to)) { return array('message' => 'Email address in field "To" is not valid.', 'status' => 'error', 'error_type' => 'sending'); } $subject = stripslashes($params['sendgrid_subj']); $body = stripslashes($params['sendgrid_body']); $headers = $params['sendgrid_headers']; if (!Sendgrid_Tools::valid_emails_in_headers($headers)) { return array('message' => 'One or more email addresses in field "headers" are not valid.', 'status' => 'error', 'error_type' => 'sending'); } 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 (true === $sent) { return array('message' => 'Email was sent.', 'status' => 'updated'); } return array('message' => 'Email wasn\'t sent.', 'status' => 'error', 'error_type' => 'sending'); }
/** * Return categories array * * @return array categories */ public static function get_categories_array() { $categories = Sendgrid_Tools::get_categories(); if (strlen(trim($categories))) { return explode(',', $categories); } return array(); }
/** * 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' == get_option('sendgrid_api')) { $sent = json_decode($sent); 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' == get_option('sendgrid_api')) { if (true === $sent) { $message = 'Email sent.'; $status = 'updated'; } else { $message = 'Email not sent. ' . $sent; $status = 'error'; } } } else { $message = 'Options saved.'; $status = 'updated'; $user = $_POST['sendgrid_user']; update_option('sendgrid_user', $user); $password = $_POST['sendgrid_pwd']; update_option('sendgrid_pwd', $password); $method = $_POST['sendgrid_api']; 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'; update_option('sendgrid_api', 'api'); } else { update_option('sendgrid_api', $method); } $name = $_POST['sendgrid_name']; update_option('sendgrid_from_name', $name); $email = $_POST['sendgrid_email']; update_option('sendgrid_from_email', $email); $reply_to = $_POST['sendgrid_reply_to']; update_option('sendgrid_reply_to', $reply_to); $categories = $_POST['sendgrid_categories']; update_option('sendgrid_categories', $categories); } } $user = get_option('sendgrid_user'); $password = get_option('sendgrid_pwd'); $method = get_option('sendgrid_api'); $name = get_option('sendgrid_from_name'); $email = get_option('sendgrid_from_email'); $reply_to = get_option('sendgrid_reply_to'); $categories = get_option('sendgrid_categories'); $valid_credentials = false; if ($user and $password) { if (in_array('curl', get_loaded_extensions())) { $valid_credentials = Sendgrid_Tools::check_username_password($user, $password); if (!$valid_credentials) { $message = 'Invalid username/password'; $status = 'error'; } } else { $message = 'You must have PHP-curl extension enabled'; $status = 'error'; } } require_once dirname(__FILE__) . '/../view/sendgrid_settings.php'; }
/** * Method that displays the subscription form * * @return void */ private function display_form() { echo '<form method="post" id="sendgrid_mc_email_form" class="mc_email_form" action="#sendgrid_mc_email_subscribe">'; if ('true' == Sendgrid_Tools::get_mc_opt_incl_fname_lname()) { if ('true' == Sendgrid_Tools::get_mc_opt_req_fname_lname()) { echo '<div class="sendgrid-mc-field">'; echo '<label for="sendgrid_mc_first_name">First Name<sup>*</sup> : </label>'; echo '<input id="sendgrid_mc_first_name" name="sendgrid_mc_first_name" type="text" value="" required/>'; echo '</div>'; echo '<div class="sendgrid-mc-field">'; echo '<label for="sendgrid_mc_last_name">Last Name<sup>*</sup> : </label>'; echo '<input id="sendgrid_mc_last_name" name="sendgrid_mc_last_name" type="text" value="" required/>'; echo '</div>'; } else { echo '<div class="sendgrid-mc-field">'; echo '<label for="sendgrid_mc_first_name">First Name : </label>'; echo '<input id="sendgrid_mc_first_name" name="sendgrid_mc_first_name" type="text" value=""/>'; echo '</div>'; echo '<div class="sendgrid-mc-field">'; echo '<label for="sendgrid_mc_last_name">Last Name : </label>'; echo '<input id="sendgrid_mc_last_name" name="sendgrid_mc_last_name" type="text" value=""/>'; echo '</div>'; } } echo '<div class="sendgrid-mc-field">'; echo '<label for="sendgrid_mc_email">Email<sup>*</sup> : </label>'; echo '<input id="sendgrid_mc_email" name="sendgrid_mc_email" value="" required/>'; echo '</div>'; echo '<div class="sendgrid-mc-button">'; echo '<input type="submit" id="sendgrid_mc_email_submit" value="Subscribe" />'; echo '</div>'; echo '</form>'; }
return; } // Load plugin files require_once plugin_dir_path(__FILE__) . 'lib/class-sendgrid-tools.php'; require_once plugin_dir_path(__FILE__) . 'lib/class-sendgrid-settings.php'; require_once plugin_dir_path(__FILE__) . 'lib/class-sendgrid-mc-optin.php'; require_once plugin_dir_path(__FILE__) . 'lib/class-sendgrid-statistics.php'; require_once plugin_dir_path(__FILE__) . 'lib/sendgrid/sendgrid-wp-mail.php'; require_once plugin_dir_path(__FILE__) . 'lib/class-sendgrid-nlvx-widget.php'; require_once plugin_dir_path(__FILE__) . 'lib/class-sendgrid-virtual-pages.php'; require_once plugin_dir_path(__FILE__) . 'lib/class-sendgrid-filters.php'; // Widget Registration if ('true' == Sendgrid_Tools::get_mc_auth_valid()) { add_action('widgets_init', 'register_sendgrid_widgets'); } else { add_action('widgets_init', 'unregister_sendgrid_widgets'); } // Widget notice dismissed if (isset($_POST['sg_dismiss_widget_notice'])) { Sendgrid_Tools::set_mc_widget_notice_dismissed('true'); } // Display widget notice if ('true' != Sendgrid_Tools::get_mc_widget_notice_dismissed()) { add_action('admin_notices', 'sg_subscription_widget_admin_notice'); } // Initialize SendGrid Settings new Sendgrid_Settings(plugin_basename(__FILE__)); // Initialize SendGrid Statistics new Sendgrid_Statistics(); // Initialize SendGrid Filters new Sendgrid_Filters();
/** * Returns true if all the emails in the headers are valid, false otherwise * * @param mixed $headers string or array of headers * * @return bool */ public static function valid_emails_in_headers($headers) { 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; } // If it's actually got contents if (!empty($tempheaders)) { // Iterate through the raw headers foreach ((array) $tempheaders as $header) { if (false === strpos($header, ':')) { 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, '<')) { $from_email = substr($content, strpos($content, '<') + 1); $from_email = str_replace('>', '', $from_email); $from_email = trim($from_email); } else { $from_email = trim($content); } if (!Sendgrid_Tools::is_valid_email($from_email)) { return false; } break; case 'cc': $cc = explode(',', $content); foreach ($cc as $key => $recipient) { if (!Sendgrid_Tools::is_valid_email(trim($recipient))) { return false; } } break; case 'bcc': $bcc = explode(',', $content); foreach ($bcc as $key => $recipient) { if (!Sendgrid_Tools::is_valid_email(trim($recipient))) { return false; } } break; case 'reply-to': if (!Sendgrid_Tools::is_valid_email($content)) { return false; } break; case 'x-smtpapi-to': $xsmtpapi_tos = explode(',', trim($content)); foreach ($xsmtpapi_tos as $xsmtpapi_to) { if (!Sendgrid_Tools::is_valid_email($xsmtpapi_to)) { return false; } } break; default: break; } } } return true; }