connect to exchange server
This commit is contained in:
46
imap-over-tls-example.py
Normal file
46
imap-over-tls-example.py
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import imaplib
|
||||||
|
import msal
|
||||||
|
import pprint
|
||||||
|
|
||||||
|
conf = {
|
||||||
|
"authority": "https://login.microsoftonline.com/47f02128-acf0-47a7-a3bf-27a3619d4a4f",
|
||||||
|
"client_id": "4fdf2634-a260-4576-a442-684998f0187b", #AppID
|
||||||
|
"scope": ['https://outlook.office365.com/.default'],
|
||||||
|
"secret": "dZD8Q~GmG_PFi.t_uRiyBEzwLeMZeemQGHUFta~J", #Key-Value
|
||||||
|
"secret-id": "5cae3249-0fc0-43e2-bc0e-d78f41964970", #Key-ID
|
||||||
|
}
|
||||||
|
|
||||||
|
def generate_auth_string(user, token):
|
||||||
|
return f"user={user}\x01auth=Bearer {token}\x01\x01"
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app = msal.ConfidentialClientApplication(conf['client_id'], authority=conf['authority'],
|
||||||
|
client_credential=conf['secret'])
|
||||||
|
|
||||||
|
result = app.acquire_token_silent(conf['scope'], account=None)
|
||||||
|
|
||||||
|
if not result:
|
||||||
|
print("No suitable token in cache. Get new one.")
|
||||||
|
result = app.acquire_token_for_client(scopes=conf['scope'])
|
||||||
|
|
||||||
|
if "access_token" in result:
|
||||||
|
print(result['token_type'])
|
||||||
|
pprint.pprint(result)
|
||||||
|
else:
|
||||||
|
print(result.get("error"))
|
||||||
|
print(result.get("error_description"))
|
||||||
|
print(result.get("correlation_id"))
|
||||||
|
|
||||||
|
imap = imaplib.IMAP4('outlook.office365.com')
|
||||||
|
imap.starttls()
|
||||||
|
imap.authenticate("XOAUTH2", lambda x: generate_auth_string("polynet-dumas@entreprise-dumas.com", result['access_token']).encode("utf-8"))
|
||||||
|
|
||||||
|
# Print list of mailboxes on server
|
||||||
|
code, mailboxes = imap.list()
|
||||||
|
for mailbox in mailboxes:
|
||||||
|
print(mailbox.decode("utf-8"))
|
||||||
|
# Select mailbox
|
||||||
|
imap.select("INBOX")
|
||||||
|
# Cleanup
|
||||||
|
imap.close()
|
||||||
@@ -186,6 +186,11 @@ def get_last_devis_client(request, societe, cd_cli):
|
|||||||
results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first()
|
results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first()
|
||||||
return results
|
return results
|
||||||
|
|
||||||
|
def get_last_proforma_client(request, societe, cd_cli):
|
||||||
|
query = "SELECT * FROM proforma WHERE societe = :societe AND cd_cli = :cd_cli order by date DESC LIMIT 1;"
|
||||||
|
results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first()
|
||||||
|
return results
|
||||||
|
|
||||||
def get_last_chantier_client(request, societe, cd_cli):
|
def get_last_chantier_client(request, societe, cd_cli):
|
||||||
query = "SELECT * FROM dem_devis WHERE societe = :societe AND cd_cli = :cd_cli order by date DESC LIMIT 1;"
|
query = "SELECT * FROM dem_devis WHERE societe = :societe AND cd_cli = :cd_cli order by date DESC LIMIT 1;"
|
||||||
results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first()
|
results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first()
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import json
|
|||||||
import locale
|
import locale
|
||||||
import hashlib
|
import hashlib
|
||||||
import imaplib
|
import imaplib
|
||||||
|
import msal
|
||||||
import email
|
import email
|
||||||
|
|
||||||
from ..models.default import *
|
from ..models.default import *
|
||||||
@@ -72,34 +73,55 @@ def to_percent(x):
|
|||||||
"""Takes a float and returns a string"""
|
"""Takes a float and returns a string"""
|
||||||
return ("%.2f " % x).replace('.', ',') + "%"
|
return ("%.2f " % x).replace('.', ',') + "%"
|
||||||
|
|
||||||
|
def generate_auth_string(user, token):
|
||||||
|
return f"user={user}\x01auth=Bearer {token}\x01\x01"
|
||||||
|
|
||||||
def mailbox_connect(request, societe):
|
def mailbox_connect(request, societe):
|
||||||
# connecter au serveur IMAP de la societe
|
# connecter au serveur IMAP de la societe
|
||||||
if societe == 'PE':
|
if societe == 'PE':
|
||||||
mbx_name = 'peinture-dumas@entreprise-dumas.com'
|
mbx_name = 'peinture-dumas@entreprise-dumas.com'
|
||||||
mbx_pwd = 'S@sdumas69'
|
|
||||||
elif societe == 'ME':
|
elif societe == 'ME':
|
||||||
mbx_name = 'menuiserie-dumas@entreprise-dumas.com'
|
mbx_name = 'menuiserie-dumas@entreprise-dumas.com'
|
||||||
mbx_pwd = 'S@sdumas69'
|
|
||||||
elif societe == 'PL':
|
elif societe == 'PL':
|
||||||
mbx_name = 'versanit-dumas@entreprise-dumas.com'
|
mbx_name = 'versanit-dumas@entreprise-dumas.com'
|
||||||
mbx_pwd = 'S@sdumas69'
|
|
||||||
elif societe == 'PO':
|
elif societe == 'PO':
|
||||||
mbx_name = 'polynet-dumas@entreprise-dumas.com'
|
mbx_name = 'polynet-dumas@entreprise-dumas.com'
|
||||||
mbx_pwd = 'S@sdumas69'
|
|
||||||
else:
|
else:
|
||||||
request.session.flash("Cette société est inconnue ou non traitée : %s" % societe, 'danger')
|
request.session.flash("Cette société est inconnue ou non traitée : %s" % societe, 'danger')
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
conf = {
|
||||||
|
"authority": "https://login.microsoftonline.com/47f02128-acf0-47a7-a3bf-27a3619d4a4f",
|
||||||
|
"client_id": "4fdf2634-a260-4576-a442-684998f0187b", #AppID
|
||||||
|
"scope": ['https://outlook.office365.com/.default'],
|
||||||
|
"secret": "dZD8Q~GmG_PFi.t_uRiyBEzwLeMZeemQGHUFta~J", #Key-Value
|
||||||
|
"secret-id": "5cae3249-0fc0-43e2-bc0e-d78f41964970", #Key-ID
|
||||||
|
}
|
||||||
|
|
||||||
|
app = msal.ConfidentialClientApplication(conf['client_id'], authority=conf['authority'],
|
||||||
|
client_credential=conf['secret'])
|
||||||
|
|
||||||
|
result = app.acquire_token_silent(conf['scope'], account=None)
|
||||||
|
|
||||||
|
if not result:
|
||||||
|
result = app.acquire_token_for_client(scopes=conf['scope'])
|
||||||
|
|
||||||
|
if "access_token" not in result:
|
||||||
|
request.session.flash("ERREUR de connexion au serveur Exchange : %s" % result.get("error"), 'danger')
|
||||||
|
return None
|
||||||
|
|
||||||
|
imap = imaplib.IMAP4('outlook.office365.com')
|
||||||
|
imap.starttls()
|
||||||
# import pdb;pdb.set_trace()
|
# import pdb;pdb.set_trace()
|
||||||
conn = imaplib.IMAP4_SSL('imap.entreprise-dumas.com')
|
|
||||||
try:
|
try:
|
||||||
# se connecter à la mailbox
|
# se connecter à la mailbox
|
||||||
conn.login(mbx_name, mbx_pwd)
|
imap.authenticate("XOAUTH2", lambda x: generate_auth_string(mbx_name, result['access_token']).encode("utf-8"))
|
||||||
except imaplib.IMAP4.error:
|
except imaplib.IMAP4.error:
|
||||||
request.session.flash("ERREUR connexion au compte %s" % mbx_name, 'danger')
|
request.session.flash("ERREUR connexion au compte %s" % mbx_name, 'danger')
|
||||||
return None
|
return None
|
||||||
|
|
||||||
return conn
|
# returne la connection
|
||||||
|
return imap
|
||||||
|
|
||||||
@view_config(route_name='home', renderer='../templates/default/home.pt', permission='view')
|
@view_config(route_name='home', renderer='../templates/default/home.pt', permission='view')
|
||||||
def home(request):
|
def home(request):
|
||||||
|
|||||||
@@ -987,13 +987,8 @@ def demandes_dl(request):
|
|||||||
elif 'domus-services.fr' in mbx_search:
|
elif 'domus-services.fr' in mbx_search:
|
||||||
# extraire les infos de la demmande DOMUS
|
# extraire les infos de la demmande DOMUS
|
||||||
dem_info = get_pdf_infos_domus(extracted_file)
|
dem_info = get_pdf_infos_domus(extracted_file)
|
||||||
if societe == 'PE':
|
# toutes les demandes sont pour la société PE
|
||||||
cd_cli = 8991
|
cd_cli = 8991
|
||||||
elif societe == 'ME':
|
|
||||||
cd_cli = 5276
|
|
||||||
else:
|
|
||||||
# VERSANIT
|
|
||||||
cd_cli = 3209
|
|
||||||
|
|
||||||
# extraction OK ? oui, créer une dem_devis et récupèrer son no_id
|
# extraction OK ? oui, créer une dem_devis et récupèrer son no_id
|
||||||
traite = 0
|
traite = 0
|
||||||
|
|||||||
@@ -209,9 +209,9 @@ def batch_test(request):
|
|||||||
"""
|
"""
|
||||||
# données de + 10 ans
|
# données de + 10 ans
|
||||||
until_date = date(TODAY.year - 10, TODAY.month, 1)
|
until_date = date(TODAY.year - 10, TODAY.month, 1)
|
||||||
purge_mensuelle(request, until_date)
|
# purge_mensuelle(request, until_date)
|
||||||
purge_clients(request)
|
purge_clients(request)
|
||||||
delete_orphan_attached_files(request)
|
# delete_orphan_attached_files(request)
|
||||||
|
|
||||||
# update_chantiers_delais(request, date(TODAY.year - 1, TODAY.month, 1))
|
# update_chantiers_delais(request, date(TODAY.year - 1, TODAY.month, 1))
|
||||||
insert_log(request, 'TEST','- Fin -')
|
insert_log(request, 'TEST','- Fin -')
|
||||||
@@ -309,29 +309,30 @@ def update_chantiers_delais(request, date):
|
|||||||
update_chantier_delais(request, societe, item.NO_ID, delai_contact, delai_rdv, delai_devis, delai_facture)
|
update_chantier_delais(request, societe, item.NO_ID, delai_contact, delai_rdv, delai_devis, delai_facture)
|
||||||
|
|
||||||
def purge_clients(request):
|
def purge_clients(request):
|
||||||
|
|
||||||
# lire tous les clients
|
# lire tous les clients
|
||||||
clients = get_all_clients(request)
|
clients = get_all_clients(request)
|
||||||
for client in clients:
|
for client in clients:
|
||||||
dern_operation = None
|
dern_operation = None
|
||||||
# lire la facture la + récente
|
# lire le chantier le + récent
|
||||||
facture = get_last_facture_client(request, client.societe, client.CD_CLI)
|
chantier = get_last_chantier_client(request, client.societe, client.CD_CLI)
|
||||||
if facture:
|
if chantier:
|
||||||
dern_operation = facture.DATE
|
dern_operation = chantier.DATE
|
||||||
else:
|
else:
|
||||||
# lire le réglemnet le + récent
|
# lire le devis le + récent
|
||||||
payment = get_last_payment_client(request, client.societe, client.CD_CLI)
|
devis = get_last_devis_client(request, client.societe, client.CD_CLI)
|
||||||
if payment:
|
if devis:
|
||||||
dern_operation = payment.DATE
|
dern_operation = devis.DATE
|
||||||
else:
|
else:
|
||||||
# lire le devis le + récent
|
# lire le proforma le + récent
|
||||||
devis = get_last_devis_client(request, client.societe, client.CD_CLI)
|
proforma = get_last_proforma_client(request, client.societe, client.CD_CLI)
|
||||||
if devis:
|
if proforma:
|
||||||
dern_operation = devis.DATE
|
dern_operation = proforma.DATE
|
||||||
else:
|
else:
|
||||||
# lire le chantier le + récent
|
# lire la facture la + récente
|
||||||
chantier = get_last_chantier_client(request, client.societe, client.CD_CLI)
|
facture = get_last_facture_client(request, client.societe, client.CD_CLI)
|
||||||
if chantier:
|
if facture:
|
||||||
dern_operation = chantier.DATE
|
dern_operation = facture.DATE
|
||||||
|
|
||||||
# mémoriser dernière opération
|
# mémoriser dernière opération
|
||||||
update_client_dern_operation(request, client.societe, client.CD_CLI, dern_operation)
|
update_client_dern_operation(request, client.societe, client.CD_CLI, dern_operation)
|
||||||
|
|||||||
Reference in New Issue
Block a user