Envio de emails

Boa tarde, criei uma parte do sistema onde será enviado email para os fornecedores, assim todo formulário de pedido é preenchido e no final o usuário coloca seu email e senha e escolhe um tipo de email que esta no banco

servidor smpt_port_email smtp_host_mail smtps_starttls
Bol 587 smtps.bol.com.br true
Ibest 587 smtp.ibest.com.br true
IG 587 smtp.ig.com.br
Hotmail 25 smtp.live.com
Gmail 587 smtp.gmail.com

E classe que envia o email esta assim:

import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class MailSender {

	public void senderMail(final MailInformation mail) throws UnsupportedEncodingException, MessagingException {
		Properties properties = new Properties();
		
		properties.setProperty("mail.transport.protocol", "smtp");
		properties.setProperty("mail.host", mail.getSmtpHostMail());
		properties.setProperty("mail.smtp.auth", mail.getSmtpAuth());
		properties.setProperty("mail.smtp.starttls.enable", mail.getSmtpStarttls());
		properties.setProperty("mail.smtp.port", mail.getSmtpPortMail());
		properties.setProperty("mail.mime.chartset", mail.getChartSetMail());
		
		properties.setProperty("mail.smtp.ssl.trust", "*");
		
		Authenticator authenticator = new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(mail.getUserMail(), mail.getPassMail());
			}
		};
		
		Session session = Session.getDefaultInstance(properties, authenticator);
		session.setDebug(false);
		
		Message message = new MimeMessage(session);
		
		message.setFrom(new InternetAddress(mail.getUserMail(), mail.getFromNameMail()));
		
		boolean first = true;
		
		for (Map.Entry<String, String> map : mail.getToMailUsers().entrySet()) {
			if (first) {
				message.addRecipient(Message.RecipientType.TO, new InternetAddress(map.getKey(), map.getValue()));
				first = false;
			} else {
				message.addRecipient(Message.RecipientType.CC, new InternetAddress(map.getKey(), map.getValue()));
			}
		}
	
		message.setSubject(mail.getSubjectMail());
		
		MimeBodyPart mimeBodyPart = new MimeBodyPart();
		
		mimeBodyPart.setContent(mail.getBodyMail(), mail.getTypeTextMail());
		
		Multipart multipart = new MimeMultipart();
		
		for (int i = 0; i < mail.getFileMails().size(); i++) {
			
			MimeBodyPart bodyPart = new MimeBodyPart();
			
			FileDataSource dataSource = new FileDataSource(mail.getFileMails().get(i));
			
			bodyPart.setDataHandler(new DataHandler(dataSource));
			bodyPart.setFileName(dataSource.getName());
			
			multipart.addBodyPart(bodyPart, i);
			
		}
		
		multipart.addBodyPart(mimeBodyPart);
		
		message.setContent(multipart);
		
		Transport.send(message);
		
	}
	
}

Mas quando rodo local na minha maquina tudo certo, mas quando coloco em um host para rodar nao faz autenticação do email

recebo a seguinte exception:

javax.mail.AuthenticationFailedException: 535 Incorrect authentication data

at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:823)
at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:756)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:673)
at javax.mail.Service.connect(Service.java:317)
at javax.mail.Service.connect(Service.java:176)
at javax.mail.Service.connect(Service.java:125)
at javax.mail.Transport.send0(Transport.java:194)
at javax.mail.Transport.send(Transport.java:124)
at br.com.isoerp.email.MailSender.senderMail(MailSender.java:85)

Se alguém tiver idéia e puder me ajudar agradeço…

neste link http://javamail.kenai.com/nonav/javadocs/com/sun/mail/smtp/package-summary.html tem todos as propiedades, mas não sei onde estou errando…

Até mais e obrigado

Com qual dos servidores de email está dando o erro? Todos?

Não te trago a solução definitiva, mas alguns pontos:

  1. Porque vc não usa uma biblioteca como o Apache Commons Email? É muito mais fácil.

  2. Passei por um problema parecido com o gmail. De casa funcionava beleza, mas no servidor dava pau.
    O que descobri é que é uma proteção do google que, detecta quando vc tenta acessar sua conta de um ip diferente e bloqueia o login.
    É um saco, tem que fazer umas confirmações e talz pra funcionar. As vezes pode ser o mesmo problema contigo. Onde está localizado geograficamente seu servidor? É fora do Brasil?

Todos estão dando erro!

Mas usando a biblioteca da apache, não vou passar por esse erro?

Obrigado…

Se o problema acontece só com o servidor do google, por exemplo, e com os demais (bol, ibest, hotmail) funciona bem, pode ser o probleme de autenticação por causa do ip que te falei e a biblioteca não vai adiantar.
Mas, se acontece com todos os servidores de email, user o apache commons email pode ajudar.

Ok, obrigado pela dica, vou fazer isso e posto o resultado aqui…

Até mais…

Bom dia!

Criei a seguinte classe:

import java.util.Map;

import org.apache.commons.mail.DefaultAuthenticator;
import org.apache.commons.mail.Email;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;

public class ApacheMailSender {

	public void senderMail(final MailInformation mailInformation) throws EmailException {
		try {
			Email email = new SimpleEmail();
			
			email.setHostName(mailInformation.getSmtpHostMail());
			email.setSmtpPort(Integer.valueOf(mailInformation.getSmtpPortMail()));
			email.setAuthenticator(new DefaultAuthenticator(mailInformation.getUserMail(), mailInformation.getPassMail()));
			email.setSSLOnConnect(true);

			email.setFrom(mailInformation.getUserMail(), mailInformation.getFromNameMail());

			for (Map.Entry<String, String> map : mailInformation.getToMailUsers().entrySet()) {
				email.addTo(map.getKey(), map.getValue());
			}

			email.setSubject(mailInformation.getSubjectMail());
			email.setMsg(mailInformation.getBodyMail());
			
			email.send();
		} catch (NumberFormatException e) {
			throw new NumberFormatException();
		} catch (EmailException e) {
			e.printStackTrace();
			throw new EmailException();
		}
	}
	
}

Mas continuo recebendo o erro, esse que se encontra abaixo:

org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.gmail.com:465
at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1401)
at org.apache.commons.mail.Email.send(Email.java:1428)

Tem idéia do que posso estar errando, pois na minha máquina roda normal, colocando no host, erro novamente

Usei smtp.googlemail.com 465

Obrigado, até mais…

Pode ser que o firewall do seu host não deixe você se conectar à porta 465 ou então que o servidor de DNS dele esteja mal-configurado :frowning:
Você precisa de ajuda do pessoal que mantém seu host.

Uma das coisas que não estou entendendo é o seguinte:

Qualquer porta que eu informo recebo esse erro que diz que está na porta 465

Mesmo quando informo a porta 25 recebo o erro assim:

org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.gmail.com:465

Até mais…

Tenta executar com essa classe

mport java.util.Date;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.Authenticator;

public class EmailUtilTest {
	 
	public static void main(String[] args) {
		
		System.out.println("Enviando Email...");
		
		Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");

        Session session = Session.getDefaultInstance(props,
                    new javax.mail.Authenticator() {
                         protected PasswordAuthentication getPasswordAuthentication()
                         {
                               return new PasswordAuthentication("usuario@gmail.com", "senha");
                         }
                    });

        session.setDebug(true);
		
		try {

              Message message = new MimeMessage(session);
              message.setFrom(new InternetAddress("remetente@gmail.com")); //Remetente

              Address[] toUser = InternetAddress
                         .parse("destino@gmail.com"); // Destino

              message.setRecipients(Message.RecipientType.TO, toUser);
              message.setSubject("Teste Envio Email");
              message.setText("Mensagem");

              Transport.send(message);

              System.out.println("Email enviado !!!");

         } catch (MessagingException e) {
              throw new RuntimeException(e);
        }
	}

}

Opa, vou testar e posto aqui…

Obrigado, até mais…

Danilo Carvalho, testei o teu codigo e deu o mesmo erro… NULL no try catch. Não to entendendo o pq disso ja revisei o codigo diversas vezes.

Obrigado.

Stewie, bom dia.

Então, rodando local não dá erro…

Mas rodando no host do cliente da erro, não deixa autenticar o email.

Mas em outro cliente roda normal, não sei onde esta errado, ou onde tenho que configurar no host do cliente.

Obrigado.

Até mais.

Entao eu tbm nao sei aonde , ou melhor, o que tem q mudar na configuração pra rodar, pq falaram q podia ser algo com firewall , mais eu desativei o firewall do windows e continua na mesma, e dei ping no stmp.gmail.com e ele responde de boa!! eta negocio ai ta dando dor de cabeça rsrsrssr

abraçao, vou continuar pesquisando e ficar na expectativa! :slight_smile: