EMail mit Anhang funktioniert, aber nicht ohne

Tinipieps

Mitglied
Jetzt hab ich mit dem Debug-Modus auch hingekriegt!

Das erste Problem lag darin, dass er das Address[] für cc und bcc nicht erstellt hat, weil new InternetAddress(""); eine Exception wirft.
Das habe ich nun wie folgt geregelt:

Code:
String kopie = Client.getKopie();
		String [] ccAdress;
		Address [] cc;
		if (kopie.contains(",")){
			ccAdress = Client.getKopie().split(",");
			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();
				}
			}
		}else if (!kopie.equals("")){
			cc = new Address[1];
			try {
				cc[0] = new InternetAddress(kopie);
				System.out.println("Kopie: "+cc[0]);
			} catch (AddressException e1) {
				e1.printStackTrace();
			}
		}else{
			cc = new Address[1];
			cc[0] = null;
		}
				
		String blindkopie = Client.getBlindkopie();
		String [] bccAdress;
		Address [] bcc;
		if (blindkopie.contains(",")){
			bccAdress = Client.getBlindkopie().split(",");
			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();
				}
			}
		}else if (!blindkopie.equals("")){
			bcc = new Address[1];
			try {
				bcc[0] = new InternetAddress(blindkopie);
				System.out.println("Blindkopie: "+bcc[0]);
			} catch (AddressException e1) {
				e1.printStackTrace();
			}
		}else{
			bcc = new Address[1];
			bcc[0] = null;
		}

Dadurch habe ich ja automatisch null im Array stehen.
In welcher Form muss ich nun die Abfrage

Code:
if (cc != null)
				msg.setRecipients(Message.RecipientType.CC, cc);
umändern, damit keine NPE mehr kommt?
(if (!cc.equals(null)) funktioniert auch nicht)
 

Tinipieps

Mitglied
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

Also, die Klasse InternetAddress benutzt man, wenn man Internetadressen benutzen will.

HTML:
This class represents an Internet email address using the syntax of RFC822. Typical address syntax is of the form "user@host.domain" or "Personal Name ".

Der Code ist schon richtig, da alles für einen Empfänger funktioniert
Code, wenn nur ein Empfänger erlaubt:
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();
		System.out.println("Empfänger: "+recipientsAdress);
		String ccAdress = Client.getKopie();
		System.out.println("Kopie: "+ccAdress);
		String bccAdress = Client.getBlindkopie();
		System.out.println("Blindkopie: "+bccAdress);
		String attachment = Client.getAnhang();
		System.out.println("Anhang: "+attachment);
		String subject = Client.getBetreff();
		System.out.println("Betreff: "+subject);
		String message = Client.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 != 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 );
			
			JOptionPane.showMessageDialog(null, 
					"Nachricht wurde versandt.", null, 
						JOptionPane.PLAIN_MESSAGE);
		} catch (MessagingException e) {
			e.printStackTrace();
		}
	}

Ich wollte diesen Code jetzt so abändern, dass auch an mehrere Empfänger versandt werden kann. Nur leider habe ich an der Stelle ein Problem, an der ich dem Programm sagen will:
"Du darfst auch versenden, wenn kein cc oder bcc angegeben ist!"
 

vfl_freak

Premium-User
Moin,

also erstens ist Dein letzter ELSE-Fall so unsinnig :
Java:
...
else
{
    cc = new Address[1];
    cc[0] = null;
}
...

Was soll das bringen :confused:

Deklariere Deine Objekte lieber gleich so:
Java:
String[] ccAdress = null;
Address[] cc = null;
Dann sind beide halt NULL - und fertig!
Natürlich darfst Du dann ggf. (falls Du sie nicht füllen kannst) nicht mehr darauf zugreifen!

if (!cc.equals(null)) funktioniert auch nicht
Nein, warum sollte es auch?
"EQUALS" ist eine String-Funktion, "cc" ist aber "Address"-Array (!)
Ok, wäre sowas:
Java:
String strA = "Hallo !!";
String strB = "Hallo Du !!";
if( strA.equals( strB ) )
{
    ...
}
else
{
    ...  // wäre hier der Fall !
}

EDIT:
bezogen auf Dein Array müsstest Du so prüfen:
Java:
// entweder
if( cc != null )
...

// oder 
if( cc.length > 0 )

Gruß
Klaus
 
Zuletzt bearbeitet:

deepthroat

Erfahrenes Mitglied
Hi.

Wenn du einen String hast und du splittest an den Kommas, dann erhälst du ein Array mind. der Länge 1. Egal ob der String nun leer war oder nicht bzw. überhaupt Kommas drin waren oder nicht.

Bevor neue InternetAddress Objekte kreierst mußt du also erstmal kucken ob der String z.B. nicht leer ist und dem Format einer Emailadresse entspricht.

Außerdem ist so cc niemals null.

Du solltest lieber eine List statt Arrays verwenden, so kannst du dynamisch valide Adressen hinzufügen:
Java:
List<InternetAddress> cc = new ArrayList<InternetAddress>();
for (String addr : Client.getKopie().split(",")) {
  try {
    cc.add(new InternetAddress(addr));
  } catch (javax.mail.internet.AddressException e) {
    // ignore
  }
}
...
if (cc.size() > 0) {
  msg.setRecipients(Message.RecipientType.CC, cc.toArray());
}
Gruß

PS: Ich sehe gerade man kann das auch vereinfachen und direkt die addRecipient Methode aufrufen, dann spart man sich das Sammeln der Adressen in der Collection:
Java:
for (String addr : Client.getKopie().split(",")) {
  try {
    msg.addRecipient (Message.RecipientType.CC, new InternetAddress(addr));
  } catch (javax.mail.internet.AddressException e) {
    // ignore
  }
}
 
Zuletzt bearbeitet:

Tinipieps

Mitglied
Hi.

Wenn du einen String hast und du splittest an den Kommas, dann erhälst du ein Array mind. der Länge 1. Egal ob der String nun leer war oder nicht bzw. überhaupt Kommas drin waren oder nicht.

Bevor neue InternetAddress Objekte kreierst mußt du also erstmal kucken ob der String z.B. nicht leer ist und dem Format einer Emailadresse entspricht.

Außerdem ist so cc niemals null.

Du solltest lieber eine List statt Arrays verwenden, so kannst du dynamisch valide Adressen hinzufügen:
Java:
List<InternetAddress> cc = new ArrayList<InternetAddress>();
for (String addr : Client.getKopie().split(",")) {
  try {
    cc.add(new InternetAddress(addr));
  } catch (javax.mail.internet.AddressException e) {
    // ignore
  }
}
...
if (cc.size() > 0) {
  msg.setRecipients(Message.RecipientType.CC, cc.toArray());
}
Gruß

PS: Ich sehe gerade man kann das auch vereinfachen und direkt die addRecipient Methode aufrufen, dann spart man sich das Sammeln der Adressen in der Collection:
Java:
for (String addr : Client.getKopie().split(",")) {
  try {
    msg.addRecipient (Message.RecipientType.CC, new InternetAddress(addr));
  } catch (javax.mail.internet.AddressException e) {
    // ignore
  }
}

Ich hatte meine Code so aufgebaut, dass er erst gar nicht in die Exception rutscht. Aber, du hast natürlich recht, man kann die Exception auch einfach ignorieren
(War mir wohl entfallen)
Es funktioniert jetzt übrigens mit deinem Ansatz, nur dass man cc.toArray() noch casten muss!

=>
Code:
List<Address> bcc = new ArrayList<Address>();
		Address[] bccArray = null;
		for (String addr : Client.getBlindkopie().split(",")) {
		  try {
		    bcc.add(new InternetAddress(addr));
		    bccArray = bcc.toArray(new Address[cc.size()]); 
		    for (int i=0; i<ccArray.length; i++){
		    	System.out.println("Blindkopie: "+bccArray[i]);
		    }
		  } catch (javax.mail.internet.AddressException e) {
		    // ignore
		  }		
		}

...
if (cc != null) {
				  msg.setRecipients(Message.RecipientType.CC, ccArray);
			}
 
Zuletzt bearbeitet:

Neue Beiträge