JavaMail, enviar com mais de um destinatário

10 respostas
rockstorm

Bom dia,
Gostaria de saber se é possivel enviar um email numa interface web para mais de um destinatario utilizando a API JavaMail.

Eu estava pensando em armazenar os email de clientes da empresa em um Array ou alguma coisa do tipo.

Meu codigo esta assim:

MimeMessage msg = new MimeMessage(session);
			    msg.setFrom(new InternetAddress(from));
			    InternetAddress[] address = {new InternetAddress(to)};
			    msg.setRecipients(Message.RecipientType.TO, address);
			    msg.setSubject(subject);

onde to é o endereço que estou enviando.

grato

10 Respostas

T

frosemberg:
se é possivel enviar um email numa interface web para mais de um destinatario utilizando a API JavaMail.

É.

Falando em termos puramente empresariais (não técnicos): melhor mandar um email de cada vez. Há grandes problemas ao mandar um email para vários clientes de uma vez:

  • Muitos clientes (no filtro de spam do servidor de email corporativo) barram emails que têm muitos destinatários (digamos mais que três) porque normalmente costumam ser spam;

  • Meu cliente (que pode ser meu concorrente em outras áreas) poderia saber que tenho outros clientes - afinal de contas o email está disponível para ele ver !

  • E seu email deve ser personalizado - nada mais desagradável que um email que não tem uma saudação personalizada do tipo “Caro Sr. XXX”.

O correto é mandar um email de cada vez (use um loop). Pode levar um pouquinho mais de tempo para mandar um de cada vez, mas é mais garantido e mais elegante. OK?


Meu codigo esta assim:

MimeMessage msg = new MimeMessage(session);
			    msg.setFrom(new InternetAddress(from));
			    InternetAddress[] address = {
     new InternetAddress(to[0]),
    new InternetAddress (to[1], // basta construir um array de InternetAddress
    ...};
			    msg.setRecipients(Message.RecipientType.TO, address);
			    msg.setSubject(subject);

grato

otaviofcs

Se o seu email não for personalizado, use BCC ao invés de TO (na verdade, no TO use um e-mail seu).

Outra coisa é que é importante saber onde está o seu servidor de e-mail. Se ele não for da sua rede a velocidade de envio pode ser um fator problemático. Nesse caso eu utilizaria um gerenciador de filas para tratar do envio de forma assíncrona.

abraços,

otávio

T

A dica é boa, mas muitos servidores de email consideram mensagens construídas dessa maneira (com N destinatários no BCC e o TO = FROM) como spam.

Outra dica que dou: a menos que você seja uma empresa muito grande (como o Banco do Brasil ou a Caixa Econômica, que são já cadastradas pelos principais provedores do Brasil), evite mandar muitos emails de uma vez, e os mande desordenados por domínio.
Se os endereços de email estiverem ordenados por domínio, você pode ser barrado (o que pode ocorrer se você mandar mensagens para todos os seus clientes da mesma empresa - digamos que você mande 1000 mensagens para 1000 gerentes de 500 lojas das Casas Pernambucanas: [email removido], [email removido] etc. )
Mesmo que todos os endereços sejam válidos, os provedores de email costumam barrar essas coisas porque parecem suspeitamente com uma tentativa de acertar, por tentativa e erro, um endereço válido de email.

rockstorm

O que acontece,
Eu tenho que enviar um email para 3 enderecos…somente 3.
Só que um deles é generico. Se eu mandar um de cada vez, este generico vai ser enviado 3 vezes…por isso eu precisaria enviar de uma vez só.

T

De qualquer maneira, já dei a solução:

Em vez de InternetAddress[] address = { new InternetAddress (to) } , use
algo parecido com:

InternetAddress[] address = {
      new InternetAddress(to[0]),
     new InternetAddress (to[1]), // basta construir um array de InternetAddress
     ...};

Mesmo assim eu só acho interessante que um email tenha mais de um destinatário se:

  • Ele for um email que você vai mandar para dentro de sua empresa;
  • Ele tenha um “CC:” para quem realmente importa - como você deve bem saber, o “CC:” é mais importante que o “TO:” dentro de empresas grandes.
rockstorm

A ideia foi boa, mas estou com um erro estranho aqui.

eu fiz um for assim:

String teste[] = {"[email removido]","[email removido]","[email removido]"};
for(int i=0;i&lt=teste.length;i++){
//metodo que envia o email
}

ele esta enviando somente o primeiro dos emails do array e estourando um erro:

class javax.mail.SendFailedException: 553 sorry, that domain isn’t in my list of allowed rcpthosts (#5.7.1)

o que pode ser?

T

Isso (erro 553) é um erro de seu servidor SMTP indicando que não pode enviar email para teste.com.

Veja com o administrador de sua rede um endereço de um servidor SMTP válido e de endereços de email válidos para você fazer testes.

rockstorm

Resolvi este problema…o qe nao estou conseguindo fazer e mandar mais de um email…
Estou ja fiz de tudo…

Estou tendo que fazer assim:

InternetAddress[] address = {new InternetAddress(to)};
			    msg.setRecipients(Message.RecipientType.TO, address);
			    InternetAddress[] ende = {new InternetAddress(copia1)};
			    msg.setRecipients(Message.RecipientType.CC, ende);
			    InternetAddress[] ende2 = {new InternetAddress(copia2)};
			    msg.setRecipients(Message.RecipientType.BCC, ende2);
msg.setSubject(subject);

Ele so manda os dois primeiros…o BCC nao vai…
como faco para adicionar outro CC (com copia)??/
grato

T

Acho que você não entendeu o que é esta expressão entre chaves. Isto:

InternetAddress[] address = {new InternetAddress(to)};

é o sinônimo disto:

InternetAddress[] address = new InternetAddress[1];
  address [0] = new InternetAddress(to);

Ou seja, se você quer ter 2 destinatários no TO, por exemplo, você pode usar, por exemplo:

InternetAddress[] address = {
    new InternetAddress(to),
    new InternetAddress (to2)
};

que é a mesma coisa que:

InternetAddress[] address = new InternetAddress[2];
  address [0] = new InternetAddress(to);
  address [1] = new InternetAddress(to2);
rockstorm

thingol,
Era isso mesmo…
Muito obrigado…
Nao vou mais esquecer…

grato a todos…

Criado 11 de junho de 2007
Ultima resposta 11 de jun. de 2007
Respostas 10
Participantes 3