Outlook 2010. El tamaño de los datos adjuntos excede el límite permitido

Sé que no es un post de programación, pero me ha tenido un rato entretenido y he considerado oportuno comentarlo. Así, por un lado, si alguien puede aprovecharlo, bien y si no, seguro que me sirve de recordatorio cuando tenga que volver a utilizarlo.

El caso es que necesitaba enviar un fichero por correo electrónico que ocupaba la friolera de 30 Mb. Hasta el momento, tanto mi servidor de correo como el de la persona a la que se lo enviaba aceptan tales tamaños pero esta vez la limitación no ha venido desde el servidor. La restricción me la ha puesto directamente el Outlook que utilizo (está en el portátil, así que nada de Exchange Server). Al intentar adjuntar el archivo me encuentro el siguiente mensaje de error.

image

¡Qué contentos nos solemos poner cuando se incluyen en las aplicaciones mejoras que nos facilitan la vida y qué poca gracia nos hace cuando estos cambios alteran nuestras costumbres!.

Hace poco, de un artículo de José M. Aguilar, aprendí el término procastinación y decidí predicar con el ejemplo, así que, en lugar de empezar a fragmentar el archivo y enviar varios mensajes, me puse a investigar un poco sobre el tema. La verdad es que no tardé en llegar a la solución en la página de Microsoft: http://support.microsoft.com/kb/2222370.

Para aquellos que no quieran leer la solución desde su ubicación original, me limito a resumirla:

Outlook, en su versión 2007 no permite el envío de adjuntos de más de 20Mb, así que, para condicionar esta situación, bastará con acudir al registro del sistema, el que deberemos localizar cualquiera de las claves siguientes:

  • HKEY_CURRENT_USERSoftwareMicrosoftOffice14.0OutlookPreferences
  • HKEY_CURRENT_USERSoftwarePoliciesMicrosoftOffice14.0OutlookPreferences

Deberemos añadir la siguiente subclave:

  • Tipo de valor: Valor DWORD
  • Nombre: MaximumAttachmentSize
  • Valor: Podemos especificar un valor en Kb que será el máximo permitido o 0 en caso de que no queramos que Outlook imponga ninguna restricción.

Una vez reiniciado el Outlook ya podremos enviar cualquier tamaño de adjuntos, siempre y cuando nos lo permitan los servidores de correo.

Claro, que ya que escribimos en un blog en el que prima el desarrollo no vamos a dejar de incluir alguna rutina Risa, así que, si queremos hacer lo mismo desde C#, pues dejo el código:

 

using Microsoft.Win32;

namespace JnSoftware.Office
{
    /// <summary>
    /// Utilidades de Outlook
    /// </summary>
    class Outlook
    {
        /// <summary>
        /// Elimina la limitación por tamaño de enviar documentos adjuntos
        /// </summary>
        public void EliminaLongitudAdjuntos()
        {
            EstableceLongitudAdjuntos(0);
        }


        /// <summary>
        /// Establece el tamaño máximo de ficheros adjuntos
        /// </summary>
        /// <param name="MbSizeMaximum">Valor que queremos 
        /// establecer como máximo para el tamaño de los ficheros
        /// adjuntos</param>
        public void EstableceLongitudAdjuntos(int MbSizeMaximum)
        {
            RegistryKey kRoot = Registry.CurrentUser;
            string rama = 
                  "Software\Microsoft\Office\14.0\Outlook\Preferences";

            RegistryKey rk = kRoot.OpenSubKey(rama,true );
            rk.SetValue("MaximumAttachmentSize", MbSizeMaximum * 1024);
        }
    }
}

Codificación Unicode

Ya que tengo alguna que otra primavera a cuestas y que suelo ganarme la vida, entre otras cosas, impartiendo clases, reconozco que tengo alguna que otra manía. Una de estas manías está estrechamente ligada con la ortografía (u hortografía, como vi no hace mucho en el escrito de un alumno).

Hace poco, en la creación de una página web, el cliente solicitó uno de aquellos enlaces que, al hacer un clic sobre él, se abriera el cliente de correo. Para la mayor parte de clientes, sólo existe el Outlook y, sinceramente, creo que es mejor porque hace muy poquito, el jefe de una empresa en la que trabajo me comentó que quería usar el OpenOffice y, claro, iba a instalar el “gestor de correos del OpenOffice, es decir, el Ubuntu” –casi me da algo- Lástima que no sé callar, puesto que se hubiera merecido instalar este “cliente de correo” sobre el Windows XP, más que nada, por la supremacía que intentaba transmitir al hablarme del tema…

Bueno, siempre suelo irme por las ramas, así que retomo el tema inicial. El caso es que quería añadir, en una página HTML un enlace para que se abriese el Outlook del visitante al site, así que, como una vez hice un cursillo de HTML, me pongo a teclear:

<HTML>
 <HEAD>
  <TITLE> Mail Sample </TITLE>
 </HEAD>
 <BODY>
  <a
    href="mailto:usuario@dominio.com
      ?subject=Solicitud de información
      &body=Les agradecería se sirvan remitirme información adicional acerca de:
      ">
      Texto del enlace
</a>
 </BODY>
</HTML>

A partir de aquí, haces las pruebas y todo va bien, puesto que yo también suelo usar IE y Outlook. El problema empieza a sospecharse cuando recibes correos con caracteres extraños y empiezas a probar con algún explorador diferente, como Firefox. El resultado viene a ser el siguiente:

image

¡Cáspita! Los acentos no acaban de verse como yo esperaba.

La verdad es que no sé si existe alguna solución sencilla para arreglar esto, pero entre que una vez estudié algo de codificación en la asignatura “Estructura de computadores” y que soy retorcido por naturaleza, hecho mano de VisualStudio y me pongo a intentar encontrar una solución.

Tras estar un rato buscando en las clases de .Net Framework, veo que existe una clase dedicada a la conversión entre codificaciones de caracteres, la clase System.Text.Encoding, así que no resulta difícil crear una función que convierta una serie de caracteres escritos en ASCII a Unicode:

using System;
using System.Text;

namespace JnSoftware.Utiles.CodificacionUnicode
{
    /// <summary>
    /// Servicios de codificación Unicode
    /// </summary>
    class CodificacionUnicode
    {
        /// <summary>
        /// Devuelve la cadena pasada como parámetro en formato 
        /// Unicode
        /// </summary>
        public static string CodificaUnicode(string texto)
        {
            /* Tipo de codificación */
            System.Text.Encoding codificacion = System.Text.Encoding.Unicode;

            /* Se crea una matriz de CHAR con los carácteres de la cadena que 
             * se quiere codificar */
            Char[] caracteres = texto.ToCharArray();

            /* Conversión de la cadena en una matriz de Bytes */
            Byte[] bytesCodificados = codificacion.GetBytes(caracteres);

            /* Se crea un StringBuilder para poder traspasar los bytes ya 
             * codificados */
            StringBuilder sb = new StringBuilder();

            /* Bucle que añade los bytes codificados. Se puede aprovechar para 
             * poder comprobar caracteres especiales*/
            for (int c = 0; c < bytesCodificados.Length - 1; c++)
            {
                string byteActual = string.Format("%{0:X2}", bytesCodificados[c]);

                /* Se comprueba que no se trate del carácter "especial" del separador */
                if (!byteActual.Equals("%00"))
                    sb.Append(byteActual);
            }
            /* Valor de retorno */
            return sb.ToString();
        }
    }
}

Por cierto, una vez aplicada la función, el enlace queda un poco más “sucio”, pero mucho más compatible:

<a
  href="mailto:
    %75%73%75%61%72%69%6F%40%64%6F%6D%69%6E%69%6F%2E%63%6F%6D
    ?subject=%53%6F%6C%69%63%69%74%75%64%20%64%65%20%69%6E%66%6F%72%6D%61%63%69%F3%6E
    &body=%4C%65%73%20%61%67%72%61%64%65%63%65%72%ED%61%20%73%65%20%73%69%72%76%61%6E
          %20%72%65%6D%69%74%69%72%6D%65%20%69%6E%66%6F%72%6D%61%63%69%F3%6E%20%61%64
          %69%63%69%6F%6E%61%6C%20%61%63%65%72%63%61%20%64%65%3A
    ">
    Texto del enlace
  </a>

 

Nota: Reconozco que tenía esta entrada en el viejo blog, pero como tengo intención de cerrarlo definitivamente, intento “salvar” aquellas cosas que he ido necesitando después de escribirlas. En este caso, tan sólo me he limitado a traducirlo de C#.