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

Usos supercondensadores


En un post anterior   hablábamos de las múltiples ventajas del usos de los condensadores  como son  prácticamente ilimitada ciclo de vida,elevada potencia específica; tiempo de cargas en segundos, carga simple, excelente rendimiento de carga y descarga de baja temperatura y seguros (al no contener productos químicos ácidos o corrosivos)

Una de las aplicaciones interesantes de los supercondensadores es el uso como fuente de energía ya que  somos capaces de poder gestionar la carga de una manera muy rápida limitada por la corriente máxima que queremos que circule así como también gracias a un convertidor dc-dc aplanar la salida de esta .

Veamos en este post algunos ejemplos reales de aplicaciones comerciales de estos componentes

 

 

Alimentación  con carga ultrarápida para Arduino

Afortunadamente  los precios bajan   y por fin en   nuestros diseños podemos añadir los supercondensadores , pues  actualmente  es posible adquirir un supercondensador de la marca  ILS  de 2.7 V y un capacidad   500 F por menos de 8€ en Amazon

Las medidas   son de  35 x 60 mm  con un peso de 68 gr

supercondensador

Para alimentar una placa Arduino , Netduino o una Raspberry pi   hay que combinar dos en serie , con lo que la capacidad total resultante sera de 250F  /5.4V   mas que suficiente para alimentar   una placa Arduino durante 20 horas (con un LED). ! Y  puede recargar los dos  condensadores en apenas dentro de 30 segundos con una fuente convencional de 5VDC!.

Por supuesto  ademas  estos supercondensadores se puede utilizar en juguetes eléctricos, módems inalámbricos, controladores de motor, terminales portátiles, duplicadores (calefacción rápida), audios de coche, controladores remotos (carga auto-eléctrica), AMR (lectura automática de medidores), alimentación ininterrumpida Válvulas, actuadores, velocidad del viento (control de paso), dispositivos de alarma / seguridad.

 

 

Cámara de vigilancia para coche

 

camara
Utilizar un supercondensador como  fuente de alimentación  ( es decir no una   batería interna) es muy interesante  en un vehículo  en primer lugar porque estos soportan  mucho mayores rangos de temperatura para que usted no tenga  que preocuparse por  el sobrecalentamiento de su cámara  lo que lo convierte en la elección ideal para los conductores en climas calurosos.

Ademas  en las baterías tradicionales la duración de la batería especialmente se degrada con el tiempo, de hecho  con tan sólo meses de uso , el acortamiento la vida de la batería comienza a notarse   hasta terminar fallando , de modo que  las baterías  son a menudo el primer componente de una cámara salpicadero a fallar, requiriéndose costosas  reparaciones.

Mediante el uso de un supercondensador como  fuente de alimentación, el modelo  a118-c prescinde de  las  baterías tradiciones  usando un  supercondensador o como su fuente de alimentación que le permite soportar hasta  140 °F  otorgandole  por tanto una mejor tolerancia a temperaturas extremas y una mayor durabilidad

camarabis

 

El A118  es extremadamente compacto y  se combina a la perfección con el exterior del espejo, haciendo que parezca que cualquier otra parte de su coche. El soporte de la cámara se fija al parabrisas con un adhesivo de doble cara incluido, lo que le permite deslizar su cámara fácilmente  fuera de la posición de grabación

Algunas de su características:

  • Grabacion en Full HD de 1080p de grabación de vídeo a 30 fps y 720p a 60 fps con visión nocturna, tecnología WDR y detección de movimiento automático
  • Angulo extendido de visión 170 ° – proporcionado calidad de sus grabaciones con una panorámica que abarca ambos lados de la carretera, y su entorno
  • Integra chip Novatek NT96650 
  • Altavoz integrado
  • Cuenta con Chipset Aptina AR0330 con lente  proporcionando imágenes con bajo consumo de energía, compresión de vídeo de alta definición y suave
  • Pantalla HD de 1.5″

 

En resumen   el A118 es una innovadora  cámara para coche  alimentada por supercondensador  que   permite grabar en alta definición 1080p de resolución de 1080p a 30 fps o 720p a 60 fps. durante el día que cuenta con un diseño compacto y contorneado para disimilar cámara oculta  pareciéndose a cualquier otra parte de su coche.

Por cierto el precio es muy similar al de otras cámaras: unos 51€ en Amazon

 

 

 

Atornilladores electricos

Una aplicación interesante es un destornillador eléctrico equipado con el supercondensador como fuente de energia

atornillador

Al parecer el único destornillador inalámbrico  que equipa supercondensadores es el  BLUCAVE DSD-46FL-2BLU Flashcell  que pesa menos de 1 libra, que gracias  a su tecnología Super Capacitor FlashCell, es uno de los destornilladores tecnológicamente más avanzados del planeta pues en  tan sólo 60 segundos, usted estará en su manera de completar esos trabajos de trabajo ligero en ningún momento.

Su publicidad alude a no esperar más horas para cargar su taladro o destornillador inalámbrico con baterías. Sorprendentemente, el destornillador inalámbrico BluCave FlashCell no usa baterías! Es ecológico y recarga al menos 100.000 veces.
También puede dejar que el destornillador inalámbrico BluCave FlashCell se siente en la base de carga y continúe cargando sin perder ninguna capacidad de tiempo de ejecución. Eso significa que no hay pérdida de memoria.

Carastericticas

  • 60 segundos de carga rápida
  • Peso ligero bajo 1lb.
  • Manija de 2 posiciones
  • Nueva tecnología FlashCell Super Capacitor
  • No necesita baterías – nunca!
  • Incluye 5 piezas de accionamiento: PH1, PH2, PZ1, PZ2, FLAT 1/2 «y extensor
  • 4,6 voltios
  • Par de giro máximo: 3.32 ft-lb
  • 110-120V AC
  • Velocidad sin carga: 200 RPM
  • Ecológico
  • 100.000 recargas
  • Diseñado para caber en el gabinete de transporte BluCave – utiliza 3 de 10 ranuras
  • Incluye funda blanda con logotipos bordados BluCave y FlashCell
  • Manual de seguridad y funcionamiento incluido

 

Este atornillador  claramente se ve encarecido por el supercondensador con el cuenta , pero si tenemos en cuenta que la vida de este componente  es prácticamente ilimitada quizás no tenga tan mal precio ( 116€ en Amazon)

 

Por lo visto ya son muchos  fabricantes que empiezan  a usar este tipo de tecnología ,por lo que confiemos que pronto todos nuestro gadgets se alimenten con supercondensadores

Si conoce algún otro gadget que se alimente con supercondensadores no dude en compartirla con toda la comunidad !Gracias!