Index: src/wp-includes/comment-functions.php
===================================================================
--- src/wp-includes/comment-functions.php	(revision 34121)
+++ src/wp-includes/comment-functions.php	(working copy)
@@ -1651,16 +1651,30 @@
  *
  * @since 4.4.0
  *
+ * Calls {@see 'notify_post_author'} to determine if the post author should be
+ * notified when a new comment is added, overriding site setting.
+ *
  * @param int $comment_ID ID of the comment.
  */
 function wp_new_comment_notify_postauthor( $comment_ID ) {
 	$comment = get_comment( $comment_ID );
+	$maybe_notify = get_option( 'comments_notify' );
 
-	/*
-	 * `wp_notify_postauthor()` checks if notifying the author of their own comment.
-	 * By default, it won't, but filters can override this.
+	/**
+	 * Filter whether to send post author new comment notification emails, overriding
+	 * site setting.
+	 *
+	 * @since 4.4.0
+	 *
+	 * @param bool $maybe_notify Whether to notify post author.
+	 * @param int  $comment_ID   The id of the comment for the notification.
 	 */
-	if ( get_option( 'comments_notify' ) && $comment->comment_approved ) {
+	$maybe_notify = apply_filters( 'notify_post_author', $maybe_notify, $comment_ID );
+	if ( $maybe_notify && $comment->comment_approved ) {
+		/*
+		 * `wp_notify_postauthor()` checks if notifying the author of their own comment.
+		 * By default, it won't, but filters can override this.
+		 */
 		wp_notify_postauthor( $comment_ID );
 	}
 }
@@ -1673,6 +1687,9 @@
  *
  * @since 1.0.0
  *
+ * Calls {@see 'notify_post_author'} to determine if the post author should be
+ * notified, overriding site setting.
+ *
  * global wpdb $wpdb
  *
  * @param int $comment_id Comment ID.
@@ -1691,7 +1708,11 @@
 		case 'approve':
 		case '1':
 			$status = '1';
-			if ( get_option('comments_notify') ) {
+			$maybe_notify = get_option( 'comments_notify' );
+
+			/** This filter is documented in wp-includes/comment-functions.php */
+			$maybe_notify = apply_filters( 'notify_post_author', $maybe_notify, $comment_id );
+			if ( $maybe_notify ) {
 				wp_notify_postauthor( $comment_id );
 			}
 			break;
Index: src/wp-includes/pluggable.php
===================================================================
--- src/wp-includes/pluggable.php	(revision 34121)
+++ src/wp-includes/pluggable.php	(working copy)
@@ -1546,6 +1546,12 @@
  *
  * @global wpdb $wpdb WordPress database abstraction object.
  *
+ * Calls {@see 'notify_moderator'} to determine if the site moderator
+ * should be notified, overriding site setting.
+ *
+ * @uses apply_filters() Calls 'wp_notify_moderator' to determine if blog moderator
+ *                       should be notified.
+ *
  * @param int $comment_id Comment ID
  * @return true Always returns true
  */
@@ -1552,8 +1558,20 @@
 function wp_notify_moderator($comment_id) {
 	global $wpdb;
 
-	if ( 0 == get_option( 'moderation_notify' ) )
+	$maybe_notify = get_option( 'moderation_notify' );
+
+	/**
+	 * Filter whether to send blog moderator email notifications, overriding
+	 * site setting.
+	 *
+	 * @since 4.4.0
+	 *
+	 * @param bool $maybe_notify Whether to notify blog moderator.
+	 * @param int  $comment_ID   The id of the comment for the notification.
+	 */
+	if ( ! apply_filters( 'notify_moderator', $maybe_notify, $comment_id ) ) {
 		return true;
+	}
 
 	$comment = get_comment($comment_id);
 	$post = get_post($comment->comment_post_ID);
Index: tests/phpunit/tests/comment.php
===================================================================
--- tests/phpunit/tests/comment.php	(revision 34121)
+++ tests/phpunit/tests/comment.php	(working copy)
@@ -287,4 +287,204 @@
 
 		$this->assertTrue( wp_notify_moderator( $c ) );
 	}
+
+
+	/**
+	 * Helper function to set up comment for 761 tests
+	 */
+	public function setup_notify_comment(){
+		/**
+		 * Mock some server variables.
+		 */
+		$_SERVER['SERVER_NAME'] = 'phpunit.wordpress.dev';
+		$_SERVER['REMOTE_ADDR'] = '127.0.0.1';
+
+		/**
+		 * Prevent flood alert from firing.
+		 */
+		add_filter( 'comment_flood_filter', '__return_false' );
+
+		/**
+		 * Set up the post author to test notifying.
+		 */
+		$user = $this->factory->user->create(
+				array(
+						'role'       => 'author',
+						'user_login' => 'test_wp_user_get',
+						'user_pass'  => 'password',
+						'user_email' => 'test@test.com',
+				)
+		);
+
+		/**
+		 * Set up a comment for testing.
+		 */
+		$post = $this->factory->post->create(
+				array(
+						'post_author' => $user,
+				)
+		);
+
+		$comment = $this->factory->comment->create(
+				array(
+						'comment_post_ID' => $post,
+				)
+		);
+
+		return array(
+				'post'    => $post,
+				'comment' => $comment,
+		);
+	}
+
+	/**
+	 * @ticket 761
+	 */
+	public function test_wp_notify_moderator_filter() {
+
+		$comment_data = $this->setup_notify_comment();
+
+		/**
+		 * Test with moderator notification setting on, filter set to off.
+		 * Should not send a notification.
+		 */
+		update_option( 'moderation_notify', 1 );
+		add_filter( 'notify_moderator', '__return_false' );
+		$notification_sent = $this->try_sending_moderator_notification( $comment_data['comment'], $comment_data['post'] );
+		$this->assertFalse( $notification_sent, 'Moderator notification setting on, filter set to off' );
+		remove_filter( 'notify_moderator', '__return_false' );
+
+		/**
+		 * Test with moderator notification setting off, filter set to on.
+		 * Should send a notification.
+		 */
+		update_option( 'moderation_notify', 0 );
+		add_filter( 'notify_moderator', '__return_true' );
+		$notification_sent = $this->try_sending_moderator_notification( $comment_data['comment'], $comment_data['post'] );
+		$this->assertTrue( $notification_sent, 'Moderator notification setting off, filter set to on' );
+		remove_filter( 'notify_moderator', '__return_true' );
+
+	}
+
+	/**
+	 * @ticket 761
+	 */
+	public function test_wp_notify_post_author_filter() {
+
+		$comment_data = $this->setup_notify_comment();
+
+		/**
+		 * Test with author notification setting on, filter set to off.
+		 * Should not send a notification.
+		 */
+		update_option( 'comments_notify', 1 );
+		add_filter( 'notify_post_author', '__return_false' );
+		$notification_sent = $this->try_sending_author_notification( $comment_data['comment'], $comment_data['post'] );
+		$this->assertFalse( $notification_sent, 'Test with author notification setting on, filter set to off' );
+		remove_filter( 'notify_post_author', '__return_false' );
+
+		/**
+		 * Test with author notification setting off, filter set to on.
+		 * Should sent a notification.
+		 */
+		update_option( 'comments_notify', 0 );
+		add_filter( 'notify_post_author', '__return_true' );
+		$notification_sent = $this->try_sending_author_notification( $comment_data['comment'], $comment_data['post'] );
+		$this->assertTrue( $notification_sent, 'Test with author notification setting off, filter set to on' );
+		remove_filter( 'notify_post_author', '__return_true' );
+
+	}
+
+	/**
+	 * Helper function to test moderator notifications.
+	 */
+	public function try_sending_moderator_notification( $comment, $post ) {
+
+		/**
+		 * Don't approve comments, triggering notifications.
+		 */
+		add_filter( 'pre_comment_approved', '__return_false' );
+
+		/**
+		 * Moderators are notified when a new comment is added.
+		 */
+		$data = array(
+				'comment_post_ID'      => $post,
+				'comment_author'       => rand_str(),
+				'comment_author_url'   => '',
+				'comment_author_email' => '',
+				'comment_type'         => '',
+				'comment_content'      => rand_str(),
+		);
+		wp_new_comment( $data );
+
+		/**
+		 * Check to see if a notification email was sent to the moderator `admin@example.org`.
+		 */
+		if ( isset( $GLOBALS['phpmailer']->mock_sent ) &&
+			! empty( $GLOBALS['phpmailer']->mock_sent ) &&
+			'admin@example.org' == $GLOBALS['phpmailer']->mock_sent[0]['to'][0][0] ) {
+			$email_sent_when_comment_added = true;
+			unset( $GLOBALS['phpmailer']->mock_sent );
+		} else {
+			$email_sent_when_comment_added = false;
+		}
+
+		return $email_sent_when_comment_added;
+	}
+
+	/**
+	 * Helper function to test sending author notifications.
+	 */
+	public function try_sending_author_notification( $comment, $post ) {
+
+		/**
+		 * Approve comments, triggering notifications.
+		 */
+		add_filter( 'pre_comment_approved', '__return_true' );
+
+		/**
+		 * Post authors possibly notified when a comment is approved on their post.
+		 */
+		wp_set_comment_status( $comment, 'approve' );
+
+		/**
+		 * Check to see if a notification email was sent to the post author `test@test.com`.
+		 */
+		if ( isset( $GLOBALS['phpmailer']->mock_sent ) &&
+			! empty( $GLOBALS['phpmailer']->mock_sent ) &&
+			'test@test.com' == $GLOBALS['phpmailer']->mock_sent[0]['to'][0][0] ) {
+			$email_sent_when_comment_approved = true;
+		} else {
+			$email_sent_when_comment_approved = false;
+		}
+		unset( $GLOBALS['phpmailer']->mock_sent );
+
+		/**
+		 * Post authors are notified when a new comment is added to their post.
+		 */
+		$data = array(
+				'comment_post_ID'      => $post,
+				'comment_author'       => rand_str(),
+				'comment_author_url'   => '',
+				'comment_author_email' => '',
+				'comment_type'         => '',
+				'comment_content'      => rand_str(),
+		);
+		wp_new_comment( $data );
+
+		/**
+		 * Check to see if a notification email was sent to the post author `test@test.com`.
+		 */
+		if ( isset( $GLOBALS['phpmailer']->mock_sent ) &&
+		     ! empty( $GLOBALS['phpmailer']->mock_sent ) &&
+		     'test@test.com' == $GLOBALS['phpmailer']->mock_sent[0]['to'][0][0] ) {
+			$email_sent_when_comment_added = true;
+			unset( $GLOBALS['phpmailer']->mock_sent );
+		} else {
+			$email_sent_when_comment_added = false;
+		}
+
+		return $email_sent_when_comment_approved && $email_sent_when_comment_added;
+	}
 }
