Validar direccion email con Java

Para validar una dirección email con Java es muy sencillo utilizando una expresión regular.

/** checkEmail *  Valida si una direccion email es correcta. * *  @param String email a validar *  @return true si es correcto *  @author https://mirastro.wordpress.com */
public static boolean checkEmail (String email) {

    // Establecer el patron
    Pattern p = Pattern.compile("[-\\w\\.]+@[\\.\\w]+\\.\\w+");

    // Asociar el string al patron
    Matcher m = p.matcher(email);

   // Comprobar si encaja
   return m.matches();

}

Si en lugar de validar una dirección de correo, quisiéramos validar si una cadena es alfanumérica simplemente habría que cambiar el patrón por algo así [\\w]+ o [a-zA-Z0-9]+ o puede que lo que necesites sean solo mayúsculas y opcional [A-Z]*.

En cualquier caso las expresiones regulares en general tienen muchas utilidades, y para estos casos evitan tener que estar programando un código espagueti con bucles que van buscando ciertos caracteres.

SMTP deja de funcionar, puede estar tu ip en una lista negra de spam

¿Te ha dejado de funcionar el correo saliente SMTP sin embargo si puedes recibir correos por POP3?
¿Tienes IP fija?

Como en otros post, voy a comentar lo que me sucedió en mi caso por si a ti te ocurre lo mismo.

Si no has tocado la configuración smtp, yo revisaría inmediatamente si estás en una lista negra de spam.
Puedes revisarlo en esta página:

http://www.dnsbl.info/dnsbl-database-check.php

Introduce tu Ip y haz clic en “Check my Ip”. (Tu Ip debe ser tu IP publica, no una local del tipo 192.168.X.X)

Esta página chequea varias listas negras de spam, tu proveedor de internet puede estar utilizando alguna de ellas (o varias) para comprobar que desde tu ip no se esta haciendo spam.
Si apareces en rojo en alguna lista haz dos cosas.

  1.  Comprueba en tu equipo y tu red el tráfico para corroborar si es cierto que se está haciendo spam, y corrigelo si es así. Lo primero es detectar el equipo. Tampoco me voy a explayar mucho aqui, y además esto ya es cosa de sacar la pluma de explorador. Hombre podrías por ejemplo cerrar los clientes de correo y haz un netstat -na y mira las conexiones al puerto 25 que tienes. Otra opción más efectiva es mirar en el router la ista de conexiones que tiene establecidas. Otra, pon un sniffer en la red para capturar el tráfico, recomiendo el wireshark http://www.wireshark.org/download.html, de todas formas ya tendrías que instalar programas que es mas lio si no piensas volver a usarlos.Y nada una vez detectado el equipo, toca confiar en el antivirus o google.Puede ser que no encuentres nada, puede ser que el equipo infectado  esté apagado mientras miras todo esto, en cualquier caso puede ser que realmente no haya un problema, o que encuentres la raiz del problema.
  2. Intenta sacar tu ip de esa lista/as a traves de las opciones específicas de la página que este gestionando esa lista negra.
    Sigue las instrucciones de la página, en algunas listas es más facil de salir que de otras.
  3. Incluso si no has podido salir de la lista, llama a tu proveedor de internet y comentale el caso, es muy probable que te haya cerrado el puerto 25 (sMTP), si es así píde que te lo abran.
  4. Si no es problema de tu proveedor de internet, y tienes un proveedor de hosting y correo, llámales para comprobar que el problema no le tengan ellos, es decir que su servidor no este enviando spam y sea él directamente el que esté provocando el bloqueo.

Espero os sirva de ayuda!

Windows problemas conectividad LAN cliente Cisco. Equipo invisible en la red.

¿Vuestro equipo se puede conectar al resto pero el resto no se pueden conectar a ti?

¿Incluso desactivando el firewall?

¿Has desactivado tambien el antivirus por si acaso?

¿Has buscando por google como un loco revisando sobretodo los documentos sobre problema de conectividad en LAN de support.microsoft.com y tampoco?

Sólo una idea, ¿No tendrás un cliente Cisco instalado?

Si te sucede todo esto, entonces  ¿Has revisado si está activada la opción Statefull Firewall (Always On)?  Debería estar desactivada, a menos que conscientemente la hayas activado.

Ya que incluso aunque no estes conectado a ninguna red vpn esta aplicación te está actuando a modo de firewall cortando el acceso de terceros a tu equipo.

Esto es lo que me sucedío a mi, durante varios dias mi pc podía ver perfectamente la LAN, sin embargo nadie podía conectarse a mi pc, ni siquiera respondía a ping, tras varios dias , revisando mi configuración de red al milimetro, me di cuenta que el problema podía venir por alguna aplicación de terceros, en mi caso fué el cliente Cisco.

Os dejo una captura de la opción que debéis revisar

Cisco-VPN-Client-Statefull-Firewall-Always-On

Cisco VPN Client - Statefull Firewall (Always On)

Convertir csv, htm, xml, txt, xls en formato Excel xlsb utilizando un script vbs

Imaginemos el escenario en el que tenemos un documento csv, o un documento html con tags Excel (como si desde Excel hicieramos salvar como pagina web), un xls de office 2003, básicamente cualquier tipo de documento capaz de abrirse en excel y queremos convertirlo en un formato Excel 2007 / 2010.

Imaginemos que esta conversión la queremos realizar de forma automática en un servidor antes de devolver el documento al usuario o en una aplicación cliente.

Me encontré con este problema recientemente en un proyecto, y antes de cambiar cientos de informes para que se generen en formato xls o xlsx se me ocurrió hacerlo utilizando un scrips vbs.

Este script lo que hace es abrir el documento original con el propio Excel, y guardarlo en el formato que yo quiera. Es como un script mini-conversor, con la ventaja de que el que hace la conversión es el propio Excel que lo hace mejor que nadie.

En mi caso yo necesitaba que el Excel de entrada fuera un documento excel con extension .htm y con una carga de datos externa por fichero que se refrescase antes de convertirlo. Siempre busca un fichero que se llame igual que él, pero con extension csv o txt. Si no lo encuentra no realiza la carga de datos y simplemente convierte el documento de entrada. En el script veréis código que realiza estasa tareas, simplemente si no lo necesitais podéis comentarlo.

Aqui os dejo el script posiblemente necesite algún retoque para adaptarlo a vuestras necesidades, es más, como de vbs no tengo mucha idea, no me extrañaría que tuviera más de un defecto, sin embargo en si la idea me ha venido bastante bien.

Option Explicit
'mirastro.wordpress.com
ShowExcel

Sub ShowExcel() 

On Error Resume Next

' Recoger por parametros la ruta y nombre del fichero (sin extension)
dim filename, path
if WScript.Arguments.Count = 0 then
    WScript.Echo "Uso " &  WScript.ScriptName & " <Dir> <Fichero sin extension>"
    exit sub
else
    path = WScript.Arguments(0)
    filename = WScript.Arguments(1)
end if
'Desactivamos las alertas que pueda dar Excel 'Activarlo para debug
xlObj.displayalerts = false

'Abrir el fichero original (pasado por parametros) con extension htm
xlObj.Workbooks.Open ( path & filename & ".htm")

'Salvarlo como xlsb
xlObj.ActiveWorkbook.SavecopyAs xlObj.ActiveWorkbook.Path & "\" & filename & ".xlsb"
'No mostrar Excel
xlObj.ActiveWindow.Close
'xlObj.Quit

'Abrir el nuevo
xlObj.Workbooks.Open path & filename & ".xlsb"
xlObj.visible=true

'Hacemos la carga con resume next 'No descomentar el resume next
xlObj.Range("A3:O4").Select
On Error Resume Next

'Determinar el fichero de carga puede ser csv o txt
'Especifico de mi proyecto, busca si existe un fichero csv o txt
Dim fso, loadFilename, prefixFilename
Set fso = CreateObject("Scripting.FileSystemObject")
prefixFilename = xlObj.ActiveWorkbook.Path & "\" & replace (replace (filename, "COL", ""), "LIN", "")
loadFilename = prefixFilename & ".txt"
If ( not fso.FileExists(loadFilename)) then
    loadFilename = prefixFilename & ".csv"
    If ( not fso.FileExists(loadFilename)) then
        'No hay fichero de carga
        Set xlObj = Nothing
        exit sub
    end if
end if

'Modificar el origen de datos 'La conexión la establece por fichero (.Connection = "TEXT;"...) pero en principio podría ser de cualquier tipo With xlObj.Selection.QueryTable
    .Connection = "TEXT;" & loadFilename
    .TextFilePlatform = 1252
    .TextFileStartRow = 1
    .TextFileParseType = 1
    .TextFileTextQualifier = -4142
    .TextFileConsecutiveDelimiter = True
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = True
    .TextFileCommaDelimiter = False
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 1)
    .TextFileTrailingMinusNumbers = True
    .Refresh.BackgroundQuery false
End With

'Activar de nuevo las alertas
xlObj.displayalerts = true

 'Refrescar el primer data source que encontremos
xlObj.ActiveWorkbook.Connections(1).Refresh

'Limpiar
Set xlObj = Nothing 

End Sub

Este script le he salvado como showScript.vbs
Podría ser ejecutado desde una linea de comandos de la siguiente manera:
showExcel c:\reports informe
Si ‘informe’ es un fichero informe.htm que por ejemplo realiza una carga de datos de un fichero informe.txt, el script devolvería un fichero informe.xlsb en formato Office 2010.
Creo que aqui es el punto donde podéis coger el vbs y adaptarlo a vuestra necesidad!!

Este script tiene una ventaja, podría ser ejecutado mismamente desde un java con Runtime.exec (“cmd /c showExcel.vbs c:\reports\ informe”);
En un servidor (Windows) con un cliente Excel se podría hacer esta conversión antes de devolverlo al usuario.

Espero que a alguien le sirva de ayuda, lamento no explicarlo todo más claro,  cualquier duda o comentario será bienvenido.

Evitar mensaje Excel 2007/2010 “El archivo que intenta abrir tiene otro formato que el especificado por la extensión del archivo”

En un proyecto de migración a Office 2010 me he encontrado este problema.

En una aplicación Java estaba generando una serie de informes en formato htm, pero con extensión xls.

Este tipo de informes en html son fáciles de generar ya que puedes generar una plantilla Excel html que cargue un origen de datos externo que sea un archivo.

Dichos archivos los almacenabamos con extensión xls para que el pobre usuario cuando quisiera guardar el documento se le ofreciera la extensión xls como predeterminada, y no tuviera que estar continuamente asegurandose que los guardaba con extensión xls  (Aunque realmente lo que graba es un Excel)

Aqui llega donde la matan, Office 2010 comprueba que el contenido del fichero se corresponda con su extensión. Por lo que saca el mensaje:

Excel 2010

El archivo que intenta abrir <nombre> tiene otro formato que el especificado por la extensión del archivo…

Desde luego, su extensión es xls y el contenido es html.

Para evitar el problema simplemente estos informes se pueden guardar con la extensión que les corresponde (htm o html).

Sin embargo se puede solucionar simplemente tocando en el registro del sistema del cliente de la siguiente manera:

En el registro del sistema, ya sabeis (regedit)

Para Office 2010

HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel\Security

Para Office 2007

HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Excel\Security

Añadir un valor DWORD con nombre ExtensionHardening con valor cero (cero por defecto)

El valor con toda seguridad no exista. Por defecto se considera su valor 1 (preguntar, el dichoso mensaje), el valor 0 permite sin preguntar, y valor 2 deniega.

El artículo siguiente http://support.microsoft.com/kb/948615 lo comenta en más detalle, no lo he explicado a fondo porque en el artículo viene completa la solución.

Ahora vamos a complicar el tema, por la razón que sea, en los pcs clientes no se pueden tocar el registro del sistema, algo más o menos común en grandes empresas.

Y además si ese fichero .xls se le envía a un pc que no tenga configurado el registro de esa manera, le saldría igualmente el mensaje.

Hay una aproximación definitiva que evita todos estos problemas, pero la dejo para otro post, simplemente introducir que se puede hacer un script vbs que abra el excel y transforme el archivo htm (o lo que sea) para hacer una copia como xlsb. Y enviar al usuario este nuevo archivo que es Excel binario y su extensión se corresponde con el contenido. Este script se puede ejecutar en el cliente, o en el servidor siempre y cuando este tenga una instalación de Office.

Este script vbs se puede ejecutar incluso desde dentro de un applet java  o un servidor web (Windows con cliente Excel 2007/2010) , en un servidor web, enviaríamos el nuevo fichero generado, en un applet abririamos directamente el nuevo fichero generado.

Pues este es mi primer post con un poco de “chicha” , espero que si alguien pasa por aqui le resulte útil a pesar de las prisas con las que lo he tenido que hacer.