Merge pull request #51 from adamklaff/feedreader

Improved RSS Reader Support
This commit is contained in:
Christian Haschek 2023-08-22 08:20:45 +02:00 committed by GitHub
commit 2cc5156742
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 42 additions and 43 deletions

View file

@ -27,4 +27,4 @@ VOLUME /var/www/opentrashmail/data
EXPOSE 80 25 EXPOSE 80 25
#CMD ["/bin/ash"] #CMD ["/bin/ash"]
ENTRYPOINT ["/etc/start.sh"] ENTRYPOINT ["/etc/start.sh"]

View file

@ -1,102 +1,101 @@
<?php <?php
define('DS', DIRECTORY_SEPARATOR); define('DS', DIRECTORY_SEPARATOR);
define('ROOT', dirname(__FILE__)); define('ROOT', dirname(__FILE__));
define('DOMAIN',$_SERVER['HTTP_HOST']); define('DOMAIN', $_SERVER['HTTP_HOST']);
error_reporting(E_ALL || ~E_NOTICE); error_reporting(E_ALL || ~E_NOTICE);
ini_set('display_errors', 1); ini_set('display_errors', 1);
include_once(ROOT.DS.'inc'.DS.'core.php'); include_once(ROOT . DS . 'inc' . DS . 'core.php');
header("Content-Type: application/rss+xml; charset=UTF8"); header("Content-Type: application/rss+xml; charset=UTF8");
if (PHP_SAPI === 'cli-server') if (PHP_SAPI === 'cli-server')
$_SERVER['SCRIPT_NAME'] = pathinfo(__FILE__, PATHINFO_BASENAME); $_SERVER['SCRIPT_NAME'] = pathinfo(__FILE__, PATHINFO_BASENAME);
if($_GET['url']) if ($_GET['url'])
$url = explode('/',ltrim(parse_url($_GET['url'], PHP_URL_PATH),'/')); $url = explode('/', ltrim(parse_url($_GET['url'], PHP_URL_PATH), '/'));
else $url = array_filter(explode('/',ltrim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH),'/'))); else $url = array_filter(explode('/', ltrim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/')));
array_shift($url); array_shift($url);
$email = $url[0]; $email = $url[0];
if(!$email) if (!$email) {
{
http_response_code(404); http_response_code(404);
exit('Error: Email not found'); exit('Error: Email not found');
} }
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) exit(); if (!filter_var($email, FILTER_VALIDATE_EMAIL)) exit();
$rss = '<?xml version="1.0" ?> $rss = '<?xml version="1.0" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel> <channel>
<atom:link href="https://'.DOMAIN.'/rss.php" rel="self" type="application/rss+xml" /> <atom:link href="https://' . DOMAIN . '/rss.php" rel="self" type="application/rss+xml" />
<title>RSS for '.$email.'</title> <title>RSS for ' . $email . '</title>
<link>https://'.DOMAIN.'/#'.$email.'</link> <link>https://' . DOMAIN . '/#' . $email . '</link>
<description>RSS Feed for email address '.$email.'</description> <description>RSS Feed for email address ' . $email . '</description>
<lastBuildDate>'.date(DATE_RFC822,time()).'</lastBuildDate> <lastBuildDate>' . date(DateTime::RFC2822, time()) . '</lastBuildDate>
<image> <image>
<title>RSS for '.$email.'</title> <title>RSS for ' . $email . '</title>
<url>https://raw.githubusercontent.com/HaschekSolutions/opentrashmail/master/web/imgs/logo_300.png</url> <url>https://raw.githubusercontent.com/HaschekSolutions/opentrashmail/master/web/imgs/logo_300.png</url>
<link>https://github.com/HaschekSolutions/opentrashmail</link> <link>https://github.com/HaschekSolutions/opentrashmail</link>
</image>'; </image>';
$emaildata = getEmailsOfEmail($email); $emaildata = getEmailsOfEmail($email);
foreach($emaildata as $id=>$d) foreach ($emaildata as $id => $d) {
{ $data = getEmail($email, $id);
$data = getEmail($email,$id);
//var_dump($data); //var_dump($data);
$time = substr($id,0,-3); $time = substr($id, 0, -3);
$date = date("Y-m-d H:i",$time); $date = date("Y-m-d H:i", $time);
$att_text = array(); $att_text = array();
$encl = array(); $encl = array();
if(is_array($data['parsed']['attachments'])) if (is_array($data['parsed']['attachments']))
foreach($data['parsed']['attachments'] as $filename) foreach ($data['parsed']['attachments'] as $filename) {
{ $filepath = ROOT . DS . '..' . DS . 'data' . DS . $email . DS . 'attachments' . DS . $filename;
$filepath = ROOT.DS.'..'.DS.'data'.DS.$email.DS.'attachments'.DS.$filename; $parts = explode('-', $filename);
$parts = explode('-',$filename);
$fid = $parts[0]; $fid = $parts[0];
$fn = $parts[1]; $fn = $parts[1];
$url = 'https://'.DOMAIN.'/api.php?a=attachment&email='.$email.'&id='.$fid.'&filename='.$fn; $url = 'https://' . DOMAIN . '/api.php?a=attachment&email=' . $email . '&id=' . $fid . '&filename=' . $fn;
//$encl[] = '<enclosure url="'.rawurlencode($url).'" length="'.filesize($filepath).'" type="'.mime_content_type($filepath).'" />'; //$encl[] = '<enclosure url="'.rawurlencode($url).'" length="'.filesize($filepath).'" type="'.mime_content_type($filepath).'" />';
$att_text[] = "<a href='$url' target='_blank'>$fn</a>"; $att_text[] = "<a href='$url' target='_blank'>$fn</a>";
} }
$rss.=' $rss .= '
<item> <item>
<title><![CDATA['.$data['parsed']['subject'].']]></title> <title><![CDATA[' . $data['parsed']['subject'] . ']]></title>
<pubDate>'.date(DATE_RFC822,$time).'</pubDate> <pubDate>' . date(DateTime::RFC2822, $time) . '</pubDate>
<link>https://'.DOMAIN.'/#'.$email.'</link> <link>https://' . DOMAIN . '/#' . $email . '</link>
<guid>https://' . DOMAIN . '/api.php?a=load&email=' . $email . '&id=' . $id . '&raw=true</guid>
<description> <description>
<![CDATA[ <![CDATA[
Email from: '.htmlentities($data['from']).'<br/> Email from: ' . htmlentities($data['from']) . '<br/>
Email to: '.(is_array($data['rcpts'])?htmlentities(implode(',',$data['rcpts'])):htmlentities($email)).'<br/> Email to: ' . (is_array($data['rcpts']) ? htmlentities(implode(',', $data['rcpts'])) : htmlentities($email)) . '<br/>
'.((count($att_text)>0)?'Attachments:<br/>'.array2ul($att_text).'<br/>':'').' ' . ((count($att_text) > 0) ? 'Attachments:<br/>' . array2ul($att_text) . '<br/>' : '') . '
<a href="https://'.DOMAIN.'/api.php?a=load&email='.$email.'&id='.$id.'&raw=true">View raw email</a> <br/> <a href="https://' . DOMAIN . '/api.php?a=load&email=' . $email . '&id=' . $id . '&raw=true">View raw email</a> <br/>
<br/>---------<br/><br/> <br/>---------<br/><br/>
'.($data['parsed']['htmlbody']?$data['parsed']['htmlbody']:nl2br(htmlentities($data['parsed']['body']))).' ' . ($data['parsed']['htmlbody'] ? $data['parsed']['htmlbody'] : nl2br(htmlentities($data['parsed']['body']))) . '
]]> ]]>
</description> </description>
'./*((count($encl)>0)?implode('<br/>',$encl):'').*/' ' ./*((count($encl)>0)?implode('<br/>',$encl):'').*/ '
</item>'; </item>';
if(++$i>5) break; //if (++$i > 5) break;
} }
$rss.='</channel> $rss .= '</channel>
</rss> '; </rss> ';
echo $rss; echo $rss;
function array2ul($array) { function array2ul($array)
{
$out = "<ul>"; $out = "<ul>";
foreach($array as $key => $elem){ foreach ($array as $key => $elem) {
$out .= "<li>$elem</li>"; $out .= "<li>$elem</li>";
} }
$out .= "</ul>"; $out .= "</ul>";
return $out; return $out;
} }