diff --git a/xtrn/DDMsgReader/DDMsgReader.js b/xtrn/DDMsgReader/DDMsgReader.js
index 5f4cf5c4b7168479759f9a636261c23f893de83f..373d56ccf245881be8673e1f8f5d5cd4b4556167 100644
--- a/xtrn/DDMsgReader/DDMsgReader.js
+++ b/xtrn/DDMsgReader/DDMsgReader.js
@@ -91,11 +91,17 @@
  * 2023-02-01 Eric Oulashin     Version 1.63
  *                              Fix for reading colors from the theme file. Also, the theme file now
  *                              no longer needs the control character for color codes.
+ * 2023-02-09 Eric Oulashin     Version 1.64
+ *                              When reading personal email (received or sent), now makes use of the
+ *                              loadable module 2nd command-line argument, which specifies the user number.
+ *                              When deleting a user, the sysop might be prompted whether to read that
+ *                              user's email.
  */
 
 "use strict";
 
-// TODO: In the message list, add the ability to search with / similar to my area chooser
+// TODO: In the message list, add the ability to search with / similar to my area chooser.
+
 
 /* Command-line arguments (in -arg=val format, or -arg format to enable an
    option):
@@ -195,8 +201,8 @@ var ansiterm = require("ansiterm_lib.js", 'expand_ctrl_a');
 
 
 // Reader version information
-var READER_VERSION = "1.63";
-var READER_DATE = "2023-02-01";
+var READER_VERSION = "1.64";
+var READER_DATE = "2023-02-09";
 
 // Keyboard key codes for displaying on the screen
 var UP_ARROW = ascii(24);
@@ -1089,10 +1095,18 @@ function DigDistMsgReader(pSubBoardCode, pScriptArgs)
 
 	this.cfgFilename = "DDMsgReader.cfg";
 	// Check the command-line arguments for a custom configuration file name
-	// before reading the configuration file.
+	// before reading the configuration file.  Defaults to the current user
+	// number, but can be set by a loadable module command-line argument. Also,
+	// only allow changing it if the current user is a sysop.
+	this.personalMailUserNum = user.number;
 	var scriptArgsIsValid = (typeof(pScriptArgs) == "object");
-	if (scriptArgsIsValid && pScriptArgs.hasOwnProperty("configfilename"))
-		this.cfgFilename = pScriptArgs["configfilename"];
+	if (scriptArgsIsValid)
+	{
+		if (pScriptArgs.hasOwnProperty("configfilename"))
+			this.cfgFilename = pScriptArgs.configfilename;
+		if (pScriptArgs.hasOwnProperty("usernum") && user.is_sysop)
+			this.personalMailUserNum = pScriptArgs.usernum;
+	}
 	// Read the settings from the config file
 	this.cfgFileSuccessfullyRead = false;
 	this.ReadConfigFile();
@@ -1962,7 +1976,6 @@ function DigDistMsgReader_ClearSearchData()
 			delete this.msgSearchHdrs[subCode].indexed;
 			delete this.msgSearchHdrs[subCode];
 		}
-		delete this.msgSearchHdrs;
 		this.msgSearchHdrs = {};
    }
 }
@@ -2200,7 +2213,8 @@ function DigDistMsgReader_PopulateHdrsIfSearch_DispErrorIfNoMsgs(pCloseMsgbaseAn
 				//console.print("\x01n" + replaceAtCodesInStr(formattedText) + "\x01n");
 				console.putmsg("\x01n" + formattedText + "\x01n");
 			}
-			this.msgSearchHdrs[this.subBoardCode] = searchMsgbase(this.subBoardCode, this.searchType, this.searchString, this.readingPersonalEmailFromUser);
+			var readingMailUserNum = user.is_sysop ? this.personalMailUserNum : user.number;
+			this.msgSearchHdrs[this.subBoardCode] = searchMsgbase(this.subBoardCode, this.searchType, this.searchString, this.readingPersonalEmailFromUser, null, null, readingMailUserNum);
 		}
 	}
 	else
@@ -9886,6 +9900,8 @@ function DigDistMsgReader_ReplyToMsg(pMsgHdr, pMsgText, pPrivate, pMsgIdx)
 
 	// If quoting is allowed in the sub-board, then write QUOTES.TXT in
 	// the node directory to allow the user to quote the original message.
+	// TODO: Handle things when reading another user's email (for the sysop) - "mail" as a sub-board code might
+	// not work
 	var msgbase = new MsgBase(this.subBoardCode);
 	if (msgbase.open())
 	{
@@ -16613,13 +16629,15 @@ function canDoHighASCIIAndANSI()
 //  pListingPersonalEmailFromUser: Optional boolean - Whether or not we're listing
 //                                 personal email sent by the user.  This defaults
 //                                 to false.
-//  pStartIndex: The starting message index (0-based).  Optional; defaults to 0.
-//  pEndIndex: One past the last message index.  Optional; defaults to the total number
+//  pStartIndex: Optional: The starting message index (0-based).  Defaults to 0.
+//  pEndIndex: Optional: One past the last message index.  Defaults to the total number
 //             of messages.
 //
+//  pUserNum: Optional: The user number (for reading personal email)
+//
 // Return value: An object with the following arrays:
 //               indexed: A 0-based indexed array of message headers
-function searchMsgbase(pSubCode, pSearchType, pSearchString, pListingPersonalEmailFromUser, pStartIndex, pEndIndex)
+function searchMsgbase(pSubCode, pSearchType, pSearchString, pListingPersonalEmailFromUser, pStartIndex, pEndIndex, pUserNum)
 {
 	var msgHeaders = {
 		indexed: []
@@ -16662,8 +16680,7 @@ function searchMsgbase(pSubCode, pSearchType, pSearchString, pListingPersonalEma
 				{
 					matchFn = function(pSearchStr, pMsgHdr, pMsgBase, pSubBoardCode) {
 						var msgText = strip_ctrl(pMsgBase.get_msg_body(false, pMsgHdr.number, false, false, true, true));
-						return gAllPersonalEmailOptSpecified || msgIsFromUser(pMsgHdr);
-						
+						return gAllPersonalEmailOptSpecified || msgIsFromUser(pMsgHdr, pUserNum);
 					}
 				}
 				else
@@ -16671,7 +16688,7 @@ function searchMsgbase(pSubCode, pSearchType, pSearchString, pListingPersonalEma
 					// We're reading mail to the user
 					matchFn = function(pSearchStr, pMsgHdr, pMsgBase, pSubBoardCode) {
 						var msgText = strip_ctrl(pMsgBase.get_msg_body(false, pMsgHdr.number, false, false, true, true));
-						var msgMatchesCriteria = (gAllPersonalEmailOptSpecified || msgIsToUserByNum(pMsgHdr));
+						var msgMatchesCriteria = (gAllPersonalEmailOptSpecified || msgIsToUserByNum(pMsgHdr, pUserNum));
 						// If only new/unread personal email is to be displayed, then check
 						// that the message has not been read.
 						if (gCmdLineArgVals.onlynewpersonalemail)
@@ -16851,10 +16868,12 @@ function searchMsgbase(pSubCode, pSearchType, pSearchString, pListingPersonalEma
 //
 // Parameters:
 //  pMsgHdr: A message header object
+//  pUserNum: Optional - A user number to match with.  If not specified, this will default to
+//            the current logged-in user number.
 //
 // Return value: Boolean - Whether or not the message is to the user and is not
 //               deleted.
-function msgIsToUserByNum(pMsgHdr)
+function msgIsToUserByNum(pMsgHdr, pUserNum)
 {
 	if (typeof(pMsgHdr) != "object")
 		return false;
@@ -16862,13 +16881,17 @@ function msgIsToUserByNum(pMsgHdr)
 	if ((pMsgHdr.attr & MSG_DELETE) == MSG_DELETE)
 		return false;
 
+	var userNum = user.number;
+	if (user.is_sysop && typeof(pUserNum) === "number" && pUserNum > 0 && pUserNum <= system.lastuser)
+		userNum = pUserNum;
+
 	var msgIsToUser = false;
 	// If an alternate user number was specified on the command line, then use that
 	// user information.  Otherwise, use the current logged-in user.
 	if (gCmdLineArgVals.hasOwnProperty("altUserNum"))
 		msgIsToUser = (pMsgHdr.to_ext == gCmdLineArgVals.altUserNum);
 	else
-		msgIsToUser = (pMsgHdr.to_ext == user.number);
+		msgIsToUser = (pMsgHdr.to_ext == userNum);
 	return msgIsToUser;
 }
 
@@ -16878,10 +16901,12 @@ function msgIsToUserByNum(pMsgHdr)
 //
 // Parameters:
 //  pMsgHdr: A message header object
+//  pUserNum: Optional - A user number to match with.  If not specified, this will default to
+//            the current logged-in user number.
 //
 // Return value: Boolean - Whether or not the message is from the logged-in user
 //               and is not deleted.
-function msgIsFromUser(pMsgHdr)
+function msgIsFromUser(pMsgHdr, pUserNum)
 {
 	if (typeof(pMsgHdr) != "object")
 		return false;
@@ -16889,6 +16914,8 @@ function msgIsFromUser(pMsgHdr)
 	if ((pMsgHdr.attr & MSG_DELETE) == MSG_DELETE)
 		return false;
 
+	var pUserNumIsValid = (typeof(pUserNum) === "number" && pUserNum > 0 && pUserNum <= system.lastuser);
+
 	var isFromUser = false;
 
 	// If an alternate user number was specified on the command line, then use that
@@ -16899,7 +16926,7 @@ function msgIsFromUser(pMsgHdr)
 		if (gCmdLineArgVals.hasOwnProperty("altUserNum"))
 			isFromUser = (pMsgHdr.from_ext == gCmdLineArgVals.altUserNum);
 		else
-			isFromUser = (pMsgHdr.from_ext == user.number);
+			isFromUser = (pMsgHdr.from_ext == (pUserNumIsValid && user.is_sysop ? pUserNum : user.number));
 	}
 	else
 	{
@@ -16907,7 +16934,15 @@ function msgIsFromUser(pMsgHdr)
 		if (gCmdLineArgVals.hasOwnProperty("altUserName") && gCmdLineArgVals.hasOwnProperty("altUserAlias"))
 			isFromUser = ((hdrFromUpper == gCmdLineArgVals.altUserAlias.toUpperCase()) || (hdrFromUpper == gCmdLineArgVals.altUserName.toUpperCase()));
 		else
-			isFromUser = ((hdrFromUpper == user.alias.toUpperCase()) || (hdrFromUpper == user.name.toUpperCase()));
+		{
+			if (pUserNumIsValid)
+			{
+				var theUser = new User(pUserNum);
+				isFromUser = ((hdrFromUpper == theUser.alias.toUpperCase()) || (hdrFromUpper == theUser.name.toUpperCase()));
+			}
+			else
+				isFromUser = ((hdrFromUpper == user.alias.toUpperCase()) || (hdrFromUpper == user.name.toUpperCase()));
+		}
 	}
 
 	return isFromUser;
@@ -17185,13 +17220,13 @@ function parseLoadableModuleArgs(argv)
 		{
 			case MAIL_YOUR: // Mail sent to you
 				argVals.personalemail = true;
-				argVals.usernum = argv[1];
+				argVals.usernum = +(argv[1]);
 				if (newMailOnly)
 					argVals.onlynewpersonalemail = true;
 				break;
 			case MAIL_SENT: // Mail you have sent
 				argVals.personalemailsent = true;
-				argVals.usernum = argv[1];
+				argVals.usernum = +(argv[1]);
 				break;
 			case MAIL_ALL:
 				argVals.allpersonalemail = true;
diff --git a/xtrn/DDMsgReader/readme.txt b/xtrn/DDMsgReader/readme.txt
index b5afffd6201617425ceece70c493ada695bd8bc2..5a2f5cb6635b5959c58318fd20b5cdd105225750 100644
--- a/xtrn/DDMsgReader/readme.txt
+++ b/xtrn/DDMsgReader/readme.txt
@@ -1,6 +1,6 @@
                       Digital Distortion Message Reader
-                                 Version 1.63
-                           Release date: 2023-02-01
+                                 Version 1.64
+                           Release date: 2023-02-09
 
                                      by
 
diff --git a/xtrn/DDMsgReader/revision_history.txt b/xtrn/DDMsgReader/revision_history.txt
index d65b24d707f491eccab26718d9d34f1dea1f7681..f34e163181c193a7688a0aee987c9e6af5fefc83 100644
--- a/xtrn/DDMsgReader/revision_history.txt
+++ b/xtrn/DDMsgReader/revision_history.txt
@@ -5,6 +5,9 @@ Revision History (change log)
 =============================
 Version  Date         Description
 -------  ----         -----------
+1.64     2023-02-09   When reading personal email (received or sent), as a
+                      loadable module, now it can allow reading another user's
+                      mail (for the sysop when deleting a user account).
 1.63     2023-02-01   Fix for reading colors from the theme file. Also, the
                       theme file now no longer needs the control character for
                       color codes.