Bonjour,
Je cherche actuellement un moyen d'exporter les contacts enregistrés sur le webmail d'OVH via une offre MXPLAN (OWA). Malheureusement je ne trouve aucune option de ce genre. Pouvez-vous me conseiller à ce sujet ?
Merci.
Bonjour @GuilhemT1
Avez-vous essayé d'installer votre messagerie sur l'application Thunderbird.
Cette application devrait pouvoir récupérer la liste de vos contacts.
Si cela fonctionne il ne vous reste plus qu'à faire un export des contacts au format CSV depuis Thunderbird.
Bonjour,
Cette application devrait pouvoir récupérer la liste de vos contacts
Non ça ne fonctionne pas comme ça…
Malheureusement je ne trouve aucune option de ce genre. Pouvez-vous me conseiller à ce sujet ?
Dans les menus de la partie contact il devrait y avoir une option d'exportation.
Cordialement, janus57
Dans les menus de la partie contact il devrait y avoir une option d'exportation.
Pas chez OVH à ma connaissance.
Il n'y a rien dans cet écran pour le faire
ni dans Options
Bonjour,
Pas chez OVH à ma connaissance.
Il n'y a rien dans cet écran pour le faire
Rien de plus comme option tout à droite ?
Cordialement, janus57
Merci pour vos réponses. Malheureusement non, il n'y a aucune option d'exportation. J'ai aussi regardé du coté des outils de migration d'OVH mais à partir du moment où OVH détecte qu'il s'agit d'une offre MXPLAN, l'export des contacts est grisé.
J'avais réussi à le faire il y a un ou deux ans avec ce script python :
https://github.com/pigeonburger/global-address-list-owa
il n'y a aucune option d'exportation.
C'était déjà signalé il y a des années
2019
https://community.ovhcloud.com/t/41040
2021
https://community.ovhcloud.com/t/22610
J'arrête de chercher.
J'avais réussi à le faire il y a un ou deux ans avec ce script python :
ah mais il s'agit de la GAL, on parle d'un hébergement exchange, alors ?
Il semblerait que ça concerne un MXPlan OWA
Merci pour le script. J'ai essayé mais ca ne fonctionne pas. Il s'agit bien d'un MXPLAN mais pas d'un hébergement exchange par contre.
Effectivement Fritz2cat on dirait bien que c'est impossible. Le passage à Zimbra va le permettre on dirait.
Merci à tous pour vous réponse.
Le script python fonctionnait bien pour moi, avec un MX Plan migré sur OWA.
J'avais du y corriger des petites choses pour l'adapter à l'environnement d'OVH.
Quel message d'erreur tu as ?
Je vais chercher si j'ai toujours mon script corrigé.
J'ai eu cette erreur :
Traceback (most recent call last):
File "/Users/clement/Archeo/Clément /Mac/Desktop/emailextract.py", line 109, in
"Id": AddressListId
^^^^^^^^^^^^^
NameError: name 'AddressListId' is not defined
Le code modifié qui fonctionne avec mon MXPlan (OWA)
```# Extraction of the Global Address List (GAL) on Exchange >=2013 servers via Outlook Web Access (OWA)
# By Pigeonburger, June 2021
# https://github.com/pigeonburger
# module import heehoo
import requests, json, argparse
# argparser hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
parser = argparse.ArgumentParser(description="Extract the Global Address List (GAL) on Exchange 2013 servers via Outlook Web Access (OWA)")
parser.add_argument("-i", "–host", dest="hostname",
help="Hostname for the Exchange Server", metavar="HOSTNAME", type=str, required=True)
parser.add_argument("-u", "–username", dest="username",
help="A username to log in", metavar="USERNAME", type=str, required=True)
parser.add_argument("-p", "–password", dest="password",
help="A password to log in", metavar="PASSWORD", type=str, required=True)
parser.add_argument("-o", "–output-file", dest="output",
help="Specify file to output emails to (default is global_address_list.txt)", metavar="OUTPUT FILE", type=str, default="contacts.txt")
args = parser.parse_args()
url = args.hostname
USERNAME = args.username
PASSWORD = args.password
OUTPUT = args.output
# Start the session
s = requests.Session()
print("Connecting to %s/owa" % url)
# Get OWA landing page
# Add https:// scheme if not already added in the --host arg
try:
s.get(url+"/owa")
URL = url
except requests.exceptions.MissingSchema:
s.get("https://"+url+"/owa")
URL = "https://"+url
# Other URLs we need later
AUTH_URL = URL+"/owa/auth.owa"
PEOPLE_FILTERS_URL = URL + "/owa/service.svc?action=GetPeopleFilters"
FIND_PEOPLE_URL = URL + "/owa/service.svc?action=FindPeople"
# Attempt a login to OWA
login_data={"username":USERNAME, "password":PASSWORD, 'destination': URL, 'flags': '4', 'forcedownlevel': '0'}
r = s.post(AUTH_URL, data=login_data, headers={'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0"})
# The Canary is a unique ID thing provided upon a successful login that's also required in the header for the next few requests to be successful.
# Even upon an incorrect login, OWA still gives a 200 status, so we can also check if the login was successful by seeing if this cookie was set or not.
try:
session_canary = s.cookies['X-OWA-CANARY']
except:
exit("\nInvalid Login Details. Login Failed.")
print("\nLogin Successful!\nCanary key:", session_canary)
# Returns an object containing the IDs of all accessible address lists, so we can specify one in the FindPeople request
r = s.post(PEOPLE_FILTERS_URL, headers={'Content-type': 'application/json', 'X-OWA-CANARY': session_canary, 'Action': 'GetPeopleFilters'}, data={}).json()
# Find the Global Address List id
for i in r:
print("i:", i)
if i['DisplayName'] == "Mes contacts":
AddressListId = i['FolderId']['Id']
print("Global List Address ID:", AddressListId)
break
# Set to None to return all emails in the list (this is the search term for the FindPeople request)
query = None
# Set the max results for the FindPeople request.
max_results = 99999
with open(OUTPUT, 'a+') as outputfile:
outputfile.write(""first_name","last_name","display_name","email"\n")
noMoreContact = False
offset = 0
while not noMoreContact:
# POST data for the FindPeople request
peopledata = {
"__type": "FindPeopleJsonRequest:#Exchange",
"Header": {
"__type": "JsonRequestHeaders:#Exchange",
"RequestServerVersion": "Exchange2013",
"TimeZoneContext": {
"__type": "TimeZoneContext:#Exchange",
"TimeZoneDefinition": {
"__type": "TimeZoneDefinitionType:#Exchange",
"Id": "AUS Eastern Standard Time"
}
}
},
"Body": {
"__type": "FindPeopleRequest:#Exchange",
"IndexedPageItemView": {
"__type": "IndexedPageView:#Exchange",
"BasePoint": "Beginning",
"Offset": offset,
"MaxEntriesReturned": max_results
},
"QueryString": query,
"ParentFolderId": {
"__type": "TargetFolderId:#Exchange",
"BaseFolderId": {
"__type": "FolderId:#Exchange",
"Id": AddressListId
}
},
"PersonaShape": {
"__type": "PersonaResponseShape:#Exchange",
"BaseShape": "Default"
},
"ShouldResolveOneOffEmailAddress": False
}
}
# Make da request.
r = s.post(FIND_PEOPLE_URL, headers={'Content-type': 'application/json', 'X-OWA-CANARY': session_canary, 'Action': 'FindPeople'}, data=json.dumps(peopledata)).json()
# Parse out the emails, print them and append them to a file.
userlist = r['Body']['ResultSet']
for user in userlist:
displayName = user['DisplayName']
if 'GivenName' in user:
givenName = user['GivenName']
else:
givenName = ''
if 'Surname' in user:
surname = user['Surname']
else:
surname = ''
if 'EmailAddresses' in user:
email = user['EmailAddresses'][0]['EmailAddress']
if email.startswith('/o=MyOrganisation/ou=Exchange Administrative Group'):
email = user['EmailAddresses'][0]['OriginalDisplayName']
else:
email = ''
outputfile.write("""+givenName+"","" + surname+"","" + displayName+"","" + email+""\n")
print(displayName+"\t" + email)
noMoreContact = len(userlist) == 0
offset += len(userlist)
print("\nFetched %s contacts" % str(len(userlist)))
print("\nTotal fetched %s contacts" % offset)
print("Contacts written to", OUTPUT)
```
On avance on dirait ! Merci. Je n'ai plus de message d'erreur. Le script se connecte bien, me donne l'ID de la GLA, créé un fichier texte mais ne le rempli pas. Le script ne s'arrête pas cependant.
Super !! Ca fonctionne merci !
Bonjour,
Pour ma part migration mailpro->Exchange :
- mails faits via outil de migration OVH,
- contacts :
- extraction du compte mailpro via script ci-dessus,
- réinjection dans le compte Exchange via Thunderbird + Chouette pour Exchange.
merci encore pour cette aide.


