Se scripter la vie : mbsync et msmtp
— outils, ruby, informatique, programmation — ~3mn de lecture
Y’a un truc que j’aime beaucoup faire, c’est scripter des trucs pour me faciliter la vie
Et bah ça tombe vachement bien parce que j’ai “dû” le faire pour mbsync 1 et msmtp 2. Bah ouais, la conf est la même pour chaque adresse mail, j’allais pas m’emmerder à tout écrire 4 fois quand même :D
Surtout quand faut faire des changements, y’a juste à les faire une seule fois
mbsync
La conf de mbsync pour une adresse, ça ressemble à ça (pour moi):
IMAPAccount mail
Host mail.example.com
User johndoe@example.com
PassCmd "pass mail"
IMAPStore mail-remote
Account mail
MaildirStore mail-local
Path /path/to/maildir/
Inbox /path/to/maildir/INBOX
Channel mail
Master :rc-gandi-remote:
Slave :rc-gandi-local:
Pattern INBOX Sent Trash Drafts Archive
Create Both
SyncState *
Je pense que c’est plutôt compréhensible comme conf, mais j’vais éclairer quelques points :
PassCmd
: Ça permet d’indiquer une commande shell à executer pour choper le mot de passe. Ça permet d’éviter d’utiliserPass
et de foutre le mdp en clair dans la conf (parce qu’on sait jamais 3).Pattern
: Une liste de dossiers distants à synchroniser. Avant j’avais juste une floppée deChannel
avec un dossier à la fois, c’était : relou.- Par défaut, mbsync essaie de se connecter en utilisant STARTTLS, mais si votre serveur IMAP utilise ce bon vieux IMAPS, faudrait rajouter
SSLType IMAPS
dansIMAPAccount
Et du coup moi j’ai un script qui ressemble à ça (c’est en Ruby, j’aime bien Ruby moi)
data = { # me jugez pas
"mail": {
Host: "mail.example.com",
User: "johndoe@example.com",
PassCmd: "pass mail"
},
... et ça 4 fois, avec 4 mails différents
}
et la petite fonction kivabi1:
def mbsync(data, folders) # j'vous ai mis les parenthèses pour pas que vous soyez trop perdus :D
File.open(ENV["HOME"] + "/.mbsyncrc", "w") do |f|
data.each do |account, cred|
settings = <<-END
IMAPAccount #{account}
Host #{cred[:Host]}
User #{cred[:User]}
PassCmd "#{cred[:PassCmd]}"
#{"SSLType IMAPS" if cred[:IMAPS]} # Ouais dans mon hash data je rajoute une ligne "IMAPS: true" si y'a besoin de IMAPS
IMAPStore #{account}-remote
Account #{account}
MaildirStore #{account}-local
Path /path/to/maildir/#{cred[:User]}/
Inbox /path/to/maildir/#{cred[:User]}/INBOX
Channel #{account}
Master :#{account}-remote:
Slave :#{account}-local:
Pattern #{folders.join(" ")}
Create Both
SyncState *
END
f.write settings
end
end
end
msmtp
La conf de msmtp ressemble à ça pour une adresse :
account mail
host mail.example.com
user johndoe@example.com
from johndoe@example.com
passwordeval "pass mail"
J’pense pas avoir grand chose à expliquer là…
Après, dans la conf, y’a une partie defaults
, commune à tous les comptes qui ressemble à ça chez moi
defaults
port 587 # c'est juste le port standard de SMTP, vous en faites pas
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
auth on
Et du coup, vous connaissez la chanson, y’a une fonction qui va avec :
def msmtp data
File.open(ENV["HOME"] + "/.msmtprc", "w") do |f|
defaults = <<-END
defaults
port 587
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
auth on
END
accounts = data.map do |account, cred| <<-END
account #{account}
host #{cred[:SMTP] || cred[:Host]} # si l'adresse du serv SMTP est pas la même que le serv IMAP, je rajoute une ligne "SMTP: 'smtp.example.com'" dans data
user #{cred[:User]}
from #{cred[:User]}
passwordeval "#{cred[:PassCmd]}"
#{"tls_starttls off\n" if cred[:IMAPS]} # pareil que tout à l'heure, si y'a pas de starttls
END
end
f.write defaults
f.write accounts.join("\n")
end
end
Et à la fin on appelle 4
mbsync(data, ["INBOX", "Sent", "Trash", "Drafts", "Archive"])
msmtp(data)
ET BAM
On a notre configuration pour mbsync ET pour msmtp, avec un seul hash de données
Elle est pas belle la vie, quand on est une grosse feignasse ?
Il n'y a pas de commentaire sur ce blog, donc si vous voulez réagir à cet article, n'hésitez pas à venir m'en parler sur le Fediverse, Twitter ou par mail. Des bisouxes !