Merged the 2 script files and remove the original.

This commit is contained in:
Relintai 2023-09-18 11:56:52 +02:00
parent 6196840ca9
commit 89b428bea0
2 changed files with 19 additions and 307 deletions

View File

@ -1,292 +0,0 @@
extends Node
###########################################################
#
# ExtraSimple SMTP client
#
# 1 - import in your project
# 2 - put values in var server, user, password,
# mailto, mymail
# 3 - call method Deliver(data) to send mail
#
###########################################################
###########################################################
#
#
# d: inner class for simple debug - begin
#
#
###########################################################
class d:
var debug = true
func display(data):
if debug == true:
prints ("debug:",data)
###########################################################
#
#
# d: inner class for simple debug - end
#
#
###########################################################
export var server = "smtp.xxx.com"
export var port = 25
export var user = "" # put userid for SMTP login
export var password = "" # put password for SMTP login
export var mymailto = "" # put destination address
export var mymail = "" # put mail associated to userid/password
###########################################################
#
# signals
#
###########################################################
signal SMTP_connecting
signal SMTP_connected
signal SMTP_working
signal SMTP_disconnected_error
signal SMTP_disconnected_ok
###########################################################
#
# method used to connect
#
###########################################################
enum channel {TCP,PACKET}
export (channel) var com = PACKET
###########################################################
#
# storage area
#
###########################################################
var authloginbase64=""
var authpassbase64=""
var Socket = null
var PacketSocket = null
var PacketIn = ""
var PacketOut = ""
enum esi {OK,KO} # i like that one!
enum stati {OK,WAITING,NO_RESPONSE,UNHANDLED_REPONSE}
export (stati) var stato
var MaxRetries = 5
var delayTime = 250
var thread = null
func _ready():
if user != "": authloginbase64=Marshalls.raw_to_base64(user.to_ascii())
if password != "": authpassbase64=Marshalls.raw_to_base64(password.to_ascii())
func _process(delta):
pass
func Deliver(data):
thread = Thread.new()
thread.start(self,"ThreadDeliver",data)
func ThreadDeliver(data):
var r_code
emit_signal("SMTP_connecting")
r_code = OpenSocket()
if r_code == OK:
r_code =WaitAnswer()
if r_code == OK:
emit_signal("SMTP_connected")
r_code = send("ciao") # needed because some SMTP servers return error each first command
if r_code == OK:
r_code = MAILhello()
if r_code == OK:
emit_signal("SMTP_working")
r_code = MAILauth()
if r_code == OK:
r_code = MAILfrom(mymail)
if r_code == OK:
r_code = MAILto(mymailto)
if r_code == OK:
r_code = MAILdata(data,mymail,"comanda per sagra")
if r_code == OK:
d.display("process OK")
if r_code == OK:
r_code =MAILquit()
CloseSocket()
if r_code == OK:
emit_signal("SMTP_disconnected_ok")
else:
emit_signal("SMTP_disconnected_error")
d.display("ERROR")
return r_code
func OpenSocket():
var error
if Socket == null:
Socket=StreamPeerTCP.new()
error=Socket.connect_to_host(server,port)
d.display(["connecting server...",server,error])
if error > 0:
var ip=IP.resolve_hostname(server)
error=Socket.connect_to_host(ip,port)
d.display(["trying IP ...",ip,error])
for i in range(1,MaxRetries):
if Socket.get_status() == Socket.STATUS_ERROR:
d.display("Error while requesting connection")
break
elif Socket.get_status() == Socket.STATUS_CONNECTING:
d.display("connecting...")
break
elif Socket.get_status() == Socket.STATUS_CONNECTED:
d.display("connection up")
break
else:
OS.delay_msec(delayTime)
if com == PACKET:
if PacketSocket == null:
PacketSocket=PacketPeerStream.new()
PacketSocket.set_stream_peer(Socket)
return error
func CloseSocket():
Socket.disconnect_from_host()
func send(data1,data2=null,data3=null):
var error
error = sendOnly(data1,data2,data3)
return error
func sendOnly(data1,data2=null,data3=null):
var error = 0
PacketOut = data1
if data2 != null:
PacketOut = PacketOut + " " + data2
if data3 != null:
PacketOut = PacketOut + " " + data3
d.display(["send",PacketOut])
PacketOut = PacketOut + "\n"
if com == PACKET:
error=PacketSocket.put_packet(PacketOut.to_ascii())
elif com == TCP:
error=Socket.put_data(PacketOut.to_ascii())
if error == null:
error = "NULL"
d.display(["send","r_code",error])
return error
func WaitAnswer(succesful=""):
stato=WAITING
d.display(["waiting response from server..."])
if com == PACKET:
OS.delay_msec(delayTime)
for i in range(1,MaxRetries):
d.display(["bytes buffered",String(PacketSocket.get_available_packet_count()),"error",String(Socket.get_packet_error())])
if PacketSocket.get_available_packet_count() > 0:
PacketIn=PacketSocket.get_var()
d.display(["receive",PacketIn])
stato=OK
break
else:
d.display(["waiting response from server...",i])
OS.delay_msec(delayTime)
if stato==WAITING:
stato = NO_RESPONSE
else:
if ParsePacketIn(succesful) != OK:
stato=UNHANDLED_REPONSE
return stato
elif com == TCP:
PacketIn = ""
OS.delay_msec(delayTime)
for i in range(1,MaxRetries):
var bufLen =Socket.get_available_bytes()
if bufLen > 0:
d.display(["bytes buffered",String(bufLen)])
PacketIn=PacketIn + Socket.get_utf8_string(bufLen)
d.display(["receive",PacketIn])
break
else:
OS.delay_msec(delayTime)
if PacketIn != "":
stato=OK
if ParsePacketIn(succesful) != OK:
stato=UNHANDLED_REPONSE
else:
stato = NO_RESPONSE
return stato
else:
return 99
func ParsePacketIn(strcompare):
if strcompare == "":
return OK
if PacketIn.left(strcompare.length())==strcompare:
return OK
else:
return KO
func MAILhello():
var r_code=send("HELO", mymail)
WaitAnswer()
r_code= send("EHLO", mymail)
r_code= WaitAnswer("250")
return r_code
func MAILauth():
var r_code=send("AUTH LOGIN")
r_code=WaitAnswer("334")
if r_code == OK:
r_code=send(authloginbase64)
r_code = WaitAnswer("334")
if r_code == OK:
r_code=send(authpassbase64)
r_code = WaitAnswer("235")
d.display(["r_code auth:",r_code])
return r_code
func MAILfrom(data):
var r_code=send("MAIL FROM:",bracket(data))
r_code = WaitAnswer("250")
return r_code
func MAILto(data):
var r_code=send("RCPT TO:",bracket(data))
r_code = WaitAnswer("250")
return r_code
func MAILdata(data=null,from=null,subject=null):
var corpo = ""
for i in data:
corpo = corpo + i + "\r\n"
corpo=corpo + "."
var r_code=send("DATA") #,bracket(data))
r_code=WaitAnswer("354")
if r_code == OK and from != null:
r_code=send("FROM: ",bracket(from))
if r_code == OK and subject != null:
r_code=send("SUBJECT: ",subject)
if r_code == OK and data != null:
r_code=send(corpo)
WaitAnswer("250")
return r_code
func MAILquit():
return send("QUIT")
func bracket(data):
return "<"+data+">"

View File

@ -6,8 +6,8 @@ extends Node
# the debug function is quite smart. # the debug function is quite smart.
var debug = true var debug = true
func display(data): func display(data):
if debug == true: if debug == true:
print("debug: ",data) print("debug: ",data)
export var server = "smtp.gmail.com" # you'll find info on the Gmail SMTP server at www.google.com :) export var server = "smtp.gmail.com" # you'll find info on the Gmail SMTP server at www.google.com :)
export var port = 465 # standard SSL port export var port = 465 # standard SSL port
@ -56,6 +56,9 @@ func ThreadDeliver(data):
r_code = OpenSocket() r_code = OpenSocket()
if r_code == OK: if r_code == OK:
r_code =WaitAnswer() r_code =WaitAnswer()
# if r_code == OK:
# emit_signal("SMTP_connected")
# r_code = send("ciao") # needed because some SMTP servers return error each first command
if r_code == OK: if r_code == OK:
r_code = MAILhello() r_code = MAILhello()
if r_code == OK: if r_code == OK:
@ -105,11 +108,20 @@ func OpenSocket():
for i in range(1,MaxRetries): for i in range(1,MaxRetries):
print(Socket.get_status()) print(Socket.get_status())
# if Socket.get_status() == Socket.STATUS_ERROR:
# d.display("Error while requesting connection")
# break
# elif Socket.get_status() == Socket.STATUS_CONNECTING:
# d.display("connecting...")
# break
if Socket.get_status() == Socket.STATUS_CONNECTED: if Socket.get_status() == Socket.STATUS_CONNECTED:
display("connection up") display("connection up")
break break
OS.delay_msec(delayTime) OS.delay_msec(delayTime)
return error return error
func CloseSocket(): func CloseSocket():
@ -185,7 +197,7 @@ func MAILauth():
r_code=WaitAnswer("334") r_code=WaitAnswer("334")
#print("MAILauth() , AUTH LOGIN ", r_code) #print("MAILauth() , AUTH LOGIN ", r_code)
# when debugging, add print statements everywhere you fail to progress. # when debugging, add print statements everywhere you fail to progress.
if r_code == OK: if r_code == OK:
r_code=send(authloginbase64) r_code=send(authloginbase64)
@ -198,7 +210,6 @@ func MAILauth():
display(["r_code auth:", r_code]) display(["r_code auth:", r_code])
return r_code return r_code
func MAILfrom(data): func MAILfrom(data):
var r_code=send("MAIL FROM:",bracket(data)) var r_code=send("MAIL FROM:",bracket(data))
r_code = WaitAnswer("250") r_code = WaitAnswer("250")
@ -209,19 +220,18 @@ func MAILto(data):
r_code = WaitAnswer("250") r_code = WaitAnswer("250")
return r_code return r_code
var corpo = "Hello World!"
var subject = "New message from Godot" var subject = "New message from Godot"
func MAILdata(data=null,from=null,subject=null): func MAILdata(data=null,from=null,subject=null):
var corpo = ""
print(corpo)
for i in data: for i in data:
corpo = corpo + i + "\r\n" corpo = corpo + i + "\r\n"
corpo=corpo + "."
var r_code=send("DATA") var r_code=send("DATA")
r_code=WaitAnswer("354") r_code=WaitAnswer("354")
# if r_code == OK and from != null:
# r_code=send("FROM: ",bracket(from))
if r_code == OK and subject != null: if r_code == OK and subject != null:
r_code=send("SUBJECT: ",subject) r_code=send("SUBJECT: ",subject)
if r_code == OK and data != null: if r_code == OK and data != null:
@ -234,9 +244,3 @@ func MAILquit():
func bracket(data): func bracket(data):
return "<"+data+">" return "<"+data+">"
func _on_Button_pressed() -> void:
Deliver(".. ")
# I still haven't figured out how to send a message without an extra dot at the end of the message