示例#1
0
 public static function configure_smtp(&$phpmailer)
 {
     $settings = WP_SendGrid_Settings::get_settings();
     $phpmailer->Mailer = 'smtp';
     $phpmailer->SMTPSecure = $settings['secure'] ? 'ssl' : 'none';
     $phpmailer->Host = 'smtp.sendgrid.net';
     $phpmailer->Port = $settings['secure'] ? 465 : 587;
     $phpmailer->SMTPAuth = true;
     $phpmailer->Username = $settings['username'];
     $phpmailer->Password = $settings['password'];
 }
 public static function get_settings()
 {
     if (isset(self::$settings)) {
         return self::$settings;
     }
     // First check the network settings.
     $settings = self::get_network_settings();
     // If network settings are empty, or override is enabled, check local settings
     if (isset($settings['override']) && $settings['override'] && !self::is_network_admin_page()) {
         $local_settings = self::get_local_settings();
         if (!empty($local_settings)) {
             $settings = array_merge($settings, $local_settings);
         }
     }
     self::$settings = apply_filters('wp_sendgrid_get_settings', $settings);
     return self::$settings;
 }
/**
 * 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())
{
    $options = WP_SendGrid_Settings::get_settings();
    // Compact the input, apply the filters, and extract them back out
    extract(apply_filters('wp_mail', compact('to', 'subject', 'message', 'headers', 'attachments')));
    // If message just has \n SendGrid doesn't get newlines
    // Might only be a problem on Windows systems
    $message = str_replace("\n", "\r\n", $message);
    if (!is_array($attachments)) {
        $attachments = explode("\n", str_replace("\r\n", "\n", $attachments));
    }
    // Headers
    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();
        $cc = array();
        $bcc = array();
        // If it's actually got contents
        if (!empty($tempheaders)) {
            // Iterate through the raw headers
            foreach ((array) $tempheaders as $header) {
                if (strpos($header, ':') === false) {
                    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 (strpos($content, '<') !== false) {
                            // 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 (strpos($content, ';') !== false) {
                            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));
                        break;
                    case 'bcc':
                        $bcc = array_merge((array) $bcc, explode(',', $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 = 'WordPress';
    }
    /* 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)) {
        // Get the site domain and get rid of www.
        $sitename = strtolower($_SERVER['SERVER_NAME']);
        if (substr($sitename, 0, 4) == 'www.') {
            $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);
    }
    // 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);
    /* TODO
    	// Set whether it's plaintext, depending on $content_type
    
    		$phpmailer->IsHTML( true ); */
    // TODO: I don't know that SendGrid supports different charsets. Shouldn't be a problem in most cases
    /*
     * // If we don't have a charset from the input headers
     * if ( !isset( $charset ) )
     *	$charset = get_bloginfo( 'charset' );
     *
     *
     * // Set the content-type and charset
     * $charset = apply_filters( 'wp_mail_charset', $charset );
     */
    $attachment_array = array();
    if (!empty($attachments)) {
        if (is_string($attachments)) {
            $attachments = preg_split('/,\\s*/', $attachments);
        }
        if (is_array($attachments)) {
            foreach ($attachments as $attachment) {
                if (file_exists($attachment)) {
                    $contents = file_get_contents($attachment);
                    $file = basename($attachment);
                    $attachment_array[$file] = $contents;
                }
            }
        }
    }
    $args = array('to' => $to, 'subject' => $subject, 'text' => $message, 'api_user' => $options['username'], 'api_key' => $options['password'], 'files' => $attachment_array, 'from' => $from_email, 'fromname' => $from_name);
    $xsmtpapi = apply_filters('wp_sendgrid_xsmtpapi', array(), $to, $subject, $message, $headers, $attachment_array);
    if (!empty($xsmtpapi)) {
        $args['x-smtpapi'] = json_encode($xsmtpapi);
    }
    if ('text/plain' !== $content_type) {
        $args['html'] = $message;
    }
    $args = apply_filters('wp_sendgrid_args', $args, $to, $subject, $message, $headers, $attachment_array);
    $response = json_decode(wp_remote_retrieve_body(wp_remote_post('https://sendgrid.com/api/mail.send.json', array('sslverify' => false, 'body' => $args))));
    if (isset($response->message) && $response->message == 'success') {
        return true;
    }
    return false;
}