Вопрос

Я добавил три файла jar в путь сборки Java, добавил разрешение на использование Интернета, все готово.!Я поместил кнопку на свою главную страницу, и всякий раз, когда я нажимаю на эту кнопку, этот класс почты Java должен работать, и электронное письмо должно быть отправлено соответствующим пользователям.Но когда я нажимаю кнопку, внезапно обнаруживается, что приложение перестало работать..!!Во-первых, я не использовал какой-либо макет для этого почтового класса Java.это вы поймете, когда увидите приведенный ниже код.это потому, что я хочу отправить сообщение автоматически.!!что делать.??помогите мне, ребята.??Спасибо.!!

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 ….. 
} 
Это было полезно?

Решение

Вам следует опубликовать код, вызывающий этот класс (вероятно, ваш Activity).Это может быть вызвано некоторыми распространенными проблемами, например NetworkOnMainThreadExceptionException.

Я написал рабочий почтовый код Android на основе того же javax.mail код, и он работает правильно.Вот код:

    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();
        }
    });

Примечание:если бы я писал этот код сегодня, я мог бы использовать AsyncTask вместо Thread, но любой из них считается действительным.

Другие советы

Вы не пропустите остальную часть кода для Getter и Benters. Смотрите комментарий в нижней части вашего кода:

// more of the getters and setters …..
.

Вам нужно добавить следующее вместо этого комментария:

/**
 * 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;
} 
.

Это должно работать. Следующее препятствие, которое вы столкнетесь, станут тем, что DSHAW упоминает ниже о ettemoneonmaintHeacexexception , который может быть закреплен либо с использованием этого post не Проверьте StrictMode, но лучший вариант должен использовать Asynctask Ase Это сообщение post.

[править] У меня также была проблема с Proguard! Если ни одно из вышеперечисленных не работает, попробуйте отключить PROGUARD, чтобы увидеть, что он работает тогда.

Надеюсь, это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top