SMTP session aborting

Post Reply
chiaiese
Posts: 56
Joined: Wed Feb 08, 2006 10:32 pm
Location: Roma, Italia
Contact:

SMTP session aborting

Post by chiaiese »

hello!
I have a working prg which sends email via TSMTP:SendMail() connecting to a mail server on the internet.
Now, if I upload my program to the same PC where the mail server is installed, mails are no more sent out.
I use LKM version because I need user authentication
Turned on the debug mode here is the log:

23-02-2007 15:30:43: Connect Socket handle: 7948 WSA Error: 0
23-02-2007 15:30:43: Write Socket handle: 7948 WSA Error: 0
23-02-2007 15:30:45: Read Socket handle: 7948 WSA Error: 0
23-02-2007 15:30:45: 220 mail.myserver.it ESMTP
23-02-2007 15:30:45: HELO smtp-client
23-02-2007 15:30:45: AUTH LOGIN
23-02-2007 15:30:45: Read Socket handle: 7948 WSA Error: 0
23-02-2007 15:30:45: 250 Hello.
334 VXNlcm5hbWU6

anyone can say what's happen ?
thanks
chiaiese
Posts: 56
Joined: Wed Feb 08, 2006 10:32 pm
Location: Roma, Italia
Contact:

Post by chiaiese »

solved!
it seems as the socket catches two messages at a time
I don't know why there is this different behavior among the two PC's but now it works

I put the follwing modifications in the TSMTP class, OnRead() method

Case ::nStatus == ST_AUTH0
If SubStr( cData, 1, 3 ) == "250"
// add: Roberto Chiaiese - 23/02/2007 - two messages at a time
If Eval( bReply, cAns := "334" )
oSocket:SendData( cMimeEnc( ::cUser ) + CRLF )
::nStatus := ST_USER
else
// end r.c.
::nStatus := ST_AUTH
endif
Else
::nStatus := ST_QUIT
Endif

Roberto Chiaiese
Ollie
Posts: 233
Joined: Sat Dec 30, 2006 6:10 am

Post by Ollie »

Hi Roberto

Are you able to send HTML messages with TSMTP?
Many thanks
Ollie.

Using:
xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6406)
Borland C++ 5.5.1
FWH 9.04 (2009 Apr)
chiaiese
Posts: 56
Joined: Wed Feb 08, 2006 10:32 pm
Location: Roma, Italia
Contact:

SMTP session aborting

Post by chiaiese »

Yes, I'm able to send HTML, but I modified another little piece of code here
in OnRead() method

Code: Select all

If ! Empty( ::cHTML )  // RRG 29.05.2002 Send as HTML sytle email (Cambios para enviar correo como html)
    oSocket:SendData( CRLF + "--NextPart" + CRLF + ;
                  "Content-Type: text/html; " +;
                  'charset="iso-8859-1"' + CRLF + ;
                  /* "Content-Transfer-Encoding: quoted-printable" + CRLF +*/ CRLF + ;
                  FormHtml( ::cHTML, ::cSubject, ::cMailer ) + CRLF )
                  // r.c. rem: "quoted-printable" above - 28/03/2007
            Endif
regards
Roberto Chiaiese
Ollie
Posts: 233
Joined: Sat Dec 30, 2006 6:10 am

Post by Ollie »

Would you mind emailing me the TMAIL class with all the changes you have made?

ollie@theoasis.co.za
Many thanks
Ollie.

Using:
xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6406)
Borland C++ 5.5.1
FWH 9.04 (2009 Apr)
chiaiese
Posts: 56
Joined: Wed Feb 08, 2006 10:32 pm
Location: Roma, Italia
Contact:

Post by chiaiese »

I did not make any change to the TMail class, but only to TSmtp and only those I've mentioned above
Now it works for me with authentication and text .OR. html body


Roberto Chiaiese
Roberto Chiaiese
R&C Informatica S.n.c.
http://www.recinformatica.it
info@recinformatica.it
Ken Wantz
Posts: 45
Joined: Wed Nov 29, 2006 7:48 pm
Location: Toronto Canada

Post by Ken Wantz »

I have 2 questions.

First, I assume ST_AUTH0, ST_USER and ST_AUTH are defiined variables but you make no mention as to their values? As these values do not appear to be set anywhere, testing them would always return a false result. A further question is whether they get set in a class other than TSMTP.prg?

Second, after what existing code are these pieces added? You mention the second piece of code modifies existing code but I am thinking it is in fact added.

Could you please clarify these 2 points for me?

Regards,

Ken
User avatar
James Bott
Posts: 4654
Joined: Fri Nov 18, 2005 4:52 pm
Location: San Diego, California, USA
Contact:

Post by James Bott »

Roberto,

I think you must be using a non-standard FW TSMTP class. I have the latest class (FWH ver 7.05) and there is no line:

Case ::nStatus == ST_AUTH0

And ST_AUTHO and ST_USER are not defined. Also it seems that you have a typo in ST_AUTH0 - the last character is a zero not a letter O.

James
User avatar
AlexSchaft
Posts: 172
Joined: Fri Oct 07, 2005 1:29 pm
Location: Edenvale, Gauteng, South Africa

SMTP class

Post by AlexSchaft »

Hi,

Not having seen your full source, I'd just like to point out that an smtp server can send multiple lines of replies, but the last line always has a space as the fourth character, while the rest have a dash, e.g.

Below from a telnet to our mail server

Code: Select all

220 mail.quicksoftware.co.za ESMTP
ehlo alexlt
250-quicksoftware.co.za Hi pc-00174.quicksoftware.co.za [10.1.1.174]
250-PIPELINING
250-8BITMIME
250 SIZE 10000000
We have this modification:

Code: Select all

METHOD OnRead( oSocket ) CLASS qSmtp

  // Buffer received data, as you do not necessarily receive all the server data in one go e.g.
  ::cReceived                += cData  // cReceived is built up until it is a complete server response

  // Pull out full lines received
  Do While at(CRLF, ::cReceived) > 0
    nPos                     := at(CRLF, ::cReceived)

    // Build up an array of all the server replies
    AAdd(::acReply, Left(::cReceived, nPos - 1))

    ::cReceived              := Substr(::cReceived, nPos + 2)
  Enddo

  // Has closing line been received i.e. full reply from server (may come in dribs and drabs)
  if Substr(ATail(::acReply), 4, 1) == " "
    // We now have the full server response, now process it.
    // AS 08/09/2005
    cReply                   := Substr(ATail(::acReply), 1, 3)

    if ::lLog
      // AS 08/09/2005
      aeval(::acReply, {|pcReply| LogFile(::cLogFile, {"SERVER: " + pcReply})})
//      LogFile(::cLogFile, {"MAILSERVER (Status = " + NTRIM(::nStatus)+"): " + cReply})
    endif

    do case
      case ::nStatus == ST_INIT
        if cReply == "220" // Server asknowleges connection

          // Send helo and hop to next status
          ::nStatus          := ST_CONNECTED
chiaiese
Posts: 56
Joined: Wed Feb 08, 2006 10:32 pm
Location: Roma, Italia
Contact:

SMTP Class

Post by chiaiese »

Hi all,
first of all, sorry for my bad english.
yes I'm using a non-standard class, I wrote it on my first message in this topic.
I'm using LKM version dated 02 june 2005.
I don't know if I can post entire code here because the source is not mine and (sorry) I don't remember where I downloaded it from.
Anyway here is the header of the class:

Code: Select all

// FiveWin Internet outgoing mail Class
// Modified by Luis Krause July 5, 2001; February 26, 2002; October 7, 2002; November 5, 2002;
//                         October 9, 2003; June 1, 2005
//    with code from Alex Shaft, Byron Hopp, Andrew Ross (PipleLine Solutions),
//    Frank Demont, Peter Kohler, Rafael Gaona, Joaquim Ferrer,
//    Jos‚ Lal¡n, Ray Alich (IBTC), Ignacio Vizca¡no Tapia and others
// Special thanks to Jorge Mason for the fix to GetHostByAddress() that was GPFing on some servers

// Simple Authentication and Security Layer [SASL]
// This class only supports LOGIN type for authentication.
// TODO: Add PLAIN and MD5 methods.
//       PLAIN is the same as LOGIN but it doesn't use base64, i.e.:
//       AUTH LOGIN -> USER cMimeEnc( ::cUser )
//       AUTH PLAIN -> USER ::cUser
// See rfc2554.txt for more details about ESMTP
// [jlalin]

#include "FiveWin.ch"

#ifndef __CLIPPER__
#xtranslate Memory(<n>) =>                       // only needed with Clipper, not [x]Harbour
#endif

// different session status
#define ST_INIT       0
#define ST_CONNECTED  1
#define ST_RESET      2
#define ST_MAILFROM   3
#define ST_RCPTTO     4
#define ST_DATA       5
#define ST_SENT       6
#define ST_QUIT       7
#define ST_DONE       8
#define ST_ERROR      9

// Authentication states
#define ST_AUTH0      10        // IBTC
#define ST_AUTH       11        // [jlalin]
#define ST_USER       12        // [jlalin]
#define ST_PASS       13        // [jlalin]
// Last defined state
#define ST_LAST       ST_PASS   // [jlalin]

#define MSG_CAPTION   "SMTP Services"
as yu can see the constants are defined for this class only and there is no typo here as ST_AUTH0 ends with a 'zero'.

In the first piece of code in my previous messages, I added the code between the lines beginning with the remarks "add" ending with "end r.c."

In the second piece I just removed:
/* "Content-Transfer-Encoding: quoted-printable" + CRLF +*/
Roberto Chiaiese
R&C Informatica S.n.c.
http://www.recinformatica.it
info@recinformatica.it
Post Reply