Crème CRM
La synchronisation des e-mails externe ne fonctionne pas - Version imprimable

+- Crème CRM (https://www.cremecrm.com/forum)
+-- Forum : Utilisateurs (https://www.cremecrm.com/forum/forumdisplay.php?fid=5)
+--- Forum : Bugs (https://www.cremecrm.com/forum/forumdisplay.php?fid=9)
+--- Sujet : La synchronisation des e-mails externe ne fonctionne pas (/showthread.php?tid=154)



La synchronisation des e-mails externe ne fonctionne pas - libresurf - 30-04-2020

Bonjour,

La synchronisation des e-mails externe ne fonctionne pas.

Voici ma configuration dans le fichier "local_settings.py" :


Code :
# EMAILS [internal] ############################################################

# Emails sent to the users of Creme (reminders, assistants.user_message, commercial.commercial_approach...)
EMAIL_SENDER        = 'cremecrm@ma_societe.fr'  # This is a Creme parameter which specifies from_email (sender) when sending email.                                                                                            
EMAIL_HOST          = 'smtp.ionos.fr'
EMAIL_HOST_USER     = 'cremecrm@ma_societe.fr'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_USE_TLS       = True
EMAIL_PORT          = 587

DEFAULT_USER_EMAIL = ''  # Email address used in case the user doesn't have filled his one.

# EMAILS [END] #################################################################



# CRUDITY -----------------------------------------------------------------------
# EMail parameters to sync external emails in Creme
CREME_GET_EMAIL              = 'cremecrm@ma_societe.fr'       # Creme gets email. e.g : creme@cremecrm.org
CREME_GET_EMAIL_SERVER       = 'pop.ionos.fr'                   # Creme gets server. e.g : pop.cremecrm.org (only pop supported for now)                                                                                              
CREME_GET_EMAIL_USERNAME     = 'cremecrm@ma_societe.fr'
CREME_GET_EMAIL_PASSWORD     = 'password'
CREME_GET_EMAIL_PORT         = 110
CREME_GET_EMAIL_SSL          = False  # True or False
CREME_GET_EMAIL_SSL_KEYFILE  = ''  # PEM formatted file that contains your private key (only used if CREME_GET_EMAIL_SSL is True).                                                                                                    
CREME_GET_EMAIL_SSL_CERTFILE = ''  # PEM formatted certificate chain file (only used if CREME_GET_EMAIL_SSL is True).                                                                                                                

# Path to a readable directory. Used by the fetcher 'filesystem'.
# The contained files are used to create entity (ex: the input 'ini' used .ini files) ; used files are deleted.
#CRUDITY_FILESYS_FETCHER_DIR = ''

# CRUDITY_BACKENDS configures the backends (it's a list of dict)
CRUDITY_BACKENDS = [
   {
       'fetcher': 'email',
       'input': 'raw',
       #'input': '',
       'method': 'create',
       #'method': '',
       'model': 'emails.entityemail',
       'password': '',
       'limit_froms': (),
       'in_sandbox': True,
       'body_map': {},
       'subject': '*',
   },
]


et voici ce que renvoie la commande : python3 manage.py creme_job_manager


Citation :[2020-04-30 17:34:08] ERROR - creme.creme_core.creme_jobs.base : a bytes-like object is required, not 'str'
Traceback (most recent call last):
  File "/srv/www/creme_crm-2.1/creme/creme_core/creme_jobs/base.py", line 112, in execute
    self._execute(job)
  File "/srv/www/creme_crm-2.1/creme/crudity/creme_jobs.py", line 52, in _execute
    count = len(registry.crudity_registry.fetch(user))
  File "/srv/www/creme_crm-2.1/creme/crudity/registry.py", line 364, in fetch
    for data in fetcher_multiplex.fetch():
  File "/srv/www/creme_crm-2.1/creme/crudity/registry.py", line 68, in fetch
    data.extend(fetcher.fetch())
  File "/srv/www/creme_crm-2.1/creme/crudity/fetchers/pop.py", line 83, in fetch
    message_number, message_size = msg_info.split(' ')
TypeError: a bytes-like object is required, not 'str'
/usr/lib/python3.7/socket.py:660: ResourceWarning: unclosed
  self._sock = None
ResourceWarning: Enable tracemalloc to get the object allocation traceback


Il semble qu'il y ait un problème de typage d'objet à passer à la fonction msg_info.split du fichier creme/crudity/fetchers/pop.py.

Je ne sais pas si cela vient d'une erreur dans mon fichier de configuration "local_settings.py".

Merci à vous.


RE: La synchronisation des e-mails externe ne fonctionne pas - genglert - 04-05-2020

Bonjour,

1 - les variables de configuration que vous donnez ici servent à configurer les envois d'e-mails depuis Creme (serveur SMTP) (c'est d'ailleurs pus ou moins bien indiqué au dessus en commentaire dans le code que vous avez collé). Les variables à définir pour la synchronisation (serveur POP) sont plus bas, dans la section 'CRUDITY', à savoir les variables CREME_GET_EMAIL et compagnie.

2 - Non ce n'est pas la faute à votre configuration, il semble qu'il ait véritablement un bug depuis Creme2.0 et le passage à Python 3 (cette partie est vieille et assez difficilement testable automatiquement -- le bug est passé entre les mailles du filet). Un de mes collègues regarde ça quand il le peut, et si on a de la chance un correctif sera présent dans les versions corrective de Creme2.0 & 2.1 que je ferai en fin de semaine. On vous tient au courant.

Bonne soirée !


RE: La synchronisation des e-mails externe ne fonctionne pas - libresurf - 04-05-2020

C'est effectivement un problème avec la librairie poplib de Python3 qui ne renvoie plus les résultats au format STRING mais au format BYTES.

J'ai fait quelques corrections dans le fichier creme_crm-2.1/creme/crudity/fetchers/pop.py pour prendre en compte cela :

Code :
--- pop.py.original     2020-05-04 15:15:03.707970859 +0200
+++ pop.py      2020-05-04 18:55:00.169877808 +0200
@@ -80,13 +80,13 @@
        for msg_info in messages:
            attachments = []

-            message_number, message_size = msg_info.split(' ')
-            r, raw_message_lines, message_size = client.retr(message_number)
+            message_number, message_size = msg_info.split()
+            r, raw_message_lines, message_size = client.retr(int(message_number))

-            out_str = '\n'.join(raw_message_lines)
-            out_str = re.sub(r'\r(?!=\n)', '\r\n', out_str)
+            out_str = b'\n'.join(raw_message_lines)
+            out_str = re.sub(br'\r(?!=\n)', b'\r\n', out_str)

-            email_message = email.message_from_string(out_str)
+            email_message = email.message_from_bytes(out_str)
            get_all = email_message.get_all

            to_emails   = [addr for name, addr in getaddresses(get_all('to', []))]
@@ -94,7 +94,7 @@
            cc_emails   = [addr for name, addr in getaddresses(get_all('cc', []))]

            subject = ''.join(s.decode(enc) if enc is not None else s
-                                for s, enc in email.Header.decode_header(email_message.get('subject', []))
+                                for s, enc in email.header.decode_header(email_message.get('subject', []))
                              )
 
             dates = [datetime(*parsedate(d)[:-3]) for d in get_all('date', []) if d is not None]                              

Cela semble fonctionner car je n'ai plus de logs d'erreur pour le fichier pop.py.
C'est quand même à regarder de près car je ne suis pas informaticien et c'est la première fois que je bidouille en python.

Par contre, j'ai l'erreur suivante :

Code :
[2020-05-04 19:27:25] ERROR   (-2.1/creme/creme_core/creme_jobs/base:114) creme.creme_core.creme_jobs.base : Document() got an unexpected keyword argument 'folder'
Traceback (most recent call last):
 File "/srv/www/creme_crm-2.1/creme/creme_core/creme_jobs/base.py", line 112, in execute
   self._execute(job)
 File "/srv/www/creme_crm-2.1/creme/crudity/creme_jobs.py", line 52, in _execute
   count = len(registry.crudity_registry.fetch(user))
 File "/srv/www/creme_crm-2.1/creme/crudity/registry.py", line 365, in fetch
   backend = _handle_data(fetcher_multiplex, data)
 File "/srv/www/creme_crm-2.1/creme/crudity/registry.py", line 353, in _handle_data
   default_backend.fetcher_fallback(data, user)
 File "/usr/lib/python3.7/contextlib.py", line 74, in inner
   return func(*args, **kwds)
 File "/srv/www/creme_crm-2.1/creme/emails/crudity_register.py", line 99, in fetcher_fallback
   filedata=path,
 File "/srv/www/Envs/creme_2_1/lib/python3.7/site-packages/django/db/models/manager.py", line 82, in manager_method
   return getattr(self.get_queryset(), name)(*args, **kwargs)
 File "/srv/www/Envs/creme_2_1/lib/python3.7/site-packages/django/db/models/query.py", line 420, in create
   obj = self.model(**kwargs)
 File "/srv/www/creme_crm-2.1/creme/creme_core/models/entity.py", line 109, in __init__
   super().__init__(*args, **kwargs)
 File "/srv/www/Envs/creme_2_1/lib/python3.7/site-packages/django/db/models/base.py", line 501, in __init__
   raise TypeError("%s() got an unexpected keyword argument '%s'" % (cls.__name__, kwarg))
TypeError: Document() got an unexpected keyword argument 'folder'

Je ne sais pas si c'est lié aux e-mails ou pas.

À première vue, ça ne semble pas lié au problème précédent.

Cependant, je n'ai toujours pas d'e-mails dans la fenêtre de Synchronisation des e-mails externes dans Creme. Sad


RE: La synchronisation des e-mails externe ne fonctionne pas - genglert - 04-05-2020

Pour votre 2ème erreur, dans le fichier 'creme/crudity/registry.py', remplacez ligne 91


Code :
folder=folder

par


Code :
linked_folder=folder



RE: La synchronisation des e-mails externe ne fonctionne pas - libresurf - 05-05-2020

Merci genglert,

ça fonctionne ! Smile 

Pour info, le fichier à modifier était 'creme_crm-2.1/creme/emails/crudity_register.py'.


RE: La synchronisation des e-mails externe ne fonctionne pas - libresurf - 05-05-2020

Mais le sujet n'est pas encore réglé.
En effet, l'affichage de la fiche du mail dans Crème CRM conserve la notation BYTES (le message est précédé de b' ) et les caractères spéciaux (retours à la ligne, etc...) ne sont pas interprétés.
L'affichage est quasiment inexploitable. Sad


RE: La synchronisation des e-mails externe ne fonctionne pas - genglert - 05-05-2020

(05-05-2020, 17:48)libresurf a écrit : Mais le sujet n'est pas encore réglé.
En effet, l'affichage de la fiche du mail dans Crème CRM conserve la notation BYTES (le message est précédé de b' ) et les caractères spéciaux (retours à la ligne, etc...) ne sont pas interprétés.
L'affichage est quasiment inexploitable. Sad

Oui mon collègue qui a regardé ça lundi soir a corrigé un autre bug d'encodage en plus de ce que vous indiquiez ; le tout sera dans la version de correction de jeudi. Cela devrait corriger vos soucis.

Bonne soirée !


RE: La synchronisation des e-mails externe ne fonctionne pas - libresurf - 14-05-2020

Bonjour genglert,


J'ai installé la dernière version 2.1.4 de Crème CRM et il reste un petit soucis :

Code :
[2020-05-14 19:30:44] ERROR - creme.creme_core.creme_jobs.base : b'-ERR invalid sequence number: "b\\\'1\\\'"'
Traceback (most recent call last):
 File "/srv/www/creme_crm-2.1/creme/creme_core/creme_jobs/base.py", line 112, in execute
   self._execute(job)
 File "/srv/www/creme_crm-2.1/creme/crudity/creme_jobs.py", line 52, in _execute
   count = len(registry.crudity_registry.fetch(user))
 File "/srv/www/creme_crm-2.1/creme/crudity/registry.py", line 364, in fetch
   for data in fetcher_multiplex.fetch():
 File "/srv/www/creme_crm-2.1/creme/crudity/registry.py", line 68, in fetch
   data.extend(fetcher.fetch())
 File "/srv/www/creme_crm-2.1/creme/crudity/fetchers/pop.py", line 145, in fetch
   client.dele(message_number)
 File "/usr/lib/python3.7/poplib.py", line 256, in dele
   return self._shortcmd('DELE %s' % which)
 File "/usr/lib/python3.7/poplib.py", line 176, in _shortcmd
   return self._getresp()
 File "/usr/lib/python3.7/poplib.py", line 152, in _getresp
   raise error_proto(resp)
poplib.error_proto: b'-ERR invalid sequence number: "b\\\'1\\\'"'
/usr/lib/python3.7/socket.py:660: ResourceWarning: unclosed <socket.socket fd=5, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=6, laddr=('10.0.0.18', 33126), raddr=('212.227.15.157', 110)>
 self._sock = None
ResourceWarning: Enable tracemalloc to get the object allocation traceback


Cela vient du fichier 'creme_crm-2.1/creme/crudity/fetchers/pop.py' où il manque la conversion en entiers de la variable message_number lors de la suppression des e-mails.

Avant :

Code :
if delete:
               # We delete the mail from the server when treated
               client.dele(message_number)

Après modification :

Code :
if delete:
               # We delete the mail from the server when treated
               client.dele(int(message_number))


Et ça remarche !


Il me reste juste cette erreur que je ne sais pas interpréter :

Code :
/srv/www/Envs/creme_2_1/lib/python3.7/site-packages/django/db/models/fields/__init__.py:1427: RuntimeWarning: DateTimeField
EntityEmail.reception_date received a naive datetime (2020-05-14 19:27:16) while time zone support is active.
 RuntimeWarning)



RE: La synchronisation des e-mails externe ne fonctionne pas - genglert - 15-05-2020

Bonjour !

Citation :Avant :

Code :
if delete:
               # We delete the mail from the server when treated
               client.dele(message_number)

Après modification :

Code :
if delete:
               # We delete the mail from the server when treated
               client.dele(int(message_number))

Et ça remarche !

Ok je dirai à mon collègue de tester ça de son coté (vu que ça passait chez lui, cela doit dépendre du serveur en face, c'est pénible...), mais à priori pas de souci pour que ça aille dans la prochaine version corrective (attention ceci-dit la semaine prochaine nous devrions passer sur github ; je mettrai les didacticiels à jour pour les nouvelles commandes/URLs).



Citation :Il me reste juste cette erreur que je ne sais pas interpréter :

Code :
/srv/www/Envs/creme_2_1/lib/python3.7/site-packages/django/db/models/fields/__init__.py:1427: RuntimeWarning: DateTimeField
EntityEmail.reception_date received a naive datetime (2020-05-14 19:27:16) while time zone support is active.
 RuntimeWarning)

Les dates dites naïves sont des dates qui ne sont pas associées à une TimeZone (dans votre exemple: est-ce 19:27 à Paris ou à Tokyo ?). Depuis quelques années les dates enregistrées en base doivent être associées à une TimeZone ("aware" -- dans le jargon).

Je pense que la modification suivante dans creme/crudity/fetchers/pop.py devrait résoudre le problème :

Code :
from creme.creme_core.utils.dates import make_aware_dt # Nouvel import

[...]

# dates = [datetime(*parsedate(d)[:-3]) for d in get_all('date', []) if d is not None]
dates = [make_aware_dt(datetime(*parsedate(d)[:-3])) for d in get_all('date', []) if d is not None]


Bon week-end !