Enviar email - ERRO

8 respostas
joncarv

Pessoal, estou com um problema na minha classe de envio de email…
segue o código:

package bvs.servicos;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class Email {

	private Object[] email;
	private int cont;
	private Session session;
	private Connection connect;
	private Conexao conexao;
	
	public Email() {
		email = new Object[20];
		conexao = new Conexao();
		connect = conexao.abrirConexao();
	}

	public void enviarEmail(String evento, String data, String local, String hora) {
		
		cont = 0;
		email = buscarEmail();

		try {

			for (cont = 0; cont <= 1999; cont++) {

				Properties props = new Properties();
				props.put("mail.host", "smtp.acessototal.com.br");

				session = Session.getInstance(props, null);
				MimeMessage msg = new MimeMessage(session);

				InternetAddress addressFrom = new InternetAddress((String) email[cont]);

				msg.setFrom(new InternetAddress(("[email removido]")));
				msg.setRecipient(Message.RecipientType.TO, addressFrom);

				msg.setSubject("EVENTO MARCADO");

				msg.setText("BVS informa: " + evento + " marcado(a) para o dia " + data + ", às " + hora + ". Local: " + local + ".");

				Transport.send(msg);

			}
		} catch (AddressException e) {
			System.out.println("Erro no endereço: " + e);

		} catch (MessagingException e) {
			System.out.println("Erro ao enviar a mensagem: " + e);
		}
	}
	
	public Object[] buscarEmail() {
		int i=0;
		Object[] dados = new Object[20];
		try {
			Statement stmt = connect.createStatement();
			ResultSet rs = stmt
					.executeQuery("SELECT email FROM pessoa WHERE tipo = 'participante'");
			System.out.println();
			while (rs.next()){
				dados[i] = rs.getString(1);
				i++;
			}
						
			stmt.close();
			//conexao.fecharConexao();

		} catch (Exception e) {
			System.err.println("Erro na consulta.");
		}
		return dados;
	}
}

Está aparecendo NullPointerException na linha:

InternetAddress addressFrom = new InternetAddress((String) email[cont]);

O que está errado???

8 Respostas

T

Execute a query na mão e veja se não tem alguma pessoa cujo email não foi cadastrado.

SELECT email FROM pessoa WHERE tipo = ‘participante’

getString() pode retornar null para o caso onde a coluna contém NULL.

joncarv

fiz isso e retornou um vetor com todos os emails… nenhum está em branco… verifiquei no banco tb…
acho q o problema esta no InternetAddress… mas não sei como resolver…
:frowning:

T
for (cont = 0; cont <= 1999; cont++) {

Pô meu, deveria estar dando um outro erro (ArrayIndexOutOfBounds), pois o array só tem 20 posicões (de 0 a 19). Que coisa…

Mas é que provavelmente o seu select deve retornar menos linhas (deve retornar menos que 20), então vai acabar acontecendo que você tem um array parcialmente preenchido. Quando você chegar em alguma posição que não está preenchida, vai dar o problema de NullPointerException.

Em vez de usar arrays de tamanho fixo, aprenda a usar ArrayList, é mais fácil mas você precisa pegar o jeito.

Tente não usar arrays de tamanho fixo porque sempre você vai limitar o tamanho de seu problema (funciona com 20 mas não funciona com 21).

Isso é coisa de programador C do tempo em que os animais falavam; hoje em dia os programadores C++ nem usam mais arrays de tamanho fixo, mas a classe < vector >

joncarv

vc tem razão… com certeza… vou mudar pra vector… ahhhh, como sou primitivo… heheheehhee…
valeu pelo toque cara… :smiley:
até +!!!

T

Ei, não é para usar java.util.Vector, é para usar java.util.List e java.util.ArrayList…
Só falei “vector” porque o nome disso em C++ é “vector”.

joncarv

ué… pq nao o vector??? mudei tudo para vector e funcionou na boa…
num entendi… :cry:

T
Vector e ArrayList são mais ou menos a mesma coisa,  que a primeira classe é mais antiga e não tem uma otimização que a segunda tem (ArrayList não é sincronizada).

Se por acaso você encontrar alguém que faz revisão de código (ele vai lhe falar para trocar

Vector v = new Vector();

por

List v = new ArrayList();

Embora hoje em dia não haja diferenças significativas de desempenho entre Vector e ArrayList, no JDK 1.2 e 1.3 havia, portanto sempre é melhor usar ArrayList, a menos que seu código deva rodar em uma applet em JDK 1.1 (onde não existe ArrayList).

joncarv

po… valeu mesmo pelas dicas… é sempre bom postar no forúm!!! Brigadão!!!
Vou colocar o código como ficou para quem quiser dar uma olhada… está funcionando!!!

package bvs.servicos;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class Email {

	private List email;
	private int cont;
	private Session session;
	private Connection connect;
	private Conexao conexao;

	public Email() {
		email = new ArrayList();
		conexao = new Conexao();
		connect = conexao.abrirConexao();
	}

	public void enviarEmail(
		String evento,
		String data,
		String local,
		String hora) {

		int tamanho = 0;
		email = buscarEmail();
		tamanho = email.size();

		try {

			for (cont = 0; cont < tamanho; cont++) {

				Properties props = new Properties();
				props.put("mail.host", "smtp.acessototal.com.br");

				session = Session.getInstance(props, null);
				MimeMessage msg = new MimeMessage(session);

				InternetAddress addressFrom =
					new InternetAddress((String) email.get(cont));

				msg.setFrom(
					new InternetAddress(("[email removido]")));
				msg.setRecipient(Message.RecipientType.TO, addressFrom);

				msg.setSubject("EVENTO MARCADO");

				msg.setText(
					"BVS informa: "
						+ evento
						+ " marcado(a) para o dia "
						+ data
						+ ", às "
						+ hora
						+ ". Local: "
						+ local
						+ ".");

				Transport.send(msg);

			}
		} catch (AddressException e) {
			System.out.println("Erro no endereço: " + e);

		} catch (MessagingException e) {
			System.out.println("Erro ao enviar a mensagem: " + e);
		}
	}

	public List buscarEmail() {
		List dados = new ArrayList();
		try {
			Statement stmt = connect.createStatement();
			ResultSet rs =
				stmt.executeQuery(
					"SELECT email FROM pessoa WHERE tipo = 'participante'");
			System.out.println();
			while (rs.next()) {
				dados.add(rs.getString(1));
			}

			stmt.close();

		} catch (Exception e) {
			System.err.println("Erro - buscarEmail: " + e);
		}
		return dados;
	}
}

Mais uma vez, valeu pela ajuda!!!

Criado 25 de novembro de 2004
Ultima resposta 25 de nov. de 2004
Respostas 8
Participantes 2