Servlet Resource laden für SMTP - Session

Randalf

Mitglied
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:
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.
 
N

nillehammer

Gast
Code:
java.lang.NoClassDefFoundError: javax/mail/Authenticator
Hast Du die mail-Jars runtergeladen und in den lib-Ordner des Tomcat kopiert? Da Du die MailSession container managed machst, müssen die libs für den Tomcat zugreifbar sein. Es reicht nicht, sie in WEB-INF/lib zu haben.
 

Randalf

Mitglied
Das würde bestenfalls Variante 1 erklären. Ich habe dieses jar in dieses lib-Verzeichnis gegeben.
Ich bekomme jetzt die interessante Exception


java.lang.ClassCastException: javax.mail.Session cannot be cast to javax.mail.Session
at at.randalf.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)

Für heute gehe ich ins Bett und mache morgen weiter. Vielleicht finde ich etwas über so eine Exception.
lg Randalf
 

Randalf

Mitglied
Lösung dieser seltsamen ClassCastException war, daß das mail.jar nicht im WEB-INF/lib liegen durfte. Nachdem ich es entfernt hatte konnte ich die Klasse instanzieren.

Danke für die Hilfe.
 

Randalf

Mitglied
Noch eine Anmerkung. Ich habe in diesem Projekt auch Eclipselink eingebunden. Auch dort ist javax.mail_1.4.0.v201005080615.jar eingebunden.
Das bewirkt wieder dieClassCastException: javax.mail.Session cannot be cast to javax.mail.Session weil auch dort dieses Package eingebunden ist.

Meine Lösung war in Eclipselink das Package zu löschen und im ClassPath des Projektes dieses JAR aus Eclipselink herauszunehmen.

Beim nächsten Eclipselinkupgrade muß ich aber wieder dieses JAR herausnehmen. Gibt es vielleicht eine sauberere Lösung?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D The requested resource () is not available Web Tier 5
B JSF Markup und Resource-Bundles - Best Practices?! Web Tier 3
K JSF websphere application server 8 tomahawk problem Unable to find resource Web Tier 3
M JSF Internationalisation / Resource Bundle Web Tier 2
S JSF Primefaces Thema, Css wird geladen, nur die Bilder nicht, bzw Resource wird nicht aufgelöst Web Tier 5
G Resource Bundles mit Punkt getrennt Web Tier 3
F JSF - Seiteninhalt dynamisch laden Web Tier 5
R JSF Mit Ajax ganze Seite neu laden Web Tier 2
N Image von Dienst laden Web Tier 2
M File aus Projektverzeichnis laden Web Tier 16
K Dynamische Inhalt auf ein "DIV" laden Web Tier 2
S Laden von globalen Resourcen im Servlet Container..? Web Tier 3
U jsf anker/sprungmarke nachdem laden Web Tier 2
A SSL-Zertifikat in Java-Webanwendungen laden Web Tier 4
F Datei von bean aus laden Web Tier 3
A JSF Suche Beispiel für Primefaces Tree als Navigation Web Tier 3
S Seite nur aufrufbar machen für eingeloggte User Web Tier 1
R JavaScript für Java Enterprise Entwickler Web Tier 1
G JSF Webanwendung Editor für JSON gesucht Web Tier 1
S JSP Hm... Vorlage für Java Basierende Webseite? Web Tier 0
J Funktion für AJAX - Problem mit Return Web Tier 14
D Servlet 1 Servlet für alles - Wie Cookies per Ajax? Web Tier 1
R JSF Zugriff für Helpdesk-Mitarbeiter Web Tier 15
I Autocomplete Google Maps für JSF Web Tier 0
W Servlet SPEICHERN UNTER-Dialog für mehrere Dateien Web Tier 4
M JSF Framework für User Management etc. Web Tier 0
D Welches Webframework für REST geeignet Web Tier 1
L java.io.NotSerializableException für domain Objekte - Design Problem? Web Tier 12
M Converter für SelectOneMenu Web Tier 3
J eigene taglib für jsf 2.0 schreiben Web Tier 21
S Empfehlung für stateless Webframework Web Tier 2
J mögliche 'eigene' Konfigurationen für die Web.XML auflisten lassen Web Tier 4
H Singleton für In-Memory-Caching in WebApp Web Tier 4
F Wo und wie Daten die für alle Benutzer bestimmt sind verwalten Web Tier 4
S beste Preis/Leistung für Server Web Tier 3
H Relativer Pfad für XML-Datei in JSP-Anwendung Web Tier 3
S Welcher ansatz für Web Application + Web Service Web Tier 5
M JSF Converter für String to List<String> Web Tier 2
T JSF Eigener Converter wird nur für Eingabekomponenten aufgerufen? Web Tier 3
O Welche JSF Implementation ist am besten für mich geeignet ? Web Tier 3
T Sprachenauswahl für Projekt Web Tier 3
M JSF Komponentenframework für Web/JSF? Web Tier 7
M JSF Simple Testklasse für Button - MethodNotFoundException? Web Tier 6
B JSF JSF1.1 @Tomcat 5.5 für ein neues Projekt Web Tier 18
I Anwendungsfälle für OO Vererbungshierarchien bei Webapps Web Tier 4
D Struts Mehrsprachigkeit in textfield für key ja, aber für label nein? Web Tier 4
M Classpath für JPA in Tomcat Webapp: Wie konfigurieren? Web Tier 4
S ClassPath für Servlet Web Tier 3
J Welches Framework für Webentwicklung? Web Tier 13
T Plugins für Eclipse Web Tier 9
T JSF Zwei Listen/Vectoren für f:selectItems verknüpfen - möglich? Web Tier 2
ruutaiokwu JSF nur für die präsentation verwenden? Web Tier 4
S Ein ControllerServlet für andere Servlets - Sinnvoll oder nicht? Web Tier 34
C Webspace bzw. Server für GWT Web Tier 5
O Testframework für Webanwendung? HTMLUnit? Web Tier 3
C CMS für GWT Anwendung Web Tier 2
T SVG für JSF2 Web Tier 8
Java.getSkill() Lerngruppe für Tapestry 5 Web Tier 21
T Template für die ganze Seite Web Tier 6
Spin JSF oder PHP für Web Web Tier 4
M Java Framework für größere Projekte verwenden Web Tier 5
Z Erlaubte Klassen für h:selectOneListbox Iteration? Web Tier 2
R Exception? Was für ein Fehler? Web Tier 3
J DataScroller: rowCount für Folgeseiten übernehmen Web Tier 2
M Tomcat - Mehrere Verzeichnisse für die jsp Web Tier 12
N JMX MBean für JBoss 4.2.2 Web Tier 4
E Mime-Type für unbekanntes Programm Web Tier 6
M Best Practice für "Teilnahmebediengung akzeptieren" Web Tier 2
M JSP Custom Tag für Bilder Web Tier 14
H Gibt es für das message-bundle eine Standard - Ordnung? Web Tier 2
J Welcher WebServer(-anbieter) für Servlets? Web Tier 5
N Webfrontend für vorhandenes Programm Web Tier 2
A Einfaches Filter-Servlet für Benutzer-Validierung Web Tier 3
R <fmt:formatDate> und 2 Zeichen für den Wochentag? Web Tier 2
T Ajax / Javascript Plugin für Eclipse Web Tier 1
T Was nehmen für eine Datenbankapplikation mit Webinterface Web Tier 5
G wert für hiddenfield per javascript setzten Web Tier 4
K Escape Charakter für EL Web Tier 4
leifg Parameter für Tags aus String lesen (JSP 1.2) Web Tier 2
N JSF: Servlet für Bilder: Verbindung zu Spring Service ? Web Tier 1
S Mehrere Styleklassen für Tabellenreihen Web Tier 4

Ähnliche Java Themen

Neue Themen


Oben