aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rwxr-xr-xinclude/Scrape.php15
-rw-r--r--[-rwxr-xr-x]include/bbcode.php7
-rwxr-xr-xinclude/delivery.php38
-rwxr-xr-xinclude/email.php200
-rwxr-xr-xinclude/html2bbcode.php4
-rw-r--r--include/html2plain.php180
-rwxr-xr-xinclude/notifier.php24
-rwxr-xr-xinclude/poller.php72
-rw-r--r--include/quoteconvert.php132
9 files changed, 573 insertions, 99 deletions
diff --git a/include/Scrape.php b/include/Scrape.php
index 1835892eb..4c4ad3cdb 100755
--- a/include/Scrape.php
+++ b/include/Scrape.php
@@ -452,10 +452,19 @@ function probe_url($url, $mode = PROBE_NORMAL) {
$adr = imap_rfc822_parse_adrlist($x->to,'');
if(isset($adr)) {
foreach($adr as $feadr) {
- if((strcasecmp($feadr->mailbox,$name) == 0)
- &&(strcasecmp($feadr->host,$phost) == 0)
+ if((strcasecmp($feadr->mailbox,$name) == 0)
+ &&(strcasecmp($feadr->host,$phost) == 0)
&& (strlen($feadr->personal))) {
- $vcard['fn'] = notags($feadr->personal);
+
+ $personal = imap_mime_header_decode($feadr->personal);
+ $vcard['fn'] = "";
+ foreach($personal as $perspart)
+ if ($perspart->charset != "default")
+ $vcard['fn'] .= iconv($perspart->charset, 'UTF-8//IGNORE', $perspart->text);
+ else
+ $vcard['fn'] .= $perspart->text;
+
+ $vcard['fn'] = notags($vcard['fn']);
}
}
}
diff --git a/include/bbcode.php b/include/bbcode.php
index 32053b4ec..cff26f5c8 100755..100644
--- a/include/bbcode.php
+++ b/include/bbcode.php
@@ -151,7 +151,7 @@ function bbcode($Text,$preserve_nl = false) {
// handle nested lists
$endlessloop = 0;
- while (strpos($Text, "[/list]") and strpos($Text, "[list") and (++$endlessloop < 20)) {
+ while ((strpos($Text, "[/list]") !== false) and (strpos($Text, "[list") !== false) and (++$endlessloop < 20)) {
$Text = preg_replace("/\[list\](.*?)\[\/list\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>' ,$Text);
$Text = preg_replace("/\[list=\](.*?)\[\/list\]/ism", '<ul class="listnone" style="list-style-type: none;">$1</ul>' ,$Text);
$Text = preg_replace("/\[list=1\](.*?)\[\/list\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' ,$Text);
@@ -194,7 +194,7 @@ function bbcode($Text,$preserve_nl = false) {
// Check for [quote] text
// handle nested quotes
$endlessloop = 0;
- while (strpos($Text, "[/quote]") !== false and strpos($Text, "[quote]") !== false and (++$endlessloop < 20))
+ while ((strpos($Text, "[/quote]") !== false) and (strpos($Text, "[quote]") !== false) and (++$endlessloop < 20))
$Text = preg_replace("/\[quote\](.*?)\[\/quote\]/ism","$QuoteLayout", $Text);
// Check for [quote=Author] text
@@ -203,7 +203,7 @@ function bbcode($Text,$preserve_nl = false) {
// handle nested quotes
$endlessloop = 0;
- while (strpos($Text, "[/quote]") !== false and strpos($Text, "[quote=") !== false and (++$endlessloop < 20))
+ while ((strpos($Text, "[/quote]")!== false) and (strpos($Text, "[quote=") !== false) and (++$endlessloop < 20))
$Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism",
"<blockquote><strong>" . $t_wrote . "</strong> $2</blockquote>",
$Text);
@@ -285,3 +285,4 @@ function bbcode($Text,$preserve_nl = false) {
return $Text;
}
+
diff --git a/include/delivery.php b/include/delivery.php
index cbf602a0b..c1ff07bd5 100755
--- a/include/delivery.php
+++ b/include/delivery.php
@@ -1,6 +1,7 @@
<?php
require_once("boot.php");
require_once('include/queue_fn.php');
+require_once('include/html2plain.php');
function delivery_run($argv, $argc){
global $a, $db;
@@ -8,7 +9,7 @@ function delivery_run($argv, $argc){
if(is_null($a)){
$a = new App;
}
-
+
if(is_null($db)) {
@include(".htconfig.php");
require_once("dba.php");
@@ -293,7 +294,7 @@ function delivery_run($argv, $argc){
$sql_extra = sprintf(" AND `dfrn-id` = '%s' ", dbesc($contact['issued-id']));
else
$sql_extra = sprintf(" AND `issued-id` = '%s' ", dbesc($contact['dfrn-id']));
-
+
$x = q("SELECT `contact`.*, `contact`.`uid` AS `importer_uid`,
`contact`.`pubkey` AS `cpubkey`,
`contact`.`prvkey` AS `cprvkey`,
@@ -322,14 +323,14 @@ function delivery_run($argv, $argc){
require_once('library/simplepie/simplepie.inc');
logger('mod-delivery: local delivery');
local_delivery($x[0],$atom);
- break;
+ break;
}
}
$deliver_status = dfrn_deliver($owner,$contact,$atom);
logger('notifier: dfrn_delivery returns ' . $deliver_status);
-
+
if($deliver_status == (-1)) {
logger('notifier: delivery failed: queuing message');
add_to_queue($contact['id'],NETWORK_DFRN,$atom);
@@ -382,7 +383,7 @@ function delivery_run($argv, $argc){
case NETWORK_MAIL :
case NETWORK_MAIL2:
-
+
if(get_config('system','dfrn_only'))
break;
// WARNING: does not currently convert to RFC2047 header encodings, etc.
@@ -432,9 +433,19 @@ function delivery_run($argv, $argc){
if($reply_to)
$headers .= 'Reply-to: ' . $reply_to . "\n";
- $headers .= 'Message-id: <' . $it['uri'] . '>' . "\n";
+
+ // for testing purposes: Collect exported mails
+ $file = tempnam("/tmp/friendica/", "mail-out-");
+ file_put_contents($file, json_encode($it));
+
+ $headers .= 'Message-Id: <' . iri2msgid($it['uri']). '>' . "\n";
+
+ //logger("Mail: uri: ".$it['uri']." parent-uri ".$it['parent-uri'], LOGGER_DEBUG);
+ //logger("Mail: Data: ".print_r($it, true), LOGGER_DEBUG);
+ //logger("Mail: Data: ".print_r($it, true), LOGGER_DATA);
+
if($it['uri'] !== $it['parent-uri']) {
- $header .= 'References: <' . $it['parent-uri'] . '>' . "\n";
+ $headers .= 'References: <' . iri2msgid($it['parent-uri']) . '>' . "\n";
if(! strlen($it['title'])) {
$r = q("SELECT `title` FROM `item` WHERE `parent-uri` = '%s' LIMIT 1",
dbesc($it['parent-uri'])
@@ -450,13 +461,16 @@ function delivery_run($argv, $argc){
}
}
}
- $headers .= 'MIME-Version: 1.0' . "\n";
- $headers .= 'Content-Type: text/html; charset=UTF-8' . "\n";
+ /*$headers .= 'MIME-Version: 1.0' . "\n";
+ //$headers .= 'Content-Type: text/html; charset=UTF-8' . "\n";
+ $headers .= 'Content-Type: text/plain; charset=UTF-8' . "\n";
$headers .= 'Content-Transfer-Encoding: 8bit' . "\n\n";
$html = prepare_body($it);
- $message = '<html><body>' . $html . '</body></html>';
+ //$message = '<html><body>' . $html . '</body></html>';
+ $message = html2plain($html);
logger('notifier: email delivery to ' . $addr);
- mail($addr, $subject, $message, $headers);
+ mail($addr, $subject, $message, $headers);*/
+ email_send($addr, $subject, $headers, $it);
}
break;
@@ -473,7 +487,7 @@ function delivery_run($argv, $argc){
if((! $contact['pubkey']) && (! $public_message))
break;
-
+
if($target_item['verb'] === ACTIVITY_DISLIKE) {
// unsupported
break;
diff --git a/include/email.php b/include/email.php
index 3e6a8186d..659978b6e 100755
--- a/include/email.php
+++ b/include/email.php
@@ -1,4 +1,5 @@
<?php
+require_once('include/html2plain.php');
function email_connect($mailbox,$username,$password) {
if(! function_exists('imap_open'))
@@ -79,15 +80,32 @@ function email_get_msg($mbox,$uid) {
if(! $struc)
return $ret;
+ // for testing purposes: Collect imported mails
+ // $file = tempnam("/tmp/friendica2/", "mail-in-");
+ // file_put_contents($file, json_encode($struc));
+
if(! $struc->parts) {
- $ret['body'] = email_get_part($mbox,$uid,$struc,0);
+ $ret['body'] = email_get_part($mbox,$uid,$struc,0, 'html');
+
+ if (trim($ret['body']) == '')
+ $ret['body'] = email_get_part($mbox,$uid,$struc,0, 'plain');
+ else
+ $ret['body'] = html2bbcode($ret['body']);
}
else {
+ $text = '';
+ $html = '';
foreach($struc->parts as $ptop => $p) {
- $x = email_get_part($mbox,$uid,$p,$ptop + 1);
- if($x)
- $ret['body'] = $x;
+ $x = email_get_part($mbox,$uid,$p,$ptop + 1, 'plain');
+ if($x) $text .= $x;
+
+ $x = email_get_part($mbox,$uid,$p,$ptop + 1, 'html');
+ if($x) $html .= $x;
}
+ if (trim($html) != '')
+ $ret['body'] = html2bbcode($html);
+ else
+ $ret['body'] = $text;
}
return $ret;
}
@@ -95,74 +113,81 @@ function email_get_msg($mbox,$uid) {
// At the moment - only return plain/text.
// Later we'll repackage inline images as data url's and make the HTML safe
-function email_get_part($mbox,$uid,$p,$partno) {
- // $partno = '1', '2', '2.1', '2.1.3', etc for multipart, 0 if simple
- global $htmlmsg,$plainmsg,$charset,$attachments;
+function email_get_part($mbox,$uid,$p,$partno, $subtype) {
+ // $partno = '1', '2', '2.1', '2.1.3', etc for multipart, 0 if simple
+ global $htmlmsg,$plainmsg,$charset,$attachments;
- echo $partno;
+ //echo $partno."\n";
- // DECODE DATA
- $data = ($partno)
+ // DECODE DATA
+ $data = ($partno)
? @imap_fetchbody($mbox,$uid,$partno, FT_UID|FT_PEEK)
- : @imap_body($mbox,$uid,FT_UID|FT_PEEK);
-
- // Any part may be encoded, even plain text messages, so check everything.
- if ($p->encoding==4)
- $data = quoted_printable_decode($data);
- elseif ($p->encoding==3)
- $data = base64_decode($data);
-
- // PARAMETERS
- // get all parameters, like charset, filenames of attachments, etc.
- $params = array();
- if ($p->parameters)
- foreach ($p->parameters as $x)
- $params[strtolower($x->attribute)] = $x->value;
- if ($p->dparameters)
- foreach ($p->dparameters as $x)
- $params[strtolower($x->attribute)] = $x->value;
-
- // ATTACHMENT
- // Any part with a filename is an attachment,
- // so an attached text file (type 0) is not mistaken as the message.
-
- if ($params['filename'] || $params['name']) {
- // filename may be given as 'Filename' or 'Name' or both
- $filename = ($params['filename'])? $params['filename'] : $params['name'];
- // filename may be encoded, so see imap_mime_header_decode()
- $attachments[$filename] = $data; // this is a problem if two files have same name
- }
+ : @imap_body($mbox,$uid,FT_UID|FT_PEEK);
+
+ // for testing purposes: Collect imported mails
+ // $file = tempnam("/tmp/friendica2/", "mail-body-");
+ // file_put_contents($file, $data);
+
+ // Any part may be encoded, even plain text messages, so check everything.
+ if ($p->encoding==4)
+ $data = quoted_printable_decode($data);
+ elseif ($p->encoding==3)
+ $data = base64_decode($data);
+
+ // PARAMETERS
+ // get all parameters, like charset, filenames of attachments, etc.
+ $params = array();
+ if ($p->parameters)
+ foreach ($p->parameters as $x)
+ $params[strtolower($x->attribute)] = $x->value;
+ if (isset($p->dparameters) and $p->dparameters)
+ foreach ($p->dparameters as $x)
+ $params[strtolower($x->attribute)] = $x->value;
+
+ // ATTACHMENT
+ // Any part with a filename is an attachment,
+ // so an attached text file (type 0) is not mistaken as the message.
+
+ if ((isset($params['filename']) and $params['filename']) || (isset($params['name']) and $params['name'])) {
+ // filename may be given as 'Filename' or 'Name' or both
+ $filename = ($params['filename'])? $params['filename'] : $params['name'];
+ // filename may be encoded, so see imap_mime_header_decode()
+ $attachments[$filename] = $data; // this is a problem if two files have same name
+ }
- // TEXT
- if ($p->type == 0 && $data) {
- // Messages may be split in different parts because of inline attachments,
- // so append parts together with blank row.
- if (strtolower($p->subtype)=='plain')
- return (trim($data) ."\n\n");
- else
+ // TEXT
+ if ($p->type == 0 && $data) {
+ // Messages may be split in different parts because of inline attachments,
+ // so append parts together with blank row.
+ if (strtolower($p->subtype)==$subtype) {
+ $data = iconv($params['charset'], 'UTF-8//IGNORE', $data);
+ return (trim($data) ."\n\n");
+ } else
$data = '';
// $htmlmsg .= $data ."<br><br>";
- $charset = $params['charset']; // assume all parts are same charset
- }
+ $charset = $params['charset']; // assume all parts are same charset
+ }
- // EMBEDDED MESSAGE
- // Many bounce notifications embed the original message as type 2,
- // but AOL uses type 1 (multipart), which is not handled here.
- // There are no PHP functions to parse embedded messages,
- // so this just appends the raw source to the main message.
-// elseif ($p->type==2 && $data) {
-// $plainmsg .= $data."\n\n";
-// }
-
- // SUBPART RECURSION
- if ($p->parts) {
- foreach ($p->parts as $partno0=>$p2) {
- $x = email_get_part($mbox,$uid,$p2,$partno . '.' . ($partno0+1)); // 1.2, 1.2.1, etc.
- if($x)
- return $x;
+ // EMBEDDED MESSAGE
+ // Many bounce notifications embed the original message as type 2,
+ // but AOL uses type 1 (multipart), which is not handled here.
+ // There are no PHP functions to parse embedded messages,
+ // so this just appends the raw source to the main message.
+// elseif ($p->type==2 && $data) {
+// $plainmsg .= $data."\n\n";
+// }
+
+ // SUBPART RECURSION
+ if (isset($p->parts) and $p->parts) {
+ $x = "";
+ foreach ($p->parts as $partno0=>$p2) {
+ $x .= email_get_part($mbox,$uid,$p2,$partno . '.' . ($partno0+1), $subtype); // 1.2, 1.2.1, etc.
+ //if($x)
+ // return $x;
}
- }
+ return $x;
+ }
}
@@ -216,6 +241,53 @@ function email_header_encode($in_str, $charset) {
$out_str = $start . $out_str . $end;
}
return $out_str;
-}
+}
+
+function email_send($addr, $subject, $headers, $item) {
+ //$headers .= 'MIME-Version: 1.0' . "\n";
+ //$headers .= 'Content-Type: text/html; charset=UTF-8' . "\n";
+ //$headers .= 'Content-Type: text/plain; charset=UTF-8' . "\n";
+ //$headers .= 'Content-Transfer-Encoding: 8bit' . "\n\n";
+
+ $part = uniqid("", true);
+ $html = prepare_body($item);
+ $headers .= "Mime-Version: 1.0\n";
+ $headers .= 'Content-Type: multipart/alternative; boundary="=_'.$part.'"'."\n\n";
+
+ $body = "\n--=_".$part."\n";
+ $body .= "Content-Transfer-Encoding: 8bit\n";
+ $body .= "Content-Type: text/plain; charset=utf-8; format=flowed\n\n";
+
+ $body .= html2plain($html)."\n";
+
+ $body .= "--=_".$part."\n";
+ $body .= "Content-Transfer-Encoding: 8bit\n";
+ $body .= "Content-Type: text/html; charset=utf-8\n\n";
+
+ $body .= '<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">'.$html."</body></html>\n";
+
+ $body .= "--=_".$part."--";
+
+ //$message = '<html><body>' . $html . '</body></html>';
+ //$message = html2plain($html);
+ logger('notifier: email delivery to ' . $addr);
+ mail($addr, $subject, $body, $headers);
+}
+
+function iri2msgid($iri) {
+ if (!strpos($iri, "@"))
+ $msgid = preg_replace("/urn:(\S+):(\S+)\.(\S+):(\d+):(\S+)/i", "urn!$1!$4!$5@$2.$3", $iri);
+ else
+ $msgid = $iri;
+ return($msgid);
+}
+
+function msgid2iri($msgid) {
+ if (strpos($msgid, "@"))
+ $iri = preg_replace("/urn!(\S+)!(\d+)!(\S+)@(\S+)\.(\S+)/i", "urn:$1:$4.$5:$2:$3", $msgid);
+ else
+ $iri = $msgid;
+ return($iri);
+}
diff --git a/include/html2bbcode.php b/include/html2bbcode.php
index d8f1a24f1..65920380b 100755
--- a/include/html2bbcode.php
+++ b/include/html2bbcode.php
@@ -258,7 +258,7 @@ function html2bbcode($message)
"[hr]\n",
"\n[list",
"[/list]\n",
- "\n[/list]",
+ "\n[/",
"[list]\n",
"[list=1]\n",
"\n[*]"),
@@ -268,7 +268,7 @@ function html2bbcode($message)
"[hr]",
"[list",
"[/list]",
- "[/list]",
+ "[/",
"[list]",
"[list=1]",
"[*]"),
diff --git a/include/html2plain.php b/include/html2plain.php
new file mode 100644
index 000000000..2a4cf6639
--- /dev/null
+++ b/include/html2plain.php
@@ -0,0 +1,180 @@
+<?php
+require_once "html2bbcode.php";
+
+function breaklines($line, $level)
+{
+ $wraplen = 75-$level;
+
+ $newlines = array();
+
+ do {
+ $oldline = $line;
+
+ $subline = substr($line, 0, $wraplen);
+
+ $pos = strrpos($subline, ' ');
+
+ if ($pos == 0)
+ $pos = strpos($line, ' ');
+
+ if (($pos > 0) and strlen($line) > $wraplen) {
+ $newline = trim(substr($line, 0, $pos));
+ if ($level > 0)
+ $newline = str_repeat(">", $level).' '.$newline;
+
+ $newlines[] = $newline." ";
+ $line = substr($line, $pos+1);
+ }
+
+ } while ((strlen($line) > $wraplen) and !($oldline == $line));
+
+ if ($level > 0)
+ $line = str_repeat(">", $level).' '.$line;
+
+ $newlines[] = $line;
+
+
+ return(implode($newlines, "\n"));
+}
+
+function quotelevel($message)
+{
+ $lines = explode("\n", $message);
+
+ $newlines = array();
+ $level = 0;
+ foreach($lines as $line) {;
+ $line = trim($line);
+ $startquote = false;
+ while (strpos("*".$line, '[quote]') > 0) {
+ $level++;
+ $pos = strpos($line, '[quote]');
+ $line = substr($line, 0, $pos).substr($line, $pos+7);
+ $startquote = true;
+ }
+
+ $currlevel = $level;
+
+ while (strpos("*".$line, '[/quote]') > 0) {
+ $level--;
+ if ($level < 0)
+ $level = 0;
+
+ $pos = strpos($line, '[/quote]');
+ $line = substr($line, 0, $pos).substr($line, $pos+8);
+ }
+
+ if (!$startquote or ($line != ''))
+ $newlines[] = breaklines($line, $currlevel);
+ }
+ return(implode($newlines, "\n"));
+}
+
+function html2plain($html)
+{
+ global $lang;
+
+ $message = str_replace("\r", "", $html);
+
+ $doc = new DOMDocument();
+ $doc->preserveWhiteSpace = false;
+
+ $message = mb_convert_encoding($message, 'HTML-ENTITIES', "UTF-8");
+
+ @$doc->loadHTML($message);
+
+ $xpath = new DomXPath($doc);
+ $list = $xpath->query("//pre");
+ foreach ($list as $node) {
+ $node->nodeValue = str_replace("\n", "\r", $node->nodeValue);
+ }
+
+ $message = $doc->saveHTML();
+ $message = str_replace(array("\n<", ">\n", "\r", "\n", "\xC3\x82\xC2\xA0"), array("<", ">", "<br>", " ", ""), $message);
+ $message = preg_replace('= [\s]*=i', " ", $message);
+
+ // nach <a href="...">...</a> suchen, die ... miteinander vergleichen und bei Gleichheit durch ein einzelnes ... ersetzen.
+ $pattern = '/<a.*?href="(.*?)".*?>(.*?)<\/a>/is';
+ preg_match_all($pattern, $message, $result, PREG_SET_ORDER);
+
+ foreach ($result as $treffer) {
+ if ($treffer[1] == $treffer[2]) {
+ $search = '<a href="'.$treffer[1].'" target="_blank">'.$treffer[1].'</a>';
+ $message = str_replace($search, $treffer[1], $message);
+ }
+ }
+ @$doc->loadHTML($message);
+
+ node2bbcode($doc, 'html', array(), '', '');
+ node2bbcode($doc, 'body', array(), '', '');
+
+ // MyBB-Auszeichnungen
+ node2bbcode($doc, 'span', array('style'=>'text-decoration: underline;'), '_', '_');
+ node2bbcode($doc, 'span', array('style'=>'font-style: italic;'), '/', '/');
+ node2bbcode($doc, 'span', array('style'=>'font-weight: bold;'), '*', '*');
+
+ node2bbcode($doc, 'strong', array(), '*', '*');
+ node2bbcode($doc, 'b', array(), '*', '*');
+ node2bbcode($doc, 'i', array(), '/', '/');
+ node2bbcode($doc, 'u', array(), '_', '_');
+
+ node2bbcode($doc, 'blockquote', array(), '[quote]', "[/quote]\n");
+
+ node2bbcode($doc, 'br', array(), "\n", '');
+
+ node2bbcode($doc, 'span', array(), "", "");
+ node2bbcode($doc, 'pre', array(), "", "");
+ node2bbcode($doc, 'div', array(), "\r", "\r");
+ node2bbcode($doc, 'p', array(), "\n", "\n");
+
+ //node2bbcode($doc, 'ul', array(), "\n[list]", "[/list]\n");
+ //node2bbcode($doc, 'ol', array(), "\n[list=1]", "[/list]\n");
+ node2bbcode($doc, 'li', array(), "\n* ", "\n");
+
+ node2bbcode($doc, 'hr', array(), str_repeat("-", 70), "");
+
+ node2bbcode($doc, 'tr', array(), "\n", "");
+ node2bbcode($doc, 'td', array(), "\t", "");
+
+ node2bbcode($doc, 'h1', array(), "\n\n*", "*\n");
+ node2bbcode($doc, 'h2', array(), "\n\n*", "*\n");
+ node2bbcode($doc, 'h3', array(), "\n\n*", "*\n");
+ node2bbcode($doc, 'h4', array(), "\n\n*", "*\n");
+ node2bbcode($doc, 'h5', array(), "\n\n*", "*\n");
+ node2bbcode($doc, 'h6', array(), "\n\n*", "*\n");
+
+ node2bbcode($doc, 'a', array('href'=>'/(.+)/'), ' $1', '', true);
+ node2bbcode($doc, 'img', array('alt'=>'/(.+)/'), '$1', '');
+ node2bbcode($doc, 'img', array('title'=>'/(.+)/'), '$1', '');
+ node2bbcode($doc, 'img', array(), '', '');
+ node2bbcode($doc, 'img', array('src'=>'/(.+)/'), '[img]$1', '[/img]');
+
+ $message = $doc->saveHTML();
+
+ $message = str_replace("[img]", "", $message);
+ $message = str_replace("[/img]", "", $message);
+
+ // was ersetze ich da?
+ // Irgendein stoerrisches UTF-Zeug
+ $message = str_replace(chr(194).chr(160), ' ', $message);
+
+ $message = str_replace("&nbsp;", " ", $message);
+
+ // Aufeinanderfolgende DIVs
+ $message = preg_replace('=\r *\r=i', "\n", $message);
+ $message = str_replace("\r", "\n", $message);
+
+ $message = strip_tags($message);
+
+ $message = html_entity_decode($message, ENT_QUOTES, 'UTF-8');
+
+ do {
+ $oldmessage = $message;
+ $message = str_replace("\n\n\n", "\n\n", $message);
+ } while ($oldmessage != $message);
+
+ $message = quotelevel(trim($message));
+
+ return(trim($message));
+}
+?>
diff --git a/include/notifier.php b/include/notifier.php
index 8ec625286..4765cca06 100755
--- a/include/notifier.php
+++ b/include/notifier.php
@@ -2,6 +2,7 @@
require_once("boot.php");
require_once('include/queue_fn.php');
+require_once('include/html2plain.php');
/*
* This file was at one time responsible for doing all deliveries, but this caused
@@ -633,7 +634,7 @@ function notifier_run($argv, $argc){
);
if($r1 && $r1[0]['reply_to'])
$reply_to = $r1[0]['reply_to'];
-
+
$subject = (($it['title']) ? email_header_encode($it['title'],'UTF-8') : t("\x28no subject\x29")) ;
// only expose our real email address to true friends
@@ -646,10 +647,14 @@ function notifier_run($argv, $argc){
if($reply_to)
$headers .= 'Reply-to: ' . $reply_to . "\n";
- $headers .= 'Message-id: <' . $it['uri'] . '>' . "\n";
+ // for testing purposes: Collect exported mails
+ $file = tempnam("/tmp/friendica/", "mail-out2-");
+ file_put_contents($file, json_encode($it));
+
+ $headers .= 'Message-Id: <' . iri2msgid($it['uri']) . '>' . "\n";
if($it['uri'] !== $it['parent-uri']) {
- $header .= 'References: <' . $it['parent-uri'] . '>' . "\n";
+ $headers .= 'References: <' . iri2msgid($it['parent-uri']) . '>' . "\n";
if(! strlen($it['title'])) {
$r = q("SELECT `title` FROM `item` WHERE `parent-uri` = '%s' LIMIT 1",
dbesc($it['parent-uri'])
@@ -666,13 +671,16 @@ function notifier_run($argv, $argc){
}
}
- $headers .= 'MIME-Version: 1.0' . "\n";
- $headers .= 'Content-Type: text/html; charset=UTF-8' . "\n";
+ /*$headers .= 'MIME-Version: 1.0' . "\n";
+ //$headers .= 'Content-Type: text/html; charset=UTF-8' . "\n";
+ $headers .= 'Content-Type: text/plain; charset=UTF-8' . "\n";
$headers .= 'Content-Transfer-Encoding: 8bit' . "\n\n";
$html = prepare_body($it);
- $message = '<html><body>' . $html . '</body></html>';
+ //$message = '<html><body>' . $html . '</body></html>';
+ $message = html2plain($html);
logger('notifier: email delivery to ' . $addr);
- mail($addr, $subject, $message, $headers);
+ mail($addr, $subject, $message, $headers);*/
+ email_send($addr, $subject, $headers, $it);
}
break;
case NETWORK_DIASPORA:
@@ -719,7 +727,7 @@ function notifier_run($argv, $argc){
// we are the relay - send comments, likes and unlikes to our conversants
diaspora_send_relay($target_item,$owner,$contact);
break;
- }
+ }
elseif(($top_level) && (! $walltowall)) {
// currently no workable solution for sending walltowall
diaspora_send_status($target_item,$owner,$contact);
diff --git a/include/poller.php b/include/poller.php
index 3e7a1e9b4..cfbc46b87 100755
--- a/include/poller.php
+++ b/include/poller.php
@@ -1,6 +1,7 @@
<?php
require_once("boot.php");
+require_once("include/quoteconvert.php");
function poller_run($argv, $argc){
@@ -419,13 +420,13 @@ function poller_run($argv, $argc){
// look for a 'references' header and try and match with a parent item we have locally.
$raw_refs = ((x($headers,'references')) ? str_replace("\t",'',$headers['references']) : '');
- $datarray['uri'] = trim($meta->message_id,'<>');
+ $datarray['uri'] = msgid2iri(trim($meta->message_id,'<>'));
if($raw_refs) {
$refs_arr = explode(' ', $raw_refs);
if(count($refs_arr)) {
for($x = 0; $x < count($refs_arr); $x ++)
- $refs_arr[$x] = "'" . str_replace(array('<','>',' '),array('','',''),dbesc($refs_arr[$x])) . "'";
+ $refs_arr[$x] = "'" . msgid2iri(str_replace(array('<','>',' '),array('','',''),dbesc($refs_arr[$x]))) . "'";
}
$qstr = implode(',',$refs_arr);
$r = q("SELECT `uri` , `parent-uri` FROM `item` WHERE `uri` IN ( $qstr ) AND `uid` = %d LIMIT 1",
@@ -453,9 +454,39 @@ function poller_run($argv, $argc){
intval($r[0]['id'])
);
}
+ switch ($mailconf[0]['action']) {
+ case 0:
+ break;
+ case 1:
+ logger("Mail: Deleting ".$msg_uid);
+ imap_delete($mbox, $msg_uid, FT_UID);
+ break;
+ case 2:
+ logger("Mail: Mark as seen ".$msg_uid);
+ imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
+ break;
+ case 3:
+ logger("Mail: Moving ".$msg_uid." to ".$mailconf[0]['movetofolder']);
+ imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
+ if ($mailconf[0]['movetofolder'] != "")
+ imap_mail_move($mbox, $msg_uid, $mailconf[0]['movetofolder'], FT_UID);
+ break;
+ }
continue;
}
- $datarray['title'] = notags(trim($meta->subject));
+
+ // Decoding the header
+ $subject = imap_mime_header_decode($meta->subject);
+ $datarray['title'] = "";
+ foreach($subject as $subpart)
+ if ($subpart->charset != "default")
+ $datarray['title'] .= iconv($subpart->charset, 'UTF-8//IGNORE', $subpart->text);
+ else
+ $datarray['title'] .= $subpart->text;
+
+ $datarray['title'] = notags(trim($datarray['title']));
+
+ //$datarray['title'] = notags(trim($meta->subject));
$datarray['created'] = datetime_convert('UTC','UTC',$meta->date);
$r = email_get_msg($mbox,$msg_uid);
@@ -463,15 +494,24 @@ function poller_run($argv, $argc){
logger("Mail: can't fetch msg ".$msg_uid);
continue;
}
- $datarray['body'] = escape_tags($r['body']);
+ $datarray['body'] = escape_tags(convertquote($r['body'], false));
logger("Mail: Importing ".$msg_uid);
// some mailing lists have the original author as 'from' - add this sender info to msg body.
// todo: adding a gravatar for the original author would be cool
- if(! stristr($meta->from,$contact['addr']))
- $datarray['body'] = t('From: ') . escape_tags($meta->from) . "\n\n" . $datarray['body'];
+ if(! stristr($meta->from,$contact['addr'])) {
+ $from = imap_mime_header_decode($meta->from);
+ $fromdecoded = "";
+ foreach($from as $frompart)
+ if ($frompart->charset != "default")
+ $fromdecoded .= iconv($frompart->charset, 'UTF-8//IGNORE', $frompart->text);
+ else
+ $fromdecoded .= $frompart->text;
+
+ $datarray['body'] = "[b]".t('From: ') . escape_tags($fromdecoded) . "[/b]\n\n" . $datarray['body'];
+ }
$datarray['uid'] = $importer_uid;
$datarray['contact-id'] = $contact['id'];
@@ -493,6 +533,24 @@ function poller_run($argv, $argc){
q("UPDATE `item` SET `last-child` = 1 WHERE `id` = %d LIMIT 1",
intval($stored_item)
);
+ switch ($mailconf[0]['action']) {
+ case 0:
+ break;
+ case 1:
+ logger("Mail: Deleting ".$msg_uid);
+ imap_delete($mbox, $msg_uid, FT_UID);
+ break;
+ case 2:
+ logger("Mail: Mark as seen ".$msg_uid);
+ imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
+ break;
+ case 3:
+ logger("Mail: Moving ".$msg_uid." to ".$mailconf[0]['movetofolder']);
+ imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
+ if ($mailconf[0]['movetofolder'] != "")
+ imap_mail_move($mbox, $msg_uid, $mailconf[0]['movetofolder'], FT_UID);
+ break;
+ }
}
}
@@ -501,7 +559,7 @@ function poller_run($argv, $argc){
}
elseif($contact['network'] === NETWORK_FACEBOOK) {
// This is picked up by the Facebook plugin on a cron hook.
- // Ignored here.
+ // Ignored here.
}
if($xml) {
diff --git a/include/quoteconvert.php b/include/quoteconvert.php
new file mode 100644
index 000000000..3aee93234
--- /dev/null
+++ b/include/quoteconvert.php
@@ -0,0 +1,132 @@
+<?php
+function convertquote($body, $reply)
+{
+ // Convert Quotes
+ $arrbody = explode("\n", trim($body));
+ $arrlevel = array();
+
+ for ($i = 0; $i < count($arrbody); $i++) {
+ $quotelevel = 0;
+ $quoteline = $arrbody[$i];
+
+ while ((strlen($quoteline)>0) and ((substr($quoteline, 0, 1) == '>')
+ or (substr($quoteline, 0, 1) == ' '))) {
+ if (substr($quoteline, 0, 1) == '>')
+ $quotelevel++;
+
+ $quoteline = ltrim(substr($quoteline, 1));
+ }
+
+ //echo $quotelevel.'*'.$quoteline."\r\n";
+
+ $arrlevel[$i] = $quotelevel;
+ $arrbody[$i] = $quoteline;
+ }
+
+ $quotelevel = 0;
+ $previousquote = 0;
+ $arrbodyquoted = array();
+
+ for ($i = 0; $i < count($arrbody); $i++) {
+
+ $previousquote = $quotelevel;
+ $quotelevel = $arrlevel[$i];
+ $currline = $arrbody[$i];
+
+ while ($previousquote < $quotelevel) {
+ if ($sender != '') {
+ $quote = "[quote title=$sender]";
+ $sender = '';
+ } else
+ $quote = "[quote]";
+
+ $arrbody[$i] = $quote.$arrbody[$i];
+ $previousquote++;
+ }
+
+ while ($previousquote > $quotelevel) {
+ $arrbody[$i] = '[/quote]'.$arrbody[$i];
+ $previousquote--;
+ }
+
+ $arrbodyquoted[] = $arrbody[$i];
+ }
+ while ($quotelevel > 0) {
+ $arrbodyquoted[] = '[/quote]';
+ $quotelevel--;
+ }
+
+ $body = implode("\n", $arrbodyquoted);
+
+ if (strlen($body) > 0)
+ $body = $body."\n\n";
+
+ if ($reply)
+ $body = removetofu($body);
+
+ return($body);
+}
+
+function removetofu($message)
+{
+ $message = trim($message);
+
+ do {
+ $oldmessage = $message;
+ $message = preg_replace('=\[/quote\][\s](.*?)\[quote\]=i', '$1', $message);
+ $message = str_replace("[/quote][quote]", "", $message);
+ } while ($message != $oldmessage);
+
+ $quotes = array();
+
+ $startquotes = 0;
+
+ $start = 0;
+
+ while(($pos = strpos($message, '[quote', $start)) > 0) {
+ $quotes[$pos] = -1;
+ $start = $pos + 7;
+ $startquotes++;
+ }
+
+ $endquotes = 0;
+ $start = 0;
+
+ while(($pos = strpos($message, '[/quote]', $start)) > 0) {
+ $start = $pos + 7;
+ $endquotes++;
+ }
+
+ while ($endquotes < $startquotes) {
+ $message .= '[/quote]';
+ ++$endquotes;
+ }
+
+ $start = 0;
+
+ while(($pos = strpos($message, '[/quote]', $start)) > 0) {
+ $quotes[$pos] = 1;
+ $start = $pos + 7;
+ }
+
+ if (strtolower(substr($message, -8)) != '[/quote]')
+ return($message);
+
+ krsort($quotes);
+
+ $quotelevel = 0;
+ $quotestart = 0;
+ foreach ($quotes as $index => $quote) {
+ $quotelevel += $quote;
+
+ if (($quotelevel == 0) and ($quotestart == 0))
+ $quotestart = $index;
+ }
+
+ if ($quotestart != 0) {
+ $message = trim(substr($message, 0, $quotestart))."\n[collapsed]\n".substr($message, $quotestart+7, -8).'[/collapsed]';
+ }
+
+ return($message);
+}
+?>