Envio de email em massa usando as API Java Mail e Org.Apache Commons-email 1.2

Pessoal, não sei se postei no local correto, estou trabalhando em um sw de envio de Newsletters automático para canais do hotsite da empresa e estou usando as api citadas. Para ficar mais difícil tem dois tipos de e mail um eu estou usando com o commons mail que serve para enviar o anexo no corpo do e mail para isso criei um indicador de tipo de email com um código 02 e outro email é simples padrão o texto no corpo e o anexo padrão de gmail e etc. neste usei a api javamail. São enviados em média 200 emails por dia mas é manualmente. Eu criei um método com o JCIFS que pega o arquivo de e mail no servidor geralmente são em html, e copia no local para o envio e após e mail ser enviado o arquivo é deletado. Ok isso manualmente funciona. Criei um form de JinternalFrame que faz uma consulta no banco e somente sobe os dados dos canais que que serão enviados, são os dados como nome, e mail, caminho do arquivo no servidor, tipo de e mail, mensagem e a especie da new( teatro, cinema, etc).

Como eu faria para enviar isso em massa e temporizado, por exemplo envio 50 espero 3 minutor e envio mais 50. Grato

[code]

import automaticnewsletter.IO.IO;
import automaticnewsletter.IO.SmbIO;
import automaticnewsletter.IO.SmbInterface;
import automaticnewsletter.createNews.News;
import automaticnewsletter.createNews.Newsletter_interface;
import automaticnewsletter.createNews.newsletter;
import automaticnewsletter.emailserver.SendMail;
import java.beans.PropertyVetoException;
import java.io.IOException;
import javax.swing.JOptionPane;

/**
*

  • @author pedro
    */
    public class Remessa extends javax.swing.JInternalFrame implements SmbInterface ,Newsletter_interface
    {

    /**

    • Creates new form Remessa
      */
      public Remessa()
      {
      super(“Lista de Newsletter”,true);
      initComponents();
      init();
      this.setResizable(false);
      this.setDefaultCloseOperation(HIDE_ON_CLOSE);
      this.pack();
      db.n=this.n;
      }

    public void getDesktopSize(int widht, int height) //auto-redimensionamento
    {
    jButton3.setSize(widht-80, 25);
    jButton2.setSize(widht-80, 25);
    jButton1.setSize(widht-80, 25);
    this.setSize(widht-80, height-110);
    this.setBounds(40, 50, widht-80, height-110);

    }

    private void init()
    {
    db = new DB();
    db.consultadb(“SELECT t.canal_id, t.*, e.canal_id, e.message FROM tb_canal_hotsite t INNER JOIN tb_message e ON e.canal_id = t.canal_id”);//“Select * from tb_canal_hotsite order by nome_canal”);
    jTable1.setModel(db.modelo);
    }

    /**

    • 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() {

      jPanel1 = new javax.swing.JPanel();
      jButton3 = new javax.swing.JButton();
      jButton1 = new javax.swing.JButton();
      jButton2 = new javax.swing.JButton();
      jScrollPane2 = new javax.swing.JScrollPane();
      jTable1 = new javax.swing.JTable() {public boolean isCellEditable(int rowIndex, int colIndex)
      { //Se a coluna for diferente de 3 ele deixa editar.
      return false;
      }
      };

      jPanel1.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
      jPanel1.setLayout(new java.awt.BorderLayout());

      jButton3.setIcon(new javax.swing.ImageIcon("/home/pedro/NetBeansProjects/AutomaticNewsletter/package/enviar.png")); // NOI18N
      jButton3.setText(“Enviar Newsletters”);
      jButton3.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
      jButton3.setPreferredSize(new java.awt.Dimension(162, 25));
      jButton3.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
      jButton3ActionPerformed(evt);
      }
      });
      jPanel1.add(jButton3, java.awt.BorderLayout.PAGE_START);

      jButton1.setIcon(new javax.swing.ImageIcon("/home/pedro/NetBeansProjects/AutomaticNewsletter/package/1342466818_Preview01.png")); // NOI18N
      jButton1.setText(“Preview”);
      jButton1.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
      jButton1.setPreferredSize(new java.awt.Dimension(78, 25));
      jButton1.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
      jButton1ActionPerformed(evt);
      }
      });
      jPanel1.add(jButton1, java.awt.BorderLayout.CENTER);

      jButton2.setIcon(new javax.swing.ImageIcon("/home/pedro/NetBeansProjects/AutomaticNewsletter/package/1342463759_cancel.png")); // NOI18N
      jButton2.setText(“Sair”);
      jButton2.setPreferredSize(new java.awt.Dimension(112, 25));
      jButton2.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(java.awt.event.ActionEvent evt) {
      jButton2ActionPerformed(evt);
      }
      });
      jPanel1.add(jButton2, java.awt.BorderLayout.PAGE_END);

      jTable1.setModel(new javax.swing.table.DefaultTableModel(
      new Object [][] {
      {null, null, null, null},
      {null, null, null, null},
      {null, null, null, null},
      {null, null, null, null}
      },
      new String [] {
      “Title 1”, “Title 2”, “Title 3”, “Title 4”
      }
      ));
      jTable1.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_NEXT_COLUMN);
      jTable1.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR));
      jScrollPane2.setViewportView(jTable1);

      javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
      getContentPane().setLayout(layout);
      layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
      .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 726, Short.MAX_VALUE)
      );
      layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
      .addGroup(layout.createSequentialGroup()
      .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE)
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
      .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
      );

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

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    if (evt.getSource() == jButton1)
    {
    //EVENTO PREVIEW
    if(jTable1.getSelectedColumn()==-1 || jTable1.getSelectedRow()==-1)
    {
    JOptionPane.showMessageDialog(null, “Por favor selecione algum canal do hotsite\nda tablea clicando na linha que ele estiver!”,“Info 02”,JOptionPane.INFORMATION_MESSAGE);
    System.gc();
    }
    else if(jTable1.getSelectedColumn()<jTable1.getColumnCount() || jTable1.getSelectedRow()><jTable1.getRowCount())
    {
    boolean _ok = getFiles();
    if (_ok == true)
    {
    try
    {
    doPreview();
    this.setSelected(false);
    }
    catch (PropertyVetoException ex)
    {
    System.err.println(ex);
    }
    }
    else
    {
    JOptionPane.showMessageDialog(null, "Não foi possível localizar\nos arquivos para o preview! ", “Erro 03”, JOptionPane.INFORMATION_MESSAGE);
    }
    }
    }
    }

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    //GERA LOTE DE ENVIO DE EMAIL
    massMail();
    }

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    //FECHA O FRAME
    db=null;
    this.doDefaultCloseAction();
    this.setVisible(false);
    }

    protected boolean getFiles()
    {
    if(jTable1.getSelectedRow()!=-1 && jTable1.getSelectedColumn()><9)
    {
    local= io.getSystempath();
    id =jTable1.getValueAt(jTable1.getSelectedRow(), 0).toString();
    local=local.concat("/ASP/");
    local=local.concat(id+"/");
    file = jTable1.getValueAt(jTable1.getSelectedRow(), 7).toString();
    System.out.println(local+file);
    url=jTable1.getValueAt(jTable1.getSelectedRow(), 6).toString();
    System.out.println(url);
    try
    {
    isCopy =copia(url, "//UNIX/"+id+"/"+file);
    System.out.println(isCopy);
    }
    catch (ClassNotFoundException | IOException ex)
    {
    System.err.println(ex);
    }
    }
    else{}
    return isCopy;
    }

    private void doPreview()
    {
    if(isCopy==true)
    {
    view = new preview();
    view.setVisible(true);
    if(file.contains("html"))
    {
    view.exibeHTML(local+file);
    }
    else if(file.contains("pdf"))
    {
    view.exibePDF(local+file);
    }
    else if(file.contains("jpg") || file.contains("Jpeg"))
    {
    view.exibeJPEG(local+file);
    }
    else
    {
    }
    }
    else
    {}
    }

    //copia("//192.168.50.4/ABEQ/index.html","//unix/ASP/index2.html");
    @Override
    public boolean copia(String diretorio, String destino) throws ClassNotFoundException, IOException
    {
    isCopy=false;
    smbIO=new SmbIO();
    isCopy=smbIO.copia(diretorio,destino);
    return isCopy;
    }

    public void massMail()
    {
    int row,linha=0;
    for(row=0;row<db.modelo.getRowCount();row++)
    {

         if(db.modelo.getValueAt(row, 0)==null)
         { }
         else
         {
             linha=linha+1;
         }
     }
     //System.out.println(linha);
     matriz_email = new Object[linha][9];
     /*
      * {"ID Canal","Nome Canal","Contato","E-mail"
        ,"Período","Dia Semana","Caminho","Arquivo"
        ,"Tipo mail","Email Resp. Bilheteria","Resp. Bilheteria"}           
      */       
     for(row=0;row&lt;linha;row++)
     {
          matriz_email[row][0]=db.modelo.getValueAt(row, 0);
          matriz_email[row][1]=db.modelo.getValueAt(row, 2);//Nome contato canal
          matriz_email[row][2]=db.modelo.getValueAt(row, 3);//email canal
          matriz_email[row][3]=db.modelo.getValueAt(row, 6);//URL
          matriz_email[row][4]=db.modelo.getValueAt(row, 7);//File
          matriz_email[row][5]=db.modelo.getValueAt(row, 8);//Tipo mail
          matriz_email[row][6]=db.modelo.getValueAt(row, 9);//Email resp. bilheteria
          matriz_email[row][7]=db.modelo.getValueAt(row, 10);          
          matriz_email[row][8]=db.modelo.getValueAt(row, 11);
          System.out.println(matriz_email[row][0]);
          System.out.println(matriz_email[row][1]);
          System.out.println(matriz_email[row][2]);
          System.out.println(matriz_email[row][3]);
          System.out.println(matriz_email[row][4]);
          System.out.println(matriz_email[row][5]);
          System.out.println(matriz_email[row][6]);
          System.out.println(matriz_email[row][7]);
           System.out.println(matriz_email[row][8]);
          //getAttachment(matriz_email[row][3].toString(), matriz_email[row][0].toString(), matriz_email[row][4].toString());
     } 
         
         //"//UNIX/"+getCanal_id()+"/"+getAttach();
         //return send;
    

    }

    protected boolean getAttachment(String url, String id, String localFile)
    {
    boolean fileExists=false;
    String newFile="";
    newFile= newFile.concat("//UNIX/"+id+"/"+localFile).trim();
    System.out.println(“my new file”+newFile);
    System.out.println("my url “+url);
    try
    {
    fileExists =true;//copia(url, localFile);
    System.out.println(fileExists);
    }
    catch (Exception ex)
    {
    System.err.println(ex);
    }
    if(fileExists==true)
    {
    //envia(“dest”, “messag”, “tipi mail”);
    //fileExists= envia("pedro.deus@yahoo.com”, “Teste envio newsletter”, “1”);
    }
    else
    {
    }
    return fileExists;
    }

    protected boolean envia(String destinatário, String message, String tipo_mail)
    {
    try
    {
    isOK=false;
    String path = " “;
    path = path.concat(io.getSystempath()+”/ASP/"+getCanal_id()+"/"+getAttach()).trim();
    System.out.println(“path “+path);
    if(!path.trim().equalsIgnoreCase(””) || !path.equalsIgnoreCase(null))
    {
    sm= new SendMail();
    sm.setSendMail(“smtp.bilheteria.com”, “25”);
    sm.sendMail("newsletter@bilheteria.com");
    sm.setUser("newsletter@bilheteria.com", “teatro”);
    sm.Authentication();
    // if 1 email com anexo
    if(tipo_mail.equalsIgnoreCase(“1”) || getAttach().contains(“pdf”))
    {

                  sm.setMessage("newsletter@bilheteria.com", destinatário, message);
                  sm.setAttachment(path,"Newsletter");
                  sm.Envia();
                  isOK=true;
             }
             // if 2 email com anexo no corpo
             else if(tipo_mail.equalsIgnoreCase("2") || !getAttach().contains("pdf"))
             {
               //_htmlMail(String anexo, String _to, String to_name, String message)
                 sm._htmlMail(path,destinatário,"",message);
                 isOK=true;
             }
        }
        else
        {
            isOK=false;
        }
     } 
     catch (Exception ex)
     {
         isOK=false;
         System.err.println(ex);
     }
     return isOK;
    

    }

[/code]>

por favor ajuda up

a api commons mail tem o método addTo, que serve pra adicionar mais um destinatario para o email atual… voce pode criar um método que informe um arrayList com 50 destinatarios pra classe que faz o envio de email, depois que ele foi feito, pra fazer ele esperar um tempo voce simplesmente usa um Thread.sleep(xxxx)…

Então o meu problema que eu esqueci de falar bastante sobre ele é o seguinte, teu tenho uma lista de emails diários, mas o conteúdo do corpo do email é feito
para cada nego da lista, portanto não dá para fazer um BCC e enviar tudo de uma vez, é mais ou menos assim tenho uma lista de nomes e para esses caras tenho o tipo de arquivo de envio (html, pdf ou jpeg), alem disso tenho 2 tipos de envio de email 1 -para com anexo no corpo (não comporta pdf) e outro no anexo padrão meu problema é como juntar isso para andar com um só clique no botão ‘enviar’

Então acredito que é so questao de organização…
Eu faria assim:
Uma classe somente pra enviar email, com um método que recebesse o uma String destinatario, um File anexo(se nao houver anexo voce manda como null), e os parametros restantes como porta, ssl, smtp e etc voce configura tudo com métodos set antes de enviar o email.
agora teria que ter um beans usuario, aonde voce vai ter parametros que definem qual será o tipo de email que voce mandará… por exemplo, vc cria uma variavel que recebe 4 constantes… sendo os 3 tipos de arquivo que vc quer mandar + 1 que quer dizer que nao vai anexo. Cria outra variavem que ira armazenar o conteudo.
Depois voce so precisa carregar um arrayList de Usuario e fazer o envio de emails lendo as variaveis desse bean e enviando o email…
Voce faz tudo dentro de um laço só, vai poupar muito codigo e principalmente vai ficar entendivel e se quiser pausar um tempo de 50 a 50 voce simplesmente poe uma verificação de multiplicidade por 50 e faz um Thread.sleep(60000)
Nao vejo maior complicação isso parece ser bem simples…
e se quiser outra dica, larga mao do java mail e fica somente com a api commons, te garanto que sua vida será muito mais bem-sucedida

—edit
Agora fui ver que voce tambem ta usando defaultTableModel…
Cria vergonha e larga mão desse POG, pesquise aqui mesmo no forum sobre implementação do seu proprio table model…

mateusviccari

Então hoje a tarde dei uma melhorada nos métodos e exclui o envio pela API Java Mail estou usando somente um que é Commons Mail da Apache, ele possui o MultPartMaill que igual ao JavaMail só que ele pode pegar o arquivo direto no servidor pelo attachment.setURL., meu programa já conta 9 classes com a de configuração e Database e 4 interfaces.

Então eu estou estudando Threads porem como eu faria para passar os valores, criaria uma nova classe extends Thread? Os exemplos de Thread que achei são simples com laços,so meu caso necessito passar o destinatario, caminhoArquivo, menssagem e tipo email(1,2)

Alguém poderia me passar um exemplo para esse meu caso

Obrigado

Pode até criar uma classe que extenda Thread como voce falou…
Ai voce faz todo o processamento dentro do método public void run() dessa classe que extende Thread e la no programa principal voce so cria a instancia dessa thread e manda executar…
Eu só nao sei como voce ta fazendo pra carregar a lista de destinatarios, mas seja qual for a forma que esta fazendo isso, eu recomendo que voce carregue tudo dentro da thread que voce criou, e no botão “Enviar” do seu programa principal voce apenas crie a instancia dessa Thread e chama o método run() dela… E todo o processamento voce faz la dentro…

[size=12][color=black]Então eu modelei o banco com a seguintes características, id , nome, email …ultimo_news(DATE) , próximo_news(DATE), dia_semana_news(Segunda, terça…) e período_news(quinzenal, semanal, etc), e na hora de gerar a lista eu criei uma classe DateControl que tem um Gregorian Calendar e metodos como getDiaSemana, getNextNews(que faz a matemática com as dadas somando por exemplo hoje+15 dias e verifica se cai em uma terça…), No banco de dados eu coloquei uma validação ex: if(próximi_news==2012-07-24) -> isso faz com que somente entre as pessoas que vai ser enviado o email.[/color]

e Mateus ainda tenho um problema ontem fiz um teste ao enviar o email com o método attachment.setURL(new URL(meu caminho)); na hora que eu enviar os dados para este método eu tenho que fazer uma especie de thread().wait(15); que é o tempo dele fazer o InputStream do anexo.