3 de noviembre de 2005

Email y VFP: Parte 1i (EsSmtp)

Artículo original: Email and VFP: Part 1i (EsSmtp)
http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,def9a19f-04ab-46ff-8421-f700822f1773.aspx 
Autor: Craig Boyd
Traducido por: Ana María Bisbé York


Como hemos visto en las entradas previas de esta serie, el envío de correo electrónico con VFP puede realizarse de varias maneras. En esta entrada, voy a mostrar el empleo de un control ActiveX gratuito, que está disponible y es conocido simplemente como EsSmtp. Este control se vendió por Eurosource (http://www.eurosource.se); pero ahora se encuentra en SourceForge (http://sourceforge.net/projects/activex). No sólo es gratis, sino que es de código abierto. Hay algunos controles disponibles; pero con el único que estoy familiarizado es con EsSmtp. Necesitará descargar y registrar este control para que el ejemplo trabaje. Puede descargarlo aquí: http://sourceforge.net/project/showfiles.php?group_id=47048. Y encontrar información adicional aquí: http://activex.sourceforge.net/essmtp.html.

Bien, sin más dilación, he aquí el código.
*******************************
*!* Ejemplo de utilización de SendViaEsSmtp
*******************************
DIMENSION aryAttach(2)
aryAttach(1) = "C:\attachment1.txt" && cambie a un archivo real que existe en su PC
aryAttach(2) = "C:\attachment2.zip" && cambie a un archivo real que existe en su PC
LOCAL lcFromName, lcFromAddress, lcTo, lcSubject, lcBody, lcCC, lcBCC, lcSMTPServer, lcErrReturn
lcFromName = "Mi Nombre"
lcFromAddress = "yo@midominio.com"
lcTo = "alguien@sudominio.com"
lcSubject = "Hey ¿Ha intentado enviar un email con VFP?"
lcBody = ""Quiero hacerle saber que VFP es muy versátil y hay muchas formas de enviar un email."
lcCC = "otro@sudominio.com"
lcBCC = "mijefe@dominiodeljefe.com"
lcSMTPServer = "mail.myhost.com"
SendViaEsSmtp(@lcErrReturn, lcFromName, lcFromAddress, lcTo, lcSubject, lcBody, @aryAttach, lcCC, lcBCC, lcSMTPServer)
IF EMPTY(lcErrReturn)
  MESSAGEBOX("'" + lcSubject + "' se envió satisfactoriamente.", 64, "Envía email via EsSmtp")
ELSE
  MESSAGEBOX("'" + lcSubject + "' falló al enviar. Causa:" + CHR(13) + lcErrReturn, 64, "Envía email via EsSmtp")
ENDIF

*******************************************
PROCEDURE SendViaEsSmtp(tcReturn, tcFromName, tcFromAddress, tcTo, tcSubject, tcBody, taFiles, tcCC, tcBCC, tcSMTPSever)
*******************************************
  LOCAL loEsSmtp, lnCountAttachments, lnErrorNo
  TRY
    loEsSmtp = CREATEOBJECT("ESSMTP.EsSmtpCtrl.1")
    WITH loEsSmtp
    IF TYPE("tcSMTPSever") = "C"
      .SMTPServer = tcSMTPSever
    ENDIF 
    IF TYPE("tcFromName") = "C"
      .SourceName = tcFromName
    ENDIF
    IF TYPE("tcFromAddress") = "C"
      .SourceAddress = tcFromAddress
    ENDIF
    .DestinationAddress = tcTo
    IF TYPE("tcCC") = "C"
      .CCDestinationAddress = tcCC
    ENDIF
    IF TYPE("tcBCC") = "C"
      .BCCDestinationAddress = tcBCC
    ENDIF
    .Subject = tcSubject
    .MailData = tcBody
    IF TYPE("taFiles", 1) = "A"
      FOR lnCountAttachments = 1 TO ALEN(taFiles)
        .AddAttachment(taFiles(lnCountAttachments), 0) && 0 significa codificar a base64 si es necesario
      ENDFOR
    ENDIF
    IF .SendMail() != 1 && hubo un problema
      lnErrorNo = .ErrorNo
      DO CASE
        CASE lnErrorNo = 421
          THROW "El servicio no está disponible, cerrando el canal de transmisión"
        CASE lnErrorNo = 450
          THROW "No se realizó la acción requerida: buzón no disponible [Por ejemplo, buzón lleno]"
        CASE lnErrorNo = 451
          THROW "Ha abortado la acción requerida: hubo error local al procesar"
        CASE lnErrorNo = 452
          THROW "No se realizó la acción requerida: hay insuficiente capacidad de almacenado del sistema"
        CASE lnErrorNo = 500
          THROW "Error de sintaxis, comando irreconocible [Puede incluir errores del tipo: línea demasiado larga]"
        CASE lnErrorNo = 501
          THROW "Error de sintaxis en los parámetros o argumentos"
        CASE lnErrorNo = 502
          THROW "No se implementó el comando"
        CASE lnErrorNo = 503
          THROW "Está mal la secuencia de comandos"
        CASE lnErrorNo = 504
          THROW "No implementado el parámetro del comando"
        CASE lnErrorNo = 550
          THROW "No se realizó la acción requerida: buzón de correo no disponible [Por ejemplo: no existe, no tiene acceso]"
        CASE lnErrorNo = 552
          THROW "Ha abortado la acción requerida: excede la capacidad de almacenamiento"
        CASE lnErrorNo = 553
          THROW "No se realizó la acción requerida: el nombre del buzón no está admitido [Por ejemplo, es incorrecta la sintaxis del buzón]"
        CASE lnErrorNo = 554
          THROW "Falló la transacción"
        OTHERWISE
          THROW "Error desconocido - Podría estar relacionado con el WinSock"
      ENDCASE
    ENDIF
    ENDWITH
  CATCH TO loError
    tcReturn = [Error: ] + STR(loError.ERRORNO) + CHR(13) + ;
      [LineNo: ] + STR(loError.LINENO) + CHR(13) + ;
      [Message: ] + loError.MESSAGE + CHR(13) + ;
      [Procedure: ] + loError.PROCEDURE + CHR(13) + ;
      [Details: ] + loError.DETAILS + CHR(13) + ;
      [StackLevel: ] + STR(loError.STACKLEVEL) + CHR(13) + ;
      [LineContents: ] + loError.LINECONTENTS
  FINALLY
    RELEASE loEsSmtp
    loEsSmtp = .NULL.
  ENDTRY
ENDPROC

No hay comentarios. :

Publicar un comentario