2012-07-20 57 views
9

Sé que esta pregunta se ha hecho varias veces en varios contextos, pero no he encontrado una respuesta clara. He implementado un correo electrónico para una aplicación de acceso que usa Outlook, pero me gustaría alejarme de esto. Uno de los propósitos del correo electrónico es enviar por correo electrónico a un usuario su contraseña si la olvidó. Pueden seleccionar su nombre de usuario para la pantalla de inicio de sesión, y si hacen clic en "contraseña olvidada" y se envía un correo electrónico que contiene su información de inicio de sesión (a la dirección de correo electrónico asociada con el nombre de usuario).MS Access envía un correo electrónico (no desde Outlook o el correo electrónico del usuario)

El problema con esto es que la función de correo electrónico como es envía un correo electrónico con Outlook desde la máquina del usuario. Por lo tanto, los usuarios podrían 'olvidar la contraseña' de otros nombres de usuario y ver su propia salida outbox (elementos enviados) para ver la información confidencial.

¿Hay alguna manera de enviar correos electrónicos como la función de correo de php, enviando correos desde el servidor? Me gustaría que los correos electrónicos se envíen desde la misma dirección de correo electrónico (por ejemplo, [email protected]), en lugar de desde la dirección de Outlook del usuario después de un aviso de seguridad. Si esto no es posible, estoy abierto a la idea de cualquier otra solución alternativa.

También agregaré que la instalación de cualquier software que tenga que instalarse en la máquina de cada usuario potencial no es factible.

¿Esto es posible?

+1

El acceso realmente no puede hacer lo que quiera. Es una base de datos de escritorio. –

+0

Estoy abierto a la idea de soluciones alternativas: la idea de una solución alternativa podría ser: enviar solamente el correo electrónico 'forgot password' si el correo electrónico de Outlook para el usuario ('from') coincide con el nombre de usuario en la base de datos (a). – Scotch

+1

No estoy realmente familiarizado con el código de acceso, pero si hay alguna función que envíe correo a un servicio SMTP, entonces debería poder utilizar cualquier servicio SMTP que desee en lugar del Outlook local del usuario. – David

Respuesta

10

Windows incluye un objeto de datos de colaboración denominado objetos o CDO. Este objeto le permite enviar correos electrónicos usando cualquier servidor SMTP asumiendo que se cumplan otros requisitos previos (firewall abierto, ISP no bloquea los puertos, la cuenta está configurada en el servidor SMTP, el servidor SMTP permite la retransmisión, etc.).

La mayoría de los ejemplos que he encontrado utilizan el enlace tardío, que es el preferido. En mi prueba en XP, parece que la referencia correcta de la biblioteca, si prefiere usar el enlace anticipado, es "Microsoft CDO para Windows 2000 Library".

Es importante saber que cada vez que envíe un correo electrónico deberá enviarlo a través de (o fuera de) algún tipo de servidor de correo electrónico. Esto significa que tendrá que autenticarse con ese servidor de correo electrónico y también significa que debe enviar el correo electrónico utilizando una dirección de correo electrónico "De" que existe en ese mismo servidor de correo electrónico.

Aquí hay un código que utiliza el enlace:

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 
+0

* "De" dirección de correo electrónico que existe en ese mismo servidor de correo electrónico * - esto no funciona para mí en mi localidad, y por mi lectura entiendo que debe usar el servidor proporcionado por su ISP. Esto es para evitar spam. – Fionnuala

+0

Eso solo depende de su ISP. Algunos solo permiten que el puerto 25 se use para hablar con su propio servidor SMTP y algunos no tienen esta limitación. Algunos de sus grandes proveedores de cable lo hacen, pero muchos de sus ISP más pequeños no lo hacen. tienen esta limitación. Por ejemplo, ni Windstream ni CenturyLink tienen esta limitación. También puede evitar esto utilizando un puerto alternativo (suponiendo que su servidor SMTP expone un puerto alternativo) ya que la mayoría de los ISP solo imponen esta limitación en el puerto 25. Como ejemplo de esto, probablemente pueda usar GMail como su servidor SMTP - GMail usa 587 o 465 con SSL. – HK1

+0

También estoy trabajando en un mismo tipo de requisito y me di cuenta de que el código anterior le permite enviar correos electrónicos desde un y dirección de correo electrónico (es decir cualquier correo electrónico incorrecto [email protected]) y sin especificar la contraseña correcta. Es solo que debe ingresar la dirección correcta del servidor (es decir, mail.myserver.com) – braceyourself

12

Esto funciona para mí en 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 

Más información: http://msdn.microsoft.com/en-us/library/ms526318(v=exchg.10).aspx

+0

Entonces, ¿solo estaría configurando sMailServer en el servidor de correo electrónico de mi oficina? y mailFromAddress para ser la cuenta ficticia que creo? ('[email protected]') y sMailTo para ser la dirección de correo electrónico de un usuario de la base de datos? – Scotch

+1

+1 Soy demasiado lento^_^pero este es un buen método. Me centraré en una de mis preocupaciones en su lugar. No debe almacenar contraseñas no cifradas en su base de datos, y definitivamente no debe enviar esa información por correo electrónico (incluso si es la persona correcta). En su lugar, necesita encriptar sus contraseñas y también ofrecerle al usuario la posibilidad de restablecer su contraseña en lugar de simplemente enviarla. –

+0

No estoy seguro de qué servidor de correo funcionará para usted, tuve que usar el servidor proporcionado por mi ISP, aparentemente esta es una medida de seguridad para detener el correo no deseado. – Fionnuala

2

No puedo añadir esto a los comentarios porque no tengo la reputación suficiente, así que por favor no me hacha.

"Parece que este método permite SPOOF de nada en mi servidor. Acabo de dar cuenta de que hay un método addAttachment. Podría que el trabajo con sólo una ruta relativa decir, una hoja de Excel?"

Funciona para mí (Access 2010, Exchange 2010):

.AddAttachment ("URL aquí")

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

1

El siguiente código de trabajo MS-Access VBA s para smtp.office365.com.Indique smtpusessl = verdadero, pero NO especifique el puerto; de lo contrario, obtendrá el error 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 
0

En mi empresa usé otra solución. Creé una biblioteca de clases C# con clases/objetos COM. Las clases COM se pueden implementar en su aplicación de Access y de esta manera puede usar todas las ventajas de C# (Mailing por ejemplo) y aún así usarlo (llamarlo) en Access.

La única desventaja es que debe registrar su Biblioteca de clases (DLL) en todas las computadoras que usan su aplicación de acceso. Lo he hecho con un simple script de power-shell que se ejecuta al inicio de la aplicación Access.

Un buen punto de partida para una biblioteca basada en COM está aquí: https://www.codeproject.com/Articles/7859/Building-COM-Objects-in-C

Si desea algo más de información al respecto a continuación, siempre estoy feliz de ayudarle.

Cuestiones relacionadas