martes, 10 de mayo de 2011

Primer Plato: Correo entrante en sharepoint sin SMTP.

En los últimos días me ha tocado lidiar con un problema, no tan extraño, pero a la vez poco documentado.

Os comento, tengo una granja de SharePoint 2007, sobre Windows 2008 y no tengo posibilidad de redirigir un conector Smtp desde Exchange, en mi caso 2010.

Tras mucho buscar he encontrado recursos para montar una solución domestica para este proceso, la solución:
POWERSHELL.

Desde luego no es la opción que hubiese elegido para realizar esta conexión, pero ha resultado tremendamente efectiva. Descargo los ficheros con formato .eml con sus adjuntos y me permite añadir las cabeceras x-sender y x-receiver.

Comencemos.

Para empezar he instalado las herramientas de administración de Exchange, desde el DVD de instalación, en el servidor donde quería recibir los correos.

A continuación encontré un kit de herramientas para Exchange, gratuito por supuesto en MessageOps.
Una gente muy maja a la que le agradezco encarecidamente este Kit.
Lo descomprimimos en una carpeta que será donde guardemos nuestro script.

Por otro lado descargue la Api de los Web services de Exchange.

Ya tenemos todos los ingredientes.
-Instalamos el Api de Exchange.
-Descomprimimos el kit de messageops a una carpeta y abrimos la shell de Exchange como administrador y ejecutamos el script 
.\install-module.ps1 del kit.

Ahora comprobamos como en la carpeta
C:\Users\usuario\Documents\WindowsPowerShell\Modules\MessageOps-Exchange
Tenemos tres ficheros:
MessageOps-Exchange.psd1
MessageOps-Exchange-Powershell-Module.dll
Microsoft.Exchange.WebServices.dll
Si no los tenéis podéis copiarlos manualmente.

Ahora viene la parte crítica de la solución. EL SCRIPT.

Set-ExecutionPolicy RemoteSigned -force
import-module messageops-exchange
$path = "c:\CARPETA TEMPORAL"
$path2= "C:\CARPETA DONDE SHAREPOINT RECOGE CORREO"
$apppath="C:\CARPETA DONDE INSTALAS TODO"
cd $apppath
$Inbox="\\bandeja de entrada"
import-module ./messageops-exchange.psd1
$user = "TUDIRECCION@TUEMPRESA.COM"
$ewsProfile = New-MessageOps.EWSProfile -usedefaultcredentials 1 -id $user/*captura usuario actual*/
$ItemCollection = Get-MessageOps.Messages -p $ewsprofile -fp $inbox  -messagecount 1 -fulldetails $true
/*recoge  un correo*/
if ($itemcollection.sender.address -ne $null)
{
if ($itemcollection.subject -eq $null) /*si no tiene asunto se le añade como título “Sin Asunto”*/
{$name = "Sin Asunto"}
else
{$name = $itemcollection.subject -replace(':',' ') }/* Eliminamos caracteres especiales que puedan provocar error en el asunto error*/
$name = $name -replace("`""," ")
$name = $name.replace("\"," ")
$name = $name.replace('+',' ')
$name = $name.replace('*',' ')
$name = $name.replace('?',' ')
$name = $name.replace('=',' ')
$name = $name.replace('-',' ')
$name = $name.replace('[',' ') 
$name = $name.replace(']',' ')
$name = $name.replace('''',' ')
$sender = "x-sender: " + $itemcollection.sender.address /* añadimos cabeceras para SharePoint*/
$receiver = "x-receiver: " + $itemcollection.receivedby.address/* añadimos cabezeras para SharePoint*/
$file =$path + $name + ".eml" /*Construimos el nombre del fichero con el asunto*/
Export-MessageOps.MessageToEml -EWSProfile $ewsprofile -ewsid $itemcollection.id  -filename $file
add-content ($path +"temp.eml") $sender
add-content ($path + "temp.eml") $receiver
$texto =  get-content $file
add-content ($path + "temp.eml")  $texto
del $file /* borramos el fichero si existe */
ren ($path +"temp.eml") $file /*renombramos el fichero */
MOVE $file $path2  /*se mueve a la carpeta de SharePoint*/
Remove-MessageOps.Message -ewsid $itemcollection.id -ewsprofile $ewsprofile /*borramos el correo del buzón.*/
}

Para ejecutarlo tendréis que eliminar todos los comentarios.
Salvamos el fichero con extensión ps1.

Lo guardaremos en la carpeta donde descomprimimos messageops.

Por últimos, como programar la ejecución. Pues muy simple desde el programador de tareas ponemos en acciones la siguiente línea.

c:\windows\system32\windowspowershell\v1.0\powershell "C:\ruta\correo.ps1"

Y elegimos la programación que deseemos, 
Nota: El script se descarga únicamente un correo cada vez, por lo que recomiendo ejecutarlo cada poco tiempo.

Como siempre se dice en estos casos, esto es un ejemplo, no lo uséis en producción, probarlo y reprobarlo antes de hacer uso de él.

Dejo para otra ocasión el desarrollo que hice hace tiempo para conectar con servidores de Exchange 2003.

Un Saludo.

Agradecimientos:



No hay comentarios:

Publicar un comentario