JavaMail-设置端口、代理和防火墙

JavaMail-设置端口、代理和防火墙,java,proxy,jakarta-mail,firewall,connectexception,Java,Proxy,Jakarta Mail,Firewall,Connectexception,我正在尝试制作一个非常简单的电子邮件应用程序,我已经编写了几行基本代码。我经常遇到的一个异常是com.sun.mail.util.MailConnectException。 有没有一种简单的方法可以在不干扰发送机器的连接设置的情况下通过代理或防火墙编写代码 到目前为止,我的代码是: import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class SendHTMLMail { public s

我正在尝试制作一个非常简单的电子邮件应用程序,我已经编写了几行基本代码。我经常遇到的一个异常是
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();
    }
}
import java.util.*;
导入javax.mail.*;
导入javax.mail.internet.*;
公共类发送HTMLMail{
公共静态void main(字符串[]args){
//需要设置收件人ID
字符串to=”test@test.com";
//需要设置发件人ID
字符串from=”mytest@test.com";
//假设本地主机
String host=“localhost”;
//系统属性
Properties=System.getProperties();
//安装邮件服务器
setProperty(“mail.smtp.host”,host);
//获取默认会话对象
Session Session=Session.getDefaultInstance(属性);
试一试{
//默认mimessage对象
mimessage mMessage=新mimessage(会话);
//起于
msessage.setFrom(新的Internet地址(from));
//着手
mMessage.addRecipient(Message.RecipientType.TO,新Internet地址(TO));
//设定主题
Msessage.setSubject(“这是主题行”);
//设置实际消息
setContent(“这是实际的消息”,“text/html”);
//发送消息
传输。发送(M消息);
System.out.println(“消息已发送…”);
}捕获(消息例外mex){
mex.printStackTrace();
}
}

来自Oracle的JAVAMAIL API常见问题解答():

JavaMail目前不支持通过 web代理服务器

但是:

如果代理服务器支持SOCKS V4或V5协议,并且允许 匿名连接,并且您正在使用JDK1.5或更新版本和JavaMail 1.4.5或更新版本,通过将“mail.smtp.SOCKS.host”属性设置为 在com.sun.mail.smtp包的javadocs中描述


为了使用SOCKS代理,您必须为会话对象设置
mail.smtp.SOCKS.host
mail.smtp.SOCKS.port
参数-如下所述:

只需尝试以下代码,操作简单

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);
        }
    }
}
包括
javamail.jar
,运行它


复制,有一系列属性需要以正确的组合正确设置,以便代理在JavaMail中工作

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

下面是使用简单Java邮件时代码的外观:

Mailer-Mailer=new-Mailer(//注意:从5.0.0开始改用MailerBuilder
新服务器配置(“本地主机”、端口、用户、密码d),
TransportStrategy.SMTP_平原,
新建ProxyConfig(proxyHost、proxyPort/*、proxyUser、proxyPassword*/)
);
sendMail(新的EmailBuilder()
.from(“mytest”mytest@test.com")
。至(“测试”)test@test.com")
.主题(“这是主题行”)
.textHTML(“这是实际的消息”)
.build());
System.out.println(“消息已发送…”);

代码少很多,而且非常有表现力。

自从JavaMail 1.6.2以来,您可以为发送电子邮件的会话对象设置代理身份验证属性

请参阅以下文档链接

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


密码字段在哪里我在那里;)我可以添加它,但在我真正建立连接之前并不认为有必要。此外,我不认为这是问题所在。或者是…?看到代码就足够了,但要运行您需要提供的代码..您可以使用发布的ans..这比您所规划的要容易得多,当然,哟你错过了问题的要点,即如何通过代理服务器或防火墙进行连接。@RAlex答对了。另请参阅。这种方法是否也可以用于接收电子邮件而不仅仅是发送电子邮件?@DreamspacePresident否,接收邮件是一种完全不同的协议,不是由简单的Java邮件处理的。
mail.smtp.proxy.host

mail.smtp.proxy.port

mail.smtp.proxy.user

mail.smtp.proxy.password