Source: includes/emails/class-sensei-email-new-message-reply.php

<?php
// phpcs:disable VariableAnalysis.CodeAnalysis.VariableAnalysis -- Prevent "Unused global variable $sensei_email_data"
if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

if ( ! class_exists( 'Sensei_Email_New_Message_Reply', false ) ) :

	/**
	 * Teacher New Message
	 *
	 * An email sent to the a user when they receive a reply to the private message.
	 *
	 * @package Users
	 * @author Automattic
	 *
	 * @since       1.6.0
	 */
	class Sensei_Email_New_Message_Reply {

		/**
		 * @var string
		 */
		var $template;

		/**
		 * @var string
		 */
		var $subject;

		/**
		 * @var string
		 */
		var $heading;

		/**
		 * @var string
		 */
		var $recipient;

		var $original_sender;
		var $original_receiver;
		var $commenter;

		/**
		 * @var WP_Post
		 */
		var $message;

		/**
		 * @var WP_Comment
		 */
		var $comment;

		/**
		 * Constructor
		 *
		 * @access public
		 */
		function __construct() {
			$this->template = 'new-message-reply';
		}

		/**
		 * trigger function.
		 *
		 * @param WP_Comment $comment
		 * @param string     $message
		 *
		 * @return void
		 */
		function trigger( $comment, $message ) {

			global  $sensei_email_data;

			$this->comment = $comment;
			$this->message = $message;

			$this->commenter = get_userdata( $comment->user_id );

			$original_sender       = get_post_meta( $this->message->ID, '_sender', true );
			$this->original_sender = get_user_by( 'login', $original_sender );

			$original_receiver       = get_post_meta( $this->message->ID, '_receiver', true );
			$this->original_receiver = get_user_by( 'login', $original_receiver );

			// Set recipient
			if ( $this->commenter->user_login == $original_sender ) {
				$this->recipient = stripslashes( $this->original_receiver->user_email );
			} else {
				$this->recipient = stripslashes( $this->original_sender->user_email );
			}

			/**
			 * Fires before the mail is sent.
			 *
			 * @hook sensei_before_mail
			 *
			 * @param {string} $recipient The recipient email.
			 */
			do_action( 'sensei_before_mail', $this->recipient );

			// translators: Placeholder is the blog name.
			$this->subject = apply_filters( 'sensei_email_subject', sprintf( __( '[%1$s] You have a new message', 'sensei-lms' ), get_bloginfo( 'name' ) ), $this->template );
			$this->heading = apply_filters( 'sensei_email_heading', __( 'You have received a reply to your private message', 'sensei-lms' ), $this->template );

			$content_type  = get_post_meta( $this->message->ID, '_posttype', true );
			$content_id    = get_post_meta( $this->message->ID, '_post', true );
			$content_title = get_the_title( $content_id );

			$comment_link = get_comment_link( $comment );

			// setup the post type parameter
			$content_type = get_post_type( $content_id );
			if ( ! $content_type ) {
				$content_type = '';
			}

			// Construct data array
			$sensei_email_data = apply_filters(
				'sensei_email_data',
				array(
					'template'            => $this->template,
					$content_type . '_id' => $content_id,
					'heading'             => $this->heading,
					'commenter_name'      => $this->commenter->display_name,
					'message'             => $this->comment->comment_content,
					'comment_link'        => $comment_link,
					'content_title'       => $content_title,
					'content_type'        => $content_type,
				),
				$this->template
			);

			// Send mail
			Sensei()->emails->send( $this->recipient, $this->subject, Sensei()->emails->get_content( $this->template ) );

			/**
			 * Fires after the mail is sent.
			 *
			 * @hook sensei_after_sending_email
			 */
			do_action( 'sensei_after_sending_email' );
		}
	}

endif;