Excel 2007-ből e-mail küldés Outlook 2007-el.

Excel 2007-ből e-mail küldés Outlook 2007-el.
2008-03-29T23:03:40+01:00
2008-04-14T10:41:38+02:00
2022-11-09T05:45:36+01:00
Micu
Sziasztok!

Excel 2007-ből próbálok Outlook 2007-en keresztül levelet küldeni, Vista alatt.
A Tools > References-be be van kapcsolva a Microsoft Outlook 12.0 object library, nincs hibás elem a References listában

A következő kóddal próbálkozom:

Sub tt() Dim ouApp As New Outlook.Application Set ouApp = New Outlook.Application Dim level As Outlook.MailItem Set level = ouApp.CreateItem(olMailItem) With level ' .to="barki@freemailxxxx.xxx" .Recipients.Add "akarki@freemailxxxx.xxx" .Subject = "Tárgy3" .Importance = olImportanceHigh ' Fontosság .HTMLBody = "<HTML><H2>Cím</H2><BODY><p><b>A levél üzenete</b></p></body></html>" .Send End With End Sub

A gondom, hogy a .Recipients.add, vagy a .send sorokon leáll, "Run-time Error '287', Application-defined or Object-defined error"-al.
Ha ezután Debug-ot nyomok, és elindítom az Outlook-ot, vagy a Locals ablakba kinyitom a "level" vagy az "ouApp" változók jellemzőit (a kis "+" jellel), majd továbbküldöm a programot (F5), akkor a levél már elmegy.

(Az e-mail cím nem befolyásoló tényező mindenféle címmel csinálja)

A google-t néztem, és az a javaslat, hogy indítsuk el elötte az Outlook-ot.
Mit lehetne tenni (azon kívül, hogy nem Outlookot használok, és nem iratom át az MS-el), hogy az Outlook megnyitása nélkül is menjen?

Köszi!

Micu
Mutasd a teljes hozzászólást!
Hello Micu!



Az Outlook program megnyitasakor automatikusan bejelentkezik a "mapi" nevterbe es ezert tudtad a receipt-et hozzaadni a mailitem-hez mikor nyitva az Outlook.

Erdekes hogy hiaba deklaralod a "new" kucsszoval az "Outlook.Application" objektum valtozot akkor is ha mar van a memoriaban ilyen tipsu objektum akkor a memoriaban szereplo peldany tartalmat veszi fel az uj valtozo, tehat igazabol nem uj es ezert a mar letezo peldany beallitasait hasznalja.

A problema megoldasaert deklaralni kell egy namespace tipusu objektumot es a "Outlook.Application" mapi nevterenek a tartalmat kell beallitani hozza, majd a logon metodussal be kell jelentkezni; vagy az Application, Mailitem tipusu valtozoknak a session tulajdonsagan keresztul bejelentkezni es a problema megoldva.

A forraskodot amit a forumra feltettel kibovitettem egy sorral es a "Set ouApp = New Outlook.Application" kitoroltem, mert az felesleges (Igaz az elozo verziokban a new kulcsszoval nem lehetet deklaralni az Outlook.Application valtozot csak a "CreateObject" utasitassal de ott meg a dekleralaskor lenne felesleges a "New" kulcsszo ).



Dim ouApp As New Outlook.Application
Dim level As Outlook.MailItem
ouApp.Session.Logon 'Az uj sor!!!
Set level = ouApp.CreateItem(olMailItem)
With level
'.To = "barki@freemailxxxx.xxx"
.Recipients.Add "akarki@freemailxxxx.xxx"
.Subject = "Tárgy3"
.Importance = olImportanceHigh ' Fontosság
.HTMLBody = "<HTML><H2>Cím</H2><BODY><p><b>A levél üzenete</b></p></body></html>"
.Send
End With

Miki.
Mutasd a teljes hozzászólást!

  • Ez Micu 5. kérdése a prog.hu-n (ha minden igaz), azt hiszem itt az ünneplés ideje.

    Most egy hétig mi gondolkozunk a válaszon, addig Micu pihenhet. Ha valaki megoldja a problémáját az megkapja Micu pontjainak a felét, no meg a fele királyság mellé odacsapjuk a királylányt is!

    No ki van benne?

    [ontopic] De most komolyra fordítva a szót: ez nem azért van, mert a levélküldést a felhasználónak is jóvá kellene előbb hagynia? (Nem értek hozzá, de amikor Delphiből próbáltam hozzáférni akkor is ez volt)
    Mutasd a teljes hozzászólást!
  • 2003-ban szépen jólnevelten megkérdezte, hogy "valaki piszkál, jó ez neked?" Most semmi ilyen.

    És ha nyitva az Outlook, akkor meg szó nélkül elküldi
    Mutasd a teljes hozzászólást!
  • Nekem ezzel műxik....

    doCmd.SendObject acSendReport, "Bevetelezes", "*.rtf", "xx@axxxx.hu", , , "Bevételezett termékek"

    igaz, access alól. Sztem az excel hasonlót kell, hogy használjon. Ha megadod konkrétan, hogy

    SendObject
    objectum típusa
    ,
    "objektum neve"
    és ha esetleg kell
    objektum kimeneti formája
    (nálam ez a *.rtf)

    csak kérdezek. És azt is csak bátortalanul...és alázattal...
    Mutasd a teljes hozzászólást!
  • Az nekem is megy, de én eléggé paraméterezetten szeretném küldeni a levelet.
    Fontosság, tartalom, tárgy, esetleg 1-2 csatolt doksi cc, bcc.....
    És a gondom, hogy ez mind megy is, csak akkor nem, ha az Outlook 2007 nincs nyitva.

    Azért köszi, hogy próbálasz segíteni.
    Mutasd a teljes hozzászólást!
  • Gondoltam, lefuttatom a kódodat az én gépemen, hátha valami dll probléma.Sajnos, sokra nem jutottam, mert:

    Dim ouApp As New Outlook.Application
    Set ouApp = New Outlook.Application

    már az első sornál kiakad, a hiba: Compile error: "User-defined type not defined"

    ha ki-kommentezem, akkor a másodiknál akad ki. Ha jól értem, az ObjectLibrary(k) nem tartalmazza(ák) az Outlook.Application objectumot... Valszeg valami nincs nálam bekapcsolva, ami nálad bevan...
    Mutasd a teljes hozzászólást!
  • Igen, nálam be van a Microsoft Outlook 12.0 Object library.

    Elvileg anélkül is mennie kellene így:

    Dim ouApp As object Set ouApp = createobject("Outlook.Application") Dim level Set level = ouApp.CreateItem(0)

    De ugyan az a gond.
    Mutasd a teljes hozzászólást!
  • Szia.

    Neten találtam:


    Link: I T T . . .

    Private Sub colSentItems_ItemAdd(ByVal Item As Object) If Item.Class = olMail Then Call SaveToFile(Item) End If End Sub Sub SaveToFile(myItem as Outlook.MailItem) ' variable declarations go here On Error Resume Next Proj = LTrim(Left(myItem.Categories, InStr(1, myItem.Categories, ":") - 1)) Proj = RTrim(Proj) FH_Sending = Proj New_Folder = "\\filer\Project_Mail\FHMail_Project" & "_" & FH_Sending If Not fso.FolderExists(New_Folder) Then fso.CreateFolder(New_Folder) '<-- note change here End If fname = RTrim(LTrim(myItem.Subject)) If IsNull(fname) Or fname = "" Then fname = "None" End If ' 'File name can not contain any of the following characters: '\ / : * ? " < > | 'Using "_" instead of the above charactors. ' For k = 1 To Len(fname) ch = Mid(fname, k, 1) If Asc(ch) < 32 Or Asc(ch) > 127 Then fname = Replace(fname, ch, "^") Else If (Asc(ch) = 34) Or (Asc(ch) = 42) Or (Asc(ch) = 47) Or (Asc(ch) = 58) Or (Asc(ch) = 60) Or (Asc(ch) = 62) Or (Asc(ch) = 63) Or (Asc(ch) = 92) Or (Asc(ch) = 124) Then fname = Replace(fname, ch, "_") End If End If Next k strFilePath = New_Folder & "\" & fname & ".msg" Debug.Print strFilePath Err.Clear ' clear any previous errors myItem.SaveAs strFilePath If Err <> 0 Then MsgBox "You said No so we can't save the item" End If ' code to dereference object variables goes here End Sub
    Mutasd a teljes hozzászólást!
  • Szia!

    Köszi, de én nem lementeni szeretném, hanem éppen most létrehozni egy Office (VBA-s) alkalmazásból egy e-mail-t, ráadásul (bezárt) Outlook-on keresztül. (CDO-val menne)

    Ráadásul (és itt a fogos része) úgy, hogy az Outlook nincs nyitva. (Mert ha nyitva van, akkor megy)

    Ráadásul a
    .to="barki@freemailxxxx.xxx"
    változatnál túl tud menni bezártnál is, de a
    .Recipients.Add "akarki@freemailxxxx.xxx"
    változattal meg nem. (Meg sajnos egy halom más tulajdonságot se enged beállítani)
    Mutasd a teljes hozzászólást!
  • bogarászgatom. Amit eddig találtam, hogy bezárt állapotban nincs alapértelmezett fiók, tehát a

    SendUsingAccount="" (ez gondolom okozhatja, hogy a "level.send" nem fut le.

    tudod specifikálni, hogy melyik outlook-account -ot használja, ha zárva van? Nem tudom, hogy ez segít vagy nem , én is csak próbálkozom...

    Valami ilyesmire gondoltam:

    objMsg.SendUsingAccount = oa.Session.Accounts(3) objMsg.Display
    Mutasd a teljes hozzászólást!
  • Én a defaultnak is nagyon örülnék (Főleg ha mondjuk csak 1 van)

    Mutasd a teljes hozzászólást!
  • Akkor tessék:

    Function Set_Account(AccountName, M) Dim OLI 'As Outlook.Inspector Dim strAccountBtnName 'As String Dim intLoc 'As Integer ' Const ID_ACCOUNTS = 31224 Dim CBs 'As Office.CommandBars Dim CBP 'As Office.CommandBarPopup Dim MC 'As Office.CommandBarControl Set OLI = M.GetInspector If Not OLI Is Nothing Then Set CBs = OLI.CommandBars Set CBP = CBs.FindControl(, 31224) If Not CBP Is Nothing Then For Each MC In CBP.Controls intLoc = InStr(MC.Caption, " ") If intLoc > 0 Then strAccountBtnName = Mid(MC.Caption, intLoc + 1) Else strAccountBtnName = MC.Caption End If If strAccountBtnName = AccountName Then MC.Execute Set_Account = AccountName GoTo Exit_Function End If Next End If End If Set_Account = "" Exit_Function: Set MC = Nothing Set CBP = Nothing Set CBs = Nothing Set OLI = Nothing End Function
    Mutasd a teljes hozzászólást!
  • Találtam egy ilyet is...

    Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean) Dim msg As Outlook.MailItem Dim favAcctName As String On Error Resume Next If TypeOf Item Is Outlook.MailItem Then favAcctName = Application.Session.Accounts(1).DisplayName Set msg = Item res = MsgBox("Do you want to send with the " & _ favAcctName & " account?", _ vbYesNoCancel + vbQuestion, _ "Check Send Account") Select Case res Case vbYes Set msg.SendUsingAccount = _ Application.Session.Accounts(1) Case vbCancel Cancel = True End Select End If Set msg = Nothing End Sub

    Ha kiveszed a kérdés részt, akkor használható a kód?
    (nekem lefut, bezárt outlook-al is - igaz, nem küld semmit, nincs benne a msg.send)
    Mutasd a teljes hozzászólást!
  • Köszi, de mind a kettőnek ugyan az a hibája:

    Nem tudom beállítani vele a Recipients (gyűjtemény) elemeit és azok tulajdonságait.

    de például egy:
    level.HTMLBody = "<HTML><H2>Cím</H2>"
    level.HTMLBody = level.HTMLBody & "<BODY><p><b>A levél üzenete</b></p></body></html>"

    vagy egy
    level.send
    sorra is elhullik.

    ---

    Application_ItemSend: Az az Outlooknak a küldési eseményének az elkapása.
    Mutasd a teljes hozzászólást!
  • Hello Micu!



    Az Outlook program megnyitasakor automatikusan bejelentkezik a "mapi" nevterbe es ezert tudtad a receipt-et hozzaadni a mailitem-hez mikor nyitva az Outlook.

    Erdekes hogy hiaba deklaralod a "new" kucsszoval az "Outlook.Application" objektum valtozot akkor is ha mar van a memoriaban ilyen tipsu objektum akkor a memoriaban szereplo peldany tartalmat veszi fel az uj valtozo, tehat igazabol nem uj es ezert a mar letezo peldany beallitasait hasznalja.

    A problema megoldasaert deklaralni kell egy namespace tipusu objektumot es a "Outlook.Application" mapi nevterenek a tartalmat kell beallitani hozza, majd a logon metodussal be kell jelentkezni; vagy az Application, Mailitem tipusu valtozoknak a session tulajdonsagan keresztul bejelentkezni es a problema megoldva.

    A forraskodot amit a forumra feltettel kibovitettem egy sorral es a "Set ouApp = New Outlook.Application" kitoroltem, mert az felesleges (Igaz az elozo verziokban a new kulcsszoval nem lehetet deklaralni az Outlook.Application valtozot csak a "CreateObject" utasitassal de ott meg a dekleralaskor lenne felesleges a "New" kulcsszo ).



    Dim ouApp As New Outlook.Application
    Dim level As Outlook.MailItem
    ouApp.Session.Logon 'Az uj sor!!!
    Set level = ouApp.CreateItem(olMailItem)
    With level
    '.To = "barki@freemailxxxx.xxx"
    .Recipients.Add "akarki@freemailxxxx.xxx"
    .Subject = "Tárgy3"
    .Importance = olImportanceHigh ' Fontosság
    .HTMLBody = "<HTML><H2>Cím</H2><BODY><p><b>A levél üzenete</b></p></body></html>"
    .Send
    End With

    Miki.
    Mutasd a teljes hozzászólást!
  • Köszi tökéletesen fedi a kérdésemre adandó választ.

    Egy hibája van még, hogy beteszi ugyan a postázandóba, de nem küldi el automatikusan, csak akkor, ha belépek az Outlookba. De ez egy másik kérdés
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd