Pergunta

Eu adicionei os três arquivos jar do java build path,acrescentou a Internet usa a permissão de todos os setted bom para ir.!Eu posto um botão na minha página principal, sempre que eu clicar no botão, uma intenção para esta java email classe para trabalhar, e o e-mail enviar para os usuários correspondentes.Mas quando eu clicar no botão de repente mostra que Appplication parou de funcionar..!!Uma coisa é que eu não usado qualquer layout para esta java email de classe.que você vai entender quando você ver o código abaixo.isso porque eu quero enviar a mensagem automaticamente.!!o que fazer.??me ajuda galera.??Obrigado.!!

package;


import java.util.Date; 
import android.content.Intent;
import java.util.Properties; 
import javax.activation.CommandMap; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
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; 


public class Mail extends javax.mail.Authenticator { 


  private String _user;
  private String _pass;

 private String to1,to2,to3,to4,to5; // here i putted my recepients name
  private String[] _to = {to1,to2,to3,to4,to5}; 
  private String _from; 

  private String _port; 
  private String _sport; 

  private String _host; 

  private String _subject = "HELLO";
  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 



    _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("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
      Session session = Session.getInstance(props, this); 

      MimeMessage msg = new MimeMessage(session); 

      msg.setFrom(new InternetAddress(_from)); 

      InternetAddress[] addressTo = new InternetAddress[_to.length]; 
      for (int i = 0; i < _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.send(msg); 

      return true; 
    } else { 
      return false; 
    } 
  } 

  public void addAttachment(String filename) throws Exception { 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    DataSource source = new FileDataSource(filename); 
    messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(filename); 

    _multipart.addBodyPart(messageBodyPart); 
  } 

  @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; 
  } 

  // more of the getters and setters ….. 
} 
Foi útil?

Solução

Você deve colocar o código que chama isso de classe (é provável que seu Activity).Existem alguns problemas comuns que podem causar isso, como a NetworkOnMainThreadException.

Eu escrevi algumas Android-mail o código com base no mesmo javax.mail código, e ele funciona corretamente.Aqui está o código:

    submitButton.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v) {

            /*
             * Send email in a background thread
             */
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {

                    // retrieve the configuration values from preferences
                    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(theActivity);
                    String destinationAddress = preferences.getString("email_destination_address", theActivity.getString(R.string.default_email_destination_address));
                    String senderAddress = preferences.getString("email_from", theActivity.getString(R.string.default_email_sender_address));
                    String senderPassword = preferences.getString("email_password", theActivity.getString(R.string.default_email_sender_password));
                    String smtpServer = preferences.getString("email_server", theActivity.getString(R.string.default_smtp_server));

                    Mail m = new Mail(senderAddress, senderPassword);

                    String[] toArr = { destinationAddress };
                    m.setHost(smtpServer);
                    m.setTo(toArr);
                    m.setFrom(EMAIL_USERNAME);
                    m.setSubject(getString(R.string.email_subject, barcode));
                    m.setBody(getString(R.string.email_body));

                    try {
                        ArrayList<String> filesToSend = theAdapter.getFilenames();

                        for (String file : filesToSend)
                        {
                            m.addAttachment(file);
                        }

                        if (m.send()) {
                            Log.d(TAG, "EMAIL SENT SUCCESSFULLY");
                        } else {
                            Log.w(TAG, "EMAIL NOT SENT");
                        }
                    } catch (Exception e) {
                        Log.e(TAG, "Could not send email", e);
                    }

                }
            });
            t.start();
            Toast.makeText(getApplicationContext(), getString(R.string.email_sending), Toast.LENGTH_LONG).show();

            theActivity.onBackPressed();
        }
    });

Nota:se eu estivesse escrevendo este código, hoje, eu poderia usar um AsyncTask em vez de um Segmento, mas são considerados válidos.

Outras dicas

Está faltando o resto do código para getters e setters.Veja o comentário na parte inferior do seu código:

// more of the getters and setters …..

Você precisa adicionar o seguinte no lugar do comentário:

/**
 * METHOD TO SET THE "TO" STRING ARRAY
 * @param toArr
 */
public void setTo(String[] toArr) {
    this._to = toArr;
}

/**
 * METHOD TO GET THE "TO" STRING ARRAY
 * @return
 */
public String[] getTo() {
    return _to;
} 

/**
 * METHOD TO SET THE "FROM" FIELD FOR THE MESSAGE
 * @param string
 */
public void setFrom(String string) {
    this._from = string;
}

/**
 * METHOD TO GET THE "FROM" FIELD FOR THE MESSAGE
 * @return
 */
public String getFrom() {
    return _from;
} 

/**
 * METHOD TO SET THE MESSAGE SUBJECT
 * @param string
 */
public void setSubject(String string) {
    this._subject = string;
} 

/**
 * METHOD TO GET THE MESSAGE SUBJECT
 * @return
 */
public String getSubject() {
    return _subject;
} 

Isso deve funcionar.O próximo obstáculo que você terá de enfrentar será que DShaw menciona abaixo sobre o NetworkOnMainThreadException, o que pode ser corrigido usando este post para não verificar StrictMode, mas a melhor opção é usar AsyncTask como é discutido em este o post.

[EDITAR] eu também tive um problema com o proguard!Se nenhuma das opções acima funcionar, tente desabilitar o proguard para ver se ele funciona, então.

Espero que isso ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top