criquio 26/10/2011, 21:10
Vou passar uma forma de se fazer isso. Coloque a função abaixo no cabeçalho do módulo vba do seu formulário logo abaixo da linha Option Compare Database:
Sub EnviarEmail()
On Error GoTo TErro
Dim Mens As Object
Dim Config As Object
Set Mens = CreateObject("CDO.Message")
Set Config = CreateObject("CDO.Configuration")
With Config
.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465
.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Fields("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Fields("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
.Fields("http://schemas.microsoft.com/cdo/configuration/sendusername") = "usuario@gmail.com"
.Fields("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "SuaSenha"
.Fields("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
.Fields.Update
End With
Set Mens = New CDO.Message
With Mens
Set .Configuration = Config
.From = "Seu nome aqui"
.Sender = "Seu email"
.ReplyTo = "Email de resposta"
.BodyPart.Charset = "utf-8"
.Subject = "Assunto"
.HTMLBody = "Aqui a mensagem a ser enviada."
End If
.To = rs!CampoDoEmail
End With
Set Mens = Nothing
Set Config = Nothing
TErro:
If Err.Number = 13 Then
Resume Next
ElseIf Err.Number = -2147220979 Then
DoCmd.Close acForm, "frmProgresso"
MsgBox "Você inseriu um endereço de email inválido ou inexistente." & vbCrLf & "Verifique o email e tente novamente.", vbOKOnly + vbCritical, "Email inválido"
DoCmd.Close acForm, "frmFinalizar"
Me.txtPara.SetFocus
Else
Resume Next
End If
End Sub
Agora, no evento "Ao carregar" do formulário, iremos abrir um Recordset filtrado pelo intervalo de data pretendido. Será feita uma pesquisa na tabela, nos registros que satisfaçam esse intervalo. Se o total de registro for maior que zero, será enviado um email a todos os encontrados:
Dim rs As Recordset
Set rs = CurrentDb.OpenRecordset("SELECT CampoDoEmail FROM NomeDaTabela WHERE CampoDaData='" & DateAdd("d", -30, Date) & "'")
If rs.RecorCount > 0 Then
Do While Not rs.EOF
Call EnviarEmail
rs.MoveNext
Loop
Else
End If
rs.Close
Set rs = Nothing
Observe os nomes em vermelho. Eles deverão ser alterados de acordo o provedor do seu email. Aqui tem dicas de como fazer isso. Os campos em verde será aonde você colocará os dados a serem enviados, elem de outros detalhes para os quais tambem contem dica no endereço do link acima.
OBS.: O sistema fica aberto ou será aberto todos os dias, incluindo sábados, domingos e feriados? Porque se ele ficar sem ser aberto em algum dia, terá que mudar um pouquinho o esquema, criando um campo na tabela para dizer se o email já foi enviado ou não, para quando abrir, depois dos 30 dias ou faltando uns 3 dias para completar, por exemplo, saber para quem deveria ter sido enviado mais ainda não foi. Tambem seria interessante incluir uma função para checar se a net está conectada ou não. Senão coloca como enviado sem ter sido, caso a net esteja fora do ar.