Cómo enviar correos desde Android con Apache Commons


Trabajando con Android, muchos buscamos  enviar mensajes de correo electrónico usando un servidor SMTP, utilizando autenticación y cifrado, dentro de  de la propia aplicación android de forma que sea completamente transparente para el usuario.

Por desgracia javax.mail en Android no es una buena opción, ya que depende de las clases awt (problemas por la herencia) y no siempre funciona:no en vano ,de hecho algunas personas han tratado de adaptar la librería dado  que no ser requiere todo el paquete awt , pero lamentablemente han tenido poco éxito con eso; !y eso sin mencionar a quienes que refactorizando javax.mail para Android  (que lleva muchos  años, sin ningún mantenimiento)!.

Apache Commons es un conjunto de proyectos de Apache Software Foundation, que originalmente formaron parte de Jakarta Project. El propósito de estos proyectos consiste en proveer componentes de software Java reutilizables, en código abierto. Según su grado de madurez y actividad, los proyectos se agrupan en las categorías: proper, sandbox o dormant.

Otra opción mas pragmática pues  es usar Apache Commons ,puesto que la comunidad ha añadido un SMTPSClient y un AuthenticatingSMTPClient para el cliente SMTP original ,el cual con la  aplicación de un pequeño parche  para SSL y autenticación, se puede incrustar esta biblioteca en su aplicación para Android sin necesitar dependencias transitivas para enviar correo mediante la autenticación sobre una capa segura.

Autenticación SMTP y STARTTLS

STARTTLS es una extensión a los protocolos de comunicación de texto plano, que ofrece una forma de mejorar desde una conexión de texto plano a una conexión cifrada (TLS o SSL) en lugar de utilizar un puerto diferente para la comunicación cifrada.

El puerto utilizado para  envíos de correos es generalmente 25 o el puerto 587 alternativo por lo que lo que se trata es de conectar al servidor SMTP en una conexión simple, se piden los comandos disponibles, y si se soporta STARTTLS,se  usa ,y el resto de la comunicación está cifrado.

Ahora tomemos el ejemplo de gmail, ya que el servidor es  smtp.gmail.com , como soporta autenticación y STARTTLS  podemos enviar fácilmente correos si importamos la libreria Apache Commons

 

Un ejemplo de código funcional que podemos probar desde Android Studio es el siguiente:

com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.appindexing.Thing;
import com.google.android.gms.common.api.GoogleApiClient;
import org.apache.commons.net.smtp.AuthenticatingSMTPClient;

import org.apache.commons.net.smtp.SMTPClient;

import org.apache.commons.net.smtp.SMTPReply;

import org.apache.commons.net.smtp.SimpleSMTPHeader;  

  public void sendEmail()

{ String hostname = «smtp.gmail.com»;

int port = 587; String password = «xxxxxxxxx»;

// aqui necesitamos la pwd de al cuenta de gmail

String login = «[email protected]»;

//aqui necesitamos la cuenta de gmail desde //la que enviaremos los email desde la app

String from = login;

//aqui ponemos el nombre del correo de envío

// es el enviante

String subject = «subject«;

//asunto del correo

String text = «message»;

//texto del correo try

{ AuthenticatingSMTPClientclient = new AuthenticatingSMTPClient();

String to = «[email protected]»;

//destino del correo

// optionally set a timeout to have a faster

//feedback on errors client.setDefaultTimeout(10 * 1000);

// you connect to the SMTP server client.connect(hostname, port);

// you say ehlo  and you specify the host you are connecting from, //could be anything client.ehlo(«localhost»);

// if your host accepts STARTTLS, we’re good everything will be encrypted,

// otherwise we’re done here

if (client.execTLS())

{ client.auth(AuthenticatingSMTPClient.AUTH_METHOD.LOGIN, login, password);

checkReply(client); client.setSender(from);

checkReply(client);

client.addRecipient(to);

checkReply(client);

Writer writer = client.sendMessageData();

if (writer != null)

{ SimpleSMTPHeader header = new SimpleSMTPHeader(from, to, subject); writer.write(header.toString()); writer.write(text); writer.close();

if (!client.completePendingCommand())

{

// failure

throw new Exception(«Fallo al  enviar email » + client.getReply() + _ client.getReplyString()); } }

else

{ throw new Exception(«Fallo al enviar email » + client.getReply() + _ client.getReplyString()); } }

else

{ throw new Exception(«STARTTLS no fue aceptado » + client.getReply() +_ client.getReplyString());

} }

catch (Exception e) {

// some other problem

Toast.makeText(MainActivity.this, «Problema enviado email.», _ Toast.LENGTH_SHORT).show(); } }

 

private static void checkReply(SMTPClient sc) throws Exception

{ if (SMTPReply.isNegativeTransient(sc.getReplyCode()))

{ throw new Exception(«Transient SMTP error » + sc.getReply() + sc.getReplyString()); }

else if (SMTPReply.isNegativePermanent(sc.getReplyCode()))

{ throw new Exception(«Permanent SMTP error » + sc.getReply() + sc.getReplyString()); } }

//* * ATTENTION: This was auto-generated to implement the App Indexing API. * // See https://g.co/AppIndexing/AndroidStudio for more information. */

public Action getIndexApiAction()

{ Thing object = new Thing.Builder() .setName(«Main Page»)

// TODO: Define a title for the content shown.

// TODO: Make sure this auto-generated URL is correct.

.setUrl(Uri.parse(«http://[ENTER-YOUR-URL-HERE]»)) .build();

return new Action.Builder(Action.TYPE_VIEW) .setObject(object) ._ setActionStatus(Action.STATUS_TYPE_COMPLETED) .build(); }

 

@Override public void onStart()

{ super.onStart();

// ATTENTION: This was auto-generated to implement the App Indexing API.

// See https://g.co/AppIndexing/AndroidStudio for more information. client2.connect(); AppIndex.AppIndexApi.start(client2, getIndexApiAction()); }

@Override public void onStop()

{ super.onStop();

// ATTENTION: This was auto-generated to implement the App Indexing API

. // See https://g.co/AppIndexing/AndroidStudio for more information. AppIndex.AppIndexApi.end(client2,

getIndexApiAction());

client2.disconnect(); }

No hay mucho que añadir aquí, por supuesto, la manipulación de excepciones podría ser optimizado si utiliza sus propias clases de excepción y por ejemplo tanto el login como el pwd de gmail  pueden ser capturados en los ajustes de la aplicación para personalizarlo a voulntas.

Autenticación SMTP y SSL con Commons Net

Algunos servidores SMTP están configurados para aceptar sólo SSL  por lo  hay que asegurar la comunicación antes de emitir cualquier comando al servidor siendo generalmente el puerto usado el 465.

Por ejemplo  LaPoste.net oferece cuentas gratuitas de correo electrónico ofrecidas por la publicación francesa, asi que enviar correos desde  ahi seria similar a esto:

 public void sendEmail() throws Exception {  
    String hostname = "smtp.laposte.net";
    int port = 465;
    String password = "password";
    String login = "firstname.lastname";
    String from = login + "@laposte.net";
    String subject = "subject" ;
    String text = "message";
    // this is the important part : you tell your client to connect using 
    //SSL right away
   AuthenticatingSMTPClient client = new AuthenticatingSMTPClient("TLS",true);
    try {
      String to = "[email protected]";
      // optionally set a timeout to have a faster feedback on errors
      client.setDefaultTimeout(10 * 1000);
      client.connect(hostname, port);
      client.ehlo("localhost");
      client.auth(AuthenticatingSMTPClient.AUTH_METHOD.LOGIN, login, password);
      checkReply(client);
     client.setSender(from);
     checkReply(client);
      client.addRecipient(to);
      checkReply(client);
      Writer writer = client.sendMessageData();

      if (writer != null) {
        SimpleSMTPHeader header = new SimpleSMTPHeader(from, to, subject);
        writer.write(header.toString());
        writer.write(text);
        writer.close();
        if(!client.completePendingCommand()) {// failure
          throw new Exception("Failure to send the email "+ client.getReply() +_
 client.getReplyString());
        }
      } else  
{
        throw new Exception("Failure to send the email "+ client.getReply() + _
client.getReplyString());
      }

    } catch (Exception e) {
        throw e;
    } finally {
        client.logout();
        client.disconnect();
    }
  }

No repitimos el método checkReply () aquí, ya que es el mismo para ambos fragmentos de código

Usted habrá notado que el uso de SSL de inmediato significa que usted no tiene que buscar la respuesta execTls () (de hecho no funcionará si lo hace).

Dependencias

Eso es todo; Si desea hacer que estos ejemplos funcionen en su entorno, debe descargar la liberia  apache commons net 3.3 jar    y agregar el jar apache commons net 3.3 a su proyecto

 

 

coomons

Qué hacer si rompe la pantalla de su tableta


¿Se le ha agrietado la pantalla de su tableta? La verdad es que es una fatalidad ,que en ocasiones le hará sopesar directamente adquirir una tableta nueva ,pero si desea mantener he aquí unos  consejos de ahorro de dinero sobre qué hacer en ese caso

Cracked tablet

Las tabletas son gadgets caros (sobre todo si son de cierta calidad )  y lo cierto es que muchos de nosotros estamos pegados a ellos durante el día, ya que organizamos nuestra vida social, los asuntos internos y las compras.
Desafortunadamente, la tecnología no ha encontrado una manera de evitar que dejemos caer una tableta y debido a sus pantallas de cristal, existe la posibilidad de que se caiga una tableta, y este se pueda quebrar. Sí, es un inconveniente y es probable que tenga que pagar algo, pero con un poco de investigación y siguiendo los siguintes consejos, puede que no cueste tanto como usted piensa.

1. Evaluar el daño

Lo primero que debemos hacer es examinar el tamaño de la grieta. Si es pequeño, puede ser feliz vivir con él, pero si la pantalla está totalmente destruida y no se puede ver correctamente, entonces es probablemente mejor – y más seguro –  reemplazarlo.
Es importante que defina  claramente  si simplemente se  ha roto el cristal, o si hay daños en el panel LCD debajo. El primer punto significa que usted ha agrietado el vidrio del frontal  y el segundo punto  significa que ademas hay un problema con la calidad del panel, como el color de la pantalla, el contraste o la pixelación. Si ha dejado el dispositivo, es más probable que  solo  sea el primero, pero opte por una reparación de terceros (paso 4 a continuación) y, a menudo, ambas opciones.

2. ¿Ya está cubierto?

Las tabletas que compra en tiendas de la calle y en línea vienen con una garantía. Pero esto no suele incluir daños accidentales, por lo que muchas personas optan por el seguro.
Las pantallas agrietadas normalmente están cubiertas por un seguro.
El asegurador de gadget dedicado Protect Your Bubble incluye cobertura de daños accidentales como estándar y tiene un exceso de £ 50 para iPads y £ 25 para todas las demás tabletas.
Insurance2go incluye Daño Accidental en sus pólizas y cobra un exceso de £ 25 para dispositivos que valen menos de £ 299 y £ 50 para los que valen entre £ 300 y £ 699.
Si no tiene un seguro de gadget dedicado, consulte su póliza de seguro de hogar ya que puede estar cubierto allí.
Incluso si usted tiene seguro de gadget recomendamos obtener algunas citas para arreglar la pantalla de forma independiente (ver el paso 5), puede ser más barato y significará que no tiene que preocuparse por las primas de seguros futuras subiendo.

3. ¿Su fabricante ofrece un servicio de reemplazo?

Algunos fabricantes reemplazarán una pantalla rota por un cargo. La ventaja de hacerlos e con el fabricante de su dispositivo es que usted podrá conseguir las piezas exactas usadas y no invalidará su garantía.
Para los dispositivos de Apple, Apple Care es el lugar oficial para ir – obtener más información en el sitio web de Apple.

4. ¿Repararla invalidará su garantía?

Vale la pena tener en cuenta que si usa un lugar de reparación de terceros (Paso 5) o lo arregla usted mismo (Paso 6) puede estar invalidando la garantía de su dispositivo.
Si lleva   por ejemplo un teléfono a repararlo en una tienda de la calle que  tenga una gran relación calidad-precio, con el teléfono con daños secundarios si  tratamos de llevarlo de vuelta al fabricante probablemnte  que se negaran a mirar porque  invalidamos nuestra garantía al ir a otro sitio.
Este es un ejemplo extremo – depende del fabricante y la edad del producto – pero si tiene dudas compruebe este punto  primero.

5. Utilice un taller de reparación dedicado

Hay numerosas tiendas  que se arreglan los bienes eléctricos rotos,pero antes de entregar su gadget, es muy importante asegurarse de que van a ofrecer un buen servicio. Eche un vistazo a su sitio web para ver testimonios y comentarios y realizar una búsqueda rápida en la web de los comentarios.

Si usted elige ess servicio asegúrese de que ofrecen una garantía de 12 meses en cualquier reparación y cuánto franqueo es.

6. Arregle usted mismo

Si usted es lo suficientemente valiente es posible arreglar su tableta usted mismo. Hay numerosos kits disponibles en línea como este de Amazon que cuesta £ 16,99; IFix incluye guías para ayudarte a hacer esto.
La ruta de bricolaje es algo que realmente no recomendaría a menos que usted es muy competente con la electrónica. Cometer un pequeño error y podría terminar por tener que reemplazar más de una pantalla rota y puede invalidar su garantía.
El producto de reinicio es una licitación de «inicio social» de caridad para animar a la gente a arreglar sus propios productos electrónicos y así reducir los desperdicios electrónicos. Realiza eventos de reparación gratuitos regulares llamados ‘Restart Parties’ donde puedes ir y arreglar tu dispositivo bajo la supervisión de expertos llamados ‘Restarters’. Aunque principalmente se basa en Londres, los acontecimientos ahora se llevan a cabo globalmente durante todo el año.
Si decide visitar una Parte de reinicio, tendrá que invertir en las piezas de repuesto necesarias para reparar su tableta antes de ir.

7. ¿Vale la pena reparar la tableta?

Si tienes una tableta más antigua, puede ser más barato vender la tableta rota y poner el dinero en una nueva en lugar de pagar por reparaciones.
Hay un mercado próspero para tabletas rotas en eBay. Por ejemplo, encontramos un defectuoso un Samsung Galaxy Tab 3 que se vendió por £ 16 y una primera generación de iPad por £ 45 . Esto puede ayudar a ir hacia una tableta completamente nueva.
Este método tiene un poco de investigación – y con subastas en línea hay una apuesta (por lo que puede que desee establecer un precio mínimo) – pero vale la pena mirar.

8. Copia de seguridad

Por último, si está enviando su dispositivo para solucionarlo o venderlo, asegúrese de guardarlo para guardar su contenido. En el improbable caso de que algo salga mal, puede iniciar sesión y descargar sus archivos de nuevo.

Fuente  aqui