# JavaMail: Automatisches Email Versand (mehrere Empfänger)



## Louis2 (9. Jun 2005)

Hallo,

also bisher habe ich ein GUI als Applet (Swing) programmiert (From/To/Subject/SMTP Server) Felder. Das Programm holt sich den Absender und SMTP Server aus einer .ini Datei, fügt sich in den Textfelder ein und sperrt diese 2 Felder mit .setEditable(false). 

So nun was ich noch machen will: 
1. Beim drücken von einem Button "Send Message" sollen die mails an allen Empfängern abgeschickt werden, also automatisch. Also sozusagen alle Empfänger durcharbeiten, die Liste durchgehen. 
2. Falls es möglich ist, eine Art Statusbalken, wo angezeigt wird, wieviel mails bisher verschickt wurden.

So nun mein Code was bisher auch o.p läuft:

```
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;

public class SammelMailGUI_Swing extends JFrame 
{
    private JButton sendButton = new JButton("Send Message");
    private JLabel fromLabel = new JLabel("From: ");
    private JLabel toLabel = new JLabel("To: ");
    private JLabel hostLabel = new JLabel("SMTP Server: ");
    private JLabel subjectLabel = new JLabel("Subject: ");
    private JTextField fromField = new JTextField(40);
    private JTextField toField = new JTextField(40);
    private JTextField hostField = new JTextField(40);
    private JTextField subjectField = new JTextField(40);
    private JTextArea message = new JTextArea(40,40);
    private JScrollPane jsp = new JScrollPane(message);
    String INIEmailFrom;
    String INIHost;
    BufferedReader b; 
    String line; 
    String Mailline;
    String[] tmp = null;
    int counter=0;
    
    public SammelMailGUI_Swing() 
    {
        super("SammelMailGUI_Swing");
        
        try 
        { 
            File Data = new File("C:/Data.ini"); 
            b = new BufferedReader(new InputStreamReader(new FileInputStream(Data)));  
            while ((line = b.readLine()) != null) 
            { 
                tmp = line.split(":");  
                
                if (counter==0)
                INIEmailFrom=tmp[1];
                else if (counter==1)
                INIHost=tmp[1]; 
                    
                counter++;
            } 
                b.close(); 
        } 
        catch (IOException e) 
        { 
            System.out.println("Error during data reading"); 
        } 
        
        try 
        { 
            File MailData = new File("C:/MailSend.ini"); 
            b = new BufferedReader(new InputStreamReader(new FileInputStream(MailData)));  
            while ((Mailline = b.readLine()) != null) 
            { 
                message.append(Mailline+ " \n");
            } 
                b.close(); 
               
        } 
        catch (IOException e) 
        { 
            System.out.println("Error during data reading"); 
        } 
        
        
        Container contentPane = this.getContentPane();
        contentPane.setLayout(new BorderLayout());
        
        JPanel labels = new JPanel();
        labels.setLayout(new GridLayout(4,1));
        labels.add(hostLabel);
        
        JPanel fields = new JPanel();
        fields.setLayout(new GridLayout(4,1));
        
        hostField.setText(INIHost);
        hostField.setEditable(false);
        fields.add(hostField);
        
        labels.add(toLabel);
        fields.add(toField);
        
        fromField.setText(INIEmailFrom);
        fromField.setEditable(false);
        labels.add(fromLabel);
        fields.add(fromField);
        
        labels.add(subjectLabel);
        fields.add(subjectField);
        
        Box north = Box.createHorizontalBox();
        north.add(labels);
        north.add(fields);
        
        message.setEditable(false);
                
        contentPane.add(north, BorderLayout.NORTH);
        
        message.setFont(new Font("Monospaced", Font.PLAIN,12));
        contentPane.add(jsp,BorderLayout.CENTER);
        
        JPanel south = new JPanel();
        south.setLayout(new FlowLayout(FlowLayout.CENTER));
        south.add(sendButton);
        sendButton.addActionListener(new SendAction());
        contentPane.add(south, BorderLayout.SOUTH);
        
        this.pack();
    }
    
    class SendAction implements ActionListener
    {
        public void actionPerformed(ActionEvent evt) 
        {
            try
            {
                Properties props=new Properties();
                props.put("mail.host", hostField.getText());
                
                Session mailConnection=Session.getInstance(props,null);
                final Message msg=new MimeMessage(mailConnection);
                
                Address to=new InternetAddress(toField.getText());
                Address from=new InternetAddress(fromField.getText());
                
                msg.setContent(message.getText(), "text/plain");
                msg.setFrom(from);
                msg.setRecipient(Message.RecipientType.TO, to);
                msg.setSubject(subjectField.getText());
                
                Runnable r = new Runnable()
                {
                    public void run()
                    {
                        try
                        {
                            Transport.send(msg);
                        }
                        catch (Exception e)
                        {
                            e.printStackTrace();
                        }
                    }
                };
                Thread t = new Thread(r);
                t.start();
                
                message.setText("");
            }
            catch (Exception e)
            {
                e.printStackTrace();                
            }
        }
    }
    
    public static void main(String[] args)
    {
        SammelMailGUI_Swing client = new SammelMailGUI_Swing();
        client.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        client.show();
    } 
}
```

Habt Ihr Ideen, Vorschläge wie ich das ganze schaffen kann, was ich mir vorgenommen habe?


----------



## Louis2 (9. Jun 2005)

Hat jemand eine Idee wie man die mail gleichzeitig per Knopfdruck an mehrere benutzern schickt?
Also d.h jedes mal eine Mail mit dem nächsten Empfänger in der Liste aufmachen und sofort schicken, wie auch immer...


----------



## Peterle (13. Jun 2005)

Versuche es mit einer Thread-Lösung.

Jede Email Adresse, die du veschicken willst, startet einen eigenen Thread, der die Email versendet.

Steuer dies über eine Schleife, wenn du die Email in einem String[] hast:


```
for (int i = 0; i <= Liste[].length(); i++){
    ThreadedMailSend( deine Parameter );
}
```
Zum Thema Threads findest du hier im Forum einige gute Beiträge, aber auch in einigen Tutorien gut Lösungen.


Grüße
Peterle


----------



## DP (13. Jun 2005)

kannst auch alle auf einmal als bcc reinsetzen und eine mail losschicken... kommt natürlich auf den inhalt der mail an...

msg.setRecipient(Message.RecipientType.BCC, to);


----------



## Louis2 (13. Jun 2005)

DP hat gesagt.:
			
		

> kannst auch alle auf einmal als bcc reinsetzen und eine mail losschicken... kommt natürlich auf den inhalt der mail an...
> 
> msg.setRecipient(Message.RecipientType.BCC, to);



Das ist ja das schwierige, die mails sind unterschiedlich, jeder Empfänger soll eine andere mit anderem Subject, Inhalt usw... kriegen ;-)


----------

