在Android中的后台自动发送邮件

当我在日志显示邮件发送但按实际邮件未发送时按下发送按钮。 请帮我下面的代码。 邮件为何未发送?

GMailSender.java

package com.example.sendmail; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.BodyPart; import javax.mail.Message; 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; 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; private Multipart _multipart = new MimeMultipart(); static { Security.addProvider(new com.example.sendmail.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); BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText(body); _multipart.addBodyPart(messageBodyPart); // Put parts in message message.setContent(_multipart); 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) { } } public void addAttachment(String filename) throws Exception { BodyPart messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName("download image"); _multipart.addBodyPart(messageBodyPart); } 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.sendmail; import java.security.AccessController; import java.security.Provider; public final class JSSEProvider extends Provider { public JSSEProvider() { super("HarmonyJSSE", 1.0, "Harmony JSSE Provider"); AccessController .doPrivileged(new java.security.PrivilegedAction() { 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; } }); } } 

MainActivity.java

 package com.example.sendmail; import android.os.Bundle; import android.os.Environment; import android.annotation.SuppressLint; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { Button send; //String filename = "/sdcard/mysdfile"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); send = (Button) findViewById(R.id.send); send.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub new Thread(new Runnable() { @SuppressLint("SdCardPath") public void run() { try { GMailSender sender = new GMailSender("sendermail@gmail.com","**password***"); ///Toast.makeText(getApplicationContext(), "Connect", Toast.LENGTH_LONG).show(); //sender.addAttachment(filename); sender.addAttachment(Environment.getExternalStorageDirectory().getPath()+"/sdcard/mysdfile.txt"); sender.sendMail("Test mail", "This mail has been sent from android app along with attachment","sendermail@gmail.com", "recievermail@yahoo.com"); Log.i("Mail", "Sent"); //Toast.makeText(getApplicationContext(),"Your mail has been sent",Toast.LENGTH_LONG).show(); } catch (Exception e) { runOnUiThread(new Runnable() { public void run() { Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_SHORT).show(); } }); Log.i("Mail", "Failed"+e); //Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show(); } } }).start(); send.setText("Ok"); } }); } } 

不会出现错误,也不会在发件人邮件中发送邮件,也不会在收件人邮件收件箱中发送邮

MainActivity.java

按下按钮点击::

 String fromEmail = "sample@gmail.com"; String fromPassword = "xxxxxx"; String toEmails = to_sample@gmail.com; String adminEmail = "admin@gmail.com"; String emailSubject = "App Registration Mail"; String adminSubject = "App Registration Mail"; String emailBody = "Your message"; String adminBody = "Your message"; new SendMailTask(YOurActivity.this).execute(fromEmail, fromPassword, toEmails, emailSubject, emailBody); 

GMail.java

 import java.io.UnsupportedEncodingException; import java.util.List; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import android.app.AlertDialog.Builder; import android.util.Log; public class GMail { final String emailPort = "587";// gmail's smtp port final String smtpAuth = "true"; final String starttls = "true"; final String emailHost = "smtp.gmail.com"; String fromEmail; String fromPassword; @SuppressWarnings("rawtypes") String toEmailList; String emailSubject; String emailBody; Properties emailProperties; Session mailSession; MimeMessage emailMessage; public GMail() { } @SuppressWarnings("rawtypes") public GMail(String fromEmail, String fromPassword, String toEmailList, String emailSubject, String emailBody) { this.fromEmail = fromEmail; this.fromPassword = fromPassword; this.toEmailList = toEmailList; this.emailSubject = emailSubject; this.emailBody = emailBody; emailProperties = System.getProperties(); emailProperties.put("mail.smtp.port", emailPort); emailProperties.put("mail.smtp.auth", smtpAuth); emailProperties.put("mail.smtp.starttls.enable", starttls); Log.i("GMail", "Mail server properties set."); } public MimeMessage createEmailMessage() throws AddressException, MessagingException, UnsupportedEncodingException { mailSession = Session.getDefaultInstance(emailProperties, null); emailMessage = new MimeMessage(mailSession); emailMessage.setFrom(new InternetAddress(fromEmail, fromEmail)); Log.i("GMail","toEmail: "+toEmailList); emailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmailList)); emailMessage.setSubject(emailSubject); emailMessage.setContent(emailBody, "text/html");// for a html email // emailMessage.setText(emailBody);// for a text email Log.i("GMail", "Email Message created."); return emailMessage; } public void sendEmail() throws AddressException, MessagingException { Transport transport = mailSession.getTransport("smtp"); transport.connect(emailHost, fromEmail, fromPassword); Log.i("GMail","allrecipients: "+emailMessage.getAllRecipients()); transport.sendMessage(emailMessage, emailMessage.getAllRecipients()); transport.close(); Log.i("GMail", "Email sent successfully."); } } 

SendMailTask​​.java:

 import java.util.List; import android.app.Activity; import android.app.ProgressDialog; import android.app.AlertDialog.Builder; import android.os.AsyncTask; import android.util.Log; @SuppressWarnings("rawtypes") public class SendMailTask extends AsyncTask { private ProgressDialog statusDialog; private Activity sendMailActivity; public SendMailTask(Activity activity) { sendMailActivity = activity; } protected void onPreExecute() { statusDialog = new ProgressDialog(sendMailActivity); statusDialog.setMessage("Getting ready..."); statusDialog.setIndeterminate(false); statusDialog.setCancelable(false); statusDialog.show(); } @SuppressWarnings("unchecked") @Override protected Object doInBackground(Object... args) { try { Log.i("SendMailTask", "About to instantiate GMail..."); publishProgress("Processing input...."); GMail androidEmail = new GMail(args[0].toString(), args[1].toString(), args[2].toString(), args[3].toString(), args[4].toString()); publishProgress("Preparing mail message...."); androidEmail.createEmailMessage(); publishProgress("Sending email...."); androidEmail.sendEmail(); publishProgress("Email Sent."); Log.i("SendMailTask", "Mail Sent."); Config.mailSuccess="1"; } catch (Exception e) { publishProgress(e.getMessage()); Log.e("SendMailTask", e.getMessage(), e); } return null; } @Override public void onProgressUpdate(Object... values) { statusDialog.setMessage(values[0].toString()); } @Override public void onPostExecute(Object result) { statusDialog.dismiss(); } } 

库文件

您需要导入lib BackgroundMailLibrary

  BackgroundMail bm = new BackgroundMail(PasswordChangeActivity.this); bm.setGmailUserName(mail id); bm.setGmailPassword(Utils.decryptIt(password)); bm.setMailTo(ownerEmail); bm.setFormSubject(subject); bm.setFormBody(body); bm.send(); 

邮件从后台发送…

您可以使用javaMail从后台发送邮件
首先,你需要添加这三个.jar文件…
下载这些jar文件

(1)Activation.jar : http : //www.java2s.com/Code/Jar/a/Downloadactivationjar.htm
(2)Additionnal.jar: http //code.google.com/p/javamail-android/downloads/detail?name = additionnal.jar&can = 2& q =
(3)mail.jar: http //www.java2s.com/Code/Jar/m/Downloadmailjar.htm

然后使用以下代码:
MainActivity.java

 import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.SendFailedException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity{ EditText email_to,subjectEdit,messageEdit; Button mailButton; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initialize(); mailButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { sendMail(); } }); } private void initialize() { email_to=(EditText)findViewById(R.id.editText_to); subjectEdit=(EditText)findViewById(R.id.editText_Subject); messageEdit=(EditText)findViewById(R.id.editText_Message); mailButton=(Button)findViewById(R.id.btn_SendMail); } protected void sendMail() { final String username = "Your Gmail Id "; final String password = "Your Gmail password"; Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.port", "587"); Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); try { Message message = new MimeMessage(session); message.setFrom(new InternetAddress(username)); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(email_to.getText().toString())); message.setSubject("Sent from MobileApp" + subjectEdit.getText().toString()); message.setText("Message : ," + "\n\n"+ messageEdit.getText().toString()); new SendMailTask().execute(message); }catch (MessagingException mex) { mex.printStackTrace(); } } private class SendMailTask extends AsyncTask { private ProgressDialog progressDialog; @Override protected void onPreExecute() { super.onPreExecute(); progressDialog = ProgressDialog.show(MainActivity.this,null, "Sending mail", true, false); } @Override protected String doInBackground(Message... messages) { try { Transport.send(messages[0]); return "Success"; } catch(SendFailedException ee) { if(progressDialog.isShowing()) progressDialog.dismiss(); return "error1"; }catch (MessagingException e) { if(progressDialog.isShowing()) progressDialog.dismiss(); return "error2"; } } @Override protected void onPostExecute(String result) { if(result.equals("Success")) { super.onPostExecute(result); progressDialog.dismiss(); Toast.makeText(MainActivity.this, "Mail Sent Successfully", Toast.LENGTH_LONG).show(); subjectEdit.setText(""); messageEdit.setText(""); } else if(result.equals("error1")) Toast.makeText(MainActivity.this, "Email Failure", Toast.LENGTH_LONG).show(); else if(result.equals("error2")) Toast.makeText(MainActivity.this, "Email Sent problem2", Toast.LENGTH_LONG).show(); } } } 

activity_main.xml中

          

AndroidManifest.xml中
仅添加此权限…

  

添加您的清单文件:::