Olá Senhores, preciso de auxilio. Estou tentando fazer com que o meu código java envie e-mail com endereços que estão em uma lista em “.txt”. O e-mail eu consigo enviar, o que não estou conseguindo é ler a lista e colocar o endereço destinatário. Alguém pode me ajudar, por favor?
Enviar E-mail com o JAVA a partir de uma lista em .txt [RESOLVIDO]
23 Respostas
Oi,
antes de mais nada adicione seu código entre as tags code. Particularmente, nem sequer analisei ele porque não tem condições.
Sobre sua necessidade, aconselho a ler o arquivo TXT, pegar o e-mail que quer e salvar em uma lista.
Feito isso, use-e em um laço de repetição no qual irá enviar e-mail enquanto houver registros nessa lista, sendo que cada posição dela guarda um e-mail de destinatário. Acredito que seja bem simples, tendo em vista que já tens a parte de envio de e-mail implementada.
Abraços.
O Código:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class sendEmail {
public static void enviarEmail(String de, String para, String assunto, String msg)
throws MessagingException {
Properties props = System.getProperties();
// importante: Setando o host smtp
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", "smtp.ibrap.ind.br");
props.put("mail.smtp.auth", "true");
Authenticator auth = new Authenticator(){
public PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication("[email removido]", "senha");
}
};
Session session = Session.getDefaultInstance(props, auth);
// opcional: habilitando o debug
session.setDebug(true);
// criando a mensagem
Message mensagem = new MimeMessage(session);
// remente
InternetAddress addressFrom = new InternetAddress(de);
Address to = new InternetAddress();
mensagem.setFrom(addressFrom);
mensagem.setSubject(assunto);
mensagem.setContent(msg, "text/html;charset=ISO-8859-1");
// para texto normal use "text/plain;charset=ISO-8859-1"
// você pode mudar o charset também
to = new InternetAddress(para);
mensagem.addRecipient(Message.RecipientType.TO, to);
Transport.send(mensagem);
}
public class LerArquivo {
void leArquivo(String to){ //metodo que le o arquivo texto
try {
File arquivo = new File("C:/Documents and Settings/Filipe/Desktop/listaemail.txt");
FileReader fileReader = new FileReader(arquivo);
BufferedReader buffer = new BufferedReader(fileReader);
String line = buffer.readLine();
while (line != null) {
System.out.println(line);
line = buffer.readLine();
to = line;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args, String to ) throws MessagingException {
sendEmail.enviarEmail("[email removido]", ""+ to , "teste", "Email de teste com programa JAVA");
}
}
Ok Nel, obrigado pela resposta ...
Mas como eu faço para pegar do .txt e colocar numa lista ?
De nada.
No GUJ tem um Tutorial sobre Arquivos.
Ele ensina como manipular arquivos e isso inclui sua leitura. Dá uma olhada que será bem útil.
Abraços.
Consegui manipular o arquivo .txt e coloquei em uma lista, porém, na hora de enviar o email utilizando o conteudo das variáveis não está dando certo ... Alguém pode me ajudar ??
o Código:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class EnviarEmail{
public static void main(String[] args) throws MessagingException{
Properties props = System.getProperties();
// importante: Setando o host smtp
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", "smtp.ibrap.ind.br");
props.put("mail.smtp.auth", "true");
Authenticator auth = new Authenticator(){
public PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication("[email removido]", "2010fasc9951");
}
};
Session session = Session.getDefaultInstance(props, auth);
// opcional: habilitando o debug
session.setDebug(true);
// criando a mensagem
Message mensagem = new MimeMessage(session);
InternetAddress emissor = new InternetAddress("[email removido]");
Address destino = new InternetAddress();
mensagem.setFrom(emissor);
String assunto = "Assunto";
mensagem.setSubject(assunto);
String msg = "Corpo da Mensagem";
mensagem.setContent(msg, "text/html;charset=ISO-8859-1");
mensagem.addRecipient(Message.RecipientType.TO, destino);
Transport.send(mensagem);
ArrayList<String> listaEmail = new ArrayList<String>();
int tam=0;
try {
BufferedReader in = new BufferedReader(new FileReader("C:/Documents and Settings/Filipe/Desktop/listaemail.txt"));
String linha;
while((linha = in.readLine()) != null){
System.out.println(linha);
listaEmail.add(linha);
linha = listaEmail.set(tam, linha);
sendEmail.enviarEmail(emissor, destino , assunto , msg);
}
tam=listaEmail.size();
System.out.println(tam);
in.close();
}
catch (IOException e){
// possiveis erros são tratatos aqui
}
System.exit(0);
}
}
Oi.
Veja esse trecho:
ArrayList<String> listaEmail = new ArrayList<String>();
int tam=0;
try {
BufferedReader in = new BufferedReader(new FileReader("C:/Documents and Settings/Filipe/Desktop/listaemail.txt"));
String linha;
while((linha = in.readLine()) != null){
System.out.println(linha);
listaEmail.add(linha);
linha = listaEmail.set(tam, linha);
sendEmail.enviarEmail(emissor, destino , assunto , msg);
}
tam=listaEmail.size();
System.out.println(tam);
Dessa forma você não precisa nem usar a Lista, eu achei que você fosse enviar a lista de outra classe para a que envia e-mail ou algo do tipo.
Mas se vai fazer tudo na mesma classe, não precisa dela. Outro detalhe, não entendi porque você usa o set da List ou algo do tipo, mas enfim.
Conte-nos, está havendo exceção? Se sim, deves postar a stacktrace.
sendEmail.enviarEmail(emissor, destino , assunto , msg);
linha = destino;
está sublinhado em vermelho "destino" ....
Quando tiro as váriáveis da linha:sendEmail.enviarEmail(emissor, destino , assunto , msg);
sendEmail.enviarEmail("[email removido]", "[email removido]", "assunto" , "msg");
DEBUG: setDebug: JavaMail version 1.4.4
Exception in thread "main" java.lang.NullPointerException
at javax.mail.internet.InternetAddress.lengthOfFirstSegment(InternetAddress.java:479)
at javax.mail.internet.InternetAddress.toString(InternetAddress.java:462)
at javax.mail.internet.InternetAddress.toString(InternetAddress.java:426)
at javax.mail.internet.MimeMessage.addAddressHeader(MimeMessage.java:727)
at javax.mail.internet.MimeMessage.addRecipients(MimeMessage.java:637)
at javax.mail.Message.addRecipient(Message.java:400)
at EnviarEmail.main(EnviarEmail.java:44)
ArrayList<String> listaEmail = new ArrayList<String>();
int tam=0;
int i=0;
try {
//le o arquivo .txt
BufferedReader in = new BufferedReader(new FileReader("C:/Documents and Settings/Filipe/Desktop/listaemail.txt"));
String linha;
while((linha = in.readLine()) != null){
System.out.println(linha);
listaEmail.add(linha);
//destino recebe a leitura
linha = destino;
//envia
sendEmail.enviarEmail(emissor, destino , assunto , msg);
i = i+1;
}
tam=listaEmail.size();
System.out.println(tam);
in.close();
O erro de NullPointer é por causa disso:
Address destino = new InternetAddress();
Criou um Address sem IP, sem localização.
As outras linhas em vermelho é porque tu espera uma String e está enviando um objeto Address, o mesmo serve para linha = destino.
Fique atento aos tipos, revise com calma seu código e se a dúvida persistir, envia o seu código COMPLETO.
Desculpe, mas realmente não estou conseguindo, olhe meu código para ver o que acontece:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class EnviarEmail{
public static void main(String[] args) throws MessagingException{
Properties props = System.getProperties();
// importante: Setando o host smtp
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", "smtp.ibrap.ind.br");
props.put("mail.smtp.auth", "true");
Authenticator auth = new Authenticator(){
public PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication("[email removido]", "senha");
}
};
Session session = Session.getDefaultInstance(props, auth);
// opcional: habilitando o debug
session.setDebug(true);
// criando a mensagem
Message mensagem = new MimeMessage(session);
InternetAddress emissor = new InternetAddress();
Address destino = new InternetAddress();
mensagem.setFrom(emissor);
String assunto = "Assunto";
mensagem.setSubject(assunto);
String msg = "Corpo da Mensagem";
mensagem.setContent(msg, "text/html;charset=ISO-8859-1");
mensagem.addRecipient(Message.RecipientType.TO, destino);
Transport.send(mensagem);
ArrayList<String> listaEmail = new ArrayList<String>();
int tam=0;
int i=0;
try {
BufferedReader in = new BufferedReader(new FileReader("C:/Documents and Settings/Filipe/Desktop/listaemail.txt"));
String linha;
while((linha = in.readLine()) != null){
System.out.println(linha);
listaEmail.add(linha);
linha = destino;
sendEmail.enviarEmail(emissor, destino , assunto , msg);
i = i+1;
}
tam=listaEmail.size();
System.out.println(tam);
in.close();
}
catch (IOException e){
// possiveis erros são tratatos aqui
}
System.exit(0);
}
}
Tu não postou o código completo parceiro.
De duas uma, ou não está completo ou tu está fazendo as pressas e se perdendo.
Tem essa linha no código que acabou de postar:
sendEmail.enviarEmail(emissor, destino , assunto , msg);
Cadê o método enviarEmail?
E outra, se ele for um método estático, ele pertence a classe e não a uma instância, portanto, o correto é invocar assim:
Nomedaclasse.enviarEmail(...)
Então poste o código completo que tens ok?
E repito, se esse é o código completo, tu fez as pressas e está invocando método inexistente entre outros 
E não atribui a linha que está percorrendo um valor, ela já recebe um valor no while, que realiza a leitura do arquivo, não faça isso.
Amigo, não consegui de jeito nenhum enviar para todos usuarios da minha lista .txt, o codigo abaixo é o código inteiro que estou trabalhando, não existe outra classe além destas:
import javax.mail.*;
import javax.mail.internet.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;
public class email {
public class SMTPAuthenticator extends Authenticator {
public PasswordAuthentication getPasswordAuthentication() {
String username = "[email removido]";
String password = "senha";
return new PasswordAuthentication(username, password);
}
}
public void sendSimpleMail(
String mailServer,
String subject,
String to,
String from,
String mensagem)
throws AddressException, MessagingException {
Properties mailProps = new Properties();
//definição do mailserver
mailProps.put("mail.smtp.host", mailServer);
Authenticator auth = new SMTPAuthenticator();
Session mailSession = Session.getDefaultInstance(mailProps, auth);
mailProps.put("mail.smtp.auth", "false");
//As duas linhas seguintes de código, colocam no
//formato de endereços,
//supostamente válidos, de email os dados
//passados pelos parâmetros to e from.
InternetAddress destin = new InternetAddress();
InternetAddress remet = new InternetAddress();
//As duas linhas de código a seguir, são
//responsáveis por setar os atributos e
//propriedas necessárias do objeto message
//para que o email seja enviado.
//inicialização do objeto Message
Message message = new MimeMessage(mailSession);
//Definição de quem está enviando o email
message.setFrom(remet);
//define o(s) destinatário(s) e qual o tipo do
//destinatário.
//os possíveis tipos de destinatário: TO, CC, BCC
message.setRecipient(Message.RecipientType.TO, destin);
//definição do assunto do email
message.setSubject(subject);
//definição do conteúdo da mesnagem e do
//tipo da mensagem
message.setContent(mensagem.toString(), "text/html");
//a linha de código seguinte é a responsável
//pelo envio do email
Transport.send(message);
}
public static void main(String args[]) throws AddressException, MessagingException{
email email = new email();
try {
BufferedReader in = new BufferedReader(new FileReader("C:/Documents and Settings/Filipe/Desktop/listaemail.txt"));
String linha;
while((linha = in.readLine()) != null){
System.out.println(linha);
email.sendSimpleMail("smtp.ibrap.ind.br", "TESTE", linha,
"Assunto", "Corpo de Teste");
}
in.close();
}
catch (IOException e){
// possiveis erros são tratatos aqui
}
}
}
Beleza!
Agora me fala, com o código completo, está gerando exceção?
E tu não está setando os valores do from e do to.
Como eu faço para setar os valores do from e do to ?
Este é realmente meu problema agora, neste trecho do código:
public static void main(String args[]) throws AddressException, MessagingException{
email email = new email();
try {
BufferedReader in = new BufferedReader(new FileReader("C:/Documents and Settings/Filipe/Desktop/listaemail.txt"));
String linha;
while((linha = in.readLine()) != null){
System.out.println(linha);
email.sendSimpleMail("smtp.ibrap.ind.br", "TESTE", "[email removido]", "Assunto", "Corpo de Teste");
}
in.close();
}
catch (IOException e){
// possiveis erros são tratatos aqui
}
}
Dentro do while quando vou enviar o e-mail email.sendSimpleMail("smtp.ibrap.ind.br", "TESTE", "[email removido]", "Assunto", "Corpo de Teste"); não consigo setar
no lugar de "[email removido]" que a variavel to seja o destinatário, somente se eu colocar manual e-mail por e-mail.
Quando faço email.sendSimpleMail("smtp.ibrap.ind.br", "TESTE", to , "Assunto", "Corpo de Teste"); o java apresenta esta mensagem:
IWAV0048I Java Bean email started with null constructor
Oi
Veja:
InternetAddress destin = new InternetAddress();
InternetAddress remet = new InternetAddress();
Tu não passou nada no construtor do InternetAddress.
Tu tem que passar ali o e-mail de origem e o de destino.
Se tu não preencher isso, ele não tem como adivinhar.
O e-mail de origem ao que eu vi é fixo e o de destino é o que tu passa para o método, algo como:
InternetAddress remet = new InternetAddress("[email removido]");
InternetAddress destin = new InternetAddress(destino);
Sendo que destino é a String que representa o e-mail de destino.
Faça essas alterações, teste e poste os resultados e o código completo, mesmo se houver exceção.
Certo, fiz as alterações. Mas continua apresentando a mensagem IWAV0048I Java Bean email started with null constructor
Olhe o código :
import javax.mail.*;
import javax.mail.internet.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;
public class email {
public class SMTPAuthenticator extends Authenticator {
public PasswordAuthentication getPasswordAuthentication() {
String username = "[email removido]";
String password = "senha";
return new PasswordAuthentication(username, password);
}
}
public void sendSimpleMail(
String mailServer,
String subject,
String to,
String from,
String mensagem)
throws AddressException, MessagingException {
Properties mailProps = new Properties();
//definição do mailserver
mailProps.put("mail.smtp.host", mailServer);
Authenticator auth = new SMTPAuthenticator();
Session mailSession = Session.getDefaultInstance(mailProps, auth);
mailProps.put("mail.smtp.auth", "false");
String destino = null;
//As duas linhas seguintes de código, colocam no
//formato de endereços,
//supostamente válidos, de email os dados
//passados pelos parâmetros to e from.
InternetAddress remet = new InternetAddress("[email removido]");
InternetAddress destin = new InternetAddress(destino);
//As duas linhas de código a seguir, são
//responsáveis por setar os atributos e
//propriedas necessárias do objeto message
//para que o email seja enviado.
//inicialização do objeto Message
Message message = new MimeMessage(mailSession);
//Definição de quem está enviando o email
message.setFrom(remet);
//define o(s) destinatário(s) e qual o tipo do
//destinatário.
//os possíveis tipos de destinatário: TO, CC, BCC
message.setRecipient(Message.RecipientType.TO, destin);
//definição do assunto do email
message.setSubject(subject);
//definição do conteúdo da mesnagem e do
//tipo da mensagem
message.setContent(mensagem.toString(), "text/html");
//a linha de código seguinte é a responsável
//pelo envio do email
Transport.send(message);
}
public static void main(String args[], String destino) throws AddressException, MessagingException{
email email = new email();
try {
BufferedReader in = new BufferedReader(new FileReader("C:/Documents and Settings/Filipe/Desktop/listaemail.txt"));
String linha;
while((linha = in.readLine()) != null){
System.out.println(linha);
destino = linha;
email.sendSimpleMail("smtp.ibrap.ind.br", "TESTE", destino ,"Assunto", "Corpo de Teste");
}
in.close();
}
catch (IOException e){
// possiveis erros são tratatos aqui
}
}
}
Olha o que você fez:
String destino = null;
//As duas linhas seguintes de código, colocam no
//formato de endereços,
//supostamente válidos, de email os dados
//passados pelos parâmetros to e from.
InternetAddress remet = new InternetAddress("[email removido]");
InternetAddress destin = new InternetAddress(destino);
destino null amigo? Complica dai.
O seu destino é a variavél 'to' que tu passa quando lê o arquivo!
Então deve ser:
InternetAddress destin = new InternetAddress(to);
Se o erro persistir, posta a stacktrace completa.
Sim, mas continua apresentando somente esta mensagem: IWAV0048I Java Bean email started with null constructor
O código alterado:
import javax.mail.*;
import javax.mail.internet.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
public class email {
public class SMTPAuthenticator extends Authenticator {
public PasswordAuthentication getPasswordAuthentication() {
String username = "[email removido]";
String password = "senha";
return new PasswordAuthentication(username, password);
}
}
public void sendSimpleMail(
String mailServer,
String subject,
String to,
String from,
String mensagem)
throws AddressException, MessagingException {
Properties mailProps = new Properties();
//definição do mailserver
mailProps.put("mail.smtp.host", mailServer);
Authenticator auth = new SMTPAuthenticator();
Session mailSession = Session.getDefaultInstance(mailProps, auth);
mailProps.put("mail.smtp.auth", "false");
//As duas linhas seguintes de código, colocam no
//formato de endereços,
//supostamente válidos, de email os dados
//passados pelos parâmetros to e from.
InternetAddress remet = new InternetAddress("[email removido]");
InternetAddress destin = new InternetAddress(to);
//As duas linhas de código a seguir, são
//responsáveis por setar os atributos e
//propriedas necessárias do objeto message
//para que o email seja enviado.
//inicialização do objeto Message
Message message = new MimeMessage(mailSession);
//Definição de quem está enviando o email
message.setFrom(remet);
//define o(s) destinatário(s) e qual o tipo do
//destinatário.
//os possíveis tipos de destinatário: TO, CC, BCC
message.setRecipient(Message.RecipientType.TO, destin);
//definição do assunto do email
message.setSubject(subject);
//definição do conteúdo da mesnagem e do
//tipo da mensagem
message.setContent(mensagem.toString(), "text/html");
//a linha de código seguinte é a responsável
//pelo envio do email
Transport.send(message);
}
public static void main(String args[], String to) throws AddressException, MessagingException{
email email = new email();
try {
BufferedReader in = new BufferedReader(new FileReader("C:/Documents and Settings/Filipe/Desktop/listaemail.txt"));
String linha;
while((linha = in.readLine()) != null){
System.out.println(linha);
to = linha;
email.sendSimpleMail("smtp.ibrap.ind.br", "TESTE", to ,"Assunto", "Corpo de Teste");
}
in.close();
}
catch (IOException e){
// possiveis erros são tratatos aqui
}
}
}
Pode ser problema de sessão e/ou teu servidor de e-mail.
Essa linha:
Session mailSession = Session.getDefaultInstance(mailProps, auth);
Altera para:
Session mailSession = Session.getInstance(mailProps, auth);
E essa:
mailProps.put("mail.smtp.auth", "false");
Para
mailProps.put("mail.smtp.auth", "true");
O resto mantém igual.
Mas porque envia email quando seto um endereço de email manualmente no lugar de to ?
Mas porque envia email quando seto um endereço de email manualmente no lugar de to ?
Ah meu camarada, dá um System.out.prinln() porque provavelmente deve estar indo nulo esse endereço!
Senão está nulo pode estar vazio! Veja o e-mail que está tentando enviar.
Encontrei este aviso:
Keybinding conflicts occurred. They may interfere with normal accelerator operation.
A exceção do rastreio da pilha não está disponível.
Fala Filipe Sartor.
Brother se quando você seta o email manualmente é enviado, so pode ser uma coisa.
Na hora em que “to” recebe o email do arquivo, está vindo mal formatado, ou com excesso de espaços…
Debbuga este trecho do código e certifica-se de como é recebido o email.
Abraços.
Deu certo Nobres colegas, realmente a variável to estava passando vazia.
Muito obrigado pela ajuda!
Abraço!
segue código abaixo:
import javax.mail.*;
import javax.mail.internet.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
public class EnviaEmail {
private static String to;
private static String mensagem;
public class SMTPAuthenticator extends Authenticator {
public PasswordAuthentication getPasswordAuthentication() {
String username = "[email removido]";
String password = "senha";
return new PasswordAuthentication(username, password);
}
}
public void sendSimpleMail(
String mailServer,
String subject,
String to,
String from,
String mensagem)
throws AddressException, MessagingException {
Properties mailProps = new Properties();
//definição do mailserver
mailProps.put("mail.smtp.host", mailServer);
Authenticator auth = new SMTPAuthenticator();
Session mailSession = Session.getInstance(mailProps, auth);
mailProps.put("mail.smtp.auth", "true");
//As duas linhas seguintes de código, colocam no
//formato de endereços,
//supostamente válidos, de email os dados
//passados pelos parâmetros to e from.
InternetAddress remet = new InternetAddress("[email removido]");
InternetAddress destin = new InternetAddress(to);
//As duas linhas de código a seguir, são
//responsáveis por setar os atributos e
//propriedas necessárias do objeto message
//para que o email seja enviado.
//inicialização do objeto Message
Message message = new MimeMessage(mailSession);
//Definição de quem está enviando o email
message.setFrom(remet);
//define o(s) destinatário(s) e qual o tipo do
//destinatário.
//os possíveis tipos de destinatário: TO, CC, BCC
message.setRecipient(Message.RecipientType.TO, destin);
//definição do assunto do email
message.setSubject("Férias Coletivas IBRAP/ESAF");
//definição do conteúdo da mesnagem e do
//tipo da mensagem
message.setContent(mensagem.toString(), "text/html;charset=ISO-8859-1");
//a linha de código seguinte é a responsável
//pelo envio do email
Transport.send(message);
}
public static void main(String args[]) throws AddressException, MessagingException{
EnviaEmail email = new EnviaEmail();
try {
BufferedReader in = new BufferedReader(new FileReader("C:/Documents and Settings/Filipe/Desktop/listaemail.txt"));
String linha;
while((linha = in.readLine()) != null){
System.out.println(linha);
to = linha;
email.sendSimpleMail("smtp.ibrap.ind.br", "TESTE", to ,"IBRAP/ESAF", "mensagem" );
}
in.close();
}
catch (IOException e){
// possiveis erros são tratatos aqui
}
}
}
Edita o título do seu 1º post para resolvido.
Flw