Access 2016 VBA. Verzenden email met een ander emailaccount dan de default afzender

Status
Niet open voor verdere reacties.

KPTPTT

Gebruiker
Lid geworden
2 mrt 2018
Berichten
321
Hallo. We werken met MS Exchange server (OneDrive) en lokaal op de pc, Outlook 2016.
In Access wordt dmv. een Outlook 2016 e-mail verzonden met een pdf bijlage van een formulier. Dit werkt uitstekend. In VBA wordt de volgende code toegepast: "DoCmd.SendObject acSendReport". De afzender van de e-mail is de default account (bijvoorbeeld: aaaa@bedrijf.nl[). In Outlook zijn echter meerdere accounts c.q. aliassen met bijbehorende mailboxen beschikbaar.
Ik wil de e-mail niet vanaf de default afzender versturen maar van een ander account, deze moet in de VBA code vast zijn gedefinieerd (dus wordt niet gewijzigd) (bijvoorbeeld: bbbb@bedrijf.nl). De DoCmd.SendObject acSendReport statement voorziet nmi. daar niet in. Hoe kan ik het oplossen?
 
SendObject werkt met de standaardinstellingen van je standaard mail pakket. Het maakt daarbij niet uit welk pakket dat is, zolang het maar de Default client is. Daar kun je niets aan instellen. Wil je vanuit meerdere accounts kunnen mailen, dan gaat dat alleen als je vanuit een Outlook object gaat mailen. Aan de pluskant daarvan: dan kun je ook gelijk veel meer inregelen.
 
Geweldig, ziet er goed uit. Ik ga er mee aan de slag en laat het resultaat weten.

Ik heb inmiddels de code uit het voorbeeld overgenomen. Op zich draait de code goed zonder bugs echter: Ik heb met de test sub bepaald dat het andere account nummer 2 is en heb dit ingevuld in het commando SendUsingAccount = OutApp.Session.Accounts.Item(2) maar de email blijft verzonden vanuit account 1.

Er staat verder in het instructieblad dat Got mails from 2016 users that that Set is needed before .SendUsingAccount. Wat zou daar mee bedoeld worden? Zou dat er mee te maken kunnen hebben?
 
Laatst bewerkt:
Bij het laatste bericht staat niets vermeld.

Ik heb het opgegeven voorbeeld toegepast en heb daarbij een fout in de code gemaakt. Voorafgaande aan de regel SendUsingAccount = OutApp.Session.Accounts.Item(2) moet een punt staan, dus .SendUsingAccount = OutApp.Session.Accounts.Item(2). Sorry voor de verwarring maar nu werkt het voorbeeld van "rondebruin" goed. Ik heb wel beide aangegeven subroutines onder knop gezet zodat deze gemakkelijk zijn uit te voeren om te testen.
De eerste subroutine (knop946) bepaalt het accountnummer (eenmalig voor de bepaling en is daarna niet meer nodig) en de tweede routine (knop947) verzendt de e-mail met de bijlage Werkorder.pdf.

Test Sub routines:
Code:
Private Sub Knop946_Click()            'Welk accountnummer
Dim OutApp As Outlook.Application
Dim I As Long

Set OutApp = CreateObject("Outlook.Application")

For I = 1 To OutApp.Session.Accounts.Count
    'MssgBox OutApp.Session.Accounts.Item(I) & ": This is a account number " & I
    'Next I
End Sub

Code:
Private Sub Knop947_Click()      'E-mail met bijlage
    Dim OutApp As Outlook.Application
    Dim OutMail As Outlook.MailItem
    
    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(olMailItem)
    
    strbody = "Hallo" & Chr(13) & Chr(10) & _
              "Dit is regel 1"
                
On Error Resume Next
Me.Dirty = False

Dim sNaam As String, adrsNaam As String, nrNaam As String, plsNaam As String

DoCmd.OpenReport "Rport Werkorders", acViewPreview, , "[o_Opdracht ID]= " & Me.[o_Opdracht ID]
sNaam = [o_Werknummer]
adrsNaam = [o_Adres]
nrNaam = [o_Huisnummer]
plsNaam = [o_Plaats]

Path = "D:\Werkorder" & ".pdf"

Dim strLocation As String
DoCmd.OutputTo acOutputReport, "Rport Werkorders", acFormatPDF, Path, False
DoCmd.Close acReport, "Rport Werkorders", acSaveNo

    With OutMail
        .SendUsingAccount = OutApp.Session.Accounts.Item(2)
        .To = ""
        .CC = ""
        .BCC = ""
        .Subject = "Dit is het onderwerp"
        .Body = strbody
        .Attachments.Add Path
        .Display
    End With
On Error GoTo 0

    Set OutMail = Nothing
    Set OutApp = Nothing

End Sub

<<<Ik zou graag nog een verbetering willen. In de regel DoCmd.OutputTo acOutputReport, . . . . . wordt het rapport Werkorder als pdf (onnodig) opgeslagen op de D schijf. Hoe zou ik deze stap over kunnen slaan, dus geen opslag van een dummy. Er is dan geen pad (Path) en een dummy bestand (Werkorder.pdf) meer nodig.>>>

Inmiddels, een dag later, is een vervelende situatie ontstaan. De sub e-mail werkte naar tevredenheid op de bovenstaande vraag na. Bij het testen en wijzigen is mijn Rapport Werkorders verdwenen en heb een kopie van de FE tav. e-mail code opnieuw moeten aanmaken. Nu ontstaat in de nieuwe situatie met dezelfde code, bij het e-mail verzenden een foutmelding in de regel <Dim OutApp As Outlook.Aplication>, Foutmelding: "Een door de gebruiker gedefinieerde gegevenstype is niet gedefinieerd". Dit zou te maken kunnen hebben met de Outlook Object Library (Outlook) . Deze heb ik bij Verwijzingen aangevinkt maar ondanks toch deze foutmelding.
Als ik deze regel uitschakel, gaat alles weer naar wens en kan ik e-mail verzenden maar dan is in de code sprake van Late Binding wat ik niet wil.
<<<Er wordt ook weer een e-mail verzonden vanuit account 1 ipv. account 2, waar het allemaal om begonnen is (.SendUsingAccount = OutApp.Session.Accounts.Item(2))>>>

Ik heb dus de library nodig voor Early Binding om vanuit account 2 (anders dan default) te kunnen mailen. De library is ingeschakeld maar VBA lijkt het niet meer te vinden. Het bestand MSOUT.OLB is aanwezig. Vanuit de Library krijg ik geen foutmelding. Ik heb zelfs Office 2016 opnieuw uitgebreid hersteld maar ook dat helpt niet. Bij Opties, vertrouwenscentrum staan de macro's op toegestaan. Help, het was zo mooi maar krijg het niet meer aan de praat.
 
Laatst bewerkt:
Bij het laatste bericht staat niets vermeld.
Volgens mij staat in de link een volledig werkend codevoorbeeld :).

In de regel DoCmd.OutputTo acOutputReport, . . . . . wordt het rapport Werkorder als pdf (onnodig) opgeslagen op de D schijf. Hoe zou ik deze stap over kunnen slaan, dus geen opslag van een dummy. Er is dan geen pad (Path) en een dummy bestand (Werkorder.pdf) meer nodig.
Dat is onmogelijk. Net zoals ik jou nooit een virtuele opdracht kan geven om een pakketje ergens af te leveren (dan vraag je toch echt: waar staat dat dan?) is het onmogelijk om een niet-bestaand bestand als bijlage toe te voegen. De meest simpele oplossing is om de bijlage na het verzenden te verwijderen met
PHP:
Kill Path

Als ik deze regel uitschakel, gaat alles weer naar wens en kan ik e-mail verzenden maar dan is in de code sprake van Late Binding wat ik niet wil.
Volgens mij moet het met Late Binding ook werken, al kan ik dat zelf niet testen. Ik snap niet helemaal wat je laatste probleem is; als je alleen het rapport kwijt was, maak je dat toch weer opnieuw? Ik krijg nu de indruk dat je de complete FE opnieuw hebt gemaakt. Wellicht een hoop werk, maar beter als de complete db opnieuw nabouwen. Gebruik je overigens geen <Vorige versies> in je verkenner? Dan kun je nog wel oudere versies terughalen, en daar het rapport uit terug importeren.
 
Dank je wel OctaFish. Er staat geschreven: "Of lees dit" en geen link. Kill path is een goede tip echter een bestand meer of minder op de schijf raak die ook niet voller van. Late binding werkt maar dan is de afzender van de e-mail de default account (1). Early binding en de Library voor Outlook is nodig om een accountnummer uit Outlook te kunnen destilleren en deze te gebruiken voor de e-mail. In mijn geval het tweede account (.SendUsingAccount = OutApp.Session.Accounts.Item(2). De library is ingeschakeld maar doet, na de crash, zijn werk niet meer goed. Als ik de FE (Frontend) op een geheel andere pc draai, dan is de Library voor outlook al ingeschakeld en werkt de FE ook niet goed. Ik heb nu de indruk dat de library continue verweven zit met de FE terwijl deze "defect" is.
Hoe kan ik de Library ongedaan maken en de Library opnieuw activeren? Een vinkje uit en weer aan zetten helpt niet.
 
Klik eens op het woordje "dit" in #6 ;)
 
Een library aan of uitzetten helpt ook niet, want je zet niks anders aan of uit dan de overige keren dat je het aan of uit zet.
Je kunt met een lus alle accounts doorlopen, en dat zou niet afhankelijk moeten zijn van Late of Early binding. Met die lus kun je dus zo controleren of de accounts in late binding te vinden zijn.
Een db naar een andere pc verplaatsen helpt ook niet, omdat de bibliotheken in de db zitten (de verwijzingen dan). Eerder verhoog je de kans dat het níet meer werkt.
Ik zou eerder een compleet nieuwe db maken en alles importeren. In die nieuwe db zou ik dan eerst de bibliotheken goed zetten en met een testformulier de Outlook code uitproberen. Werkt die, dan kun je alles importeren. En dan zou het moeten werken.
 
Ik heb de regel Dim OutApp As Outlook.Application vervangen door dezelfde regel en zo waar, het werkt nu. Ik had dit al eens eerder gedaan maar zonder resultaat en nu wel. Ondoorgrondelijk soms maar gewoon volhouden. Bedankt.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan