Index: wp-includes/comment.php
===================================================================
--- wp-includes/comment.php	(revision 22043)
+++ wp-includes/comment.php	(working copy)
@@ -1332,6 +1332,7 @@
  *
  * @since 1.5.0
  * @uses apply_filters() Calls 'preprocess_comment' hook on $commentdata parameter array before processing
+ * @uses apply_filters() Calls 'wp_notify_post_author' hook on initial evaluation about if post author should be notified and comment ID.
  * @uses do_action() Calls 'comment_post' hook on $comment_ID returned from adding the comment and if the comment was approved.
  * @uses wp_filter_comment() Used to filter comment before adding comment.
  * @uses wp_allow_comment() checks to see if comment is approved.
@@ -1373,7 +1374,12 @@
 
 		$post = get_post($commentdata['comment_post_ID']); // Don't notify if it's your own comment
 
-		if ( get_option('comments_notify') && $commentdata['comment_approved'] && ( ! isset( $commentdata['user_id'] ) || $post->post_author != $commentdata['user_id'] ) )
+		$maybe_notify = get_option( 'comments_notify' ) && $commentdata['comment_approved'];
+		if ( isset( $commentdata['user_id'] ) && $post->post_author == $commentdata['user_id'] )
+		    $maybe_notify = false;
+		$maybe_notify = apply_filters( 'wp_notify_post_author', $maybe_notify, $comment_ID );
+
+		if ( $maybe_notify )
 			wp_notify_postauthor($comment_ID, isset( $commentdata['comment_type'] ) ? $commentdata['comment_type'] : '' );
 	}
 
@@ -1388,6 +1394,7 @@
  *
  * @since 1.0.0
  * @uses wp_transition_comment_status() Passes new and old comment status along with $comment object
+ * @uses apply_filters() Calls 'wp_notify_post_author' hook on initial evaluation about if post author should be notified and comment ID.
  *
  * @param int $comment_id Comment ID.
  * @param string $comment_status New comment status, either 'hold', 'approve', 'spam', or 'trash'.
@@ -1406,10 +1413,6 @@
 		case 'approve':
 		case '1':
 			$status = '1';
-			if ( get_option('comments_notify') ) {
-				$comment = get_comment($comment_id);
-				wp_notify_postauthor($comment_id, $comment->comment_type);
-			}
 			break;
 		case 'spam':
 			$status = 'spam';
@@ -1434,6 +1437,11 @@
 
 	$comment = get_comment($comment_id);
 
+	$maybe_notify = get_option( 'comments_notify' ) && '1' == $status;
+	$maybe_notify = apply_filters( 'wp_notify_post_author', $maybe_notify, $comment_id );
+	if ( $maybe_notify )
+		wp_notify_postauthor( $comment_id, $comment->comment_type );
+
 	do_action('wp_set_comment_status', $comment_id, $comment_status);
 	wp_transition_comment_status($comment_status, $comment_old->comment_approved, $comment);
 
