2012-04-28 49 views
9

Este es el seguimiento de varios mensajes sobre el uso de VBA para enviar correos electrónicos.Seguimiento sobre el uso de VBA para enviar correos electrónicos

La mayoría de las sugerencias utilizan Outlook, CDO o MAPI:

Set appOL = CreateObject("Outlook.Application") 

Set msgOne = CreateObject("CDO.Message") 

Set mapi_session = New MSMAPI.MAPISession 

Pero, al parecer de Outlook me va a requerir para cambiar nuestros parámetros de seguridad de grupo de trabajo, y CDO y MAPI me va a requerir añadir un archivo DLL o algo así.

Estoy tratando de usar Excel para organizar las asignaciones de grupo en el trabajo y no puedo modificar las computadoras de otras personas de ninguna manera.

¿Hay una manera más simple de enviar correos electrónicos desde una macro de Excel?
Todo lo que necesito es un bloque de texto en el cuerpo del mensaje sin archivos adjuntos.

He estado arando a través de Google, MSDN & StackOverflow toda la semana y estoy atrapado en un bote lento a la nada.

Respuesta

5

Probablemente pueda utilizar el comando Shell.

Shell("mailto:[email protected]") 

Si Outlook es su programa de correo electrónico predeterminado, creo que las ventanas interpretarán correctamente (lo hace desde las ventanas de diálogo Ejecutar, pero no estoy seguro si desde VBA). Pruébalo. No estoy frente a Excel en este momento.

Revise los parámetros de "mailto" para ver cómo puede agregar el asunto y el cuerpo a esa cadena.

CORRECCIÓN: Eso solo generará el correo electrónico, pero no lo enviará. Ignora mi respuesta.

+0

'No tengo en cuenta mi respuesta. + 1 :-) Estabas en el camino correcto. –

+0

@SiddharthRout, hemos estado viendo a muchos de ustedes en estas preguntas de Excel últimamente Siddarth. ¡Buen trabajo! – Marc

+0

Siempre me encanta una buena pregunta;) –

9

Aprovechando lo que Marc mencionó, Aquí hay una versión de probada eficacia.

Option Explicit 

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _ 
ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _ 
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long 

Sub SendMail() 
    Dim objMail As String 
    Dim oMailSubj, oMailTo, oMailBody As String 

    On Error GoTo Whoa 

    oMailSubj = "YOUR SUBJECT GOES HERE" 
    oMailTo = "[email protected]" 
    oMailBody = "BLAH BLAH!!!!" 
    objMail = "mailto:" & oMailTo & "?subject=" & oMailSubj & "&body=" & oMailBody 

    ShellExecute 0, vbNullString, objMail, vbNullString, vbNullString, vbNormalFocus 

    Application.Wait (Now + TimeValue("0:00:03")) 
    Application.SendKeys "%s" 

    Exit Sub 
Whoa: 
    MsgBox Err.Description 
End Sub 

FOLLOWUP

Gracias por la información. Ya había descartado ShellExecute porque limita toda la cadena de parámetros a 250 caracteres y necesito aproximadamente 2000 para el mensaje. Pero parece que SE es la única opción que realmente funcionará en mi caso. - Hace 7 horas Humanoid1000

Aquí es el "horrible (Me encanta la forma JFC dice que !!!)" forma en que se menciona a continuación en los comentarios que funciona muy bien :) Por cierto que tengo solo Outlook como mi cliente predeterminado, así que lo he probado con eso.

CÓDIGO

Option Explicit 

Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, _ 
ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _ 
ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long 

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

Sub SendMail() 
    Dim objMail As String 
    Dim oMailSubj As String, oMailTo As String 
    Dim i As Long 
    Dim objDoc As Object, objSel As Object, objOutlook As Object 
    Dim MyData As String, strData() As String 

    On Error GoTo Whoa 

    '~~> Open the txt file which has the body text and read it in one go 
    Open "C:\Users\Siddharth Rout\Desktop\Sample.Txt" For Binary As #1 
    MyData = Space$(LOF(1)) 
    Get #1, , MyData 
    Close #1 
    strData() = Split(MyData, vbCrLf) 

    Sleep 300 

    oMailSubj = "YOUR SUBJECT GOES HERE" 
    oMailTo = "[email protected]" 
    objMail = "mailto:" & oMailTo & "?subject=" & oMailSubj 

    ShellExecute 0, vbNullString, objMail, vbNullString, vbNullString, vbNormalFocus 

    Sleep 300 

    Set objOutlook = GetObject(, "Outlook.Application") 
    '~~> Get a Word.Selection from the open Outlook item 
    Set objDoc = objOutlook.ActiveInspector.WordEditor 
    Set objSel = objDoc.Windows(1).Selection 

    objDoc.Activate 

    Sleep 300 

    For i = LBound(strData) To UBound(strData) 
     objSel.TypeText strData(i) 
     objSel.TypeText vbNewLine 
    Next i 

    Set objDoc = Nothing 
    Set objSel = Nothing 

    '~~> Uncomment the below to actually send the email 
    'Application.Wait (Now + TimeValue("0:00:03")) 
    'Application.SendKeys "%s" 

    Exit Sub 
Whoa: 
    MsgBox Err.Description 
End Sub 

INSTANTÁNEA

archivo de texto que tiene el mensaje

enter image description here

correo electrónico justo antes de que se envíe

enter image description here

+0

Si recuerdo bien el protocolo mailto como límites en la longitud del cuerpo. (no más de 512 caracteres) Corrígeme si estoy equivocado. – Steve

+0

Gracias por la información. Ya había descartado ShellExecute porque limita toda la cadena de parámetros a 250 caracteres y Necesito alrededor de 2000 para el mensaje. Pero parece que SE es la única opción que realmente funcionará en mi caso. – Humanoid1000

+0

Siddharth, creo que tienes un error tipográfico en tu código. La línea objMail debe tener la cadena "& body =". (nótese el ampersand) – Humanoid1000

0

Aquí está el resultado final:

resultado, el SendMail() trabajaban en casa, pero no en el trabajo, pero CreateObject("Outlook.Application") funcionaba en el trabajo.

Mi configuración de seguridad no era el problema con Outlook, era un error tipográfico mundano.

De cualquier manera, hay mucha información buena en esta página para cualquier otra persona que se haya perdido en este tema.

Cuestiones relacionadas