miércoles, 11 de septiembre de 2013

Send Mail .NET

Seguro más de uno nos hemos topado con una aplicación para enviar mails y validar al menos el formato de correo, aqui les dejo esta clase, espero les sea util.

class Email
    {

        static MailMessage _message;
        static SmtpClient _clienteSmtp;
        static Attachment _at;
        static int _puerto = 25;
        static string _user = "", _password = "";

        public static bool IsValidEmail(string email)
        {
            string expresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";

            if (Regex.IsMatch(email, expresion))
            {
                if (Regex.Replace(email, expresion, String.Empty).Length == 0)
                { return true; }
                else
                { return false; }
            }
            else
            { return false; }
        }

        public static void ConfigEmail(string from, string usuario, string contraseña, int puertoSalida, string smtp)
        {
            _message = new MailMessage();
            _message.From = new MailAddress(from);
            _clienteSmtp = new SmtpClient(smtp);
            _user = usuario;
            _password = contraseña;
            _clienteSmtp.Port = puertoSalida;
        }

        public static bool SendEmail(string to, string cc, string asunto, string mensaje, string ruta_archivo_adjunto)
        {

            try
            {

                _at = new Attachment(ruta_archivo_adjunto);

                _message.Attachments.Add(_at);

                _message.To.Add(to);

                _message.CC.Add(cc);

                _message.Subject = asunto;

                _message.IsBodyHtml = true; //el texto del mensaje lo pueden poner en HTML y darle formato

                _message.Body = mensaje;

                //Establesco que usare seguridad (ssl = Secure Sockets Layer)
                _clienteSmtp.EnableSsl = true;

                _clienteSmtp.UseDefaultCredentials = false;

                _clienteSmtp.Credentials = new NetworkCredential(_user, _password);

                ServicePointManager.ServerCertificateValidationCallback =
                       (s, certificate, chain, sslPolicyErrors) => true;
                _clienteSmtp.Send(_message);

                return true;

            }
            catch
            {

                try
                {
                    //Establesco que no usare seguridad ssl (por si no pudo enviarlo con ssl habilitado)
                    _clienteSmtp.EnableSsl = false;
                    _clienteSmtp.Send(_message);

                    return true;
                }
                catch
                {
                    return false;
                }

            }

        }
    }

martes, 10 de septiembre de 2013

Error: El Proveedor 'Microsoft.ACE.OLEDB.12.0' no está Registrado en del el equipo local.


Hace unos años atrás, antes de que Microsoft Office 2010, la vida era un poco más fácil para los desarrolladores:  sin embargo Office es de 32 bits, y punto, no  hay mas. 

Como saben ha sido un poco más complicado ya que con Microsoft Office 2010, los usuarios también pueden instalar una versión nativa de 64 bits de Office también.

Esto significa para nosotros que nuestros desarrollados de aplicaciones de 32 bits que utilizan un proveedor OLEDB para acceder a archivos de Excel o Access pueden no funcionar más ya que el proveedor de 32 bits no puede existir en una instalación de 64 bits de Office 2010.

En estos casos, a pesar de que el usuario tiene una instalación válida de Microsoft Office 2010 instalado en su máquina, su aplicación podría obtener un error como:
 El Proveedor 'Microsoft.ACE.OLEDB.12.0' no está Registrado en del el equipo local.

Bueno, para hacer frente a estos problemas Microsoft lanzó un instalador llamado "Microsoft Access Database Engine 2010 Redistributable". Este redistribuible proporciona una de 32 bits o una versión de 64 bits del proveedor de Microsoft OLEDB ACE que se puede descargar quí:


Posterior mente nos vamos a nuestro proyecto propiedades -> compile -> Advanced compile options -> TARGET CPU:  x86

Y con  eso debe funcionar nuestra aplicación. 

jueves, 27 de septiembre de 2012

How to populate a dropdown from XML

Dim oTemp As New Temp
Dim path As String path = HttpContext.Current.Request.Url.OriginalString.Substring(0, HttpContext.Current.Request.Url.OriginalString.LastIndexOf("/"))
path = path + "/XMLInfo/ConfigCompany.xml"

Dim Ds As New System.Data.DataSet Ds.ReadXml(path) RadcbCpnyId.DataSource =
Ds.Tables(0).DefaultView
RadcbCpnyId.DataTextField = "CpnyId" RadcbCpnyId.DataValueField = "ConStr" RadcbCpnyId.DataBind()

 XML SAmple




 
    CpnyId1
    ConStr1
 
 
    CpnyId3
    ConStr3
 
 
    CpnyId4
    ConStr4
 

viernes, 27 de julio de 2012

SQL Server 2008 y Windows 7: Attach Database. Error: No se puede abrir el archivo físico. Problemas con el UAC (User Account Control)


Apareció un nuevo problema en mi utilización de SQL2008 y Windows 7 a la hora de adjuntar una base de datos 
Con la base de ejemplo AdventureWorksLT2008 (la puedes descargar por aquí) descargue el .mdf y el .ldf para “attacharlos”
El script:
USE [master]
GO
CREATE DATABASE [AdventureWorksLT2008] ON 
( FILENAME = N'C:\SQLDATA\AdventureWorksLT2008_Data.mdf' ),
( FILENAME = N'C:\SQLDATA\AdventureWorksLT2008_Log.ldf' )
 FOR ATTACH
GO

Mensaje de Error:
Msg 5120, Level 16, State 101, Line 1
No se puede abrir el archivo físico "C:\SQLDATA\AdventureWorksLT2008_Data.mdf". Error del sistema operativo 5: "5(failed to retrieve text for this error. Reason: 15105)".

Solución 1:

Ejecutar el SSMS como Administrador.
  

Solución 2

La anterior solución nos da la idea que nos falta algo de permisos

desde TECHNET:

(…)El programa de instalación de SQL Server crea grupos de servicio local para los diferentes servicios de SQL Server y agrega las cuentas de servicio o los SID de servicio a estos grupos según sea necesario. Estos grupos simplifican la concesión de los permisos necesarios para ejecutar los servicios de SQL Server y otros ejecutables, y ayudan a proteger los archivos de SQL Server.(…) (mas info)

Grupo de Usuarios:
  •  
    • Instancia predeterminada: SQLServerMSSQLUser$nombreDeEquipo$MSSQLSERVER
    • Instancia con nombre: SQLServerMSSQLUser$nombreDeEquipo$nombreDeInstancia


jueves, 26 de julio de 2012

Hidden Fields with labels CRM4


Field
crmForm.all.ppc_address1_pais_txt.style.visibility = "hidden";

Label
crmForm.all.ppc_address1_pais_txt_c.style.visibility = "hidden";

After Convert Text Field to a Picklist include an OnChange event


Instead of clicking in on the field, to define the change event, you define it on form load.
Here is an example, where I have declared a change event in form load:


state.onchange = function(){
crmForm.all.ppc_address1_ciudad_txt.DataValue = state.SelectedText;
}


jueves, 5 de julio de 2012

CrmService.Retrieve Method Using JScript CRM4

/*-----------------Parent Accountid---------------------------*/
 if (crmForm.all.parentaccountid.DataValue != null && crmForm.all.ppc_rfc_para_fact.DataValue==2) {
 var parentacct = crmForm.all.parentaccountid;
 var entidad = "account";
 var atributo1 = "ppc_numeronit";
 var atributo2 ="ppc_actualizado";
 try {
 var parentaccountid = parentacct.DataValue[0].id;
 var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); xmlhttp.open("POST", "/mscrmservices/2007/crmservice.asmx", false);
 xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); xmlhttp.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/crm/2007/WebServices/Retrieve"); //xmlhttp.setRequestHeader("Content-Length", xml.length); var soapBody = "" + "" + "" + entidad + "" + "" + parentaccountid + "" + "" + "" + "" + atributo1 + "" + "" + atributo2 + "" + "" + "" + "" + ""; var soapXml = ""; soapXml += GenerateAuthenticationHeader(); soapXml += soapBody; soapXml += ""; xmlhttp.setRequestHeader("Content-Length", soapXml.length);
xmlhttp.send(soapXml);
 // Capture the result.
 var resultXml = xmlhttp.responseXML; // Check for errors.
 var errorCount = resultXml.selectNodes('//error').length;
 if (errorCount != 0) {
 var msg = resultXml.selectSingleNode('//description').nodeTypedValue; alert(msg);
 } // Display the retrieved value.
 else {
 //alert(resultXml.selectSingleNode('//q1:'+atributo1).nodeTypedValue); //alert(resultXml.selectSingleNode('//q1:'+atributo2).nodeTypedValue);
 if (resultXml.selectSingleNode('//q1:' + atributo2).nodeTypedValue == 1)
{
 crmForm.all.ppc_num_nit_cc_fact.DataValue = resultXml.selectSingleNode('//q1:' + atributo1).nodeTypedValue;
 } else {
 alert('La cuenta la cuenta Primaria no ha \n sido enviada a Solomon.');                           crmForm.all.ppc_num_nit_cc_fact.DataValue = '';
     }
   }
 }
 catch (e) {
   alert(e.message);
  }
}