studio por mensaje enviar electronico correo como abrir java android android-intent javamail

java - electronico - enviar mensaje por correo en android studio



Enviar correo electrónico en Android utilizando la API de JavaMail sin usar la aplicación predeterminada/incorporada (22)

GmailBackground es una pequeña biblioteca para enviar un correo electrónico en segundo plano sin interacción del usuario:

Uso:

BackgroundMail.newBuilder(this) .withUsername("[email protected]") .withPassword("password12345") .withMailto("[email protected]") .withType(BackgroundMail.TYPE_PLAIN) .withSubject("this is the subject") .withBody("this is the body") .withOnSuccessCallback(new BackgroundMail.OnSuccessCallback() { @Override public void onSuccess() { //do some magic } }) .withOnFailCallback(new BackgroundMail.OnFailCallback() { @Override public void onFail() { //do some magic } }) .send();

Configuración:

repositories { // ... maven { url "https://jitpack.io" } } dependencies { compile ''com.github.yesidlazaro:GmailBackground:1.2.0'' }

Permisos:

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

También para los archivos adjuntos, debe establecer el permiso READ_EXTERNAL_STORAGE:

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

Source

(Lo he probado yo mismo)

Estoy tratando de crear una aplicación de envío de correo en Android.

Si uso:

Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);

Esto lanzará la aplicación de Android incorporada; Estoy tratando de enviar el correo electrónico al hacer clic en el botón directamente sin usar esta aplicación.


No se pudo conectar al host SMTP: smtp.gmail.com, puerto: 465

Añade esta línea en tu manifiesto:

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


SMTP

El uso de SMTP es un camino a seguir, y los otros ya han señalado formas de hacerlo. Solo tenga en cuenta que al hacer esto, elude completamente la aplicación de correo integrada, y tendrá que proporcionar la dirección del servidor SMTP, el nombre de usuario y la contraseña para ese servidor, ya sea estáticamente en su código, o consultar al usuario. .

HTTP

Otra forma involucraría un simple script del lado del servidor, como php, que toma algunos parámetros de URL y los usa para enviar un correo. De esta manera, solo necesita realizar una solicitud HTTP desde el dispositivo (fácilmente posible con las bibliotecas integradas) y no necesita almacenar los datos de inicio de sesión SMTP en el dispositivo. Esta es una indirección más en comparación con el uso directo de SMTP, pero debido a que es muy fácil hacer solicitudes HTTP y enviar correos desde PHP, incluso podría ser más simple que la forma directa.

Solicitud de correo

Si el correo se envía desde la cuenta de correo predeterminada de los usuarios que ya está registrado con el teléfono, tendrá que adoptar otro enfoque. Si tiene tiempo y experiencia suficientes, es posible que desee verificar el código fuente de la aplicación de correo electrónico de Android para ver si ofrece algún punto de entrada para enviar un correo sin la interacción del usuario (no sé, pero quizás haya uno).

Tal vez incluso encuentre una manera de consultar los detalles de la cuenta de los usuarios (de modo que pueda usarlos para SMTP), aunque dudo mucho que esto sea posible, ya que sería un gran riesgo para la seguridad y Android está construido de forma bastante segura.


Aquí hay una versión alternativa que también funciona para mí y tiene archivos adjuntos (publicados anteriormente pero versión completa a diferencia del enlace de origen, que las personas que publicaron no pueden hacer que funcione debido a que faltan datos)

import java.util.Date; 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[] _to; private String _from; private String _port; private String _sport; private String _host; private String _subject; 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 _user = ""; // username _pass = ""; // password _from = ""; // email sent from _subject = ""; // email subject _body = ""; // email body _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; } public void setTo(String[] toArr) { // TODO Auto-generated method stub this._to=toArr; } public void setFrom(String string) { // TODO Auto-generated method stub this._from=string; } public void setSubject(String string) { // TODO Auto-generated method stub this._subject=string; } // more of the getters and setters ….. }

Y llamarlo en una actividad ...

@Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); Button addImage = (Button) findViewById(R.id.send_email); addImage.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Mail m = new Mail("[email protected]", "password"); String[] toArr = {"[email protected]", "[email protected]"}; m.setTo(toArr); m.setFrom("[email protected]"); m.setSubject("This is an email sent using my Mail JavaMail wrapper from an Android device."); m.setBody("Email body."); try { m.addAttachment("/sdcard/filelocation"); if(m.send()) { Toast.makeText(MailApp.this, "Email was sent successfully.", Toast.LENGTH_LONG).show(); } else { Toast.makeText(MailApp.this, "Email was not sent.", Toast.LENGTH_LONG).show(); } } catch(Exception e) { //Toast.makeText(MailApp.this, "There was a problem sending the email.", Toast.LENGTH_LONG).show(); Log.e("MailApp", "Could not send email", e); } } }); }


Aviso de advertencia si usa "smtp.gmail.com" como el servidor smtp predeterminado.

Google lo obligará a cambiar la contraseña de su cuenta de correo electrónico vinculada con frecuencia debido a sus excesivas políticas de "actividad sospechosa". En esencia, trata las solicitudes repetidas de smtp de diferentes países dentro de un corto período de tiempo como "actividad sospechosa". Como suponen, usted (el titular de la cuenta de correo electrónico) solo puede estar en un país a la vez.

Cuando los sistemas de Google detectan "actividad sospechosa", se evitarán más correos electrónicos hasta que cambie la contraseña. Como habrá introducido la contraseña en la aplicación, deberá relanzar la aplicación cada vez que esto suceda, lo que no es lo ideal. Esto me sucedió 3 veces en una semana, incluso almacené la contraseña en otro servidor y obtuve la contraseña dinámicamente cada vez que Google me obligó a cambiarla.

Por lo tanto, recomiendo usar uno de los muchos proveedores de smtp gratuitos en lugar de "smtp.gmail.com" para evitar este problema de seguridad. Use el mismo código pero cambie "smtp.gmail.com" a su nuevo host de reenvío de smtp.



Envíe correo electrónico en Android utilizando la API de JavaMail usando la autenticación de Gmail.

Pasos para crear un proyecto de muestra:

MailSenderActivity.java:

public class MailSenderActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Button send = (Button) this.findViewById(R.id.send); send.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { GMailSender sender = new GMailSender("[email protected]", "password"); sender.sendMail("This is Subject", "This is Body", "[email protected]", "[email protected]"); } catch (Exception e) { Log.e("SendMail", e.getMessage(), e); } } }); } }

GMailSender.java:

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.provider.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){ } } 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:

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @author Alexander Y. Kleymenov * @version $Revision$ */ 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<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; } }); } }

AGREGA 3 frascos que se encuentran en el siguiente enlace a tu proyecto de Android

Haga clic aquí - Cómo agregar tarros externos

Y no olvides añadir esta línea en tu manifiesto:

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

Simplemente haga clic en el enlace a continuación para cambiar el acceso a la cuenta para aplicaciones menos seguras https://www.google.com/settings/security/lesssecureapps

Ejecute el proyecto y revise su cuenta de correo del destinatario para el correo. ¡Aclamaciones!

PD: y no olvides que no puedes realizar operaciones de red desde ninguna actividad en Android. Por lo tanto, se recomienda usar AsyncTask o IntentService para evitar la red en la excepción del hilo principal.

Archivos jar: https://code.google.com/archive/p/javamail-android/


Gracias por tu valiosa información. El código está funcionando bien. Puedo agregar archivos adjuntos también agregando el siguiente código.

private Multipart _multipart; _multipart = new MimeMultipart(); public void addAttachment(String filename,String subject) throws Exception { BodyPart messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(filename); _multipart.addBodyPart(messageBodyPart); BodyPart messageBodyPart2 = new MimeBodyPart(); messageBodyPart2.setText(subject); _multipart.addBodyPart(messageBodyPart2); } message.setContent(_multipart);


Para ayudar a los usuarios a obtener una excepción de subproceso en la red con un destino de SDK> 9. Esto está usando el código de droopie anterior pero funcionará de manera similar para cualquiera.

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); android.os.NetworkOnMainThreadException

Puede utilizar AsyncTask como a continuación

public void onClickMail(View view) { new SendEmailAsyncTask().execute(); } class SendEmailAsyncTask extends AsyncTask <Void, Void, Boolean> { Mail m = new Mail("[email protected]", "my password"); public SendEmailAsyncTask() { if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "SendEmailAsyncTask()"); String[] toArr = { "to [email protected]"}; m.setTo(toArr); m.setFrom("from [email protected]"); m.setSubject("Email from Android"); m.setBody("body."); } @Override protected Boolean doInBackground(Void... params) { if (BuildConfig.DEBUG) Log.v(SendEmailAsyncTask.class.getName(), "doInBackground()"); try { m.send(); return true; } catch (AuthenticationFailedException e) { Log.e(SendEmailAsyncTask.class.getName(), "Bad account details"); e.printStackTrace(); return false; } catch (MessagingException e) { Log.e(SendEmailAsyncTask.class.getName(), m.getTo(null) + "failed"); e.printStackTrace(); return false; } catch (Exception e) { e.printStackTrace(); return false; } }


Para enviar un mail con archivo adjunto.

public class SendAttachment{ public static void main(String [] args){ //to address String to="[email protected]";//change accordingly //from address final String user="[email protected]";//change accordingly final String password="password";//change accordingly 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); //1) get the session object Properties properties = System.getProperties(); properties.put("mail.smtp.port", "465"); properties.put("mail.smtp.host", "smtp.gmail.com"); properties.put("mail.smtp.socketFactory.port", "465"); properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); properties.put("mail.smtp.auth", "true"); properties.put("mail.smtp.port", "465"); Session session = Session.getDefaultInstance(properties, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user,password); } }); //2) compose message try{ MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress(user)); message.addRecipient(Message.RecipientType.TO,new InternetAddress(to)); message.setSubject("Hii"); //3) create MimeBodyPart object and set your message content BodyPart messageBodyPart1 = new MimeBodyPart(); messageBodyPart1.setText("How is This"); //4) create new MimeBodyPart object and set DataHandler object to this object MimeBodyPart messageBodyPart2 = new MimeBodyPart(); //Location of file to be attached String filename = Environment.getExternalStorageDirectory().getPath()+"/R2832.zip";//change accordingly DataSource source = new FileDataSource(filename); messageBodyPart2.setDataHandler(new DataHandler(source)); messageBodyPart2.setFileName("Hello"); //5) create Multipart object and add MimeBodyPart objects to this object Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart1); multipart.addBodyPart(messageBodyPart2); //6) set the multiplart object to the message object message.setContent(multipart ); //7) send message Transport.send(message); System.out.println("MESSAGE SENT...."); }catch (MessagingException ex) {ex.printStackTrace();} } }


Puede utilizar la API de JavaMail para manejar sus tareas de correo electrónico. La API de JavaMail está disponible en el paquete JavaEE y su jar está disponible para descargar. Lamentablemente, no se puede utilizar directamente en una aplicación de Android, ya que utiliza componentes AWT que son completamente incompatibles en Android.

Puede encontrar el puerto de Android para JavaMail en la siguiente ubicación: http://code.google.com/p/javamail-android/

Agregue los frascos a su aplicación y use el método SMTP


Código de trabajo 100% con demostración También puede enviar varios correos electrónicos con esta respuesta.

Descargar Proyecto HERE

Paso 1: descargue el correo, la activación, los archivos jar adicionales y agregue su carpeta de proyectos en Android Studio. He añadido una captura de pantalla ver más abajo Enlace de descarga

Inicia sesión con gmail ( usando tu correo ) y enciende el botón LINK

La mayoría de la gente se olvida de este paso, espero que no.

Paso 2: Después de completar este proceso. Copia y pasa estas clases en tu proyecto.

GMail.java

import android.util.Log; 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; 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; List<String> toEmailList; String emailSubject; String emailBody; Properties emailProperties; Session mailSession; MimeMessage emailMessage; public GMail() { } public GMail(String fromEmail, String fromPassword, List<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)); for (String toEmail : toEmailList) { Log.i("GMail", "toEmail: " + toEmail); emailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail)); } 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 android.app.Activity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.util.Log; import java.util.List; 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(); } @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(), (List) args[2], 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."); } 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(); } }

Paso 3: Ahora puede cambiar esta clase de acuerdo con sus necesidades y también puede enviar varios correos utilizando esta clase. Proporciono archivos XML y Java tanto.

actividad_mail.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingLeft="20dp" android:paddingRight="20dp" android:paddingTop="30dp"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="10dp" android:text="From Email" /> <EditText android:id="@+id/editText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#FFFFFF" android:cursorVisible="true" android:editable="true" android:ems="10" android:enabled="true" android:inputType="textEmailAddress" android:padding="5dp" android:textColor="#000000"> <requestFocus /> </EditText> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="10dp" android:text="Password (For from email)" /> <EditText android:id="@+id/editText2" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#FFFFFF" android:ems="10" android:inputType="textPassword" android:padding="5dp" android:textColor="#000000" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="10dp" android:text="To Email" /> <EditText android:id="@+id/editText3" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ffffff" android:ems="10" android:inputType="textEmailAddress" android:padding="5dp" android:textColor="#000000" /> <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="10dp" android:text="Subject" /> <EditText android:id="@+id/editText4" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ffffff" android:ems="10" android:padding="5dp" android:textColor="#000000" /> <TextView android:id="@+id/textView5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="10dp" android:text="Body" /> <EditText android:id="@+id/editText5" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ffffff" android:ems="10" android:inputType="textMultiLine" android:padding="35dp" android:textColor="#000000" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send Email" /> </LinearLayout>

SendMailActivity.java

import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.util.Arrays; import java.util.List; public class SendMailActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Button send = (Button) this.findViewById(R.id.button1); send.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Log.i("SendMailActivity", "Send Button Clicked."); String fromEmail = ((TextView) findViewById(R.id.editText1)) .getText().toString(); String fromPassword = ((TextView) findViewById(R.id.editText2)) .getText().toString(); String toEmails = ((TextView) findViewById(R.id.editText3)) .getText().toString(); List<String> toEmailList = Arrays.asList(toEmails .split("//s*,//s*")); Log.i("SendMailActivity", "To List: " + toEmailList); String emailSubject = ((TextView) findViewById(R.id.editText4)) .getText().toString(); String emailBody = ((TextView) findViewById(R.id.editText5)) .getText().toString(); new SendMailTask(SendMailActivity.this).execute(fromEmail, fromPassword, toEmailList, emailSubject, emailBody); } }); } }

Nota No olvide agregar permisos de Internet en su archivo AndroidManifest.xml

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

Espero que funcione si no es así, simplemente comentar abajo.


En caso de que se le solicite mantener la biblioteca jar lo más pequeña posible, puede incluir la función SMTP / POP3 / IMAP por separado para evitar el problema de "demasiados métodos en el dex".

Puede elegir las bibliotecas jar deseadas desde la página web javanet , por ejemplo, mailapi.jar + imap.jar puede permitirle acceder a icloud, el servidor de correo de hotmail en el protocolo IMAP. (con la ayuda de additional.jar y activation.jar)


Encontré una alternativa más corta para otros que necesitan ayuda. El código es:

package com.mkyong.common; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class SendMailTLS { public static void main(String[] args) { final String username = "[email protected]"; final String password = "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("[email protected]")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("[email protected]")); message.setSubject("Testing Subject"); message.setText("Dear Mail Crawler," + "/n/n No spam to my email, please!"); Transport.send(message); System.out.println("Done"); } catch (MessagingException e) { throw new RuntimeException(e); } } }

Fuente: Enviar correo electrónico a través de la API de JavaMail

¡Espero que esto ayude! ¡Buena suerte!


Para agregar el archivo adjunto, no te olvides de agregar.

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


Sin la intervención del usuario, puede enviar de la siguiente manera:

  1. Enviar correo electrónico desde el cliente apk. Aquí mail.jar, activation.jar es necesario para enviar un correo electrónico de Java. Si se agregan estos frascos, podría aumentar el tamaño de APK.

  2. Alternativamente, puede usar un servicio web en el código del lado del servidor, que usará el mismo mail.jar yctiv.jar para enviar correos electrónicos. Puede llamar al servicio web a través de asynctask y enviar un correo electrónico. Consulte el mismo enlace.

(Sin embargo, deberá conocer las credenciales de la cuenta de correo)


¡Los que están ClassDefNotFoundErrortratando de mover esos tres archivos jar a la carpeta lib de su proyecto, funcionaron para mí!



Intenté usar el código que @Vinayak B envió. Sin embargo, me aparece un error que dice: no hay proveedor para smtp

He creado una nueva pregunta para esto con más información HERE

Después de todo, pude arreglarlo yo mismo. Tuve que usar otro mail.jar y tuve que asegurarme de que mi " https://www.google.com/settings/security/lesssecureapps " estaba activado.

Espero que esto ayude a cualquiera que tenga el mismo problema. Una vez hecho esto, esta pieza de código también funciona en Google Glass.



Todo el código proporcionado en las otras respuestas es correcto y funciona bien, pero un poco desordenado, así que decidí publicar una biblioteca (aún en desarrollo) para usarla de una manera más fácil: AndroidMail .

Solo tiene que crear un MailSender, crear un correo y enviarlo (ya manejado en segundo plano con una AsyncTask).

MailSender mailSender = new MailSender(email, password); Mail.MailBuilder builder = new Mail.MailBuilder(); Mail mail = builder .setSender(senderMail) .addRecipient(new Recipient(recipient)) .setText("Hello") .build(); mailSender.sendMail(mail);

Puede recibir una notificación del correo electrónico enviado y también tiene soporte para diferentes tipos de destinatarios (TO, CC y BCC), archivos adjuntos y html:

MailSender mailSender = new MailSender(email, password); Mail.MailBuilder builder = new Mail.MailBuilder(); Mail mail = builder .setSender(senderMail) .addRecipient(new Recipient(recipient)) .addRecipient(new Recipient(Recipient.TYPE.CC, recipientCC)) .setText("Hello") .setHtml("<h1 style=/"color:red;/">Hello</h1>") .addAttachment(new Attachment(filePath, fileName)) .build(); mailSender.sendMail(mail, new MailSender.OnMailSentListener() { @Override public void onSuccess() { // mail sent! } @Override public void onError(Exception error) { // something bad happened :( } });

Puedes conseguirlo a través de Gradle o Maven:

compile ''it.enricocandino:androidmail:1.0.0-SNAPSHOT''

Por favor, hágamelo saber si tiene algún problema con él! :)


Add jar files mail.jar,activation.jar,additionnal.jar String sub="Thank you for your online registration" ; Mail m = new Mail("emailid", "password"); String[] toArr = {"[email protected]",sEmailId}; m.setFrom("[email protected]"); m.setTo(toArr); m.setSubject(sub); m.setBody(msg); try{ if(m.send()) { } else { } } catch(Exception e) { Log.e("MailApp", "Could not send email", e); } package com.example.ekktra; import java.util.Date; 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[] _to; private String _from; private String _port; private String _sport; private String _host; private String _subject; 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 _user = ""; // username _pass = ""; // password _from = ""; // email sent from _subject = ""; // email subject _body = ""; // email body _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; } public void setTo(String[] toArr) { // TODO Auto-generated method stub this._to=toArr; } public void setFrom(String string) { // TODO Auto-generated method stub this._from=string; } public void setSubject(String string) { // TODO Auto-generated method stub this._subject=string; } }