Lua : envoyer un courriel avec des images

attachment

Voici une fonction en Lua permettant d’envoyer un courriel avec une ou plusieurs images en pièce jointe à partir de la Vera Lite.
Le message et l’objet peuvent contenir des caractères accentués. L’objet est facultatif.
Les images sont aussi facultatives, cette fonction peut donc être utilisée pour envoyer un simple courriel à la place de celle présentée dans ce billet.
<@_courriel_emetteur>, <@_courriel_destinataire> et <smtp> sont à remplacer par l’adresse électronique et le serveur smtp adéquats.

-- Permet d'envoyer un courriel en passant en paramètres le message, l'objet et des images au format jpeg à attacher en pièces jointes
-- On peut ne donner comme paramètres que (message, objet) voir que (message)
-- message    : le message du courriel (ex : "Voici quelques photos")
-- objet      : l'objet du courriel (ex : "Photos")
-- imagesJPEG : les chemins des images (ex : "/img.jpg" ou encore {"/img1.jpg", "/img2.jpg", "/img3.jpg"} )
function josdEnvoyerCourrielAvecImages(message, objet, imagesJPEG)
  local smtp = require("socket.smtp")
  local mime = require("mime")
  local ltn12 = require("ltn12")
  local emetteur     = "<@_courriel_emetteur>"
  local destinataire = "<@_courriel_destinataire>"
  if (type(objet)=="string") then objet="[Vera]".." "..objet else objet="[Vera]" end
  message="Bonjour, ceci est un courriel envoyé par la VeraLite ("..os.date("%A %B %Y, %H:%M:%S")..
    ")\n\n"..message.."\n\nCordialement, VeraLite"
  local body={}
  body[1] = { headers = { ["content-type"] = "text/plain; charset=utf8" }, body = message }
  if(imagesJPEG~=nil) then
    if(type(imagesJPEG)=="string") then imagesJPEG = { imagesJPEG } end
    for i,v in pairs(imagesJPEG) do
      body[i+1] = { 
        headers = {
          ["content-type"] = 'image/jpeg; name="image'..tostring(i)..'.jpg"',
          ["content-disposition"] = 'attachment; filename="image'..tostring(i)..'.jpg"',
          ["content-description"] = 'Image '..i+1,
          ["content-transfer-encoding"] = "BASE64"
        },
        body = ltn12.source.chain(
          ltn12.source.file(io.open(v, "rb")),
          ltn12.filter.chain(
            mime.encode("base64"),
            mime.wrap()
          )
        )
      }
    end
  end
  local courriel = smtp.message{
    headers = {
      from = emetteur,
      to = destinataire,
      subject = objet
    },
    body=body
  }
  smtp.send{ from=emetteur, rcpt=destinataire, source=courriel, server="<smtp>", port="25" }
end

Attention, capturer des images et les envoyer par courriel peut consommer trop de ressources pour la Vera lite (cf. Vera Lite : Plantage sévère).

Sommaire Domotique sur ce blog

Cette entrée a été publiée dans Domotique, Surveillance and taguée , . Placez un signet sur le permalien.

12 Responses to Lua : envoyer un courriel avec des images

  1. Fred

    Bonjour,
    Tout d’abord, félicitations pour ce blog et la qualité de son contenu.
    Je cherche depuis pas mal de temps une solution via un code lua d’envoyer des photos par mail depuis ma Vera lorsque mon alarme se déclenche.
    Je suis néophyte dans le domaine de la programmation, alors j’avance à tatons, faisant des tests dans le code jusqu’à ce que ça marche…ou pas.
    Et ce jour je suis bloqué, alors je vous demande votre aide, vu vos compétences, je pense que ce sera de la rigolade pour vous.
    Je vous explique, j’ai donc 2 caméras IP, reconnues par la Vera, et elles enregistrent des photos (1 par seconde), sur mon serveur, sur un roulement de 3000 photos. J’ai donc sur mon serveur 50 minutes de photos que je peux via un soft « transformer » en une vidéo.
    Je suis passé par ce système, car je n’ai pas trouvé de moyen pour créer une vidéo qui s’auto écrase…
    Donc ma première question est: est ce possible de faire cela?
    Ensuite, vous l’aurez deviné, je cherche à faire envoyer ces photos, ou cette vidéo par mail en cas de déclenchement de l’alarme.
    Je pourrais donc réduire le temps d’enregistrement à 10 min.
    Idéalement, j’aimerais avoir les 5min avant le déclenchement, et les 5min après.
    Je me bats avec votre code depuis ce matin pour essayer d’envoyer ne serait-ce qu’une photo, mais en vain…
    Je sais que cela représente du temps pour vous de creuser mon problème, alors je vous remercie grandement d’avance si vous pouviez me guider.
    Cordialement,
    Frederic.

    Reply
    • Fred

      Bonjour,
      Merci pour votre réponse,
      J’ai essayé l’envoi simple de mail, dans ma console Vera, la fenêtre « votre message a été envoyé avec succès » apparait, mais lorsque je consulte mes mails, je n’ai rien reçu.
      J’ai fait un test avec mon adresse hotmail, avec comme paramètres:
      server= »smtp.live.com », port= »25″
      Pour être sûr de mon coup, voici mon code:
      — Permet d’envoyer un courriel en passant en paramètre le message et l’objet (facultatif)
      function josdEnvoyerCourriel(message, objet)
      local smtp = require(« socket.smtp »)
      local emetteur = « fepalmytho@hotmail.com »
      local destinataire = « fepalmytho@hotmail.com »
      if (type(objet)== »string ») then objet= »[Vera] ».. » « ..objet else objet= »[Vera] » end
      message= »Bonjour, ceci est un courriel envoyé par la VeraLite (« ..os.date(« %A %B %Y, %H:%M:%S »).. »)\n\n »..message.. »\n\nCordialement, VeraLite »
      local mesgt = {
      headers = {
      to = destinataire,
      from = emetteur,
      subject = objet,
      [« content-type »] = « text/plain; charset=utf8″
      },
      body = message
      }
      smtp.send{ from=emetteur, rcpt=destinataire, source=smtp.message(mesgt), server= »smtp.live.com », port= »25″ }
      end

      j’ai essayé les ports 465 et 587, sans changement.
      Une idée?

      Reply
      • Fred

        J’avance,
        Je n’ai pas réussi à envoyer de mail avec votre script, je dois louper quelque chose…
        Ceci dit, j’arrive à envoyer un mail avec le script suivant:
        — Script envoi e-mail via son serveur smtp lmet 2012 v1.0 —
        —————————————————————-
        local SERVEUR_SMTP = « smtp.free.fr »
        local PORT_SMTP = « 25 »
        local EMETEUR_MAIL = « mon@mail.com »
        local DEST_MAIL = « mon@mail.com »
        local smtp = require(« socket.smtp »)
        local from = EMETEUR_MAIL
        local rcpt = {DEST_MAIL}
        local sujet_mail = « Sujet du message »
        local message_mail = « Texte du message »
        local mesgt = {
        headers = {
        to = DEST_MAIL,
        from = from,
        subject = sujet_mail
        },
        body = message_mail
        }
        local r, e = smtp.send{
        from = from,
        rcpt = rcpt,
        source = smtp.message(mesgt),
        server = SERVEUR_SMTP,
        port = PORT_SMTP
        }

        Il reste à savoir pourquoi en mettant mes paramètres dans votre script ça ne marche pas…
        J’attends avec impatience votre réponse!
        Merci d’avance,
        Fred.

        Reply
        • Laurent Post author

          Bonjour,
          En faisant un copier/coller de votre code (Fred dit : 4 novembre 2014 à 11 h 15 min) et en remplaçant vos email et smtp par les mien cela fonctionne chez moi. Pour tester du code Lua brut (sans luup), ce qui est le cas ici, le plus simple est de le faire directement avec un interpréteur Lua. Je vous conseille d’installer ZeroBrane Studio qui vous facilitera la tâche pour tester du code Lua.
          Pour comprendre pourquoi cela ne fonctionner pas, il faut placer local succes, erreur = devant le smtp.send{ from... afin de capturer l’erreur.
          Pour l’afficher, faire print(succes, erreur) en Lua (avec ZeroBrane par exemple) ou luup.log("succes = "..tostring(succes) .. " ; erreur = " .. tostring(erreur))
          Pour afficher les informations dans les logs de la Vera.

          Reply
          • Fred

            Merci pour votre réactivité,
            Je me suis dit, en cette belle journée de pluie, je vais bien finir par avancer sur mon affaire, mais…en vain.
            Effectivement, le code que je vous ai donné fonctionne très bien chez moi, mais le votre non (je parle du basique, sans envoi de fichiers).
            J’ai installé le soft comme recommandé, mon code fonctionne, mais toujours pas le votre.
            Est-ce que je dois paramétrer quelque chose d’autre que le serveur smpt, le port, et mes deux adresses mails?
            Merci!

  2. Fred

    J’y suis arrivé!
    Alors bien sûr cela vous paraîtra évident, mais j’ai avancé à tatons, et ça a marché.
    J’ai du enlever votre première ligne « function », ainsi que end à la fin.
    J’ai également ajouté en début de code les lignes:
    local imagesJPEG = « C:/Users/Public/etc/.jpg »
    local objet = « Sujet du message »
    local message = « Texte du message »
    J’ai bien reçu le mail, avec la pièce jointe.
    Maintenant, je reste totalement à votre écoute si vous avez une solution pour faire la même chose, mais avec une vidéo.
    Plusieurs étapes seraient nécessaires:
    Dire à la caméra IP de stocker la vidéo sur mon serveur, pour une durée de 5min.(peut être via la vera directement).
    Puis si intrusion (alarme), l’envoyer par mail.
    Il faudrait
    Bien sûr, ma Vera ainsi que mon serveur sont sur un onduleur.
    J’en demande beaucoup!
    Merci encore,
    Fred.

    Reply
    • Laurent Post author

      Je comprends maintenant pourquoi cela ne marchait pas. C’est une fonction !
      On l’appelle en faisant josdEnvoyerCourriel("Mon message", "Mon objet") à chaque fois que l’on veut envoyer un courriel.
      Sinon, je n’ai rien regardé concernant les vidéos (J’utilise une application dédiée).

      Reply
      • Fred

        Bonjour,
        Désolé de ne revenir que si tardivement sur votre blog.
        Merci en tous cas pour vos réponses, et vous avez remarqué que je suis « nul » en prog, n’ayant pas compris « la fonction »…mais bon, en enlevant une ligne par ci par là et en faisant des tests, j’arrive à mes fins sans connaissances! :-)
        Juste au cas où, pourriez vous me citer votre logiciel dédié pour les vidéos?
        Merci encore,
        Fred.

        Reply

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *