EMail mit Anhang funktioniert, aber nicht ohne

Tinipieps

Mitglied
Hallo!
Ich habe eine GUI geschrieben, bei der es möglich sein soll, einen Anhang zu verschicken. Sobald ich den Anhang auswähle funktioniert auch alles Bestens. Ich habe nur Probleme, sobald kein Anhang ausgewählt wurde.

Code:
public void sendMail(){
		
		System.out.println("+++++++++++++++++++++++++++++++++++++++++++++");
		
		String senderAdress = this.getAbsender()+"@bundeswehr.org";
		System.out.println("Absender: "+senderAdress);
		String recipientsAdress = this.getEmpfaenger()+"@bundeswehr.org";
		System.out.println("Empfänger: "+recipientsAdress);
		String ccAdress = this.getKopie()+"@bundeswehr.org";
		System.out.println("Kopie: "+ccAdress);
		String bccAdress = this.getBlindkopie()+"@bundeswehr.org";
		System.out.println("Blindkopie: "+bccAdress);
		String attachment = this.getAnhang();
		System.out.println("Anhang: "+attachment);
		String subject = this.getBetreff();
		System.out.println("Betreff: "+subject);
		String message = this.getNachricht();
		System.out.println("Nachricht: "+message);
		
		try {
			Properties props = new Properties();
			props.put( "mail.smtp.host", smtpHost );
			Session session = Session.getDefaultInstance( props );
			Message msg = new MimeMessage( session );
			
			MimeMultipart mimeMultipart = new MimeMultipart();
			
			InternetAddress addressFrom = new InternetAddress(senderAdress);
			msg.setFrom( addressFrom );
			
			InternetAddress addressTo = new InternetAddress(recipientsAdress);
			msg.setRecipient( Message.RecipientType.TO,addressTo );
			
			if (! ccAdress.startsWith("@")){
				InternetAddress addressCC = new InternetAddress(ccAdress);
				msg.setRecipient( Message.RecipientType.CC,addressCC);
			}
			if (! bccAdress.startsWith("@")){
				InternetAddress addressBCC = new InternetAddress(bccAdress);
				msg.setRecipient( Message.RecipientType.BCC,addressBCC);
			}
			
			if (! message.equals(null))
				msg.setSubject( subject );
			
			if(! message.equals(null)){
				MimeBodyPart text = new MimeBodyPart();
				text.setText(message);
				text.setDisposition(MimeBodyPart.INLINE);
				mimeMultipart.addBodyPart(text);
			}
	        
	               if (!attachment.equals(null)){
	        	BodyPart attachement = new MimeBodyPart();
	        	FileDataSource fds = new FileDataSource(attachment);
	        	attachement.setDataHandler(new DataHandler(fds));
	        	attachement.setFileName(fds.getName());
	        	mimeMultipart.addBodyPart(attachement);
	               }
	        
                        msg.setContent(mimeMultipart);
            
                        msg.setSentDate(new Date( ));
            
			Transport.send( msg );
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

Ich hab schon alle möglichen Abfragen eingefügt: Hab versucht einen Ausschluss über die Länge zu setzen usw.
Das sysout ergibt null, weshalb ich kein .startsWith() nutzen kann.
Hat noch jemand ne Idee, wie ich es ohne Anhang zum Laufen bekomme?
 

Anhänge

  • Screenshot E-Mail-Client.GIF
    Screenshot E-Mail-Client.GIF
    19,7 KB · Aufrufe: 31

vfl_freak

Premium-User
Moin,

mal so auf die Schnelle geschätzt :
die Methode "equals" dient dem String-Vergleich ... und auch wenn Dein String leer ist, wird er ungleich NULL sein (!)

Versuch es mal so:

Java:
... attachment.equals( "" );

Gruß
Klaus
 

Tinipieps

Mitglied
Hab ich auch schon -> bringt immernoch ne NullPointerException

Ohne Anhang ->Ausgabe Konsole:
Anhang: null

Ohne Betreff -> Ausgabe Konsole:
Betreff:


Weiß mir echt nicht zu helfen!
 

Tomek_FFM

Mitglied
Probier's mit

Code:
if(attachment != null) { ...

Denn falls die Variable attachment null ist, führt das Ausführen einer Methode (.equals in deinem Fall) zu einer NPE.
 

Tinipieps

Mitglied
Funktioniert

Vielen Dank

Aber, ich dachte immer, dass ein String mit equals() verglichen werden muss!?
Na ja, über eine kurze Erklärung würde ich mich noch freuen!
Aber erstmal für die Lösung vielen Dank!
 

vfl_freak

Premium-User
Wie TOMEK schon so richtig schrieb:

Denn falls die Variable attachment null ist, führt das Ausführen einer Methode (.equals in deinem Fall) zu einer NPE.

Sprich: wenn Du Strings mit "equals" vergleichen willst, dann müssen sie auch beide existieren.
Existiert einer der beiden Variablen nicht (wie in Deinem Fall "attachment", da NULL), dann gibt es die beschriebene NPE, da Du dann damit auf etwas nicht Existentes zugreifen willst !

Gruß
Klaus
 

Tinipieps

Mitglied
Jetzt habe ich in meinem Programm ein wenig geändert, da ich das Versenden an mehrere Empfänger und mit mehreren Anhängen realisieren wollte.
Und nun ist das Problem wieder da!
Er meckert, wenn ich keinen cc bzw. bcc angebe! (Die Abfrage bei den Anhängen funktioniert noch!)
Code:
public static void sendMail(){
		
		System.out.println("+++++++++++++++++++++++++++++++++++++++++++++");
		
		String smtpHost = ServerConfig.getServer();
		
		String senderAdress = Client.getAbsender();
		System.out.println("Absender: "+senderAdress);
		
		String [] recipientsAdress = Client.getEmpfaenger().split(",");
		Address [] recipients = new Address[recipientsAdress.length];
		for (int i=0; i<recipientsAdress.length; i++){
			try {
				recipients[i] = new InternetAddress(recipientsAdress[i]);
				System.out.println("Empfaenger: "+recipients[i]);
			} catch (AddressException e) {
				e.printStackTrace();
			}
		}
		
		String [] ccAdress = Client.getKopie().split(",");
		Address [] cc = new Address[ccAdress.length];
		for (int i=0; i<ccAdress.length; i++){
			try {
				cc[i] = new InternetAddress(ccAdress[i]);
				System.out.println("Kopie: "+ccAdress[i]);
			} catch (AddressException e) {
				e.printStackTrace();
			}
		}
				
		String [] bccAdress = Client.getBlindkopie().split(",");
		Address [] bcc = new Address[bccAdress.length];
		for (int i=0; i<bccAdress.length; i++){
			try {
				bcc[i] = new InternetAddress(bccAdress[i]);
				System.out.println("Blindkopie: "+bccAdress[i]);
			} catch (AddressException e) {
				e.printStackTrace();
			}
		}		
				
		String [] attachments = Client.getAnhang();
		for (int i=0; i<attachments.length; i++)
			System.out.println("Anhang: "+attachments[i]);
				
		String subject = Client.getBetreff();
		System.out.println("Betreff: "+subject);
		
		String message = Client.getNachricht();
		System.out.println("Nachricht: "+message);
		
		
		try {
			// System Properties lesen
			Properties props = new Properties();
			// Definition des Mail Servers
			props.put( "mail.smtp.host", smtpHost );
			// Anlegen einer Session
			Session session = Session.getDefaultInstance( props );
			// Festlegen der Message
			Message msg = new MimeMessage( session );
			
			// Nachricht als MultipartNachricht anlegen
			MimeMultipart mimeMultipart = new MimeMultipart();
			
			// Absender festlegen
			InternetAddress addressFrom = new InternetAddress(senderAdress);
			msg.setFrom( addressFrom );
			
			// Empfaenger festlegen
			// BESSER:
			try{
				msg.setRecipients(Message.RecipientType.TO, recipients);
			}catch(Exception e){
				JOptionPane.showMessageDialog(null, 
					"Bitte geben Sie einen Empfänger an.", null, 
						JOptionPane.PLAIN_MESSAGE);
			}
			
			// Kopie-Empfaenger festlegen
			if (cc != null)
				msg.setRecipients(Message.RecipientType.CC, cc);
					
			// Blindkopie-Empfänger festlegen
			if ( bcc != null){
				msg.setRecipients(Message.RecipientType.BCC, bcc);
			}
			
			// Betreff festlegen
			if (! message.equals(null))
				msg.setSubject( subject );
			
			// Nachricht festlegen
			if(! message.equals(null)){
				MimeBodyPart text = new MimeBodyPart();
				text.setText(message);
				text.setDisposition(MimeBodyPart.INLINE);
				mimeMultipart.addBodyPart(text);
			}
	        
		// Anhang festlegen
	        if (attachments != null){
	        	int count = attachments.length;
	        	if (count > 0){
	        		for (int i=0; i<count; i++){
	        			// MessagePart anlegen
	    	        	BodyPart attachement = new MimeBodyPart();
	    	        	if (attachments[i] != null){
	    	        		FileDataSource fds = new FileDataSource(
	    	        										attachments[i]);
	    	        		attachement.setDataHandler(new DataHandler(fds));
	    	        		attachement.setFileName(fds.getName());
	    	        		attachement.setDisposition(MimePart.ATTACHMENT);
	    	        		mimeMultipart.addBodyPart(attachement);
	    	        	}else
	    	        		System.out.println("Keine Datei vorhanden");
	        		}	        		
	        	}	        	
	        }
	        
	    // Zusammensetzen der Meldung/Nachricht
            msg.setContent(mimeMultipart);
            
            // Datum mitsenden
            msg.setSentDate(new Date( ));
            
            // Nachricht versenden
			Transport.send( msg );
			
			JOptionPane.showMessageDialog(null, 
					"Nachricht wurde versandt.", null, 
						JOptionPane.PLAIN_MESSAGE);
		}catch (AddressException ex){
			JOptionPane.showMessageDialog(null, 
					"Bitte geben Sie einen Empfänger an.", null, 
						JOptionPane.PLAIN_MESSAGE);
		}catch (MessagingException e) {
			JOptionPane.showMessageDialog(null, 
					"Nachricht wurde nicht versandt.", null, 
						JOptionPane.PLAIN_MESSAGE);
		}
	}
Sobald kein cc oder bcc angegeben ist, wirft er mir ne NullPointerException!
Hab wieder mal alle mir bekannten Möglichkeiten ausprobiert, aber ich find die richtige Lösung nicht
 

vfl_freak

Premium-User
Moin,

hast Du mal im Debugger geschaut, was nach dem Splitten wirklich in den Elementen Deines Arrays ccAdress steht :confused:

Gruß
Klaus

 

Tinipieps

Mitglied
Ich hab im Debug-Modus diese Stellen markiert, aber es geht da gar nicht rein!
Ich steh noch aufm KRIEGSFUSS mit dem Debug-Modus

Code:
javax.mail.internet.AddressException: Illegal address in string ``''
	at javax.mail.internet.InternetAddress.<init>(InternetAddress.java:110)
	at sendMail.SendMail.sendMail(SendMail.java:68)
	at client.Client$3.actionPerformed(Client.java:246)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
javax.mail.internet.AddressException: Illegal address in string ``''
	at javax.mail.internet.InternetAddress.<init>(InternetAddress.java:110)
	at sendMail.SendMail.sendMail(SendMail.java:79)
	at client.Client$3.actionPerformed(Client.java:246)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
Anhang: null
Anhang: null
Anhang: null
Betreff: 
Nachricht: 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.mail.internet.InternetAddress.toString(InternetAddress.java:457)
	at javax.mail.internet.InternetAddress.toString(InternetAddress.java:422)
	at javax.mail.internet.MimeMessage.setAddressHeader(MimeMessage.java:696)
	at javax.mail.internet.MimeMessage.setRecipients(MimeMessage.java:575)
	at sendMail.SendMail.sendMail(SendMail.java:135)
	at client.Client$3.actionPerformed(Client.java:246)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

SendMail - Zeile 68:
Code:
cc[i] = new InternetAddress(ccAdress[i]);
                    Zeile 79: bcc[i] = new InternetAddress(bccAdress[i]);
                    Zeile 135: msg.setRecipients(Message.RecipientType.CC, cc);
Mir ist schon klar, dass er in das Address[] nichts reinpacken kann, wenn nichts da ist! Ich hab aber auch an der Stelle schon if-Abfragen eingefügt - ohne Ergebnis
Aber, wie gesagt, mit dem DEBUG-Modus komm ich da nicht rein!
 
Zuletzt bearbeitet:

vfl_freak

Premium-User
Moin,

also mir ist so auf die Schnelle an der Stelle nur Folgendes aufgefallen :

Java:
// hier deklarierst Du ein Array vom Typ ADDRESS !
Address [] cc = new Address[ccAdress.length];

for (int i=0; i<ccAdress.length; i++){
try 
{
    // Hier erzeugt Du aber ein neues INTERNETADDRESS-Objekt !
    cc[i] = new InternetAddress(ccAdress[i]);
.....

Was ist denn bei Dir "InternetAddress" :confused:
Vermutlich musst Du vor der Zuweisung aus den String "ccAddress[i]" ein Objekt vom Typ "Address" machen !

Gruß
Klaus