Grimoire-
Command
.es

GNU+Linux command memo

Assume your passwords (Mutt, SMTP)

1. version : en

Here is the story of how I lost (again) an afternoon…

I need to send emails via there respective SMTP servers now that a big email hoster refuse emails without SPF or DMarc authentication.

With mutt this is achieved with the following configuration ~/.muttrc :

smtp_url
          Type: string
          Default: “”

          Defines the SMTP smarthost where sent messages should relayed
          for delivery. This should take the form of an SMTP URL, e.g.:


          smtp[s]://[user[:pass]@]host[:port]


          where “[...]” denotes an optional part.  Setting this variable
          overrides the value of the $sendmail variable.

Everything is here, in the official documentation thou shalt read.

So you can specify your SMTP server, user and password via the smtp_url configuration variable and an smtps:// URL pattern… except if you password contains slashes (/).

In this case you can possibly escape your slashes, or specify the password in another mutt configuration variable called : smtp_pass.

set smtp_url = "smtps://contact@heroncendre.com@mail.infomaniak.com"
set smtp_pass = "pass/with/slashes"

Great, but what if it still fails ?

You might have a strong password like : /7k91$ehFLbYGJPGv6FDMP32N/uvXYG..$iosAR

You might have notice, in the last line of the smtp_url Mutt’s configuration variable documentation, the usage of $sendmail ?

In mutt configuration file, like in most shell environments $something is pre-processed and replaced by the content of the something variable, or by nothing if it’s an undefined variable, still your $ disappears from the string that was containing it.

So the dollars in my password was silently replaced by nothing by Mutt and my SMTP sessions failed to authenticate with a poetic message like : SASL authentication failed

To finish, as I use many email addresses from many providers, I instructed Mutt to use the right SMTP server for the right identity.

folder-hook . 'set smtp_url = "smtps://default_user@default_SMTP_server"'
folder-hook . 'set smtp_pass = default_password_with_escaped_\$_signs_and_/'
folder-hook =HeronCendre 'set smtp_url = "smtps://contact@heroncendre.com@mail.infomaniak.com"'
folder-hook =HeronCendre 'set smtp_pass = /7k91\$ehFLbYGJPGv6FDMP32N/uvXYG..\$iosAR'

With those directives, whenever I enter a folder I get the default configuration, and if I enter the HeronCendre folder I override this configuration with what is correct for HeronCendre.

2. version : fr

Voici comment j’ai (encore) perdu une après midi…

Il se trouve que j’ai besoin d’envoyer mes courriel via leurs serveurs SMTP respectifs, vu qu’un gros hébergeur d’adresses email refuse désormais les messages non authentifiés (SPF, DMarc).

Avec mutt on peut obtenir ce résultat en précisant quel serveur utiliser dans la configuration ~/.muttrc :

smtp_url
          Type: string
          Default: “”

          Defines the SMTP smarthost where sent messages should relayed
          for delivery. This should take the form of an SMTP URL, e.g.:


          smtp[s]://[user[:pass]@]host[:port]


          where “[...]” denotes an optional part.  Setting this variable
          overrides the value of the $sendmail variable.

Tout est dit ici, dans la documentation officielle du projet.

On peut donc spécifier un serveur SMTP à utiliser (ainsi qu’un utilisateur et un mot de passe) via un variable de configuration Mutt nommée smtp_url. On y renseigne une chaîne de caractère contenant une URL. C’est chouette, mais déjà, prenez garde si votre mot de passe contient des barres obliques ('/' ou slashes). Ce symbole est utilisé comme délimiteur de champs dans une URL et cette dernière serait donc mal interprétée. Il doit être possible d’échapper les barres obliques, mais il est également possible de préciser le mot de passe dans une seconde variable de configuration de Mutt nommée : smtp_pass.

set smtp_url = "smtps://contact@heroncendre.com@mail.infomaniak.com"
set smtp_pass = "pass/with/slashes"

Super, mais que faire si l’authentification échoue ?

Votre mot de passe ressemble peut être à : /7k91$ehFLbYGJPGv6FDMP32N/uvXYG..$iosAR

Et vous avez peut être remarqué, sur la dernière ligne de la documentation de la variable smtp_url, l’exemple d’utilisation de la syntaxe : $sendmail ?

Dans un fichier de configuration de Mutt (comme dans la plupart des shell) $quelquechose est remplacé, avant l’exécution de la commande, par la valeur de la variable quelquechose ou par un vide si elle n’est pas définie. Du coup le $ disparait de la chaîne de caractère où il était présent.

Donc les dollars de mon mot de passe étaient silencieusement remplacés par du rien par Mutt et l’authentification de mes sessions SMTP échouait avec un message d’erreur comme : SASL authentication failed

Pour finir sur une note plus positive, j’utilise plusieurs adresses de courriel de plusieurs fournisseurs et il est assez simple d’instruire Mutt pour qu’il utilise le bon serveur SMTP pour chaque identité.

folder-hook . 'set smtp_url = "smtps://default_user@default_SMTP_server"'
folder-hook . 'set smtp_pass = default_password_with_escaped_\$_signs_and_/'
folder-hook =HeronCendre 'set smtp_url = "smtps://contact@heroncendre.com@mail.infomaniak.com"'
folder-hook =HeronCendre 'set smtp_pass = /7k91\$ehFLbYGJPGv6FDMP32N/uvXYG..\$iosAR'

Avec ces directives de configuration, chaque fois que j’entre dans un dossier j’obtiens la configuration SMTP par défaut, et si j’entre dans le dossier HeronCendre cette configuration est écrasée par celle correspondant à l’identité associée à HeronCendre.