6
respostas

Spring Mail em Servidor Proxy

Bom dia pessoal , tenho uma aplicação que dispara email que funciona perfeitamente, porém ao depara-se em um cenário onde o cliente possui um servidor proxy a aplicação não consegue efetuar o disparo gerando assim um Timeout . Como posso resolver o problema acima? Desde já agradeço á Todos.

6 respostas

Oi Arthur, eu posso estar enganado, mas se o proxy esta no cliente que recebe o e-mail o seu sistema não tem muito o que fazer. Alguém precisa configurar o proxy para liberar essa chegada de e-mail.

Alberto Souza eu tenho o usuario e a senha do proxy eu posso configurar para ele mandar o email de boa no Spring ou no java?

tenho as informações necessarias da proxy: segue ai minha classe

package br.com.essenti.ehub.service.inseguro;

import br.com.essenti.ehub.domain.Consum;
import br.com.essenti.ehub.domain.ConsumDAO;
import br.com.essenti.ehub.domain.cliente.Cliente;
import br.com.essenti.ehub.domain.cliente.ClienteRepository;
import br.com.essenti.ehub.domain.configuracoes.ConfigFinansi;
import br.com.essenti.ehub.domain.configuracoes.ConfiguracoesDAO;
import br.com.essenti.ehub.domain.relay.Relay;
import br.com.essenti.ehub.domain.relay.RelayRepository;
import br.com.essenti.ehub.domain.usuario.Usuario;
import br.com.essenti.ehub.domain.usuario.UsuarioRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.web.bind.annotation.*;

import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.Map;
import java.util.Properties;
import org.springframework.mail.javamail.JavaMailSenderImpl;

@RestController
@RequestMapping("api/convites")
public class ConviteService {

    private static final Logger logger = LoggerFactory.getLogger(ConviteService.class);

    @Autowired
    ClienteRepository clienteRepository;

    @Autowired
    RelayRepository relayRepository;

    @Autowired
    ConfiguracoesDAO dao;

    @Autowired
    ConsumDAO consumDAO;

    @Autowired
    UsuarioRepository usuarioRepository;

    @Autowired
    private JavaMailSenderImpl javaMailSender;

    private static final String ASSUNTO = "Ativar sua conta";

    private static final String MAIL = "<h2>Olá %s</h2><br>"
            + "<p>Temos uma novidade que irá agilizar  a emissão dos seus pedidos, faturas, boletos e NFs.<br>"
            + "Para isto estamos disponibilizando para você o Finansi, um portal financeiro totalmente seguro onde você poderá:<br></p>"
            + "<ul>" + "<li>Consultar seus pedidos em aberto e faturados</li>" + "<li>Gerar segunda via de boleto</li>"
            + "<li>Re-imprimir NFs</li>" + "</ul><br><br>" + "Tudo isso online e de qualquer lugar.<br>"
            + "Com esta nova funcionalidade, temos a certeza de que todo processo ganhará mais velocidade, conforto e segurança.<br>"
            + "Cadastre-se pelo link abaixo e inicie a utilização do nosso portal. <br>"
            + "<p><a href='%s'>Finansi</a></p><br><br>" + "Um abraço de toda equipe<br>" + "%s";

    private String getMail(String varejista, String url, String atacadista) {
        String mail = String.format(MAIL, varejista, url, atacadista);
        logger.info(mail);
        return mail;
    }

    @RequestMapping(path = "/{cgcent}/{url}", method = RequestMethod.GET)
    public Map<String, Object> a(@PathVariable("cgcent") String cgcent, @PathVariable("url") String url, HttpServletRequest request) throws MessagingException {
        Relay relay = new Relay();
        Consum consum = consumDAO.getNomeEmpresa();
        Cliente cliente = clienteRepository.findByCgcent(cgcent);
        relay.setCliente(cliente);

        logger.info(String.format("URL do frontend: %s", url));
        logger.info(String.format("URL da request: %s", request.getRequestURL()));
        String[] linkar = request.getRequestURL().toString().split("api");
        String link = linkar[0] + "#!/cadastro/" + relay.getHash();
        logger.info("URL MODIFICADA " + linkar[0]);
        sendMail(cliente.getEmail(), ASSUNTO, getMail(cliente.getFantasia(), link, consum.getNomeEmpresa()));
        //relay.setPrazo(LocalDateTime.now());
        relayRepository.save(relay);

        //FIXME buscar o nome do atacadista no cadastro da filial
        return Collections.emptyMap();

    }
    // envio o email aqui.
    private void sendMail(String destinatario, String assunto, String mensagem) throws MessagingException {
        ConfigFinansi config = dao.getConfiguracoes();
        javaMailSender.setHost(config.getHostEmail());
        javaMailSender.setPort(config.getPortaEmail());
        javaMailSender.setUsername(config.getEmail());

        Properties props = System.getProperties();
        props.put("proxySet","true");
        props.put("socksProxyHost","192.168.1.103");
        props.put("socksProxyPort","3128");
        javaMailSender.setJavaMailProperties(props);

        javaMailSender.setPassword(config.getSenhaEmail());

        javax.mail.internet.MimeMessage mail = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mail, true);
        helper.setTo(InternetAddress.parse(destinatario));
        helper.setFrom(config.getEmail());
        helper.setSubject(assunto);
        helper.setText("", mensagem);
        javaMailSender.send(mail);
    }

    @RequestMapping(path = "/{hash:.*}", method = RequestMethod.POST, consumes = org.springframework.http.MediaType.APPLICATION_JSON_UTF8_VALUE)
    public ResponseEntity<Usuario> salvar(@PathVariable("hash") String hash, @RequestBody Usuario usuario) {
        Relay relay = relayRepository.findByHash(hash);

        if (relay.getPrazo().isBefore(LocalDateTime.now())) {
            return new ResponseEntity<Usuario>(HttpStatus.FORBIDDEN);
        }

        usuario.setCliente(relay.getCliente());

        return new ResponseEntity<Usuario>(usuarioRepository.save(usuario), HttpStatus.CREATED);
    }

}

O proxy tá bloqueando o envio do email e não a recepção

Opa, o pior que eu fui olhar na documentação no própria documentação da oracle e ela cita as propriedades que você usou => http://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html :(

O que talvez você possa fazer, mas seria apenas um teste, é rodar a aplicação já passando os argumetnos do proxy.

java -DsocksProxyHost=192.168.1.103 -D socksProxyPort=3128 SuaClasseAqui

Você pode configurar para esses argumetnos serem passados no seu servidor, tipo o tomcat.

Eu achei uma biblio que promete fazer isso a Simple Mail