wp_notify_postauthor

The timeline below displays how wordpress function wp_notify_postauthor has changed across different WordPress versions. If a version is not listed, refer to the next available version below.

WordPress Version: 6.3

/**
 * Notifies an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int|WP_Comment $comment_id Comment ID or WP_Comment object.
 * @param string         $deprecated Not used.
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8.0');
    }
    $comment = get_comment($comment_id);
    if (empty($comment) || empty($comment->comment_post_ID)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filters the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param string[] $emails     An array of email addresses to receive a comment notification.
     * @param string   $comment_id The comment ID as a numeric string.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment->comment_ID);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filters whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool   $notify     Whether to notify the post author of their own comment.
     *                           Default false.
     * @param string $comment_id The comment ID as a numeric string.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment->comment_ID);
    // The comment was left by the author.
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post.
    if ($author && !$notify_author && get_current_user_id() == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog.
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below.
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $switched_locale = switch_to_locale(get_locale());
    $comment_author_domain = '';
    if (WP_Http::is_ip_address($comment->comment_author_IP)) {
        $comment_author_domain = gethostbyaddr($comment->comment_author_IP);
    }
    /*
     * The blogname option is escaped with esc_html() on the way into the database in sanitize_option().
     * We want to reverse this for the plain text arena of emails.
     */
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    $comment_content = wp_specialchars_decode($comment->comment_content);
    switch ($comment->comment_type) {
        case 'trackback':
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: Trackback notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: Pingback notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments.
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Comment author's name, 2: Comment author's IP address, 3: Comment author's hostname. */
            $notify_message .= sprintf(__('Author: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Comment author email. */
            $notify_message .= sprintf(__('Email: %s'), $comment->comment_author_email) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            if ($comment->comment_parent && user_can($post->post_author, 'edit_comment', $comment->comment_parent)) {
                /* translators: Comment moderation. %s: Parent comment edit URL. */
                $notify_message .= sprintf(__('In reply to: %s'), admin_url("comment.php?action=editcomment&c={$comment->comment_parent}#wpbody-content")) . "\r\n";
            }
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: Comment notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    /* translators: %s: Comment URL. */
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment->comment_ID)) {
        if (EMPTY_TRASH_DAYS) {
            /* translators: Comment moderation. %s: Comment action URL. */
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        } else {
            /* translators: Comment moderation. %s: Comment action URL. */
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        }
        /* translators: Comment moderation. %s: Comment action URL. */
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', wp_parse_url(network_home_url(), PHP_URL_HOST));
    if ('' === $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' !== $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' !== $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . 'Content-Type: text/plain; charset="' . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filters the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param string $comment_id     Comment ID as a numeric string.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment->comment_ID);
    /**
     * Filters the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param string $comment_id Comment ID as a numeric string.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment->comment_ID);
    /**
     * Filters the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param string $comment_id      Comment ID as a numeric string.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment->comment_ID);
    foreach ($emails as $email) {
        wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    if ($switched_locale) {
        restore_previous_locale();
    }
    return true;
}

WordPress Version: 6.1

/**
 * Notifies an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int|WP_Comment $comment_id Comment ID or WP_Comment object.
 * @param string         $deprecated Not used.
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8.0');
    }
    $comment = get_comment($comment_id);
    if (empty($comment) || empty($comment->comment_post_ID)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filters the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param string[] $emails     An array of email addresses to receive a comment notification.
     * @param string   $comment_id The comment ID as a numeric string.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment->comment_ID);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filters whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool   $notify     Whether to notify the post author of their own comment.
     *                           Default false.
     * @param string $comment_id The comment ID as a numeric string.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment->comment_ID);
    // The comment was left by the author.
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post.
    if ($author && !$notify_author && get_current_user_id() == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog.
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below.
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $switched_locale = switch_to_locale(get_locale());
    $comment_author_domain = '';
    if (WP_Http::is_ip_address($comment->comment_author_IP)) {
        $comment_author_domain = gethostbyaddr($comment->comment_author_IP);
    }
    // The blogname option is escaped with esc_html() on the way into the database in sanitize_option().
    // We want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    $comment_content = wp_specialchars_decode($comment->comment_content);
    switch ($comment->comment_type) {
        case 'trackback':
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: Trackback notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: Pingback notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments.
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Comment author's name, 2: Comment author's IP address, 3: Comment author's hostname. */
            $notify_message .= sprintf(__('Author: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Comment author email. */
            $notify_message .= sprintf(__('Email: %s'), $comment->comment_author_email) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            if ($comment->comment_parent && user_can($post->post_author, 'edit_comment', $comment->comment_parent)) {
                /* translators: Comment moderation. %s: Parent comment edit URL. */
                $notify_message .= sprintf(__('In reply to: %s'), admin_url("comment.php?action=editcomment&c={$comment->comment_parent}#wpbody-content")) . "\r\n";
            }
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: Comment notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    /* translators: %s: Comment URL. */
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment->comment_ID)) {
        if (EMPTY_TRASH_DAYS) {
            /* translators: Comment moderation. %s: Comment action URL. */
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        } else {
            /* translators: Comment moderation. %s: Comment action URL. */
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        }
        /* translators: Comment moderation. %s: Comment action URL. */
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', wp_parse_url(network_home_url(), PHP_URL_HOST));
    if ('' === $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' !== $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' !== $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . 'Content-Type: text/plain; charset="' . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filters the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param string $comment_id     Comment ID as a numeric string.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment->comment_ID);
    /**
     * Filters the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param string $comment_id Comment ID as a numeric string.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment->comment_ID);
    /**
     * Filters the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param string $comment_id      Comment ID as a numeric string.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment->comment_ID);
    foreach ($emails as $email) {
        wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    if ($switched_locale) {
        restore_previous_locale();
    }
    return true;
}

WordPress Version: 5.9

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int|WP_Comment $comment_id Comment ID or WP_Comment object.
 * @param string         $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8.0');
    }
    $comment = get_comment($comment_id);
    if (empty($comment) || empty($comment->comment_post_ID)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filters the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param string[] $emails     An array of email addresses to receive a comment notification.
     * @param string   $comment_id The comment ID as a numeric string.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment->comment_ID);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filters whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool   $notify     Whether to notify the post author of their own comment.
     *                           Default false.
     * @param string $comment_id The comment ID as a numeric string.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment->comment_ID);
    // The comment was left by the author.
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post.
    if ($author && !$notify_author && get_current_user_id() == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog.
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below.
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $switched_locale = switch_to_locale(get_locale());
    $comment_author_domain = '';
    if (WP_Http::is_ip_address($comment->comment_author_IP)) {
        $comment_author_domain = gethostbyaddr($comment->comment_author_IP);
    }
    // The blogname option is escaped with esc_html() on the way into the database in sanitize_option().
    // We want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    $comment_content = wp_specialchars_decode($comment->comment_content);
    switch ($comment->comment_type) {
        case 'trackback':
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: Trackback notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: Pingback notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments.
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Comment author's name, 2: Comment author's IP address, 3: Comment author's hostname. */
            $notify_message .= sprintf(__('Author: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Comment author email. */
            $notify_message .= sprintf(__('Email: %s'), $comment->comment_author_email) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            if ($comment->comment_parent && user_can($post->post_author, 'edit_comment', $comment->comment_parent)) {
                /* translators: Comment moderation. %s: Parent comment edit URL. */
                $notify_message .= sprintf(__('In reply to: %s'), admin_url("comment.php?action=editcomment&c={$comment->comment_parent}#wpbody-content")) . "\r\n";
            }
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: Comment notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    /* translators: %s: Comment URL. */
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment->comment_ID)) {
        if (EMPTY_TRASH_DAYS) {
            /* translators: Comment moderation. %s: Comment action URL. */
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        } else {
            /* translators: Comment moderation. %s: Comment action URL. */
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        }
        /* translators: Comment moderation. %s: Comment action URL. */
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', wp_parse_url(network_home_url(), PHP_URL_HOST));
    if ('' === $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' !== $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' !== $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . 'Content-Type: text/plain; charset="' . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filters the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param string $comment_id     Comment ID as a numeric string.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment->comment_ID);
    /**
     * Filters the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param string $comment_id Comment ID as a numeric string.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment->comment_ID);
    /**
     * Filters the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param string $comment_id      Comment ID as a numeric string.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment->comment_ID);
    foreach ($emails as $email) {
        wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    if ($switched_locale) {
        restore_previous_locale();
    }
    return true;
}

WordPress Version: 5.5

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int|WP_Comment $comment_id Comment ID or WP_Comment object.
 * @param string         $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8.0');
    }
    $comment = get_comment($comment_id);
    if (empty($comment) || empty($comment->comment_post_ID)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filters the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param string[] $emails     An array of email addresses to receive a comment notification.
     * @param int      $comment_id The comment ID.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment->comment_ID);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filters whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool $notify     Whether to notify the post author of their own comment.
     *                         Default false.
     * @param int  $comment_id The comment ID.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment->comment_ID);
    // The comment was left by the author.
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post.
    if ($author && !$notify_author && get_current_user_id() == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog.
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below.
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $switched_locale = switch_to_locale(get_locale());
    $comment_author_domain = '';
    if (WP_Http::is_ip_address($comment->comment_author_IP)) {
        $comment_author_domain = gethostbyaddr($comment->comment_author_IP);
    }
    // The blogname option is escaped with esc_html() on the way into the database in sanitize_option().
    // We want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    $comment_content = wp_specialchars_decode($comment->comment_content);
    switch ($comment->comment_type) {
        case 'trackback':
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: Trackback notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: Pingback notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments.
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Comment author's name, 2: Comment author's IP address, 3: Comment author's hostname. */
            $notify_message .= sprintf(__('Author: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Comment author email. */
            $notify_message .= sprintf(__('Email: %s'), $comment->comment_author_email) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            if ($comment->comment_parent && user_can($post->post_author, 'edit_comment', $comment->comment_parent)) {
                /* translators: Comment moderation. %s: Parent comment edit URL. */
                $notify_message .= sprintf(__('In reply to: %s'), admin_url("comment.php?action=editcomment&c={$comment->comment_parent}#wpbody-content")) . "\r\n";
            }
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: Comment notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    /* translators: %s: Comment URL. */
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment->comment_ID)) {
        if (EMPTY_TRASH_DAYS) {
            /* translators: Comment moderation. %s: Comment action URL. */
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        } else {
            /* translators: Comment moderation. %s: Comment action URL. */
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        }
        /* translators: Comment moderation. %s: Comment action URL. */
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', wp_parse_url(network_home_url(), PHP_URL_HOST));
    if ('' === $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' !== $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' !== $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . 'Content-Type: text/plain; charset="' . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filters the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param int    $comment_id     Comment ID.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment->comment_ID);
    /**
     * Filters the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param int    $comment_id Comment ID.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment->comment_ID);
    /**
     * Filters the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param int    $comment_id      Comment ID.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment->comment_ID);
    foreach ($emails as $email) {
        wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    if ($switched_locale) {
        restore_previous_locale();
    }
    return true;
}

WordPress Version: 5.4

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int|WP_Comment  $comment_id Comment ID or WP_Comment object.
 * @param string          $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8.0');
    }
    $comment = get_comment($comment_id);
    if (empty($comment) || empty($comment->comment_post_ID)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filters the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param string[] $emails     An array of email addresses to receive a comment notification.
     * @param int      $comment_id The comment ID.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment->comment_ID);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filters whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool $notify     Whether to notify the post author of their own comment.
     *                         Default false.
     * @param int  $comment_id The comment ID.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment->comment_ID);
    // The comment was left by the author.
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post.
    if ($author && !$notify_author && get_current_user_id() == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog.
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below.
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $switched_locale = switch_to_locale(get_locale());
    $comment_author_domain = '';
    if (WP_Http::is_ip_address($comment->comment_author_IP)) {
        $comment_author_domain = gethostbyaddr($comment->comment_author_IP);
    }
    // The blogname option is escaped with esc_html() on the way into the database in sanitize_option().
    // We want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    $comment_content = wp_specialchars_decode($comment->comment_content);
    switch ($comment->comment_type) {
        case 'trackback':
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: Trackback notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: Pingback notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments.
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Comment author's name, 2: Comment author's IP address, 3: Comment author's hostname. */
            $notify_message .= sprintf(__('Author: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Comment author email. */
            $notify_message .= sprintf(__('Email: %s'), $comment->comment_author_email) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            if ($comment->comment_parent && user_can($post->post_author, 'edit_comment', $comment->comment_parent)) {
                /* translators: Comment moderation. %s: Parent comment edit URL. */
                $notify_message .= sprintf(__('In reply to: %s'), admin_url("comment.php?action=editcomment&c={$comment->comment_parent}#wpbody-content")) . "\r\n";
            }
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: Comment notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    /* translators: %s: Comment URL. */
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment->comment_ID)) {
        if (EMPTY_TRASH_DAYS) {
            /* translators: Comment moderation. %s: Comment action URL. */
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        } else {
            /* translators: Comment moderation. %s: Comment action URL. */
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        }
        /* translators: Comment moderation. %s: Comment action URL. */
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    if ('' == $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . 'Content-Type: text/plain; charset="' . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filters the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param int    $comment_id     Comment ID.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment->comment_ID);
    /**
     * Filters the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param int    $comment_id Comment ID.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment->comment_ID);
    /**
     * Filters the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param int    $comment_id      Comment ID.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment->comment_ID);
    foreach ($emails as $email) {
        wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    if ($switched_locale) {
        restore_previous_locale();
    }
    return true;
}

WordPress Version: 5.3

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int|WP_Comment  $comment_id Comment ID or WP_Comment object.
 * @param string          $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8.0');
    }
    $comment = get_comment($comment_id);
    if (empty($comment) || empty($comment->comment_post_ID)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filters the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param array $emails     An array of email addresses to receive a comment notification.
     * @param int   $comment_id The comment ID.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment->comment_ID);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filters whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool $notify     Whether to notify the post author of their own comment.
     *                         Default false.
     * @param int  $comment_id The comment ID.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment->comment_ID);
    // The comment was left by the author
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post
    if ($author && !$notify_author && $post->post_author == get_current_user_id()) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $switched_locale = switch_to_locale(get_locale());
    $comment_author_domain = '';
    if (WP_Http::is_ip_address($comment->comment_author_IP)) {
        $comment_author_domain = gethostbyaddr($comment->comment_author_IP);
    }
    // The blogname option is escaped with esc_html on the way into the database in sanitize_option
    // we want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    $comment_content = wp_specialchars_decode($comment->comment_content);
    switch ($comment->comment_type) {
        case 'trackback':
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: Trackback notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: Website IP address, 3: Website hostname. */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: Pingback notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments
            /* translators: %s: Post title. */
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Comment author's name, 2: Comment author's IP address, 3: Comment author's hostname. */
            $notify_message .= sprintf(__('Author: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: Comment author email. */
            $notify_message .= sprintf(__('Email: %s'), $comment->comment_author_email) . "\r\n";
            /* translators: %s: Trackback/pingback/comment author URL. */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: Comment text. */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: Comment notification email subject. 1: Site title, 2: Post title. */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    /* translators: %s: Comment URL. */
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment->comment_ID)) {
        if (EMPTY_TRASH_DAYS) {
            /* translators: Comment moderation. %s: Comment action URL. */
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        } else {
            /* translators: Comment moderation. %s: Comment action URL. */
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        }
        /* translators: Comment moderation. %s: Comment action URL. */
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    if ('' == $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . 'Content-Type: text/plain; charset="' . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filters the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param int    $comment_id     Comment ID.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment->comment_ID);
    /**
     * Filters the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param int    $comment_id Comment ID.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment->comment_ID);
    /**
     * Filters the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param int    $comment_id      Comment ID.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment->comment_ID);
    foreach ($emails as $email) {
        wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    if ($switched_locale) {
        restore_previous_locale();
    }
    return true;
}

WordPress Version: 5.2

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int|WP_Comment  $comment_id Comment ID or WP_Comment object.
 * @param string          $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8.0');
    }
    $comment = get_comment($comment_id);
    if (empty($comment) || empty($comment->comment_post_ID)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filters the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param array $emails     An array of email addresses to receive a comment notification.
     * @param int   $comment_id The comment ID.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment->comment_ID);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filters whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool $notify     Whether to notify the post author of their own comment.
     *                         Default false.
     * @param int  $comment_id The comment ID.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment->comment_ID);
    // The comment was left by the author
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post
    if ($author && !$notify_author && $post->post_author == get_current_user_id()) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $switched_locale = switch_to_locale(get_locale());
    $comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
    // The blogname option is escaped with esc_html on the way into the database in sanitize_option
    // we want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    $comment_content = wp_specialchars_decode($comment->comment_content);
    switch ($comment->comment_type) {
        case 'trackback':
            /* translators: %s: post title */
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: trackback/pingback website name, 2: website IP address, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: trackback/pingback/comment author URL */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: comment text */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: Trackback notification email subject. 1: Site title, 2: Post title */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            /* translators: %s: post title */
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: trackback/pingback website name, 2: website IP address, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: trackback/pingback/comment author URL */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: comment text */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: Pingback notification email subject. 1: Site title, 2: Post title */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments
            /* translators: %s: post title */
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: comment author's name, 2: comment author's IP address, 3: comment author's hostname */
            $notify_message .= sprintf(__('Author: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: comment author email */
            $notify_message .= sprintf(__('Email: %s'), $comment->comment_author_email) . "\r\n";
            /* translators: %s: trackback/pingback/comment author URL */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: comment text */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: Comment notification email subject. 1: Site title, 2: Post title */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment->comment_ID)) {
        if (EMPTY_TRASH_DAYS) {
            /* translators: Comment moderation. %s: Comment action URL */
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        } else {
            /* translators: Comment moderation. %s: Comment action URL */
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        }
        /* translators: Comment moderation. %s: Comment action URL */
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    if ('' == $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . 'Content-Type: text/plain; charset="' . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filters the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param int    $comment_id     Comment ID.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment->comment_ID);
    /**
     * Filters the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param int    $comment_id Comment ID.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment->comment_ID);
    /**
     * Filters the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param int    $comment_id      Comment ID.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment->comment_ID);
    foreach ($emails as $email) {
        @wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    if ($switched_locale) {
        restore_previous_locale();
    }
    return true;
}

WordPress Version: 5.1

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int|WP_Comment  $comment_id Comment ID or WP_Comment object.
 * @param string          $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8.0');
    }
    $comment = get_comment($comment_id);
    if (empty($comment) || empty($comment->comment_post_ID)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filters the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param array $emails     An array of email addresses to receive a comment notification.
     * @param int   $comment_id The comment ID.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment->comment_ID);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filters whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool $notify     Whether to notify the post author of their own comment.
     *                         Default false.
     * @param int  $comment_id The comment ID.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment->comment_ID);
    // The comment was left by the author
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post
    if ($author && !$notify_author && $post->post_author == get_current_user_id()) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $switched_locale = switch_to_locale(get_locale());
    $comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
    // The blogname option is escaped with esc_html on the way into the database in sanitize_option
    // we want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    $comment_content = wp_specialchars_decode($comment->comment_content);
    switch ($comment->comment_type) {
        case 'trackback':
            /* translators: %s: post title */
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: trackback/pingback website name, 2: website IP address, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: trackback/pingback/comment author URL */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: comment text */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            /* translators: %s: post title */
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: trackback/pingback website name, 2: website IP address, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: trackback/pingback/comment author URL */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: comment text */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments
            /* translators: %s: post title */
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: comment author's name, 2: comment author's IP address, 3: comment author's hostname */
            $notify_message .= sprintf(__('Author: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            /* translators: %s: comment author email */
            $notify_message .= sprintf(__('Email: %s'), $comment->comment_author_email) . "\r\n";
            /* translators: %s: trackback/pingback/comment author URL */
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            /* translators: %s: comment text */
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment->comment_ID)) {
        if (EMPTY_TRASH_DAYS) {
            /* translators: Comment moderation. %s: Comment action URL */
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        } else {
            /* translators: Comment moderation. %s: Comment action URL */
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        }
        /* translators: Comment moderation. %s: Comment action URL */
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    if ('' == $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . 'Content-Type: text/plain; charset="' . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filters the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param int    $comment_id     Comment ID.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment->comment_ID);
    /**
     * Filters the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param int    $comment_id Comment ID.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment->comment_ID);
    /**
     * Filters the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param int    $comment_id      Comment ID.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment->comment_ID);
    foreach ($emails as $email) {
        @wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    if ($switched_locale) {
        restore_previous_locale();
    }
    return true;
}

WordPress Version: 4.9

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int|WP_Comment  $comment_id Comment ID or WP_Comment object.
 * @param string          $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8.0');
    }
    $comment = get_comment($comment_id);
    if (empty($comment) || empty($comment->comment_post_ID)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filters the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param array $emails     An array of email addresses to receive a comment notification.
     * @param int   $comment_id The comment ID.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment->comment_ID);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filters whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool $notify     Whether to notify the post author of their own comment.
     *                         Default false.
     * @param int  $comment_id The comment ID.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment->comment_ID);
    // The comment was left by the author
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post
    if ($author && !$notify_author && $post->post_author == get_current_user_id()) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $switched_locale = switch_to_locale(get_locale());
    $comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
    // The blogname option is escaped with esc_html on the way into the database in sanitize_option
    // we want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    $comment_content = wp_specialchars_decode($comment->comment_content);
    switch ($comment->comment_type) {
        case 'trackback':
            /* translators: 1: Post title */
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: website IP address, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            /* translators: 1: Post title */
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: website IP address, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: comment author, 2: comment author's IP address, 3: comment author's hostname */
            $notify_message .= sprintf(__('Author: %1$s (IP address: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('Email: %s'), $comment->comment_author_email) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment->comment_ID)) {
        if (EMPTY_TRASH_DAYS) {
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        } else {
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        }
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    if ('' == $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filters the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param int    $comment_id     Comment ID.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment->comment_ID);
    /**
     * Filters the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param int    $comment_id Comment ID.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment->comment_ID);
    /**
     * Filters the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param int    $comment_id      Comment ID.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment->comment_ID);
    foreach ($emails as $email) {
        @wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    if ($switched_locale) {
        restore_previous_locale();
    }
    return true;
}

WordPress Version: 4.7

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int|WP_Comment  $comment_id Comment ID or WP_Comment object.
 * @param string          $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8.0');
    }
    $comment = get_comment($comment_id);
    if (empty($comment) || empty($comment->comment_post_ID)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filters the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param array $emails     An array of email addresses to receive a comment notification.
     * @param int   $comment_id The comment ID.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment->comment_ID);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filters whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool $notify     Whether to notify the post author of their own comment.
     *                         Default false.
     * @param int  $comment_id The comment ID.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment->comment_ID);
    // The comment was left by the author
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post
    if ($author && !$notify_author && $post->post_author == get_current_user_id()) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $switched_locale = switch_to_locale(get_locale());
    $comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
    // The blogname option is escaped with esc_html on the way into the database in sanitize_option
    // we want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    $comment_content = wp_specialchars_decode($comment->comment_content);
    switch ($comment->comment_type) {
        case 'trackback':
            /* translators: 1: Post title */
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: website IP, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            /* translators: 1: Post title */
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: Trackback/pingback website name, 2: website IP, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: comment author, 2: author IP, 3: author domain */
            $notify_message .= sprintf(__('Author: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('Email: %s'), $comment->comment_author_email) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment->comment_ID)) {
        if (EMPTY_TRASH_DAYS) {
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        } else {
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        }
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    if ('' == $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filters the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param int    $comment_id     Comment ID.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment->comment_ID);
    /**
     * Filters the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param int    $comment_id Comment ID.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment->comment_ID);
    /**
     * Filters the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param int    $comment_id      Comment ID.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment->comment_ID);
    foreach ($emails as $email) {
        @wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    if ($switched_locale) {
        restore_previous_locale();
    }
    return true;
}

WordPress Version: 4.6

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int|WP_Comment  $comment_id Comment ID or WP_Comment object.
 * @param string          $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8.0');
    }
    $comment = get_comment($comment_id);
    if (empty($comment) || empty($comment->comment_post_ID)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filters the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param array $emails     An array of email addresses to receive a comment notification.
     * @param int   $comment_id The comment ID.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment->comment_ID);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filters whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool $notify     Whether to notify the post author of their own comment.
     *                         Default false.
     * @param int  $comment_id The comment ID.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment->comment_ID);
    // The comment was left by the author
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post
    if ($author && !$notify_author && $post->post_author == get_current_user_id()) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
    // The blogname option is escaped with esc_html on the way into the database in sanitize_option
    // we want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    $comment_content = wp_specialchars_decode($comment->comment_content);
    switch ($comment->comment_type) {
        case 'trackback':
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: website name, 2: website IP, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: website name, 2: website IP, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: comment author, 2: author IP, 3: author domain */
            $notify_message .= sprintf(__('Author: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('Email: %s'), $comment->comment_author_email) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment->comment_ID)) {
        if (EMPTY_TRASH_DAYS) {
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        } else {
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        }
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    if ('' == $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filters the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param int    $comment_id     Comment ID.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment->comment_ID);
    /**
     * Filters the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param int    $comment_id Comment ID.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment->comment_ID);
    /**
     * Filters the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param int    $comment_id      Comment ID.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment->comment_ID);
    foreach ($emails as $email) {
        @wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    return true;
}

WordPress Version: 4.5

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int|WP_Comment  $comment_id Comment ID or WP_Comment object.
 * @param string          $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8');
    }
    $comment = get_comment($comment_id);
    if (empty($comment) || empty($comment->comment_post_ID)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filter the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param array $emails     An array of email addresses to receive a comment notification.
     * @param int   $comment_id The comment ID.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment->comment_ID);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filter whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool $notify     Whether to notify the post author of their own comment.
     *                         Default false.
     * @param int  $comment_id The comment ID.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment->comment_ID);
    // The comment was left by the author
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post
    if ($author && !$notify_author && $post->post_author == get_current_user_id()) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
    // The blogname option is escaped with esc_html on the way into the database in sanitize_option
    // we want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    $comment_content = wp_specialchars_decode($comment->comment_content);
    switch ($comment->comment_type) {
        case 'trackback':
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: website name, 2: website IP, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: website name, 2: website IP, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: comment author, 2: author IP, 3: author domain */
            $notify_message .= sprintf(__('Author: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('Email: %s'), $comment->comment_author_email) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment->comment_ID)) {
        if (EMPTY_TRASH_DAYS) {
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        } else {
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
        }
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment->comment_ID}#wpbody-content")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    if ('' == $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filter the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param int    $comment_id     Comment ID.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment->comment_ID);
    /**
     * Filter the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param int    $comment_id Comment ID.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment->comment_ID);
    /**
     * Filter the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param int    $comment_id      Comment ID.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment->comment_ID);
    foreach ($emails as $email) {
        @wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    return true;
}

WordPress Version: 4.4

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int|WP_Comment  $comment_id Comment ID or WP_Comment object.
 * @param string          $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8');
    }
    $comment = get_comment($comment_id);
    if (empty($comment) || empty($comment->comment_post_ID)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filter the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param array $emails     An array of email addresses to receive a comment notification.
     * @param int   $comment_id The comment ID.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment->comment_ID);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filter whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool $notify     Whether to notify the post author of their own comment.
     *                         Default false.
     * @param int  $comment_id The comment ID.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment->comment_ID);
    // The comment was left by the author
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post
    if ($author && !$notify_author && $post->post_author == get_current_user_id()) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
    // The blogname option is escaped with esc_html on the way into the database in sanitize_option
    // we want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    $comment_content = wp_specialchars_decode($comment->comment_content);
    switch ($comment->comment_type) {
        case 'trackback':
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: website name, 2: website IP, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: website name, 2: website IP, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: comment author, 2: author IP, 3: author domain */
            $notify_message .= sprintf(__('Author: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('Email: %s'), $comment->comment_author_email) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment->comment_ID)) {
        if (EMPTY_TRASH_DAYS) {
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment->comment_ID}")) . "\r\n";
        } else {
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment->comment_ID}")) . "\r\n";
        }
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment->comment_ID}")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    if ('' == $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filter the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param int    $comment_id     Comment ID.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment->comment_ID);
    /**
     * Filter the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param int    $comment_id Comment ID.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment->comment_ID);
    /**
     * Filter the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param int    $comment_id      Comment ID.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment->comment_ID);
    foreach ($emails as $email) {
        @wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    return true;
}

WordPress Version: 4.3

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int    $comment_id Comment ID
 * @param string $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8');
    }
    $comment = get_comment($comment_id);
    if (empty($comment)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filter the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param array $emails     An array of email addresses to receive a comment notification.
     * @param int   $comment_id The comment ID.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment_id);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filter whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool $notify     Whether to notify the post author of their own comment.
     *                         Default false.
     * @param int  $comment_id The comment ID.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment_id);
    // The comment was left by the author
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post
    if ($author && !$notify_author && $post->post_author == get_current_user_id()) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
    // The blogname option is escaped with esc_html on the way into the database in sanitize_option
    // we want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    switch ($comment->comment_type) {
        case 'trackback':
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: website name, 2: website IP, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment->comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: website name, 2: website IP, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment->comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: comment author, 2: author IP, 3: author domain */
            $notify_message .= sprintf(__('Author: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('E-mail: %s'), $comment->comment_author_email) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment->comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment_id)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment_id)) {
        if (EMPTY_TRASH_DAYS) {
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment_id}")) . "\r\n";
        } else {
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment_id}")) . "\r\n";
        }
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment_id}")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    if ('' == $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filter the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param int    $comment_id     Comment ID.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment_id);
    /**
     * Filter the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param int    $comment_id Comment ID.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment_id);
    /**
     * Filter the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param int    $comment_id      Comment ID.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment_id);
    foreach ($emails as $email) {
        @wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    return true;
}

WordPress Version: 4.2

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int $comment_id Comment ID
 * @param string $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8');
    }
    $comment = get_comment($comment_id);
    if (empty($comment)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filter the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param array $emails     An array of email addresses to receive a comment notification.
     * @param int   $comment_id The comment ID.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment_id);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filter whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool $notify     Whether to notify the post author of their own comment.
     *                         Default false.
     * @param int  $comment_id The comment ID.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment_id);
    // The comment was left by the author
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post
    if ($author && !$notify_author && $post->post_author == get_current_user_id()) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
    // The blogname option is escaped with esc_html on the way into the database in sanitize_option
    // we want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    switch ($comment->comment_type) {
        case 'trackback':
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: website name, 2: website IP, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment->comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: website name, 2: website IP, 3: website hostname */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment->comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: comment author, 2: author IP, 3: author domain */
            $notify_message .= sprintf(__('Author: %1$s (IP: %2$s, %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('E-mail: %s'), $comment->comment_author_email) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Whois: %s'), "http://whois.arin.net/rest/ip/{$comment->comment_author_IP}") . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), "\r\n" . $comment->comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment_id)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment_id)) {
        if (EMPTY_TRASH_DAYS) {
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment_id}")) . "\r\n";
        } else {
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment_id}")) . "\r\n";
        }
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment_id}")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    if ('' == $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filter the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param int    $comment_id     Comment ID.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment_id);
    /**
     * Filter the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param int    $comment_id Comment ID.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment_id);
    /**
     * Filter the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param int    $comment_id      Comment ID.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment_id);
    foreach ($emails as $email) {
        @wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    return true;
}

WordPress Version: 4.1

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int $comment_id Comment ID
 * @param string $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8');
    }
    $comment = get_comment($comment_id);
    if (empty($comment)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filter the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param array $emails     An array of email addresses to receive a comment notification.
     * @param int   $comment_id The comment ID.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment_id);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filter whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool $notify     Whether to notify the post author of their own comment.
     *                         Default false.
     * @param int  $comment_id The comment ID.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment_id);
    // The comment was left by the author
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post
    if ($author && !$notify_author && $post->post_author == get_current_user_id()) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
    // The blogname option is escaped with esc_html on the way into the database in sanitize_option
    // we want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    switch ($comment->comment_type) {
        case 'trackback':
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: website name, 2: author IP, 3: author domain */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), $comment->comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: comment author, 2: author IP, 3: author domain */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), $comment->comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: comment author, 2: author IP, 3: author domain */
            $notify_message .= sprintf(__('Author: %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('E-mail: %s'), $comment->comment_author_email) . "\r\n";
            $notify_message .= sprintf(__('URL: %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Whois: %s'), "http://whois.arin.net/rest/ip/{$comment->comment_author_IP}") . "\r\n";
            $notify_message .= sprintf(__('Comment: %s'), $comment->comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here:') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment_id)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment_id)) {
        if (EMPTY_TRASH_DAYS) {
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment_id}")) . "\r\n";
        } else {
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment_id}")) . "\r\n";
        }
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment_id}")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    if ('' == $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filter the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param int    $comment_id     Comment ID.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment_id);
    /**
     * Filter the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param int    $comment_id Comment ID.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment_id);
    /**
     * Filter the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param int    $comment_id      Comment ID.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment_id);
    foreach ($emails as $email) {
        @wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    return true;
}

WordPress Version: 3.9

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int $comment_id Comment ID
 * @param string $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8');
    }
    $comment = get_comment($comment_id);
    if (empty($comment)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array();
    if ($author) {
        $emails[] = $author->user_email;
    }
    /**
     * Filter the list of email addresses to receive a comment notification.
     *
     * By default, only post authors are notified of comments. This filter allows
     * others to be added.
     *
     * @since 3.7.0
     *
     * @param array $emails     An array of email addresses to receive a comment notification.
     * @param int   $comment_id The comment ID.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment_id);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filter whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors aren't notified of their comments on their own
     * posts. This filter allows you to override that.
     *
     * @since 3.8.0
     *
     * @param bool $notify     Whether to notify the post author of their own comment.
     *                         Default false.
     * @param int  $comment_id The comment ID.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment_id);
    // The comment was left by the author
    if ($author && !$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post
    if ($author && !$notify_author && $post->post_author == get_current_user_id()) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog
    if ($author && !$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
    // The blogname option is escaped with esc_html on the way into the database in sanitize_option
    // we want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    switch ($comment->comment_type) {
        case 'trackback':
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: website name, 2: author IP, 3: author domain */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL    : %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= __('Excerpt: ') . "\r\n" . $comment->comment_content . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here: ') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: comment author, 2: author IP, 3: author domain */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL    : %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= __('Excerpt: ') . "\r\n" . sprintf('[...] %s [...]', $comment->comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here: ') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: comment author, 2: author IP, 3: author domain */
            $notify_message .= sprintf(__('Author : %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('E-mail : %s'), $comment->comment_author_email) . "\r\n";
            $notify_message .= sprintf(__('URL    : %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Whois  : http://whois.arin.net/rest/ip/%s'), $comment->comment_author_IP) . "\r\n";
            $notify_message .= __('Comment: ') . "\r\n" . $comment->comment_content . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here: ') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    $notify_message .= sprintf(__('Permalink: %s'), get_comment_link($comment_id)) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment_id)) {
        if (EMPTY_TRASH_DAYS) {
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment_id}")) . "\r\n";
        } else {
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment_id}")) . "\r\n";
        }
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment_id}")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    if ('' == $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    /**
     * Filter the comment notification email text.
     *
     * @since 1.5.2
     *
     * @param string $notify_message The comment notification email text.
     * @param int    $comment_id     Comment ID.
     */
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment_id);
    /**
     * Filter the comment notification email subject.
     *
     * @since 1.5.2
     *
     * @param string $subject    The comment notification email subject.
     * @param int    $comment_id Comment ID.
     */
    $subject = apply_filters('comment_notification_subject', $subject, $comment_id);
    /**
     * Filter the comment notification email headers.
     *
     * @since 1.5.2
     *
     * @param string $message_headers Headers for the comment notification email.
     * @param int    $comment_id      Comment ID.
     */
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment_id);
    foreach ($emails as $email) {
        @wp_mail($email, wp_specialchars_decode($subject), $notify_message, $message_headers);
    }
    return true;
}

WordPress Version: 3.8

/**
 * Notify an author (and/or others) of a comment/trackback/pingback on a post.
 *
 * @since 1.0.0
 *
 * @param int $comment_id Comment ID
 * @param string $deprecated Not used
 * @return bool True on completion. False if no email addresses were specified.
 */
function wp_notify_postauthor($comment_id, $deprecated = null)
{
    if (null !== $deprecated) {
        _deprecated_argument(__FUNCTION__, '3.8');
    }
    $comment = get_comment($comment_id);
    if (empty($comment)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // Who to notify? By default, just the post author, but others can be added.
    $emails = array($author->user_email);
    /**
     * Filter the list of emails to receive a comment notification.
     *
     * Normally just post authors are notified of emails.
     * This filter lets you add others.
     *
     * @since 3.7.0
     *
     * @param array $emails     Array of email addresses to receive a comment notification.
     * @param int   $comment_id The comment ID.
     */
    $emails = apply_filters('comment_notification_recipients', $emails, $comment_id);
    $emails = array_filter($emails);
    // If there are no addresses to send the comment to, bail.
    if (!count($emails)) {
        return false;
    }
    // Facilitate unsetting below without knowing the keys.
    $emails = array_flip($emails);
    /**
     * Filter whether to notify comment authors of their comments on their own posts.
     *
     * By default, comment authors don't get notified of their comments
     * on their own post. This lets you override that.
     *
     * @since 3.8.0
     *
     * @param bool $notify     Whether to notify the post author of their own comment. Default false.
     * @param int  $comment_id The comment ID.
     */
    $notify_author = apply_filters('comment_notification_notify_author', false, $comment_id);
    // The comment was left by the author
    if (!$notify_author && $comment->user_id == $post->post_author) {
        unset($emails[$author->user_email]);
    }
    // The author moderated a comment on their own post
    if (!$notify_author && $post->post_author == get_current_user_id()) {
        unset($emails[$author->user_email]);
    }
    // The post author is no longer a member of the blog
    if (!$notify_author && !user_can($post->post_author, 'read_post', $post->ID)) {
        unset($emails[$author->user_email]);
    }
    // If there's no email to send the comment to, bail, otherwise flip array back around for use below
    if (!count($emails)) {
        return false;
    } else {
        $emails = array_flip($emails);
    }
    $comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
    // The blogname option is escaped with esc_html on the way into the database in sanitize_option
    // we want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    switch ($comment->comment_type) {
        case 'trackback':
            $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: website name, 2: author IP, 3: author domain */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL    : %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= __('Excerpt: ') . "\r\n" . $comment->comment_content . "\r\n\r\n";
            $notify_message .= __('You can see all trackbacks on this post here: ') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
            break;
        case 'pingback':
            $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: comment author, 2: author IP, 3: author domain */
            $notify_message .= sprintf(__('Website: %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('URL    : %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= __('Excerpt: ') . "\r\n" . sprintf('[...] %s [...]', $comment->comment_content) . "\r\n\r\n";
            $notify_message .= __('You can see all pingbacks on this post here: ') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
            break;
        default:
            // Comments
            $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
            /* translators: 1: comment author, 2: author IP, 3: author domain */
            $notify_message .= sprintf(__('Author : %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
            $notify_message .= sprintf(__('E-mail : %s'), $comment->comment_author_email) . "\r\n";
            $notify_message .= sprintf(__('URL    : %s'), $comment->comment_author_url) . "\r\n";
            $notify_message .= sprintf(__('Whois  : http://whois.arin.net/rest/ip/%s'), $comment->comment_author_IP) . "\r\n";
            $notify_message .= __('Comment: ') . "\r\n" . $comment->comment_content . "\r\n\r\n";
            $notify_message .= __('You can see all comments on this post here: ') . "\r\n";
            /* translators: 1: blog name, 2: post title */
            $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
            break;
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    $notify_message .= sprintf(__('Permalink: %s'), get_permalink($comment->comment_post_ID) . '#comment-' . $comment_id) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment_id)) {
        if (EMPTY_TRASH_DAYS) {
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment_id}")) . "\r\n";
        } else {
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment_id}")) . "\r\n";
        }
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment_id}")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    if ('' == $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment_id);
    $subject = apply_filters('comment_notification_subject', $subject, $comment_id);
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment_id);
    foreach ($emails as $email) {
        @wp_mail($email, $subject, $notify_message, $message_headers);
    }
    return true;
}

WordPress Version: 3.7

/**
 * Notify an author of a comment/trackback/pingback to one of their posts.
 *
 * @since 1.0.0
 *
 * @param int $comment_id Comment ID
 * @param string $comment_type Optional. The comment type either 'comment' (default), 'trackback', or 'pingback'
 * @return bool False if user email does not exist. True on completion.
 */
function wp_notify_postauthor($comment_id, $comment_type = '')
{
    $comment = get_comment($comment_id);
    if (empty($comment)) {
        return false;
    }
    $post = get_post($comment->comment_post_ID);
    $author = get_userdata($post->post_author);
    // The comment was left by the author
    if ($comment->user_id == $post->post_author) {
        return false;
    }
    // The author moderated a comment on his own post
    if ($post->post_author == get_current_user_id()) {
        return false;
    }
    // The post author is no longer a member of the blog
    if (!user_can($post->post_author, 'read_post', $post->ID)) {
        return false;
    }
    // If there's no email to send the comment to
    if ('' == $author->user_email) {
        return false;
    }
    $comment_author_domain = @gethostbyaddr($comment->comment_author_IP);
    // The blogname option is escaped with esc_html on the way into the database in sanitize_option
    // we want to reverse this for the plain text arena of emails.
    $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    if (empty($comment_type)) {
        $comment_type = 'comment';
    }
    if ('comment' == $comment_type) {
        $notify_message = sprintf(__('New comment on your post "%s"'), $post->post_title) . "\r\n";
        /* translators: 1: comment author, 2: author IP, 3: author domain */
        $notify_message .= sprintf(__('Author : %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
        $notify_message .= sprintf(__('E-mail : %s'), $comment->comment_author_email) . "\r\n";
        $notify_message .= sprintf(__('URL    : %s'), $comment->comment_author_url) . "\r\n";
        $notify_message .= sprintf(__('Whois  : http://whois.arin.net/rest/ip/%s'), $comment->comment_author_IP) . "\r\n";
        $notify_message .= __('Comment: ') . "\r\n" . $comment->comment_content . "\r\n\r\n";
        $notify_message .= __('You can see all comments on this post here: ') . "\r\n";
        /* translators: 1: blog name, 2: post title */
        $subject = sprintf(__('[%1$s] Comment: "%2$s"'), $blogname, $post->post_title);
    } elseif ('trackback' == $comment_type) {
        $notify_message = sprintf(__('New trackback on your post "%s"'), $post->post_title) . "\r\n";
        /* translators: 1: website name, 2: author IP, 3: author domain */
        $notify_message .= sprintf(__('Website: %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
        $notify_message .= sprintf(__('URL    : %s'), $comment->comment_author_url) . "\r\n";
        $notify_message .= __('Excerpt: ') . "\r\n" . $comment->comment_content . "\r\n\r\n";
        $notify_message .= __('You can see all trackbacks on this post here: ') . "\r\n";
        /* translators: 1: blog name, 2: post title */
        $subject = sprintf(__('[%1$s] Trackback: "%2$s"'), $blogname, $post->post_title);
    } elseif ('pingback' == $comment_type) {
        $notify_message = sprintf(__('New pingback on your post "%s"'), $post->post_title) . "\r\n";
        /* translators: 1: comment author, 2: author IP, 3: author domain */
        $notify_message .= sprintf(__('Website: %1$s (IP: %2$s , %3$s)'), $comment->comment_author, $comment->comment_author_IP, $comment_author_domain) . "\r\n";
        $notify_message .= sprintf(__('URL    : %s'), $comment->comment_author_url) . "\r\n";
        $notify_message .= __('Excerpt: ') . "\r\n" . sprintf('[...] %s [...]', $comment->comment_content) . "\r\n\r\n";
        $notify_message .= __('You can see all pingbacks on this post here: ') . "\r\n";
        /* translators: 1: blog name, 2: post title */
        $subject = sprintf(__('[%1$s] Pingback: "%2$s"'), $blogname, $post->post_title);
    }
    $notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
    $notify_message .= sprintf(__('Permalink: %s'), get_permalink($comment->comment_post_ID) . '#comment-' . $comment_id) . "\r\n";
    if (user_can($post->post_author, 'edit_comment', $comment_id)) {
        if (EMPTY_TRASH_DAYS) {
            $notify_message .= sprintf(__('Trash it: %s'), admin_url("comment.php?action=trash&c={$comment_id}")) . "\r\n";
        } else {
            $notify_message .= sprintf(__('Delete it: %s'), admin_url("comment.php?action=delete&c={$comment_id}")) . "\r\n";
        }
        $notify_message .= sprintf(__('Spam it: %s'), admin_url("comment.php?action=spam&c={$comment_id}")) . "\r\n";
    }
    $wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
    if ('' == $comment->comment_author) {
        $from = "From: \"{$blogname}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: {$comment->comment_author_email}";
        }
    } else {
        $from = "From: \"{$comment->comment_author}\" <{$wp_email}>";
        if ('' != $comment->comment_author_email) {
            $reply_to = "Reply-To: \"{$comment->comment_author_email}\" <{$comment->comment_author_email}>";
        }
    }
    $message_headers = "{$from}\n" . "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
    if (isset($reply_to)) {
        $message_headers .= $reply_to . "\n";
    }
    $emails = array($author->user_email);
    $emails = apply_filters('comment_notification_recipients', $emails, $comment_id);
    $notify_message = apply_filters('comment_notification_text', $notify_message, $comment_id);
    $subject = apply_filters('comment_notification_subject', $subject, $comment_id);
    $message_headers = apply_filters('comment_notification_headers', $message_headers, $comment_id);
    foreach ($emails as $email) {
        @wp_mail($email, $subject, $notify_message, $message_headers);
    }
    return true;
}