[Dúvida] Exceções

10 respostas
R

Ao enviar email utilizando o JavaMail tem a classe Transport e o método send.Esse método send dispara uma exceção SendFailedException.Porém, eu precisava acessar algumas propriedades da exceção SMTPAddressFailedException.

javax.mail.SendFailedException: Invalid Addresses; nested exception is: com.sun.mail.smtp.SMTPAddressFailedException: 504 5.5.2 <email>: Recipient address rejected: need fully-qualified address

Como eu consigo acessar essas propriedades do SMTPAddressFailedException através do objeto da SendFailedException?

10 Respostas

Poneis123

ve se tem oq vc quer na API:

http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/SMTPAddressFailedException.html

R

Eu olhei a API... por isso que sei que nessa exceção contem propriedades que preciso. PORÉM:

Quando ocorrer erro no envio, o catch vai pegar SendFailedException porque é esse o tipo disparado pelo método send.

catch(SMTPAddressFailedException e){

//não vai pegar...

} catch(SendFailedException e) {

//vai cair aqui...
			
		}

Tentei fazer um cast para SMTPAddressFailedException mas não adiantou. :roll:

Não entendi em qual parte que ele faz esse throws da SMTPAddressFailedException.

B

Precisa mesmo da exceção?

Pela mensagem de erro, o endereço de um dos destinatários do e-mail está mal-formatado.

Poneis123

Ah entendi..

O cast deveria funcionar..

catch(SendFailedException e) {  //vai cair aqui...  
        SMTPAddressFailedException se = (SMTPAddressFailedException) e;
        
        se.getAddress();
  }
R

@Bruno

Eu preciso sim.
Porque esse erro do endereço mal-formatado foi apenas um erro que eu forcei para pegar a exceção, porém toda vez que um email é enviado eu gravo e mostro se ele foi salvo com sucesso ou se houve erro… mas se ocorre falha preciso guardar qual o motivo da falha para mostrar ao usuário (já que eles sempre perguntavam porque deu erro, como não consegui enviar…).
E esse motivo da falha está nessa exceção que não estou conseguindo pegar.

Eu consigo pegar a causa da SendFailedException:

e.getCause().toString()

Só que isso me retornaria : 504 5.5.2 : Recipient address

O usuário não entenderia igual… já pegando o código de retorno posso escrever uma mensagem mais “legível” para o usuário.Poderia fazer isso comparando as string mas não acho uma maneira muito adequada, pois na mensagem existem parametros que variam como no caso qual o endereço de email que estava com erro.

@Poneis123

Poisé… Testei o cast mas da erro… ClassCastException (se não me engano)
Pensei que houvesse outra maneira de pegar essa exception, pois ela parece ser “embutida”…

Editado: Para complementar - o erro é mesmo ClassCastException.

Tentei fazer isso:

System.out.println("Instância: " + (e instanceof SMTPAddressFailedException));

Saída: Instancia: false

Portanto, o cast não é a maneira de pegar isso.Alguém sabe como pegá-la?

R

Ninguém sabe se existe uma maneira de diferente para isso? Ou se eu que estou fazendo confusão?
Infelizmente… não encontrei ainda a maneira correta de pegá-la…

Não entendi direito o funcionamento dela, porque ela é uma SendFailedException com a mensagem Invalid Address, e em seguida já da o stacktrace sendo uma SMTPAddressFailedException …

Alguém sabe algo que eu possa tentar? Ou pesquisar a respeito?

adriano_si

Cara… se oobjetivo eh nao deixar o usuario enviar e-mail mal formatado, faz uma validacao desse email antes de tentar enviar, pra poderes economizar recursos e tempo e mostra o erro ao usuario, como email valido… se ele ainda assim enviar invalido, captura a Excecao que o metodo dispara e mostra uma mensagem amigavel ao cara dizendo que o e-mail nao pode ser enviado por estar mal formatado e dah algumas sugetoes como verificar o provedor, o dominio se eh .com.br ou soh .com, etc…

Era o que eu faria, pois tentar recuperar o erro pela excecao pra poder tentar evitar o envio, sei nao, acho uma pratica ruim…

Falows :wink:

R

Então cara se ainda assim ele enviar email inválido essa é minha intenção capturar a exceção e mostrar uma mensagem amigável :smiley: Só que nessa exceção SendFailedException tem no .getCause a mensagem porém ela é dinâmica então eu teria que cuidar quando fazer o equals nela. Por isso acho mais facil pegar o returnCode que tem na exception SMTPAddressFailedException.Para comparar esse código de retorno e escrever uma mensagem amigável conforme o erro.Entendeu?

E a questão da validação poderia ser servir para esse caso do email digitado errado, e para o caso do email estar digitado conforme as “regras”.ex: [email removido].A validação ia passar ok, porém esse email provavelmente não exista ( exemplo ficticio ).Ou seja, existem erros que a validação não ajuda.

Como eu caputro a SMTPAddressFailedException haha

B

Bem, as tuas opções são os métodos do SendFailedException mesmo. Se quiser ajudar o usuário, pode usar os métodos getInvalidAddresses(), getValidSentAddresses(), getValidUnsentAddresses() da própria classe, ou getCause(), e getNextException() da super classe.

Talvez o Throwable getCause() possa ser transformado num SMTPAddressFailedException.

Porém já fique avisado que vai ter problemas com qualquer outra implementação do Java Mail sem ser da Sun, se ficar usando classes proprietárias.

R

Problemas? Por questões técnicas ou de direitos?

Vou ver o que consigo com a SendFailedException… Só não entendi porque existem essas exception aninhados e porque não posso pegá-la…

Criado 15 de março de 2010
Ultima resposta 15 de mar. de 2010
Respostas 10
Participantes 4