Sorry for the delay, I had a few things this week, and thank you for taking an interest in this.
To retest this with minimal chance for “something I did”, I installed:
ubuntu-24-04-2-live-server-amd64.iso (the latest) from ubuntu.com and did no updates.
I ran the virtualmin install, I logged in and went through the configuration wizard (only changing passwords to plain-text to confirm that that part does work, if needed), otherwise all defaults.
I added a test domain and a user to that domain.
I installed the plugin.
This server’s entire command line history to that point looks like:

I went to :20000 and clicked the forgot password link.
I cat-ed the only piece of mail in /home/thisisatestdomain/homes/thisisamailuser/Maildir/new and copied and pasted this:
https://thisisatestdomain.com:10000/virtualmin-password-recovery/email.cgi?id=3D02522c4fbf049a85511636a7a52d167a
(I confirmed that such an id/file, not including the 3D, exists at /etc/webmin/virtualmin-password-recovery/links, I even chown -R 777 /etc/webmin/virtualmin-password-recovery in case it’s just a permissions problem.)
I then changed the domain to the internal IP (as I do not control that domain) and got the same error and the same miniserv.error lines. I then added that domain to my hosts file, emptied my browser cookies/history/etc restarted the browser and visited the link as pasted. Same error.
Searching Webmin Actions Log for Virtualmin Password Recovery says:
No actions matched your search for actions from module Virtualmin Password Recovery between 04/10/2025 and 04/10/2025.
Which I think you meant earlier (just noticed it now)… if not, just clicking “Search” with no changes has only the installation and creation of the domain and user related stuff, beginning with Ran post-install script
and running to Created user thisisamailuser@thisisatestdomain.com
with nothing about the password recovery.
It is version 1.12 as before. You mentioned a possible perl issue. Can you elaborate? (I could try installing an older perl or manually adding whatever libraries it needs.)
My journalctrl does this when I click the “Submit” button:
A7E014414A: uid=0 from=<webmin-noreply@snpwrdtest.mydomain.com>
action 'action-4-builtin:omfile' resumed (module 'builtin:omfile') [v8.2312.0 try https://www.rsyslog.com/e/2359 ]
action 'action-4-builtin:omfile' suspended (module 'builtin:omfile'), retry 0. There should be messages before this one giving the reason for suspension. [v8.2312.0 try https://www.rsyslog.com/e/2007 ]
action 'action-4-builtin:omfile' resumed (module 'builtin:omfile') [v8.2312.0 try https://www.rsyslog.com/e/2359 ]
action 'action-4-builtin:omfile' suspended (module 'builtin:omfile'), retry 0. There should be messages before this one giving the reason for suspension. [v8.2312.0 try https://www.rsyslog.com/e/2007 ]
action 'action-4-builtin:omfile' resumed (module 'builtin:omfile') [v8.2312.0 try https://www.rsyslog.com/e/2359 ]
action 'action-4-builtin:omfile' suspended (module 'builtin:omfile'), retry 0. There should be messages before this one giving the reason for suspension. [v8.2312.0 try https://www.rsyslog.com/e/2007 ]
action 'action-4-builtin:omfile' resumed (module 'builtin:omfile') [v8.2312.0 try https://www.rsyslog.com/e/2359 ]
action 'action-4-builtin:omfile' suspended (module 'builtin:omfile'), retry 0. There should be messages before this one giving the reason for suspension. [v8.2312.0 try https://www.rsyslog.com/e/2007 ]
action 'action-4-builtin:omfile' resumed (module 'builtin:omfile') [v8.2312.0 try https://www.rsyslog.com/e/2359 ]
action 'action-4-builtin:omfile' suspended (module 'builtin:omfile'), retry 0. There should be messages before this one giving the reason for suspension. [v8.2312.0 try https://www.rsyslog.com/e/2007 ]
action 'action-4-builtin:omfile' resumed (module 'builtin:omfile') [v8.2312.0 try https://www.rsyslog.com/e/2359 ]
action 'action-4-builtin:omfile' suspended (module 'builtin:omfile'), retry 0. There should be messages before this one giving the reason for suspension. [v8.2312.0 try https://www.rsyslog.com/e/2007 ]
action 'action-4-builtin:omfile' resumed (module 'builtin:omfile') [v8.2312.0 try https://www.rsyslog.com/e/2359 ]
action 'action-4-builtin:omfile' suspended (module 'builtin:omfile'), retry 0. There should be messages before this one giving the reason for suspension. [v8.2312.0 try https://www.rsyslog.com/e/2007 ]
action 'action-4-builtin:omfile' resumed (module 'builtin:omfile') [v8.2312.0 try https://www.rsyslog.com/e/2359 ]
action 'action-4-builtin:omfile' suspended (module 'builtin:omfile'), retry 0. There should be messages before this one giving the reason for suspension. [v8.2312.0 try https://www.rsyslog.com/e/2007 ]
action 'action-4-builtin:omfile' resumed (module 'builtin:omfile') [v8.2312.0 try https://www.rsyslog.com/e/2359 ]
action 'action-4-builtin:omfile' suspended (module 'builtin:omfile'), retry 0. There should be messages before this one giving the reason for suspension. [v8.2312.0 try https://www.rsyslog.com/e/2007 ]
action 'action-4-builtin:omfile' resumed (module 'builtin:omfile') [v8.2312.0 try https://www.rsyslog.com/e/2359 ]
action 'action-4-builtin:omfile' suspended (module 'builtin:omfile'), retry 0. There should be messages before this one giving the reason for suspension. [v8.2312.0 try https://www.rsyslog.com/e/2007 ]
action 'action-4-builtin:omfile' suspended (module 'builtin:omfile'), next retry is Thu Apr 10 19:45:39 2025, retry nbr 0. There should be messages before this one giving the reason for suspension. [v8.2312.0 try https://www.rsyslog.com/e/2007 ]
A7E014414A: message-id=<20250410194509.A7E014414A@snpwrdtest.mydomain.com>
A7E014414A: DKIM-Signature field added (s=202503, d=snpwrdtest.mydomain.com)
A7E014414A: from=<webmin-noreply@snpwrdtest.mydomain.com>, size=1125, nrcpt=1 (queue active)
A7E014414A: to=<"thisisamailuser@thisisatestdomain.com"@snpwrdtest.mydomain.com>, orig_to=<thisisamailuser@thisisatestdomain.com>, relay=local, delay=2, delays=0.36/0.01/0/1.7, dsn=2.0.0, status=sent (delivered to command: /usr/bin/procmail-wrapper -o -a $DOMAIN -d $LOGNAME)
A7E014414A: removed
It adds nothing when I click the link that tells me invalid message id.
I commented the lines:
# Check IP rate limit - allow no more than 10 tries in 5 minutes
my $err = &check_rate_limit();
$err && &error_and_exit($err);
to no effect. I commented the next section as well but that breaks it for domain then.
I believe that I misrepresented not having DNS before. Virtualmin is making the DNS as per its out of the box setup, the outside world points nothing to this, but this mail does not go to the outside world.
You have said that I shouldn’t be installing ubuntu from ubuntu.com. From where then? Your examples have me installing a favorite VM whether into a cloud host, a personal computer, or a dedicated computer. What makes this favorite VM special and where do I get one (does Virtualmin happen to have pre-configured “appliance” that I can just attach and expand for example)?
What OS and version is working for you?
Thanks.