Doshi's blog

Thème:

Se scripter la vie : mbsync et msmtp

, , — ~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 :

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 ?

  1. Outil pour syncroniser un répertoire IMAP distant à un répertoire Maildir local 

  2. Pour envoyer des mails 

  3. https://www.youtube.com/watch?v=LhvtLHiMMzE 

  4. Ghost - Busters ! 


Il n'y a pas de commentaires sur ce blog, cependant, n'hésitez pas à me faire des remarques sur cet article (ou autre, d'ailleurs). Que ce soit via Mastodon, Twitter, XMPP ou encore par mail, je serai ravi de voir que des gens me lisent pour de vrai