Re: [PATCH v2] send-email: add --get-smtp-server option to fetch SMTP settings
- From
Aditya Garg <gargaditya08@live.com>
- Date
- Aug 3, 2025, 13:59 UTC
- Message-ID
- <1ABB6EBC-7CA0-4108-94AC-F38E96BC7673@live.com>
- In-Reply-To
- <DBSU01804YQB.2JA3KHG5FDV55@swagemakers.org>
On 03/08/25 7:06 pm, Julian Swagemakers wrote:
Show 14 quoted lines
> Hi Aditya, really cool idea, here are some random thoughts: > > On Wed Jul 30, 2025 at 5:12 PM CEST, Aditya Garg wrote: >> 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.
Show 9 quoted lines
> >> >> 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.
Show 11 quoted lines
> >> >> 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 :)
Show 23 quoted lines
>
>
>> +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?
Show 24 quoted lines
>
>> + }
>> +
>> + 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.
Show 12 quoted lines
>
>> + }
>> +}
>> +
>> +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?).>
Show 5 quoted lines
> 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?