Javamail игнорирует прокси-сервер socks

Я настроил javamail для работы через прокси-сервер socks, но он не проходит через него. Я попытался установить как mail.smtp.socks.host, так и mail.smtp.socks.port, но он продолжает идти прямо на почтовый хост. Я чувствую, что мне не хватает чего-то очень простого. любая помощь будет оценена. Вот мои свойства:

props.setProperty("mail.smtp.host", this.smtpHost);
props.setProperty("mail.smtp.port", Integer.toString(this.smtpPort));
props.setProperty("mail.smtp.user", this.smtpUser);
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.smtp.starttls.enable", Boolean.toString(this.smtpTLS));
props.setProperty("mail.debug", "true");

if (this.useSOCKSProxy) {
   logger.info("Using proxy");
   props.setProperty("mail.smtp.socks.host", "127.0.0.1");
   props.setProperty("mail.smtp.socks.port", Integer.toString(1080));
   props.setProperty("mail.smtps.socks.host", this.socksProxyHost);
   props.setProperty("mail.smtps.socks.port", Integer.toString(this.socksProxyPort));
   props.setProperty("proxySet", "true");
   props.setProperty("socksProxyHost", this.socksProxyHost);
   props.setProperty("socksProxyPort", Integer.toString(this.socksProxyPort));
}

 //Session session = Session.getInstance(props, new SmtpAuthenticator(this.smtpUser,this.smtpPassword));
Session session = Session.getDefaultInstance(props,
   new Authenticator() {
      protected PasswordAuthentication getPasswordAuthentication() {
         return new PasswordAuthentication(smtpUser, smtpPassword);
      }
   });

 //Session session = Session.getInstance(props, null);
session.setDebugOut(System.out);
session.setDebug(true);
 //Transport tr = session.getTransport("smtp");
 //tr.connect();
 //tr.connect(this.smtpHost,this.smtpPort, this.smtpUser, this.smtpPassword);

Message msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(this.smtpFrom));
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(email));
msg.setSubject(subject);
msg.setText(msgToSend.toString());
msg.saveChanges();

Transport.send(msg);

person mlbiam    schedule 16.11.2012    source источник


Ответы (2)


Начните с исправления этих распространенных ошибок.

Если это не решит проблему, опубликуйте вывод отладки. Установите для системного свойства «mail.socket.debug» значение «true», чтобы получить дополнительные выходные данные отладки.

Какую версию JavaMail вы используете? Какой ЖДК?

Если «реквизит» не поступает из System.getProperties(), установка «socksProxyHost» не имеет никакого эффекта. И если вы установите его как системное свойство, вам не нужны свойства socks JavaMail.

person Bill Shannon    schedule 16.11.2012
comment
Оказывается проблема была в общем пебкаце. У меня была javamail 1.4.2, а не 1.4.5. Очень помогла установка системного mail.socket.debug. - person mlbiam; 16.11.2012
comment
@mlbiam Это не следует принимать в качестве ответа. Да, проголосовали за полезность, но это не отвечает на ваш вопрос! - person Benny Bottema; 05.06.2016

Вы можете попытаться выяснить правильную комбинацию свойств, включая распространенные ошибки, упомянутые Биллом, или вы также можете пойти более простым путем и позволить Simple Java Mail (с открытым исходным кодом) решит это за вас:

Ваш пример преобразован:

Mailer mailer = new Mailer(
        new ServerConfig(smtpHost, smtpPort, smtpUser, smtpPassword),
        TransportStrategy.SMTP_TLS,
        this.useSOCKSProxy ? new ProxyConfig(socksProxyHost, socksProxyPort) : null
);

mailer.setDebug(true);

mailer.sendMail(new EmailBuilder()
        .from(null, smtpForm)
        .to(null, email)
        .subject(subject)
        .text(msgToSend.toString())
        .build());

Обратите внимание, что вам больше не нужно иметь дело с какими-либо свойствами или API JavaMail. Вы также можете использовать аутентифицированный прокси, если вам нужно.

person Benny Bottema    schedule 07.07.2016