Page 1 of 2

hbtip and Email

Posted: Mon Mar 16, 2009 4:50 pm
by melliott42
Hello,

I am looking for the easiest way to send simple emails using HMG (no attachments). It seems it can be done via HBTIP. I am not sure how to get started with this.

1. Is HBTIP built into HMG?
2. Where can I find an example of using HBTIP to send an email?

Thanks,

Michael

Re: hbtip and Email

Posted: Mon Mar 16, 2009 5:04 pm
by Rathinagiri
Yes. HBtip is already built in HMG via lib file C:\hmg\HARBOUR\lib\libhbtip.a

HBTIP samples can be downloaded from Harbour sourcecodes.

Here is a test sample from the sources.

Code: Select all

/*
 * $Id: tipmmail.prg 8751 2008-06-19 00:02:50Z vszakats $
 */

/******************************************
* TIP test
* Mail - reading and writing multipart mails
*
* Creating a mail message.
* This will create a valid mail message, using
* the set of files given in the command line.
*
* Usage:
* testmmail [options] attachment1, attachment2...
*  options:
*    -h              Help
*    -f "from"       Set "mail from" field
*    -t "to"         Set "mail to" field
*    -s "subject"    Set mail subject
*    -b "body"       Set mail body (or message)
*    -m "bodyfile"   Set mail body using a file
*
*
* This test writes data to standard output, and is
* compiled only under GTCGI;
*****/

PROCEDURE MAIN( ... )
   LOCAL oMail, cData, i, oAttach
   LOCAL cFname, cFExt

   IF PCount() == 0
      Usage()
      QUIT
   ENDIF

   oMail := TipMail( "This is the body of the mail" )
   oMail:hHeaders[ "Content-Type" ] := "text/plain; charset=iso8851"
   oMail:hHeaders[ "Date" ]  := Tip_Timestamp()

   i := 1
   DO WHILE i < PCount()
      cData := hb_PValue(i)

      IF lower( cData ) == "-h"
         Usage()
         QUIT
      ENDIF

      IF lower( cData ) == "-f"
         i++
         cData := hb_PValue(i)
         IF cData != NIL
            oMail:hHeaders[ "From" ] := cData
         ENDIF
      ELSEIF lower( cData ) == "-t"
         i++
         cData := hb_PValue(i)
         IF cData != NIL
            oMail:hHeaders[ "To" ] := cData
         ENDIF
      ELSEIF lower( cData ) == "-s"
         i++
         cData := hb_PValue(i)
         IF cData != NIL
            oMail:hHeaders[ "Subject" ] := cData
         ENDIF
      ELSEIF lower( cData ) == "-b"
         i++
         cData := hb_PValue(i)
         IF cData != NIL
            oMail:SetBody( cData + e"\r\n" )
         ENDIF
      ELSEIF lower( cData ) == "-m"
         i++
         cData := hb_PValue(i)
         IF cData != NIL
            cData := Memoread( cData )
            IF Empty(cData)
               ? "FATAL: Can't read", hb_PValue(i)
               QUIT
            ENDIF
            oMail:SetBody( cData + e"\r\n")
         ENDIF
      ELSE  // it is an attachment file
         cData := Memoread( cData )
         IF Empty(cData)
            ? "FATAL: Can't read attachment", hb_PValue(i)
            QUIT
         ENDIF
         oAttach := TipMail():New()

         oAttach:SetEncoder( "base64" )
         //TODO: mime type magic auto-finder
         HB_FNameSplit( hb_PValue(i),,@cFname, @cFext )
         // Some EMAIL readers use Content-Type to check for filename
         oAttach:hHeaders[ "Content-Type" ] := ;
               "application/X-TIP-Attachment; filename=";
               + cFname + cFext
         // But usually, original filename is set here
         oAttach:hHeaders[ "Content-Disposition" ] := ;
               "attachment; filename=" + cFname + cFext
         oAttach:SetBody( cData )

         oMail:Attach( oAttach )
      ENDIF

      i++
   ENDDO

   /* Writing stream */
   FWrite( 1, oMail:ToString() )
RETURN


PROCEDURE Usage()
   ? "Usage:"
   ? "testmmail [options] attachment1, attachment2..."
   ? "  options:"
   ? "    -h              Help"
   ? '    -f "from"       Set "mail from" field'
   ? '    -t "to"         Set "mail to" field'
   ? '    -s "subject"    Set mail subject'
   ? '    -b "body"       Set mail body (or message)'
   ? '    -m "bodyfile"   Set mail body using a file'
   ?
   ?
RETURN

Code: Select all

/*
 * $Id: tipmail.prg 8751 2008-06-19 00:02:50Z vszakats $
 */

/******************************************
* TIP test
* Mail - reading and writing multipart mails
*
* Test for reading a multipart message (that must already
* be in its canonical form, that is, line terminator is
* CRLF and it must have no headers other than SMTP/Mime).
*
* This test writes data to standard output, and is
* compiled only under GTCGI;
*****/

PROCEDURE MAIN( cFileName )
   LOCAL oMail, cData, i

   IF cFileName != NIL
      cData := MemoRead(cFileName)
      IF Ferror() > 0
         ? "Can't open", cFileName
         QUIT
      ENDIF
   ENDIF
   oMail := TipMail():New()
   IF oMail:FromString( cData ) == 0
      ? "Malformed mail. Dumping up to where parsed"
   ENDIF

   WITH OBJECT oMail
      ? "-------------============== HEADERS =================--------------"
      FOR i := 1 TO Len( :hHeaders )
         ? hb_HKeyAt( :hHeaders, i ), ":", hb_HValueAt( :hHeaders, i )
      NEXT
      ?

      ? "-------------============== RECEIVED =================--------------"
      FOR EACH cData IN :aReceived
         ? cData
      NEXT
      ?

      ? "-------------============== BODY =================--------------"
      ? :GetBody()
      ?

      DO WHILE :GetAttachment() != NIL
         ? "-------------============== ATTACHMENT =================--------------"
         ? :NextAttachment():GetBody()
         ?
      ENDDO

   END

   ? "DONE"
   ?
   /* Writing stream */
   //FWrite( 1, oMail:ToString() )
RETURN
In our forum too, Roberto had started thread about this. Let me search and show you.

Re: hbtip and Email

Posted: Mon Mar 16, 2009 5:09 pm
by Rathinagiri
Yes, here it is. :)

Re: hbtip and Email

Posted: Mon Mar 16, 2009 6:54 pm
by melliott42
rathinagiri,

Thanks for posting! I think you can see from my other posts once I get a good example I am off to the races. :-)

Though I greatly appreciate your posts I am having a difficult time deciphering HBTIP. I am very glad it it built in.

How would you call the object or function in a manner to do something like this:

local nRetVal, cTo, cFrom, cSMTPServer, cSubject, cBody
cSMTPServer := '192.168.1.101'
cTo := 'rathinagiri@mydestinaation.com'
cFrom := 'michael@mysource.com'
cSubject := 'Test Email'
cBody := 'Hello email world!'

nRetVal := sendEmail(cTo, cFrom, cSMTPServer, cSubject, cBody)
if nRetVal != 0
msginfo('Uh Oh!')
end if

Thanks again for your advice,

Michael

Re: hbtip and Email

Posted: Mon Mar 16, 2009 7:24 pm
by Rathinagiri
Yes. That would definitely be so simple. I think we can code a small udf to do so.

Re: hbtip and Email

Posted: Sun Mar 29, 2009 3:03 am
by Roberto Lopez
rathinagiri wrote:Yes. That would definitely be so simple. I think we can code a small udf to do so.
The following function is part of HBTIP and is ready to use:

Code: Select all


FUNCTION HB_SendMail( cServer, nPort, cFrom, aTo, aCC, aBCC, cBody, cSubject, aFiles, cUser, cPass, cPopServer, nPriority, lRead, lTrace, lPopAuth, lNoAuth, nTimeOut, cReplyTo )
   /*
   cServer    -> Required. IP or domain name of the mail server
   nPort      -> Optional. Port used my email server
   cFrom      -> Required. Email address of the sender
   aTo        -> Required. Character string or array of email addresses to send the email to
   aCC        -> Optional. Character string or array of email adresses for CC (Carbon Copy)
   aBCC       -> Optional. Character string or array of email adresses for BCC (Blind Carbon Copy)
   cBody      -> Optional. The body message of the email as text, or the filename of the HTML message to send.
   cSubject   -> Optional. Subject of the sending email
   aFiles     -> Optional. Array of attachments to the email to send
   cUser      -> Required. User name for the POP3 server
   cPass      -> Required. Password for cUser
   cPopServer -> Required. Pop3 server name or address
   nPriority  -> Optional. Email priority: 1=High, 3=Normal (Standard), 5=Low
   lRead      -> Optional. If set to .T., a confirmation request is send. Standard setting is .F.
   lTrace     -> Optional. If set to .T., a log file is created (sendmail<nNr>.log). Standard setting is .F.
   lNoAuth    -> Optional. Disable Autentication methods
   nTimeOut   -> Optional. Number os ms to wait default 20000 (20s)
   cReplyTo   -> Optional.
   */

Re: hbtip and Email

Posted: Mon Jul 26, 2010 1:21 pm
by melliott42
Hello,

I do not have a POP server (just an SMTP server). Can you please recommend the values to use for the POP related fields?

Thanks,

Michael

Re: hbtip and Email

Posted: Mon Jul 26, 2010 1:30 pm
by Rathinagiri
POP is to retrieving the emails from a mailbox. Isn't it? I would checkup.

Re: hbtip and Email

Posted: Mon Jul 26, 2010 1:33 pm
by melliott42
I just need to send via SMTP.

Re: hbtip and Email

Posted: Mon Jul 26, 2010 1:49 pm
by Rathinagiri
As Roberto pointed out, we can use the following function.

Code: Select all

FUNCTION hb_SendMail( cServer, nPort, cFrom, xTo, xCC, xBCC, cBody, cSubject, aFiles, cUser, cPass, cPopServer, nPriority, lRead, bTrace, lPopAuth, lNoAuth, nTimeOut, cReplyTo, lTLS, cSMTPPass, cCharset, cEncoding )
   /*
   cServer    -> Required. IP or domain name of the mail server
   nPort      -> Optional. Port used my email server
   cFrom      -> Required. Email address of the sender
   xTo        -> Required. Character string or array of email addresses to send the email to
   xCC        -> Optional. Character string or array of email adresses for CC (Carbon Copy)
   xBCC       -> Optional. Character string or array of email adresses for BCC (Blind Carbon Copy)
   cBody      -> Optional. The body message of the email as text, or the filename of the HTML message to send.
   cSubject   -> Optional. Subject of the sending email
   aFiles     -> Optional. Array of attachments to the email to send
   cUser      -> Required. User name for the POP3 server
   cPass      -> Required. Password for cUser
   cPopServer -> Required. POP3 server name or address
   nPriority  -> Optional. Email priority: 1=High, 3=Normal (Standard), 5=Low
   lRead      -> Optional. If set to .T., a confirmation request is send. Standard setting is .F.
   bTrace     -> Optional. If set to .T., a log file is created (smtp-<nNr>.log). Standard setting is NIL.
                           If a block is passed, it will be called for each log event with the message a string, no param on session close.
   lPopAuth   -> Optional. Do POP3 authentication before sending mail.
   lNoAuth    -> Optional. Disable Autentication methods
   nTimeOut   -> Optional. Number os ms to wait default 20000 (20s)
   cReplyTo   -> Optional.
   */
From the hbtip library source, we can see that if lPopAuth is false, then we need not give cPopServername. Kindly check with a sample.