how to monitor email sending progress with a progressMonitor

94 Views Asked by At

I'm developing a risk management system and part of the functionality is sending emails to every member who is allocated a corrective action to attend to. So as a measure to keep the user updated while the emails are being send i have decided to use a progress monitor and swing worker as the GUI freezes during the email sending process. Im not really sure of how to achieve this but what i do know is that i will need to create a task that handles the email sending , a property changelister to monitor the email sending process and an actiondlister to initiate the email sending. Below are the classes and method i have written but i do not know how to put them together to achieve my set goal.

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    progressMonitor = new ProgressMonitor(NewJFrame.this, "Sending an email", " ", 0, 100);
    progressMonitor.setProgress(0);
    task = new Task();
    task.addPropertyChangeListener(this);
    task.execute();

}
@Override
public void propertyChange(PropertyChangeEvent evt) {
    if("progress".equals(evt.getPropertyName())){
        int progress = (Integer) evt.getNewValue();
        progressMonitor.setProgress(progress);
        String message = String.format("Sending message ..%d%%...\n", progress );
        jTextArea1.append(message);
        //progressMonitor.setNote(task.getMessage());
        if(progressMonitor.isCanceled() || task.isDone()){
            progressMonitor.close();
            Toolkit.getDefaultToolkit().beep();
            if(progressMonitor.isCanceled()){
                task.cancel(true);
            }else{
            jTextArea1.append("Message Send");
            }
        }
    }
}
class Task extends SwingWorker<Void, Void>{

    @Override
    protected Void doInBackground() throws Exception {
        int progress = 0;
        setProgress(0);
        try{
            Thread.sleep(1000);
            progress += 5;
            progress++;
            setProgress(progress);
            Properties props = new Properties();
            props.put("mail.smtp.host", "mail.test.biz");
            props.put("mail.smtp.port", "587");
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.auth", "true");
            Session session = Session.getDefaultInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication(){
                 return new PasswordAuthentication("[email protected]", "Kaylad1*#");
                        }
                  });
            try {
                Message msg = new MimeMessage(session);
                msg.setFrom(new InternetAddress("[email protected]"));
                msg.addRecipients(Message.RecipientType.CC, InternetAddress.parse("[email protected],[email protected]"));
                msg.setSubject("This is a test");
                msg.setText("This is a test a message");
                Transport.send(msg);
                JOptionPane.showMessageDialog(NewJFrame.this, "Email succesfull sent...!" );
            }
            catch(MessagingException | HeadlessException e){
                //progressMonitor.isCanceled();
                JOptionPane.showMessageDialog(NewJFrame.this, e.getMessage() +". "+ "Please check your internet connection");
                  }
            }catch(InterruptedException | HeadlessException e){
                JOptionPane.showMessageDialog(NewJFrame.this, e.getMessage());
            }
            return null;
    }
@Override
public void done(){
    setCursor(null);
    //jTextArea1.append("Done!\n");
    progressMonitor.setProgress(100);
}

}

I have hardcoded the email address but its suppose to dome from the base. For simplicity purposes i have removed that method and only put enough code to put across my point. some help will be appreciated.

0

There are 0 best solutions below