Mandar email desde Access

Tengo un cuadro de texto que tiene asociado direcciones de email de una tabla.
Lo que quiero hacer es que cuando pique sobre la dirección se abra el outlook para poder enviar el email.
He puesto la casilla como hipervínculo, peor cada vez que le doy me da error, porque la intenta abrir como una página web.
Haber si alguien me puede echar una mano.
[email protected]

1 respuesta

Respuesta
1
Si el control se llama, por ejemplo, txtEMail, escribe en el evento DobleClick el siguiente código:
'-----
Dim olApp As Outlook.Application
Dim olNS As Outlook.NameSpace
Dim olMsg As Outlook.MailItem
Set olApp = New Outlook.Application
Set olNS = olApp.GetNamespace("MAPI")
Set olMsg = olApp.CreateItem(olMailItem)
olMsg.Recipients.Add me.txtEMail
olMsg.Recipients(olMsg.Recipients.Count).Type = olTo
olMsg.Display
Set olMsg = Nothing
Set olNS = Nothing
Set olApp = Nothing
'-------------
Una vez escrito el código, tendrás que ir al menú "Herramientas" -> "Referencias" y acivar "Microsoft Outlook" de la versión que tengas instalada."
Aviso que, debido a los parches de seguridad, te saldrá una ventana preguntaándote si das permiso al programa que está invocando al correo a que siga adelante. Tendrás que contestar que sí.
Ante todo, gracias por contestarme.
He puesto el código que me has dado en doble click y también en click normal, después me fui a "herramientas" y no encuentro el menu "referencias", yo tengo el access 2000 y no se donde estará.
Por cierto que opciones de del cuadro tengo que tener cambiadas para que lo entienda como un hipervínculo, digo esto por que en la vista de diseño de la tabla donde esta email, lo puse como hipervínculo y en el formulario también.
Saludos cordiales
Es en el Menu Herramientas de la Ventana de Visual Basic en la que has escrito el código.
Perdona pero se me olvidó contestar a la segunda parte de tu réplica.
Si el Campo lo has definido como hipervíncilo en la tabla, no necesitas nada de lo anterior.
Lo que tienes que hacer es que el valor que escribas en el campo sea "mailto:xxxxxxxx" donde xxxxxxx es la dirección de correo. Por ejemplo:
mailto:[email protected]
De esta forma, sin necesidad de escribir código ni activar ninguna referencia, la pantalla de access lanzará el cliente de correo que tengas por defecto.
En lo de referencias no encuentro lo del Microsoft Outlook y eso que e ido uno por uno.
Respecto a la otra manera, ya la había probado, pero no queda nada bien el "mailto:" delante de la dirección, si se pudiese sumar esta parte antes de la dirección cuando se le diese al botón...
Que se te ocurre.
Gracias, un saludo
Si estás usando Office 2000, deberías tener instalado Outlook 2000. En tal caso, la línea de la ventana de referencias tiene escrito "Microsoft Outlook 9.0 Object Library".
Si dicha línea no existe, lo que ocurre es que la librería de Outlook no está registrada. Para que aparezca, tendrás que dar al botón "Browse" de dicha pantalla de Referencias (en castellano creo que se llama "Buscar") y buscas el Archivo "C:Archivos de ProgramaMicrosoft OfficeOfficemsoutl9.olb"
En cuando a lo del "mailto:" obligatorio en el hyperlink, ello es debido a que el comando por defecto para un hyperlink es "http:". Si no le dices que es el otro comando, el sistema tratará de abrirte la página web que le indicas en el texto.
Te recomiendo que cambies el tipo de campo de Hypervínculo a texto. Si no lo haces, puede que el salto a Outlook no funcione.
Hola
Tengo el Outlook Express instalado y no encuentro el que necesito, espero que con este funcione.
Se que mailto: es necesario, pero no habría alguna manera de sumarlo al valor de la casilla cuando le haces click.
Saludos
Te enviado un mensaje a la cuenta de correo que citas para que tengas la mía.
Todo llega.
Te envío un módulo que he compuesto que contiene las definiciones para acceder al MAPI32.DLL y una función que permite que envíes un mensaje a la dirección que escribas en un campo de texto.
Ojo: el campo ligado a dicho control NO PUEDE SER UN HIPERVÍNCULO, ya que si lo es, al hacer click te saltará internet explorer.
Mi consejo es que una vez grabado el módulo en la Base de Datos, en el evento dobleclick del control que tiene el Email llames a esta función con una sintaxis tal como
Call SendMail(Me.NombredelControlQueTieneLaDirección).
Yo lo he probado ahora mismo y me ha funcionado perfectamente.
Bueno, basta de introducciones. Ahí va el Ebro ...
Option Compare DataBase
Option Explicit
Public Const MAPI_AB_NOMODIFY = &H400
Public Const MAPI_BCC = 3
Public Const MAPI_BODY_AS_FILE = &H200
Public Const MAPI_CC = 2
Public Const MAPI_DIALOG = &H8
Public Const MAPI_E_AMBIG_RECIP = MAPI_E_AMBIGUOUS_RECIPIENT
Public Const MAPI_E_AMBIGUOUS_RECIPIENT = 21
Public Const MAPI_E_ATTACHMENT_NOT_FOUND = 11
Public Const MAPI_E_ATTACHMENT_OPEN_FAILURE = 12
Public Const MAPI_E_ATTACHMENT_WRITE_FAILURE = 13
Public Const MAPI_E_BAD_RECIPTYPE = 15
Public Const MAPI_E_BLK_TOO_SMALL = 6
Public Const MAPI_E_DISK_FULL = 4
Public Const MAPI_E_FAILURE = 2
Public Const MAPI_E_INSUFFICIENT_MEMORY = 5
Public Const MAPI_E_INVALID_EDITFIELDS = 24
Public Const MAPI_E_INVALID_MESSAGE = 17
Public Const MAPI_E_INVALID_RECIPS = 25
Public Const MAPI_E_INVALID_SESSION = 19
Public Const MAPI_E_LOGIN_FAILURE = 3
Public Const MAPI_E_LOGON_FAILURE = MAPI_E_LOGIN_FAILURE
Public Const MAPI_E_MESSAGE_IN_USE = 22
Public Const MAPI_E_NETWORK_FAILURE = 23
Public Const MAPI_E_NO_MESSAGES = 16
Public Const MAPI_E_NOT_SUPPORTED = 26
Public Const MAPI_E_TEXT_TOO_LARGE = 18
Public Const MAPI_E_TOO_MANY_FILES = 9
Public Const MAPI_E_TOO_MANY_RECIPIENTS = 10
Public Const MAPI_E_TOO_MANY_SESSIONS = 8
Public Const MAPI_E_TYPE_NOT_SUPPORTED = 20
Public Const MAPI_E_UNKNOWN_RECIPIENT = 14
Public Const MAPI_E_USER_ABORT = MAPI_USER_ABORT
Public Const MAPI_ENVELOPE_ONLY = &H40
Public Const MAPI_FORCE_DOWNLOAD = &H1000
Public Const MAPI_GUARANTEE_FIFO = &H100
Public Const MAPI_LOGOFF_SHARED = &H1
Public Const MAPI_LOGOFF_UI = &H2
Public Const MAPI_LOGON_UI = &H1
Public Const MAPI_NEW_SESSION = &H2
Public Const MAPI_OLE = &H1
Public Const MAPI_OLE_STATIC = &H2
Public Const MAPI_ORIG = 0
Public Const MAPI_PEEK = &H80
Public Const MAPI_RECEIPT_REQUESTED = &H2
Public Const MAPI_SENT = &H4
Public Const MAPI_SUPPRESS_ATTACH = &H800
Public Const MAPI_TO = 1
Public Const MAPI_UNREAD = &H1
Public Const MAPI_UNREAD_ONLY = &H20
Public Const MAPI_USER_ABORT = 1
Public Const SUCCESS_SUCCESS = 0
Public Type MapiFile
Reserved As Long
Flags As Long
Position As Long
PathName As String
FileName As String
FileType As String
End Type
Public 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
Public Type MapiRecip
Reserved As Long
RecipClass As Long
Name As String
Address As String
EIDSize As Long
EntryID As String
End Type
Public Declare Function BMAPIAddress Lib "MAPI32.DLL" (lInfo&, ByVal Session&, ByVal UIParam&, Caption$, ByVal nEditFields&, Label$, nRecipients&, Recip() As MapiRecip, ByVal Flags&, ByVal Reserved&) As Long
Public Declare Function BMAPIGetAddress Lib "MAPI32.DLL" (ByVal lInfo&, ByVal nRecipients&, Recipients() As MapiRecip) As Long
Public Declare Function BMAPIGetReadMail Lib "MAPI32.DLL" (ByVal lMsg&, Message As MAPIMessage, Recip() As MapiRecip, File() As MapiFile, Originator As MapiRecip) As Long
Public Declare Function BMAPIReadMail Lib "MAPI32.DLL" (lMsg&, nRecipients&, nFiles&, ByVal Session&, ByVal UIParam&, MessageID$, ByVal Flag&, ByVal Reserved&) As Long
Public Declare Function MAPIDeleteMail Lib "MAPI32.DLL" (ByVal Session&, ByVal UIParam&, ByVal MsgID$, ByVal Flags&, ByVal Reserved&) As Long
Public Declare Function MAPIDetails Lib "MAPI32.DLL" Alias "BMAPIDetails" (ByVal Session&, ByVal UIParam&, Recipient As MapiRecip, ByVal Flags&, ByVal Reserved&) As Long
Public Declare Function MAPIFindNext Lib "MAPI32.DLL" Alias "BMAPIFindNext" (ByVal Session&, ByVal UIParam&, MsgType$, SeedMsgID$, ByVal Flag&, ByVal Reserved&, MsgID$) As Long
Public Declare Function MAPILogoff Lib "MAPI32.DLL" (ByVal Session&, ByVal UIParam&, ByVal Flags&, ByVal Reserved&) As Long
Public Declare Function MAPILogon Lib "MAPI32.DLL" (ByVal UIParam&, ByVal User$, ByVal Password$, ByVal Flags&, ByVal Reserved&, Session&) As Long
Public Declare Function MAPIResolveName Lib "MAPI32.DLL" Alias "BMAPIResolveName" (ByVal Session&, ByVal UIParam&, ByVal UserName$, ByVal Flags&, ByVal Reserved&, Recipient As MapiRecip) As Long
Public Declare Function MAPISaveMail Lib "MAPI32.DLL" Alias "BMAPISaveMail" (ByVal Session&, ByVal UIParam&, Message As MAPIMessage, Recipient() As MapiRecip, File() As MapiFile, ByVal Flags&, ByVal Reserved&, MsgID$) As Long
Public Declare Function MAPISendDocuments Lib "MAPI32.DLL" (ByVal UIParam&, ByVal DelimStr$, ByVal FilePaths$, ByVal FileNames$, ByVal Reserved&) As Long
Public 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
Public Function SendMail(CampoEmail As Control) As Long
Dim sDireccion As String ' Para leer la Dirección en el Control.
Dim oMAPIMsg As MAPIMessage ' Objeto Mensaje
ReDim tbRecip(0 To 0) As MapiRecip ' Tabla de Destinatarios.
ReDim tbAnexos(0 To 0) As MapiFile ' Tabla de Archivos Anexos.
Dim lMailSession As Long
Dim lReturnCode As Long
' Compruebo que el campo no está vacío
'-------------------------------------
If IsNull(CampoEmail) Then
MsgBox "No hay Destinatario." + vbCrLf + "No se enlazará con el Correo.", vbApplicationModal + vbExclamation + vbOKOnly, "Send Mail"
Exit Function
End If
sDireccion = Trim$(CStr(CampoEmail))
If sDireccion = "" Then
MsgBox "No hay Destinatario." + vbCrLf + "No se enlazará con el Correo.", vbApplicationModal + vbExclamation + vbOKOnly, "Send Mail"
Exit Function
End If
' Genero la tabla de Direcciones.
'--------------------------------
tbRecip(0).Reserved = 0&
tbRecip(0).RecipClass = MAPI_TO
tbRecip(0).Name = sDireccion
tbRecip(0).EIDSize = 0&
tbRecip(0).EntryID = ""
' Genero el cuerpo del Mensaje.
'------------------------------
oMAPIMsg.Subject = ""
oMAPIMsg.MessageType = ""
oMAPIMsg.RecipCount = 1
oMAPIMsg.FileCount = 0
' Conecto con el sistema de Correo
' y compruebo el código de Retorno.
' MAPI_LOGON_UI obliga a que si no
' está arrancado el correo,
' aparezca la pantalla de LogOn.
'----------------------------------
lReturnCode = MAPILogon(0&, "", "", MAPI_LOGON_UI, 0&, lMailSession)
If lReturnCode = SUCCESS_SUCCESS Then
' Si he conectado, hago el envío.
' MAPI_DIALOG fuerza a que aparezca
' El interface del sistema de correo
' Instalado.
'--------------------------------
lReturnCode = MAPISendMail(0&, 0&, oMAPIMsg, tbRecip, tbAnexos, MAPI_DIALOG, 0&)
If lReturnCode <> SUCCESS_SUCCESS Then
If lReturnCode = MAPI_E_USER_ABORT Then
MsgBox "Envío Cancelado por el usuario", vbApplicationModal + vbInformation + vbOKOnly, "SendMail"
Else
MsgBox "Código de Error: " & lReturnCode, vbApplicationModal + vbInformation + vbOKOnly, "SendMail"
End If
End If
Else
If lReturnCode = MAPI_E_USER_ABORT Then
MsgBox "Envío Cancelado por el usuario", vbApplicationModal + vbInformation + vbOKOnly, "SendMail"
Else
MsgBox "Código de Error: " & lReturnCode, vbApplicationModal + vbInformation + vbOKOnly, "SendMail"
End If
End If
' Hago logoff de la sesión de Correo.
' Aquí ya no me importa el retorno.
'------------------------------------
lReturnCode = MAPILogoff(lMailSession, 0&, 0&, 0&)
End Function
Si tienes cuenta de hotmail agrégame a tu messenger y hablamos o mandame un mail a [email protected]
En primer lugar, perdón por el retraso. Estoy viviendo lo que los chinos llaman "un periodo interesante" y no he tenido tiempo de conectarme a ver vuestras respuestas.
Vamos al grano.
MO Outlook es parte de MSOffice (hasta donde yo sé. Si no lo tienes instalado, por favor revisa tu instalación de Office e instálatelo. He estado mirando en la web de microsoft y, si no es usando lo que yo te dije, la única solución es tirar de la librería MAPIXX.DLL lo cual te permite mandar mensajes pero no te saca el interface.
Si el programa estuviese en VB en lugar de MS Access, la cosa hubiese cambiado ya que los OCX de correo te enlazan con el cliente (Outlook / Outlook Express) que tengas instalado.
Si no puedes instalar MS Outlook, dímelo y podemos hacer una rutina para enviar correos.
Si, por otra parte, puedes conseguir los controles OCX de Visual Basic (de forma legal, of course), podemos ver cómo enlazar con ellos desde Ms access.
Lo siento. Se han perdido las indentaciones al cortarlo y pegarlo aquí.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas