e-mail sending?
Blitz3D Forums/Blitz3D Programming/e-mail sending?
| ||
| I know I've brought this up before. Does any know where I can get my hands on the e-mail sending code? It specifically needs to be able to handle attachments. I've tried the Code archive version and it seems to not send attachments correctly. It creates a file, but it's not the right size. |
| ||
| Here's my current code. It's based on Marks Blitzmail but I've added code for sending attachments. There's probably some superfluous stuff in there.
Const debugSMTP=True
Global encodestring$="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
;Email Globals
Global mailhost$
Global mailer$
Global mailfrom$
Global mailname$
Global mailto$
Global mode$
Global mymailserverport
Global myemailaddress$
Global myname$
Global mymailserver$
Dim myaddressbook$(100,2)
; -----------------------------------------------------------------------------
; . SMTP functions
; -----------------------------------------------------------------------------
; -----------------------------------------------------------------------------
; BlitzMail...
; -----------------------------------------------------------------------------
Function BlitzMail$ (mailfrom$,mailto$, subject$, message$,attachpath$,attachment$)
debuglog2 "Attempting to Email file...",2
error$ = "OK"
debuglog2 "OPENING TCP STREAM:"+mymailserver$+ "(PORT:"+mymailserverport+")",2
t = OpenTCPStream (mymailserver$, mymailserverport)
If t
; ---------------------------------------------------------------------
; Service available?
; ---------------------------------------------------------------------
response$ = ReadLine (t)
code$ = Code (response$)
If code$ <> "220"
If code$ = "421"
error$ = "Service not available"
debuglog2 error$,2
Else
error$ = response$+ " FAILED: Expecting 220"
debuglog2 error$,2
EndIf
Goto abortSMTP
EndIf
; ---------------------------------------------------------------------
; Say "Hi"
; ---------------------------------------------------------------------
CountHostIPs("")
debuglog2 "SENDING: HELO "+DottedIP$(HostIP(1)),2
WriteLine t, "HELO "+DottedIP$(HostIP(1))
response$ = ReadLine (t)
If Code (response$) <> "250"
error$ = response$+ " FAILED: Expecting 250"
Goto abortSMTP
EndIf
; ---------------------------------------------------------------------
; Non-existent command -- try it for error message!
; ---------------------------------------------------------------------
; WriteLine t, "LALA BlitzMail Deluxe"
; response$ = ReadLine (t)
; If Code (response$) <> "250"
; error$ = response$
; Goto abortSMTP
; EndIf
; ---------------------------------------------------------------------
; Tell server who's sending
; ---------------------------------------------------------------------
debuglog2 "SENDING: MAIL FROM: <" + myemailaddress$ + ">",2
WriteLine t, "MAIL FROM: <" + myemailaddress$ + ">"
response$ = ReadLine (t)
code$ = Code (response$)
If code$ <> "250"
If code$ = "501"
error$ = "Email sender not specified (or invalid address)"
Else
error$ = response$+" FAILED: Expecting 250"
EndIf
Goto abortSMTP
EndIf
; ---------------------------------------------------------------------
; Tell server who it's going to
; ---------------------------------------------------------------------
debuglog2 "SENDING: RCPT TO: <" + mailto$ + ">",2
WriteLine t, "RCPT TO: <" + mailto$ + ">"
response$ = ReadLine (t)
code$ = Code (response$)
If code$ <> "250"
If code$ = "501"
error$ = "Email recipient not specified (or invalid address)"
Else
error$ = response$+" FAILED: Expecting 250"
EndIf
Goto abortSMTP
EndIf
; ---------------------------------------------------------------------
; Email data
; ---------------------------------------------------------------------
debuglog2 "SENDING: DATA",2
WriteLine t, "DATA"
response$ = ReadLine (t)
If Code (response$) <> "354"
error$ = response$+" FAILED: Expecting 345"
Goto abortSMTP
EndIf
; ---------------------------------------------------------------------
; Headers
; ---------------------------------------------------------------------
WriteLine t,"MIME-Version: 1.0"
WriteLine t, "Date: " + CurrentDate$ ()
WriteLine t, "From: " + mailfrom$ + " <" + myemailaddress$ + ">"
WriteLine t, "To: " + mailto$ + " <" + mailto$ + ">"
WriteLine t, "Subject: " + subject$
WriteLine t, "X-Mailer: " + mailer$
; ---------------------------------------------------------------------
; Email message
; ---------------------------------------------------------------------
debuglog2 "Sending Message Contents",2
WriteLine t,"Content-Type: multipart/mixed; boundary="+Chr$ (34)+"boundarystring"+Chr$(34)
WriteLine t,""
WriteLine t,"--boundarystring"
WriteLine t,"Content-Type: text/plain"
mess=OpenFile (message$)
If mess
While Not Eof (mess)
mbyte=ReadByte (mess)
If mbyte=Asc ("#")
Select ReadByte(mess)
Case Asc ("1")
WriteString t,mailto$
Case Asc ("2")
WriteString t,mailname$
End Select
Else
WriteByte t,mbyte
EndIf
Wend
CloseFile (mess)
EndIf
encode_file (attachpath$,attachment$,t)
WriteLine t,""
WriteLine t,"--boundarystring--"
debuglog2 ""
debuglog2 "--boundarystring--",2
; ---------------------------------------------------------------------
; End of message
; ---------------------------------------------------------------------
WriteLine t, ""
WriteLine t, "."
response$ = ReadLine (t)
If Code (response$) <> "250"
error$ = response$
EndIf
; ---------------------------------------------------------------------
; Say "ciao"
; ---------------------------------------------------------------------
WriteLine t, "QUIT"
response$ = ReadLine (t)
If Code (response$) <> "221"
error$ = response$
EndIf
; ---------------------------------------------------------------------
; Return error message, if any
; ---------------------------------------------------------------------
.abortSMTP
CloseTCPStream t
If error$ = "" Then error$ = "Timeout error"
debuglog2 error$,2
Return error$
Else
; ---------------------------------------------------------------------
; Oops. Forgot to go online (or server isn't there)
; ---------------------------------------------------------------------
debuglog2 "Failed to connect to server at " + mymailserver$,22
Return error$
EndIf
End Function
; -----------------------------------------------------------------------------
; Ask server for help (usually list of commands)... not much use, just example
; -----------------------------------------------------------------------------
Function GetHelp (server$)
t = OpenTCPStream (mymailserver$, mymailserverport)
If t
ReadLine (t) ; 220
WriteLine t, "HELO BlitzMail Deluxe"
ReadLine (t) ; 250
WriteLine t, "HELP"
response$ = ReadLine (t)
error$ = Left (response$, 3)
If error$ = "214"
help$ = response$
Repeat
readhelp$ = ReadLine (t)
help$ = help$ + Chr (10) + readhelp$
Until readhelp$ = ""
RuntimeError help$
Else
RuntimeError "Couldn't get help information!"
EndIf
CloseTCPStream (t)
EndIf
End Function
; -----------------------------------------------------------------------------
; Return 3 digit code from server's response
; -----------------------------------------------------------------------------
Function Code$ (code$)
If debugSMTP
debuglog2 "COMPUTER SAYS:"+code$,1
EndIf
Return Left (code$, 3)
End Function
Function encode_file (path$,name$,stream)
debuglog2 "Encoding file attachment...",2
file=OpenFile (path$+name$)
If file
;Info
WriteLine stream,""
WriteLine stream,"--boundarystring"
WriteLine stream,"Content-Type: application/octet-stream; name="+name$
WriteLine stream,"Content-Transfer-Encoding: base64"
WriteLine stream,"Content-Disposition: attachment; filename="+name$
WriteLine stream,""
debuglog2 "--boundarystring" ,2
debuglog2 "Content-Type: application/octet-stream; name="+name$,2
debuglog2 "Content-Transfer-Encoding: base64",2
debuglog2 "Content-Disposition: attachment; filename="+name$ ,2
debuglog2 "",2
debuglog2 "(encoded file contents not displayed)",2
linelen=0
While Not Eof (file)
;Fetch 3 bytes
value=ReadByte (file)
value=(value Shl 8) Or ReadByte (file)
value=(value Shl 8) Or ReadByte (file)
;spit out 4 bytes (encoded)
WriteByte stream,Asc(Mid$ (encodestring$,1+ ( (value Shr 18) And 63) ) )
WriteByte stream,Asc(Mid$ (encodestring$,1+ ( (value Shr 12) And 63) ) )
WriteByte stream,Asc(Mid$ (encodestring$,1+ ( (value Shr 06) And 63) ) )
WriteByte stream,Asc(Mid$ (encodestring$,1+ ( (value Shr 00) And 63) ) )
;new line every 64 chars
linelen=linelen+4
If linelen>63
WriteLine stream,""
linelen=0
EndIf
Wend
CloseFile (file)
Else
debuglog2 "File not found",2
EndIf
End Function
Function debuglog2 (message$,col=0)
If col>0 And debug_enable>0
Select col
Case 1
Color 255,255,0
Case 2
Color 255,0,255
Case 3
Color 255,0,0
End Select
Print message$
Print
EndIf
If debug_file
WriteLine debug_file,message$
DebugLog (message$)
EndIf
End Function
|
| ||
| Just for a bit of variety (it's very old and therefore not well written)... Usage example (you'll need to supply your own HTML message and attachment ZIP)... |
| ||
| I've tried both of these had some trouble with both actually. It could be my lack of internet techical knowledge. I got the one in the archive from Oricle(I think is the name) and that sent the mail, but didn't send the body text, or the file attachment correctly. Sucks, I got my game totally prepped for e-mail games, and I can't seem to get the darn e-mail to work!! :-( |
| ||
| Try this... MIME Mail ~22kB |
| ||
| @Squatting Neville, just tested: real cool and simple to use. Should be in the code archives... Thank you for this fine piece of cake. --------------------------------- http://www.moonworx.de |
| ||
| I tried that one, it keeps giving me this error, "malformed auth code". Any idea what this is? |
| ||
| @lo-tekk, I'm glad you can find a use for it. I haven't put it in the archive because, it's pretty messy in places and, as Craig is finding out, it hasn't been tested on many servers so it's a bit flakey. :o) @Craig, Hmmm...Did you try adding your account username and password to 'send_mail$()'? Try this version of send_mail$() and post (or mail me, if uou prefer) the debuglog output...Remember to remove any personal details first! ;o) |
| ||
| Yeehaa, that's worked!! Thanks a lot!! |