mirror of
https://github.com/Relintai/smtp_node.git
synced 2024-12-19 22:16:56 +01:00
Merged the 2 script files and remove the original.
This commit is contained in:
parent
6196840ca9
commit
89b428bea0
292
Original-code.gd
292
Original-code.gd
@ -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+">"
|
|
@ -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:
|
||||||
@ -106,10 +109,19 @@ 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():
|
||||||
@ -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
|
|
||||||
|
Loading…
Reference in New Issue
Block a user