segunda-feira, 7 de outubro de 2013

Vários destinatários!

Mais uma para envio de emails, desculpa se o tema está meio recorrente, mas vamos aos poucos encerrando este assunto.

Outra necessidade que temos para o envio de emails é a opção de enviar para mais de um destinatário, na opção TO, BC, ou BCC, o que é plenamente possível, visto que temos nestas operações uma função Add(), que possibilita criar uma coleção de itens.

Recebi recentemente no Genexando um trecho de código que achei bem interessante e simples para implementar esse mecanismo, espero que o Antonio não fique bravo por explorarmos um pouco essa ideia, mudei um poucoe implementei uma collection ao invés de vetor.

Na estrutura do envio de emails, incluímos apenas uma sub rotina auxiliar que inclui os emails destinatários, que chamamos de 'incluidestinatarios'

Event Start 
    &smtpsession.Host            = 'smtp.gmail.com'
    &smtpsession.Port            = 465
    &smtpsession.Secure          = 1
    &smtpsession.Authentication  = 1
    &smtpsession.UserName        = '* usuario (email) *'
    &smtpsession.Password        = '* senha *'     
    &smtpsession.Sender.Address  = '* email de envio *'
    &smtpsession.Sender.Name     = '* nome  *'
       
    &smtpsession.Login()
    if &smtpsession.ErrCode <> 0
        msg(&smtpsession.ErrDescription)
    else
        &mailmessage.Text     = 'texto da mensagem'
        &mailmessage.Subject   ='titulo'
        
        do 'incluidestinatarios'
                  &smtpsession.Send(&mailmessage)
        msg(&smtpsession.ErrDescription)
    endif
   
EndEvent

Nessa rotina o que temos é o acesso a uma certa tabela de Clientes, que filtramos em um determinado Pais, e a construção de uma coleção de emails. Esse modelo é bem interessante pois não precisamos dimensionar a coleção antes de começar a carregá-la.  É um bom substituto para um vetor.


Sub 'incluidestinatarios'
    // carga dos emails, segundo uma condição
    for each
    where PaisNome='Brasil'
        &emails.Add(
ClienteEmail)
    endfor
 
    &mailmessage.To.Clear()
    for &email in &emails
       &mailrecipient.Address      = &email
       &mailrecipient.Name         = &email
       &mailmessage.To.Add(&mailrecipient)
    enddo 

EndSub 


São dois os detalhes para manipulação desta coleção, a variável &email e a &emails que são declaradas com Char(200), e a última marcada como Collection. Em seguida um for...in para recuperar os dados desta coleção.

Utilize com cautela isso hein! não vá me mandar um monte de spams.