Thread (10 messages) 10 messages, 3 authors, 2025-08-27

Re: [PATCH v2] send-email: add --get-smtp-server option to fetch SMTP settings

From: Aditya Garg <hidden>
Date: 2025-08-03 13:59:19


On 03/08/25 7:06 pm, Julian Swagemakers wrote:
Hi Aditya, really cool idea, here are some random thoughts:

On Wed Jul 30, 2025 at 5:12 PM CEST, Aditya Garg wrote:
quoted
Autoconfiguring SMTP server settings is a common feature present in many
email clients. In order to get the correct SMTP server settings easily,
this commit adds a `--get-smtp-server` option to `git send-email`. This
option attempts to fetch the SMTP server settings for a given email address
via the following steps:

1. It first tries to fetch the settings from Mozilla's ISPDB at
  `https://autoconfig.thunderbird.net/v1.1/[domain]`.
We should first check autoconfig and then move to the 3rd party
database, this is how thunderbird[0] and aerc[1] do it.
Ah, I thought Thunderbird did the opposite. Thanks for noticing that.
It does make more sense to use autoconfig first.
quoted
2. If that fails, it attempts to fetch the autoconfig file from the email
  provider's autoconfig URL, which is typically in the format
  `https://autoconfig.[domain]/mail/config-v1.1.xml?emailaddress=[email]`.
The documentation mentions using `DOMAIN/.well-known/autoconfig/mail/`
as an alternative to the autoconfig subdomain, what do you think about
supporting that?
Can be supported, but I unfortunately didn't find any email provider having
that sort of server to test. Do you have any in mind? Nevertheless, and untested
implementation can be done.
quoted
3. If that also fails, it falls back to checking the MX records of the
  domain used in the email address to find the SMTP server. It can be
  useful in case of emails with custom domains. It attempts to guess
  the correct domain for the email from the MX records, and repeats the
  first 2 steps with the guessed domain.

This feature is heavily inpired by the autoconfig feature in Mozilla
s/inpired/inspired
Thanks for noticing that :)
quoted
+sub parse_config {
+	require XML::LibXML;
+	my ($xml, $email) = @_;
+	my $parser = XML::LibXML->new;
+	my $doc = eval { $parser->load_xml(string => $xml) };
+	die "Failed to parse XML\n" unless $doc;
+	my $config_num = 0;
+	my $smtp_encryption_config;
+	my $smtp_user_config;
+
+	foreach my $outgoing ($doc->findnodes('//outgoingServer')) {
+		$config_num++;
+		if ($outgoing->findvalue('./socketType') eq 'SSL') {
+			$smtp_encryption_config = 'ssl';
+		} elsif ($outgoing->findvalue('./socketType') eq 'STARTTLS') {
+			$smtp_encryption_config = 'tls';
+		} else {
+			$smtp_encryption_config = 'plain';
'plain' is unencrypted, I think this should be accompanied by a big
warning.
Any ideas on how you want that to be displayed?
quoted
+		}
+
+		if ($outgoing->findvalue('./username') eq '%EMAILADDRESS%') {
+			$smtp_user_config = $email;
+		} elsif ($outgoing->findvalue('./username') eq '%EMAILLOCALPART%') {
+			$smtp_user_config = (split /@/, $email)[0];
+		} elsif ($outgoing->findvalue('./username') eq '%EMAILDOMAIN%') {
+			$smtp_user_config = (split /@/, $email)[1];
+		} else {
+			$smtp_user_config = $outgoing->findvalue('./username');
+		}
+
+		print "\nConfiguration $config_num:\n";
+		print "  Server: ", $outgoing->findvalue('./hostname'), "\n";
+		print "  Port: ", $outgoing->findvalue('./port'), "\n";
+		print "  Encryption: ", $smtp_encryption_config, "\n";
+		print "  Username: ", $smtp_user_config, "\n";
The new option only gives you the needed SMTP configuration, as a
user you still need to apply them and to do that you will need to
look up how. We could help the user here and give them copy and
paste commands similar to when trying to commit without having an
identity set.
Git allows you to set it as global config or repo specific config.
I'm not sure how to give a copy/paste command for different needs.
The XML file also contains authentication details, what do you think
about processing those? That would also allow adding references to the
documentation in case it is OAuth2.
Honestly, app passwords remain as a preferred way to use git send-email.
Outlook I guess is just an exception due to obvious reasons. Plus, OAuth2
does not tell if the Auth is XOAUTH2 or OAUTHBEARER. Not sure if its worth
adding here. I am open to ideas on use cases though, and may try to
implement.
quoted
+	}
+}
+
+if ($get_smtp_server) {
+	require URI::Escape;
+	print "Enter your email address: ";
+	chomp(my $email = <STDIN>);
Someone sending out emails will most likely already have set up
`user.email` in their gitconfig. We could just use that instead of
prompting for user input, or at least suggest it as a default.
Suggesting as a default is better then not prompting. Although I think
it won't be easy to read the config since all this exits before the config
is parsed (I guess?).>
If you don't have an SMTP server configured then `git send-email`
will default to `localhost` and fail if you are not running a
local SMTP server with: `Unable to initialize SMTP properly.
Check config and use --smtp-debug.`. I would suggest altering the
message pointing the user to the new option.
"Unable to initialize SMTP properly. Check config and use --smtp-debug. Use --get-smtp-server to get the correct settings for you SMTP server if needed."

What do you think about that?
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help