Java邮件API在Android中无法工作 [英] Java mail API not working in android

查看:68
本文介绍了Java邮件API在Android中无法工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将三个jar文件添加到java构建路径,添加Internet使用权限全部设置好了。我在主页上放了一个按钮,每当我点击这个按钮一个意图,这个java邮件类工作,并且电子邮件必须发送给相应的用户。但是当我点击按钮突然显示Appplication停止工作..有一件事是我没有使用这个java邮件类的任何布局。当您看到以下代码时,您将明白。这是因为我想自动发送消息。该怎么办。??帮助我们谢谢。!!

 包; 


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;

私人字符串to1,to2,to3,to4,to5; //这里我把我的收件人名称
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 - $ on

_multipart = new MimeMultipart();

// MailCap有问题,javamail无法找到多部分/混合部分的处理程序,因此需要添加该位。
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异常{
属性props = _setProperties();

if(!_ user.equals()&!_pass.equals()& _to.length> 0& )&!_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]; (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());

//设置消息体
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText(_body);
_multipart.addBodyPart(messageBodyPart);

//将消息放在消息中
msg.setContent(_multipart);

//发送电子邮件
Transport.send(msg);

返回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(){
返回新的PasswordAuthentication(_user,_pass);
}

私有属性_setProperties(){
属性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);

返回道具;
}

// getter和setter
public String getBody(){
return _body;
}

public void setBody(String _body){
this._body = _body;
}

//更多的getter和setter ... ..
}


解决方案

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



我根据相同的 javax.mail 代码编写了一些工作的Android邮件代码,它的工作正常。以下是代码:

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

/ *
*在后台线程中发送电子邮件
* /
线程t =新线程(new Runnable() {
@Override
public void run(){

//从首选项检索配置值
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.getStrin g(email_password,theActivity.getString(R.string.default_email_sender_password));
String smtpServer = preferences.getString(email_server,theActivity.getString(R.string.default_smtp_server));

邮件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();

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

if(m.send()){
Log.d(TAG,EMAIL SENT SUCCESSFULLY);
} else {
Log.w(TAG,EMAIL NOT SENT);
}
} catch(异常e){
Log.e(TAG,无法发送电子邮件,e);
}

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

theActivity.onBackPressed();
}
});

注意:如果我今天写这个代码,我可能会使用一个 AsyncTask 而不是线程,但是被认为是有效的。


I added the three jar files to java build path,added Internet uses permission all setted good to go.! I putted a button in my main page, whenever i click on this button an intent to this java mail class to work, and the email have to send to the corresponding users. But when i click on the button It suddenly shows up that Appplication stopped working..!! One thing is that i didnt used any layout for this java mail class. that you will understand when you see the below code. it cause i want to send the message automatically.!! what to do.?? help me guys.?? Thank You.!!

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 ….. 
} 

解决方案

You should post the code that calls this class (likely your Activity). There are some common problems that could cause this, like the NetworkOnMainThreadException.

I wrote some working Android mail code based on the same javax.mail code, and it works correctly. Here's the code:

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

Note: if I were writing this code today I might use an AsyncTask instead of a Thread, but either are considered valid.

这篇关于Java邮件API在Android中无法工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆