2013-03-15 10:20:25 +01:00
< ? php
/**
* Name : Mail Stream
* Description : Mail all items coming into your network feed to an email address
2017-01-08 16:20:58 +01:00
* Version : 1.1
2013-03-15 10:20:25 +01:00
* Author : Matthew Exon < http :// mat . exon . name >
*/
2018-02-15 03:43:40 +01:00
use Friendica\Content\Text\BBCode ;
2017-11-07 00:55:24 +01:00
use Friendica\Core\Config ;
2018-12-26 08:28:16 +01:00
use Friendica\Core\Hook ;
2018-01-22 20:03:11 +01:00
use Friendica\Core\L10n ;
2018-10-30 00:40:18 +01:00
use Friendica\Core\Logger ;
2018-10-31 15:55:15 +01:00
use Friendica\Core\Renderer ;
2018-07-21 14:42:08 +02:00
use Friendica\Database\DBA ;
2019-12-16 01:05:14 +01:00
use Friendica\DI ;
2019-10-24 00:25:42 +02:00
use Friendica\Protocol\Activity ;
2018-01-27 14:52:02 +01:00
use Friendica\Util\Network ;
2018-06-17 08:20:47 +02:00
use Friendica\Model\Item ;
2017-11-07 00:55:24 +01:00
2013-03-15 10:20:25 +01:00
function mailstream_install () {
2018-12-26 08:28:16 +01:00
Hook :: register ( 'addon_settings' , 'addon/mailstream/mailstream.php' , 'mailstream_addon_settings' );
Hook :: register ( 'addon_settings_post' , 'addon/mailstream/mailstream.php' , 'mailstream_addon_settings_post' );
Hook :: register ( 'post_local_end' , 'addon/mailstream/mailstream.php' , 'mailstream_post_hook' );
Hook :: register ( 'post_remote_end' , 'addon/mailstream/mailstream.php' , 'mailstream_post_hook' );
Hook :: register ( 'cron' , 'addon/mailstream/mailstream.php' , 'mailstream_cron' );
2013-03-15 10:20:25 +01:00
2017-11-07 00:55:24 +01:00
if ( Config :: get ( 'mailstream' , 'dbversion' ) == '0.1' ) {
2017-01-08 16:18:16 +01:00
q ( 'ALTER TABLE `mailstream_item` DROP INDEX `uid`' );
q ( 'ALTER TABLE `mailstream_item` DROP INDEX `contact-id`' );
q ( 'ALTER TABLE `mailstream_item` DROP INDEX `plink`' );
q ( 'ALTER TABLE `mailstream_item` CHANGE `plink` `uri` char(255) NOT NULL' );
2017-11-07 00:55:24 +01:00
Config :: set ( 'mailstream' , 'dbversion' , '0.2' );
2017-01-08 16:18:16 +01:00
}
2017-11-07 00:55:24 +01:00
if ( Config :: get ( 'mailstream' , 'dbversion' ) == '0.2' ) {
2017-01-08 16:18:16 +01:00
q ( 'DELETE FROM `pconfig` WHERE `cat` = "mailstream" AND `k` = "delay"' );
2017-11-07 00:55:24 +01:00
Config :: set ( 'mailstream' , 'dbversion' , '0.3' );
2017-01-08 16:18:16 +01:00
}
2017-11-07 00:55:24 +01:00
if ( Config :: get ( 'mailstream' , 'dbversion' ) == '0.3' ) {
2017-01-08 16:18:16 +01:00
q ( 'ALTER TABLE `mailstream_item` CHANGE `created` `created` timestamp NOT NULL DEFAULT now()' );
q ( 'ALTER TABLE `mailstream_item` CHANGE `completed` `completed` timestamp NULL DEFAULT NULL' );
2017-11-07 00:55:24 +01:00
Config :: set ( 'mailstream' , 'dbversion' , '0.4' );
2017-01-08 16:18:16 +01:00
}
2017-11-07 00:55:24 +01:00
if ( Config :: get ( 'mailstream' , 'dbversion' ) == '0.4' ) {
2017-01-08 16:18:16 +01:00
q ( 'ALTER TABLE `mailstream_item` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin' );
2017-11-07 00:55:24 +01:00
Config :: set ( 'mailstream' , 'dbversion' , '0.5' );
2017-01-08 16:18:16 +01:00
}
2017-11-07 00:55:24 +01:00
if ( Config :: get ( 'mailstream' , 'dbversion' ) == '0.5' ) {
Config :: set ( 'mailstream' , 'dbversion' , '1.0' );
2017-01-08 16:18:16 +01:00
}
2016-02-02 15:11:13 +01:00
2017-11-07 00:55:24 +01:00
if ( Config :: get ( 'retriever' , 'dbversion' ) != '1.0' ) {
2017-01-08 16:18:16 +01:00
$schema = file_get_contents ( dirname ( __file__ ) . '/database.sql' );
$arr = explode ( ';' , $schema );
foreach ( $arr as $a ) {
$r = q ( $a );
}
2017-11-07 00:55:24 +01:00
Config :: set ( 'mailstream' , 'dbversion' , '1.0' );
2017-01-08 16:18:16 +01:00
}
2013-03-15 10:20:25 +01:00
}
function mailstream_uninstall () {
2018-12-26 08:28:16 +01:00
Hook :: unregister ( 'addon_settings' , 'addon/mailstream/mailstream.php' , 'mailstream_addon_settings' );
Hook :: unregister ( 'addon_settings_post' , 'addon/mailstream/mailstream.php' , 'mailstream_addon_settings_post' );
Hook :: unregister ( 'post_local' , 'addon/mailstream/mailstream.php' , 'mailstream_post_local_hook' );
Hook :: unregister ( 'post_remote' , 'addon/mailstream/mailstream.php' , 'mailstream_post_remote_hook' );
Hook :: unregister ( 'post_local_end' , 'addon/mailstream/mailstream.php' , 'mailstream_post_local_hook' );
Hook :: unregister ( 'post_remote_end' , 'addon/mailstream/mailstream.php' , 'mailstream_post_remote_hook' );
Hook :: unregister ( 'post_local_end' , 'addon/mailstream/mailstream.php' , 'mailstream_post_hook' );
Hook :: unregister ( 'post_remote_end' , 'addon/mailstream/mailstream.php' , 'mailstream_post_hook' );
Hook :: unregister ( 'cron' , 'addon/mailstream/mailstream.php' , 'mailstream_cron' );
Hook :: unregister ( 'incoming_mail' , 'addon/mailstream/mailstream.php' , 'mailstream_incoming_mail' );
2013-03-15 10:20:25 +01:00
}
function mailstream_module () {}
2018-01-20 14:57:41 +01:00
function mailstream_addon_admin ( & $a , & $o ) {
2017-11-07 00:55:24 +01:00
$frommail = Config :: get ( 'mailstream' , 'frommail' );
2018-10-31 15:55:15 +01:00
$template = Renderer :: getMarkupTemplate ( 'admin.tpl' , 'addon/mailstream/' );
2018-01-15 14:15:33 +01:00
$config = [ 'frommail' ,
2020-01-18 20:52:33 +01:00
DI :: l10n () -> t ( 'From Address' ),
2017-01-08 16:18:16 +01:00
$frommail ,
2020-01-18 20:52:33 +01:00
DI :: l10n () -> t ( 'Email address that stream items will appear to be from.' )];
2018-10-31 15:55:15 +01:00
$o .= Renderer :: replaceMacros ( $template , [
2017-01-08 16:18:16 +01:00
'$frommail' => $config ,
2020-01-18 20:52:33 +01:00
'$submit' => DI :: l10n () -> t ( 'Save Settings' )]);
2013-03-15 10:20:25 +01:00
}
2018-01-20 14:57:41 +01:00
function mailstream_addon_admin_post ( $a ) {
2018-11-30 15:11:56 +01:00
if ( ! empty ( $_POST [ 'frommail' ])) {
2017-11-07 00:55:24 +01:00
Config :: set ( 'mailstream' , 'frommail' , $_POST [ 'frommail' ]);
2017-01-08 16:18:16 +01:00
}
2013-03-15 10:20:25 +01:00
}
function mailstream_generate_id ( $a , $uri ) {
2017-01-08 16:18:16 +01:00
// http://www.jwz.org/doc/mid.html
2019-12-30 03:55:10 +01:00
$host = DI :: baseUrl () -> getHostname ();
2017-01-08 16:18:16 +01:00
$resource = hash ( 'md5' , $uri );
$message_id = " < " . $resource . " @ " . $host . " > " ;
2019-09-28 09:41:49 +02:00
Logger :: debug ( 'mailstream: Generated message ID ' . $message_id . ' for URI ' . $uri );
2017-01-08 16:18:16 +01:00
return $message_id ;
2013-03-15 10:20:25 +01:00
}
2016-02-02 15:11:13 +01:00
function mailstream_post_hook ( & $a , & $item ) {
2020-01-18 16:50:56 +01:00
if ( ! DI :: pConfig () -> get ( $item [ 'uid' ], 'mailstream' , 'enabled' )) {
2019-09-28 09:50:49 +02:00
Logger :: debug ( 'mailstream: not enabled for item ' . $item [ 'id' ]);
2017-01-08 16:18:16 +01:00
return ;
}
if ( ! $item [ 'uid' ]) {
2019-09-28 09:50:49 +02:00
Logger :: debug ( 'mailstream: no uid for item ' . $item [ 'id' ]);
2017-01-08 16:18:16 +01:00
return ;
}
if ( ! $item [ 'contact-id' ]) {
2019-09-28 09:50:49 +02:00
Logger :: debug ( 'mailstream: no contact-id for item ' . $item [ 'id' ]);
2017-01-08 16:18:16 +01:00
return ;
}
if ( ! $item [ 'uri' ]) {
2019-09-28 09:50:49 +02:00
Logger :: debug ( 'mailstream: no uri for item ' . $item [ 'id' ]);
return ;
}
if ( ! $item [ 'plink' ]) {
Logger :: debug ( 'mailstream: no plink for item ' . $item [ 'id' ]);
2017-01-08 16:18:16 +01:00
return ;
}
2020-01-18 16:50:56 +01:00
if ( DI :: pConfig () -> get ( $item [ 'uid' ], 'mailstream' , 'nolikes' )) {
2019-10-24 00:25:42 +02:00
if ( $item [ 'verb' ] == Activity :: LIKE ) {
2019-09-28 09:50:49 +02:00
Logger :: debug ( 'mailstream: like item ' . $item [ 'id' ]);
2017-01-08 16:18:16 +01:00
return ;
}
}
2013-04-01 02:32:06 +02:00
2017-01-08 16:18:16 +01:00
$message_id = mailstream_generate_id ( $a , $item [ 'uri' ]);
q ( " INSERT INTO `mailstream_item` (`uid`, `contact-id`, `uri`, `message-id`) " .
" VALUES (%d, '%s', '%s', '%s') " , intval ( $item [ 'uid' ]),
2018-07-21 15:13:02 +02:00
intval ( $item [ 'contact-id' ]), DBA :: escape ( $item [ 'uri' ]), DBA :: escape ( $message_id ));
$r = q ( 'SELECT * FROM `mailstream_item` WHERE `uid` = %d AND `contact-id` = %d AND `uri` = "%s"' , intval ( $item [ 'uid' ]), intval ( $item [ 'contact-id' ]), DBA :: escape ( $item [ 'uri' ]));
2017-01-08 16:18:16 +01:00
if ( count ( $r ) != 1 ) {
2019-09-28 09:41:49 +02:00
Logger :: info ( 'mailstream_post_remote_hook: Unexpected number of items returned from mailstream_item' );
2017-01-08 16:18:16 +01:00
return ;
}
$ms_item = $r [ 0 ];
2019-09-28 09:41:49 +02:00
Logger :: debug ( 'mailstream_post_remote_hook: created mailstream_item ' . $ms_item [ 'id' ] . ' for item ' . $item [ 'uri' ] . ' ' . $item [ 'uid' ] . ' ' . $item [ 'contact-id' ]);
2017-01-08 16:18:16 +01:00
$user = mailstream_get_user ( $item [ 'uid' ]);
if ( ! $user ) {
2019-09-28 09:41:49 +02:00
Logger :: info ( 'mailstream_post_remote_hook: no user ' . $item [ 'uid' ]);
2017-01-08 16:18:16 +01:00
return ;
}
mailstream_send ( $a , $ms_item [ 'message-id' ], $item , $user );
2013-04-01 02:32:06 +02:00
}
function mailstream_get_user ( $uid ) {
2017-01-08 16:18:16 +01:00
$r = q ( 'SELECT * FROM `user` WHERE `uid` = %d' , intval ( $uid ));
if ( count ( $r ) != 1 ) {
2019-09-28 09:41:49 +02:00
Logger :: info ( 'mailstream_post_remote_hook: Unexpected number of users returned' );
2017-01-08 16:18:16 +01:00
return ;
}
return $r [ 0 ];
2013-03-15 10:20:25 +01:00
}
function mailstream_do_images ( $a , & $item , & $attachments ) {
2020-01-18 16:50:56 +01:00
if ( ! DI :: pConfig () -> get ( $item [ 'uid' ], 'mailstream' , 'attachimg' )) {
2017-01-08 16:18:16 +01:00
return ;
}
2018-01-15 14:15:33 +01:00
$attachments = [];
2017-01-08 16:18:16 +01:00
preg_match_all ( " / \ [img \ =([0-9]*)x([0-9]*) \ ](.*?) \ [ \ /img \ ]/ism " , $item [ " body " ], $matches1 );
preg_match_all ( " / \ [img \ ](.*?) \ [ \ /img \ ]/ism " , $item [ " body " ], $matches2 );
2019-09-29 22:07:11 +02:00
preg_match_all ( " / \ [img \ =([^ \ ]]*) \ ]([^[]*) \ [ \ /img \ ]/ism " , $item [ " body " ], $matches3 );
foreach ( array_merge ( $matches1 [ 3 ], $matches2 [ 1 ], $matches3 [ 1 ]) as $url ) {
2019-09-28 09:57:46 +02:00
$components = parse_url ( $url );
2019-09-29 22:22:52 +02:00
if ( ! $components ) {
continue ;
}
2017-01-08 16:18:16 +01:00
$cookiejar = tempnam ( get_temppath (), 'cookiejar-mailstream-' );
2019-06-10 14:34:53 +02:00
$curlResult = Network :: fetchUrlFull ( $url , true , 0 , '' , $cookiejar );
2018-01-15 14:15:33 +01:00
$attachments [ $url ] = [
2019-01-24 04:04:15 +01:00
'data' => $curlResult -> getBody (),
2017-01-08 16:18:16 +01:00
'guid' => hash ( " crc32 " , $url ),
2019-09-28 09:57:46 +02:00
'filename' => basename ( $components [ 'path' ]),
2019-01-24 04:04:15 +01:00
'type' => $curlResult -> getContentType ()
];
2017-01-08 16:18:16 +01:00
if ( strlen ( $attachments [ $url ][ 'data' ])) {
$item [ 'body' ] = str_replace ( $url , 'cid:' . $attachments [ $url ][ 'guid' ], $item [ 'body' ]);
continue ;
}
}
return $attachments ;
2016-02-02 15:11:13 +01:00
}
function mailstream_sender ( $item ) {
2017-01-08 16:18:16 +01:00
$r = q ( 'SELECT * FROM `contact` WHERE `id` = %d' , $item [ 'contact-id' ]);
2018-07-21 14:46:13 +02:00
if ( DBA :: isResult ( $r )) {
2017-01-08 16:18:16 +01:00
$contact = $r [ 0 ];
if ( $contact [ 'name' ] != $item [ 'author-name' ]) {
return $contact [ 'name' ] . ' - ' . $item [ 'author-name' ];
}
}
return $item [ 'author-name' ];
2016-02-02 15:11:13 +01:00
}
function mailstream_decode_subject ( $subject ) {
2018-02-15 03:43:40 +01:00
$html = BBCode :: convert ( $subject );
2017-01-08 16:18:16 +01:00
if ( ! $html ) {
return $subject ;
}
$notags = strip_tags ( $html );
if ( ! $notags ) {
return $subject ;
}
$noentity = html_entity_decode ( $notags );
if ( ! $noentity ) {
return $notags ;
}
$nocodes = preg_replace_callback ( " /(&#[0-9]+;)/ " , function ( $m ) { return mb_convert_encoding ( $m [ 1 ], " UTF-8 " , " HTML-ENTITIES " ); }, $noentity );
if ( ! $nocodes ) {
return $noentity ;
}
$trimmed = trim ( $nocodes );
if ( ! $trimmed ) {
return $nocodes ;
}
return $trimmed ;
2013-03-15 10:20:25 +01:00
}
function mailstream_subject ( $item ) {
2017-01-08 16:18:16 +01:00
if ( $item [ 'title' ]) {
return mailstream_decode_subject ( $item [ 'title' ]);
}
$parent = $item [ 'thr-parent' ];
// Don't look more than 100 levels deep for a subject, in case of loops
for ( $i = 0 ; ( $i < 100 ) && $parent ; $i ++ ) {
2018-06-21 08:23:27 +02:00
$parent_item = Item :: selectFirst ([ 'thr-parent' , 'title' ], [ 'uri' => $parent ]);
2018-07-21 14:46:13 +02:00
if ( ! DBA :: isResult ( $parent_item )) {
2017-01-08 16:18:16 +01:00
break ;
}
2018-06-21 08:23:27 +02:00
if ( $parent_item [ 'thr-parent' ] === $parent ) {
2017-01-08 16:18:16 +01:00
break ;
}
2018-06-21 08:23:27 +02:00
if ( $parent_item [ 'title' ]) {
2020-01-18 20:52:33 +01:00
return DI :: l10n () -> t ( 'Re:' ) . ' ' . mailstream_decode_subject ( $parent_item [ 'title' ]);
2017-01-08 16:18:16 +01:00
}
2018-06-21 08:23:27 +02:00
$parent = $parent_item [ 'thr-parent' ];
2017-01-08 16:18:16 +01:00
}
$r = q ( " SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d " ,
intval ( $item [ 'contact-id' ]), intval ( $item [ 'uid' ]));
$contact = $r [ 0 ];
if ( $contact [ 'network' ] === 'dfrn' ) {
2020-01-18 20:52:33 +01:00
return DI :: l10n () -> t ( " Friendica post " );
2017-01-08 16:18:16 +01:00
}
if ( $contact [ 'network' ] === 'dspr' ) {
2020-01-18 20:52:33 +01:00
return DI :: l10n () -> t ( " Diaspora post " );
2017-01-08 16:18:16 +01:00
}
if ( $contact [ 'network' ] === 'face' ) {
$text = mailstream_decode_subject ( $item [ 'body' ]);
// For some reason these do show up in Facebook
$text = preg_replace ( '/\xA0$/' , '' , $text );
$subject = ( strlen ( $text ) > 150 ) ? ( substr ( $text , 0 , 140 ) . '...' ) : $text ;
return preg_replace ( '/\\s+/' , ' ' , $subject );
}
if ( $contact [ 'network' ] === 'feed' ) {
2020-01-18 20:52:33 +01:00
return DI :: l10n () -> t ( " Feed item " );
2017-01-08 16:18:16 +01:00
}
if ( $contact [ 'network' ] === 'mail' ) {
2020-01-18 20:52:33 +01:00
return DI :: l10n () -> t ( " Email " );
2017-01-08 16:18:16 +01:00
}
2020-01-18 20:52:33 +01:00
return DI :: l10n () -> t ( " Friendica Item " );
2013-03-15 10:20:25 +01:00
}
2019-05-06 04:03:22 +02:00
function mailstream_send ( \Friendica\App $a , $message_id , $item , $user ) {
2017-01-08 16:18:16 +01:00
if ( ! $item [ 'visible' ]) {
return ;
}
if ( ! $message_id ) {
return ;
}
require_once ( dirname ( __file__ ) . '/phpmailer/class.phpmailer.php' );
2018-02-15 04:04:06 +01:00
2018-01-15 14:15:33 +01:00
$attachments = [];
2017-01-08 16:18:16 +01:00
mailstream_do_images ( $a , $item , $attachments );
2017-11-07 00:55:24 +01:00
$frommail = Config :: get ( 'mailstream' , 'frommail' );
2017-01-08 16:18:16 +01:00
if ( $frommail == " " ) {
$frommail = 'friendica@localhost.local' ;
}
2020-01-18 16:50:56 +01:00
$address = DI :: pConfig () -> get ( $item [ 'uid' ], 'mailstream' , 'address' );
2017-01-08 16:18:16 +01:00
if ( ! $address ) {
$address = $user [ 'email' ];
}
$mail = new PHPmailer ;
try {
2018-01-20 14:57:41 +01:00
$mail -> XMailer = 'Friendica Mailstream Addon' ;
2017-01-08 16:18:16 +01:00
$mail -> SetFrom ( $frommail , mailstream_sender ( $item ));
$mail -> AddAddress ( $address , $user [ 'username' ]);
$mail -> MessageID = $message_id ;
$mail -> Subject = mailstream_subject ( $item );
if ( $item [ 'thr-parent' ] != $item [ 'uri' ]) {
$mail -> addCustomHeader ( 'In-Reply-To: ' . mailstream_generate_id ( $a , $item [ 'thr-parent' ]));
}
$mail -> addCustomHeader ( 'X-Friendica-Mailstream-URI: ' . $item [ 'uri' ]);
$mail -> addCustomHeader ( 'X-Friendica-Mailstream-Plink: ' . $item [ 'plink' ]);
$encoding = 'base64' ;
foreach ( $attachments as $url => $image ) {
$mail -> AddStringEmbeddedImage ( $image [ 'data' ], $image [ 'guid' ], $image [ 'filename' ], $encoding , $image [ 'type' ]);
}
$mail -> IsHTML ( true );
$mail -> CharSet = 'utf-8' ;
2018-10-31 15:55:15 +01:00
$template = Renderer :: getMarkupTemplate ( 'mail.tpl' , 'addon/mailstream/' );
2019-09-28 09:58:24 +02:00
$mail -> AltBody = BBCode :: toPlaintext ( $item [ 'body' ]);
2018-02-15 03:43:40 +01:00
$item [ 'body' ] = BBCode :: convert ( $item [ 'body' ]);
2019-12-16 01:05:14 +01:00
$item [ 'url' ] = DI :: baseUrl () -> get () . '/display/' . $item [ 'guid' ];
2018-10-31 15:55:15 +01:00
$mail -> Body = Renderer :: replaceMacros ( $template , [
2020-01-18 20:52:33 +01:00
'$upstream' => DI :: l10n () -> t ( 'Upstream' ),
'$local' => DI :: l10n () -> t ( 'Local' ),
2018-01-15 14:15:33 +01:00
'$item' => $item ]);
2017-01-08 16:18:16 +01:00
mailstream_html_wrap ( $mail -> Body );
if ( ! $mail -> Send ()) {
throw new Exception ( $mail -> ErrorInfo );
}
2019-09-28 09:41:49 +02:00
Logger :: debug ( 'mailstream_send sent message ' . $mail -> MessageID . ' ' . $mail -> Subject );
2017-01-08 16:18:16 +01:00
} catch ( phpmailerException $e ) {
2019-09-28 09:41:49 +02:00
Logger :: debug ( 'mailstream_send PHPMailer exception sending message ' . $message_id . ': ' . $e -> errorMessage ());
2017-01-08 16:18:16 +01:00
} catch ( Exception $e ) {
2019-09-28 09:41:49 +02:00
Logger :: debug ( 'mailstream_send exception sending message ' . $message_id . ': ' . $e -> getMessage ());
2017-01-08 16:18:16 +01:00
}
// In case of failure, still set the item to completed. Otherwise
// we'll just try to send it over and over again and it'll fail
// every time.
2018-07-21 15:13:02 +02:00
q ( 'UPDATE `mailstream_item` SET `completed` = now() WHERE `message-id` = "%s"' , DBA :: escape ( $message_id ));
2016-02-02 15:11:13 +01:00
}
/**
* Email tends to break if you send excessively long lines . To make
* bbcode ' s output suitable for transmission , we try to break things
* up so that lines are about 200 characters .
*/
function mailstream_html_wrap ( & $text )
{
2017-01-08 16:18:16 +01:00
$lines = str_split ( $text , 200 );
for ( $i = 0 ; $i < count ( $lines ); $i ++ ) {
$lines [ $i ] = preg_replace ( '/ /' , " \n " , $lines [ $i ], 1 );
}
$text = implode ( $lines );
2013-03-15 10:20:25 +01:00
}
function mailstream_cron ( $a , $b ) {
2017-01-08 16:18:16 +01:00
// Only process items older than an hour in cron. This is because
// we want to give mailstream_post_remote_hook a fair chance to
// send the email itself before cron jumps in. Only if
// mailstream_post_remote_hook fails for some reason will this get
// used, and in that case it's worth holding off a bit anyway.
2018-06-17 19:21:36 +02:00
$ms_item_ids = q ( " SELECT `mailstream_item`.`message-id`, `mailstream_item`.`uri`, `item`.`id` FROM `mailstream_item` JOIN `item` ON (`mailstream_item`.`uid` = `item`.`uid` AND `mailstream_item`.`uri` = `item`.`uri` AND `mailstream_item`.`contact-id` = `item`.`contact-id`) WHERE `mailstream_item`.`completed` IS NULL AND `mailstream_item`.`created` < DATE_SUB(NOW(), INTERVAL 1 HOUR) AND `item`.`visible` = 1 ORDER BY `mailstream_item`.`created` LIMIT 100 " );
2019-09-28 09:41:49 +02:00
Logger :: debug ( 'mailstream_cron processing ' . count ( $ms_item_ids ) . ' items' );
2017-01-08 16:18:16 +01:00
foreach ( $ms_item_ids as $ms_item_id ) {
if ( ! $ms_item_id [ 'message-id' ] || ! strlen ( $ms_item_id [ 'message-id' ])) {
2019-09-28 09:41:49 +02:00
Logger :: info ( 'mailstream_cron: Item ' . $ms_item_id [ 'id' ] . ' URI ' . $ms_item_id [ 'uri' ] . ' has no message-id' );
2017-01-08 16:18:16 +01:00
}
2018-06-17 19:04:23 +02:00
$item = Item :: selectFirst ([], [ 'id' => $ms_item_id [ 'id' ]]);
2017-01-08 16:18:16 +01:00
$users = q ( " SELECT * FROM `user` WHERE `uid` = %d " , intval ( $item [ 'uid' ]));
$user = $users [ 0 ];
if ( $user && $item ) {
mailstream_send ( $a , $ms_item_id [ 'message-id' ], $item , $user );
}
else {
2019-09-28 09:41:49 +02:00
Logger :: info ( 'mailstream_cron: Unable to find item ' . $ms_item_id [ 'id' ]);
2017-01-08 16:18:16 +01:00
q ( " UPDATE `mailstream_item` SET `completed` = now() WHERE `message-id` = %d " , intval ( $ms_item [ 'message-id' ]));
}
}
mailstream_tidy ();
2013-03-15 10:20:25 +01:00
}
2018-01-20 14:57:41 +01:00
function mailstream_addon_settings ( & $a , & $s ) {
2020-01-18 16:50:56 +01:00
$enabled = DI :: pConfig () -> get ( local_user (), 'mailstream' , 'enabled' );
$address = DI :: pConfig () -> get ( local_user (), 'mailstream' , 'address' );
$nolikes = DI :: pConfig () -> get ( local_user (), 'mailstream' , 'nolikes' );
$attachimg = DI :: pConfig () -> get ( local_user (), 'mailstream' , 'attachimg' );
2018-10-31 15:55:15 +01:00
$template = Renderer :: getMarkupTemplate ( 'settings.tpl' , 'addon/mailstream/' );
$s .= Renderer :: replaceMacros ( $template , [
2018-01-15 14:15:33 +01:00
'$enabled' => [
2017-01-08 16:18:16 +01:00
'mailstream_enabled' ,
2020-01-18 20:52:33 +01:00
DI :: l10n () -> t ( 'Enabled' ),
2018-01-15 14:15:33 +01:00
$enabled ],
'$address' => [
2017-01-08 16:18:16 +01:00
'mailstream_address' ,
2020-01-18 20:52:33 +01:00
DI :: l10n () -> t ( 'Email Address' ),
2017-01-08 16:18:16 +01:00
$address ,
2020-01-18 20:52:33 +01:00
DI :: l10n () -> t ( " Leave blank to use your account email address " )],
2018-01-15 14:15:33 +01:00
'$nolikes' => [
2017-01-08 16:18:16 +01:00
'mailstream_nolikes' ,
2020-01-18 20:52:33 +01:00
DI :: l10n () -> t ( 'Exclude Likes' ),
2017-01-08 16:18:16 +01:00
$nolikes ,
2020-01-18 20:52:33 +01:00
DI :: l10n () -> t ( " Check this to omit mailing \" Like \" notifications " )],
2018-01-15 14:15:33 +01:00
'$attachimg' => [
2017-01-08 16:18:16 +01:00
'mailstream_attachimg' ,
2020-01-18 20:52:33 +01:00
DI :: l10n () -> t ( 'Attach Images' ),
2017-01-08 16:18:16 +01:00
$attachimg ,
2020-01-18 20:52:33 +01:00
DI :: l10n () -> t ( " Download images in posts and attach them to the email. Useful for reading email while offline. " )],
'$title' => DI :: l10n () -> t ( 'Mail Stream Settings' ),
'$submit' => DI :: l10n () -> t ( 'Save Settings' )]);
2013-03-15 10:20:25 +01:00
}
2018-01-20 14:57:41 +01:00
function mailstream_addon_settings_post ( $a , $post ) {
2017-01-08 16:18:16 +01:00
if ( $_POST [ 'mailstream_address' ] != " " ) {
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( local_user (), 'mailstream' , 'address' , $_POST [ 'mailstream_address' ]);
2017-01-08 16:18:16 +01:00
}
else {
2020-01-18 16:56:45 +01:00
DI :: pConfig () -> delete ( local_user (), 'mailstream' , 'address' );
2017-01-08 16:18:16 +01:00
}
if ( $_POST [ 'mailstream_nolikes' ]) {
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( local_user (), 'mailstream' , 'nolikes' , $_POST [ 'mailstream_enabled' ]);
2017-01-08 16:18:16 +01:00
}
else {
2020-01-18 16:56:45 +01:00
DI :: pConfig () -> delete ( local_user (), 'mailstream' , 'nolikes' );
2017-01-08 16:18:16 +01:00
}
if ( $_POST [ 'mailstream_enabled' ]) {
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( local_user (), 'mailstream' , 'enabled' , $_POST [ 'mailstream_enabled' ]);
2017-01-08 16:18:16 +01:00
}
else {
2020-01-18 16:56:45 +01:00
DI :: pConfig () -> delete ( local_user (), 'mailstream' , 'enabled' );
2017-01-08 16:18:16 +01:00
}
if ( $_POST [ 'mailstream_attachimg' ]) {
2020-01-18 16:54:49 +01:00
DI :: pConfig () -> set ( local_user (), 'mailstream' , 'attachimg' , $_POST [ 'mailstream_attachimg' ]);
2017-01-08 16:18:16 +01:00
}
else {
2020-01-18 16:56:45 +01:00
DI :: pConfig () -> delete ( local_user (), 'mailstream' , 'attachimg' );
2017-01-08 16:18:16 +01:00
}
2013-03-15 10:20:25 +01:00
}
function mailstream_tidy () {
2017-01-08 16:18:16 +01:00
$r = q ( " SELECT id FROM mailstream_item WHERE completed IS NOT NULL AND completed < DATE_SUB(NOW(), INTERVAL 1 YEAR) " );
foreach ( $r as $rr ) {
q ( 'DELETE FROM mailstream_item WHERE id = %d' , intval ( $rr [ 'id' ]));
}
2019-09-28 09:41:49 +02:00
Logger :: debug ( 'mailstream_tidy: deleted ' . count ( $r ) . ' old items' );
2013-03-15 10:20:25 +01:00
}