mail versturen

Status
Niet open voor verdere reacties.

paul.jacobs

Gebruiker
Lid geworden
25 feb 2004
Berichten
424
goede middag

ik kom niet verder en hoop dat iemand me kan helpen.
ik wil via een knop op een formulier een rapport verzenden via de mail.
dit lukt allemaal wel maar ik wil graag dat er meerdere mailadressen uit een query (naam: leden) gebruikt worden.
query bestaat uit:

id
naam
mail
project

ik hoop dat iemand kan helpen
 
Dat kan inderdaad, maar je vraag is volgens mij niet compleet, want wat moet er gemaild worden?
 
Nog steeds niet genoeg :). (Kun je overigens stoppen met het gebruik van de QUOTE knop? nergens voor nodig, in dit geval). Wat voor ons belangrijk is om te weten: is het een individueel rapport, of een algemeen rapport?
 
oké duidelijk.:thumb:

het is een algemeen rapport
daarin staan de taken per persoon uitgesplitst.
 
Een 'algemeen' rapport is in mijn optiek een rapport dat onveranderlijk is. Een specifiek rapport is een rapport waarin je (in jouw geval) taken per persoon uitsplitst. Je krijgt dan voor elke persoon een apart uniek rapport. In je mailing kun je dan ofwel het complete rapport naar iedereen sturen, zodat iedere ontvanger de complete takenlijst ziet, of je stuurt elke gebruiker een rapport met de voor die gebruiker toepasselijke taken.
Beide opties zijn uiteraard mogelijk, maar vereisen een andere aanpak. Ik weet nog niet precies wat jij nu voor ogen hebt :).
 
Dag Paul,

je kan de volgende code niet zomaar gebruiken, want ze is uit een applicatie geplukt en ik kan hier moeilijk de hele app publiceren. Maar ik hoop dat je via deze code een paar ideeën kan opdoen. Dit deel van de code maakt deel uit van het volgend proces:
* de gebruiker selecteert de verenigingen die een lijst moeten krijgen
* de proc roept voor elke vereniging het rapport op met de gegevens voor die vereniging, maakt een pdf van het rapport en mailt de pdf
* de pdf wordt terug verwijderd van de harde schijf
* in een aparte tabel wordt een mailing record aangemaakt zodat men later kan zien wie welke mailing heeft gehad

De meeste acties worden via verschillende objecten aangemaakt

code die de mailing start:
Code:
Public Sub sSendMail(strR As String)
On Error GoTo sSendMail

    Dim rst As New ADODB.Recordset
    Dim rstSel As New ADODB.Recordset
    Dim objMailing As New Mailing
    Dim cnn As New ADODB.Connection
    Dim strLocPDF As String, strFile As String
    Dim objCurSel As New CurrentSel
    Dim strS As String, strB As String
    Dim strMailadres As String
    Dim fMailCreated As Boolean, fFileDeleted As Boolean
    Dim lngMailID As Long
    Dim strClubnummer As String
    Dim intC As Integer
    
   
    Set cnn = CurrentProject.Connection
    rst.Open "select * from twrkAfdrukken where wafAfdrukken = -1", cnn, adOpenKeyset, adLockReadOnly
    With rst
        If Not (.BOF And .EOF) Then
            'haal de locatie op voor de pdf's
            
            If strR = "rptClubExamenlijst" Then
                strS = "Examenlijst " & Format(Date, "dd-mm-yyyy")
            ElseIf strR = "rptClubAdminLijst" Then
                strS = "Administratieve lijst " & Format(Date, "dd-mm-yyyy")
            ElseIf strR = "rptClubFiche" Then
                strS = "Clubfiche " & Format(Date, "dd-mm-yyyy")
            Else
                strS = "Administratie - secretariaat VKF"
            End If
            'voor elk type rapport worden de nodige parameters opgehaald door het mailing object
            objMailing.LoadMailingPars (strR)
            .MoveFirst
            intC = 0
            While Not .EOF
                objCurSel.EmptyCurSel
                Call objCurSel.InsertCurSel(!wafEntiteitsID, "")
                strClubnummer = CStr(Nz(!wafClubNummer, "nn"))

                'creer de pDF
                strFile = objMailing.MailLoc & "\Club" & strClubnummer & strR & Format(Now, "YYYYMMDD_hms") & ".pdf"
                DoCmd.OutputTo acOutputReport, strR & "_PDF", acFormatPDF, strFile, False
                'als een e-mail adres: creer de mail
                strMailadres = Nz(DLookup("clubEmail", "tblClubs", "clubID = " & Nz(!wafEntiteitsID, 0)))
                If Len(strMailadres) > 0 Then
                    fMailCreated = objMailing.SendMailMessage(strMailadres, strS, objMailing.MailTekst, strFile)
                    If fMailCreated Then ' creeer een record in tabel mailing
                        lngMailID = objMailing.CreateMailRecord("C", !wafEntiteitsID, strMailadres, False, strR)
                        'verwijder nu de pdf die gezonden is
                        fFileDeleted = objMailing.DeleteStoredFile(strFile)
                        intC = intC + 1
                    End If
                End If
                
                .MoveNext
            Wend
            MsgBox "Er werden " & intC & " E-mails aangemaakt"
        End If
        .Close
    End With

Exit_sSendMail:
    Set rst = Nothing
    Set cnn = Nothing
    Exit Sub
    
Err_sSendMail:
    Call gsgErrorHandling
    Resume Exit_sSendMail

End Sub

Code mailing object

Code:
Option Compare Database
Option Explicit

    Dim lngID As Long
    Dim strMailRapport As String
    Dim strMailLoc As String
    Dim strMailTekst As String
    
Public Property Get MailRapport() As Variant
On Error GoTo Err_GetMailRapport

    MailRapport = strMailRapport

Exit_GetMailRapport:
    Exit Property
    
Err_GetMailRapport:
    MailRapport = ""
    Resume Exit_GetMailRapport

End Property
Public Property Let MailRapport(ByVal vNewValue As Variant)
On Error GoTo Err_LetMailRapport

    strMailRapport = Nz(vNewValue, "")

Exit_LetMailRapport:
    Exit Property
    
Err_LetMailRapport:
    MailRapport = ""
    Resume Exit_LetMailRapport
End Property

Public Property Let MailLoc(ByVal vNewValue As Variant)
On Error GoTo Err_LetMailLoc

    strMailLoc = Nz(vNewValue, "")

Exit_LetMailLoc:
    Exit Property
    
Err_LetMailLoc:
    MailLoc = ""
    Resume Exit_LetMailLoc
End Property
Public Property Get MailLoc() As Variant
On Error GoTo Err_GetMailLoc

    MailLoc = strMailLoc

Exit_GetMailLoc:
    Exit Property
    
Err_GetMailLoc:
    MailLoc = ""
    Resume Exit_GetMailLoc

End Property
Public Property Let MailTekst(ByVal vNewValue As Variant)
On Error GoTo Err_LetMailTekst

    strMailTekst = Nz(vNewValue, "")

Exit_LetMailTekst:
    Exit Property
    
Err_LetMailTekst:
    MailTekst = ""
    Resume Exit_LetMailTekst
End Property
Public Property Get MailTekst() As Variant
On Error GoTo Err_GetMailTekst

    MailTekst = strMailTekst

Exit_GetMailTekst:
    Exit Property
    
Err_GetMailTekst:
    MailTekst = ""
    Resume Exit_GetMailTekst

End Property


Public Property Get ID() As Variant
On Error GoTo Err_GetID

    ID = lngID
    
Exit_GetID:
    Exit Property
    
Err_GetID:
    ID = 0
End Property

Public Property Let ID(ByVal vNewValue As Variant)
On Error GoTo Err_LetID

    lngID = Nz(vNewValue, 0)
    
Exit_LetID:
    Exit Property
    
Err_LetID:
    lngID = 0

End Property

Public Sub LoadMailing(lngID As Long)
On Error GoTo Err_LoadMailing

    Dim rst As New ADODB.Recordset
    Dim cnn As New ADODB.Connection
    
    Set cnn = CurrentProject.Connection
    rst.Open "select * from tblMailings where mailID = " & lngID, cnn, adOpenKeyset, adLockReadOnly
    With rst
        If .BOF And .EOF Then
            Me.ID = 0
        Else
            Me.ID = lngID
        End If
        .Close
    End With
    
            

Exit_LoadMailing:
    Set cnn = Nothing
    Set rst = Nothing
    Exit Sub
    
Err_LoadMailing:
    Call gsgErrorHandling
    Resume Exit_LoadMailing

End Sub

Public Sub LoadMailingPars(strRapport As String)
On Error GoTo Err_LoadMailingPars

    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    
    Set cnn = CurrentProject.Connection
    rst.Open "select * from tsysParameters where parType = 'Mailing' and parRapport = """ & strRapport & """", cnn, adOpenKeyset, adLockReadOnly
    With rst
        If Not (.BOF And .EOF) Then
            .MoveFirst
            Me.MailRapport = strRapport
            Me.MailLoc = !parArgument
            Me.MailTekst = !parOmschrijving
            .Close
        End If
    End With

Exit_LoadMailingPars:
    Set cnn = Nothing
    Set rst = Nothing
    Exit Sub
    
Err_LoadMailingPars:
    Call gsgErrorHandling
    Resume Exit_LoadMailingPars

End Sub

Public Function CreateMailMessage(strTo As String, strSubject As String, strBody As String, strFile As String) As Boolean
On Error GoTo Err_CreateMailMessage

    Dim appOutlook As New Outlook.Application
    Dim msg As Outlook.MailItem
    Dim intpos As Integer
    
    Set msg = appOutlook.CreateItem(olMailItem)
    
    intpos = InStr(1, strTo, "#")
    If intpos > 1 Then strTo = Left(strTo, intpos - 1)
    msg.To = strTo
    msg.Subject = strSubject
    msg.Body = strBody
    msg.Attachments.Add (strFile)
    msg.Display
    
    CreateMailMessage = True

Exit_CreateMailMessage:
    Exit Function
    
Err_CreateMailMessage:
    'MsgBox Err.Number & ": " & Err.Description
    CreateMailMessage = False
    Resume Exit_CreateMailMessage

End Function

Public Function CreateMailRecord(strMailType As String, lngNaar As Long, strTo As String, fSend As Boolean, strReport As String) As Long
On Error GoTo Err_CreateMailRecord

    Dim rst As New ADODB.Recordset
    Dim cnn As New ADODB.Connection
    
    Set cnn = CurrentProject.Connection
    rst.Open "tblMailings", cnn, adOpenKeyset, adLockPessimistic
    With rst
        .AddNew
        !mailType = strMailType
        !mailNaar = lngNaar
        !mailAdres = strTo
        !mailWanneer = Now
        !mailVerstuurd = fSend
        !MailRapport = strReport
        .Update
        lngID = !mailID
    End With
    CreateMailRecord = lngID

Exit_CreateMailRecord:
    Exit Function
    
Err_CreateMailRecord:
    CreateMailRecord = False
    Resume Exit_CreateMailRecord

End Function

Public Function SendMailMessage(strTo As String, strSubject As String, strBody As String, strFile As String) As Boolean
On Error GoTo Err_SendMailMessage

    Dim appOutlook As New Outlook.Application
    Dim msg As Outlook.MailItem
    Dim intpos As Integer
    
    Set msg = appOutlook.CreateItem(olMailItem)
    'strTo = "noella.gabriel@telenet.be"
    msg.To = strTo
    msg.Subject = strSubject
    msg.Body = strBody
    msg.Attachments.Add (strFile)
SendMessageNow:
    msg.Send
    
    SendMailMessage = True

Exit_SendMailMessage:
    Exit Function
    
Err_SendMailMessage:
    'MsgBox Err.Number & ": " & Err.Description
    If Err.Number = -2147467259 Then 'Outlook doesn't recognize the adress
        intpos = InStr(1, strTo, "#")
        If intpos > 1 Then
            strTo = Left(strTo, intpos - 1)
            msg.To = strTo
            Resume SendMessageNow
        End If
    End If
    SendMailMessage = False
    Resume Exit_SendMailMessage

End Function


Public Function DeleteStoredFile(strFilename) As Boolean
On Error GoTo Err_DeleteStoredFile

    Dim fso As Scripting.FileSystemObject
    Dim fsoFile As Scripting.File
    
    Set fso = CreateObject("Scripting.FilesystemObject")
    If fso.FileExists(strFilename) Then fso.DeleteFile strFilename

Exit_DeleteStoredFile:
    Exit Function
    
Err_DeleteStoredFile:
    DeleteStoredFile = False
    MsgBox Err.Number & ": " & Err.Description
    Resume Exit_DeleteStoredFile

End Function
 
beste Octafish, ik begrijp wat je schrijft, het moet een algemeen rapport zijn en er hoef dus niet voor iedereen afzonderlijk een rapport gemaakt te worden.
NoullaG nogmaals dank voor je info maar ik mis de kennis om dit om te zetten naar mijn Db.
 
De code van noella is ook ongeveer 600 (van de 640) regels te lang, het kan vele malen simpeler. En dat zou ik dus ook doen dan. Gaan we door naar de volgende vraag: één mail met meerdere afzenders, of allemaal aparte mails? En, ook niet onbelangrijk, waar komen de email adressen vandaan?
 
Om even een simpel voorbeeldje te geven, wat prima werkt met een vast rapport. Meer als dit is dus niet nodig.
Code:
Private Sub sendRPT_Click()
On Error GoTo Hell
Dim rst As Recordset
Dim strSubject, strBody, strEmail As String
    
    Set rst = CurrentDb.OpenRecordset("SELECT * FROM QryVerzendlijst;", dbOpenSnapshot)
    If Not rst.EOF Then
        Do While Not rst.EOF
            If Not strEmail = "" Then strEmail = strEmail & ";"
            strEmail = strEmail & rst.Fields("Email")
            rst.MoveNext
        Loop
    End If
        strBody = "Hierbij de lijst met medewerkers die dienst hebben met de Kerstavonden."
    strSubject = "Lijst met namen"
    DoCmd.SendObject acSendReport, "JouwRapport", acFormatPDF, strEmail, , , strSubject, strBody, True
    Exit Sub

Hell:
    MsgBox Err.Number & " " & Err.Description
End Sub
 
Goede avond,
Allereerst mijn excuses voor mijn late reactie.
Het werkt bijna perfect.
Ik loop alleen tegen iets (voor mij) raars aan.
In de query QryVerzendlijst zit een kolom met project.
Hier kan ik de deelnemers selecteren .
Als ik in de criteria een getal zet dan werkt het prima
Gebruik ik [TempVars]![project] dan krijg ik de melding “3061 Er zijn te weinig parameters. Het verwachte aantal is 1.”
Als ik de query open krijg ik wel gewoon de data te zien.
 
De Tempvars collectie maakt (geloof ik) geen onderscheid in gegevenstypes; je kunt er net zo makkelijk tekst als getallen in zetten. Daarnaast moet je de Value uitlezen, je kan nooit naar het object zelf verwijzen. Je kunt dit nog eens proberen: CInt([TempVars]!project.Value)
 
CInt([TempVars]!project.Value) is helaas niet de oplossing .
'Daarnaast moet je de Value uitlezen' ; ik weet even niet wat je bedoeld. waar moet ik dit doen?
 
Op zich doe je dat goed; een TempVar is een object, en Value is daar een eigenschap van. Dus door .Value achter de naam van de TempVar te zetten, lees je de inhoud uit. Maak anders een voorbeeldje, dan kijk ik daar vanavond wel even naar.
 
dat wilde ik wel doen maar het is iets meer werk dan ik dacht . kom er zo snel mogelijk op terug maar vandaag gaat het me niet meer lukken
 
heb het even anders gedaan. hopelijk kun je me helpen
 

Bijlagen

  • mail.zip
    34,9 KB · Weergaven: 32
Ik snap je werkwijze niet helemaal (een macro op MouseDown en een VBA procedure bij MouseUp?) en je rapport ontbreekt, dus helemaal testen kan ik het niet. Ik zou het desalniettemin zo doen:

Code:
Private Sub mijn_projecten_Click()
    TempVars("Project").Value = Me.mijn_projecten.Value
    MsgBox TempVars("Project").Value
End Sub
Hiermee vul je de Tempvars als je een project selecteert.

Code:
Private Sub Knop0_Click()
On Error GoTo Hell
Dim rst As Recordset
Dim strSubject, strBody, strEmail As String
Dim str As String

    DoCmd.OpenQuery "QryVerzendlijst", acViewNormal
    str = "SELECT mail FROM personeel INNER JOIN deelnemers ON personeel.[Id] = deelnemers.[personeel] WHERE project=" & Me.mijn_projecten.Value
    Set rst = CurrentDb.OpenRecordset(str, dbOpenSnapshot)
    If Not rst.EOF And rst.RecordCount > 0 Then
        Do While Not rst.EOF
            If Not strEmail = "" Then strEmail = strEmail & ";"
            strEmail = strEmail & rst.Fields("mail")
            rst.MoveNext
        Loop
    End If
    strBody = "Hierbij het overzicht van openstaande acties. "
    strSubject = "Lijst met namen"
''    DoCmd.SendObject acSendReport, "afspraken PP", acFormatPDF, strEmail, , , strSubject, strBody, True
    Exit Sub

Hell:
    MsgBox Err.Number & " " & Err.Description

End Sub

De regel DoCmd.OpenQuery "QryVerzendlijst", acViewNormal zit er alleen tussen om te laten zien dat je de query wel degelijk vanuit VBA kunt openen. Het probleem dat je hebt, is dat je de TempVar niet kunt gebruiken in een DAO Recordset, want dat object kent-ie niet. Je moet dus de waarden toewijzen, en niet de TempVar. Dat kan dus zoals in bovenstaande code, maar ook zo:

Code:
    str = "SELECT mail FROM personeel INNER JOIN deelnemers ON personeel.[Id] = deelnemers.[personeel] WHERE project=" & TempVars("Project").Value
Deze variant voegt overigens niets toe aan de door mij gebruikte variant hierboven. Die ik dus makkelijker vind.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan