From 53551d573ea4a11ec71740715f54f168e4ed9468 Mon Sep 17 00:00:00 2001 From: gandy92 <> Date: Thu, 28 Jan 2016 11:28:30 +0000 Subject: [PATCH] 76_MSGMail: move email delivery from MSGMail_set to MSGMail_send to be usable from perl; use Blocking_Call to deliver email git-svn-id: https://svn.fhem.de/fhem/trunk@10648 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 2 + fhem/FHEM/76_MSGMail.pm | 134 ++++++++++++++++++++++++++-------------- 2 files changed, 89 insertions(+), 47 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index f46b5a06f..095ad2d61 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,7 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - change: 76_MSGMail: move email delivery from MSGMail_set to MSGMail_send + to be usable from perl; use Blocking_Call to deliver email - change: 55_GDS.pm uses setKeyValue/getKeyValue for user credentials - feature: new module 52_I2C_BME280.pm added (klausw) - bugfix: 52_I2C_PCA9685: bugfix for interaction with FRM diff --git a/fhem/FHEM/76_MSGMail.pm b/fhem/FHEM/76_MSGMail.pm index 430c991ca..e77dbd4a7 100644 --- a/fhem/FHEM/76_MSGMail.pm +++ b/fhem/FHEM/76_MSGMail.pm @@ -4,6 +4,8 @@ # # History: # +# 2016-01-27: Add MSGMail_send() to be used from perl +# Use Blocking_Call to deliver email # 2015-05-19: Add MSGMail_Attr() # 2015-05-15: Add attribute mailtype as suggested by Roger (forum #37206) # 2015-05-11: Improve error logging to assist problem solving @@ -19,6 +21,8 @@ use warnings; use MIME::Lite; use Net::SMTP; # libnet-3.06 has SSL included, so we need to check the version +require 'Blocking.pm'; + my %sets = ( "add" => "MSGMail", "clear" => "MSGMail", @@ -233,31 +237,90 @@ sub MSGMail_Set($@) elsif ($a[0] eq "send") { - # check all required data - my $from = AttrVal($name, "from", ""); - my $to = AttrVal($name, "to", ""); - my $subject = AttrVal($name, "subject", ""); - my $authfile = AttrVal($name, "authfile", ""); - my $smtphost = AttrVal($name, "smtphost", ""); - my $smtpport = AttrVal($name, "smtpport", "465"); # 465 is the default port - my $cc = AttrVal($name, "cc", ""); # Carbon Copy - my $mtype = AttrVal($name, "mailtype", "plain"); + my $mess = ""; + for (my $i = 0 ; $i < ReadingsVal($name, "msgcount", 0) ; $i++) + { + $mess .= $data{$name}{$i}; + } - my $mailtype = "text/plain"; - $mailtype = "text/$mtype" if ($mtype =~ m/^(plain|html)$/); + return MSGMail_send($name, $mess, {}); + } ###> END MSGMail - return "No address specified, use attr $name from " - if (!$from); - return "No address specified, use attr $name to " - if (!$to); - return "No specified, use attr $name subject " - if (!$subject); - return "No specified, use attr $name authfile " - if (!$authfile); - return "No name specified, use attr $name sntphost " - if (!$smtphost); + Log GetLogLevel($name, 2), "messenger set $name $v"; - open(FHEMAUTHFILE, "<" . $authfile) + # set stats + # $hash->{CHANGED}[0] = $v; + $hash->{READINGS}{state}{TIME} = TimeNow(); + $hash->{READINGS}{state}{VAL} = $v; + return undef; +} + +my %MSGMail_params = ( + 'from' => {'attr'=>'from', 'default'=>'', 'required'=>1, 'set'=>1}, + 'to' => {'attr'=>'to', 'default'=>'', 'required'=>1, 'set'=>1}, + 'subject' => {'attr'=>'subject', 'default'=>'', 'required'=>1, 'set'=>1}, + 'cc' => {'attr'=>'cc', 'default'=>'', 'required'=>0, 'set'=>1}, + 'mtype' => {'attr'=>'mtype', 'default'=>'plain', 'required'=>1, 'set'=>1}, + 'authfile' => {'attr'=>'authfile', 'default'=>'', 'required'=>1, 'set'=>0}, + 'smtphost' => {'attr'=>'smtphost', 'default'=>'', 'required'=>1, 'set'=>0}, + 'smtpport' => {'attr'=>'smtpport', 'default'=>'465', 'required'=>1, 'set'=>0}, +); + +sub MSGMail_send($$;$) +{ + my ($name, $msgtext, $extparamref) = @_; + my %params = (); + + return "unknown device $name." unless exists ($defs{$name}); + + foreach my $key (keys %MSGMail_params) + { + $params{$key} = AttrVal($name, $MSGMail_params{$key}->{attr}, $MSGMail_params{$key}->{default}); + $params{$key} = $extparamref->{$key} if (exists $extparamref->{$key} && $MSGMail_params{$key}->{set}); + #Log3 $name, 0, "param $key is now '".$params{$key}."'"; + } + + my $mailtype = "text/plain"; + $mailtype = "text/".$params{mtype} if ($params{mtype} =~ m/^(plain|html)$/); + + $params{mailtype} = $mailtype; + $params{name} = $name; + $params{msgtext} = $msgtext; + + my @err = (); + foreach my $key (keys(%MSGMail_params)) + { + push(@err, $key) if ($MSGMail_params{$key}->{required} && !$params{$key}); + } + return "Missing at least one required parameter or attribue: ".join(', ',@err) if ($#err >= 0); + + BlockingCall("MSGMail_sendInBackground", \%params); + + return ""; +} + +sub MSGMail_error($$$) +{ + my ($name, $msg, $error) = @_; + Log3 $name, 0, "$name: $msg: $error"; + return $error; +} + +sub MSGMail_sendInBackground($) +{ + my ($paref) = @_; + + my $authfile = $paref->{authfile}; + my $name = $paref->{name}; + my $cc = $paref->{cc}; + my $from = $paref->{from}; + my $mailtype = $paref->{mailtype}; + my $smtphost = $paref->{smtphost}; + my $subject = $paref->{subject}; + my $to = $paref->{to}; + my $msgtext = $paref->{msgtext}; + + open(FHEMAUTHFILE, "<" . $authfile) || return "Can not open authfile $authfile: $!"; my @auth = ; close(FHEMAUTHFILE); @@ -265,20 +328,12 @@ sub MSGMail_Set($@) # Log 1, "MSG User = <" . @auth[0] . "> Passwort = <" . @auth[1] . ">"; - # compose message - my $i; - my $mess = ""; - for ($i = 0 ; $i < ReadingsVal($name, "msgcount", 0) ; $i++) - { - $mess .= $data{$name}{$i}; - } - my $mailmsg = MIME::Lite->new( From => $from, To => $to, Subject => $subject, Type => "$mailtype; charset=UTF-8", #'multipart/mixed', # was 'text/plain' - Data => $mess + Data => $msgtext ); # login to the SMTP Host using SSL and send the message @@ -309,22 +364,7 @@ sub MSGMail_Set($@) Log3 $name, 1, "$name: successfully sent email w/ subject '$subject'"; - } ###> END MSGMail - - Log GetLogLevel($name, 2), "messenger set $name $v"; - - # set stats - # $hash->{CHANGED}[0] = $v; - $hash->{READINGS}{state}{TIME} = TimeNow(); - $hash->{READINGS}{state}{VAL} = $v; - return undef; -} - -sub MSGMail_error($$$) -{ - my ($name, $msg, $error) = @_; - Log3 $name, 0, "$name: $msg: $error"; - return $error; + } ##############################################