# Mail Versand



## 07alex07 (10. Jun 2011)

Hallo zusammen,

ich will hier ein Mailversand erstellen das ganze klappt auch schon gut.
Bloß weiß ich nicht, wie ich die mail an mehrere Benutzer auf einmal schicken soll.

Hier die Mailer-Klasse

```
public class Mail {

    public static void send(String to, String subject, String inhalt, String from, String anhang) throws AddressException, MessagingException {
        final String host = "xxxxxxxx";     // SMTP-Host
        final int port = 25;                    // SMTP-Port
        final String username = "xxxxxxxx";    // SMTP-Username
        final String passwort = "xxxxxxxx";     // SMTP-Passwort
        
        // Eigenschaften
        Properties props = System.getProperties();
        props.put("mail.smtp.host", true) ;
        
        Session session = Session.getInstance(props, null) ;
        
        // Nachricht erstellen
        try {
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(from));
            InternetAddress[] address = {new InternetAddress(to)};
            msg.setRecipients(Message.RecipientType.TO, address);
            msg.setSubject(subject);
            
            // Nachricht erstellen
            MimeBodyPart mbp1 = new MimeBodyPart();
            mbp1.setText(inhalt);
            
            // Anhang
            FileDataSource fds = new FileDataSource(anhang);
            mbp1.setDataHandler(new DataHandler(fds));
            mbp1.setFileName(fds.getName());
            
            // Multipart erstellen
            Multipart mp = new MimeMultipart();
            mp.addBodyPart(mbp1);
            
            // Multipart zur Nachricht
            msg.setContent(mp);
            
            // Header
            msg.setSentDate(new Date());
            
            // Nachricht senden
            final Transport transport = session.getTransport("smtp");
        transport.connect(host, port, username, passwort);
        transport.sendMessage(msg, address);
        transport.close();
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }
```

Das ist ein Frame beim klicken soll folgendes gemacht werden.

```
try {
            // Nachrichtverschicken
            String to = tfTo.getText();
            String from = tfFrom.getText();
            String cc = tfCC.getText();
            String bcc = tfBCC.getText();
            String inhalt = taNachricht.getText();
            String subject = tfSubject.getText();
            String anhang = "C:\\Test.txt";
        Mail.send(to, subject, inhalt, from, anhang);
        } catch (AddressException ex) {
            Logger.getLogger(Alex.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MessagingException ex) {
            Logger.getLogger(Alex.class.getName()).log(Level.SEVERE, null, ex);
        }
```

Muss dazu sagen, bin in Java neu.
Ich danke für die Hilfe


----------



## Gast2 (10. Jun 2011)

```
InternetAddress[] address = {new InternetAddress(to)};
            msg.setRecipients(Message.RecipientType.TO, address);
```
Du gibst da einfach mehr als einen Empfänger an.


----------



## 07alex07 (10. Jun 2011)

ja das habe ich auch versucht,

ich gebe z.B. bla@bla.de;blub@blub.de

und es kommt folgende Fehlermeldung

Illegal address in string ``''


----------



## chalkbag (10. Jun 2011)

setRecipients(Message.RecipientType type, Address[] addresses) 
MimeMessage (JavaMail API documentation)

d.h. du kannst einfach ein Array von Adressen angeben.


----------



## Gast2 (10. Jun 2011)

Nein, es müsste dann so heißen:

```
InternetAddress[] address = {new InternetAddress("bla@bla.de"), new InternetAddress("blub@blub.de")};
```


----------



## chalkbag (10. Jun 2011)

wie genau gibst du es an, es muss in etwa wie folgt aussehen



```
InternetAddress[] address = {new InternetAddress(to),new InternetAddress(to2),new InternetAddress(to3)};
```

[edit] 2x langsamer, ich stell mich in die Ecke


----------



## 07alex07 (10. Jun 2011)

chalkbag hat gesagt.:


> setRecipients(Message.RecipientType type, Address[] addresses)
> MimeMessage (JavaMail API documentation)
> 
> d.h. du kannst einfach ein Array von Adressen angeben.




Müsste bei mir das so aussehen?

msg.setRecipients(Message.RecipientType.TO, Address[] address);


----------



## chalkbag (10. Jun 2011)

Trau mir gar nicht was zu schreiben, da bestimmt Eike wieder schneller ist.

wie gepostet, die Adressen im Array anlegen



```
InternetAddress[] addresses = {new InternetAddress("bla@bla.de"), new InternetAddress("blub@blub.de")};
```


und dieses dann bei Aufruf wie folgt übergeben.


```
msg.setRecipients(Message.RecipientType.TO, addresses);
```


----------



## 07alex07 (10. Jun 2011)

komm jetzt ganz durcheinander

mail.java

```
public class Mail {

    public static void send(String[] to, String subject, String inhalt, String from, String anhang) throws AddressException, MessagingException {
        final String host = "xxxxxxxx";     // SMTP-Host
        final int port = 25;                    // SMTP-Port
        final String username = "xxxxxxxx";    // SMTP-Username
        final String passwort = "xxxxxxxx";     // SMTP-Passwort

        // Eigenschaften
        Properties props = System.getProperties();
        props.put("mail.smtp.host", true) ;
        
        Session session = Session.getInstance(props, null) ;
        
        // Nachricht erstellen
        try {
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(from));
            InternetAddress[] address = {new InternetAddress(to)};
            msg.setRecipients(Message.RecipientType.TO, address);
            msg.setSubject(subject);
            
            // Nachricht erstellen
            MimeBodyPart mbp1 = new MimeBodyPart();
            mbp1.setText(inhalt);
            
            // Anhang
            FileDataSource fds = new FileDataSource(anhang);
            mbp1.setDataHandler(new DataHandler(fds));
            mbp1.setFileName(fds.getName());
            
            // Multipart erstellen
            Multipart mp = new MimeMultipart();
            mp.addBodyPart(mbp1);
            
            // Multipart zur Nachricht
            msg.setContent(mp);
            
            // Header
            msg.setSentDate(new Date());
            
            // Nachricht senden
            final Transport transport = session.getTransport("smtp");
        transport.connect(host, port, username, passwort);
        transport.sendMessage(msg, address);
        transport.close();
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }
```
Zeile 19. kommt ein Fehler bei mir


alex.java

```
public class Alex extends javax.swing.JFrame {

    /** Creates new form Alex */
    public Alex() {
        initComponents();
        Center alex = new Center(this);
        //frame.setIconImage(new ImageIcon(imgURL).getImage());
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        tfTo = new javax.swing.JTextField();
        jScrollPane1 = new javax.swing.JScrollPane();
        taNachricht = new javax.swing.JTextArea();
        jButton1 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        tfanhang = new javax.swing.JTextField();
        tfSubject = new javax.swing.JTextField();
        tfBCC = new javax.swing.JTextField();
        tfCC = new javax.swing.JTextField();
        tfFrom = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("MailServer 1.0");

        taNachricht.setColumns(20);
        taNachricht.setRows(5);
        jScrollPane1.setViewportView(taNachricht);

        jButton1.setText("Senden");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jLabel1.setText("To:");

        jLabel2.setText("From:");

        jLabel3.setText("CC:");

        jLabel4.setText("BCC:");

        jLabel5.setText("Subject:");

        jLabel6.setText("Attachment:");

        jLabel7.setText("Nachricht:");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jButton1)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel6)
                            .addComponent(jLabel5)
                            .addComponent(jLabel4)
                            .addComponent(jLabel3)
                            .addComponent(jLabel2)
                            .addComponent(jLabel1)
                            .addComponent(jLabel7))
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(jScrollPane1)
                            .addComponent(tfTo, javax.swing.GroupLayout.DEFAULT_SIZE, 217, Short.MAX_VALUE)
                            .addComponent(tfFrom)
                            .addComponent(tfCC)
                            .addComponent(tfBCC)
                            .addComponent(tfSubject)
                            .addComponent(tfanhang))))
                .addContainerGap(610, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(63, 63, 63)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(tfTo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(tfFrom, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(tfCC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(tfBCC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel5)
                    .addComponent(tfSubject, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel6)
                    .addComponent(tfanhang, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel7)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 160, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButton1)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            // Nachrichtverschicken
            String[] to = {tfTo.getText()};
            String from = tfFrom.getText();
            String cc = tfCC.getText();
            String bcc = tfBCC.getText();
            String inhalt = taNachricht.getText();
            String subject = tfSubject.getText();
            String anhang = "C:\\Test.txt";
            Mail.send(to, subject, inhalt, from, anhang);
        } catch (AddressException ex) {
            Logger.getLogger(Alex.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MessagingException ex) {
            Logger.getLogger(Alex.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Alex().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea taNachricht;
    private javax.swing.JTextField tfBCC;
    private javax.swing.JTextField tfCC;
    private javax.swing.JTextField tfFrom;
    private javax.swing.JTextField tfSubject;
    private javax.swing.JTextField tfTo;
    private javax.swing.JTextField tfanhang;
    // End of variables declaration
}
```


----------



## Suinos (10. Jun 2011)

Die Empfänger stehen alle in einem Textfeld?
Dann musst du den String zuerst parsen, alle Adressen in ein Array / eine Liste stecken und dann die Methode entsprechend aufrufen.

Als Hilfestellung eine angepasste Methode, welche erwartet, dass die Empfänger bereits getrennt wurden (du kannst es natürlich auch anders machen):

```
// Empfänger als Array
public static void send(String[] to, String subject, String inhalt, String from, String anhang) throws AddressException, MessagingException {

// [...]

InternetAddress[] recipients = new InternetAddress[to.length];

for(int i = 0; i < recipients.length; i++)
{
    recipients[i] = new InternetAddress(to[i]);
}

msg.setRecipients(Message.RecipientType.TO, recipients);
```


----------



## 07alex07 (10. Jun 2011)

jetzt stehen sie alle in einem Textfeld, später muss ich das aus einer Datei auslesen die ein anderes Programm erzeugt.

Da sind die Adressen folgendermaßen abgespeichert.

test1@test.de;test2@test.de;test3@test.de usw.
in der Datei sind dann noch andere Daten vorhanden z.B. FROM, TO, CC, BCC, Subject, Anhang, MSG


----------



## faetzminator (10. Jun 2011)

07alex07 hat gesagt.:


> jetzt stehen sie alle in einem Textfeld, später muss ich das aus einer Datei auslesen die ein anderes Programm erzeugt.



Na dann mach das doch. String (Java Platform SE 6)


----------



## 07alex07 (10. Jun 2011)

Muss ja erstmal hinkriegen, das ich an mehrere Benutzer eine Mail verschicken kann, und das klappt immer noch nicht


----------



## Gast2 (10. Jun 2011)

Steht doch schon hier: http://www.java-forum.org/java-basics-anfaenger-themen/119690-mail-versand.html#post772243

Hast du das mal probiert? Wenn ja welche Fehler treten auf? Dein aktueller code?


----------



## 07alex07 (10. Jun 2011)

so frage ich die adressen ab

```
String[] to = {tfTo.getText()};
```

übergabe an die mail.java

```
Mail.send(to, subject, inhalt, from, anhang);
```

und das ist die mail.java

```
public class Mail {

    public static void send(String[] to, String subject, String inhalt, String from, String anhang) throws AddressException, MessagingException {
        final String host = "xxxxxxxx";     // SMTP-Host
        final int port = 25;                    // SMTP-Port
        final String username = "xxxxxxxx";    // SMTP-Username
        final String passwort = "xxxxxxxx";     // SMTP-Passwort

        // Eigenschaften
        Properties props = System.getProperties();
        props.put("mail.smtp.host", true);

        Session session = Session.getInstance(props, null);

        // Nachricht erstellen
        try {
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(from));
            InternetAddress[] address = new InternetAddress[to.length] ;
            for (int i = 0; i < address.length; i++) {
                address[i] = address[i];
                System.out.println("mail.java " + address[i]);
            }
            System.out.println(address);
            msg.setRecipients(Message.RecipientType.TO, address);
            
            //InternetAddress[] address = new InternetAddress[to.length];
            //System.out.println("Mail.java " + address);
            //msg.setRecipients(Message.RecipientType.TO, address);
            msg.setSubject(subject);

            // Nachricht erstellen
            MimeBodyPart mbp1 = new MimeBodyPart();
            mbp1.setText(inhalt);

            // Anhang
            FileDataSource fds = new FileDataSource(anhang);
            mbp1.setDataHandler(new DataHandler(fds));
            mbp1.setFileName(fds.getName());

            // Multipart erstellen
            Multipart mp = new MimeMultipart();
            mp.addBodyPart(mbp1);

            // Multipart zur Nachricht
            msg.setContent(mp);

            // Header
            msg.setSentDate(new Date());

            // Nachricht senden
            final Transport transport = session.getTransport("smtp");
            transport.connect(host, port, username, passwort);
            transport.sendMessage(msg, address);
            transport.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
```

wenn ich in das Textfeld zwei adressen so eingebe test1@test.de;test2@test.de

bekomme ich die Fehlermeldung hier

```
java.lang.NullPointerException
	at javax.mail.internet.InternetAddress.toString(InternetAddress.java:461)
	at javax.mail.internet.InternetAddress.toString(InternetAddress.java:426)
	at javax.mail.internet.MimeMessage.setAddressHeader(MimeMessage.java:707)
	at javax.mail.internet.MimeMessage.setRecipients(MimeMessage.java:586)
	at mailserver.Mail.send(Mail.java:80)
	at mailserver.Alex.jButton1ActionPerformed(Alex.java:166)
	at mailserver.Alex.access$000(Alex.java:25)
	at mailserver.Alex$1.actionPerformed(Alex.java:70)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
	at java.awt.Component.processMouseEvent(Component.java:6288)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
	at java.awt.Component.processEvent(Component.java:6053)
	at java.awt.Container.processEvent(Container.java:2041)
	at java.awt.Component.dispatchEventImpl(Component.java:4651)
	at java.awt.Container.dispatchEventImpl(Container.java:2099)
	at java.awt.Component.dispatchEvent(Component.java:4481)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
	at java.awt.Container.dispatchEventImpl(Container.java:2085)
	at java.awt.Window.dispatchEventImpl(Window.java:2478)
	at java.awt.Component.dispatchEvent(Component.java:4481)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
	at java.awt.EventQueue.access$000(EventQueue.java:84)
	at java.awt.EventQueue$1.run(EventQueue.java:602)
	at java.awt.EventQueue$1.run(EventQueue.java:600)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
	at java.awt.EventQueue$2.run(EventQueue.java:616)
	at java.awt.EventQueue$2.run(EventQueue.java:614)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
```


----------



## Miggel (10. Jun 2011)

Ich glaub, dass stimmt nicht: 
	
	
	
	





```
address[i] = address[i];
```

Sollte es nicht eher so heissen:

```
InternetAddress[] address = new InternetAddress[to.length] ;
  for (int i = 0; i < address.length; i++) {
    address[i] = new InternetAddress(to[i]);

  }
```


----------



## 07alex07 (10. Jun 2011)

Ja hab das geändert.

Krieg die Fehlermeldung hier

```
javax.mail.internet.AddressException: Illegal semicolon, not in group in string ``test1@test1.de;test2@test2.de'' at position 25
```


----------



## Miggel (10. Jun 2011)

Trenne die im Textfeld eingegebenen Adressen mit einem Komma ',' anstatt einem Semikolon...

Gehts dann?

EDIT: Ne, war ein blöder Gedanke, die Adressen sind ja schon im String Array aufgeteilt. Wenn du das String-Array 'to' nacheinander ausgibst, erscheinen da auch jeweils die richtigen Adressen oder ist es einfach nur ein Eintrag?


----------



## 07alex07 (10. Jun 2011)

wie gesagt, krieg die Meldung das da ein ";" vorhanden ist, und das darf nicht sein...jetzt weiß ich nicht, wie ich das beheben kann


----------



## chalkbag (10. Jun 2011)

```
StringTokenizer eMailAddressTokens = new StringTokenizer("test1@test.de;test2@test.de",";");
		while(eMailAddressTokens.hasMoreTokens()){
			System.out.println(eMailAddressTokens.nextToken());
		}
```

Ausgabe:


```
test1@test.de
test2@test.de
```


----------



## faetzminator (10. Jun 2011)

Oder - wenn man meinen Link beachtet - mit [c]split()[/c]:

```
String accs = "test1@test.de;test2@test.de";
for (String acc : accs.split(";")) {
    System.out.println(acc);
}
```


----------



## 07alex07 (10. Jun 2011)

Das kann doch nicht sein, das ich das nicht hinkrieg


----------



## faetzminator (10. Jun 2011)

Anscheinend doch  was kriegst du nicht hin?


----------



## 07alex07 (10. Jun 2011)

das ich eine mail an mehrere Benutzer auf einmal schicken kann


----------



## faetzminator (10. Jun 2011)

... :autsch:

Klingt fast so, als würdest du keine Hilfe wollen. Wenn du Hilfe von uns willst, dann musst du genau sagen was, wo (und allenfalls warum -> Exception) irgendwo nicht funktioniert.


----------



## chalkbag (10. Jun 2011)

Es wurde eigentlich schon deutlich erklärt, vielleicht brauchst du eine Pause


```
String[] to = {tfTo.getText()};
```

muss zu


```
String[] to = tfTo.getText().split(";");
```


----------



## 07alex07 (10. Jun 2011)

So jetzt mal den ganzen Code nochmal.

Mail.java

```
public class Mail {

    public static void send(String to, String subject, String inhalt, String from, String anhang) throws AddressException, MessagingException {
        final String host = "xxxxxxxx";     // SMTP-Host
        final int port = 25;                    // SMTP-Port
        final String username = "xxxxxxxx";    // SMTP-Username
        final String passwort = "xxxxxxxx";     // SMTP-Passwort

        // Eigenschatfen
        Properties props = System.getProperties();
        props.put("mail.smtp.host", host);
        Session session = Session.getInstance(props, null);

        try {
            // Nachricht erstellen
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(from));
            InternetAddress[] address = {new InternetAddress(to)};
            msg.setRecipients(Message.RecipientType.TO, address);
            msg.setSubject(subject);

            // Erste Nachrichtenbereich erstellen
            MimeBodyPart mbp1 = new MimeBodyPart();
            mbp1.setText(inhalt);

            // Zweite Nachrichtenbereich erstellen
            MimeBodyPart mbp2 = new MimeBodyPart();

            // Anhang anfügen
            FileDataSource fds = new FileDataSource(anhang);
            mbp2.setDataHandler(new DataHandler(fds));
            mbp2.setFileName(fds.getName());

            // Multipart erstellen und alles zusammenfügen
            Multipart mp = new MimeMultipart();
            mp.addBodyPart(mbp1);
            mp.addBodyPart(mbp2);

            // Multipart zur Nachricht hinzufügen
            msg.setContent(mp);

            // Headerdaten setzen
            msg.setSentDate(new Date());

            // Nachricht versenden
            Transport.send(msg);
        } catch (MessagingException mex) {
            // Wenn das nicht funktioniert hat, soll eine Fehlermeldung erscheinen
            mex.printStackTrace();
            Exception ex = null;
            if ((ex = mex.getNextException()) != null) {
                ex.printStackTrace();
            }
        }
    }
```

Und hier die Frame seite alex.java

```
// Nachrichtverschicken
            String to = tfTo.getText();
            String from = tfFrom.getText();
            String cc = tfCC.getText();
            String bcc = tfBCC.getText();
            String inhalt = taNachricht.getText();
            String subject = tfSubject.getText();
            String anhang = "C:\\Test.txt";
            Mail.send(to, subject, inhalt, from, anhang);
```

Wo muss ich jetzt was genau umstellen?

- Muss ich beim Abholen von den Daten schon alles in ein Array speichern? alex.java
- Wenn 1. zutrifft, was muss dann in der mail.java passieren?


----------



## 07alex07 (10. Jun 2011)

chalkbag hat gesagt.:


> Es wurde eigentlich schon deutlich erklärt, vielleicht brauchst du eine Pause
> 
> 
> ```
> ...



und dann muss ich bei der übergabe bei String noch die []

und was muss ich bei 
	
	
	
	





```
InternetAddress[] address = {new InternetAddress(to)};
```
 noch ändern?


----------



## chalkbag (10. Jun 2011)

So wie es suinos geschrieben hatte


```
public static void send(String[] to, String subject, String inhalt, String from, String anhang) throws AddressException, MessagingException {
 
// [...]
 
InternetAddress[] recipients = new InternetAddress[to.length];
 
for(int i = 0; i < recipients.length; i++)
{
    recipients[i] = new InternetAddress(to[i]);
}
 
msg.setRecipients(Message.RecipientType.TO, recipients)
```


----------



## 07alex07 (10. Jun 2011)

Danke dir, jetzt gehts wie es sein soll.
Mach jetzt mal mit der anderen Aufgabe weiter


----------



## chalkbag (10. Jun 2011)

gib den anderen auch ein Danke, die hatten sich ja primär die Arbeit gemacht :joke:


----------



## 07alex07 (14. Jun 2011)

Ha jetzt noch eine andere Frage:

So frage ich ab, ob eine CC auch geschickt werden soll.


```
if(! cc.equals("")) {
                // CC der Mail
                InternetAddress[] addressCc = new InternetAddress[cc.length];
                for(int i = 0; i < addressCc.length; i++) {
                    addressCc[i] = new InternetAddress(cc[i]);
                }
                msg.setRecipients(Message.RecipientType.CC, addressCc);
            }
```

Wenn ich dann aber die Mail verschicken will, und in CC keine Adresse eintrage, bekomme ich die Fehlermeldung hier:

```
javax.mail.internet.AddressException: Illegal address in string ``''
```

Muss ich das irgendwie anderes abfangen?


----------



## faetzminator (14. Jun 2011)

Täusch ich mich, oder ist [c]cc[/c] nicht ein [c]String[/c] sondern ein [c]String[][/c]? Da musst du natürlich [c]cc.length > 0[/c] verwenden. Zusätzlich wirst wahrscheinlich noch in [c]cc[0][/c] einen leeren String drin haben?


----------



## 07alex07 (14. Jun 2011)

Ja in cc[0] ist noch ein leerer String


----------



## faetzminator (14. Jun 2011)

Der muss weg. Und eben, die Abfrage müsste [c]if(cc.length > 0)[/c] lauten.


----------



## 07alex07 (14. Jun 2011)

Hab ich gemacht, kommt aber der gleiche Fehler


----------



## faetzminator (14. Jun 2011)

Dann hast du momentan wohl [c]cc.length == 1[/c] und [c]cc[0] == null[/c]? [c]String.split()[/c] gibt bei einem leeren String nämlich ein Array der Länge 1 zurück. Also prüf manuell, ob der String leer ist, und setz dann das Array [c]cc[/c] auf [c]null[/c] oder [c]new String[0][/c]. Bei ersterem muss natürlich dann in der Abfrage noch [c]null[/c] abgefragt werden.


----------



## 07alex07 (14. Jun 2011)

du meinst das also so?


```
if (cc.length == 1 && cc[0] == null) {
                cc = null;
            }
            if (cc != null) {
                // CC der Mail
                InternetAddress[] addressCc = new InternetAddress[cc.length];
                for (int i = 0; i < addressCc.length; i++) {
                    addressCc[i] = new InternetAddress(cc[i]);
                }
                msg.setRecipients(Message.RecipientType.CC, addressCc);
            }
```


----------



## faetzminator (14. Jun 2011)

Nö, es muss deiner Methode bereits korrekt übergeben werden. Am Besten prüfst die leere Eingabe gleich beim Erstellen des Arrays - also beim split() der Benutzereingabe.

```
String[] cc = null;
if (someCCs != null && !someCCs.isEmpty()) {
    cc = someCCs.split(","); // oder ; oder was auch immer...
}
```


----------



## 07alex07 (14. Jun 2011)

Danke.

Werde bestimmt noch paar Fragen / Probleme gleich finden :-D


----------



## 07alex07 (14. Jun 2011)

Sorry muss nochmal Streßen.

Lese ein Verzeichnis & Datei aus:

```
String from = "", subj = "", datei = "";
        String to = "", cc = "", bcc = "";
        File dir = new File("C:/feb/queue/");
        File[] fileList = dir.listFiles();
        ArrayList<String> filename = new ArrayList<String>();

        for (File file : fileList) {
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String zeile;
            zeile = reader.readLine();
            while ((zeile = reader.readLine()) != null) {
                if(zeile.contains("TO ")) {
                    to = zeile.split("TO ")[1];
                }
                if(zeile.contains("FROM ")) {
                    from = zeile.split("FROM ")[1];
                }
                if(zeile.contains("SUBJ ")) {
                    subj = zeile.split("SUBJ ")[1];
                }
                if(zeile.contains("FILE ")) {
                    datei = zeile.split("FILE ")[1];
                }
            }
            System.out.println(from);
            System.out.println(to);
            System.out.println(subj);
            System.out.println(datei);
        }
```

wie muss ich jetzt die Variablen genau definieren, damit ich mehrere Empfänger usw. kriege.

hab das so versucht
String[] to = null;

Will aber nicht gehen.


----------



## faetzminator (14. Jun 2011)

Ich würde die Zeile zuerst mit einem Limit von 2 nach " " splitten. Dann hast du den Identifier (TO, FILE, ...) von den restlichen Daten getrennt. Danach kannst du die Daten je nach Fall nochmals mit ";" oder "," (oder so) splitten, und du hast dein Array.
Zumindest würde ich das so vorschlagen, wenn ich deinen Dateiinhalt in meiner Glaskugel sehe. Nein im Ernst: du solltest dir gewisse Dinge selbst überlegen und uns ansonsten wenigstens alls wesentlichen Informationen posten. Das Dateiformat ist da ganz grundlegend. Mein Beispiel basiert auf [c]TO foo@bar.com;blah@fff.net[/c].


----------



## 07alex07 (14. Jun 2011)

ja so sieht es auch aus 
	
	
	
	





```
TO [email]foo@bar.com;blah@fff.net[/email]
```

Hättest du ein Beispiel, wie das aussehen könnte?


----------



## chalkbag (14. Jun 2011)

Du splittest "TO foo@bar.com;blah@fff.net " erstmal so wie du es bei allen anderen auch machst. Dann hast du "foo@bar.com;blah@fff.net". Das kannst du dann nochmal anhand ";" splitten. Aber wurde eigentlich vor ein paar Posts schon erklärt.


----------



## 07alex07 (14. Jun 2011)

wenn ich das so mache


```
while ((zeile = reader.readLine()) != null) {
                if(zeile.contains("TO ")) {
                    to = zeile.split("TO ")[1].split(";");
                }
                if(zeile.contains("FROM ")) {
                    from = zeile.split("FROM ")[1];
                }
                if(zeile.contains("SUBJ ")) {
                    subj = zeile.split("SUBJ ")[1];
                }
                if(zeile.contains("FILE ")) {
                    anhang = zeile.split("FILE ")[1];
                }
                if(zeile.contains("MSG ")) {
                    inhalt = zeile.split("MSG ")[1];
                }
}
```

Bekomme ich die Fehlermeldung hier

```
javax.mail.MessagingException: IOException while sending message;
```


----------



## faetzminator (14. Jun 2011)

Haben wir dir gesagt, dass du nach [c]"TO "[/c] splitten sollst  ? Lies nochmal meinen Post...


----------



## 07alex07 (14. Jun 2011)

ich muss ja erstmal alles was nach TO kommt haben.
Und dann das was da ist splitten oder hab ich das falsch verstanden?


----------



## faetzminator (14. Jun 2011)

```
while ((zeile = reader.readLine()) != null) {
    String[] val = zeile.split(" ", 2);
    if (val.length >= 1) {
        String code = val[0];
        if (code.equals("TO")) {
            [...]
        }
        [...]
    }
}
```
...


----------



## 07alex07 (14. Jun 2011)

Versteh nicht, was mit dem Code da gemacht werden soll.

So sieht meiner aus.

```
public static void lesen() throws FileNotFoundException, IOException, AddressException, MessagingException {
        String from = "", subj = "", anhang = "", inhalt = "C:\\Test.txt";
        String to = null;
        String[] cc = null, bcc = null;
        File dir = new File("C:/feb/queue/");
        File[] fileList = dir.listFiles();
        ArrayList<String> filename = new ArrayList<String>();

        for (File file : fileList) {
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String zeile;
            while ((zeile = reader.readLine()) != null) {
                if(zeile.contains("TO ")) {
                    to = zeile.split("TO ")[1];
                }
                if(zeile.contains("FROM ")) {
                    from = zeile.split("FROM ")[1];
                }
                if(zeile.contains("SUBJ ")) {
                    subj = zeile.split("SUBJ ")[1];
                }
                if(zeile.contains("FILE ")) {
                    anhang = zeile.split("FILE ")[1];
                }
                if(zeile.contains("MSG ")) {
                    inhalt = zeile.split("MSG ")[1];
                }
            }
    }
```

Die Adresse könnte so in der Datei aussehen: 
	
	
	
	





```
bla@bla.de;bla1@bla1.de;usw
```

Da ich dann später die Sachen übergeben will an die Methode Mail.senden, die folgendermaßen aufgebaut ist.

```
public static void send(String[] to, String from, String[] cc, String[] bcc, String subject, String inhalt, String anhang) throws AddressException, MessagingException {
```

müsste ich die String[] anders speichern


----------



## faetzminator (14. Jun 2011)

Dann versuchs wenigstens zu verstehen. Helfen könnte auch der Debugger und/oder Konsolenausgaben, welche dir sagen, was sich in den jeweiligen Variablen befinden. Und die API hast du auch noch, welche dir sagt, was welche Methodenaufrufe bewirken und allenfalls zurückgeben. Wenns an den Grundlagen (wie Schleifen etc.) liegt, solltest du dir diese zuerst aneignen.


----------



## 07alex07 (14. Jun 2011)

hab das so gemacht


```
while((zeile = reader.readLine()) != null) {                        
                        if(zeile.contains("FROM ")) {
                            from = zeile.split("FROM ")[1];
                        }
                        String[] val = zeile.split(" " , 2) ;
                        if(val.length >= 1) {
                            String code = val[0];
                            if(code.equals("TO ")) {
                                System.out.println("2");
                            }
                        }
}
```

Krieg aber die 2 nie raus.


----------



## faetzminator (14. Jun 2011)

Du musst natürlich bei meinem Snippet [c]else if (code.equals("FROM")) {[/c] etc. einfügen.


----------



## 07alex07 (15. Jun 2011)

hab das mit 
	
	
	
	





```
else if
```
 auch versucht kommt aber nichts raus


```
while((zeile = reader.readLine()) != null) {                        
                        String[] val = zeile.split(" " , 2) ;
                        if(val.length >= 1) {
                            String code = val[0];
                            if(code.equals("TO ")) {
                                System.out.println("TO");
                            } else if(code.equals("FROM")) {
                                System.out.println("FROM");
                            } else if (code.equals("CC")) {
                                System.out.println("CC");
                            } else if (code.equals("BCC")) {
                                System.out.println("BCC");
                            } else if (code.equals("SUBJ")) {
                                System.out.println("SUBJ");
                            } else if (code.equals("FILE")) {
                                System.out.println("FILE");
                            } else if (code.equals("MSG")) {
                                System.out.println("MSG");
                            }
                        }
}
```

Mach ich was falsch?


----------



## faetzminator (15. Jun 2011)

Du hast nach dem [c]TO[/c] noch ein Leerzeichen, welches raus muss. Füg mal das an und probiers nochmals:

```
else {
    System.out.println("nicht gefunden: \"" + code + "\"");
}
```


----------



## 07alex07 (15. Jun 2011)

musste noch ein "-" vor jedes Wort machen


```
while((zeile = reader.readLine()) != null) {                        
                        String[] val = zeile.split(" " , 2) ;
                        if(val.length >= 1) {
                            String code = val[0];
                            if(code.equals("-TO")) {
                                System.out.println("TO");
                            } else if(code.equals("-FROM")) {
                                System.out.println("FROM");
                            } else if (code.equals("-CC")) {
                                System.out.println("CC");
                            } else if (code.equals("-BCC")) {
                                System.out.println("BCC");
                            } else if (code.equals("-SUBJ")) {
                                System.out.println("SUBJ");
                            } else if (code.equals("-FILE")) {
                                System.out.println("FILE");
                            } else if (code.equals("-MSG")) {
                                System.out.println("MSG");
                            } else {
                                System.out.println("nicht gefunden: \"" + code + "\"");
                            }
                        }
}
```

Und jetzt kann ich dann für 
	
	
	
	





```
System.out.println("TO");
```
 das hier einfügen?

```
to = val[1].split(";");
```


----------



## faetzminator (15. Jun 2011)

Richtig. Und noch für [c]FROM[/c] usw.


----------



## 07alex07 (15. Jun 2011)

hab noch eine Frage..

Ich krieg die Mail irgendwie immer doppelt.
Konnte aber kein Fehler finden.


```
public static void send(String[] to, String from, String[] cc, String[] bcc, String subject, String inhalt, String anhang) throws AddressException, MessagingException {
        final String host = "xxxxxxxx";     // SMTP-Host
        final int port = 25;                    // SMTP-Port
        final String username = "xxxxxxxxxxxxx";    // SMTP-Username
        final String passwort = "xxxxxxxxxxxxx";     // SMTP-Passwort

        // Eigenschatfen
        Properties props = System.getProperties();
        props.put("mail.smtp.host", host);
        Session session = Session.getInstance(props, null);

        try {
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress(from));


            InternetAddress[] addressTo = new InternetAddress[to.length];
            for (int i = 0; i < addressTo.length; i++) {
                addressTo[i] = new InternetAddress(to[i]);
            }
            msg.setRecipients(Message.RecipientType.TO, addressTo);

            if (cc != null) {
                InternetAddress[] addressCc = new InternetAddress[cc.length];
                for (int i = 0; i < addressCc.length; i++) {
                    addressCc[i] = new InternetAddress(cc[i]);
                }
                msg.setRecipients(Message.RecipientType.CC, addressCc);
            }


            if (bcc != null) {
                InternetAddress[] addressBcc = new InternetAddress[bcc.length];
                for (int i = 0; i < addressBcc.length; i++) {
                    addressBcc[i] = new InternetAddress(bcc[i]);
                }
                msg.setRecipients(Message.RecipientType.BCC, addressBcc);
            }

            msg.setSubject(subject);

            MimeBodyPart mbp1 = new MimeBodyPart();
            mbp1.setContent(inhalt, "text/html; charset=ISO-8859-1");

            MimeBodyPart mbp2 = new MimeBodyPart();

            if (anhang != null) {
                FileDataSource fds = new FileDataSource(anhang);
                mbp2.setDataHandler(new DataHandler(fds));
                mbp2.setFileName(fds.getName());
            }

            Multipart mp = new MimeMultipart();
            mp.addBodyPart(mbp1);
            if (anhang != null) {
                mp.addBodyPart(mbp2);
            }

            msg.setContent(mp);

            msg.setSentDate(new Date());

            Transport.send(msg);
        } catch (MessagingException mex) {
            mex.printStackTrace();
            Exception ex = null;
            if ((ex = mex.getNextException()) != null) {
                ex.printStackTrace();
            }
        }
    }
```


----------



## faetzminator (15. Jun 2011)

Kann gerade nichts verdächtiges finden. Kann es sein, dass du [c]send()[/c] zwei Mal mit den gleichen Werten aufrufst?


----------



## 07alex07 (15. Jun 2011)

Aufrufen tuhe ich es so aus 
	
	
	
	





```
Mail.send(to, from, cc, bcc, subj, inhalt, anhang);
```

Wenn eine Datei ausgelsen wurde wird das ausgeführt, und dann kommt die nächste Datei usw


----------



## faetzminator (15. Jun 2011)

Dann lass dir wichtige Steps (z.B. der Aufruf von [c]send()[/c]) ausgeben. Du wirst den Fehler dann sicher schnell finden - oder er liegt nicht bei dir.


----------



## 07alex07 (15. Jun 2011)

wenn ich nach 
	
	
	
	





```
Transport.send(msg);
```

das hier ausgeben lasse 
	
	
	
	





```
System.out.println(msg);
```

bekomme ich das hier 
	
	
	
	





```
javax.mail.internet.MimeMessage@55571e
javax.mail.internet.MimeMessage@1bf6770
```


----------



## faetzminator (15. Jun 2011)

Gib doch den/die Empfänger o.ä. aus. Und allenfalls noch andere Stellen. Scheint so, als würdest du es doppelt aufrufen.


----------



## 07alex07 (15. Jun 2011)

Hab jetzt was gefunden.


```
for (int i = 0; i < files.length; i++) {
                if (!files[i].isDirectory()) {
                    BufferedReader leser = new BufferedReader(new FileReader(files[i]));
                    String zeile = null;
                    while ((zeile = leser.readLine()) != null) {
                        String[] val = zeile.split(" ", 2);
                        if (val.length >= 1) {
                            String vorzeichen = val[0];
                            if (vorzeichen.equals("-TO")) {
                                to = val[1].split(";");
                                }
                                System.out.println("TO: " + val[1]);  
                            } else if (vorzeichen.equals("-FROM")) {
                                from = val[1].replace("\"", "");
                                System.out.println("FROM: " + val[1]);
                            }
                          }
                        }
```

Hier krieg ich irgendwie bei 
	
	
	
	





```
FROM
```
 und 
	
	
	
	





```
TO
```
 immer alles doppelt


----------



## faetzminator (15. Jun 2011)

Lass dir einfach _proaktiv_ weitere Sachen ausgeben, welche dich das Problem lösen lassen. Du musst nicht immer nur das machen, was ich als Tipp gebe. Z.B. Wär hier die Länge von [c]files[/c] (bzw. deren Inhalt) interessant etc etc.


----------



## 07alex07 (15. Jun 2011)

Ja es ist aber nur einmal in der Datei die Adresse vorhanden. Wird aber zweimal in der Variable gespeichert


----------



## chalkbag (15. Jun 2011)

Wir sind hier nicht bei Twitter, nicht jeder kleinste Gedanke muss mitgeteilt werden. 

Auch wenn ich es wiederhole, geh doch dein Programm Schritt für Schritt durch. Das machst du am besten mit dem Debugger (und Breakpoints) oder System.out. Das Wichtigste ist hier allerdings Eigeninitiative und etwas Durchhaltevermögen bei der Fehlersuche.


----------

