title: how to resolve java smtpclass bug in android
body: <p>i want send email to a group of people with separate content ( ever person with a special content ).</p>
  
  <p>i use timer because i have a progressbar. this is my code :</p>
  
  <pre><code>          ..............
            ..............
            timer.schedule(new TimerTask() {
          @Override
          public void run() {
              activity.runOnUiThread(new Runnable() {
                  @Override
                  public void run() {
  
                      if (progress.getProgress() == 100){
                          timer.cancel();
  
                          closeBtn.setVisibility(View.VISIBLE);
                      }
                          int current_index = 1;
                          for (String sid : SID) {
  
  
  
  
                              String html = ReportGenerator.getHtmlContent( current_index );
  
  
  
                              if (email) {
  
                                  String rec_email[] = new String[1];
                                  rec_email[0] = emailList.get( current_index );
                                  mail.setSubject(ctx.getString(R.string.ReportDialog_email));
                                  mail.setTo(rec_email);
                                  mail.setFrom(FROM);
                                  mail.setBody(html);
  
                                  try {
                                      boolean i = mail.send();
                                      if (i) {
  
  
                                          Toast.makeText(ctx, "Email was sent successfully ", Toast.LENGTH_LONG).show();
  
  
                                      } else {
  
  
                                          Toast.makeText(ctx, "Email was not sent successfully ", Toast.LENGTH_LONG).show();
  
  
                                      }
                                  } catch (Exception e2) {
                                      // TODO Auto-generated catch block
                                      e2.printStackTrace();
                                  }
                              }
  
  
                                  progress.setProgress(Math.round((current_index / SID.size()) * 100));
  
  
  
                                  current_index += 1;
  
  
                          }
  
                  }
              });
          }
      }, 1000, 100);
      ................
  </code></pre>
  
  <p>email sent successfully but over and over ( in endless loop ) until program closed by force ( force closing )</p>
  
  <p>this is my smtp class :</p>
  
  <pre><code>       package com.example.habib.share;
  
       import java.io.ByteArrayInputStream;
       import java.io.IOException;
       import java.io.InputStream;
       import java.io.OutputStream;
       import java.util.Date;
       import java.util.Properties;
       import javax.activation.CommandMap;
       import javax.activation.DataHandler;
       import javax.activation.DataSource;
       import javax.activation.MailcapCommandMap;
       import javax.mail.BodyPart;
       import javax.mail.Multipart;
       import javax.mail.PasswordAuthentication;
       import javax.mail.Session;
       import javax.mail.Transport;
       import javax.mail.internet.InternetAddress;
       import javax.mail.internet.MimeBodyPart;
       import javax.mail.internet.MimeMessage;
       import javax.mail.internet.MimeMultipart;
  
       import android.util.Log;
  
  
       public class Mail extends javax.mail.Authenticator {
  private String _user;
  private String _pass;
  
  private String[] _to;
  private String _from;
  
  private String _port;
  private String _sport;
  
  private String _host;
  
  private String _subject;
  private String _body;
  
  private boolean _auth;
  
  private boolean _debuggable;
  
  private Multipart _multipart;
  
  
  public Mail() {
      _host = "smtp.gmail.com"; // default smtp server
      _port = "465"; // default smtp port
      _sport = "465"; // default socketfactory port
  
      _user = ""; // username
      _pass = ""; // password
      _from = ""; // email sent from
      _subject = ""; // email subject
      _body = ""; // email body
  
      _debuggable = false; // debug mode on or off - default off
      _auth = true; // smtp authentication - default on
  
      _multipart = new MimeMultipart();
  
      // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added.
      MailcapCommandMap mc = (MailcapCommandMap)          CommandMap.getDefaultCommandMap();
      mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
      mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
      mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
      mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
      mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
      CommandMap.setDefaultCommandMap(mc);
  }
  
  public Mail(String user, String pass) {
      this();
  
      _user = user;
      _pass = pass;
  }
  
  public boolean send() throws Exception {
      Properties props = _setProperties();
  
      if(!_user.equals("") &amp;&amp; !_pass.equals("") &amp;&amp; _to.length &gt; 0 &amp;&amp; !_from.equals("") &amp;&amp; !_subject.equals("") &amp;&amp; !_body.equals("")) {
  
          Session session = Session.getInstance(props, this);
          DataHandler handler = new DataHandler(new ByteArrayDataSource(_body.getBytes(), "text/html"));
          MimeMessage msg = new MimeMessage(session);
  
          msg.setFrom(new InternetAddress(_from));
          msg.setDataHandler(handler);
          InternetAddress[] addressTo = new InternetAddress[_to.length];
          for (int i = 0; i &lt; _to.length; i++) {
              addressTo[i] = new InternetAddress(_to[i]);
          }
          msg.setRecipients(MimeMessage.RecipientType.TO, addressTo);
  
          msg.setSubject(_subject);
          msg.setSentDate(new Date());
  
          // setup message body
          BodyPart messageBodyPart = new MimeBodyPart();
          messageBodyPart.setText(_body);
          _multipart.addBodyPart(messageBodyPart);
  
          // Put parts in message
          msg.setContent(_multipart);
  
          // send email
         Transport transport = session.getTransport("smtps");
  
          Transport.send(msg);
          Log.v("mas", "Email was  send");
          return true;
      } else {
          Log.v("mas", "Email was  not send");
          return false;
  
      }
  }
  public class ByteArrayDataSource implements DataSource {
      private byte[] data;
      private String type;
  
      public ByteArrayDataSource(byte[] data, String type) {
          super();
          this.data = data;
          this.type = type;
      }
  
      public ByteArrayDataSource(byte[] data) {
          super();
          this.data = data;
      }
  
      public void setType(String type) {
          this.type = type;
      }
  
      public String getContentType() {
          if (type == null)
              return "application/octet-stream";
          else
              return type;
      }
  
      public InputStream getInputStream() throws IOException {
          return new ByteArrayInputStream(data);
      }
  
      public String getName() {
          return "ByteArrayDataSource";
      }
  
      public OutputStream getOutputStream() throws IOException {
          throw new IOException("Not Supported");
      }
  }
  
  @Override
  public PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication(_user, _pass);
  }
  
  private Properties _setProperties() {
      Properties props = new Properties();
  
      props.put("mail.smtp.host", _host);
  
      if(_debuggable) {
          props.put("mail.debug", "true");
      }
  
      if(_auth) {
          props.put("mail.smtp.auth", "true");
      }
  
      props.put("mail.smtp.port", _port);
      props.put("mail.smtp.socketFactory.port", _sport);
      props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
      props.put("mail.smtp.socketFactory.fallback", "false");
  
      return props;
  }
  
  // the getters and setters
  public String getBody() {
      return _body;
  }
  
  public void setBody(String _body) {
      this._body = _body;
  }
  
  public void setTo(String[] toArr) {
      // TODO Auto-generated method stub
      this._to=toArr;
  }
  
  public void setFrom(String string) {
      // TODO Auto-generated method stub
      this._from=string;
  }
  
  public void setSubject(String string) {
      // TODO Auto-generated method stub
      this._subject=string;
  }
  
  // more of the getters and setters …..
    }
  </code></pre>
  
  <p><strong>notice : email body changed for every person.</strong> so i cant use :</p>
  
  <pre><code>      String rec_email[] = {"email1","email2" , ....};
  </code></pre>
  
  <p>and use one times sendMail function, because in this case send same content to all.</p>
  
  <p>where is the problem??
  Please help me.</p>