OVH Cloud OVH Cloud

Erreur MAPI

9 réponses
Avatar
PatLabor
Amis du Forum, bonjours

J'envoi des mail avec Access via la méthode MAPI (code ci dessous, copié sur
un des site des MVP qui nous aident, qu'ils en soient remerciés, mais je ne
sais plus à qui)

la fonction SendMail retourne un numero d'erreur (le 2), mais je ne sais pas
à quoi cela correspond

Quelqu'un sait ou trouver les descriptions d'erreurs selon le numero?

Merci pour toute aide.


'Declare Special Types for use with MAPI
Type MAPIMessage
Reserved As Long
Subject As String
NoteText As String
MessageType As String
DateReceived As String
ConversationID As String
Flags As Long
RecipCount As Long
FileCount As Long
End Type

Type MapiRecip
Reserved As Long
RecipClass As Long
Name As String
Address As String
EIDSize As Long
EntryID As String
End Type

Type MapiFile
Reserved As Long
Flags As Long
Position As Long
PathName As String
FileName As String
FileType As String
End Type

Global Dialogue As MAPIMessage

'DLL Functions in MAPI module
Declare Function MAPISendMailOE _
Lib "C:\Program Files\Outlook Express\Msoe.dll" _
Alias "BMAPISendMail" _
(ByVal Session&, _
ByVal UIParam&, _
Message As MAPIMessage, _
Recipient() As MapiRecip, _
File() As MapiFile, _
ByVal Flags&, _
ByVal Reserved&) As Long

Declare Function MAPISendMail _
Lib "MAPI32.DLL" _
Alias "BMAPISendMail" (ByVal Session&, _
ByVal UIParam&, _
Message As MAPIMessage, _
Recipient() As MapiRecip, _
File() As MapiFile, _
ByVal Flags&, _
ByVal Reserved&) As Long

Global Const SUCCESS_SUCCESS = 0
Global Const MAPI_TO = 1
Global Const MAPI_CC = 2
Global Const MAPI_CCO = 3
Global Const MAPI_LOGON_UI = &H1
Global Const MAPI_DIALOG = &H8

' FUNCTION NAME: SendMail
'
' Usage:
' This is the front-end function to the MAPISendMail function. You
' pass a semicolon-delimited list of To and CC recipients, a
' subject, a message, and a delimited list of file attachments.
' This function prepares MapiRecip and MapiFile structures with the
' data parsed from the information provided using the ParseRecord
' sub. Once the structures are prepared, the MAPISendMail function
' is called to send the message.
'
' INPUT PARAMETERS:
' sSubject: The text to appear in the subject line of the message
' sTo: Semicolon-delimited list of names to receive the
' message
' sCC: Semicolon-delimited list of names to be CC'd
' sCCO: Semicolon-delimited list of names to be CCO'd
' sAttach: Semicolon-delimited list of files to attach to
' the message
' RETURN
' SUCCESS_SUCCESS if successful, or a MAPI error if not.
'*************************************************************

Function SendMail(sSubject As String, _
sTo As String, _
sCC As String, _
sCCO As String, _
sAttach As String, _
sMessage As String, _
Optional sImmediateSend As Boolean = True) _
As Long

Dim i, cTo, cCC, cCCO, cAttach ' variables holding counts
Dim MAPI_Message As MAPIMessage

' Count the number of items in each piece of the mail message
cTo = CountWords(sTo, ";")
cCC = CountWords(sCC, ";")
cCCO = CountWords(sCCO, ";")
cAttach = CountWords(sAttach, ";")

' Create arrays to store the semicolon delimited mailing
' .. information after it is parsed
ReDim rTo(0 To cTo) As String
ReDim rCC(0 To cCC) As String
ReDim rCCO(0 To cCCO) As String
ReDim rAttach(0 To cAttach) As String

' Parse the semicolon delimited information into the arrays.
ParseWords rTo(), sTo, ";"
ParseWords rCC(), sCC, ";"
ParseWords rCCO(), sCCO, ";"
ParseWords rAttach(), sAttach, ";"

' Create the MAPI Recip structure to store all the To and CC
' .. information to be passed to the MAPISendMail function
ReDim MAPI_Recip(0 To cTo + cCC + cCCO - 1) As MapiRecip

' Setup the "TO:" recipient structures
For i = 0 To cTo - 1
MAPI_Recip(i).Name = rTo(i)
MAPI_Recip(i).RecipClass = MAPI_TO
Next i

' Setup the "CC:" recipient structures
For i = 0 To cCC - 1
MAPI_Recip(cTo + i).Name = rCC(i)
MAPI_Recip(cTo + i).RecipClass = MAPI_CC
Next i

' Setup the "CCO:" recipient structures
For i = 0 To cCCO - 1
MAPI_Recip(cTo + cCC + i).Name = rCCO(i)
MAPI_Recip(cTo + cCC + i).RecipClass = MAPI_CCO
Next i

' Create the MAPI File structure to store all the file attachment
' .. information to be passed to the MAPISendMail function
ReDim MAPI_File(0 To cAttach) As MapiFile

' Setup the file attachment structures
MAPI_Message.FileCount = cAttach
For i = 0 To cAttach - 1
MAPI_File(i).Position = -1
MAPI_File(i).PathName = rAttach(i)
Next i

' Set the mail message fields
MAPI_Message.Subject = sSubject
MAPI_Message.NoteText = sMessage
MAPI_Message.RecipCount = cTo + cCC + cCCO

' Define Immediate_Sending Option
If sImmediateSend = True Then
Dialogue.Flags = MAPI_LOGON_UI
Else
Dialogue.Flags = MAPI_LOGON_UI + MAPI_DIALOG
End If
'Send the mail message

Select Case GetDefaultMailSoftware()

Case "Outlook Express"
SendMail = MAPISendMailOE(0&, 0&, _
MAPI_Message, _
MAPI_Recip(), _
MAPI_File(), _
Dialogue.Flags, 0)

Case "Microsoft Outlook", "Outlook"
SendMail = MAPISendMail(0&, 0&, _
MAPI_Message, _
MAPI_Recip(), _
MAPI_File(), _
Dialogue.Flags, 0)

Case Else
MsgBox "Votre client de messagerie n'est pas supporté"
End Select




End Function

9 réponses

Avatar
Bonjour

Quel est ton client mail par défaut, version si Outlook, version de windows et version d'Access
?
Sur quel site l'as tu trouvée ? (on dirait un clone de la fonction originelle)
As-tu essayé l'une des bases exemples disponibles sur
http://users.skynet.be/accesshome/ah_outlook_sendmailmapi.htm ?
As tu bien installé les fonctions auxiliaires Getwords et Parewords ?

ça en fait des questions :o)

--
Arnaud
-----------------------------------
http://users.skynet.be/mpfa/
-----------------------------------


"PatLabor" <patrice.poitevin@(à effacer)wanadoo.fr> a écrit dans le message de news:

| Amis du Forum, bonjours
|
| J'envoi des mail avec Access via la méthode MAPI (code ci dessous, copié sur
| un des site des MVP qui nous aident, qu'ils en soient remerciés, mais je ne
| sais plus à qui)
|
| la fonction SendMail retourne un numero d'erreur (le 2), mais je ne sais pas
| à quoi cela correspond
|
| Quelqu'un sait ou trouver les descriptions d'erreurs selon le numero?
|
| Merci pour toute aide.
|
|
| ' FUNCTION NAME: SendMail
Avatar
PatLabor
Bonjours Arnaud,

j'ai trouvé le code (ainsi que ceux des GetWords, ParseWords, CountWords)
sur la base exemple du site que tu mentionne
(A2KSendMailMAPI.zip), sans aucune modification, et le code complet

j'utilise Outlook Express, Access 2000, et Windows 98 et Me

le programme fonctionnne (à priori sans probleme) à la première execution
(valeur sendMail retournée = 0)
mais le passage suivant donne SendMail = 2

Patrice



<Anor> a écrit dans le message de news:

Bonjour

Quel est ton client mail par défaut, version si Outlook, version de
windows et version d'Access

?
Sur quel site l'as tu trouvée ? (on dirait un clone de la fonction
originelle)

As-tu essayé l'une des bases exemples disponibles sur
http://users.skynet.be/accesshome/ah_outlook_sendmailmapi.htm ?
As tu bien installé les fonctions auxiliaires Getwords et Parewords ?

ça en fait des questions :o)

--
Arnaud
-----------------------------------
http://users.skynet.be/mpfa/
-----------------------------------


"PatLabor" <patrice.poitevin@(à effacer)wanadoo.fr> a écrit dans le
message de news:


| Amis du Forum, bonjours
|
| J'envoi des mail avec Access via la méthode MAPI (code ci dessous, copié
sur

| un des site des MVP qui nous aident, qu'ils en soient remerciés, mais je
ne

| sais plus à qui)
|
| la fonction SendMail retourne un numero d'erreur (le 2), mais je ne sais
pas

| à quoi cela correspond
|
| Quelqu'un sait ou trouver les descriptions d'erreurs selon le numero?
|
| Merci pour toute aide.
|
|
| ' FUNCTION NAME: SendMail




Avatar
Salut
Ah je comprends mieux d'où venaient les lignes de commentaires ;-)

Je viens de retester sur WinXP la version 2K (Access2003) et envoyé 5 mails successifs avec OE
remis par défaut et ça passe nickel
(je ne me souvenais pas que ça fonctionnait si bien d'ailleurs ;-))

Puis passé Outlook 2003 par défaut et refait le test et ça marche tout aussi bien (mais avec le
message de sécurité en plus puisque c'est MAPI)

Je ne peux donc que te suggérer d'ouvrir IE, dans le menu outils > options, changer de
messagerie par défaut (si tu peux) puis remettre OE, y'a pas de raison ;-)

Si tu n'as "que" Outlook Express installé sur le PC, tu peux alléger la fonction pour éviter
d'aller chercher des infos dans la base de registre pour ramener l'e-mail par défaut et le
client mail par défaut.

a+
--
Arnaud
-----------------------------------
http://users.skynet.be/mpfa/
-----------------------------------

"PatLabor" <patrice.poitevin@(à effacer)wanadoo.fr> a écrit dans le message de news:

| Bonjours Arnaud,
|
| j'ai trouvé le code (ainsi que ceux des GetWords, ParseWords, CountWords)
| sur la base exemple du site que tu mentionne
| (A2KSendMailMAPI.zip), sans aucune modification, et le code complet
|
| j'utilise Outlook Express, Access 2000, et Windows 98 et Me
|
| le programme fonctionnne (à priori sans probleme) à la première execution
| (valeur sendMail retournée = 0)
| mais le passage suivant donne SendMail = 2
|
| Patrice
|
|
|
| <Anor> a écrit dans le message de news:
|
| > Bonjour
| >
| > Quel est ton client mail par défaut, version si Outlook, version de
| windows et version d'Access
| > ?
| > Sur quel site l'as tu trouvée ? (on dirait un clone de la fonction
| originelle)
| > As-tu essayé l'une des bases exemples disponibles sur
| > http://users.skynet.be/accesshome/ah_outlook_sendmailmapi.htm ?
| > As tu bien installé les fonctions auxiliaires Getwords et Parewords ?
| >
| > ça en fait des questions :o)
| >
| > --
| > Arnaud
| > -----------------------------------
| > http://users.skynet.be/mpfa/
| > -----------------------------------
| >
| >
| > "PatLabor" <patrice.poitevin@(à effacer)wanadoo.fr> a écrit dans le
| message de news:
| >
| > | Amis du Forum, bonjours
| > |
| > | J'envoi des mail avec Access via la méthode MAPI (code ci dessous, copié
| sur
| > | un des site des MVP qui nous aident, qu'ils en soient remerciés, mais je
| ne
| > | sais plus à qui)
| > |
| > | la fonction SendMail retourne un numero d'erreur (le 2), mais je ne sais
| pas
| > | à quoi cela correspond
| > |
| > | Quelqu'un sait ou trouver les descriptions d'erreurs selon le numero?
| > |
| > | Merci pour toute aide.
| > |
| > |
| > | ' FUNCTION NAME: SendMail
| >
| >
|
|
Avatar
PatLabor
Petit complement d'info

SendMail fonctionne bien

l'envoi avec un PDF existant OK

Mais dans une procedure, je créé à partir d'un état un doc PDF qui sera
joint au mail que j'envoi

l'état est imprimé sur PDFCreator selon les procédure copiées en bas et
tirées du fil que tu m'a donné Arnaud

Bonjour

Peut-être existe-t-il de nouveux logiciels gratuits, mais regarde
attentivement ce fil :

http://groups.google.fr/group/microsoft.public.fr.access/browse_frm/thread/
f6cb2dba528f7a32/fddf18ce5f41facf?hl=fr#fddf18ce5f41facf


à+
--
Arnaud



j'utilise une boucle pour vérifier existence du doc en cours de création

Do Until fFileExist(PDFFilePath & "" & PDFFileName)
DoEvents
Loop


Je pense que l'erreur de SendMail est liée à cette création PDF, mais en
quoi ??
Surtout que j'utilise tjs le même mail pour tester le programme !





Public Sub PDFCreatorSetUp(valeur As Integer, strPDFPath As String,
strPDFName As String)

' #########################################################
' Procédure tirée d'Internet, et enregistrée dans HelpPDF
' #########################################################

Dim Wsh, WshSystem, fso, fileTxt, Rep
Dim MesDocuments, Wchemin As String
Dim Wlignes()
Dim ix1 As Integer
Const ForReading = 1, ForWriting = 2, ForAppending = 8


If Not IsNumeric(valeur) Or (valeur <> 0 And valeur <> 1) Then Exit Sub


Set fso = CreateObject("Scripting.FileSystemObject")

Wchemin = "C:WindowsApplication DataPDFCreatorPDFCreator.ini"

If Not (fso.FileExists(Wchemin)) Then
Set fso = Nothing
MsgBox "Le chemin de l'application PDFCreator n'est pas le bon" &
vbCrLf & vbCrLf & "Chemin recherché : " & Wchemin
Exit Sub
End If

' -------------------------modifier les lignes
concernées--------------------­------


ix1 = 0
ReDim Wlignes(1000)


Set fileTxt = fso.OpenTextFile(Wchemin, ForReading, False)
Do While fileTxt.AtEndOfStream <> True
Wlignes(ix1) = fileTxt.ReadLine
If Left(Wlignes(ix1), 12) = "UseAutosave=" Then
Wlignes(ix1) = "UseAutosave=" & valeur
End If
If Left(Wlignes(ix1), 21) = "UseAutosaveDirectory=" Then
Wlignes(ix1) = "UseAutosaveDirectory=" & valeur
End If
If Left(Wlignes(ix1), 18) = "AutosaveDirectory=" Then
Wlignes(ix1) = "AutosaveDirectory=" & strPDFPath
End If
If Left(Wlignes(ix1), 17) = "AutosaveFilename=" Then
Wlignes(ix1) = "AutosaveFilename=" & strPDFName
End If
ix1 = ix1 + 1
Loop
fileTxt.Close


ReDim Preserve Wlignes(ix1 - 1)
Set fileTxt = Nothing


Set fileTxt = fso.GetFile(Wchemin)
fso.DeleteFile (fileTxt)
Set fileTxt = Nothing


Set fileTxt = fso.OpenTextFile(Wchemin, ForWriting, True)
For ix1 = 0 To UBound(Wlignes, 1)
fileTxt.WriteLine (Wlignes(ix1))
Next
fileTxt.Close


Set fileTxt = Nothing
Set fso = Nothing


End Sub



Public Function subCreatePDFFromReport(ByVal ReportName As String, ByVal
PDFFilePath As String, PDFFileName As String, strWhere As String) As Boolean

Dim rpt1 As Report, rpt2 As Report
Dim rptPrinter As String

' Création du PDF:

rptPrinter = "rp_ImprimantePDF"
DoCmd.OpenReport ReportName, acViewDesign
DoCmd.OpenReport rptPrinter, acViewDesign
Set rpt1 = Reports(ReportName)
Set rpt2 = Reports(rptPrinter)
rpt1.PrtDevNames = rpt2.PrtDevNames
DoCmd.Close acReport, rptPrinter, acSaveNo

PDFCreatorSetUp 1, PDFFilePath, PDFFileName

On Error Resume Next

DoCmd.OpenReport ReportName, acViewNormal, , strWhere
DoCmd.Close acReport, ReportName, acSaveNo

If Err.Number > 0 Then
If Err.Number <> 2501 Then 'autre que Action open Report annulée
MsgBox "une piece jointe rencontre l'erreur suivante et va donc être
supprimée : " & vbCrLf & Err.Description, , "Erreur n°" & Err.Number & "
lors de la creation d'un PDF avec l'état " & ReportName
End If
' Effacer cette ligne des PJ
MsgBox "ANNULATION PJ"
subCreatePDFFromReport = False
Exit Function
End If
On Error GoTo 0

Do Until fFileExist(PDFFilePath & "" & PDFFileName)
DoEvents
Loop


subCreatePDFFromReport = True

End Function

Avatar
re

"PatLabor" <patrice.poitevin@(à effacer)wanadoo.fr> a écrit dans le message de news:
%
| Petit complement d'info
|
| SendMail fonctionne bien
|
| l'envoi avec un PDF existant OK
|
| Mais dans une procedure, je créé à partir d'un état un doc PDF qui sera
| joint au mail que j'envoi
|
| l'état est imprimé sur PDFCreator selon les procédure copiées en bas et
| tirées du fil que tu m'a donné Arnaud
|
| j'utilise une boucle pour vérifier existence du doc en cours de création
|
| Do Until fFileExist(PDFFilePath & "" & PDFFileName)
| DoEvents
| Loop
|
| Je pense que l'erreur de SendMail est liée à cette création PDF, mais en
| quoi ??
| Surtout que j'utilise tjs le même mail pour tester le programme !
|

hum...tu génères un nouveau pdf avant chaque envoi ?

Si oui, je suppute que le fichier existe mais n'est pas encore totalement libéré (encore en
cours d'écriture lorsque tu le rajoutes au programme).

La première exécution de sendmail étant plus longue que la seconde (création des objets, etc),
ça explique peut-être pourquoi ça fonctionne une fois et pas deux.

Une seule solution, débogger pas à pas afin de voir si c'est un problème de délais et si
systématique au 2ème envoi

à+
--
Arnaud
-----------------------------------
http://users.skynet.be/mpfa/
-----------------------------------
Avatar
PatLabor
Bonne pioche !


hum...tu génères un nouveau pdf avant chaque envoi ?


Oui, mais une seule fois même s'il y a plusieurs destinataires (à chaque
destinataire est créé un nouveau mail)




Si oui, je suppute que le fichier existe mais n'est pas encore totalement
libéré (encore en

cours d'écriture lorsque tu le rajoutes au programme).

La première exécution de sendmail étant plus longue que la seconde
(création des objets, etc),

ça explique peut-être pourquoi ça fonctionne une fois et pas deux.

Une seule solution, débogger pas à pas afin de voir si c'est un problème
de délais et si

systématique au 2ème envoi




En rajoutant une boucle sur 30000 millisecondes après la boucle de
vérification d'existence du fichier, ca marche

il faut au total 4 minutes pour exporter un état en PDF, quand même

Merci Arnaud.
et bon week end

Avatar
Resalut

"PatLabor"
|
| En rajoutant une boucle sur 30000 millisecondes après la boucle de
| vérification d'existence du fichier, ca marche
|
| il faut au total 4 minutes pour exporter un état en PDF, quand même
|
| Merci Arnaud.
| et bon week end
|

Juste une idée pour finir : tu peux peut-être aussi boucler toutes les x secondes sur la taille
du fichier lorsqu'il existe, et si la taille n'a pas changé entre 2 itérations, tu considères
qu'il est libéré.

ça fait moins aléatoire comme tempo :-)

A+

--
Arnaud
-----------------------------------
http://users.skynet.be/mpfa/
-----------------------------------
Avatar
PatLabor
Bien l'bonjour Arnaud (et tout le monde)

Juste une idée pour finir : tu peux peut-être aussi boucler toutes les x
secondes sur la taille

du fichier lorsqu'il existe, et si la taille n'a pas changé entre 2
itérations, tu considères

qu'il est libéré.

ça fait moins aléatoire comme tempo :-)


Et cela a l'avantage de s'adapter à toute taille de doc créé

Ca marche impec

Merci

Avatar
Salut

Alors là je ne m'attendais pas à ce que ça fonctionne : c'était une simple intuition car jamais
mis en oeuvre :o))

à+
Arnaud

"PatLabor" <patrice.poitevin@(à effacer)wanadoo.fr> a écrit dans le message de news:
%
| Bien l'bonjour Arnaud (et tout le monde)
|
| > Juste une idée pour finir : tu peux peut-être aussi boucler toutes les x
| secondes sur la taille
| > du fichier lorsqu'il existe, et si la taille n'a pas changé entre 2
| itérations, tu considères
| > qu'il est libéré.
| >
| > ça fait moins aléatoire comme tempo :-)
|
| Et cela a l'avantage de s'adapter à toute taille de doc créé
|
| Ca marche impec
|
| Merci
|
|