【问题标题】:JavaMail - Setting up ports, proxy and firewallJavaMail - 设置端口、代理和防火墙
【发布时间】:2013-10-06 05:46:32
【问题描述】:

我正在尝试制作一个非常简单的电子邮件应用程序,并且我已经编写了几行基本代码。我不断收到的一个例外是com.sun.mail.util.MailConnectException。 有没有一种简单的方法可以通过代理或防火墙对我的方式进行编码,而不会弄乱发送机器的连接设置?

到目前为止我的代码:

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class SendHTMLMail {
public static void main(String[] args) {
    // Recipient ID needs to be set
    String to = "test@test.com";

    // Senders ID needs to be set
    String from = "mytest@test.com";

    // Assuming localhost
    String host = "localhost";

    // System properties
    Properties properties = System.getProperties();

    // Setup mail server
    properties.setProperty("mail.smtp.host", host);

       //Get default session object
    Session session = Session.getDefaultInstance(properties);

    try {
        // Default MimeMessage object
        MimeMessage mMessage = new MimeMessage(session);

        // Set from
        mMessage.setFrom(new InternetAddress(from));

        // Set to
        mMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

        // Set subject
        mMessage.setSubject("This is the subject line");

        // Set the actual message
        mMessage.setContent("<h1>This is the actual message</h1>", "text/html");

        // SEND MESSAGE
        Transport.send(mMessage);
        System.out.println("Message sent...");
    }catch (MessagingException mex) {
        mex.printStackTrace();
    }
}

【问题讨论】:

  • 密码字段在哪里
  • 我快到了 ;) 我可以添加它,但在我真正建立连接之前并不认为它是必要的。此外,我认为这不是问题。还是……?
  • 你看代码就够了,但是运行你需要提供的代码..你可以使用发布的 ans..这比你绘制的要容易得多

标签: java proxy jakarta-mail firewall connectexception


【解决方案1】:

从 JavaMail 1.6.2 开始,您可以为 Session 对象设置代理身份验证属性以发送电子邮件。

请参阅以下文档链接。 https://javaee.github.io/javamail/docs/api/

以下属性是新引入的,可与代理身份验证(基本)配合使用。

mail.smtp.proxy.host

mail.smtp.proxy.port

mail.smtp.proxy.user

mail.smtp.proxy.password

【讨论】:

    【解决方案2】:

    您需要以正确的组合正确设置大量属性,以便代理在 JavaMail 中工作。还有JavaMail only supports anonymous SOCKS proxies。

    Simple Java Mail 但是会为您处理这些属性,并在此基础上添加经过身份验证的代理支持。它是开源的,并且仍在积极开发中。

    下面是您的代码在 Simple Java Mail 中的外观:

    Mailer mailer = new Mailer(// note: from 5.0.0 on use MailerBuilder instead
            new ServerConfig("localhost", thePort, theUser, thePasswordd),
            TransportStrategy.SMTP_PLAIN,
            new ProxyConfig(proxyHost, proxyPort /*, proxyUser, proxyPassword */)
    );
    
    mailer.sendMail(new EmailBuilder()
            .from("mytest", "mytest@test.com")
            .to("test", "test@test.com")
            .subject("This is the subject line")
            .textHTML("<h1>This is the actual message</h1>")
            .build());
    
    System.out.println("Message sent...");
    

    很多代码少,表达能力强。

    【讨论】:

    • 这种方法也能以某种方式用于接收电子邮件而不是仅仅发送它吗?
    • @DreamspacePresident 不,接收邮件是完全不同的协议,不是由 Simple Java Mail 处理的。
    【解决方案3】:

    来自 Oracle 的 JAVAMAIL API 常见问题解答 (http://www.oracle.com/technetwork/java/javamail/faq/index.htm):

    JavaMail 目前不支持通过 网络代理服务器。

    但是:

    如果您的代理服务器支持 SOCKS V4 或 V5 协议,并且允许 匿名连接,并且您使用的是 JDK 1.5 或更新版本以及 JavaMail 1.4.5 或更高版本,您可以通过将“mail.smtp.socks.host”属性设置为按会话、按协议配置 SOCKS 代理 在 com.sun.mail.smtp 包的 javadocs 中描述。

    为了使用 SOCKS 代理,您必须为 Session 对象设置 mail.smtp.socks.host 和 mail.smtp.socks.port 参数 - 如下所述:https://javamail.java.net/nonav/docs/api/com/sun/mail/smtp/package-summary.html

    【讨论】:

      【解决方案4】:

      只要试试下面的代码,简单易行……

      public class SendMail{
      
          public static void main(String[] args) {
      
              final String username = "from@gmail.com";
              final String password = "password";
      
              Properties props = new Properties();
              props.put("mail.smtp.auth", "true");
              props.put("mail.smtp.starttls.enable", "true");
              props.put("mail.smtp.host", "smtp.gmail.com");
              props.put("mail.smtp.port", "587");
      
              Session session = Session.getInstance(props,
                new javax.mail.Authenticator() {
                  protected PasswordAuthentication getPasswordAuthentication() {
                      return new PasswordAuthentication(username, password);
                  }
                });
      
              try {
      
                  Message message = new MimeMessage(session);
                  message.setFrom(new InternetAddress("from@gmail.com"));
                  message.setRecipients(Message.RecipientType.TO,
                      InternetAddress.parse("to@gmail.com"));
                  message.setSubject("Testing Subject");
                  message.setText("Dear Mail Crawler,"
                      + "\n\n No spam to my email, please!");
      
                  Transport.send(message);
      
                  System.out.println("Done");
      
              } catch (MessagingException e) {
                  throw new RuntimeException(e);
              }
          }
      }
      

      包含java-mail.jar,运行它....

      复制自here

      【讨论】:

      • 当然你错过了问题的重点,即如何通过代理服务器或防火墙进行连接。 @RAlex 做对了。另请参阅JavaMail FAQ debugging tips。
      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      相关资源
      最近更新 更多