NodeMCU timeout when using while loop
<p>I have a Lua script that sends an email to myself via SMTP.  Everything works fine when uploading to the NodeMCU and saying <code>dofile("sendemail.lua")</code>.  </p>

<pre><code>-- sendmail.lua    

-- The email and password from the account you want to send emails from
    MY_EMAIL = "REDACTED"

EMAIL_PASSWORD = "REDACTED"

-- The SMTP server and port of your email provider.
-- If you don't know it google [my email provider] SMTP settings
SMTP_SERVER = "isp.smtp.server"
SMTP_PORT = 25

-- The account you want to send email to
mail_to = "REDACTED"

-- Your access point's SSID and password
SSID = "REDACTED"
SSID_PASSWORD = "REDACTED"

-- configure ESP as a station
wifi.setmode(wifi.STATION)
wifi.sta.config(SSID,SSID_PASSWORD)
wifi.sta.autoconnect(1)

email_subject = ""
email_body = ""
count = 0


local smtp_socket = nil -- will be used as socket to email server

-- The display() function will be used to print the SMTP server's response
function display(sck,response)
     print(response)
end

-- The do_next() function is used to send the SMTP commands to the SMTP server in the required sequence.
-- I was going to use socket callbacks but the code would not run callbacks after the first 3.
function do_next()
            if(count == 0)then
                count = count+1
                IP_ADDRESS = wifi.sta.getip()
                smtp_socket:send("HELO "..IP_ADDRESS.."\r\n")
            elseif(count==1) then
                count = count+1
                smtp_socket:send("AUTH LOGIN\r\n")
            elseif(count == 2) then
                count = count + 1
                smtp_socket:send("REDACTED".."\r\n")
            elseif(count == 3) then
                count = count + 1
                smtp_socket:send("REDACTED".."\r\n")
            elseif(count==4) then
                count = count+1
               smtp_socket:send("MAIL FROM:&lt;" .. MY_EMAIL .. "&gt;\r\n")
            elseif(count==5) then
                count = count+1
               smtp_socket:send("RCPT TO:&lt;" .. mail_to .."&gt;\r\n")
            elseif(count==6) then
                count = count+1
               smtp_socket:send("DATA\r\n")
            elseif(count==7) then
                count = count+1
                local message = string.gsub(
                "From: \"".. MY_EMAIL .."\"&lt;"..MY_EMAIL.."&gt;\r\n" ..
                "To: \"".. mail_to .. "\"&lt;".. mail_to.."&gt;\r\n"..
                "Subject: ".. email_subject .. "\r\n\r\n"  ..
                email_body,"\r\n.\r\n","")

                smtp_socket:send(message.."\r\n.\r\n")
            elseif(count==8) then
               count = count+1
                 tmr.stop(0)
                 smtp_socket:send("QUIT\r\n")
                 print("msg sent")
            else
               smtp_socket:close()
            end
            print(count)
end

-- The connectted() function is executed when the SMTP socket is connected to the SMTP server.
-- This function will create a timer to call the do_next function which will send the SMTP commands
-- in sequence, one by one, every 5000 seconds. 
-- You can change the time to be smaller if that works for you, I used 5000ms just because.
function connected(sck)
    tmr.alarm(0,5000,1,do_next)
end

-- @name send_email
-- @description Will initiated a socket connection to the SMTP server and trigger the connected() function
-- @param subject The email's subject
-- @param body The email's body
function send_email(subject,body)

     count = 0
     email_subject = subject
     email_body = body
     smtp_socket = net.createConnection(net.TCP,0)
     smtp_socket:on("connection",connected)
     smtp_socket:on("receive",display)
    smtp_socket:connect(SMTP_PORT, SMTP_SERVER)     
end
-- Send an email
send_email("ESP8266", "[[Hi, How are your IoT projects coming along? Best Wishes,ESP8266]]")
</code></pre>

<p>However, I want to use a loop to monitor an analog input value and only send the email when certain analog input values are detected.  Therefore, I added this code at the end of the script, after the <code>sendemail()</code> function definition and  immediately before the function <code>sendmail('subject', 'body')</code> is called</p>

<pre><code>vp = 0
gpio.mode(vp, gpio.INPUT)

while true do

    local v = adc.read(vp)
    if v &lt; 840 or v &gt; 870 then
        print(v)
        break
    end
    tmr.wdclr()
end
sendmail('subject', 'body')
</code></pre>

<p>The while loop works perfectly, waiting indefinitely for input from the analog pin.  Once that input is found, it breaks correctly and calls the sendmail function.  However, once that function is called, NodeMCU eventually resets.  Sometimes it will get as far as successfully authenticating the SMTP credentials with the server, and sometimes it will not even make the HELO before it shuts down.  What could possibly be causing this?  Why would the <code>sendmail.lua</code> script work fine then suddenly decide not to work when adding this one small while loop that appears to work perfectly fine on its own?</p>