I've decided that I don't have the time or inclination to deal with CSS and
responsiveness hell that requires me to learn in order to maintain a plain
HTML page.
So now, thanks to Enzo, I'm now using
this framework that only requires me to write markdown files and it
does the rest for me.
I've got a security camera, it's kind of old and limited in the amount of
features it has. I recently installed it on my front yard, and I wanted a
motion detection alert. This camera actually supports that feature, but it
has one problem:
The alerts can only be sent via mail.
Camera config page
Now, this wouldn't be an issue if I actually paid attention to mails as soon
as they come, but I don't, I relay them to a RSS feed and I do not read it
until I log on to the internet and start browsing the feed.
Possible solutions
If recieving mails is not the most convenient thing to do, another way to get
notifications that I know i'll be reading them as soon as they come is a
telegram bot, this is easy since the API is pretty simple and it could be
simplified to sending a single HTTP request.
In order to achieve this, the first thing that it occurred to me was mounting
a full SMTP server and somehow hook a curl command in there when it detects
that an email is coming from the camera.
But then I realized it wasn't necessary, since if I could simply emulate a
SMTP server, then I would receive the data directly and handle it as I wish.
Emulating a SMTP server
So I opened up the RFC 5321
to see what were the standard steps in the communication for receiving an email.
And SMTP lives up to its name since it is extremely simple.
Basically it comes down to this:
Send a greeting message with 220 code identifying ourselves
Get a EHLO command with the client's identity
Reply with 250 OK
Get a MAIL command with the mail's sender
Reply with 250 OK
Get a RCPT command with the mail's reciever
Reply with 250 OK
Get a DATA command
Reply with 354 telling the client to start sending the data
Get the data, ending with a CRLF.CRLF
Reply with 250 OK
Get a QUIT command
Reply with 221 Bye
Since all of this is just text, I can test a mail send directly
by typing in netcat:
The content of the mails is in MIME, so in the motion detection mails with the
attachments are just text encoded in base64.
Implementation
I wrote a short nodejs program, you can check the full source code
here. It all comes
down to emulating the same communication described above, parsing the
attachments and send them to a telegram bot or any other service you'd want.
A screenshot of the telegram bot sending me a photo everytime someone passes on the street, while Tiburcio rests
Further things
I've discovered that the mail sending feature only supports sending photos
when the motion detection happens. So it would be nice to instead have a
full video of the detection.
According to the
camera manual,
this would be possible if instead the file got recorded with a FTP server.
So I think it would be more or less the same procedure I did with this
but with the FTP protocol.