【问题标题】:Java mail API not working in androidJava邮件API在android中不起作用
【发布时间】:2014-02-05 04:55:49
【问题描述】:

我将三个jar文件添加到java构建路径,添加Internet使用权限都设置好了!我在我的主页上放了一个按钮,每当我点击这个按钮时,这个 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 ….. 
} 

【问题讨论】:

    标签: android email jakarta-mail


    【解决方案1】:

    您应该发布调用此类的代码(可能是您的Activity)。有一些常见问题可能导致此问题,例如NetworkOnMainThreadException

    我基于相同的javax.mail 代码编写了一些有效的Android 邮件代码,并且它可以正常工作。代码如下:

        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 而不是线程,但两者都被认为是有效的。

    【讨论】:

    • 实际上我希望用户输入他们自己的电子邮件收件人以及用户名和密码。!!用户可以使用不同的电子邮件,如 gmail、yahoo、redifff...等!!那么如何设置所有这些.??
    • 我的意思是所有这些邮件服务的 SMTP..//!!你明白我在说什么吗?!!我想让用户用他的用户名和密码输入收件人的邮件地址。应用程序必须获取所有这些值并且必须自动发送电子邮件。只需点击按钮。
    【解决方案2】:

    您缺少 getter 和 setter 的其余代码。请参阅代码底部的注释:

    // 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 在下面提到的有关 NetworkOnMainThreadException 的内容,可以通过使用此 post 来修复它而不检查 StrictMode,但更好的选择是使用 AsyncTask,如 @987654324 中所述@帖子。

    [编辑] 我也遇到了 proguard 的问题!如果以上方法都不起作用,请尝试禁用 proguard 以查看它是否起作用。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      相关资源
      最近更新 更多