[Gelöst] Anzahl neuer E-Mails anzeigen

Begonnen von Bracew, 12 September 2015, 14:35:47

Vorheriges Thema - Nächstes Thema

Bracew

Hallo,

ich würde gerne auf meinem FHEM auf RasPi eine Seite einrichten, auf der für jeden meiner Familie die Anzahl der noch ungelesenen Nachrichten im jeweiligen E-Mail Konto bei verschiedenen Providern angezeigt wird.

Also zum Beispiel:
  Vater   hat 3 ungelesenene Nachrichten bei provider.de
              0 ungelesenene Nachrichten bei t-online.de
  Mutter  hat 2 ungelesene Nachrichten bei gmx.de
  Kind    hat 0 ungelesene Nachrichten bei web.de


Gibt es dazu eine Möglichkeit, einen Beitrag hier im Forum oder gar eine Anleitung?

Danke für Eure Hilfe
Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

CoolTux

Der André hatte da mal ein Modul oder besser hat es bestimmt noch. Schau mal im Forum oder im Wiki.


Gruß
Leon
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Bracew

Hallo CoolTux,

das Modul mailcheck hatte ich mir schon einmal angeschaut. Zunächst hat es nicht funktioniert, da ich
  "Mail::IMAPClient and IO::Socket::SSL and IO::Socket::INET hast to be installed on the FHEM host"
nicht hinbekommen habe.
Darauf hin habe ich versucht alle 26 Seiten Beiträge im Forum http://forum.fhem.de/index.php/topic,14092.0.html nachzulesen um es denoch installiert zu bekommen. Auf Seite 18 hatte ich dann jedoch gelesen:
Zitat
Antwort #261:
Hallo zusammen,

ich würde mir gerne die Anzahl der ungelesenen E-Mail anzeigen lassen. Soweit ich das gesehen habe ist das Modul nicht dafür erstellt worden, oder täusche ich mich da und es ist doch möglich?

Antwort #262
das modul ist nicht dafür gemacht.

jede mail die mailcheck erkannt hat ist danach nicht mehr neu.

so dass ich danach alles wieder rückgängig gemacht bzw. deinstalliert habe, da das Modul nicht dafür gemacht ist ungelesenen E-Mail anzeigen zu lassen (und auch sehr kompliziert für mich erscheint).

In einem Python-Forum unter http://www.python-forum.de/viewtopic.php?f=3&t=24392 habe ich dann eine (relativ einfache) Lösung gefunden, welche zumindestens auf der Kommandozeilen-Ebene (bash) funktioniert. Aber leider kann ich das nicht in FHEM integrieren.

Gruß Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

maxritti

#4
Ist in Perl aber auch nicht weiter schwer  ;)

use Net::IMAP::Simple::SSL;
use Email::Simple;

my $imap = Net::IMAP::Simple::SSL->new('imap.provider.de') ||
   die "Unable to connect to IMAP: $Net::IMAP::Simple::errstr\n";

if(!$imap->login('user','password')){
   print STDERR "Login failed: " . $imap->errstr . "\n";
   exit(64);
}


my ($unseen, $recent, $num_messages) = $imap->status('INBOX');
printf("unseen: $unseen - recent $recent - num_messages $num_messages\n");
$imap->close();
$imap->logout();


Das in eine myUtils ausgelagert und entsprechend Parameter übergeben, dann sollten paar at's ausreichen um Deinen Wunsch zu erfüllen.

Ein paar Module müsstest du dafür aber wieder installieren.

Bracew

Hallo maxritti,

funktioniert das bei Dir?

Wenn ja,
kannst Du das für einen "Dummy" wie mich etwas näher erläutern bzw. verständlich aufbereiten?
Zum Beispiel wie die at's und Module eingerichtet werden.
Wie kann ich das in FHEM Weboberfläche einbinden?
etc.

Gruß Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

maxritti

#6
Klaro, funktioniert das, würde ich sonst nicht schreiben.  8)

Und ich bin ja gar nicht so. :)

Hast Du schon eine 99_myUtils.pm?
Wenn nein, dann schau mal hier:

http://www.fhemwiki.de/wiki/99_myUtils_anlegen

Da baust Du dann diese Funktion ein:

sub CheckMails($$$$) {
  my ($host, $user, $passwd, $dummy) = @_;

  use Net::IMAP::Simple::SSL;
  use Email::Simple;

  Log3 "Mails", 3, "Login to $host";

  my $imap = Net::IMAP::Simple::SSL->new($host) ||
   die "Unable to connect to IMAP: $Net::IMAP::Simple::errstr\n";

  if(!$imap->login($user,$passwd)){
   Log3 "Mailcheck", 3, "Login failed: " . $imap->errstr;
   exit(64);
  }

  my ($unseen, $recent, $num_messages) = $imap->status('INBOX');
  fhem("set $dummy $unseen Messages for $user");   

  $imap->close();
  $imap->logout();
}


Dann im FHEM Web ein paar Dummys erstellen, die letzendlich den Text anzeigen sollen.
Also ein paar mal das hier:

define du_Vater dummy

Dann noch ein passendes at dazu, welches periodisch abfragt:

define at_Vater at +*00:00:30 {CheckMails('imap.provider.de','user','passwd', 'du_Vater')}

Dann sollte das IMAP Konto vom Vater alle 30 Sekunden angefragt werden und im Dummy du_Vater der Text erscheinen.
That's it.

An Modulen musste ich bei mir diese hier installieren.
Hast Du ja bereits bei dem Modul Emailcheck gemacht. Müsstest also wissen, wie das auf dem PI geht.

  • libemail-simple-per
  • libnet-imap-simple-perl
  • libnet-imap-simple-ssl-perl

Bracew

Hallo maxritti,

Super! funktioniert gut! Danke!

Ich habe mir schon vor längerem eine 99_BracewUtils.pm gebastelt. Dort habe ich Deine Funktion eingefügt.

Zu Deiner Frage "An Modulen musste ich bei mir diese hier installieren....Müsstest also wissen, wie das auf dem PI geht." habe ich mit:
   sudo apt-get install libemail-simple-perl libnet-imap-simple-perl libnet-imap-simple-ssl-perl
gemacht (hier zur Vollständigkeit für alle anderen, welche sich wie ich als "Dummy" fühlen).

Ich habe dann zunächst zum Test nur für Vater angelegt, wie Du geschrieben hast.

In Unsorted bekomme ich nun angezeigt:
Zitatdummy
du_Vater
   
1 Messages for MeineEmailAdresse@MeinProvider.de

oder

Zitatdummy
du_Vater
   
0 Messages for MeineEmailAdresse@MeinProvider.de
nachdem Thunderbird die Mails abgeholt hat.

Wie ich das in meine Struktur einsortieren kann, weis ich,
aber wie kann ich es "Schön" anzeigen, also zum Beispiel wie anfangs geschrieben "Vater   hat 3 ungelesenene Nachrichten bei provider.de"?

Leider bekomme ich nun, fürchte ich, das Logfile mit Meldungen wie diese alle 30 Sekunden geflutet:
Zitat2015.09.12 19:05:03 3: Login to imap.MeinProvider.de
2015.09.12 19:05:04 3: at_Vater: 1
Wie kann ich das abschalten?

Gruß Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

maxritti

#8
Die Zeile aus der Funktion rausschmeissen

Log3 "Mails", 3, "Login to $host";

und diese hier nach Deinen Wünschen anpassen.

fhem("set $dummy $unseen Messages for $user");

Wieso das at die 1 zurückgibt, weiss ich ehrlich gesagt gerade auch nicht.

maxritti

Schreib noch hinter die Zeile

$imap->logout();

ein

  return 0;

dann gibt verschwindet auch das "at: 1" aus dem Log.

Bracew

Hallo maxritti,

vielen Dank. Nun ist (fast) alles OK. Funktioniert mit externen Mailprovidern sehr gut.

Nur mit dem Mailserver auf dem RasPi (auf dem auch FHEM läuft) bekomme ich entweder Fehler wie:
Zitat2015.09.12 21:59:16 3: at_Vater_2: Unable to connect to IMAP: connection failed
oder FHEM stürzt komplett ab.

der cfg-Code welchen ich benutze wäre (Mit den Parametern aus Thunderbird, wo sie funktionieren):
define du_Vater_2 dummy
attr du_Vater_2 room E-Mails
attr du_Vater_2 Ungelesene_Mails_Bracew
define at_Vater_2 at +*00:00:30 {CheckMails('192.168.0.20:143','MeinLogin','MeinPassword', 'du_Vater_2')}
attr at_Vater_2 at room hidden


Hast Du noch ein Lösung dafür?

Gruß Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

maxritti

Wieso gibst Du den Port 143 mit an?
Der lokale IMAP kann wohl kein IMAP via SSL?

Ich vermute mal, dass dies das Problem ist.

Veruch mal dies:

In der Funktion noch etwas ändern.
Und Du müsstest dann beim Aufruf angeben, ob SSL oder kein SSL genuzt werden soll.

Ungefähr so:
Aber ich habe das nicht getestet.

sub CheckMails($$$$$) {
  my ($host, $user, $passwd, $dummy, $ssl) = @_;

  use Net::IMAP::Simple::SSL;
  use Net::IMAP::Simple;
  use Email::Simple;

  Log3 "Mails", 3, "Login to $host";

  if ($ssl eq "ssl") {
    my $imap = Net::IMAP::Simple::SSL->new($host) ||
     die "Unable to connect to IMAP: $Net::IMAP::Simple::errstr\n";
  } else {
    my $imap = Net::IMAP::Simple->new($host) ||
     die "Unable to connect to IMAP: $Net::IMAP::Simple::errstr\n";
  }
 
  if(!$imap->login($user,$passwd)){
   Log3 "Mailcheck", 3, "Login failed: " . $imap->errstr;
   exit(64);
  }

  my ($unseen, $recent, $num_messages) = $imap->status('INBOX');
  fhem("set $dummy $unseen Messages for $user");   

  $imap->close();
  $imap->logout();
}


Die at's wären dann so mit SSL:

CheckMails('imap.provider.de','MeinLogin','MeinPassword', 'du_Vater_2', 'ssl')

oder ohne SSL:

CheckMails('192.168.0.20:143','MeinLogin','MeinPassword', 'du_Vater_2', '')

Bracew

Hallo maxritti,

werde ich morgen versuchen.

Aber wieso kommst Du drauf, dass Port 143 IMAP via SSL ist (Auszug aus Wikipedia):
Zitat
STARTTLS

Nach dem Aufbau einer unverschlüsselten Datenverbindung mit dem Server (Port 143) kann mittels des Kommandos STARTTLS eine verschlüsselte Sitzung initiiert werden, so dass alle nachfolgend versendeten Daten über diese Verbindung nur noch verschlüsselt übertragen werden. Diese Protokollerweiterung ist in der neuesten Protokollspezifikation bereits fest vorgesehen.
IMAPS

Bei der Verwendung von IMAPS wird die Verbindung zum Server bereits während des Verbindungsaufbaus durch SSL verschlüsselt. Damit der Server das erkennt, muss ein anderer Port verwendet werden. Dafür wurde der Port 993 reserviert.

Demnach unverschlüsselt =143
            SSL verschlüsselt = 993

Gruß Bracew
FHEM auf Raspberry Pi
für z.B. Lichtsteuerung, Temperaturmessung, Balkonkraftwerk,
Öltankfüllstandsmessung und für Hühnerstall Hühnerklappe

maxritti

Zitat von: Bracew am 12 September 2015, 22:46:06
Aber wieso kommst Du drauf, dass Port 143 IMAP via SSL ist (Auszug aus Wikipedia):
Demnach unverschlüsselt =143
            SSL verschlüsselt = 993
Wo habe ich das denn geschrieben?
Genau das Gegenteil habe ich ja beschrieben.

Die erste Version meiner Funktion macht SSL:

use Net::IMAP::Simple::SSL;

Und mit Deiner Angabe durch Port 143 erzwingst Du ein "normales" IMAP, was halt mit dem SSL Modul für IMAP nicht klappt. Meiner Meinung nach.
Damit dürfte die Funktion gegen die Wand laufen und daher muss da halt noch eine Abfrage rein, ob SSL oder nicht genutzt werden soll.
Das wäre dann die Version 2 der Funktion.

Aber probiere morgen ruhig mal aus und berichte...  :D

maxritti

#14
Moin Bracew,

ich habe es gerade auch mal mit einem lokalen IMAP Server ohne ssl probiert.

Hatte da noch einen Bug in der Funktion.
Aber dies hier klappt bei mir:

sub CheckMails($$$$$) {
  my ($host, $user, $passwd, $dummy, $ssl) = @_;

  use Net::IMAP::Simple::SSL;
  use Net::IMAP::Simple;
  use Email::Simple;

my $imap;
  if ($ssl eq "ssl") {
    $imap = Net::IMAP::Simple::SSL->new($host) ||
     die "Unable to connect to IMAP: $Net::IMAP::Simple::errstr\n";
  } else {
    $imap = Net::IMAP::Simple->new($host) ||
     die "Unable to connect to IMAP: $Net::IMAP::Simple::errstr\n";
  }
 
  if(!$imap->login($user,$passwd)){
   Log3 "Mailcheck", 3, "Login failed: " . $imap->errstr;
   exit(64);
  }

  my ($unseen, $recent, $num_messages) = $imap->status('INBOX');
  fhem("set $dummy $unseen Messages for $user");   

  $imap->close();
  $imap->logout();
  return 0;
}


/EDIT:

So sieht jetzt meine DEF für ein at aus, welches 2 Postfächer abfragt.
Einmal mit ssl und einmal ohne.

+*00:00:30 {CheckMails('imap.provider.de','user','passwd', 'du_gmx', 'ssl'), CheckMails('imap.local.de','localuser','password', 'du_localimap', '')}