neues modul mailcheck

Begonnen von justme1968, 02 August 2013, 19:08:55

Vorheriges Thema - Nächstes Thema

justme1968

@Lichti: im mail subject sind latin1 zeichen eigentlich nicht erlaubt. es ist nur 7bit ascii zulässig. outlook macht das falsch. die meisten mail programme akzeptieren das auch absichtlich oder zufällig.
der mail subject muss encoded werden und um das wieder lesbar zu machen ist MIME:Parser da.

vermutlich könnte man noch einen workaround bauen. aber bis jetzt bist du der einzige mit dem problem :)

@frank: ich habe keine ahnung warum dir zwei mails fehlen. an dem log meldungen sehe ich auch keine differenz von 2. da steht 0 recent, 12 vorhanden und 11 ist die erste  neue. d.h. es fehlt scheinbar eine. komisch.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

frank

#421
Zitat@frank: ich habe keine ahnung warum dir zwei mails fehlen. an dem log meldungen sehe ich auch keine differenz von 2. da steht 0 recent, 12 vorhanden und 11 ist die erste  neue. d.h. es fehlt scheinbar eine. komisch.
soweit ich imap bis jetzt verstehe, passt das schon: 11 ist die erste und 12 wäre die zweite ungelesene mail.

allerdings kommen mail nur in fhem an, wenn, durch idle bedingt, der provider die message für neue mail sendet.
nur durch pollen kommen keine ungelesenen mails in fhem an.

wenn mailcheck die message vom provider verpasst, warum auch immer, sind die mail für fhem wohl verloren. ich denke, dass mein problem vielleicht mit diesem thread https://forum.fhem.de/index.php/topic,36515.0.html vergleichbar ist, da mein fhem seit kurzem auch über wlan mit dem internetrouter verbunden ist und zur fraglichen zeit ebenfalls wlan-probleme beim pi auftraten.

auch wenn jetzt zu den 12 mail eine neue dazu kommt, wird nur die letzte mail geholt, obwohl sogar nach allen ungelesenen gefragt wird.
Read:   * 13 EXISTS
Sending: DONE
Sent 6 bytes
Read:   49 OK IDLE completed
Sending: 51 STATUS INBOX/fhem (UNSEEN)
Sent 31 bytes
Read:   * STATUS INBOX/fhem (UNSEEN 3)
        51 OK STATUS completed
Sending: 52 FETCH 13 BODY.PEEK[HEADER.FIELDS (From)]
Sent 45 bytes
...


mal schauen, ob ich das ein wenig umgebaut bekomme, so dass auch immer alle ungelesenen mail geordert werden. ausserdem wird, eigentlich unnötigerweise, nach "subject" und "from" auch noch zusätzlich die gesammte mail geordert.

edit: ok, die gesammte mail wird doch benötigt, wenn man signaturen checkt.

gruss frank
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

frank

hallo andre,

ich habe mailcheck_poll() erweitert:

hiermit wird bei jedem poll auf ungelesene mail gecheckt. wenn es ungelesene gibt, dann werden von diesen alle infos, wie in mailcheck_Read geholt. anschliessend werden die mail entweder gelöscht oder auf gelesen gesetzt, je nach attribut message_delete.
zum testen kann man beim mail provider einfach die im folder vorhandenen mail auf ungelesen setzen. beim nächsten poll oder über ein get update sind die mail dann (hoffentlich) in fhem.

im prinzip ist es der code aus mailcheck_read. anfang und ende sind etwas verändert und die logausgaben sind etwas "aufgemotzt".
den if-block(accept_from) aus mailcheck_read habe ich allerdings hier nicht drinnen, da ich ihn sowieso nicht testen kann. sollte eigentlich einfach nur an die gekennzeichnete stelle kopiert werden können.

sub
mailcheck_poll($)
{
  my ($hash) = @_;

  RemoveInternalTimer($hash);
  InternalTimer(gettimeofday()+$hash->{INTERVAL}, "mailcheck_poll", $hash, 0);

  my $client = $hash->{CLIENT};
  if( $client && $client->IsConnected && $client->IsAuthenticated ) {
my $name = $hash->{NAME};

# stop idle
    $client->done;

# get list of unseen mail
my $ret = $client->unseen;
my $cnt = @$ret;
# verbose 3 if we have to poll / normaly nothing to do
Log3 $name, ($cnt?3:4), "$name: poll $cnt unseen mail";

# if we have unseen mail we get info for each mail
if($cnt) {
foreach my $resp (@$ret) {
my $from = $client->get_header($resp, "From");
Log3 $name, 4, "$name: mail #$resp from: $from";
if( $from =~ m/<([^>]*)>/ ) {
$from = $1;
}

my $subject = $client->get_header($resp, "Subject");
Log3 $name, 4, "$name: mail #$resp subject: $subject";

my $do_notify = 1;
if( $hash->{HAS_MIME} ) {
my $message = $client->message_string($resp);
Log3 $name, 5, "$name: mail #$resp message: $message";
my $parser = new MIME::Parser;
$parser->tmp_to_core(1);
$parser->output_to_core(1);
my $entity = $parser->parse_data($message);

# todo: copy here the if-block(accept_from) from mailcheck_Read()

$entity->head->decode();
$subject = $entity->head->get('Subject');
chomp( $subject );
Log3 $name, 4, "$name: mail #$resp subject decoded: $subject";

} elsif( my $accept_from = AttrVal($name, "accept_from", "" ) ) {
Log3 $name, 2, "$name: accept_from is set but MIME::Parser is not available";
}

if( $do_notify ) {
readingsBeginUpdate($hash);
readingsBulkUpdate($hash, "From", $from);
readingsBulkUpdate($hash, "Subject", $subject);
readingsEndUpdate($hash, 1);
}

# set \Delete or \Seen flag
if( AttrVal($name, "delete_message", 0) == 1 ) {
$client->delete_message($resp);
Log3 $name, 4, "$name: mail #$resp set to delete";
} else {
$client->set_flag('\Seen',$resp);
Log3 $name, 4, "$name: mail #$resp set to seen";
}
}
# close folder to delete all mail with \Delete flag
$client->close if( AttrVal($name, "delete_message", 0) == 1 );
}

# select folder for getting idle_data again after closing folder, and debug info
$client->select($hash->{Folder});
# start idle again
    $hash->{tag} = $client->idle;
    $hash->{LAST_POLL} = FmtDateTime( gettimeofday() );
  }
}


zusätzlich wäre es eventuell sinnvoll, noch ein reconnect in diese funktion einzubauen,
1. falls "if( $client && $client->IsConnected && $client->IsAuthenticated )" nicht wahr ist, und
2. nach dem pollen, wenn ungelesene mail gefunden wurden.
da hier eigentlich nie ungelesene mail gefunden werden sollten, könnte man so eventuell das "problem" beheben.

falls du das feature einbaust, könntest du eventuell noch eine logausgabe für idle_data in mailcheck_read einbauen. direkt vor dem foreach-block habe ich zum testen/debuggen folgende nützliche zeile:
  Log3 $name, 4, "$name: idle_data: ".join("|",@$ret);
ausserdem hast du in vielen logausgaben kein $name im string. ist das absicht?

gruss frank
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

justme1968

ich schau es mir an sobald ich dazu komme.

inzwischen habe ich mal kurz mit einem 'normalen' cyrus imapd getestet und wenn ich per safari mail eine mail auf ungelesen setze taucht sie sofort wieder in fhem auf.

es scheint also zumindest kein generelles problem zu sein sondern ist vielleicht doch gmx spezifisch.

das mit den log ausgaben ist historisch. da war ich beim umstellen auf Log3 zu faul alles meldungen anzupassen.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

frank

Zitatinzwischen habe ich mal kurz mit einem 'normalen' cyrus imapd getestet und wenn ich per safari mail eine mail auf ungelesen setze taucht sie sofort wieder in fhem auf.
gmx meldet mir über idle beim umschalten auf ungelesen:
2016.09.02 12:40:41.985 4 : gmx_fhem_mailcheck: idle_data: * 7 FETCH (FLAGS ())
hier fehlt das zauberwort: EXISTS, daher kommt dann auch nichts.

die 2 fehlenden mail von neulich waren ja noch als ungelesen im folder. allerdings fehlte wohl schon das \Recent flag. die mail kamen im abstand von 24 stunden bei gmx an. scheinbar eine längere störung.

ich spekuliere derzeit, dass die idle meldung von gmx rausging, aber bei mailcheck nicht ankam.
wie gesagt, hatte mein fhem wlan probleme zu der zeit. auch könnte gmx probleme gehabt haben, keine ahnung. auf jedenfall lagen 2 ungelesene mail im ordner und hatten wohl keine chance mehr zu kommen. es geht bei dem feature auch nicht darum mails zu bekommen, die wieder auf ungelesen geändert werden. ich erhoffe mir dadurch, dass solche über idle-kommunikation "verlorengegangene" mail doch noch ankommen können. sozusagen eine backup option.

ich habe auch häufig den hinweis lesen können, sich nicht ausschliesslich auf idle zu verlassen, sondern zusätzlich eine poll option zu nutzen. auch im RFC 2177 zu imap-idle wird dies empfohlen zb: https://tools.ietf.org/html/rfc2177
ZitatIt also helps some real-time applications based on
IMAP, which might otherwise need to poll extremely often (such as
every few seconds).  (While the spec actually does allow a server to
push EXISTS responses aysynchronously, a client can't expect this
behaviour and must poll
.)

ein hinweis zu meinem problem könnte auch diese zitat aus dem link sein:
ZitatThe server MAY consider a client inactive if it has an IDLE command
   running, and if such a server has an inactivity timeout it MAY log
   the client off implicitly at the end of its timeout period.  Because
   of that, clients using IDLE are advised to terminate the IDLE and
   re-issue it at least every 29 minutes to avoid being logged off.
   This still allows a client to receive immediate mailbox updates even
   though it need only "poll" at half hour intervals.

gruss frank
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

justme1968

das komische ist das eigentlich nicht weiter passieren sollte wenn die nachricht nicht ankommt. das recent flag wird ja nicht automatisch zurück gesetzt sondern erst wenn mailcheck die mail auch tatsächlich gelesen hat.

wegen dem rfc und may und den 29 minuten macht das modul ja auch im idle fall alle 10 minuten ein poll. d.h. es verlässt sich nicht auf das idle. ohne idle ist das intervall mit 1 minute kürzer.

wie gesagt: wenn deine änderung hilft baue ich sie ein. kann nur etwas dauern..

gruss
  andre

hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

frank

Zitat von: justme1968 am 02 September 2016, 15:44:16
kann nur etwas dauern..
lass dir zeit, bei mir ist die änderung ja schon drin. vielleicht kann ich den fehler noch irgendwie provozieren. das kann aber auch noch dauern.

Zitat von: justme1968 am 02 September 2016, 13:57:56
sollte man fehlerzustände nicht so im jeweiligen modul behandeln das es nicht nötig ist selber ins log zu schauen und ein notify darauf zu machen?
ich habe bei mir jetzt schon mal angefangen ein reading "lastError" mit fehlerzuständen zu füttern. sollte poll wirklich unseen messages finden, gibt es jetzt ein event.

gruss frank
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Lichti

Hab mein Problem mit den Umlauten jetzt umgangen:

Da ich die Mails hauptsächlich im Tablet-UI anzeige, habe ich hier ein REPLACE für die Umlaute eingebaut.
Jetzt passt die Darstellung.

frank

Zitat von: justme1968 am 02 September 2016, 15:44:16
wie gesagt: wenn deine änderung hilft baue ich sie ein. kann nur etwas dauern..
das einbauen musst du erstmal vergessen.

bei der nächtlichen internet zwangstrennung macht die funktion komischerweise probleme. als würde sie zufällig immer genau zu dieser zeit aufgerufen werden. wenn die imap funktionen dann einen undefinierten pointer liefern, stürzt fhem sogar ab.

das muss ich bei gelegenheit noch genauer untersuchen.

gruss frank
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

justme1968

die readFn wird auch aufgerufen wenn die verbindung weg ist. normalerweise erkennt man das daran das sysread keine daten liefert. schau mal ob du das an irgendeiner stelle abfangen kannst.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

frank

danke für den hinweis, mal sehen wann ich dazu komme.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

TomLee

Hallo zusammen,

bei der Suche nach einer Lösung die Siri diktierten Notizen ( meine Todo Liste) auch im Ftui anzuzeigen bin ich auf den Beitrag von PNinBB vom  19.Oktober 2015 gestoßen. Er erläutert wie er sich den Betreff mehrerer Mails in einer Readingsgroup anzeigen lässt. Welche sich natürlich wiederum einfach ins Ftui integrieren ließe. Ich hab gelesen das das vom Modul mailcheck abweicht da ja eigentlich nur der letzte ungelesene EmailBetreff als Reading vorhanden ist, doch wusste ich nicht wo ich diesen Betrag schreiben soll.
Die diktierten Notizen sind seit dem Update auf IOS 10. 0.2 innerhalb kürzester Zeit im Ordner (Label) Notes.
Bin kein Programmierer (keine Ahnung von Perl) würde aber gerne versuchen das so umzusetzen.
Wäre jemand bereit mir dabei etwas unter die Arme zu greifen und zu erklären (wenn ich das richtig verstanden habe) wie dieser erwähnte Ringpuffer auszusehen hat?

Habe bei mir die readingsgroup erstellt:




Internals:
   DEF        <Postfach>,<Datum>,<Betreff>
<{myEMails_RBEintragen("pengocheck","Name")}>,<{myEMails_RBEintragen("pengocheck","Datum")}>,<{myEMails_RBEintragen("pengocheck","Betreff")}>
   NAME       rgpengocheck
   NR         343
   NTFY_ORDER 50-Versuch
   STATE      Initialized
   TYPE       readingsGroup
   mayBeVisible 1
   Content:
   Content2:
   DEVICES:
     ARRAY(0x3f712c8)
     ARRAY(0x3d65848)
   Fhem:
     lastDefChange 41
     last_update 1475493162.35901
   Helper:
     DEF
Attributes:
   group      Postfächer
   icon       message_mail
   room       E-Mails
   verbose    5


Im Logfile wird folgendes ausgegeben:
2016.10.03 13:13:06 3: rgpengocheck: <{myEMails_RBEintragen("pengocheck","Name")}>: Undefined subroutine &main::myEMails_RBEintragen called at (eval 21350) line 1.

2016.10.03 13:13:06 3: rgpengocheck: <{myEMails_RBEintragen("pengocheck","Datum")}>: Undefined subroutine &main::myEMails_RBEintragen called at (eval 21351) line 1.

2016.10.03 13:13:06 3: rgpengocheck: <{myEMails_RBEintragen("pengocheck","Betreff")}>: Undefined subroutine &main::myEMails_RBEintragen called at (eval 2


Verstehe das jetzt so das in beispielsweise der 99_ myUtils.pm diese Undefined subroutine definiert werden muss. Und wo kann die Anzahl der Einträge per Parameter ausgewählt. Könnte mir da wer helfen?

Grüße

Thomas

justme1968

in dem beitrag aus dem du die readingsGroup definition hast sollte auch beschrieben sein wie myEMails_RBEintragen funktioniert.

aber unabhängig davon: hast du dir mal readingsHistory angeschaut? damit kann den event verlauf anschauen.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

TomLee

Hallo Andre,

ich danke dir für den Hinweis mit readingshistory, schon sehe ich das erste mal meine Notizen im Ftui ☺, nice. Noch
nachlesen wie man das ganze entsprechend formatiert und obs mittlerweile ne Lösung für das automatische aktualisieren der readingsgroup gibt, dann passt das. Vielen, vielen Dank
Gruß
Thomas

justme1968

ich habe eben eine version eingecheckt die besser mit umlauten im subject von outlook mails klar kommen müsste.

ich hoffe mal es hat keine weiteren seitendefekte.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968