Senden von E-Mails mit JSP
Dieses problem treibt mich in den Wahnsinn. Ich habe den folgenden code:
<html>
<body>
<%@ page import="java.util.*" %>
<%@ page import="javax.mail.*" %>
<%@ page import="javax.mail.internet.*" %>
<%@ page import="javax.activation.*" %>
<%
String host = "exchsrv2";
String to = "[email protected]";
String from = "[email protected]";
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>
Okay, das problem ist, ich bekomme die folgende Fehlermeldung:
javax.servlet.ServletException: javax.mail.MessagingException: Could not connect to SMTP host: exchsrv2, port: 25;
nested exception is:
java.net.SocketException: Permission denied: connect
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:911)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:840)
org.apache.jsp.alan_jsp._jspService(alan_jsp.java:113)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
Ich weiß, Exchange server da ist. Ich kann Sie telnet, um es just fine. Mein Exchange-server-setup ist keine Authentifizierung erforderlich. Ich habe ein Programm, das funktioniert in C#/.NET, und es funktioniert gut, also ich kenne das problem nicht in den Exchange-server. Was mache ich hier falsch?
Wenn Sie sagen, das ist keine Exchange-server-problem, vielleicht versuchen E-mail zu senden mit Google Mail-Konto - mkyong.com/java/...
Permission denied
meistens bedeutet, dass der port, den Sie versuchen, eine Verbindung zu firewalled.InformationsquelleAutor Icemanind | 2011-09-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut Stegreif würde ich sagen, es ist ein Authentifizierungs-Problem, wenn Sie versuchen, sich zu verbinden. Sie sind weder der Benutzername oder das Passwort, es sei denn, Ihr exchange-server benötigen keinen Benutzernamen und Passwort.
UPDATE: Falls mit dem JDK 7 siehe den folgenden Beitrag, er hat dieses Problem behoben:
Mangel - JDK7 Permission Denied mit Steckdosen bei Nutzung von VPN
"Mehr Graben um, und es scheint, dass der VPN-client IPv6 deaktiviert, was Probleme verursacht, mit JDK7. Wenn ich das folgende flag -Djava.net.preferIPv4Stack=true habe ich nicht mehr die Fehler sehen. Ist diese Abhilfe erwarten oder ist das ein Problem?"
Hier ist eine andere person, die ein Problem mit exchange und javamail: stackoverflow.com/questions/1713116/... und ein anderer: stackoverflow.com/questions/3685182/... - Ist dein c# - Programm eine Verbindung über smtp auf port 25? Ich habe gesehen, Verweis auf Excahnge nicht ausgeführt SMTP standardmäßig.
Ich würde auch empfehlen, alles in einer java-Klasse statt Skriptlets können Sie dann mit JUnit zu testen, codieren und Debuggen von in JSP-scriptlet ist sub-optimal.
Ja, meine C# ist die Verwendung von SMTP auf port 25, nur wie die jsp-app.
Getestet habe ich den code mit gmail und war nicht in der Lage, richtig verbinden. Ich aktualisierte den code und transport-Objekt (siehe oben in meinem edit post) und war in der Lage, erfolgreich zu senden via Google Mail mit den geänderten code, wie oben gezeigt. Wenn Sie keine Verbindung zu Ihrem exchange-server mit dem mitgelieferten code, Ihre ist wahrscheinlich ein Konfigurationsproblem mit exchange oder port-Berechtigungen irgendwo.
InformationsquelleAutor Russell Shingleton
Wenn Sie nicht möchten, ändern Sie die bevorzugte IP stack-IPv4, eine alternative Lösung könnte sein, die IPv6-Adresse für den host an Stelle des DHCP-Namen, z.B.:
Den Grund des Fehlers ist, dass in der Tat IPv6 ist standardmäßig auf Windows ab JDK 7. Wenn Sie versuchen, eine Verbindung zu einer IPv4-Adresse dann unter die Decke, es wird eine IPv4-mapped IPv6-Adresse (siehe dieser blog von der Oracle-website). Aber normalerweise sollte das kein problem sein, wenn Ihr exchange-server IPv6 unterstützt. Aber ich lief in ein ähnliches Problem beim senden einer E-mail von Java-code über ein MS Exchange 2010-Server nach der Umstellung auf JDK 7. Das merkwürdige ist, dass nach dieser link auf die MS Technet es unterstützt IPv6. Da wollte ich nicht die Standard-IP-stack auf unsere gesamte Anwendung auf IPv4, die akzeptierte Lösung durch setzen der flag-Djava.net.preferIPv4Stack=true beim starten der Anwendung war nicht eine option. So ändern Sie den Hostnamen, um eine gültige IPv6-war eine bessere Lösung in meinem Fall. Es ist nicht 100% klar ist mir, warum das funktioniert und nicht von dem DHCP-Namen.
InformationsquelleAutor user1697265
InformationsquelleAutor Dileep Kumar