Hoe stuur ik een attachment mee per email vanaf een access formulier

Status
Niet open voor verdere reacties.

ReijerdH

Gebruiker
Lid geworden
1 apr 2010
Berichten
95
Goedenavond, ik heb 1 tabel voor het versturen van email. In deze tabel heb ik ook een bijlage opgenomen. Op mijn formulier heb ik een verzendknop die de volgende code aanroept.

Het enige wat ik niet voor elkaar krijg is om de bijlage mee te versturen. Als ik deze direct in de code zet "c:\iets.pdf" word de pdf verzonden. Echter alle ontvangers krijgen een verschillend pdf formulier.

kan iemand mij aangeven wat ik moet aanpassen?

Met vriendelijke groet,

Reijer
 

Bijlagen

De code onder de knop verzendt sowieso maar één mail. Om naar alle ontvangers uit de tabel een mail te sturen, moet je de tabel in zijn geheel doorlopen.
Je kan inderdaad niet de bijlage uit een tabel meesturen, alleen een echt bestand. Dat komt goed uit, want dan vang je twee vliegen in één klap. Het opslaan van bestanden in een tabel is niet verstandig (de database kan erg groot worden). Beter laat je de bestanden op schijf staan en neem je een verwijzing op in je tabel. Al met al zou je code er zo uit kunnen zien:
Code:
Private Sub btnVerstuur_Click()

Dim rs As Recordset
Dim OutApp As Outlook.Application
Dim OutMail As Outlook.MailItem
Dim OutAtt As Outlook.Attachments

Set rs = CurrentDb.OpenRecordset("tblMail")
Set OutApp = CreateObject("Outlook.Application")

While Not rs.EOF
    Set OutMail = OutApp.CreateItem(olMailItem)
    Set OutAtt = OutMail.Attachments

    With OutMail
        .To = rs!To
        .Cc = "iemand@hotmail.com"
        .Subject = rs!Subject
        .Body = rs!Body
        OutAtt.Add "C:\MapMetBijlages\" & rs!Attachment
        .Display
    End With
    
    Set OutMail = Nothing
    Set OutAtt = Nothing
    
    rs.MoveNext
Wend

Set OutApp = Nothing
Set rs = Nothing

End Sub
Ik heb het veld "Attachment" in de tabel veranderd in een tekstveld waarin ik de naam van de bijlage zet.
 
De code onder de knop verzendt sowieso maar één mail. Om naar alle ontvangers uit de tabel een mail te sturen, moet je de tabel in zijn geheel doorlopen.
Je kan inderdaad niet de bijlage uit een tabel meesturen, alleen een echt bestand. Dat komt goed uit, want dan vang je twee vliegen in één klap. Het opslaan van bestanden in een tabel is niet verstandig (de database kan erg groot worden). Beter laat je de bestanden op schijf staan en neem je een verwijzing op in je tabel. Al met al zou je code er zo uit kunnen zien:
Code:
Private Sub btnVerstuur_Click()

Dim rs As Recordset
Dim OutApp As Outlook.Application
Dim OutMail As Outlook.MailItem
Dim OutAtt As Outlook.Attachments

Set rs = CurrentDb.OpenRecordset("tblMail")
Set OutApp = CreateObject("Outlook.Application")

While Not rs.EOF
    Set OutMail = OutApp.CreateItem(olMailItem)
    Set OutAtt = OutMail.Attachments

    With OutMail
        .To = rs!To
        .Cc = "iemand@hotmail.com"
        .Subject = rs!Subject
        .Body = rs!Body
        OutAtt.Add "C:\MapMetBijlages\" & rs!Attachment
        .Display
    End With
    
    Set OutMail = Nothing
    Set OutAtt = Nothing
    
    rs.MoveNext
Wend

Set OutApp = Nothing
Set rs = Nothing

End Sub
Ik heb het veld "Attachment" in de tabel veranderd in een tekstveld waarin ik de naam van de bijlage zet.


Peter, hartelijk bedankt voor je hulp. Zo ben ik alweer een stukje verder. Nu zou het fijn zijn als ik in de .Body kan verwijzen naar iemand zijn voornaam zodat ik het persoonlijker kan maken. Ik voeg dan in de tabel het veld Voor- en Achternaam toe.
Is er ook een mogelijkheid om de Body in regels te verdelen. Ik weet dat je dat in Excel doet met & vbNewLine & maar ik weet niet of dat ook zo kan in Access.

Met vriendelijke groet,

Reijer.
 
Je kan de body inderdaad met meerdere regels opbouwen. VBA is VBA, dus & en vbNewLine werken gewoon.
 
Het gaat niet helemaal goed

Ik heb de code aangepast in de .Body en het .Subject (dat is voor iedereen hetzelfde). Zoals het nu in de body staat word bij het aanmaken van de e-mails alleen de eerste naam uit mijn tabel gebruikt (Me.FirstName). Hoe moet dat worden zodat hij door het FirstName veld gaat bij het aanmaken van de e-mails?

Groeten Reijer

Option Compare Database

Private Sub btnVerstuur_Click()

Dim rs As Recordset
Dim OutApp As Outlook.Application
Dim OutMail As Outlook.MailItem
Dim OutAtt As Outlook.Attachments

Set rs = CurrentDb.OpenRecordset("tblMail")
Set OutApp = CreateObject("Outlook.Application")

While Not rs.EOF
Set OutMail = OutApp.CreateItem(olMailItem)
Set OutAtt = OutMail.Attachments

With OutMail
.To = rs!To
'.Cc = "iemand@hotmail.com"
.Subject = "Voor Iedereen"
'.Body = rs!Body
.Body = "Beste " & Me.FirstName & "," & vbNewLine & vbNewLine _
& "Hierbij de nieuwe bladmuziek. " & vbNewLine & vbNewLine & "Wil je deze woensdag meenemen." _
& vbNewLine & vbNewLine & "Met vriendelijke groet" & vbNewLine & vbNewLine & _
"Reijer"
OutAtt.Add "C:/iets/" & rs!Attachment
.Display
End With

Set OutMail = Nothing
Set OutAtt = Nothing

rs.MoveNext
Wend

Set OutApp = Nothing
Set rs = Nothing

End Sub
 
Misschien Me.FirstName veranderen in rs!FirstName?

Graag voortaan code tussen tags plaatsen voor de leesbaarheid. Gebruik # in de menubalk van het berichtopmaakvenster.
 
Misschien Me.FirstName veranderen in rs!FirstName?

Graag voortaan code tussen tags plaatsen voor de leesbaarheid. Gebruik # in de menubalk van het berichtopmaakvenster.

Sorry dat zal ik de volgende keer doen. De oplossing is
Code:
& rs![FirstName] &
zo werkt het prima.

Nogmaals bedankt voor je hulp.
 
Rechte haken zijn hier niet nodig; allen bij veldnamen met een spatie. En die vermijd je uiteraard, want zorgen alleen maar voor problemen :).
 
Rechte haken zijn hier niet nodig; allen bij veldnamen met een spatie. En die vermijd je uiteraard, want zorgen alleen maar voor problemen :).

Ik haal ze er tussenuit, spaties gebruik ik inderdaad niet. Bedankt.
 
Ik wil jullie hartelijk bedanken voor de hulp die ik heb gehad. Er is nog 1 deel waar ik niet uit kom. Niet altijd krijgen alle ontvanger een attachment gestuurd, het zou fijn zijn als de lege velden worden overgeslagen zodat alleen de ontvangers met een bijlage een email ontvangen. Ik denk dat het moet met een If ... Then statement maar helaas schiet mijn kennis hierin nog te kort. Ik hoop dat ik nog 1 maal een beroep op jullie mag doen om mij te helpen met deze aanpassing in de code.

Code:
Option Compare Database

Private Sub btnVerstuur_Click()

Dim rs As Recordset
Dim OutApp As Outlook.Application
Dim OutMail As Outlook.MailItem
Dim OutAtt As Outlook.Attachments

Set rs = CurrentDb.OpenRecordset("tblMail")
Set OutApp = CreateObject("Outlook.Application")

While Not rs.EOF
    Set OutMail = OutApp.CreateItem(olMailItem)
    Set OutAtt = OutMail.Attachments

    With OutMail
        .To = rs!To
        .Subject = "Onderwerp"
        .Body = "Goedemorgen " & rs![FirstName] & "," & vbNewLine & vbNewLine _
            & "Hierbij de bijlage. " & vbNewLine & vbNewLine & "Wil je deze afdrukken." _
            & vbNewLine & vbNewLine & "Met vriendelijke groet" & vbNewLine & vbNewLine & _
            "Reijer"
        OutAtt.Add "C:/ergens/" & rs!Attachment

	'Ik denk dat het hier zou moeten komen?
	If 
	rs!Attachment = ""
	Then
	'Kijk in het volgende veld?
	End If
        .Display
    End With
    
    Set OutMail = Nothing
    Set OutAtt = Nothing
    
    rs.MoveNext
Wend

Set OutApp = Nothing
Set rs = Nothing

End Sub
 
Ik denk dat je dan het beste kunt zorgen dat die records niet in de recordset opgenomen worden. Dus:
Code:
Set rs = CurrentDb.OpenRecordset("SELECT * FROM TblMail WHERE NOT IsNull([COLOR=#333333]Attachment[/COLOR])")
 
Ik denk dat je dan het beste kunt zorgen dat die records niet in de recordset opgenomen worden. Dus:
Code:
Set rs = CurrentDb.OpenRecordset("SELECT * FROM TblMail WHERE NOT IsNull([COLOR=#333333]Attachment[/COLOR])")

Dat is snel Peter, dank je wel. Ik neem aan dat de regel die je hebt geschreven op de plaats komt van de huidige "Set rs = CurrentDb.OpenRecordset("tblMail")"?

Nogmaals hartelijk dank.
 
Juiste aanname :thumb:
 
Juiste aanname :thumb:

Dan ben ik eruit zo, super bedankt. Er is nog 1 klein dingetje maar dat is meer een luxe probleem. Het zou leuk zijn als er een mogelijkheid is om het programma te laten bepalen welk dagdeel het is (Ochtend, Middag of Avond) zodat ik in de .Body eel zelf het dagdeel niet meer hoef in te vullen. Maar dat is een wens en geen must. Wat ik nu heb daar kan ik goed mee uit de voeten.

Groeten en bedankt Reijer.
 
Misschien iets met de functies DatePart() en Now()?
 
Bij nader inzien. Klinkt als een leuk idee, maar het moment waarop je een mail verstuurt zegt niets over het moment waarop de ontvanger die leest.......
 
Bij nader inzien. Klinkt als een leuk idee, maar het moment waarop je een mail verstuurt zegt niets over het moment waarop de ontvanger die leest.......

Nee dat is zo, maar het gaat mij om het moment van versturen. In de metadata van de email zie je volgens mij terug op welk tijdstip de email is verzonden en dat is voor mij leidend. In de ochtend verstuurd is "goedemorgen" enz.
 
Toch nog even een vraag? Of moet ik dan een nieuw topic openen? Bij het uitvoeren van het programma liep ik vast omdat de extensie PDF niet compleet was achter een bestand.
Kan dat met een error message worden opgemerkt?
Het 2e was dat ik niet alle e-mails kon versturen daar de provider geen bulkmail toestaat en dus maar een bepaald aantal e-mails verstuurd.
Is het mogelijk om te zien (in een extra veld misschien) welke mails zijn verstuurd?

Alvast weer bedankt.
 
Een nieuw topic is handiger. Niet iedereen kijkt naar afgesloten topics.


  1. In zijn algemeenheid kan je een controle inbouwen om te kijken of het bestand bestaat. De functie Dir() helpt je daarbij. Omdat je meerdere fouten per run kan tegenkomen, kan je misschien beter een ja/nee-veld in je tabel opnemen.
  2. Je kan beter zorgen dat je niet meer mails verstuurt dan toegestaan. Is het aantal per keer of per dag? Je zal de verzending dus in delen op moeten knippen. Door aan de SELECT waar je de recordset mee opbouwt TOP toe te voegen beperk je het aantal records. In pseudocode: SELECT TOP 500 WHERE bijlage ingevuld EN nog niet verzonden.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan