2012-04-28 4 views
9

Jest to kontynuacja kilku wiadomości dotyczących używania VBA do wysyłania wiadomości e-mail.Kontynuacja procesu korzystania z VBA do wysyłania wiadomości e-mail

Większość sugestii użyć programu Outlook, CDO lub MAPI:

Set appOL = CreateObject("Outlook.Application") 

Set msgOne = CreateObject("CDO.Message") 

Set mapi_session = New MSMAPI.MAPISession 

Ale widocznie Outlook wymagać będzie mi zmienić swoje ustawienia zabezpieczeń dla grup roboczych i CDO i interfejsu MAPI będzie wymagać mnie dodać DLL czy coś.

Próbuję użyć programu Excel do porządkowania przydziałów grupowych w pracy i nie mogę w żaden sposób modyfikować komputerów innych osób.

Czy istnieje prostszy sposób wysyłania wiadomości e-mail z makra programu Excel?
Wszystko, czego potrzebuję, to blok tekstu w treści wiadomości bez załączników.

Przeszukałem Google, MSDN & StackOverflow przez cały tydzień i utknąłem na powolnej łodzi donikąd.

Odpowiedz

5

Prawdopodobnie możesz użyć polecenia Shell.

Shell("mailto:[email protected]") 

Jeśli program Outlook jest domyślny program pocztowy, myślę, że okna będą prawidłowo zinterpretować (robi to z okien prowadzony dialog, ale nie wiem, czy z VBA). Wypróbuj to. W tej chwili nie mam przed sobą Excela.

Przejrzyj parametry dla "mailto", aby zobaczyć, jak możesz dodać temat i treść do tego ciągu.

KOREKTA: To spowoduje wygenerowanie wiadomości e-mail, ale jej nie wyśle. Zignoruj ​​moją odpowiedź.

+0

'Zignoruj ​​moją odpowiedź.' + 1 :-) Byłeś na dobrej drodze. –

+0

@SiddharthRout, widziałem wielu z was na temat tych pytań Excel ostatnio Siddarth. Dobra robota! – Marc

+0

Zawsze uwielbiam dobre pytanie;) –

9

W oparciu o to, o czym wspomniał Marc, oto sprawdzona i przetestowana wersja .

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 

nawiązanie

Dzięki za info. Już wykluczyłem ShellExecute, ponieważ ogranicza on cały ciąg parametrów do 250 znaków i potrzebuję około 2000 dla wiadomości. Ale wygląda na to, że SE to jedyna opcja, która zadziała w moim przypadku. - Humanoid1000 7 godzin temu

Oto „Horrible (Uwielbiam sposób JFC mówi, że !!!)” sposób wspomniałem poniżej w komentarzach, które działa pięknie :) BTW mam tylko Outlook jest moim domyślnym klientem, więc przetestowałem go z tym.

KOD

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 

SNAPSHOT

plik tekstowy, który ma wiadomość

enter image description here

Email tuż przed jego wysłaniem

enter image description here

+0

Jeśli dobrze pamiętam protokół mailto jako ograniczenia długości ciała. (nie więcej niż 512 znaków). Popraw mnie, jeśli się mylę. – Steve

+0

Dzięki za informacje. Już wykluczyłem ShellExecute , ponieważ ogranicza on cały łańcuch parametrów do 250 znaków i Potrzebuję około 2000 dla wiadomości. Ale wygląda na to, że SE to jedyna opcja, która zadziała w moim przypadku. – Humanoid1000

+0

Siddharth, Wierzę, że masz literówkę w swoim kodzie. Linia objMail powinna mieć ciąg "& body =". (zauważ ampersand) – Humanoid1000

0

Oto efekt końcowy:

okazuje, SendMail() pracował w domu, ale nie w pracy, ale CreateObject("Outlook.Application") zadziałały w pracy.

Moje ustawienia zabezpieczeń nie były problemem w Outlooku, to było zwykłe literówki.

Tak czy inaczej, na tej stronie jest mnóstwo dobrych informacji dla każdego, kto zgubił się na ten temat.