Hallo!
Meine Problemstellung ist einen Mailklasse zu schreiben mit der ich über GMX eine SMTP-Verbindung aufbaue, die ich über context.xml im Tomcat konfigurieren kann und damit eMails auf jeder Umgebung (Entwicklung, Test oder Produktion) anders konfigurieren kann ohne in den Programmcode greifen zu müssen.
Versuch 1 (wer quer liest kann dies überspringen):
Ich will gmx als SMTP-Client verwenden und erzeuge ein SMTP-Session-Klasse mit folgender Konfig:
context.xml:
[XML]
<Resource name="mail/Session"
auth="Container"
type="javax.mail.Session"
mail.smtp.protokoll="smtp"
mail.smtp.host="mail.gmx.net"
mail.smtp.port="25"
mail.smtp.user="x.y@gmx.at"
mail.smtp.passwort="xxxxxxx"/>
[/XML]
web.xml:
[XML]
<resource-ref>
<description>
Alles kopiert aus Tomcat6-Doku.
</description>
<res-ref-name>
mail/Session
</res-ref-name>
<res-type>
javax.mail.Session
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref>
[/XML]
MailSender.java:
java.lang.NoClassDefFoundError: javax/mail/Authenticator
at org.apache.naming.factory.MailSessionFactory.getObjectInstance(MailSessionFactory.java:105)
at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:140)
at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
at org.apache.naming.NamingContext.lookup(NamingContext.java:793)
at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
at org.apache.naming.NamingContext.lookup(NamingContext.java:781)
at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
at at.liwanetz.werwolf.login.LoginSeite.doGet(LoginSeite.java:64)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.mail.Authenticator
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 22 more
Den Authenticator hätte ich ja, aber ich kann ihn zu dieser Zeit noch nicht einbinden. Ich kann ihn beim Initialisieren der SMTP-Session noch nicht mitgeben.
Deshalb 2. Versuch:
Ich will nur die Initalisierungsparameter für die SMTP-Session über eine die Klasse MailSender hereinladen. Damit das Property füllen mit dem ich die SMTP-Session konfiguriere und das Mail senden kann losgehen.
context.xml
[XML]
<Resource name="mail/Sender"
auth="Container"
type="at.randalf.framework.MailSender"
protokoll="smtp"
host="mail.gmx.net"
port="25"
user="x.y@gmx.at"
passwort="xxxxxxx"/>
[/XML]
web.xml:
[XML]
<resource-env-ref>
<description>
eMail-Client für den SMTP-Server.
</description>
<resource-env-ref-name>mail/Sender</resource-env-ref-name>
<resource-env-ref-type>at.randalf.framework.MailSender</resource-env-ref-type>
</resource-env-ref>
[/XML]
MailSender.java:
Exception:
javax.naming.NamingException: Cannot create resource instance
at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:143)
at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
at org.apache.naming.NamingContext.lookup(NamingContext.java:793)
at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
at org.apache.naming.NamingContext.lookup(NamingContext.java:781)
at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
at at.randalf.framework.MailSender.getInstance(MailSender.java:44)
at at.randalf.login.LoginSeite.doGet(LoginSeite.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
Bei einem 3. Versuch:
versuchte ich noch eine Änderung in der
context.xml:
[XML]
<Resource name="mail/Sender"
auth="Container"
type="at.randalf.framework.MailSender">
<ResourceParams name="mail/Sender">
<parameter>
<name>protokoll</name>
<value>smtp</value>
</parameter>
<parameter>
<name>host</name>
<value>mail.gmx.net</value>
</parameter>
<parameter>
<name>port</name>
<value>25</value>
</parameter>
<parameter>
<name>user</name>
<value>x.y@gmx.at</value>
</parameter>
<parameter>
<name>passwort</name>
<name>xxxxxxxx</name>
</parameter>
</ResourceParams>
</Resource>
[/XML]
selbe Exception zum selben Zeitpunkt.
Im Internet habe ich noch keine Lösungen gefunden. Jetzt versuche ich es hier.
Meine Problemstellung ist einen Mailklasse zu schreiben mit der ich über GMX eine SMTP-Verbindung aufbaue, die ich über context.xml im Tomcat konfigurieren kann und damit eMails auf jeder Umgebung (Entwicklung, Test oder Produktion) anders konfigurieren kann ohne in den Programmcode greifen zu müssen.
Versuch 1 (wer quer liest kann dies überspringen):
Ich will gmx als SMTP-Client verwenden und erzeuge ein SMTP-Session-Klasse mit folgender Konfig:
context.xml:
[XML]
<Resource name="mail/Session"
auth="Container"
type="javax.mail.Session"
mail.smtp.protokoll="smtp"
mail.smtp.host="mail.gmx.net"
mail.smtp.port="25"
mail.smtp.user="x.y@gmx.at"
mail.smtp.passwort="xxxxxxx"/>
[/XML]
web.xml:
[XML]
<resource-ref>
<description>
Alles kopiert aus Tomcat6-Doku.
</description>
<res-ref-name>
mail/Session
</res-ref-name>
<res-type>
javax.mail.Session
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref>
[/XML]
MailSender.java:
Java:
try {
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
Session session1 = (Session) envCtx.lookup("mail/Session"); // <- Exception
} catch (NamingException e) {
e.printStackTrace();
}
java.lang.NoClassDefFoundError: javax/mail/Authenticator
at org.apache.naming.factory.MailSessionFactory.getObjectInstance(MailSessionFactory.java:105)
at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:140)
at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
at org.apache.naming.NamingContext.lookup(NamingContext.java:793)
at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
at org.apache.naming.NamingContext.lookup(NamingContext.java:781)
at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
at at.liwanetz.werwolf.login.LoginSeite.doGet(LoginSeite.java:64)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.mail.Authenticator
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 22 more
Den Authenticator hätte ich ja, aber ich kann ihn zu dieser Zeit noch nicht einbinden. Ich kann ihn beim Initialisieren der SMTP-Session noch nicht mitgeben.
Deshalb 2. Versuch:
Ich will nur die Initalisierungsparameter für die SMTP-Session über eine die Klasse MailSender hereinladen. Damit das Property füllen mit dem ich die SMTP-Session konfiguriere und das Mail senden kann losgehen.
context.xml
[XML]
<Resource name="mail/Sender"
auth="Container"
type="at.randalf.framework.MailSender"
protokoll="smtp"
host="mail.gmx.net"
port="25"
user="x.y@gmx.at"
passwort="xxxxxxx"/>
[/XML]
web.xml:
[XML]
<resource-env-ref>
<description>
eMail-Client für den SMTP-Server.
</description>
<resource-env-ref-name>mail/Sender</resource-env-ref-name>
<resource-env-ref-type>at.randalf.framework.MailSender</resource-env-ref-type>
</resource-env-ref>
[/XML]
MailSender.java:
Java:
public class MailSender {
private static MailSender instance;
private static Properties propMailKonfig = new Properties();
private Authenticator authPasswort;
private Session session;
private String strProtokoll;
private String strHost;
private int intPort;
private String strUser;
private String strPasswort;
MailSender(String strProtokoll, String strHost, String strPort, String strUser, String strPasswort) {
this.strPasswort = strProtokoll;
this.strHost = strHost;
this.intPort = Integer.parseInt(strPort);
this.strUser = strUser;
this.strPasswort = strPasswort;
}
public static MailSender getInstance() {
if (instance == null) {
try {
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
instance = (MailSender) envCtx.lookup("mail/Sender"); // <- Exception
} catch (NamingException e) {
e.printStackTrace();
}
instance.setProtokoll((String) propMailKonfig.get("protokoll"));
instance.setHost((String) propMailKonfig.get("host"));
instance.setPort((String) propMailKonfig.get("port"));
instance.setUser((String) propMailKonfig.get("user"));
instance.setPasswort((String) propMailKonfig.get("passwort"));
instance.openConnection();
}
return instance;
}
public String getProtokoll() {
return strProtokoll;
}
public void setProtokoll(@SuppressWarnings("hiding") String strProtokoll) {
this.strProtokoll = strProtokoll;
}
public String getHost() {
return strHost;
}
public void setHost(@SuppressWarnings("hiding") String strHost) {
this.strHost = strHost;
}
public int getPort() {
return intPort;
}
public void setPort(String strPort) {
this.intPort = Integer.parseInt(strPort);
}
public String getUser() {
return strUser;
}
public void setUser(@SuppressWarnings("hiding") String strUser) {
this.strUser = strUser;
}
public String getPasswort() {
return strPasswort;
}
public void setPasswort(@SuppressWarnings("hiding") String strPasswort) {
this.strPasswort = strPasswort;
}
private void openConnection() {
authPasswort = new SMTPAuthenticator(strUser,strPasswort);
session = Session.getDefaultInstance(propMailKonfig, authPasswort);
}
public void sendMail(String strVon, String strAn, String strInhalt)
throws MessagingException {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(strVon));
InternetAddress to[] = new InternetAddress[1];
to[0] = new InternetAddress(strAn);
message.setRecipients(Message.RecipientType.TO, to);
message.setSubject(strInhalt);
message.setContent("text/html", "text/plain");
Transport.send(message);
}
public class SMTPAuthenticator extends javax.mail.Authenticator {
@SuppressWarnings("hiding")
private String strUser = "";
@SuppressWarnings("hiding")
private String strPasswort = "";
@SuppressWarnings("hiding")
SMTPAuthenticator(String strUser, String strPasswort) {
this.strUser = strUser;
this.strPasswort = strPasswort;
}
public PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(strUser, strPasswort);
}
}
}
Exception:
javax.naming.NamingException: Cannot create resource instance
at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:143)
at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
at org.apache.naming.NamingContext.lookup(NamingContext.java:793)
at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
at org.apache.naming.NamingContext.lookup(NamingContext.java:781)
at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
at at.randalf.framework.MailSender.getInstance(MailSender.java:44)
at at.randalf.login.LoginSeite.doGet(LoginSeite.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
Bei einem 3. Versuch:
versuchte ich noch eine Änderung in der
context.xml:
[XML]
<Resource name="mail/Sender"
auth="Container"
type="at.randalf.framework.MailSender">
<ResourceParams name="mail/Sender">
<parameter>
<name>protokoll</name>
<value>smtp</value>
</parameter>
<parameter>
<name>host</name>
<value>mail.gmx.net</value>
</parameter>
<parameter>
<name>port</name>
<value>25</value>
</parameter>
<parameter>
<name>user</name>
<value>x.y@gmx.at</value>
</parameter>
<parameter>
<name>passwort</name>
<name>xxxxxxxx</name>
</parameter>
</ResourceParams>
</Resource>
[/XML]
selbe Exception zum selben Zeitpunkt.
Im Internet habe ich noch keine Lösungen gefunden. Jetzt versuche ich es hier.