Re: [PATCH v2] send-email: add --get-smtp-server option to fetch SMTP settings
- From
Julian Swagemakers <julian@swagemakers.org>
- Date
- Aug 4, 2025, 11:51 UTC
- Message-ID
- <DBTME8R0DCOH.2E8WOTO3STJ4L@swagemakers.org>
- In-Reply-To
- <1ABB6EBC-7CA0-4108-94AC-F38E96BC7673@live.com>
On Sun Aug 3, 2025 at 3:59 PM CEST, Aditya Garg wrote:
Show 15 quoted lines
> On 03/08/25 7:06 pm, Julian Swagemakers wrote: >> On Wed Jul 30, 2025 at 5:12 PM CEST, Aditya Garg wrote: >>> >>> 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. >
I also don't know any hosts supporting this.
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?How about something like this:
Found SMTP server settings for example@tiscali.cz:
Configuration 1:
Server: smtp.mail.tiscali.cz
Port: 25
Encryption: plain
Username: example@tiscali.czWarning: Encryption plain is unencrypted!
Show 26 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.How about something like this:
Found SMTP server settings for example@pobox.com:
Configuration 1:
Server: smtp.pobox.com
Port: 465
Encryption: ssl
Username: example@pobox.com Configuration 2:
Server: smtp.pobox.com
Port: 587
Encryption: tls
Username: example@pobox.comTo apply the settings use:
git config --global sendmail.smtpServer VALUE
git config --global sendmail.smtpServerPort VALUE
git config --global sendmail.smtpEncryption VALUE
git config --global sendmail.smtpUser VALUEOmit --global to set the configuration only in this repository.
Show 10 quoted lines
>> 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. >
I was thinking of something as simple as rendering a message if oauth2 is one of the options. Something like:
Found SMTP server settings for example@gmail.com:
Configuration 1:
Server: smtp.gmail.com
Port: 465
Encryption: ssl
Username: example@gmail.com The SMTP server supports OAuth2 authentication. If you want to use OAuth2,
please review the git-send-email man pages for more details.Show 26 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?).>
>> 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?Looks good.
Regards Julian