Roundcube & external identities (yahoo, gmail,...)

English translation here

Bonjour,

Ce howto fait écho au post de seby : [Solved] Identités sur Roundcube

Le besoin :

Malgré l’utilisation de Yunohost, j’ai encore besoin de gérer des adresses mails de fournisseurs comme gmail ou yahoo. Je souhaite tout centraliser sur mon serveur perso. J’ai donc besoin de recevoir les mails provenant de ces fournisseurs mais également pourvoir émettre des mails depuis roundcube en particulier et depuis mon serveur yuno en général.

Ce howto décrit comment j’ai procédé.

Avertissement 0 : La configuration décrite ici modifie la configuration Postfix et outre-passe une restriction ldap/yunohost/postfix. Cela pourrait poser problème lors d’une mise à jour de yunohost.

Avertissement 1 : La solution décrite ici peut être affectée par le syndrome du “chez moi ça marche”. Cela signifie que si vous appliquez cette astuce chez vous, il est possible que cela ne fonctionne par tel quel. À vous de voir ce qui affecte le bon fonctionnement de cette config.

Avertissement 2 : Scrutez en permanence les logs Postfix. Une erreur de configuration ou de nombreux essais en échec pourrait conduire à ce que l’adresse ip de votre serveur soit considérée comme émetteur de spam

Avertissement 3 : Ce howto couvre la configuration pour l’émission de mails avec une adresse externe à votre domaine yuno (ex: yahoo, gmail). Il ne couvre pas la récupération des mails (perso j’utilise fetchmail).

Avertissement 4 : Ne recopiez pas tout tel quel dans votre config. J’ai essayé de signaler ce qui doit changer chez vous en mettant les paramètres entre “<>”. Pour conserver la clarté de howto ce n’est pas toujours possible alors à vous de faire le tri :-). Tout le long de howto, j’ai pris en exemple mon cas perso et donc vous verrez toute la configuration adaptée à gmail et yahoo. Bien entendu, en cas de besoin … RTFM :slight_smile:

Avertissement 5 : Considérez que je ne suis en rien responsable d’un dysfonctionnement de votre installation suite à l’intégration de cette astuce chez vous. Je ne suis pas expert postfix/ldap/yunohost et il se peut que des imprécisions, tant sur le vocabulaire que sur les solutions techniques, soient présentes.

En route …

L’idée est d’utiliser postfix comme un client de messagerie lambda. Pour cela nous utiliserons la fonctionnalité dite “sender-dependent”. Grâce à cette fonctionnalité, lorsque postfix détectera que l’expéditeur (le “From:”) est une de vos adresses mails externes, il utilisera le relais smtp de votre fournisseur. Nous configurerons également roundcube afin qu’une identité correspondant à votre mail externe soit disponible.

Voici les étapes de configuration :

  1. Configuration Postfix :
    1. Configuration de /etc/postfix/main.cf
    2. Création et génération des maps postfix pour le “sender-dependent”
    3. Modification de la map sender_canonical
    4. Premier test
  2. Ajout des identités dans rouncube (et donc dans le ldap)

1 - Configuration Postfix

1.1 - Ajout des directives dans main.cf

Afin que Postfix se comporte comme un client de messagerie, nous allons implémenter des directives “smtp_sasl*”. Copiez les directives suivantes dans votre /etc/postfix/main.cf (les directives sont documentées en commentaires) :

# Configuration pour relayer les mails externes au domaine yuno
# =============================================================

# Map contenant la correspondance "relai smtp" <=> "login et password"
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
# Activation de l'authentification smtp sasl
smtp_sasl_auth_enable = yes
# Map contenant la correspondance "adresse mail" <=> "relai smtp"
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay
# Activation de la fonctionnalité "sender-dependent"
smtp_sender_dependent_authentication = yes
# Activation de tls pour la connexion au relai smtp
smtp_use_tls = yes
# Autorise la transmission du password en PLAIN TEXT mais seulement en TLS
smtp_sasl_security_options = noplaintext, noanonymous
smtp_sasl_tls_security_options = noanonymous

1.2 - Création et génération des maps postfix pour le sender-dependent

1.2.1 Map sender_relay

Cette map contient la correspondance entre votre adresse mail et le relais smtp à utiliser si l’expéditeur du mail correspond à l’adresse renseignée ici.

Créez le fichier sender_relay :

$ touch /etc/postfix/sender_relay

Placez-votre configuration de façon à obtenir ceci :

<login>@yahoo.fr [smtp.mail.yahoo.com]:submission
<login>@gmail.com [smtp.gmail.com]:submission

Générez la map :

 $ postmap hash:/etc/postfix/sender_relay

1.2.2 Map sasl_passwd

Cette map contient la correspondance ente le relais smtp et les identifiants à utiliser pour l’authentification. Attention les identifiants sont en clair !!

Créez le fichier sasl_passwd :

$ touch /etc/postfix/sasl_passwd

Modifiez les permissions :

$ chmod 600 /etc/postfix/sasl_passwd

Placez votre configuration de façon à obtenir ceci :

[smtp.mail.yahoo.com]:submission <login>:<password>
[smtp.gmail.com]:submission <login>:<password>

Générez la map :

$ postmap hash:/etc/postfix/sasl_passwd

1.3 Modification de la map sender_canonical

Postfix utilise un système de “nettoyage” des adresses d’émission. Depuis votre install yunohost, si vous émettez à un mail avec par exemple l’expéditeur toto@example.com alors Postfix modifie avant l’émission l’adresse en toto@votre_domaine_yuno. C’est pratique mais cela casse la config que nous mettons en place. Postfix ne fera alors jamais la correspondance entre l’émetteur et le relais à utiliser.

Pour éviter cela, j’ai modifié le fichier /etc/postfix/sender_canonical pour ne pas modifier l’expéditeur s’il correspond à une mes adresses mails externes.

Le fichier sender_canonical d’origine est le suivant :

$ cat sender_canonical
/^(.*)@(.*)$/     ${1}

Remplacez le contenu du fichier par celui-ci :

$ cat sender_canonical
if ! /<login>@(yahoo\.fr)|(gmail\.com)$/
/^(.*)@(.*)$/     ${1}
endif

NOTE : il y a certainement une solution plus élégante

1.4 Premiers tests

À ce stade vous pouvez déjà réaliser quelques tests pour vous assurer que la configuration est fonctionnelle.

Au préalable, redémarrez postfix pour la prise en compte de toutes les modifications :

Sous Jessie : systemctl restart postfix.service
Sous Wheezy : /etc/init.d/postfix restart

Envoyez un mail avec en expéditeur votre adresse externe :

$ sendmail -f <login>@yahoo.fr -t <<EOF                                                                                                                                                                                                               
> to: <login>@gmail.com
> subject: Premier test
> EOF

Scrutez bien les logs de postfix. Dans le cas présent, le mail doit être émis via le smtp de yahoo. Vous devriez voir dans /vat/log/mail.log des lignes de ce type :

[...]
Aug 15 13:43:49 hostname postfix/smtp[2895]: Untrusted TLS connection established to smtp.mail.yahoo.com[188.125.69.59]:587: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
Aug 15 13:43:50 hostname postfix/smtp[2895]: E70BA360E8C: to=<<login>@gmail.com>, relay=smtp.mail.yahoo.com[188.125.69.59]:587, delay=1.2, delays=0.05/0.05/0.82/0.27, dsn=2.0.0, status=sent (250 OK , completed)
Aug 15 13:43:50 hostname postfix/qmgr[2142]: E70BA360E8C: removed
[...]

Si vous n’avez pas d’erreur c’est que tout fonctionne coté Postfix … Sinon continuer le debogage …

2 - Ajout des identités dans roundcube

À ce stade vous ne pouvez pas utiliser votre adresse mail externe depuis rouncube. Roundcube appelle cela une “identité”. Cette identité est collectée depuis le ldap. Il nous faut alors l’ajouter dans le ldap sur votre compte utilisateur.
Coté Postfix il s’agit d’alias. Yunohost offre la possibilité d’ajouter de multiple alias soit via la moulinette soit via la page de gestion de votre profile depuis l’interface web.

Il y a un tout de même un problème. En effet, vous n’aurez pas l’autorisation d’ajouter un alias dont le nom de domaine ne correspond pas à votre domaine yunohost. C’est tout à fait logique, votre installation ne peut/doit pas gérer un domaine qui ne vous appartient pas.

Nous allons contourner ce problème en ajoutant un alias en utilisant directement une commande ldap cliente : ldapmodify

J’utilise ici la commande ldapmodify en mode interactif mais il est possible de créer au préalable un fichier ldif et le donner en entrée de la commande ldapmodify.

Dans le ldap, les alias sont gérés via un attribut multi-valué : mail

Vous aurez besoin du mot de passe du compte yuno “admin”.
Vous aurez besoin du “dn” de votre compte utilisateur yunohost.

Voici comment j’ai ajouté une adresse yahoo sur mon compte yunohost (ici nommé “mon_compte”)

$ ldapmodify -D cn=admin,dc=yunohost,dc=org -W
Enter LDAP Password:
dn: uid=mon_compte,ou=users,dc=yunohost,dc=org
changetype: modify
add: mail
mail: <login>@yahoo.fr
^d

NOTE :^d” signifie que vous devez insérer la séquence de touch “crontrol+d”, cela valide la modification.

Vous pourrez vérifier que l’ajout est effectif avec la moulinette :

$ yunohost user info mon_compte

Déconnectez vous puis re-connectez à roundcube. Dans “Paramètres” puis “Identités” vous devriez maintenant voir une identité avec votre adresse mail externe.

Vous pouvez refaire un test d’émission depuis roundcube. Dans le champ “De:” du message, sélectionnez votre identité “externe” et envoyer un mail. Scrutez à nouveau les logs postfix.

Voila c’est fait.

Si vous avez des remarques ou amélioration à proposer, je suis à l’écoute.

Également, si des experts yuno lisent ce message, je suis à l’écoute d’un paramétrage yuno permettant de conserver ces modifs dans le temps sans empêcher une mise à jour de yunohost.

A+


bidroik

2 Likes

can some one translate it in english ?

Hello kanhu,

Good idea. I have to remove chapter 3 of this article (it does not work). I’ll try to do it today.


Bidroik

Here is the english translation.

My english is really not perfect, tell me if see errors, I will edit the post.

Hello,

This howto is a response to the seby’s post : [Solved] Identités sur Roundcube

The need :

Despite the use of yunohost, I still need to manage email from provider like gmail or yahoo. I want to centralize email management on my personal server. So I need to receive mail from these providers but also send mail from roundcube in particular and from my yuno server in general.

This howto explains how I did it.

Warning 0 : The configuration describes here modifies the postfix configuration and override a ldap/yuno restriction. This could be a problem during a yunohost upgrade.

Warning 1 : The configuration describes here works on my yuno installation. It may not work at your’s.

Warning 2 : Please, often look at the postfix’s logs. A configuration mistake or many unsuccessfull tries may conduce to consider your address ip like a spammer.

Warning 3 : This howto describes how to send mail using an external mail like gmail or yahoo. It does not describe how to fetch mails from your provider (I use fetchmail for that need).

Warning 4 : Please, do not copy all the configuration wihtout using your brain :-). I tried to show setting that you need to change for your needs by quoting them with “<>”. It sometimes not possible to keep clear this howto. I used my personnal case (gmail and yahoo) to write this howto.

Warning 5 : Please consider that I will never be responsible of a dammage on your installation if you apply this howto. I’am not a postfix/ldap/yuno expert so it is possible that you find some imprecisions in this howto.

So, let’s go …

The goal is to configure postfix to act as a normal client email. To do it we will use the postfix capability named “sender-dependent”. With the “sender-dependent” postfix will be able to detect that the sender (the “From:”) is one of your external email and it will use your provider smtp relay. We will also configure roundcube to create an “identity” corresponding to your external mail.

Here are the configuration steps :

  1. Postfix configuration
    1. Modifications in /etc/postfix/main.cf
    2. Creation of the postfix’s maps for the “sender-dependent
    3. Modification of the sender_canonical map
    4. First test
  2. Adding identities in roundcube

1 - Postfix configuration

1.1 - Append parameters in main.cf

To add “sender-dependent” capabilities we will add some “smtp_*” parameters. Copy the parameters below in your /etc/postfix/main.cf (documentation is in comments).

# Configuration to relay external emails
# ======================================

# Map containing the correspondence "smtp relay" <=> "login and password"
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
# Init smtp sasl authentication
smtp_sasl_auth_enable = yes
# Map containing the correspondence "mail address" <=> "smtp relay"
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay
# init "sender-dependent" capabilty
smtp_sender_dependent_authentication = yes
# Init tls connection with smtp relay
smtp_use_tls = yes
# Authorizes PLAIN TEXT password BUT only in tls mode
smtp_sasl_security_options = noplaintext, noanonymous
smtp_sasl_tls_security_options = noanonymous

1.2 - Postfix creation of the “sender-dependent” maps

1.2.1 Map sender_relay

This map contains the corespondence between your email and the smtp relay to use.

Create the file sender_relay:

$ touch /etc/postfix/sender_relay

Write your own configuration to obtain something like that :

<login>@yahoo.fr [smtp.mail.yahoo.com]:submission
<login>@gmail.com [smtp.gmail.com]:submission

Generate the map :

 $ postmap hash:/etc/postfix/sender_relay

1.2.2 Map sasl_passwd

This map contains the correspondence between the stmp relay and your login/password to use for authentication. Be carrefull, password is in plain text !

Create the file sasl_passwd :

$ touch /etc/postfix/sasl_passwd

Modify permissions :

$ chmod 600 /etc/postfix/sasl_passwd

Write your own configuration to obtain something like that :

[smtp.mail.yahoo.com]:submission <login>:<password>
[smtp.gmail.com]:submission <login>:<password>

Generate the map :

$ postmap hash:/etc/postfix/sasl_passwd

1.3 - sender_canonical map modification

Postfix uses a “cleanup” mecanism of the sender address. For example, if you send (from your yuno server) an email where the sender is toto@example.com, postfix will modify the sender to toto@your_yuno_domain. That’s a normal behaviour, you can not manage a domain that is not your property. But if we do nothing we will not be able to send mail from an external email, postfix never do the correspondence between the sender and the smtp relay to use.

So, we will modify the rewrite rule in the map sender_canonical

The original file contains :

$ cat sender_canonical
/^(.*)@(.*)$/     ${1}

Replace by :

$ cat sender_canonical
if ! /<login>@(yahoo\.fr)|(gmail\.com)$/
/^(.*)@(.*)$/     ${1}
endif

NOTE : It’s “quick an dirty” I guess there is an more elegant way to do it

1.4 - First test

At this step you can make a first test to ensure that the configuration is working well.

First, restart postfix :

Under Jessie : systemctl restart postfix.service
Under Wheezy : /etc/init.d/postfix restart

Send an email with one of your external email :

$ sendmail -f <login>@yahoo.fr -t <<EOF                                                                                                                                                                                                               
> to: <login>@gmail.com
> subject: Premier test
> EOF

Take a look to your postfix’s logs, you should see messages like these ones:

[...]
Aug 15 13:43:49 hostname postfix/smtp[2895]: Untrusted TLS connection established to smtp.mail.yahoo.com[188.125.69.59]:587: TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)
Aug 15 13:43:50 hostname postfix/smtp[2895]: E70BA360E8C: to=<<login>@gmail.com>, relay=smtp.mail.yahoo.com[188.125.69.59]:587, delay=1.2, delays=0.05/0.05/0.82/0.27, dsn=2.0.0, status=sent (250 OK , completed)
Aug 15 13:43:50 hostname postfix/qmgr[2142]: E70BA360E8C: removed
[...]

If you do not see errors all is working well, if not … find what is not working …

2 - Add identities in roundcube

At this time you can not use your external mail in roundcube. Roundcube calls this an “identity”. Identities are collected from the yuno ldap. You have to add the identity in the ldap first.

From postfix point of view it is an alias. You can add alias from yunohost application (moulinette or web app) but you will face an error because the domain part of the email is not your yuno domain.

The workaround is to add the email on your yuno account using a client ldap command : ldapmodify.
We will add a multi-valued attribut : mail

I used ldapmodify in interactive mode but you can first create a ldif file and use it with the command (-f).

You will need the yuno admin password.
You will need the “dn” attribut of your yuno account.

Here is how I added one of my external email :

$ ldapmodify -D cn=admin,dc=yunohost,dc=org -W
Enter LDAP Password:
dn: uid=my_account,ou=users,dc=yunohost,dc=org
changetype: modify
add: mail
mail: <login>@yahoo.fr
^d

NOTE :^d” means that you have to use the keyboard sequence “crontrol+d”, it validates the modification.

You can check your account using the moulinette command :

$ yunohost user info my_account

You have to disconnect an re-connect to roundcube and then you will see in the roundcube “Identities” the alias you added.

Make a new test from roundcube. Write a new and select in the “From:” fied your new identity. Check once again the postfix’s logs.

It’s done !

Wow, nice How-to! I’m sure this will be helpful for many people :wink:

Merci pour ce tuto qui fonctionne bien.
J’ai juste un souci dans le cas où j’ai 2 identités avec le même smtp.

Exemple :
/etc/postfix/sasl_passwd

[smtp.gmail.com]:submission <login1>:<password1>
[smtp.gmail.com]:submission <login2>:<password2>

Du coup

$ postmap hash:/etc/postfix/sasl_passwd

Génère une alerte :
postmap: warning: /etc/postfix/sasl_passwd.db: duplicate entry: …

Une astuce pour gérer cela ?
Mille mercis
Fred

Bonsoir à tous
Je n’arrive pas à me connecter en admin
$ ldapmodify -D cn=admin,dc=yunohost,dc=org -W
Enter LDAP Password: ???
je mets mon mdp admin et rien!
pouvez vous m’aider? merci

Il se passe forcément quelque chose … Est-ce qu’il y a un message d’erreur ? Est-ce que la commande semble attendre pour toujours ? Est-ce qu’elle te rend la main sans rien dire ?

Qu’est-ce que tu t’attendrais à avoir ? Qu’est-ce que tu cherches à faire ?

Bonsoir merci de votre réponse, la commande semble attendre pour toujours.
je cherche à modifier avec cette commande:
$ ldapmodify -D cn=admin,dc=yunohost,dc=org -W Enter LDAP Password: dn: uid=my_account,ou=users,dc=yunohost,dc=org changetype: modify add: mail mail: <login>@yahoo.fr ^d

je rentre mon passwd admin mais il m rend pas la main et semble mouliner .

Bonjour,
Voici mon message d’erreur:
ldap_sasl_interactive_bind_s: Invalid credentials (49)
additional info: SASL(-13): user not found: no secret in database
merci de votre réponse

Un petit up ;(
Cela ne vous semble pas possible de gérer plusieurs identités d’un même smtp ?

[smtp.gmail.com]:submission <login1>:<password1>
[smtp.gmail.com]:submission <login2>:<password2>

Je coince…
Merci
Fred

Hello FredM,

Une petite recherche google plus tard et une piste : https://gist.github.com/zmwangx/2c56aa32be68daf48c2f

Tout se passe dans le fichier sasl_passwd.

Tiens nous au courant de tes essais.

Merci
A+

Merci Bidroik pour le lien.
J’ai fait quelques essais et cela semble fonctionner.
Sur ton tuto, le /etc/postfix/sasl_passwd est du type :

[smtp.gmail.com]:submission <utilisateur@gmail.com>: <code> [smtp.free.fr]:submission <utilisateur@free.fr>: <code> [smtp.mail.yahoo.fr]:submission <utilisateur@yahoo.fr>: <code>
Avec la modif pour avoir plusieurs users sur un même domaine, le fichier devient sasl_passwd :
`utilisateur1@gmail.com utilisateur1@gmail.com:code1
utilisateur2@gmail.com utilisateur2@gmail.com:code2
utilisateur3@free.fr utilisateur3:code3
utilisateur4@yahoo.fr utilisateur4:code4

[smtp.gmail.com]:587 default_account@gmail.com:default_passwd

[smtp.free.fr] default_account:default_passwd

[smtp.mail.yahoo.fr]:587 default_account:default_passwd`

Par contre il ne semble plus possible d’envoyer de mails sur mon adresse yunohost à partir du moment où l’expéditeur a été ajouté dans les alias via ldapmodify. J’ai l’erreur : “Sender address rejected: not logged in;”
Je ne vois pas ce que j’ai cassé ;((
Après j’ai aussi un souci DMARC pour l’adresse en yahoo et un score pas terrible sous www.mail-tester.com pour certains domaines, notamment parce que le message n’est pas signé avec DKIM.
Bon, je ne maîtrise pas bien postfix…

Fred

1 Like

Bonjour,

Attention. Cette configuration ne fonctionne plus pour moi depuis le passage à Buster.

Hello,

Take care. This configuraion does not work anymore since the upgrade to Buster

A+