2013-05-07 51 views
0

如何从Android发送邮件?相同的代码在Java项目中运行良好,但在Android中不能运行。如何使用JavaMail API在Android中发送邮件?

1)GmailSender.java

 import javax.activation.DataHandler; 
     import javax.activation.DataSource; 
     import javax.mail.Message; 
     import javax.mail.PasswordAuthentication; 
     import javax.mail.Session; 
     import javax.mail.Transport; 
     import javax.mail.internet.InternetAddress; 
     import javax.mail.internet.MimeMessage; 
     import java.io.ByteArrayInputStream; 
     import java.io.IOException; 
     import java.io.InputStream; 
     import java.io.OutputStream; 
     import java.security.Security; 
     import java.util.Properties; 

     public class GMailSender extends javax.mail.Authenticator { 
     private String mailhost ="smtp.gmail.com"; 
     private String user; 
     private String password; 
     private Session session; 

     static { 
     Security.addProvider(new com.idocz.JSSEProvider()); 
     } 

     public GMailSender(String user, String password) { 
     this.user = user; 
     this.password = password; 

     Properties props = new Properties(); 
     props.setProperty("mail.transport.protocol", "smtp"); 
     props.setProperty("mail.host", mailhost); 
     props.put("mail.smtp.auth", "true"); 
     props.put("mail.smtp.port","465"); 
     props.put("mail.smtp.socketFactory.port", "465"); 
     props.put("mail.smtp.socketFactory.class", 
     "javax.net.ssl.SSLSocketFactory"); 
     props.put("mail.smtp.socketFactory.fallback", "false"); 
     props.setProperty("mail.smtp.quitwait", "false"); 

     session = Session.getDefaultInstance(props, this); 
     } 

     protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication(user, password); 
     } 

     public synchronized void sendMail(String subject, String body, String sender,         String recipients) throws Exception { 
     MimeMessage message = new MimeMessage(session); 
     DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(),   "text/plain")); 
     message.setSender(new InternetAddress(sender)); 
     message.setSubject(subject); 
     message.setDataHandler(handler); 
     if (recipients.indexOf(',') > 0) 
     message.setRecipients(Message.RecipientType.TO,   InternetAddress.parse(recipients)); 
     else 
     message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients)); 
     Transport.send(message); 
     } 

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

2)JSSEProvider.java

 import java.security.AccessController; 
     import java.security.Provider; 

     public final class JSSEProvider extends Provider { 
    private static final long serialVersionUID = 1L; 
    public JSSEProvider() { 
    super("HarmonyJSSE", 1.0, "Harmony JSSE Provider"); 
    AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() { 
     public Void run() { 
       put("SSLContext.TLS", 
         "org.apache.harmony.xnet.provider.jsse.SSLContextImpl"); 
       put("Alg.Alias.SSLContext.TLSv1", "TLS"); 
       put("KeyManagerFactory.X509", 
         "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl"); 
       put("TrustManagerFactory.X509", 
         "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl"); 
       return null; 
      } 
     }); 
    } 
} 

    GMailSender sender = new GMailSender("[email protected]", "xxxxxx"); 
    sender.sendMail("Test", "Test mail", "[email protected]", "[email protected]");  

GMailSender级呼叫在活动课,但我得到的错误。

 05-07 19:59:42.729: E/dalvikvm(9567): Could not find class 'com.test.GMailSender', referenced from method com.test.sendmail$2.onClick 

    05-07 19:59:43.739: E/AndroidRuntime(9567): FATAL EXCEPTION: main 

    05-07 19:59:43.739: E/AndroidRuntime(9567): java.lang.NoClassDefFoundError: com.test.GMailSender 
+0

该错误与发送电子邮件无关。该应用程序缺少自己的应用程序。似乎你在从以下位置复制代码时犯了错误:http://stackoverflow.com/a/2033124/737885 您的IDE是否拦截此错误? – ohaleck 2013-05-07 14:43:21

+0

解决issus.thanks回复我 – sivakumar 2013-05-07 16:13:47

回答

0

首先你必须加3罐子 * 文件在libs文件夹 *在下面

  1. activation.jar
  2. additionnal.jar
  3. mail.jar

在您的应用程序中添加此代码后。

其次,你必须在添加权限的AndroidManifest.xml文件

<uses-permission android:name="android.permission.INTERNET"/> 

MainActivity.java

package com.example.mailsenderactivity; 

import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final Button send = (Button) this.findViewById(R.id.send); 
    send.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      try { 
       GMailSender sender = new GMailSender("<U R GMAIL ADDRESS>", 
         "<GMAIL PASSWORD>"); 
       sender.sendMail("This is Subject", "This is Body", 
         "<U R GMAIL (SENDER)>", "<RECIPIENT(RECEIVER) EMAIL ADDRESS>"); 
       Toast.makeText(MainActivity.this, "Mail Send Successfully.....", Toast.LENGTH_LONG).show(); 
      } catch (Exception e) { 
       Log.e("SendMail", e.getMessage(), e); 
      } 

     } 
    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

} 

GMailSender.java

package com.example.mailsenderactivity; 

import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.mail.Message; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 
import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.security.Security; 
import java.util.Properties; 

public class GMailSender extends javax.mail.Authenticator { 
private String mailhost = "smtp.gmail.com"; 
private String user; 
private String password; 
private Session session; 

static { 
    Security.addProvider(new JSSEProvider()); 
} 

public GMailSender(String user, String password) { 
    this.user = user; 
    this.password = password; 

    Properties props = new Properties(); 
    props.setProperty("mail.transport.protocol", "smtp"); 
    props.setProperty("mail.host", mailhost); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.port", "465"); 
    props.put("mail.smtp.socketFactory.port", "465"); 
    props.put("mail.smtp.socketFactory.class", 
      "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 
    props.setProperty("mail.smtp.quitwait", "false"); 

    session = Session.getDefaultInstance(props, this); 
} 

protected PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(user, password); 
} 

public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception { 
    try{ 
    MimeMessage message = new MimeMessage(session); 
    DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain")); 
    message.setSender(new InternetAddress(sender)); 
    message.setSubject(subject); 
    message.setDataHandler(handler); 
    if (recipients.indexOf(',') > 0) 
     message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients)); 
    else 
     message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients)); 
    Transport.send(message); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

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

JSSEProvider.java

package com.example.mailsenderactivity; 

import java.security.AccessController; 
import java.security.Provider; 

public class JSSEProvider extends Provider { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

public JSSEProvider() { 
    super("HarmonyJSSE", 1.0, "Harmony JSSE Provider"); 
    AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() { 
     public Void run() { 
      put("SSLContext.TLS", 
        "org.apache.harmony.xnet.provider.jsse.SSLContextImpl"); 
      put("Alg.Alias.SSLContext.TLSv1", "TLS"); 
      put("KeyManagerFactory.X509", 
        "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl"); 
      put("TrustManagerFactory.X509", 
        "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl"); 
      return null; 
     } 
    }); 
    } 
} 
+0

可以请你帮我我有相同的代码已添加JAR以及lib文件夹,但我没有得到任何错误我吐司消息/日志打印“Toast.makeText(MainActivity.this,”邮件发送成功.....“但我没有收到我提供的身份证上的任何电子邮件这里是SO问题http://stackoverflow.com/questions/21442745/failed-to-send-email-with-smtp-using -android?noredirect = 1#comment32357626_21442745 – Erum 2014-01-30 04:44:51

+0

@Erum我有同样的问题,一切似乎没问题,我没有错误,我可以看到吐司说成功的邮件发送但没有收到电子邮件..你是如何解决这个问题的 – 2017-02-27 13:44:16

相关问题