web-dev-qa-db-fra.com

MS Access envoyer un email (pas à partir d'Outlook ou de l'utilisateur)

Je sais que cette question a été posée à quelques reprises dans différents contextes, mais je n’ai pas trouvé de réponse claire. J'ai mis en place une messagerie électronique pour une application d'accès utilisant Outlook, mais j'aimerais m'éloigner de cela. L'un des objectifs de l'e-mail est d'envoyer à un utilisateur son mot de passe s'il l'a oublié. Ils peuvent sélectionner leur nom d'utilisateur pour l'écran de connexion. S'ils cliquent sur 'Mot de passe oublié', un courrier électronique contenant leurs informations de connexion est envoyé (à l'adresse électronique associée au nom d'utilisateur).

Le problème, c'est que la fonction de messagerie en tant que telle envoie un courrier électronique avec Outlook à partir de la machine de l'utilisateur. Ainsi, les utilisateurs pourraient «oublier le mot de passe» d'autres noms d'utilisateur et afficher leur propre boîte d'envoi Outlook (éléments envoyés) pour afficher les informations sensibles.

Existe-t-il un moyen d'envoyer un courrier électronique comme la fonction mail de php, en envoyant des messages depuis le serveur? Je souhaite que les e-mails soient envoyés à partir de la même adresse e-mail i.e (support@société.com), au lieu de l'adresse Outlook de l'utilisateur après une invite de sécurité. Si ce n'est pas possible, je suis ouvert à toute autre solution de contournement.

J'ajouterai également que l'installation de tout logiciel devant être installé sur la machine de chaque utilisateur potentiel n'est pas réalisable. 

Est-ce possible?

9
Scotch

Windows comprend un objet appelé Collaborative Data Objects ou CDO. Cet objet vous permet d'envoyer des courriers électroniques à l'aide de n'importe quel serveur SMTP, à condition que d'autres conditions préalables soient remplies (pare-feu ouvert, les fournisseurs d'accès ne bloquent pas les ports, le compte est configuré sur le serveur SMTP, le serveur SMTP permet le relais, etc.).

La plupart des exemples que j'ai trouvés utilisent une liaison tardive, ce qui est préférable. Lors de mes tests sur XP, il est apparu que la référence correcte de la bibliothèque, si vous préférez utiliser la liaison anticipée, est "Bibliothèque Microsoft CDO pour Windows 2000".

Il est important de savoir que chaque fois que vous envoyez un courrier électronique, vous devez l'envoyer via (ou hors) un type de serveur de messagerie. Cela signifie que vous devrez vous authentifier auprès de ce serveur de messagerie et que vous devrez généralement envoyer le courrier électronique à l'aide d'une adresse électronique "De" existant sur ce serveur de messagerie.

Voici un code utilisant une liaison tardive:

Const cdoSendUsingPickup = 1
Const cdoSendUsingPort = 2
Const cdoAnonymous = 0
' Use basic (clear-text) authentication.
Const cdoBasic = 1
' Use NTLM authentication
Const cdoNTLM = 2 'NTLM

Public Sub SendEmail()
    Dim imsg As Object
    Dim iconf As Object
    Dim flds As Object
    Dim schema As String

    Set imsg = CreateObject("CDO.Message")
    Set iconf = CreateObject("CDO.Configuration")
    Set flds = iconf.Fields

    ' send one copy with SMTP server (with autentication)
    schema = "http://schemas.Microsoft.com/cdo/configuration/"
    flds.Item(schema & "sendusing") = cdoSendUsingPort
    flds.Item(schema & "smtpserver") = "mail.myserver.com"
    flds.Item(schema & "smtpserverport") = 25
    flds.Item(schema & "smtpauthenticate") = cdoBasic
    flds.Item(schema & "sendusername") = "[email protected]"
    flds.Item(schema & "sendpassword") = "password"
    flds.Item(schema & "smtpusessl") = False
    flds.Update

    With imsg
        .To = "[email protected]"
        .From = "[email protected]"
        .Subject = "Test Send"
        .HTMLBody = "Test"
        '.Sender = "Sender"
        '.Organization = "My Company"
        '.ReplyTo = "[email protected]"
        Set .Configuration = iconf
        .Send
    End With

    Set iconf = Nothing
    Set imsg = Nothing
    Set flds = Nothing
End Sub
12
HK1

Cela fonctionne pour moi dans MS Access 2010/Windows 7

sMailServer = "myISPsmtp" 'Not just any old smtp
sMailFromAddress = "me"
sMailToAddress = "me"

Set ObjMessage = CreateObject("CDO.Message")
sToAddress = sMailToAddress
sSubject = "Subject"
sBody = "MailBody"

ObjMessage.Subject = sSubject
ObjMessage.From = sMailFromAddress
ObjMessage.To = sToAddress
'ObjMessage.cc = sCCAddress
ObjMessage.TextBody = sBody
'ObjMessage.AddAttachment sMailAttachment
ObjMessage.Configuration.Fields.Item("http://schemas.Microsoft.com/cdo/configuration/sendusing") = 2
ObjMessage.Configuration.Fields.Item("http://schemas.Microsoft.com/cdo/configuration/smtpserver") = sMailServer
ObjMessage.Configuration.Fields.Item("http://schemas.Microsoft.com/cdo/configuration/smtpserverport") = 25
ObjMessage.Configuration.Fields.Update
ObjMessage.send

Plus d'infos: http://msdn.Microsoft.com/en-us/library/ms526318(v=exchg.10).aspx

12
Fionnuala

Je ne peux pas ajouter ceci aux commentaires parce que je n'ai pas assez de réputation, alors s'il vous plaît, ne me maudissez pas. 

"On dirait que cette méthode vous permet d'usurper n'importe quoi sur mon serveur. Je viens de remarquer qu'il existe une méthode addAttachment. Est-ce que cela pourrait fonctionner avec juste un chemin relatif pour dire, une feuille Excel?"

Cela fonctionne pour moi (Access 2010, Exchange 2010):

.AddAttachment ("URL ICI")

https://msdn.Microsoft.com/en-us/library/ms526453(v=exchg.10).aspxhttps://msdn.Microsoft.com/en-us/library /ms526983(v=exchg.10).aspx

2
UpTide

Le code VBA MS-Access suivant fonctionne pour smtp.office365.com. Vous n'indiquez pas smtpusessl = true, mais vous ne spécifiez PAS le port, sinon vous obtenez l'erreur 5.7.57.

Sub SMPTTest2()
Set emailObj = CreateObject("CDO.Message")

emailObj.From = "[email protected]"
emailObj.To = "[email protected]"
emailObj.Subject = "Test CDO"
emailObj.TextBody = "Test CDO"
'emailObj.AddAttachment "c:\windows\win.ini"

Set emailConfig = emailObj.Configuration


emailConfig.Fields("http://schemas.Microsoft.com/cdo/configuration/sendusing") = 2
emailConfig.Fields("http://schemas.Microsoft.com/cdo/configuration/smtpauthenticate") = 1
emailConfig.Fields("http://schemas.Microsoft.com/cdo/configuration/smtpserver") = "smtp.office365.com"
'Exclude the following line    
'emailConfig.Fields("http://schemas.Microsoft.com/cdo/configuration/smtpserverport") = 587
emailConfig.Fields("http://schemas.Microsoft.com/cdo/configuration/smtpusessl") = True
emailConfig.Fields("http://schemas.Microsoft.com/cdo/configuration/sendusername") = "[email protected]"
emailConfig.Fields("http://schemas.Microsoft.com/cdo/configuration/sendpassword") = "mypassword"
emailConfig.Fields.Update

emailObj.Send

If Err.Number = 0 Then MsgBox "Done"
End Sub
1
pghcpa

Dans mon entreprise, j'ai utilisé une autre solution. J'ai créé une bibliothèque de classes C # avec des classes/objets COM. Les classes COM peuvent être implémentées dans votre application Access. Vous pouvez ainsi utiliser tous les avantages de C # (Mailing par exemple) et l'utiliser (en l'appelant) dans Access. 

Le seul inconvénient est que vous devez enregistrer votre bibliothèque de classes (DLL) sur tous les ordinateurs qui utilisent votre application d'accès. Je l'ai fait avec un simple script power-Shell qui s'exécute au début de l'application Access. 

Un bon début pour une bibliothèque basée sur COM est ici: https://www.codeproject.com/Articles/7859/Building-COM-Objects-in-C

Si vous souhaitez plus d'informations à ce sujet, je serai toujours ravi de vous aider. 

0
Nicolas