AJUDA COM LACO

NAM4 13/09/2010 11:11:05
#352850
Olá pessoal estou aqui mais uma vez requisitando a ajuda de vocês.

Tenho um codigo de enviar email, e gostaria de enviar email para todos os emails cadastrados numa tabela do sql...

Tenho a tabela Email_Clientes, nela tem os campos Email e Nome

no código de enviar email pensei em fazer um while para pegar esses emails e enviar para todos, porém nao consegui fazer...


seria + - assim:

enviar email para: meuemail1;meuemail2;meuemail3

OBS: estou usando o metodo CDO para enviar email

em linhas curtas, preciso de um modo de buscar todos emails cadastrados na tabela Email_Clientes, e enviar o mesmo email para todos q estao nessa tabela...


obrigado desde ja
THIGO 13/09/2010 11:26:04
#352855
amigo posta sua função de envio ae para nós, creio que o melhor seria o Do while da tabela mesmo.
NAM4 13/09/2010 11:43:26
#352862
Obrigado pela resposta....

o meu código de enviar emails é este:
Citação:


Function EnviaEmail()
[ô]declara variaveis EnviaEmail()
Dim Objeto As CDO.Message
Dim Config As CDO.Configuration
Dim str As String
Dim EmailTO As Variant
Dim sEmailTo As Variant
Dim aEmailTo As Variant


Set Objeto = CreateObject([Ô]cdo.message[Ô])
Set Config = CreateObject([Ô]CDO.Configuration[Ô])

[ô]Configura servidor de SMTP
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/sendusing[Ô]) = 2
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/smtpserver[Ô]) = [Ô]smtp.com.br[Ô]
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/smtpserverport[Ô]) = 25
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/smtpusessl[Ô]) = False [ô]Use SSL for the connection (True or False)
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout[Ô]) = 10
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/smtpauthenticate[Ô]) = 1 [ô]basic (clear-text) authentication
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/sendusername[Ô]) = [Ô]Siss[Ô]
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/sendpassword[Ô]) = [Ô]SSS[Ô]
Objeto.Configuration.Fields.Update

Set Objeto.Configuration = Config

str = vbNullString
[ô]Assunto do Email
Objeto.Subject = [Ô]Carga SQL[Ô]
[ô]Corpo de mensagem
str = [Ô]Um Arquivo de carga não foi importado por completo, verifique a linha <b>[Ô] & iContador + 1 & [Ô]</b>, e rode novamente o programa de Carga de SQL[Ô]
Objeto.HTMLBody = str
[ô]Email de destino
Objeto.To = [Ô]meuemail@meuemail.com.br[Ô]

[ô]Email de envio
Objeto.From = [Ô]emailfrom@email.com.br[Ô]
Objeto.Send
Set Objeto = Nothing
Form1.statusBar.Caption = [Ô]Ocorreu um Erro. Email Enviado[Ô]

End Function



no código acima é uma funçao simples de enviar email, gostaria de saber como poderia fazer para pegar todos os emails da tabela Email_Cliente

e enviar este email para todos dessa tabela

Obrigado


--------------EDIT--------------------

Estava vendo uma forma, e o cara utilizou assim:
Citação:


If (InStr(1, sEmailTo, [Ô];[Ô]) <= 0) Then sEmailTo = sEmailTo & [Ô];[Ô]
aEmailto = Split(sEmailTo, [Ô];[Ô])

For i = 0 To UBound(aEmailto) - 1
oMail.AddRecipient aEmailto(i)
Next



mas nao obtive sucesso
THIGO 13/09/2010 11:59:59
#352866
Amigo nesse ponto de sua função faça isso e veja se da certo

   [ô]Email de envio
[ô]Realiza o select da tabela Email_Cliente

dim RSEmail as new ADODB.Recordset

if rsemail.state <> 0 then rsemail.close

rsemail.open [Ô]Select * from Email_Cliente[Ô], Conexao

[ô]aqui faça seu tratamento de select como querer para verificar se o recordset foi aberto

[ô]Realiza o loop dos emails de cliente

Do While Not rsemail.EOF
Objeto.From = rsemail!Email
Objeto.Send
rsDadosOrigem.MoveNext
Loop

Set Objeto = Nothing
Form1.statusBar.Caption = [Ô]Ocorreu um Erro. Email Enviado[Ô]


Amigo caso não der certo voce terá que fazer na funcao inteira beleza
NAM4 13/09/2010 12:18:45
#352871
THIAGO, primeiramente obrigado pela ajuda,

porém eu testei com esse codigo que vc me passou mas nao obtive sucesso tambem...


nao creio que tenha que fazer na função inteira.

tenho uns exemplos aqui e todos eles utilizam o metodo q eu postei acima, mas n sei porque nao funcionou aqui


obrigado!
OTAVIOFAVERO 13/09/2010 12:29:07
#352872
http://www.vbmania.com.br/pages/index.php?varModulo=Forum&varMethod=abrir&varID=340330&varWorld=
NAM4 13/09/2010 12:35:31
#352873
Otavio,
muito obrigado, mas dessa forma eu consigo fazer, ja que nao envolve o banco de dados...

o meu problema nao é enviar para mutiplos destinatarios... e sim fazer com que esses multiplos destinatarios sejam pegos de um campo do sql...


mas de qualquer forma

vlw mesmo


Aguardo...
THIGO 13/09/2010 13:11:42
#352875
Resposta escolhida
Então faça assim e veja se te ajuda.

[ô]Realiza o select da tabela Email_Cliente

dim RSEmail as new ADODB.Recordset

if rsemail.state <> 0 then rsemail.close

rsemail.open [Ô]Select * from Email_Cliente[Ô], Conexao

[ô]aqui faça seu tratamento de select como querer para verificar se o recordset foi aberto

[ô]Realiza o loop dos emails de cliente

Do While Not rsemail.EOF

Set Objeto = CreateObject([Ô]cdo.message[Ô])
Set Config = CreateObject([Ô]CDO.Configuration[Ô])

[ô]Configura servidor de SMTP
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/sendusing[Ô]) = 2
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/smtpserver[Ô]) = [Ô]smtp.com.br[Ô]
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/smtpserverport[Ô]) = 25
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/smtpusessl[Ô]) = False [ô]Use SSL for the connection (True or False)
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout[Ô]) = 10
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/smtpauthenticate[Ô]) = 1 [ô]basic (clear-text) authentication
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/sendusername[Ô]) = [Ô]Siss[Ô]
Objeto.Configuration.Fields.Item([Ô]http://schemas.microsoft.com/cdo/configuration/sendpassword[Ô]) = [Ô]SSS[Ô]
Objeto.Configuration.Fields.Update

Set Objeto.Configuration = Config

str = vbNullString
[ô]Assunto do Email
Objeto.Subject = [Ô]Carga SQL[Ô]
[ô]Corpo de mensagem
str = [Ô]Um Arquivo de carga não foi importado por completo, verifique a linha <b>[Ô] & iContador + 1 & [Ô]</b>, e rode novamente o programa de Carga de SQL[Ô]
Objeto.HTMLBody = str
[ô]Email de destino
Objeto.To = [Ô]meuemail@meuemail.com.br[Ô]

[ô]Email de envio
[ô]Aqui vai o email retornado do select
Objeto.From = rsEmail!Email
Objeto.Send

rsemail.MoveNext
[ô]Finaliza
Set Objeto = Nothing
Set Config = Nothing
Loop


Amigo coloque um trata erro em sua função caso der de email invalido ou outro problema

flw
NAM4 13/09/2010 13:44:42
#352881
realmente nao funcionou pessoal,

obrigado pelas dicas, vou continuar testando

qualquer novidade eu posto...


THIGO 13/09/2010 13:48:13
#352883
Qual o erro que deu nessa ultima alteração que te passei
NAM4 13/09/2010 13:56:38
#352884
THIGO,

essa forma, faria com que enviasse 1 email independente para cada carinha, com o while... porem nao busca o email do sql.

quando substituo Objeto.To =
fala que nao pode ser usado neste contexto...

de qualquer forma, creio existir algum outro tipo de fazer, pois a maioria dos programinhas q vi por ai, utilizam o metodo que havia dito, não sei como fizeram mas a maioria utiliza assim, Veja o exemplo de uma função de sendmail, esta funcao faz a busca dos emails dentro de uma tabela e coloca no addrecipient do jmail:

Citação:


Function SendEmail(sEmailFrom As Variant, sNameFrom As Variant, sEmailTo As Variant, sNameTo As Variant, sSubject As Variant, sBody As Variant) As Variant
Dim oMail, aNameto, aEmailto, oConst, i, sSmtp, sLogin, sPwd

On Error GoTo ErrorHandler

If (InStr(1, sNameTo, [Ô];[Ô]) <= 0) Then sNameTo = sNameTo & [Ô];[Ô]
If (InStr(1, sEmailTo, [Ô];[Ô]) <= 0) Then sEmailTo = sEmailTo & [Ô];[Ô]

aNameto = Split(sNameTo, [Ô];[Ô])
aEmailto = Split(sEmailTo, [Ô];[Ô])
[ô]sSmtp =[Ô]smtp.com.br[Ô]
sSmtp = [Ô]smtp.com.br
sLogin = [Ô]ssi[Ô]
sPwd = [Ô]sss[Ô]
sEmailFrom = sLogin

Select Case (GetFromINI([Ô]SOFTWARE[Ô], [Ô]EMAIL[Ô], [Ô]JMAIL[Ô], oConst.getFilesPathCOM & [Ô]Config.INI[Ô]))
Case [Ô]JMAIL[Ô]
Set oMail = CreateObject([Ô]jmail.message[Ô])
oMail.Silent = True
oMail.Logging = True
oMail.From = sEmailFrom
oMail.FromName = sNameFrom
For i = 0 To UBound(aEmailto) - 1
oMail.AddRecipient aEmailto(i), aNameto(i)
Next
oMail.Subject = sSubject
oMail.HTMLBody = sBody

oMail.MailServerUserName = sLogin
oMail.MailServerPassWord = sPwd

If (oMail.send(sSmtp)) Then
SendEmail = True
Else
SendEmail = False
sErro = oMail.Log
End If
Set oMail = Nothing
End Select

Exit Function
ErrorHandler:
sErro = sErro & [Ô]SYS.Utilities.SendEmail =>[Ô] & Err.Source & [Ô]->[Ô] & Err.Description
SendEmail = False
End Function



este sendmail funciona perfeitamente em um outro programinha que um outro desenvolvedor aqui da empresa fez,

ele faz um separador para os emaisl que vao receber, exemplo:
oMail.AddRecipient aEmailto(i), aNameto(i)
seria como ficasse assim:
oMail.AddRecipient meuemail1,MeuNome;meuemail2,MeuNome2;meuemail3,MeuNome3.....

onde teria o ; (ponto e virgula) separa o conjunto de email e nome de cada pessoa que esta no banco....


abraços


--------------------------------------------EDIT--------------------------------------------
Bom pessoal, depois de muita porrada, eu consegui fazer funcionar, deixo aqui o método que utilizei =)

Citação:


Dim oRs as Object
Dim sEmails as variant
Set oRs = con.Execute([Ô]select Email_Cliente from Tabela_Emails[Ô])
If Not oRs.EOF Then
While Not oRs.EOF
sEmails = sEmails & oRs(0) & [Ô];[Ô]
oRs.MoveNext
Wend
Objeto.To = sEmails
End If



quem utilizar pode verificar que a cada while a variavel sEmails, recebe + 1 valor de email, separado por ; (ponto e virgula), e no final do while a variavel ficara como eu precisava:

se colocar um MsgBox podera ver assim:

MsgBox sEmails
aparecerá:

meuemail1;meuemail2;meuemail3;meuemail4; e assim por diante...

ai atribuimos esta variavel sEmails ao .TO do send email

Objeto.To = sEmails, que se teoricamente ficaria assim:
Objeto.To = [Ô]meuemail1;meuemail2;meuemail3;meuemail4;[Ô]


Abraços

Closed
Tópico encerrado , respostas não são mais permitidas