2012-04-28 7 views
9

Questo è un seguito di diversi messaggi sull'utilizzo di VBA per l'invio di e-mail.Follow up sull'utilizzo di VBA per l'invio di e-mail

La maggior parte dei suggerimenti utilizzare sia Outlook, CDO o MAPI:

Set appOL = CreateObject("Outlook.Application") 

Set msgOne = CreateObject("CDO.Message") 

Set mapi_session = New MSMAPI.MAPISession 

Ma a quanto pare Outlook mi richiede di cambiare le nostre impostazioni di sicurezza del gruppo di lavoro, e CDO e MAPI mi richiederà di aggiungere una DLL o qualcosa del genere.

Sto cercando di utilizzare Excel per organizzare i compiti di gruppo al lavoro e non posso modificare in alcun modo i computer degli altri.

Esiste un modo più semplice per inviare e-mail da una macro di Excel?
Tutto ciò di cui ho bisogno è un blocco di testo nel corpo del messaggio senza allegati.

Sto attraversando Google, MSDN & StackOverflow per tutta la settimana e sono bloccato su una barca lenta verso il nulla.

risposta

5

È possibile utilizzare il comando Shell.

Shell("mailto:[email protected]") 

Se Outlook è il programma di posta predefinito, penso finestre interpreteranno che correttamente (lo fa dalle finestre di dialogo Esegui, ma non è sicuro se da VBA). Provalo. Al momento non sono di fronte a Excel.

Rivedere i parametri per "mailto" per vedere come è possibile aggiungere oggetto e corpo a quella stringa.

CORREZIONE: Ciò genererà solo l'email, ma non la invierà. Ignora la mia risposta.

+0

'Ignora la mia risposta. + 1 :-) Eri sulla buona strada. –

+0

@SiddharthRout, ho visto molti di voi su queste domande di Excel ultimamente su Siddarth. Buon lavoro! – Marc

+0

Adoro sempre una buona domanda;) –

9

Costruire su ciò che Marc ha menzionato, Ecco una versione provata e verificata.

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

Grazie per le informazioni. Avevo già escluso ShellExecute perché limita l'intera stringa di parametri a 250 caratteri e ho bisogno di circa 2000 per il messaggio. Ma sembra che SE sia l'unica opzione che funzionerà nel mio caso. - Humanoid1000 7 ore fa

Ecco la "Horrible (Amo il modo in JFC dice che !!!)" modo in cui ho citato qui sotto nei commenti, che funziona a meraviglia :) BTW ho solo Outlook come mio client predefinito, quindi l'ho testato con quello.

CODICE

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 

ISTANTANEA

file di testo che ha il messaggio

enter image description here

-mail appena prima di essere inviato

enter image description here

+0

Se ricordo bene il protocollo mailto come limiti sulla lunghezza del corpo. (non più di 512 caratteri). Correggimi se sbaglio – Steve

+0

Grazie per le informazioni. Avevo già escluso ShellExecute perché limita l'intera stringa di parametri a 250 caratteri e Ho bisogno di circa 2000 per il messaggio. Ma sembra SE è l'unica opzione che funzionerà nel mio caso. – Humanoid1000

+0

Siddharth, credo che tu abbia un errore di battitura nel tuo codice. La riga objMail dovrebbe avere la stringa "& body =". (si noti la e commerciale) – Humanoid1000

0

Ecco il risultato finale:

risulta, il SendMail() lavorato a casa, ma non al lavoro, ma CreateObject("Outlook.Application") fatto un lavoro sul posto di lavoro.

Le mie impostazioni di sicurezza non erano il problema con Outlook, era un errore di battitura banale.

In entrambi i casi, ci sono un sacco di buone informazioni su questa pagina per chiunque altro abbia perso questo argomento.