diff --git a/Original code b/Original code new file mode 100644 index 0000000..a83f0e3 --- /dev/null +++ b/Original code @@ -0,0 +1,292 @@ +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+">"