使用JSP发送电子邮件

使用JSP发送电子邮件,jsp,exchange-server,jakarta-mail,ipv6,java-7,Jsp,Exchange Server,Jakarta Mail,Ipv6,Java 7,这个问题快把我逼疯了。我有以下代码: <html> <body> <%@ page import="java.util.*" %> <%@ page import="javax.mail.*" %> <%@ page import="javax.mail.internet.*" %> <%@ page import="javax.activation.*" %> <% String host = "exchsrv2";

这个问题快把我逼疯了。我有以下代码:

<html>
<body>
<%@ page import="java.util.*" %>
<%@ page import="javax.mail.*" %>
<%@ page import="javax.mail.internet.*" %>
<%@ page import="javax.activation.*" %>
<%
String host = "exchsrv2";
String to = "alan@domain.com";
String from = "apeince@domain.com";
String subject = "test";
String messageText = "body test";

Properties props = System.getProperties();
props.put("mail.host", host);
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.port", "25");
Session mailSession = Session.getDefaultInstance(props, null);

Message msg = new MimeMessage(mailSession);
msg.setFrom(new InternetAddress(from));
InternetAddress[] address = {new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject(subject);
msg.setSentDate(new Date());
msg.setText(messageText);

Transport.send(msg);
out.println("Mail was sent to " + to);
out.println(" from " + from);
out.println(" using host " + host + ".");
%>
</body>
</html>

我知道Exchange服务器在那里。我可以很好地通过电话上网。我的Exchange服务器已设置为不需要身份验证。我有一个在C#/.NET中运行良好的程序,它运行良好,因此我知道问题不在Exchange服务器中。我在这里做错了什么?

我会毫不犹豫地说,在尝试连接时存在身份验证问题。您没有提供任何用户名或密码,除非exchange服务器不需要用户名和密码


更新:如果使用JDK 7,请参阅以下文章,它解决了此问题:

“进一步深入了解,VPN客户端似乎禁用了IPv6,这导致JDK7出现问题。如果我使用以下标志-Djava.net.preferIPv4Stack=true,我将不再看到错误。这是预期的解决方法还是一个问题?”



如果不想将首选IP堆栈更改为IPv4,另一种解决方案可能是使用主机的IPv6地址而不是DHCP名称,例如:

String host = "fe80::b84d:1ed2:5329:de87%10";
错误的原因确实是,从JDK 7开始,Windows默认使用IPv6。当您尝试连接到IPv4地址时,它将使用IPv4映射的IPv6地址(请参阅)。但是,如果您的exchange服务器支持IPv6,这通常不会有问题。然而,在切换到JDK 7之后,我通过MS Exchange 2010服务器从Java代码发送邮件时遇到了类似的问题。奇怪的是,据报道,它支持IPv6。由于我不想将整个应用程序的IP堆栈默认为IPv4,因此启动应用程序时设置标志-Djava.net.preferIPv4Stack=true的可接受解决方案不是一个选项。因此,在我的例子中,将主机名更改为有效的IPv6是一个更好的解决方案。我还不是100%清楚这为什么有效,而不是DHCP名称。


      <%
      String host = "smtp.gmail.com";
      String from="send-from@gmail.com";//Your E-mail-Id
      String pass="xxxxxx";      //your e-mail account password

String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
String to = "send-to@gmail.com"; //recipient E-mail-Id
String from = "send-from@gmail.com"; // Your E-mail Id
String subject ="test mail";
String messageText = "hello abc";
boolean sessionDebug = true;


Properties props = System.getProperties();
props.put("mail.host", host);
props.put("mail.transport.protocol.", "smtp");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.", "true");
props.put("mail.smtp.port", "465");//port number 465 for Secure (SSL) and we can also            use port no 587 for Secure (TLS)
props.put("mail.smtp.socketFactory.fallback", "false");
props.put("mail.smtp.socketFactory.class", SSL_FACTORY);


Session mailSession = Session.getDefaultInstance(props, null);
mailSession.setDebug(sessionDebug);


Message msg = new MimeMessage(mailSession);
msg.setFrom(new InternetAddress(from));
InternetAddress[] address = {new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject(subject);
msg.setContent(messageText, "text/html");


Transport transport = mailSession.getTransport("smtp");
transport.connect(host, user, pass);


 try {
      transport.sendMessage(msg, msg.getAllRecipients());
      out.println("Send Success");
      boolean WasEmailSent = true; // assume it was sent
     }

catch (Exception err) {
                       boolean WasEmailSent = false; 
                      }
                  transport.close();
      %>

它解析为10.0.0.7并正确解析。exchange服务器不需要用户名或密码。如果我将“exchsrv2”更改为“10.0.0.7”,同样的问题也会发生。下面是另一个人对exchange和javamail有问题:另一个人:-您的c#程序是否也通过端口25上的smtp连接?我看到有人提到Excahnge默认情况下不运行SMTP。我还建议将这些都放在java类中而不是scriptlet中,然后您可以使用JUnit进行测试,JSP scriptlet中的编码和调试是次优的。是的,我的C#在端口25上使用SMTP,就像JSP应用程序一样。我用gmail测试了您的代码,但无法正确连接。我更新了代码和传输对象(如我的编辑帖子所示),并能够使用修改后的代码通过Gmail成功发送,如上图所示。如果无法使用提供的代码连接到exchange服务器,则可能是exchange或端口权限的配置问题。如果您说这不是exchange服务器的问题,可能尝试使用gmail帐户发送邮件-
权限被拒绝
通常意味着您尝试连接的端口已防火墙。请解释您的代码。只有代码的答案不受欢迎。
String host = "fe80::b84d:1ed2:5329:de87%10";
      <%
      String host = "smtp.gmail.com";
      String from="send-from@gmail.com";//Your E-mail-Id
      String pass="xxxxxx";      //your e-mail account password

String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
String to = "send-to@gmail.com"; //recipient E-mail-Id
String from = "send-from@gmail.com"; // Your E-mail Id
String subject ="test mail";
String messageText = "hello abc";
boolean sessionDebug = true;


Properties props = System.getProperties();
props.put("mail.host", host);
props.put("mail.transport.protocol.", "smtp");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.", "true");
props.put("mail.smtp.port", "465");//port number 465 for Secure (SSL) and we can also            use port no 587 for Secure (TLS)
props.put("mail.smtp.socketFactory.fallback", "false");
props.put("mail.smtp.socketFactory.class", SSL_FACTORY);


Session mailSession = Session.getDefaultInstance(props, null);
mailSession.setDebug(sessionDebug);


Message msg = new MimeMessage(mailSession);
msg.setFrom(new InternetAddress(from));
InternetAddress[] address = {new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO, address);
msg.setSubject(subject);
msg.setContent(messageText, "text/html");


Transport transport = mailSession.getTransport("smtp");
transport.connect(host, user, pass);


 try {
      transport.sendMessage(msg, msg.getAllRecipients());
      out.println("Send Success");
      boolean WasEmailSent = true; // assume it was sent
     }

catch (Exception err) {
                       boolean WasEmailSent = false; 
                      }
                  transport.close();
      %>