|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
   AutoIt (Programación) Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  Teleco - Emisora de A.M. Visual Basic Cosas de Windows Webs interesantes
Translate:
Búsqueda en este sitio:


Nuevo concurso para España, Argentina, Brasil, Chile, Colombia, Ecuador, México, Perú y Portugal.

B4A en español - Juan Antonio Villalpando
(BASIC4Android)

-- Tutorial de B4A --

Volver al índice del tutorial

____________________________

97.- Leer archivo adjunto de un correo.

Esto trata de un estudio que intenta conseguir el archivo adjunto de un correo. Se deja como propuesta al lector su ampliación.
______________________________
1.- GetPathFromContentResult. Traduce a dirección real.

- Primero vamos a bajar y a estudiar un poco la aplicación 1.zip que se encuenta en este hilo del tutorial oficial...

http://www.b4x.com/android/forum/threads/using-photos-from-the-phone.37444/page-2

la aplicación presenta un mosaico de imágenes que se encuentra en la sdcard y al elegir una se sitúa en pantalla completa.

La aplicación funciona directamente, la ejecutamos y la estudiamos un poco.

Observamos en el LOG que cuando elegimos una imagen nos viene con una dirección similar a esta:

FileName = content://media/external/images/media/55

Esto está indicando que en ese archivo (55) se encuentra el contenido de la imagen, pero no podemos bajarla directamente mediante esa dirección, sino que debemos traducirla (Parse) a otra de la forma:

realPath = /mnt/sdcard/fresa.gif

La aplicación que estoy comentando, realiza esa conversión (Uri1.Parse(UriString)) mediante la subrutina:

Sub GetPathFromContentResult(UriString As String) As String

Una vez que tengamos la dirección real ya nos será fácil trabajar con ese archivo.

 

Es decir, obtenemos una dirección de la forma...

content://media/external/images/media/55

y debemos traducirla a otra de la forma...

/mnt/sdcard/fresa.gif

Ese es el problema.

______________________________

2.- El directorio de las imágenes.

(Ver el adb en el tutorial 10.- LINUX para Android).
(El directorio del adb lo tengo en el PATH de Windows)

Si mediante el Terminal del adb recorremos los distintos directorios, podremos ver lo siguiente...

C:\Users\juan> adb -e shell

#

cd /data/data
ls
cd /data/data/com.android.providers.media
ls
cd databases
ls

internal.db
external-1add390d.db

así podemos ver malamente su contenido...

cat internal.db
cat external-1add390d.db

Son archivos de base de datos que contiene información de las imágenes. Mediante cat podemos mal ver su contenido.

Si copiamos la base de datos en nuestro ordenador, la podremos ver cómodamente con SQLite Database Browser

C:\Users\juan>adb -e pull "/data/data/com.android.providers.media/databases/external-1add390d.db" "C:\external-1add390d.db"

Observamos que el campo data es el que contiene la dirección completa.
La aplicación 1.zip lo que está haciendo es dado el id del archivo (55) mediante Cursor, obtiene el contenido del campo data.

Obteniendo que la imagen se encuentra en /mnt/sdcard/fresa.gif, podemos trabajar con ella.

______________________________

3.- Vamos a realizar una aplicación que pueda leer los archivos adjuntos de correos con un determinado lector.

Para ello creamos una nueva aplicación llamada correo_recibe con este simple contenido...

Sub Activity_Create(FirstTime As Boolean)
    Dim In As Intent
    In= Activity.GetStartingIntent
    Msgbox(In.GetData,".")
    
End Sub

Además en su archivo AndroidManifest.xml ponemos lo siguiente...

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:host="*" />
<data android:pathPattern=".*\\.txt" />
<data android:mimeType="*/*" />
</intent-filter>

Esto es para que cuando pulsemos el botón "Pulsar" del archivo adjunto de tipo .txt, nos pregunte con qué aplicación queremos leerlo, algo así como el "Abrir con..." de Windows. Permite configurar la aplicación por DEFAULT que la abrirá.

Ahora nos enviamos con cualquier webmail un correo con un archivo adjunto con extensión .txt, por ejemplo archivo.txt y dentro de éste un pequeño comentario escrito.

Entramos en el lector de correos del Android y leemos el correo que nos acabamos de enviar.

Pulsamos sobre el Pulsa del archivo adjunto y nos sale una ventana para elegir con qué aplicación lo queremos abrir...

Al pulsar sobre nuestra aplicación "Correo recibe", obtenemos la dirección donde se encuentra el adjunto, pero no es una dirección real. En realidad es donde se encuentra su contenido (content).

En este caso content://com.android.email.attachmentprovider/1/28/RAW

Esto se obtiene gracias al Intent

In= Activity.GetStartingIntent

que suministra el dato sobre qué ha realizado la llamada, quién está llamando.

Podemos ir a esa dirección mediante comandos

cd /data/data/com.android.email
ls -l

drwxrwx--x app_15 app_15 databases


cd databases
ls -l


-rw-rw---- ap_15 ap_15 EmailProviderBody.db
-rw-rw---- ap_15 ap_15 EmailProvider.db
drw------- ap_15 ap_15 1.db_att


EmailProviderBody.db
es la base de datos donde se encuentra el contenido del mensaje.

EmailProvider.db es la base de datos donde se encuentra la dirección que indica donde está el contenido de los adjuntos.

1.db_att es un directorio donde se encuentra el contenido de cada adjunto en archivos numerados.

 

cat EmailProvider.db

Mal vemos su contenido. Mejor exportarla.


cd 1.db_att
ls -l

-rw------- ap_15 ap_15 26
-rw------- ap_15 ap_15 27
-rw------- ap_15 ap_15 28

y vemos donde están el contenido de los archivos adjuntos,

cat 28

Hola, me llamo Juan.
Bienvenido a mi tutorial.

 

______________________________

4.- Leerlo.

Para leerlo debemos obtener la dirección que nos dará acceso a su contenido en...

content://com.android.email.attachmentprovider/1/28


También debemos añadir al Manifest.xml esta línea...

<uses-permission android:name="com.android.email.permission.READ_ATTACHMENT"/>

Ver otros permisos

Más permisos

Cambiamos nuestra aplicación a...

Sub Activity_Create(FirstTime As Boolean)
    Dim Path As String
    Dim In As Intent
    In= Activity.GetStartingIntent

    Msgbox(In.GetData,".")
    Path = "/data/data/com.android.email/databases/1.db_att/"
    Msgbox(File.ReadString(Path, "28"), "")

End Sub

Es posible que no lo podamos leer ya que no tenemos permiso de paso en ese directorio, a pesar de poner permisos en el AndroidManifest.xml

Una solución es ponerle permiso de paso a ese directorio desde el terminal.

cd /data/data/com.android.email/databases
ls -l
drw------- ap_15 ap_15 1.db_att
chmod 777 1.db_att
ls -l

drwxrwxrwx ap_15 ap_15 1.db_att

También le cambiamos los permisos al archivo.
cd 1.db_att
ls -l
-rw------- ap_15 ap_15 28

chmod 777 28

ls -l
-rwxrwxrwx ap_15 ap_15 28

Ahora podemos leer el adjunto 28. Vamos al programa que hemos realizado...


Ese era el mensaje del archivo.txt enviado como adjunto al correo.

Encontramos en internet algoritmos para pasar del content a su dirección real uri.
uri = Uri.parse("content://com.android.email.attachmentprovider/1/32/RAW")

Otro algortimo.

No podemos utilizar directamente la aplicación 1.zip que vimos en el apartado número 1, porque la base de datos donde están las imágenes tiene una estructura distinta a la de donde están los archivos adjuntos de correo.
Además el directorio de adjuntos tiene cortado el permiso de paso para los usuarios, por lo cual no podemos llegar al archivo como he comentado anteriormente, hay que poner permiso de paso a los usuarios.
Tampoco permite Copiarlo.
Otro problema es que la base de datos de los adjuntos no contiene la dirección completa de donde está el contenido, es decir en la base de datos de imágenes encontrábamos /mnt/sdcard/fresa.gif, en la de adjunto solo encontramos el nombre del archivo.txt y el archivo donde está su contenido (28).


Exportar las bases de datos para leerlas con SQLite Database Browser

C:\Users\juan>adb -e pull "/data/data/com.android.email/databases/EmailProviderBody.db" "C:\EmailProviderBody.db"

C:\Users\juan>adb -e pull "/data/data/com.android.email/databases/EmailProvider.db" "C:\EmailProvider.db"

______________________________

5.- Final.

Como dije al principio esto es solo un estudio en el que he tratado de facilitar la comprensión de cómo están los archivos guardados en el directorio del sistema. El lector puede profundizar y jugar un poco con todo lo explicado.

En realidad la manera efectiva de poder entrar en el directorio 1.db_att es poniendo el permiso:
Intent.FLAG_GRANT_READ_URI_PERMISSION

como indica la información oficial de Android...

http://developer.android.com/guide/topics/security/permissions.html

The standard permission system described so far is often not sufficient when used with content providers. A content provider may want to protect itself with read and write permissions, while its direct clients also need to hand specific URIs to other applications for them to operate on. A typical example is attachments in a mail application. Access to the mail should be protected by permissions, since this is sensitive user data. However, if a URI to an image attachment is given to an image viewer, that image viewer will not have permission to open the attachment since it has no reason to hold a permission to access all e-mail.

The solution to this problem is per-URI permissions: when starting an activity or returning a result to an activity, the caller can set Intent.FLAG_GRANT_READ_URI_PERMISSION and/or Intent.FLAG_GRANT_WRITE_URI_PERMISSION . This grants the receiving activity permission access the specific data URI in the Intent, regardless of whether it has any permission to access data in the content provider corresponding to the Intent.


de esta web.

 

______________________________

6.- SMTP y POP

SMTP es un protocolo para enviar correos a tu servidor.
POP es un protocolo para tomar los correos que están en tu servidor.

- Mediante POP podemos capturar los correos de nuestro servidor.
En el foro bajamos la aplicación: MailParser.zip

Con ella podemos obtener los correos existentes en nuestro servidor de correo.
Modificamos la línea...

pop.Initialize("pop.gmail.com",995,"micuentadegmail@gmail.com","miclavedegmail","pop")

pop.Initialize("pop3.live.com",995,"micuentadehotmail@hotmail.com","miclavedehotmail","pop")

 

En la parte del Log obtenemos los correos.

- De gmail solo obtenemos el último correo.
- Se puede intentar poner como nombre de usuario recent:
pop.Initialize("pop.gmail.com",995,"recent:micuentadegmail@gmail.com","miclavedegmail","pop")
- Probar con otros servidores.
- Probar con un dispositivo real.

______________________________

- Más cosas.

Busca en internet cómo puedes enviar y obtener tus correos mediante Telnet o Ssh.

Telnet es un protocolo para comunicarse remotamente con un servidor, por ejemplo con un servidor de correo, con comandos.

SSH es igual que Telnet, pero con SSH la información que enviamos/recibimos por internet viaja codificada, por si alguien la captura no la puede interpretar.

--- SMTP


Baja el programita Putty.exe
Escribes la dirección por ejemplo:

smtp.gmail.com Puerto: 587

Te saldrá una pantalla negra, mediante comandos puedes enviar correos o ver tus correos.

220 mailserver.domain.com Gooogle ESMTP MAIL Service, Version: 5.0.2195.5329 ready at Fri, 22 April 2014 18:12:39 -0100
helo smtp.domain.com
250 mailserver.domain.com Hello [20.20.20.20]
starttls
mail from:<micorreo@gmail.com >
250 2.1.0 micorreo@gmail.com....Sender OK
rcpt to:<aquienloenvio@hotmail.com >
250 2.1.5 aquinloenvio@hotmail.com
data
354 Start mail input; end with <CRLF>.<CRLF>
subject: Este es el asunto
to: aquinloenvio@hotmail.com
Este es el mensaje.
.
250 2.6.0 <exchange.domain.com> Queued mail for delivery
quit

Las direcciones deben ir entre <>

--- POP

Algo parecido con el POP.

pop.gmail.com Puerto: 995

En internet hay mucha información sobre POP, SMTP y Telnet.

USER micorreo@gmail.com
PASS miclave
STAT
LIST
RETR 3
QUIT

________________________________

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información