SMTP AUTH example

Just starting out? Need help? Post your questions and find answers here.
rob6523
User
User
Posts: 59
Joined: Sat Sep 25, 2004 2:02 pm
Location: Netherlands (Ophemert)
Contact:

SMTP AUTH example

Post by rob6523 »

Does anyone have a simple SMPT AUTH send mail example for me?

I've been looking around but haven't found anything that does the job.
Including the blat.dll version.

Rob.
User avatar
GeoTrail
Addict
Addict
Posts: 2794
Joined: Fri Feb 13, 2004 12:45 am
Location: Bergen, Norway
Contact:

Post by GeoTrail »

Check out the PureSMTP library.
You'll find it here on the forum.
I Stepped On A Cornflake!!! Now I'm A Cereal Killer!
rob6523
User
User
Posts: 59
Joined: Sat Sep 25, 2004 2:02 pm
Location: Netherlands (Ophemert)
Contact:

Post by rob6523 »

Thanks,

unfortunately this lib doesn't do the job for me.
It doesn't connect to the pop and smtp server (returns error code) although I've entered the correct info.

Rob.
plouf
Enthusiast
Enthusiast
Posts: 281
Joined: Fri Apr 25, 2003 6:35 pm
Location: Athens,Greece

Post by plouf »

PureSMTP do not suport SMTP conection with AUTH as i see in latest vesrion at least
Christos
User avatar
GeoTrail
Addict
Addict
Posts: 2794
Joined: Fri Feb 13, 2004 12:45 am
Location: Bergen, Norway
Contact:

Post by GeoTrail »

Yes it does

Code: Select all

PureSMTP_OpenPOP3ThenSMTPConnection(POP3Server.s, POP3Port.l, POP3UserName.s, POP3UserPassword.s, SMTPServer.s, SMTPPort.l) : Open connection to POP3 server (authentification) and then to SMTP server : returns #PureSMTP_Ok if success (else is error code)
I Stepped On A Cornflake!!! Now I'm A Cereal Killer!
plouf
Enthusiast
Enthusiast
Posts: 281
Joined: Fri Apr 25, 2003 6:35 pm
Location: Athens,Greece

Post by plouf »

this is not smtp auth

but an authorising based on conecting to pop3 server fisrt
its a method used by a few free mail providers to allow you

HEre is an page explaining PLAIN AUTH (google search)

http://www.technoids.org/saslmech.html

gmx smtp support PLAIN AUTH (just test with telnet)
Christos
User avatar
GeoTrail
Addict
Addict
Posts: 2794
Joined: Fri Feb 13, 2004 12:45 am
Location: Bergen, Norway
Contact:

Post by GeoTrail »

Well it works for my smtp, and it is not free ;)
I Stepped On A Cornflake!!! Now I'm A Cereal Killer!
plouf
Enthusiast
Enthusiast
Posts: 281
Joined: Fri Apr 25, 2003 6:35 pm
Location: Athens,Greece

Post by plouf »

you missunderstood my words

i did not said that it did not work, but what i said was
that AUTH LOGIN is a specific protocol negotiation <a href='http://www.ietf.org/rfc/rfc2554.txt'>extensions</a> with smtp server
and this negotiation is not supported by PureSMTP library
Christos
User avatar
GeoTrail
Addict
Addict
Posts: 2794
Joined: Fri Feb 13, 2004 12:45 am
Location: Bergen, Norway
Contact:

Post by GeoTrail »

Oh, ok. Sorry 'bout that :)
I Stepped On A Cornflake!!! Now I'm A Cereal Killer!
rob6523
User
User
Posts: 59
Joined: Sat Sep 25, 2004 2:02 pm
Location: Netherlands (Ophemert)
Contact:

Post by rob6523 »

Hi Plouf,

You are very much right!
Thanks for the information.
This is exactly my problem.

Rob.
rob6523
User
User
Posts: 59
Joined: Sat Sep 25, 2004 2:02 pm
Location: Netherlands (Ophemert)
Contact:

Post by rob6523 »

I have a piece of powerbasic code that covers the smtp auth process but I'm unable to port it to purebasic....
Note that this is no complete smtp code but only complete on the smtp auth process....
Perhaps one of you can have a go at it...

'this is the main code section
'-----------------------------------------------------------
HOST NAME TO localhost
TCP OPEN "smtp" AT SmtpHost AS hTCP
TCP_LINE hTCP, sLine
e = VAL(LEFT$(sLine, 3))
IF e = 220 THEN
TCP_PRINT hTCP, "EHLO " & localhost
DO WHILE NOT EOF(hTCP)
TCP_LINE hTCP, sLine
e = VAL(LEFT$(sLine, 3))
LOOP
IF e <> 250 THEN
'no reply
ELSE
Authentication hTCP, e
'from here the coding is the same as usual
END IF
ELSE
'server down
END IF
'------------------------------------------------------------
'end of main code section
'------------------------------------------------------------
'------------------------------------------------------------
'code fore authentication
'------------------------------------------------------------
SUB Authentication(BYVAL hTCP AS LONG, e AS LONG)
DIM mTmp AS STRING
DIM Buffer AS STRING
DO WHILE NOT EOF(hTCP)
TCP LINE hTCP, Buffer
e = VAL(LEFT$(Buffer, 3))
LOOP
TCP PRINT hTCP, "AUTH LOGIN"
DO WHILE NOT EOF(hTCP)
TCP LINE hTCP, Buffer
e = VAL(LEFT$(Buffer, 3))
LOOP
IF e = 334 THEN
mTmp = StringToMime(secUser) 'secUser is the UserId (might be the same as the POP3 UserId)
TCP PRINT hTCP, mTmp
DO WHILE NOT EOF(hTCP)
TCP LINE hTCP, Buffer
e = VAL(LEFT$(Buffer, 3))
LOOP
IF e = 334 THEN
mTmp = StringToMime(secPassword) 'secPassword is the password (might be the same as the POP3 password)
TCP PRINT hTCP, mTmp
DO WHILE NOT EOF(hTCP)
TCP LINE hTCP, Buffer
e = VAL(LEFT$(Buffer, 3))
LOOP
END IF
END IF
END SUB
'this code is by Dave Navarro
FUNCTION StringToMIME(BYVAL InBuff AS STRING) AS STRING
LOCAL Enc AS STRING * 64
LOCAL b AS ASCIIZ * 4
LOCAL OutBuff AS STRING
REGISTER i AS LONG
Enc = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
WHILE LEN(InBuff)
b = LEFT$(InBuff, 3)
! mov AL, b[0]
! shr AL, 2
! movzx i, AL
OutBuff = OutBuff + MID$(Enc, i + 1, 1)
! mov AL, b[1]
! mov AH, b[0]
! shr AX, 4
! and AL, &H3F
! movzx i, AL
OutBuff = OutBuff + MID$(Enc, i + 1, 1)
IF LEN(InBuff) = 1 THEN
OutBuff = OutBuff + "=="
EXIT DO
END IF
! mov AL, b[2]
! mov AH, b[1]
! shr AX, 6
! and AL, &H3F
! movzx i, AL
OutBuff = OutBuff + MID$(Enc, i + 1, 1)
IF LEN(InBuff) = 2 THEN
OutBuff = OutBuff + "="
EXIT DO
END IF
! mov AL, b[2]
! and AL, &H3F
! movzx i, AL
OutBuff = OutBuff + MID$(Enc, i + 1, 1)
InBuff = MID$(InBuff, 4)
WEND
FUNCTION = OutBuff
END FUNCTION
'------------------------------------------------------------
'end of authentication
'------------------------------------------------------------



Rob.
clipper
User
User
Posts: 44
Joined: Fri Aug 29, 2003 7:47 am
Location: Germany

Send Mails SMTP-AUTH or Regular and LARGE Attachments > 6

Post by clipper »

This Code works for me, also with large Attachments.
You can send your mail with SMTP-Auth or - if you leave the Username blank- regular.

To implement POP bevor SMTP as another Login-Mechanism would be easy.

Ok, a timeout would be nice.

Most of the code are snippets I´ve found here

Code: Select all


Global ConnectionID.l
Global CrLf.s
CrLf.s=Chr(13)+Chr(10)

Enumeration 
#eHlo
#RequestAuthentication
#Username
#Password
#MailFrom
#RcptTo
#Data
#Quit
#Complete
EndEnumeration

 NewList Attachments.s() 
 InsertElement(Attachments()) 
 Attachments() = "c:\afile.htm"
;InsertElement(Attachments()) 
;Attachments() = "c:\another.jpg" 

Declare.s Base64Encode(strText.s)
Declare SendFiles()
Declare.s GetMIMEType(Extension.s) 
Declare Send(msg.s)
Declare SendESMTPMail(name.s,sender.s,recipient.s,username.s,password.s,smtpserver.s,subject.s,body.s)



;Sending Mail with SMTP-AUTH
sendesmtpmail("Clipper","my@email.com","your@email.com","username","password","auth.smtp.mailserver.com","Hallo","This is the body")


; Don´t fill the Username if you want to sent regular
;sendesmtpmail("Clipper","my@email.com","your@email.com","","","smtp.mailserver.com","Hallo","This is the body")

Procedure SendESMTPMail(name.s,sender.s,recipient.s,username.s,password.s,smtpserver.s,subject.s,body.s)
If InitNetwork()
   ConnectionID = OpenNetworkConnection(smtpserver, 25)
   If ConnectionID
      loop250.l=0
      Repeat   
         If NetworkClientEvent(ConnectionID)
            ReceivedData.s=Space(9999)
            ct=ReceiveNetworkData(ConnectionID ,@ReceivedData,9999) 
            If ct
               cmdID.s=Left(ReceivedData,3)
               cmdText.s=Mid(ReceivedData,5,ct-6)
               Debug "<" + cmdID + " " + cmdText
               Select cmdID
                  Case "220"
                     If Len(username)>0
                        Send("Ehlo " + Hostname())
                        state=#eHlo
                     Else
                        send("HELO " + Hostname())
                        state=#MailFrom
                     EndIf   
                  Case "221"
                     send("[connection closed]")
                     state=#Complete
                     quit=1      
                  Case "235"
                     Send("MAIL FROM: <" + sender + ">")
                     state=#RcptTo
                    
                  Case "334"
                     If state=#RequestAuthentication
                        Send(Base64Encode(username))
                        state=#Username
                     EndIf
                     If state=#Username
                        Send(Base64Encode(password))
                        state=#Password
                     EndIf
 
                  Case "250" 
                     Select state
                        Case #eHlo
                           send("AUTH LOGIN")
                           state=#RequestAuthentication     
                        Case #MailFrom   
                           Send("MAIL FROM: <" + sender + ">")
                           state=#RcptTo
                        Case #RcptTo
                           Send("RCPT TO: <" + recipient + ">")
                           state=#Data
                        Case #Data
                           Send("DATA")
                           state=#QUIT
                        Case #QUIT
                           Send("QUIT")
                     EndSelect
              
                  Case "251"
                        Send("DATA")
                        state=#Data
                  Case "354"
                     send("X-Mailer: eSMTP 1.0")
                     send("To: " + recipient)
                     send("From: " + name + " <" + sender + ">")
                     send("Reply-To: "+sender)
                     send("Date:" + FormatDate("%dd/%mm/%yyyy @ %hh:%ii:%ss", Date()) )
                     send("Subject: " + Subject)
                     send("MIME-Version: 1.0")
                     send("Content-Type: multipart/mixed; boundary="+Chr(34)+"MyBoundary"+Chr(34))
                     Send("")
                     send("--MyBoundary")
                     Send("Content-Type: text/plain; charset=us-ascii")
                     Send("Content-Transfer-Encoding: 7bit")
                     send("")                     
                     Send(body.s)
                     SendFiles()
                     send("--MyBoundary--")
                     Send(".")
              
                  Case "550"
                       
                     quit=1      
               EndSelect
            EndIf 
         EndIf
         
      Until Quit = 1
      CloseNetworkConnection(ConnectionID)
      MessageRequester("","Ende")
   EndIf
EndIf          
EndProcedure 

Procedure Send(msg.s)
;Delay(10)
Debug "> " + msg
msg+crlf.s
SendNetworkData(ConnectionID, @msg, Len(msg))
EndProcedure 


Procedure SendFiles()
ResetList(Attachments())
While(NextElement(Attachments()))
file.s=Attachments()
Send("")
If ReadFile(0,file.s) 
   Debug file
   InputBufferLength.l = Lof()
   OutputBufferLength.l = InputBufferLength * 1.4
   *memin=AllocateMemory(InputBufferLength) 
   If *memin
      *memout=AllocateMemory(OutputBufferLength)
      If *memout
         Boundry.s = "--MyBoundary"
         Send(Boundry)
         Send("Content-Type: "+GetMIMEType(GetExtensionPart(file.s)) + "; name=" + Chr(34) + GetFilePart(file.s) + Chr(34)) 
         send("Content-Transfer-Encoding: base64")
         send("Content-Disposition: Attachment; filename=" + Chr(34) + GetFilePart(file) + Chr(34))
         send("")
         ReadData(*memin,InputBufferLength)
         Base64Encoder(*memin,60,*memout,OutputBufferLength)
         send(PeekS(*memout,60)) ; this must be done because For i=0 To OutputBufferLength/60 doesn´t work
         Base64Encoder(*memin,InputBufferLength,*memout,OutputBufferLength)                
         For i=1 To OutputBufferLength/60
             temp.s=Trim(PeekS(*memout+i*60,60))
             If Len(temp)>0
              send(temp)
             EndIf 
         Next
      EndIf
   EndIf
   FreeMemory(-1)
   CloseFile(0)
EndIf 
Wend
ProcedureReturn
EndProcedure 


Procedure.s Base64Encode(strText.s) 
    DefType.s Result 
    *B64EncodeBufferA = AllocateMemory(Len(strText)+1) 
    *B64EncodeBufferB = AllocateMemory((Len(strText)*3)+1) 
    PokeS(*B64EncodeBufferA, strText) 
    Base64Encoder(*B64EncodeBufferA, Len(strText), *B64EncodeBufferB, Len(strText)*3) 
    Result = PeekS(*B64EncodeBufferB) 
    FreeMemory(-1)
    ProcedureReturn Result 
EndProcedure


Procedure.s GetMIMEType(Extension.s) 
    Extension = "." + Extension 
    hKey.l = 0 
    KeyValue.s = Space(255) 
    DataSize.l = 255 
    If RegOpenKeyEx_(#HKEY_CLASSES_ROOT, Extension, 0, #KEY_READ, @hKey) 
        KeyValue = "application/octet-stream" 
    Else 
        If RegQueryValueEx_(hKey, "Content Type", 0, 0, @KeyValue, @DataSize) 
            KeyValue = "application/octet-stream" 
        Else 
            KeyValue = Left(KeyValue, DataSize-1) 
        EndIf 
        RegCloseKey_(hKey)
    EndIf 
    ProcedureReturn KeyValue 
EndProcedure

User avatar
NoahPhense
Addict
Addict
Posts: 1999
Joined: Thu Oct 16, 2003 8:30 pm
Location: North Florida

..

Post by NoahPhense »

This code kicks as$ .. JUST WHAT I NEEDED!! THANKS

- np
rob6523
User
User
Posts: 59
Joined: Sat Sep 25, 2004 2:02 pm
Location: Netherlands (Ophemert)
Contact:

Post by rob6523 »

Thanks Clipper!

Works fine.

Rob. :lol:
gnozal
PureBasic Expert
PureBasic Expert
Posts: 4229
Joined: Sat Apr 26, 2003 8:27 am
Location: Strasbourg / France
Contact:

Post by gnozal »

plouf wrote:... AUTH LOGIN is a specific protocol negotiation <a href='http://www.ietf.org/rfc/rfc2554.txt'>extensions</a> with smtp server and this negotiation is not supported by PureSMTP library
SMTP AUTH LOGIN is supported by PureSMTP (at least, it works for me).
For free libraries and tools, visit my web site (also home of jaPBe V3 and PureFORM).
Post Reply