diff --git a/egw-pear/HTTP/WebDAV/Server.php b/egw-pear/HTTP/WebDAV/Server.php new file mode 100644 index 0000000000..d030560142 --- /dev/null +++ b/egw-pear/HTTP/WebDAV/Server.php @@ -0,0 +1,2640 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: Server.php,v 1.56 2006/10/10 11:53:16 hholzgra Exp $ +// +require_once "HTTP/WebDAV/Tools/_parse_propfind.php"; +require_once "HTTP/WebDAV/Tools/_parse_proppatch.php"; +require_once "HTTP/WebDAV/Tools/_parse_lockinfo.php"; + +/** + * Virtual base class for implementing WebDAV servers + * + * WebDAV server base class, needs to be extended to do useful work + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version @package_version@ + */ +class HTTP_WebDAV_Server +{ + // {{{ Member Variables + + /** + * complete URI for this request + * + * @var string + */ + var $uri; + + /** + * base URI for this request + * + * @var string + */ + var $base_uri; + + /** + * Set if client requires to be a url (true) or a path (false). + * RFC 4918 allows both: http://www.webdav.org/specs/rfc4918.html#ELEMENT_href + * But some clients can NOT deal with one or the other! + * + * @var boolean + */ + var $client_require_href_as_url; + + /** + * Set if client requires does not allow namespace redundacy. + * The XML Namespace specification does allow both + * But some clients can NOT deal with one or the other! + * + * @var boolean (client_refuses_redundand_namespace_declarations) + * @var boolean (client_needs_redundand_namespace_declarations) + */ + var $crrnd = false; + var $cnrnd = false; + + /** + + + /** + * URI path for this request + * + * @var string + */ + var $path; + + /** + * Realm string to be used in authentification popups + * + * @var string + */ + var $http_auth_realm = "PHP WebDAV"; + + /** + * String to be used in "X-Dav-Powered-By" header + * + * @var string + */ + var $dav_powered_by = ""; + + /** + * Remember parsed If: (RFC2518/9.4) header conditions + * + * @var array + */ + var $_if_header_uris = array(); + + /** + * HTTP response status/message + * + * @var string + */ + var $_http_status = "200 OK"; + + /** + * encoding of property values passed in + * + * @var string + */ + var $_prop_encoding = "utf-8"; + + /** + * Copy of $_SERVER superglobal array + * + * Derived classes may extend the constructor to + * modify its contents + * + * @var array + */ + var $_SERVER; + + // }}} + + // {{{ Constructor + + /** + * Constructor + * + * @param void + */ + function HTTP_WebDAV_Server() + { + // PHP messages destroy XML output -> switch them off + ini_set("display_errors", 0); + + // copy $_SERVER variables to local _SERVER array + // so that derived classes can simply modify these + $this->_SERVER = $_SERVER; + } + + // }}} + + // {{{ ServeRequest() + /** + * Serve WebDAV HTTP request + * + * dispatch WebDAV HTTP request to the apropriate method handler + * + * @param void + * @return void + */ + function ServeRequest() + { + // prevent warning in litmus check 'delete_fragment' + if (strstr($this->_SERVER["REQUEST_URI"], '#')) { + $this->http_status("400 Bad Request"); + return; + } + + // default is currently to use just the path, extending class can set $this->client_require_href_as_url depending on user-agent + if ($this->client_require_href_as_url) + { + // default uri is the complete request uri + $uri = (@$this->_SERVER["HTTPS"] === "on" ? "https:" : "http:") . '//'.$this->_SERVER['HTTP_HOST']; + } + // support for PHP running as (F)CGI + if (!isset($this->_SERVER['PATH_INFO']) && isset($this->_SERVER['ORIG_PATH_INFO'])) + { + $this->_SERVER['PATH_INFO'] = $this->_SERVER['ORIG_PATH_INFO']; + } + // we cant use SCRIPT_NAME, because it fails, if there's any url rewriting + //error_log("pathinfo:\n". $this->_urldecode($this->_SERVER['REQUEST_URI']).":\n".$this->_SERVER['PATH_INFO']); + $uri .= $this->_urldecode($this->_SERVER['REQUEST_URI']); + if (!empty($this->_SERVER["PATH_INFO"])) + { + $uri = substr($uri,0,-strlen($this->_SERVER["PATH_INFO"])); + } + + $path_info = empty($this->_SERVER["PATH_INFO"]) ? "/" : $this->_SERVER["PATH_INFO"]; + + $this->base_uri = $uri; + $this->uri = $uri . $path_info; + // set path + // $_SERVER['PATH_INFO'] is already urldecoded + //$this->path = $this->_urldecode($path_info); + // quote '#' (e.g. OpenOffice uses this for lock-files) + $this->path = strtr($path_info,array( + '%' => '%25', + '#' => '%23', + '?' => '%3F', + )); + if (!strlen($this->path)) { + if ($this->_SERVER["REQUEST_METHOD"] == "GET") { + // redirect clients that try to GET a collection + // WebDAV clients should never try this while + // regular HTTP clients might ... + header("Location: ".$this->base_uri."/"); + return; + } else { + // if a WebDAV client didn't give a path we just assume '/' + $this->path = "/"; + } + } + + if (ini_get("magic_quotes_gpc")) { + $this->path = stripslashes($this->path); + } + + + // identify ourselves + if (empty($this->dav_powered_by)) { + header("X-Dav-Powered-By: PHP class: ".get_class($this)); + } else { + header("X-Dav-Powered-By: ".$this->dav_powered_by); + } + + // check authentication + // for the motivation for not checking OPTIONS requests on / see + // http://pear.php.net/bugs/bug.php?id=5363 + if ( ( !(($this->_SERVER['REQUEST_METHOD'] == 'OPTIONS') && ($this->path == "/"))) + && (!$this->_check_auth())) { + // RFC2518 says we must use Digest instead of Basic + // but Microsoft Clients do not support Digest + // and we don't support NTLM and Kerberos + // so we are stuck with Basic here + header('WWW-Authenticate: Basic realm="'.($this->http_auth_realm).'"'); + + // Windows seems to require this being the last header sent + // (changed according to PECL bug #3138) + $this->http_status('401 Unauthorized'); + + return; + } + + // check + if (! $this->_check_if_header_conditions()) { + return; + } + + // detect requested method names + $method = strtolower($this->_SERVER["REQUEST_METHOD"]); + $wrapper = "http_".$method; + + // activate HEAD emulation by GET if no HEAD method found + if ($method == "head" && !method_exists($this, "head")) { + $method = "get"; + } + + if (method_exists($this, $wrapper) && ($method == "options" || method_exists($this, $method))) { + $this->$wrapper(); // call method by name + } else { // method not found/implemented + if ($this->_SERVER["REQUEST_METHOD"] == "LOCK") { + $error = '412 Precondition failed'; + ; + } else { + $error = '405 Method not allowed'; + header("Allow: ".join(", ", $this->_allow())); // tell client what's allowed + } + $this->http_status($error); + echo "Error $error\n"; + echo "

$error

\n"; + echo "The requested could not by handled by this server.\n"; + echo '(URI ' . $this->_SERVER['REQUEST_URI'] . ")
\n
\n"; + echo "\n"; + } + } + + // }}} + + // {{{ abstract WebDAV methods + + // {{{ GET() + /** + * GET implementation + * + * overload this method to retrieve resources from your server + *
+ * + * + * @abstract + * @param array &$params Array of input and output parameters + *
input
    + *
  • path - + *
+ *
output
    + *
  • size - + *
+ * @returns int HTTP-Statuscode + */ + + /* abstract + function GET(&$params) + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ PUT() + /** + * PUT implementation + * + * PUT implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function PUT() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ COPY() + + /** + * COPY implementation + * + * COPY implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function COPY() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ MOVE() + + /** + * MOVE implementation + * + * MOVE implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function MOVE() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ DELETE() + + /** + * DELETE implementation + * + * DELETE implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function DELETE() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ PROPFIND() + + /** + * PROPFIND implementation + * + * PROPFIND implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function PROPFIND() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ PROPPATCH() + + /** + * PROPPATCH implementation + * + * PROPPATCH implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function PROPPATCH() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ LOCK() + + /** + * LOCK implementation + * + * LOCK implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function LOCK() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ UNLOCK() + + /** + * UNLOCK implementation + * + * UNLOCK implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function UNLOCK() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ ACL() + + /** + * ACL implementation + * + * ACL implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function ACL() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // }}} + + // {{{ other abstract methods + + // {{{ check_auth() + + /** + * check authentication + * + * overload this method to retrieve and confirm authentication information + * + * @abstract + * @param string type Authentication type, e.g. "basic" or "digest" + * @param string username Transmitted username + * @param string passwort Transmitted password + * @returns bool Authentication status + */ + + /* abstract + function checkAuth($type, $username, $password) + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ checklock() + + /** + * check lock status for a resource + * + * overload this method to return shared and exclusive locks + * active for this resource + * + * @abstract + * @param string resource Resource path to check + * @returns array An array of lock entries each consisting + * of 'type' ('shared'/'exclusive'), 'token' and 'timeout' + */ + + /* abstract + function checklock($resource) + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // }}} + + // {{{ WebDAV HTTP method wrappers + + // {{{ http_OPTIONS() + + /** + * OPTIONS method handler + * + * The OPTIONS method handler creates a valid OPTIONS reply + * including Dav: and Allowed: heaers + * based on the implemented methods found in the actual instance + * + * @param void + * @return void + */ + function http_OPTIONS() + { + // Microsoft clients default to the Frontpage protocol + // unless we tell them to use WebDAV + header("MS-Author-Via: DAV"); + + // get allowed methods + $allow = $this->_allow(); + + // dav header + $dav = array(1); // assume we are always dav class 1 compliant + if (isset($allow['LOCK'])) { + $dav[] = 2; // dav class 2 requires that locking is supported + } + + // allow extending class to modify DAV and Allow headers + if (method_exists($this,'OPTIONS')) { + $this->OPTIONS($this->path,$dav,$allow); + } + + // tell clients what we found + $this->http_status("200 OK"); + header("DAV: " .join(", ", $dav)); + header("Allow: ".join(", ", $allow)); + + header("Content-length: 0"); + } + + // }}} + + + // {{{ http_PROPFIND() + + /** + * PROPFIND method handler + * + * @param string $handler='PROPFIND' allows to use method eg. for CalDAV REPORT + * @return void + */ + function http_PROPFIND($handler='PROPFIND') + { + $options = Array(); + $files = Array(); + + $options["path"] = $this->path; + + // search depth from header (default is "infinity) + if (isset($this->_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $this->_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + // analyze request payload + $propinfo = new _parse_propfind("php://input"); + if (!$propinfo->success) { + $this->http_status("400 Error"); + return; + } + $options['root'] = $propinfo->root; + $options['props'] = $propinfo->props; + if ($propinfo->filters) + $options['filters'] = $propinfo->filters; + if ($propinfo->other) + $options['other'] = $propinfo->other; + + // call user handler + if (!($retval =$this->$handler($options, $files))) { + $files = array("files" => array()); + if (method_exists($this, "checkLock")) { + // is locked? + $lock = $this->checkLock($this->path); + + if (is_array($lock) && count($lock)) { + $created = isset($lock['created']) ? $lock['created'] : time(); + $modified = isset($lock['modified']) ? $lock['modified'] : time(); + $files['files'][] = array("path" => $this->_slashify($this->path), + "props" => array($this->mkprop("displayname", $this->path), + $this->mkprop("creationdate", $created), + $this->mkprop("getlastmodified", $modified), + $this->mkprop("resourcetype", ""), + $this->mkprop("getcontenttype", ""), + $this->mkprop("getcontentlength", 0)) + ); + } + } + + if (empty($files['files'])) { + $this->http_status("404 Not Found"); + return; + } + } + + // now we generate the reply header ... + if ($retval === true) + { + $this->http_status('207 Multi-Status'); + } + elseif (is_string($retval)) + { + $this->http_status($retval); + header('Content-Type: text/html'); + echo "Error $retval\n"; + echo "

$retval

\n"; + switch (substr($retval, 0 ,3)) + { + case '501': // Not Implemented + echo "The requested feature is not (yet) supported by this server.\n"; + break; + default: + echo "The request could not be handled by this server.\n"; + } + echo '(URI ' . $this->_SERVER['REQUEST_URI'] . ")
\n
\n"; + echo "\n"; + return; + } + // dav header + $dav = array(1); // assume we are always dav class 1 compliant + $allow = false; + + // allow extending class to modify DAV + if (method_exists($this,'OPTIONS')) { + $this->OPTIONS($this->path,$dav,$allow); + } + header("DAV: " .join(", ", $dav)); + header('Content-Type: text/xml; charset="utf-8"'); + + // ... and payload + echo "\n"; + echo $this->crrnd ? "\n" : "\n"; + + // using an ArrayIterator to prevent foreach from copying the array, + // as we cant loop by reference, when an iterator is given in $files['files'] + if (is_array($files['files'])) + { + $files['files'] = new ArrayIterator($files['files']); + } + // now we loop over all returned file entries + foreach ($files['files'] as $file) { + + // collect namespaces here + $ns_hash = array('DAV:' => 'D'); + + // Microsoft Clients need this special namespace for date and time values + $ns_defs = 'xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/"'; + + // nothing to do if no properties were returend for a file + if (isset($file["props"]) && is_array($file["props"])) { + + // now loop over all returned properties + foreach ($file["props"] as &$prop) { + // as a convenience feature we do not require that user handlers + // restrict returned properties to the requested ones + // here we strip all unrequested entries out of the response + + // this can happen if we have allprop and prop in one propfind: + // , eg. blah is not automatic returned by allprop + switch(is_array($options['props']) ? $options['props'][0] : $options['props']) { + case "all": + // nothing to remove + break; + + case "names": + // only the names of all existing properties were requested + // so we remove all values + unset($prop["val"]); + break; + + default: + $found = false; + + // search property name in requested properties + foreach ((array)$options["props"] as $reqprop) { + if ( $reqprop["name"] == $prop["name"] + && @$reqprop["xmlns"] == $prop["ns"]) { + $found = true; + break; + } + } + + // unset property and continue with next one if not found/requested + if (!$found) { + $prop=""; + continue(2); + } + break; + } + + // namespace handling + if (empty($prop["ns"])) continue; // no namespace + $ns = $prop["ns"]; + //if ($ns == "DAV:") continue; // default namespace + if (isset($ns_hash[$ns])) continue; // already known + + // register namespace + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$ns] = $ns_name; + $ns_defs .= " xmlns:$ns_name=\"$ns\""; + } + + // we also need to add empty entries for properties that were requested + // but for which no values where returned by the user handler + if (is_array($options['props'])) { + foreach ($options["props"] as $reqprop) { + if (!is_array($reqprop) || $reqprop['name']=="") continue; // skip empty entries, or 'all' if used together with + + $found = false; + + // check if property exists in result + foreach ($file["props"] as &$prop) { + if ( $reqprop["name"] == $prop["name"] + && @$reqprop["xmlns"] == $prop["ns"]) { + $found = true; + break; + } + } + + if (!$found) { + if ($reqprop["xmlns"]==="DAV:" && $reqprop["name"]==="lockdiscovery") { + // lockdiscovery is handled by the base class + $file["props"][] + = $this->mkprop("DAV:", + "lockdiscovery", + $this->lockdiscovery($file['path'])); + // only collect $file['noprops'] if we have NO Brief: t HTTP Header + } elseif (!isset($this->_SERVER['HTTP_BRIEF']) || $this->_SERVER['HTTP_BRIEF'] != 't') { + // add empty value for this property + $file["noprops"][] = + $this->mkprop($reqprop["xmlns"], $reqprop["name"], ""); + + // register property namespace if not known yet + if ($reqprop["xmlns"] != "DAV:" && !isset($ns_hash[$reqprop["xmlns"]])) { + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$reqprop["xmlns"]] = $ns_name; + $ns_defs .= " xmlns:$ns_name=\"$reqprop[xmlns]\""; + } + } + } + } + } + } + // ignore empty or incomplete entries + if (!is_array($file) || empty($file) || !isset($file["path"])) continue; + $path = $file['path']; + if (!is_string($path) || $path==="") continue; + + if ($this->crrnd) + { + echo " \n"; + } + else + { + echo " \n"; + } + + /* TODO right now the user implementation has to make sure + collections end in a slash, this should be done in here + by checking the resource attribute */ + // path needs to be urlencoded (only basic version of this class!) + $href = $this->_urlencode($this->_mergePathes($this->base_uri, $path)); + + if ($this->crrnd) + { + echo " $href\n"; + } + else + { + echo " $href\n"; + } + + // report all found properties and their values (if any) + if (isset($file["props"]) && is_array($file["props"])) { + echo ' <'.($this->crrnd?'':'D:')."propstat>\n"; + echo ' <'.($this->crrnd?'':'D:')."prop>\n"; + + foreach ($file["props"] as &$prop) { + + if (!is_array($prop)) continue; + if (!isset($prop["name"])) continue; + + if (!isset($prop["val"]) || $prop["val"] === "" || $prop["val"] === false) { + // empty properties (cannot use empty() for check as "0" is a legal value here) + if ($prop["ns"]=="DAV:") { + echo ' <'.($this->crrnd?'':'D:')."$prop[name]/>\n"; + } else if (!empty($prop["ns"])) { + echo " <".$ns_hash[$prop["ns"]].":$prop[name]/>\n"; + } else { + echo " <$prop[name] xmlns=\"\"/>"; + } + } else if ($prop["ns"] == "DAV:") { + // some WebDAV properties need special treatment + switch ($prop["name"]) { + case "creationdate": + echo ' <'.($this->crrnd?'':'D:')."creationdate ns0:dt=\"dateTime.tz\">" + . gmdate("Y-m-d\\TH:i:s\\Z", $prop['val']) + . 'crrnd?'':'D:')."creationdate>\n"; + break; + case "getlastmodified": + echo ' <'.($this->crrnd?'':'D:')."getlastmodified ns0:dt=\"dateTime.rfc1123\">" + . gmdate("D, d M Y H:i:s ", $prop['val']) + . "GMTcrrnd?'':'D:')."getlastmodified>\n"; + break; + case "supportedlock": + echo ' <'.($this->crrnd?'':'D:')."supportedlock>$prop[val]crrnd?'':'D:')."supportedlock>\n"; + break; + case "lockdiscovery": + echo ' <'.($this->crrnd?'':'D:')."lockdiscovery>\n"; + echo $prop["val"]; + echo ' crrnd?'':'D:')."lockdiscovery>\n"; + break; + default: + $ns_defs = ''; + if (is_array($prop['val'])) + { + $hns_hash = $ns_hash; + $val = $this->_hierarchical_prop_encode($prop['val'], 'DAV:', $ns_defs, $hns_hash); + } elseif (isset($prop['raw'])) { + $val = $this->_prop_encode(''); + } else { + $val = $this->_prop_encode(htmlspecialchars($prop['val'])); + } + echo ' <'.($this->crrnd?'':'D:')."$prop[name]$ns_defs>$val". + 'crrnd?'':'D:')."$prop[name]>\n"; + break; + } + } else { + // allow multiple values and attributes, required eg. for caldav:supported-calendar-component-set + if ($prop['ns'] && is_array($prop['val'])) { + if (!isset($ns_hash[$prop['ns']])) { + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$prop['ns']] = $ns_name; + } + $vals = $extra_ns = ''; + foreach($prop['val'] as $subprop) + { + if ($subprop['ns'] && $subprop['ns'] != 'DAV:') { + // register property namespace if not known yet + if (!isset($ns_hash[$subprop['ns']])) { + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$subprop['ns']] = $ns_name; + } else { + $ns_name = $ns_hash[$subprop['ns']]; + } + if (strchr($extra_ns,$extra=' xmlns:'.$ns_name.'="'.$subprop['ns'].'"') === false) { + $extra_ns .= $extra; + } + $ns_name .= ':'; + } elseif ($subprop['ns'] == 'DAV:') { + $ns_name = 'D:'; + } else { + $ns_name = ''; + } + $vals .= "<$ns_name$subprop[name]"; + if (is_array($subprop['val'])) // val contains only attributes, no value + { + foreach($subprop['val'] as $attr => $val) + { + $vals .= ' '.$attr.'="'.htmlspecialchars($val).'"'; + } + $vals .= '/>'; + } + else + { + $vals .= '>'; + if (isset($subprop['raw'])) { + $vals .= ''; + } else { + $vals .= htmlspecialchars($subprop['val']); + } + $vals .= ""; + } + } + echo ' <'.$ns_hash[$prop['ns']].":$prop[name]$extra_ns>$vals\n"; + } else { + if ($prop['raw']) + { + $val = ''; + } else { + $val = htmlspecialchars($prop['val']); + } + $val = $this->_prop_encode($val); + // properties from namespaces != "DAV:" or without any namespace + if ($prop['ns']) { + if ($this->crrnd) { + echo " <$prop[name] xmlns=".'"'.$prop["ns"].'">' + . $val . "\n"; + } else { + echo " <" . $ns_hash[$prop["ns"]] . ":$prop[name]>" + . $val . '\n"; + } + } else { + echo " <$prop[name] xmlns=\"\">$val\n"; + } + } + } + } + + if ($this->crrnd) + { + echo " \n"; + echo " HTTP/1.1 200 OK\n"; + echo " \n"; + } + else + { + echo " \n"; + echo " HTTP/1.1 200 OK\n"; + echo " \n"; + } + } + + // now report all properties requested but not found + if (isset($file["noprops"])) { + echo ' <'.($this->crrnd?'':'D:')."propstat>\n"; + echo ' <'.($this->crrnd?'':'D:')."prop>\n"; + + foreach ($file["noprops"] as &$prop) { + if ($prop["ns"] == "DAV:") { + echo ' <'.($this->crrnd?'':'D:')."$prop[name]/>\n"; + } else if ($prop["ns"] == "") { + echo " <$prop[name] xmlns=\"\"/>\n"; + } else { + echo " <" . $ns_hash[$prop["ns"]] . ":$prop[name]/>\n"; + } + } + + if ($this->crrnd) + { + echo " \n"; + echo " HTTP/1.1 404 Not Found\n"; + echo " \n"; + } + else + { + echo " \n"; + echo " HTTP/1.1 404 Not Found\n"; + echo " \n"; + } + } + + echo ' crrnd?'':'D:')."response>\n"; + } + + echo 'crrnd?'':'D:')."multistatus>\n"; + } + + + // }}} + + // {{{ http_PROPPATCH() + + /** + * PROPPATCH method handler + * + * @param void + * @return void + */ + function http_PROPPATCH() + { + if ($this->_check_lock_status($this->path)) { + $options = Array(); + + $options["path"] = $this->path; + + $propinfo = new _parse_proppatch("php://input"); + + if (!$propinfo->success) { + $this->http_status("400 Error"); + return; + } + + $options['props'] = $propinfo->props; + + $responsedescr = $this->PROPPATCH($options); + + $this->http_status("207 Multi-Status"); + header('Content-Type: text/xml; charset="utf-8"'); + + echo "\n"; + + echo "\n"; + echo ' <'.($this->crrnd?'':'D:')."response>\n"; + echo ' <'.($this->crrnd?'':'D:')."href>".$this->_urlencode($this->_mergePathes($this->_SERVER["SCRIPT_NAME"], $this->path)).'crrnd?'':'D:')."href>\n"; + + foreach ($options["props"] as $prop) { + echo ' <'.($this->crrnd?'':'D:')."propstat>\n"; + echo ' <'.($this->crrnd?'':'D:')."prop><$prop[name] xmlns=\"$prop[ns]\"/>crrnd?'':'D:')."prop>\n"; + echo ' <'.($this->crrnd?'':'D:')."status>HTTP/1.1 $prop[status]crrnd?'':'D:')."status>\n"; + echo ' crrnd?'':'D:')."propstat>\n"; + } + + if ($responsedescr) { + echo ' <'.($this->crrnd?'':'D:')."responsedescription>". + $this->_prop_encode(htmlspecialchars($responsedescr)). + 'crrnd?'':'D:')."responsedescription>\n"; + } + + echo ' crrnd?'':'D:')."response>\n"; + echo 'crrnd?'':'D:')."multistatus>\n"; + } else { + $this->http_status("423 Locked"); + } + } + + // }}} + + + // {{{ http_MKCOL() + + /** + * MKCOL method handler + * + * @param void + * @return void + */ + function http_MKCOL() + { + $options = Array(); + + $options["path"] = $this->path; + + $stat = $this->MKCOL($options); + + $this->http_status($stat); + } + + // }}} + + + // {{{ http_GET() + + /** + * GET method handler + * + * @param void + * @return void + */ + function http_GET() + { + // TODO check for invalid stream + $options = Array(); + $options["path"] = $this->path; + + $this->_get_ranges($options); + + if (true === ($status = $this->GET($options))) { + if (!headers_sent()) { + $status = "200 OK"; + + if (!isset($options['mimetype'])) { + $options['mimetype'] = "application/octet-stream"; + } + // switching off zlib.output_compression for everything but text files, + // as the double compression of zip files makes problems eg. with lighttpd + // and anyway little sense with with other content like pictures + if (substr($options['mimetype'],0,5) != 'text/') + { + ini_set('zlib.output_compression',0); + } + header("Content-type: $options[mimetype]"); + + if (isset($options['mtime'])) { + header("Last-modified:".gmdate("D, d M Y H:i:s ", $options['mtime'])."GMT"); + } + // fix for IE and https, thanks to rob_burcham@yahoo.com + // see http://us3.php.net/manual/en/function.header.php#83219 + // and http://support.microsoft.com/kb/812935 + header("Cache-Control: maxage=1"); //In seconds + header("Pragma: public"); + + if (isset($options['stream'])) { + // GET handler returned a stream + if (!empty($options['ranges']) && (0===fseek($options['stream'], 0, SEEK_SET))) { + // partial request and stream is seekable + + if (count($options['ranges']) === 1) { + $range = $options['ranges'][0]; + + if (isset($range['start'])) { + fseek($options['stream'], $range['start'], SEEK_SET); + if (feof($options['stream'])) { + $this->http_status("416 Requested range not satisfiable"); + return; + } + + if (isset($range['end'])) { + $size = $range['end']-$range['start']+1; + $this->http_status("206 partial"); + header("Content-length: $size"); + header("Content-range: $range[start]-$range[end]/" + . (isset($options['size']) ? $options['size'] : "*")); + while ($size && !feof($options['stream'])) { + $buffer = fread($options['stream'], 4096); + $size -= $this->bytes($buffer); + echo $buffer; + } + } else { + $this->http_status("206 partial"); + if (isset($options['size'])) { + header("Content-length: ".($options['size'] - $range['start'])); + header("Content-range: ".$range['start']."-".$range['end']."/" + . (isset($options['size']) ? $options['size'] : "*")); + } + fpassthru($options['stream']); + } + } else { + header("Content-length: ".$range['last']); + fseek($options['stream'], -$range['last'], SEEK_END); + fpassthru($options['stream']); + } + } else { + $this->_multipart_byterange_header(); // init multipart + foreach ($options['ranges'] as $range) { + // TODO what if size unknown? 500? + if (isset($range['start'])) { + $from = $range['start']; + $to = !empty($range['end']) ? $range['end'] : $options['size']-1; + } else { + $from = $options['size'] - $range['last']-1; + $to = $options['size'] -1; + } + $total = isset($options['size']) ? $options['size'] : "*"; + $size = $to - $from + 1; + $this->_multipart_byterange_header($options['mimetype'], $from, $to, $total); + + + fseek($options['stream'], $from, SEEK_SET); + while ($size && !feof($options['stream'])) { + $buffer = fread($options['stream'], 4096); + $size -= $this->bytes($buffer); + echo $buffer; + } + } + $this->_multipart_byterange_header(); // end multipart + } + } else { + // normal request or stream isn't seekable, return full content + if (isset($options['size'])) { + header("Content-length: ".$options['size']); + } + fpassthru($options['stream']); + return; // no more headers + } + } elseif (isset($options['data'])) { + if (is_array($options['data'])) { + // reply to partial request + } else { + header("Content-length: ".$this->bytes($options['data'])); + echo $options['data']; + } + } + } + } + + if (!headers_sent()) { + if (false === $status) { + $this->http_status("404 not found"); + } else { + // TODO: check setting of headers in various code pathes above + $this->http_status("$status"); + } + } + } + + + /** + * parse HTTP Range: header + * + * @param array options array to store result in + * @return void + */ + function _get_ranges(&$options) + { + // process Range: header if present + if (isset($this->_SERVER['HTTP_RANGE'])) { + + // we only support standard "bytes" range specifications for now + if (preg_match('/bytes\s*=\s*(.+)/', $this->_SERVER['HTTP_RANGE'], $matches)) { + $options["ranges"] = array(); + + // ranges are comma separated + foreach (explode(",", $matches[1]) as $range) { + // ranges are either from-to pairs or just end positions + list($start, $end) = explode("-", $range); + $options["ranges"][] = ($start==="") + ? array("last"=>$end) + : array("start"=>$start, "end"=>$end); + } + } + } + } + + /** + * generate separator headers for multipart response + * + * first and last call happen without parameters to generate + * the initial header and closing sequence, all calls inbetween + * require content mimetype, start and end byte position and + * optionaly the total byte length of the requested resource + * + * @param string mimetype + * @param int start byte position + * @param int end byte position + * @param int total resource byte size + */ + function _multipart_byterange_header($mimetype = false, $from = false, $to=false, $total=false) + { + if ($mimetype === false) { + if (!isset($this->multipart_separator)) { + // initial + + // a little naive, this sequence *might* be part of the content + // but it's really not likely and rather expensive to check + $this->multipart_separator = "SEPARATOR_".md5(microtime()); + + // generate HTTP header + header("Content-type: multipart/byteranges; boundary=".$this->multipart_separator); + } else { + // final + + // generate closing multipart sequence + echo "\n--{$this->multipart_separator}--"; + } + } else { + // generate separator and header for next part + echo "\n--{$this->multipart_separator}\n"; + echo "Content-type: $mimetype\n"; + echo "Content-range: $from-$to/". ($total === false ? "*" : $total); + echo "\n\n"; + } + } + + + + // }}} + + // {{{ http_HEAD() + + /** + * HEAD method handler + * + * @param void + * @return void + */ + function http_HEAD() + { + $status = false; + $options = Array(); + $options["path"] = $this->path; + + if (method_exists($this, "HEAD")) { + $status = $this->head($options); + } else if (method_exists($this, "GET")) { + ob_start(); + $status = $this->GET($options); + if (!isset($options['size'])) { + $options['size'] = ob_get_length(); + } + ob_end_clean(); + } + + if (!isset($options['mimetype'])) { + $options['mimetype'] = "application/octet-stream"; + } + header("Content-type: $options[mimetype]"); + + if (isset($options['mtime'])) { + header("Last-modified:".gmdate("D, d M Y H:i:s ", $options['mtime'])."GMT"); + } + + if (isset($options['size'])) { + header("Content-length: ".$options['size']); + } + + if ($status === true) $status = "200 OK"; + if ($status === false) $status = "404 Not found"; + + $this->http_status($status); + } + + // }}} + + // {{{ http_POST() + + /** + * POST method handler + * + * @param void + * @return void + */ + function http_POST() + { + $status = '405 Method not allowed'; + $options = Array(); + $options['path'] = $this->path; + + error_log('WebDAV POST: ' . $this->path); + + if (isset($this->_SERVER['CONTENT_LENGTH'])) + { + $options['content_length'] = $this->_SERVER['CONTENT_LENGTH']; + } + elseif (isset($this->_SERVER['X-Expected-Entity-Length'])) + { + // MacOS gives us that hint + $options['content_length'] = $this->_SERVER['X-Expected-Entity-Length']; + } + + // get the Content-type + if (isset($this->_SERVER["CONTENT_TYPE"])) { + // for now we do not support any sort of multipart requests + if (!strncmp($this->_SERVER["CONTENT_TYPE"], 'multipart/', 10)) { + $this->http_status('501 not implemented'); + echo 'The service does not support mulipart POST requests'; + return; + } + $options['content_type'] = $this->_SERVER['CONTENT_TYPE']; + } else { + // default content type if none given + $options['content_type'] = 'application/octet-stream'; + } + + /* RFC 2616 2.6 says: "The recipient of the entity MUST NOT + ignore any Content-* (e.g. Content-Range) headers that it + does not understand or implement and MUST return a 501 + (Not Implemented) response in such cases." + */ + foreach ($this->_SERVER as $key => $val) { + if (strncmp($key, 'HTTP_CONTENT', 11)) continue; + switch ($key) { + case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11 + // TODO support this if ext/zlib filters are available + $this->http_status('501 not implemented'); + echo "The service does not support '$val' content encoding"; + return; + + case 'HTTP_CONTENT_LANGUAGE': // RFC 2616 14.12 + // we assume it is not critical if this one is ignored + // in the actual POST implementation ... + $options['content_language'] = $val; + break; + + case 'HTTP_CONTENT_LENGTH': + // defined on IIS and has the same value as CONTENT_LENGTH + break; + + case 'HTTP_CONTENT_LOCATION': // RFC 2616 14.14 + /* The meaning of the Content-Location header in PUT + or POST requests is undefined; servers are free + to ignore it in those cases. */ + break; + + case 'HTTP_CONTENT_RANGE': // RFC 2616 14.16 + // single byte range requests are supported + // the header format is also specified in RFC 2616 14.16 + // TODO we have to ensure that implementations support this or send 501 instead + if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $val, $matches)) { + $this->http_status('400 bad request'); + echo 'The service does only support single byte ranges'; + return; + } + + $range = array('start'=>$matches[1], 'end'=>$matches[2]); + if (is_numeric($matches[3])) { + $range['total_length'] = $matches[3]; + } + $option['ranges'][] = $range; + + // TODO make sure the implementation supports partial POST + // this has to be done in advance to avoid data being overwritten + // on implementations that do not support this ... + break; + + case 'HTTP_CONTENT_TYPE': + // defined on IIS and has the same value as CONTENT_TYPE + break; + + case 'HTTP_CONTENT_MD5': // RFC 2616 14.15 + // TODO: maybe we can just pretend here? + $this->http_status('501 not implemented'); + echo 'The service does not support content MD5 checksum verification'; + return; + + default: + // any other unknown Content-* headers + $this->http_status('501 not implemented'); + echo "The service does not support '$key'"; + return; + } + } + + $options['stream'] = fopen('php://input', 'r'); + + if (method_exists($this, 'POST')) { + $status = $this->POST($options); + + if ($status === false) { + $status = '400 Something went wrong'; + } else if ($status === true) { + $status = '200 OK'; + } else if (is_resource($status) && get_resource_type($status) == 'stream') { + $stream = $status; + + $status = empty($options['new']) ? '200 OK' : '201 Created'; + + if (!empty($options['ranges'])) { + // TODO multipart support is missing (see also above) + if (0 == fseek($stream, $range[0]['start'], SEEK_SET)) { + $length = $range[0]['end']-$range[0]['start']+1; + if (!fwrite($stream, fread($options['stream'], $length))) { + $status = '403 Forbidden'; + } + } else { + $status = '403 Forbidden'; + } + } else { + while (!feof($options['stream'])) { + if (false === fwrite($stream, fread($options['stream'], 4096))) { + $status = '403 Forbidden'; + break; + } + } + } + fclose($stream); + } + } + $this->http_status($status); + } + + // }}} + + // {{{ http_PUT() + + /** + * PUT method handler + * + * @param void + * @return void + */ + function http_PUT() + { + if ($this->_check_lock_status($this->path)) { + $options = Array(); + $options["path"] = $this->path; + + if (isset($this->_SERVER['CONTENT_LENGTH'])) + { + $options['content_length'] = $this->_SERVER['CONTENT_LENGTH']; + } + elseif (isset($this->_SERVER['X-Expected-Entity-Length'])) + { + // MacOS gives us that hint + $options['content_length'] = $this->_SERVER['X-Expected-Entity-Length']; + } + + // get the Content-type + if (isset($this->_SERVER["CONTENT_TYPE"])) { + // for now we do not support any sort of multipart requests + if (!strncmp($this->_SERVER["CONTENT_TYPE"], "multipart/", 10)) { + $this->http_status("501 not implemented"); + echo "The service does not support mulipart PUT requests"; + return; + } + $options["content_type"] = $this->_SERVER["CONTENT_TYPE"]; + } else { + // default content type if none given + $options["content_type"] = "application/octet-stream"; + } + + /* RFC 2616 2.6 says: "The recipient of the entity MUST NOT + ignore any Content-* (e.g. Content-Range) headers that it + does not understand or implement and MUST return a 501 + (Not Implemented) response in such cases." + */ + foreach ($this->_SERVER as $key => $val) { + if (strncmp($key, "HTTP_CONTENT", 11)) continue; + switch ($key) { + case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11 + // TODO support this if ext/zlib filters are available + $this->http_status("501 not implemented"); + echo "The service does not support '$val' content encoding"; + return; + + case 'HTTP_CONTENT_LANGUAGE': // RFC 2616 14.12 + // we assume it is not critical if this one is ignored + // in the actual PUT implementation ... + $options["content_language"] = $val; + break; + + case 'HTTP_CONTENT_LENGTH': + // defined on IIS and has the same value as CONTENT_LENGTH + break; + + case 'HTTP_CONTENT_LOCATION': // RFC 2616 14.14 + /* The meaning of the Content-Location header in PUT + or POST requests is undefined; servers are free + to ignore it in those cases. */ + break; + + case 'HTTP_CONTENT_RANGE': // RFC 2616 14.16 + // single byte range requests are supported + // the header format is also specified in RFC 2616 14.16 + // TODO we have to ensure that implementations support this or send 501 instead + if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $val, $matches)) { + $this->http_status("400 bad request"); + echo "The service does only support single byte ranges"; + return; + } + + $range = array("start"=>$matches[1], "end"=>$matches[2]); + if (is_numeric($matches[3])) { + $range["total_length"] = $matches[3]; + } + $option["ranges"][] = $range; + + // TODO make sure the implementation supports partial PUT + // this has to be done in advance to avoid data being overwritten + // on implementations that do not support this ... + break; + + case 'HTTP_CONTENT_TYPE': + // defined on IIS and has the same value as CONTENT_TYPE + break; + + case 'HTTP_CONTENT_MD5': // RFC 2616 14.15 + // TODO: maybe we can just pretend here? + $this->http_status("501 not implemented"); + echo "The service does not support content MD5 checksum verification"; + return; + + default: + // any other unknown Content-* headers + $this->http_status("501 not implemented"); + echo "The service does not support '$key'"; + return; + } + } + + $options["stream"] = fopen("php://input", "r"); + + $stat = $this->PUT($options); + + if ($stat === false) { + $stat = "403 Forbidden"; + } else if (is_resource($stat) && get_resource_type($stat) == "stream") { + $stream = $stat; + + $stat = $options["new"] ? "201 Created" : "204 No Content"; + + if (!empty($options["ranges"])) { + // TODO multipart support is missing (see also above) + if (0 == fseek($stream, $range[0]["start"], SEEK_SET)) { + $length = $range[0]["end"]-$range[0]["start"]+1; + if (!fwrite($stream, fread($options["stream"], $length))) { + $stat = "403 Forbidden"; + } + } else { + $stat = "403 Forbidden"; + } + } else { + while (!feof($options["stream"])) { + if (false === fwrite($stream, fread($options["stream"], 4096))) { + $stat = "403 Forbidden"; + break; + } + } + } + + fclose($stream); + } + + $this->http_status($stat); + } else { + $this->http_status("423 Locked"); + } + } + + // }}} + + + // {{{ http_DELETE() + + /** + * DELETE method handler + * + * @param void + * @return void + */ + function http_DELETE() + { + // check RFC 2518 Section 9.2, last paragraph + if (isset($this->_SERVER["HTTP_DEPTH"])) { + if ($this->_SERVER["HTTP_DEPTH"] != "infinity") { + if (stripos($_SERVER['HTTP_USER_AGENT'],'webdrive') !== false) + { + // pretend we didnt see it, as webdrive does not handle the depth parameter correctly while deleting collections + } + else + { + $this->http_status("400 Bad Request"); + return; + } + } + } + + // check lock status + if ($this->_check_lock_status($this->path)) { + // ok, proceed + $options = Array(); + $options["path"] = $this->path; + + $stat = $this->DELETE($options); + + $this->http_status($stat); + } else { + // sorry, its locked + $this->http_status("423 Locked"); + } + } + + // }}} + + // {{{ http_COPY() + + /** + * COPY method handler + * + * @param void + * @return void + */ + function http_COPY() + { + // no need to check source lock status here + // destination lock status is always checked by the helper method + $this->_copymove("copy"); + } + + // }}} + + // {{{ http_MOVE() + + /** + * MOVE method handler + * + * @param void + * @return void + */ + function http_MOVE() + { + if ($this->_check_lock_status($this->path)) { + // destination lock status is always checked by the helper method + $this->_copymove("move"); + } else { + $this->http_status("423 Locked"); + } + } + + // }}} + + + // {{{ http_LOCK() + + /** + * LOCK method handler + * + * @param void + * @return void + */ + function http_LOCK() + { + $options = Array(); + $options["path"] = $this->path; + + if (isset($this->_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $this->_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + if (isset($this->_SERVER["HTTP_TIMEOUT"])) { + $options["timeout"] = explode(",", $this->_SERVER["HTTP_TIMEOUT"]); + } + + if (empty($this->_SERVER['CONTENT_LENGTH']) && !empty($this->_SERVER['HTTP_IF'])) { + // check if locking is possible + if (!$this->_check_lock_status($this->path)) { + $this->http_status("423 Locked"); + return; + } + + // refresh lock + $options["locktoken"] = substr($this->_SERVER['HTTP_IF'], 2, -2); + $options["update"] = $options["locktoken"]; + + // setting defaults for required fields, LOCK() SHOULD overwrite these + $options['owner'] = "unknown"; + $options['scope'] = "exclusive"; + $options['type'] = "write"; + + + $stat = $this->LOCK($options); + } else { + // extract lock request information from request XML payload + $lockinfo = new _parse_lockinfo("php://input"); + if (!$lockinfo->success) { + $this->http_status("400 bad request"); + } + + // check if locking is possible + if (!$this->_check_lock_status($this->path, $lockinfo->lockscope === "shared")) { + $this->http_status("423 Locked"); + return; + } + + // new lock + $options["scope"] = $lockinfo->lockscope; + $options["type"] = $lockinfo->locktype; + // Todo: lockinfo::owner still contains D:href opening and closing tags, maybe they should be removed here with strip_tags + $options["owner"] = $lockinfo->owner; + $options["locktoken"] = $this->_new_locktoken(); + + $stat = $this->LOCK($options); + } + + if (is_bool($stat)) { + $http_stat = $stat ? "200 OK" : "423 Locked"; + } else { + $http_stat = $stat; + } + $this->http_status($http_stat); + + if ($http_stat{0} == 2) { // 2xx states are ok + if ($options["timeout"]) { + if (is_numeric($options["timeout"])) + { + // more than a million is considered an absolute timestamp + // less is more likely a relative value + if ($options["timeout"]>1000000) { + $timeout = "Second-".($options['timeout']-time()); + } else { + $timeout = "Second-$options[timeout]"; + } + } + else + { + $timeout = $options[timeout]; + } + } else { + $timeout = "Infinite"; + } + + header('Content-Type: text/xml; charset="utf-8"'); + header("Lock-Token: <$options[locktoken]>"); + echo "\n"; + echo "\n"; + echo ' <'.($this->crrnd?'':'D:')."lockdiscovery>\n"; + echo ' <'.($this->crrnd?'':'D:')."activelock>\n"; + echo ' <'.($this->crrnd?'':'D:')."lockscope>crrnd?'':'D:')."lockscope>\n"; + echo ' <'.($this->crrnd?'':'D:')."locktype>crrnd?'':'D:')."locktype>\n"; + echo ' <'.($this->crrnd?'':'D:')."depth>$options[depth]crrnd?'':'D:')."depth>\n"; + echo ' <'.($this->crrnd?'':'D:')."owner>$options[owner]crrnd?'':'D:')."owner>\n"; + echo ' <'.($this->crrnd?'':'D:')."timeout>$timeoutcrrnd?'':'D:')."timeout>\n"; + echo ' <'.($this->crrnd?'':'D:')."locktoken>$options[locktoken]crrnd?'':'D:')."locktoken>\n"; + echo ' crrnd?'':'D:')."activelock>\n"; + echo ' crrnd?'':'D:')."lockdiscovery>\n"; + echo 'crrnd?'':'D:')."prop>\n\n"; + } + } + + + // }}} + + // {{{ http_UNLOCK() + + /** + * UNLOCK method handler + * + * @param void + * @return void + */ + function http_UNLOCK() + { + $options = Array(); + $options["path"] = $this->path; + + if (isset($this->_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $this->_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + // strip surrounding <> + $options["token"] = substr(trim($this->_SERVER["HTTP_LOCK_TOKEN"]), 1, -1); + + // call user method + $stat = $this->UNLOCK($options); + + $this->http_status($stat); + } + + // }}} + + // {{{ http_ACL() + + /** + * ACL method handler + * + * @param void + * @return void + */ + function http_ACL() + { + $options = Array(); + $options['path'] = $this->path; + $options['errors'] = array(); + + if (isset($this->_SERVER['HTTP_DEPTH'])) { + $options['depth'] = $this->_SERVER['HTTP_DEPTH']; + } else { + $options['depth'] = 'infinity'; + } + + // call user method + $status = $this->ACL($options); + + // now we generate the reply header ... + $this->http_status($status); + $content = ''; + + if (is_array($options['errors']) && count($options['errors'])) { + header('Content-Type: text/xml; charset="utf-8"'); + // ... and payload + $content .= "\n"; + $content .= " \n"; + foreach ($options['errors'] as $violation) { + $content .= '<'.($this->crrnd?'':'D:')."$violation/>\n"; + } + $content .= 'crrnd?'':'D:')."error>\n"; + } + header("Content-length: ".$this->bytes($content)); + if ($content) echo $options['content']; + } + + // }}} + + // }}} + + // {{{ _copymove() + + function _copymove($what) + { + $options = Array(); + $options["path"] = $this->path; + + if (isset($this->_SERVER["HTTP_DEPTH"])) { + $options["depth"] = $this->_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + extract(parse_url($this->_SERVER["HTTP_DESTINATION"])); + $path = urldecode($path); + $http_host = $host; + if (isset($port) && $port != 80) + $http_host.= ":$port"; + + $http_header_host = preg_replace("/:80$/", "", $this->_SERVER["HTTP_HOST"]); + + if ($http_host == $http_header_host && + !strncmp($this->_SERVER["SCRIPT_NAME"], $path, + strlen($this->_SERVER["SCRIPT_NAME"]))) { + $options["dest"] = substr($path, strlen($this->_SERVER["SCRIPT_NAME"])); + if (!$this->_check_lock_status($options["dest"])) { + $this->http_status("423 Locked"); + return; + } + + } else { + $options["dest_url"] = $this->_SERVER["HTTP_DESTINATION"]; + } + + // see RFC 2518 Sections 9.6, 8.8.4 and 8.9.3 + if (isset($this->_SERVER["HTTP_OVERWRITE"])) { + $options["overwrite"] = $this->_SERVER["HTTP_OVERWRITE"] == "T"; + } else { + $options["overwrite"] = true; + } + + $stat = $this->$what($options); + $this->http_status($stat); + } + + // }}} + + // {{{ _allow() + + /** + * check for implemented HTTP methods + * + * @param void + * @return array something + */ + function _allow() + { + // OPTIONS is always there + $allow = array("OPTIONS" =>"OPTIONS"); + + // all other METHODS need both a http_method() wrapper + // and a method() implementation + // the base class supplies wrappers only + foreach (get_class_methods($this) as $method) { + if (!strncmp("http_", $method, 5)) { + $method = strtoupper(substr($method, 5)); + if (method_exists($this, $method)) { + $allow[$method] = $method; + } + } + } + + // we can emulate a missing HEAD implemetation using GET + if (isset($allow["GET"])) + $allow["HEAD"] = "HEAD"; + + // no LOCK without checklok() + if (!method_exists($this, "checklock")) { + unset($allow["LOCK"]); + unset($allow["UNLOCK"]); + } + + return $allow; + } + + // }}} + + /** + * helper for property element creation + * + * @param string XML namespace (optional) + * @param string property name + * @param string property value + * @praram boolen property raw-flag + * @return array property array + */ + function mkprop() + { + $args = func_get_args(); + switch (count($args)) { + case 4: + return array('ns' => $args[0], + 'name' => $args[1], + 'val' => $args[2], + 'raw' => true); + case 3: + return array('ns' => $args[0], + 'name' => $args[1], + 'val' => $args[2]); + default: + return array('ns' => 'DAV:', + 'name' => $args[0], + 'val' => $args[1]); + } + } + + // {{{ _check_auth + + /** + * check authentication if check is implemented + * + * @param void + * @return bool true if authentication succeded or not necessary + */ + function _check_auth() + { + if (method_exists($this, "checkAuth")) { + // PEAR style method name + return $this->checkAuth(@$this->_SERVER["AUTH_TYPE"], + @$this->_SERVER["PHP_AUTH_USER"], + @$this->_SERVER["PHP_AUTH_PW"]); + } else if (method_exists($this, "check_auth")) { + // old (pre 1.0) method name + return $this->check_auth(@$this->_SERVER["AUTH_TYPE"], + @$this->_SERVER["PHP_AUTH_USER"], + @$this->_SERVER["PHP_AUTH_PW"]); + } else { + // no method found -> no authentication required + return true; + } + } + + // }}} + + // {{{ UUID stuff + + /** + * generate Unique Universal IDentifier for lock token + * + * @param void + * @return string a new UUID + */ + function _new_uuid() + { + // use uuid extension from PECL if available + if (function_exists("uuid_create")) { + return uuid_create(); + } + + // fallback + $uuid = md5(microtime().getmypid()); // this should be random enough for now + + // set variant and version fields for 'true' random uuid + $uuid{12} = "4"; + $n = 8 + (ord($uuid{16}) & 3); + $hex = "0123456789abcdef"; + $uuid{16} = $hex{$n}; + + // return formated uuid + return substr($uuid, 0, 8)."-" + . substr($uuid, 8, 4)."-" + . substr($uuid, 12, 4)."-" + . substr($uuid, 16, 4)."-" + . substr($uuid, 20); + } + + /** + * create a new opaque lock token as defined in RFC2518 + * + * @param void + * @return string new RFC2518 opaque lock token + */ + function _new_locktoken() + { + return "opaquelocktoken:".HTTP_WebDAV_Server::_new_uuid(); + } + + // }}} + + // {{{ WebDAV If: header parsing + + /** + * + * + * @param string header string to parse + * @param int current parsing position + * @return array next token (type and value) + */ + function _if_header_lexer($string, &$pos) + { + // skip whitespace + while (ctype_space($string{$pos})) { + ++$pos; + } + + // already at end of string? + if (strlen($string) <= $pos) { + return false; + } + + // get next character + $c = $string{$pos++}; + + // now it depends on what we found + switch ($c) { + case "<": + // URIs are enclosed in <...> + $pos2 = strpos($string, ">", $pos); + $uri = substr($string, $pos, $pos2 - $pos); + $pos = $pos2 + 1; + return array("URI", $uri); + + case "[": + //Etags are enclosed in [...] + if ($string{$pos} == "W") { + $type = "ETAG_WEAK"; + $pos += 2; + } else { + $type = "ETAG_STRONG"; + } + $pos2 = strpos($string, "]", $pos); + $etag = substr($string, $pos + 1, $pos2 - $pos - 2); + $pos = $pos2 + 1; + return array($type, $etag); + + case "N": + // "N" indicates negation + $pos += 2; + return array("NOT", "Not"); + + default: + // anything else is passed verbatim char by char + return array("CHAR", $c); + } + } + + /** + * parse If: header + * + * @param string header string + * @return array URIs and their conditions + */ + function _if_header_parser($str) + { + $pos = 0; + $len = strlen($str); + $uris = array(); + + // parser loop + while ($pos < $len) { + // get next token + $token = $this->_if_header_lexer($str, $pos); + + // check for URI + if ($token[0] == "URI") { + $uri = $token[1]; // remember URI + $token = $this->_if_header_lexer($str, $pos); // get next token + } else { + $uri = ""; + } + + // sanity check + if ($token[0] != "CHAR" || $token[1] != "(") { + return false; + } + + $list = array(); + $level = 1; + $not = ""; + while ($level) { + $token = $this->_if_header_lexer($str, $pos); + if ($token[0] == "NOT") { + $not = "!"; + continue; + } + switch ($token[0]) { + case "CHAR": + switch ($token[1]) { + case "(": + $level++; + break; + case ")": + $level--; + break; + default: + return false; + } + break; + + case "URI": + $list[] = $not."<$token[1]>"; + break; + + case "ETAG_WEAK": + $list[] = $not."[W/'$token[1]']>"; + break; + + case "ETAG_STRONG": + $list[] = $not."['$token[1]']>"; + break; + + default: + return false; + } + $not = ""; + } + + if (@is_array($uris[$uri])) { + $uris[$uri] = array_merge($uris[$uri], $list); + } else { + $uris[$uri] = $list; + } + } + + return $uris; + } + + /** + * check if conditions from "If:" headers are meat + * + * the "If:" header is an extension to HTTP/1.1 + * defined in RFC 2518 section 9.4 + * + * @param void + * @return void + */ + function _check_if_header_conditions() + { + if (isset($this->_SERVER["HTTP_IF"])) { + $this->_if_header_uris = + $this->_if_header_parser($this->_SERVER["HTTP_IF"]); + + foreach ($this->_if_header_uris as $uri => $conditions) { + if ($uri == "") { + $uri = $this->uri; + } + // all must match + $state = true; + foreach ($conditions as $condition) { + // lock tokens may be free form (RFC2518 6.3) + // but if opaquelocktokens are used (RFC2518 6.4) + // we have to check the format (litmus tests this) + if (!strncmp($condition, "$/', $condition)) { + $this->http_status("423 Locked"); + return false; + } + } + if (!$this->_check_uri_condition($uri, $condition)) { + $this->http_status("412 Precondition failed"); + $state = false; + break; + } + } + + // any match is ok + if ($state == true) { + return true; + } + } + return false; + } + return true; + } + + /** + * Check a single URI condition parsed from an if-header + * + * Check a single URI condition parsed from an if-header + * + * @abstract + * @param string $uri URI to check + * @param string $condition Condition to check for this URI + * @returns bool Condition check result + */ + function _check_uri_condition($uri, $condition) + { + // not really implemented here, + // implementations must override + + // a lock token can never be from the DAV: scheme + // litmus uses DAV:no-lock in some tests + if (!strncmp(" ignored for now + if (method_exists($this, "checkLock")) { + // is locked? + $lock = $this->checkLock($path); + + // ... and lock is not owned? + if (is_array($lock) && count($lock)) { + // FIXME doesn't check uri restrictions yet + if (!isset($this->_SERVER["HTTP_IF"]) || !strstr($this->_SERVER["HTTP_IF"], $lock["token"])) { + if (!$exclusive_only || ($lock["scope"] !== "shared")) + return false; + } + } + } + return true; + } + + + // }}} + + + /** + * Generate lockdiscovery reply from checklock() result + * + * @param string resource path to check + * @return string lockdiscovery response + */ + function lockdiscovery($path) + { + // no lock support without checklock() method + if (!method_exists($this, "checklock")) { + return ""; + } + + // collect response here + $activelocks = ""; + + // get checklock() reply + $lock = $this->checklock($path); + + // generate block for returned data + if (is_array($lock) && count($lock)) { + // check for 'timeout' or 'expires' + if (!empty($lock["expires"])) { + $timeout = "Second-".($lock["expires"] - time()); + } else if (!empty($lock["timeout"])) { + $timeout = "Second-$lock[timeout]"; + } else { + $timeout = "Infinite"; + } + + // genreate response block + if ($this->crrnd) + { + $activelocks.= " + + <$lock[scope]/> + <$lock[type]/> + $lock[depth] + $lock[owner] + $timeout + $lock[token] + + "; + } + else + { + $activelocks.= " + + + + $lock[depth] + $lock[owner] + $timeout + $lock[token] + + "; + } + } + + // return generated response + //error_log(__METHOD__."\n".print_r($activelocks,true)); + return $activelocks; + } + + /** + * set HTTP return status and mirror it in a private header + * + * @param string status code and message + * @return void + */ + function http_status($status) + { + // simplified success case + if ($status === true) { + $status = "200 OK"; + } + + // remember status + $this->_http_status = $status; + + // generate HTTP status response + header("HTTP/1.1 $status"); + header("X-WebDAV-Status: $status", true); + } + + /** + * private minimalistic version of PHP urlencode() + * + * only blanks and XML special chars must be encoded here + * full urlencode() encoding confuses some clients ... + * + * @param string URL to encode + * @return string encoded URL + */ + function _urlencode($url) + { + // cadaver (and probably all neon using agents) need a more complete url encoding + // otherwise special chars like "$,()'" in filenames do NOT work + if (strpos($_SERVER['HTTP_USER_AGENT'],'neon') !== false) + { + return strtr(rawurlencode($url),array( + '%2F' => '/', + '%3A' => ':', + )); + } + //error_log( __METHOD__."\n" .print_r($url,true)); + return strtr($url, array(' ' => '%20', + '&' => '%26', + '<' => '%3C', + '>' => '%3E', + '+' => '%2B', + )); + } + + /** + * private version of PHP urldecode + * + * not really needed but added for completenes + * + * @param string URL to decode + * @return string decoded URL + */ + function _urldecode($path) + { + return urldecode($path); + } + + /** + * Encode a hierarchical properties like: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * @param array $props + * @param string $ns + * @param strin $ns_defs + * @param array $ns_hash + * @return string + */ + function _hierarchical_prop_encode(array $props, $ns, &$ns_defs, array &$ns_hash) + { + $ret = ''; + + //error_log(__METHOD__.'('.array2string($props).')'); + if (isset($props['name'])) $props = array($props); + + foreach($props as $prop) + { + if (!isset($ns_hash[$prop['ns']])) // unknown namespace + { + // register namespace + $ns_name = 'ns'.(count($ns_hash) + 1); + $ns_hash[$prop['ns']] = $ns_name; + $ns_defs .= ' xmlns:'.$ns_name.'="'.$prop['ns'].'"'; + } + if (is_array($prop['val'])) + { + $subprop = $prop['val']; + if (isset($subprop['ns']) || isset($subprop[0]['ns'])) + { + $ret .= '<'.($prop['ns'] == $ns ? ($this->cnrnd ? $ns_hash[$ns].':' : '') : $ns_hash[$prop['ns']].':').$prop['name']. + (empty($prop['val']) ? '/>' : '>'.$this->_hierarchical_prop_encode($prop['val'], $prop['ns'], $ns_defs, $ns_hash). + 'cnrnd ? $ns_hash[$ns].':' : '') : ($this->crrnd ? '' : $ns_hash[$prop['ns']].':')).$prop['name'].'>'); + } + else // val contains only attributes, no value + { + $vals = ''; + + foreach($subprop as $attr => $val) + { + $vals .= ' '.$attr.'="'.htmlspecialchars($val).'"'; + } + + $ret .= '<'.($prop['ns'] == $ns ? ($this->cnrnd ? $ns_hash[$ns].':' : '') : $ns_hash[$prop['ns']].':').$prop['name']. + $vals .'/>'; + } + } + else + { + if (empty($prop['val'])) + { + $val = ''; + } + else + { + if(isset($prop['raw'])) + { + $val = $this->_prop_encode(''); + } else { + $val = $this->_prop_encode(htmlspecialchars($prop['val'])); + } } + + $ret .= '<'.($prop['ns'] == $ns ? ($this->cnrnd ? $ns_hash[$ns].':' : '') : $ns_hash[$prop['ns']].':').$prop['name']. + (empty($prop['val']) ? ' />' : '>'.$val.'cnrnd ? $ns_hash[$ns].':' : '') : ($this->crrnd ? '' : $ns_hash[$prop['ns']].':')).$prop['name'].'>'); + } + } + + //error_log(__METHOD__.'('.array2string($props).') = '.array2string($ret)); + return $ret; + } + + /** + * UTF-8 encode property values if not already done so + * + * @param string text to encode + * @return string utf-8 encoded text + */ + function _prop_encode($text) + { + //error_log( __METHOD__."\n" .print_r($text,true)); + //error_log("prop-encode:" . print_r($this->_prop_encoding,true)); + + switch (strtolower($this->_prop_encoding)) { + case "utf-8": + //error_log( __METHOD__."allready encoded\n" .print_r($text,true)); + return $text; + case "iso-8859-1": + case "iso-8859-15": + case "latin-1": + default: + error_log( __METHOD__."utf8 encode\n" .print_r(utf8_encode($text),true)); + return utf8_encode($text); + } + } + + /** + * Slashify - make sure path ends in a slash + * + * @param string directory path + * @returns string directory path wiht trailing slash + */ + function _slashify($path) + { + //error_log(__METHOD__." called with $path"); + if ($path[$this->bytes($path)-1] != '/') { + //error_log(__METHOD__." added slash at the end of path"); + $path = $path."/"; + } + return $path; + } + + /** + * Unslashify - make sure path doesn't in a slash + * + * @param string directory path + * @returns string directory path wihtout trailing slash + */ + function _unslashify($path) + { + //error_log(__METHOD__." called with $path"); + if ($path[$this->bytes($path)-1] == '/') { + $path = substr($path, 0, -1); + //error_log(__METHOD__." removed slash at the end of path"); + } + return $path; + } + + /** + * Merge two pathes, make sure there is exactly one slash between them + * + * @param string parent path + * @param string child path + * @return string merged path + */ + function _mergePathes($parent, $child) + { + //error_log("merge called :\n$parent \n$child\n" . function_backtrace()); + //error_log("merge :\n".print_r($this->_mergePathes($this->_SERVER["SCRIPT_NAME"], $this->path)true)); + if ($child{0} == '/') { + return $this->_unslashify($parent).$child; + } else { + return $this->_slashify($parent).$child; + } + } + + /** + * mbstring.func_overload save strlen version: counting the bytes not the chars + * + * @param string $str + * @return int + */ + function bytes($str) + { + static $func_overload; + + if (is_null($func_overload)) + { + $func_overload = @extension_loaded('mbstring') ? ini_get('mbstring.func_overload') : 0; + } + return $func_overload & 2 ? mb_strlen($str,'ascii') : strlen($str); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ +?> diff --git a/egw-pear/HTTP/WebDAV/Server/Filesystem.php b/egw-pear/HTTP/WebDAV/Server/Filesystem.php new file mode 100644 index 0000000000..68a4174337 --- /dev/null +++ b/egw-pear/HTTP/WebDAV/Server/Filesystem.php @@ -0,0 +1,804 @@ + + * @version @package-version@ + */ +class HTTP_WebDAV_Server_Filesystem extends HTTP_WebDAV_Server +{ + /** + * Root directory for WebDAV access + * + * Defaults to webserver document root (set by ServeRequest) + * + * @access private + * @var string + */ + var $base = ""; + + /** + * MySQL Host where property and locking information is stored + * + * @access private + * @var string + */ + var $db_host = "localhost"; + + /** + * MySQL database for property/locking information storage + * + * @access private + * @var string + */ + var $db_name = "webdav"; + + /** + * MySQL table name prefix + * + * @access private + * @var string + */ + var $db_prefix = ""; + + /** + * MySQL user for property/locking db access + * + * @access private + * @var string + */ + var $db_user = "root"; + + /** + * MySQL password for property/locking db access + * + * @access private + * @var string + */ + var $db_passwd = ""; + + /** + * Serve a webdav request + * + * @access public + * @param string + */ + function ServeRequest($base = false) + { + // special treatment for litmus compliance test + // reply on its identifier header + // not needed for the test itself but eases debugging + foreach (apache_request_headers() as $key => $value) { + if (stristr($key, "litmus")) { + error_log("Litmus test $value"); + header("X-Litmus-reply: ".$value); + } + } + + // set root directory, defaults to webserver document root if not set + if ($base) { + $this->base = realpath($base); // TODO throw if not a directory + } else if (!$this->base) { + $this->base = $this->_SERVER['DOCUMENT_ROOT']; + } + + // establish connection to property/locking db + mysql_connect($this->db_host, $this->db_user, $this->db_passwd) or die(mysql_error()); + mysql_select_db($this->db_name) or die(mysql_error()); + // TODO throw on connection problems + + // let the base class do all the work + parent::ServeRequest(); + } + + /** + * No authentication is needed here + * + * @access private + * @param string HTTP Authentication type (Basic, Digest, ...) + * @param string Username + * @param string Password + * @return bool true on successful authentication + */ + function check_auth($type, $user, $pass) + { + return true; + } + + + /** + * PROPFIND method handler + * + * @param array general parameter passing array + * @param array return array for file properties + * @return bool true on success + */ + function PROPFIND(&$options, &$files) + { + // get absolute fs path to requested resource + $fspath = $this->base . $options["path"]; + + // sanity check + if (!file_exists($fspath)) { + return false; + } + + // prepare property array + $files["files"] = array(); + + // store information for the requested path itself + $files["files"][] = $this->fileinfo($options["path"]); + + // information for contained resources requested? + if (!empty($options["depth"])) { // TODO check for is_dir() first? + + // make sure path ends with '/' + $options["path"] = $this->_slashify($options["path"]); + + // try to open directory + $handle = @opendir($fspath); + + if ($handle) { + // ok, now get all its contents + while ($filename = readdir($handle)) { + if ($filename != "." && $filename != "..") { + $files["files"][] = $this->fileinfo($options["path"].$filename); + } + } + // TODO recursion needed if "Depth: infinite" + closedir($handle); + } + } + + // ok, all done + return true; + } + + /** + * Get properties for a single file/resource + * + * @param string resource path + * @return array resource properties + */ + function fileinfo($path) + { + // map URI path to filesystem path + $fspath = $this->base . $path; + + // create result array + $info = array(); + // TODO remove slash append code when base clase is able to do it itself + $info["path"] = is_dir($fspath) ? $this->_slashify($path) : $path; + $info["props"] = array(); + + // no special beautified displayname here ... + $info["props"][] = $this->mkprop("displayname", strtoupper($path)); + + // creation and modification time + $info["props"][] = $this->mkprop("creationdate", filectime($fspath)); + $info["props"][] = $this->mkprop("getlastmodified", filemtime($fspath)); + + // type and size (caller already made sure that path exists) + if (is_dir($fspath)) { + // directory (WebDAV collection) + $info["props"][] = $this->mkprop("resourcetype", array($this->mkprop('collection', ''))); + $info["props"][] = $this->mkprop("getcontenttype", "httpd/unix-directory"); + } else { + // plain file (WebDAV resource) + $info["props"][] = $this->mkprop("resourcetype", ""); + if (is_readable($fspath)) { + $info["props"][] = $this->mkprop("getcontenttype", $this->_mimetype($fspath)); + } else { + $info["props"][] = $this->mkprop("getcontenttype", "application/x-non-readable"); + } + $info["props"][] = $this->mkprop("getcontentlength", filesize($fspath)); + } + + // get additional properties from database + $query = "SELECT ns, name, value + FROM {$this->db_prefix}properties + WHERE path = '$path'"; + $res = mysql_query($query); + while ($row = mysql_fetch_assoc($res)) { + $info["props"][] = $this->mkprop($row["ns"], $row["name"], $row["value"]); + } + mysql_free_result($res); + + return $info; + } + + /** + * detect if a given program is found in the search PATH + * + * helper function used by _mimetype() to detect if the + * external 'file' utility is available + * + * @param string program name + * @param string optional search path, defaults to $PATH + * @return bool true if executable program found in path + */ + function _can_execute($name, $path = false) + { + // path defaults to PATH from environment if not set + if ($path === false) { + $path = getenv("PATH"); + } + + // check method depends on operating system + if (!strncmp(PHP_OS, "WIN", 3)) { + // on Windows an appropriate COM or EXE file needs to exist + $exts = array(".exe", ".com"); + $check_fn = "file_exists"; + } else { + // anywhere else we look for an executable file of that name + $exts = array(""); + $check_fn = "is_executable"; + } + + // now check the directories in the path for the program + foreach (explode(PATH_SEPARATOR, $path) as $dir) { + // skip invalid path entries + if (!file_exists($dir)) continue; + if (!is_dir($dir)) continue; + + // and now look for the file + foreach ($exts as $ext) { + if ($check_fn("$dir/$name".$ext)) return true; + } + } + + return false; + } + + + /** + * try to detect the mime type of a file + * + * @param string file path + * @return string guessed mime type + */ + function _mimetype($fspath) + { + if (@is_dir($fspath)) { + // directories are easy + return "httpd/unix-directory"; + } else if (function_exists("mime_content_type")) { + // use mime magic extension if available + $mime_type = mime_content_type($fspath); + } else if ($this->_can_execute("file")) { + // it looks like we have a 'file' command, + // lets see it it does have mime support + $fp = popen("file -i '$fspath' 2>/dev/null", "r"); + $reply = fgets($fp); + pclose($fp); + + // popen will not return an error if the binary was not found + // and find may not have mime support using "-i" + // so we test the format of the returned string + + // the reply begins with the requested filename + if (!strncmp($reply, "$fspath: ", strlen($fspath)+2)) { + $reply = substr($reply, strlen($fspath)+2); + // followed by the mime type (maybe including options) + if (preg_match('|^[[:alnum:]_-]+/[[:alnum:]_-]+;?.*|', $reply, $matches)) { + $mime_type = $matches[0]; + } + } + } + + if (empty($mime_type)) { + // Fallback solution: try to guess the type by the file extension + // TODO: add more ... + // TODO: it has been suggested to delegate mimetype detection + // to apache but this has at least three issues: + // - works only with apache + // - needs file to be within the document tree + // - requires apache mod_magic + // TODO: can we use the registry for this on Windows? + // OTOH if the server is Windos the clients are likely to + // be Windows, too, and tend do ignore the Content-Type + // anyway (overriding it with information taken from + // the registry) + // TODO: have a seperate PEAR class for mimetype detection? + switch (strtolower(strrchr(basename($fspath), "."))) { + case ".html": + $mime_type = "text/html"; + break; + case ".gif": + $mime_type = "image/gif"; + break; + case ".jpg": + $mime_type = "image/jpeg"; + break; + default: + $mime_type = "application/octet-stream"; + break; + } + } + + return $mime_type; + } + + /** + * GET method handler + * + * @param array parameter passing array + * @return bool true on success + */ + function GET(&$options) + { + // get absolute fs path to requested resource + $fspath = $this->base . $options["path"]; + + // sanity check + if (!file_exists($fspath)) return false; + + // is this a collection? + if (is_dir($fspath)) { + return $this->GetDir($fspath, $options); + } + + // detect resource type + $options['mimetype'] = $this->_mimetype($fspath); + + // detect modification time + // see rfc2518, section 13.7 + // some clients seem to treat this as a reverse rule + // requiering a Last-Modified header if the getlastmodified header was set + $options['mtime'] = filemtime($fspath); + + // detect resource size + $options['size'] = filesize($fspath); + + // no need to check result here, it is handled by the base class + if (!($options['stream'] = fopen($fspath, "r"))) + { + return '403 Forbidden'; + } + return true; + } + + /** + * GET method handler for directories + * + * This is a very simple mod_index lookalike. + * See RFC 2518, Section 8.4 on GET/HEAD for collections + * + * @param string directory path + * @return void function has to handle HTTP response itself + */ + function GetDir($fspath, &$options) + { + $path = $this->_slashify($options["path"]); + if ($path != $options["path"]) { + header("Location: ".$this->base_uri.$path); + exit; + } + + // fixed width directory column format + $format = "%15s %-19s %-s\n"; + + $handle = @opendir($fspath); + if (!$handle) { + return false; + } + + echo "Index of ".htmlspecialchars($options['path'])."\n"; + + echo "

Index of ".htmlspecialchars($options['path'])."

\n"; + + echo "
";
+        printf($format, "Size", "Last modified", "Filename");
+        echo "
"; + + while ($filename = readdir($handle)) { + if ($filename != "." && $filename != "..") { + $fullpath = $fspath.$filename; + $name = htmlspecialchars($filename); + printf($format, + number_format(filesize($fullpath)), + strftime("%Y-%m-%d %H:%M:%S", filemtime($fullpath)), + ''.$name.''); + } + } + + echo "
"; + + closedir($handle); + + echo "\n"; + + exit; + } + + /** + * PUT method handler + * + * @param array parameter passing array + * @return bool true on success + */ + function PUT(&$options) + { + $fspath = $this->base . $options["path"]; + + if (!@is_dir(dirname($fspath))) { + return "409 Conflict"; + } + + $options["new"] = ! file_exists($fspath); + + $fp = fopen($fspath, "w"); + + return $fp; + } + + + /** + * MKCOL method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function MKCOL($options) + { + $path = $this->base .$options["path"]; + $parent = dirname($path); + $name = basename($path); + + if (!file_exists($parent)) { + return "409 Conflict"; + } + + if (!is_dir($parent)) { + return "403 Forbidden"; + } + + if ( file_exists($parent."/".$name) ) { + return "405 Method not allowed"; + } + + if (!empty($this->_SERVER["CONTENT_LENGTH"])) { // no body parsing yet + return "415 Unsupported media type"; + } + + $stat = mkdir($parent."/".$name, 0777); + if (!$stat) { + return "403 Forbidden"; + } + + return ("201 Created"); + } + + + /** + * DELETE method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function DELETE($options) + { + $path = $this->base . "/" .$options["path"]; + + if (!file_exists($path)) { + return "404 Not found"; + } + + if (is_dir($path)) { + $query = "DELETE FROM {$this->db_prefix}properties + WHERE path LIKE '".$this->_slashify($options["path"])."%'"; + mysql_query($query); + System::rm("-rf $path"); + } else { + unlink($path); + } + $query = "DELETE FROM {$this->db_prefix}properties + WHERE path = '$options[path]'"; + mysql_query($query); + + return "204 No Content"; + } + + + /** + * MOVE method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function MOVE($options) + { + return $this->COPY($options, true); + } + + /** + * COPY method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function COPY($options, $del=false) + { + // TODO Property updates still broken (Litmus should detect this?) + + if (!empty($this->_SERVER["CONTENT_LENGTH"])) { // no body parsing yet + return "415 Unsupported media type"; + } + + // no copying to different WebDAV Servers yet + if (isset($options["dest_url"])) { + return "502 bad gateway"; + } + + $source = $this->base .$options["path"]; + if (!file_exists($source)) return "404 Not found"; + + $dest = $this->base . $options["dest"]; + $new = !file_exists($dest); + $existing_col = false; + + if (!$new) { + if ($del && is_dir($dest)) { + if (!$options["overwrite"]) { + return "412 precondition failed"; + } + $dest .= basename($source); + if (file_exists($dest)) { + $options["dest"] .= basename($source); + } else { + $new = true; + $existing_col = true; + } + } + } + + if (!$new) { + if ($options["overwrite"]) { + $stat = $this->DELETE(array("path" => $options["dest"])); + if (($stat{0} != "2") && (substr($stat, 0, 3) != "404")) { + return $stat; + } + } else { + return "412 precondition failed"; + } + } + + if (is_dir($source) && ($options["depth"] != "infinity")) { + // RFC 2518 Section 9.2, last paragraph + return "400 Bad request"; + } + + if ($del) { + if (!rename($source, $dest)) { + return "500 Internal server error"; + } + $destpath = $this->_unslashify($options["dest"]); + if (is_dir($source)) { + $query = "UPDATE {$this->db_prefix}properties + SET path = REPLACE(path, '".$options["path"]."', '".$destpath."') + WHERE path LIKE '".$this->_slashify($options["path"])."%'"; + mysql_query($query); + } + + $query = "UPDATE {$this->db_prefix}properties + SET path = '".$destpath."' + WHERE path = '".$options["path"]."'"; + mysql_query($query); + } else { + if (is_dir($source)) { + $files = System::find($source); + $files = array_reverse($files); + } else { + $files = array($source); + } + + if (!is_array($files) || empty($files)) { + return "500 Internal server error"; + } + + + foreach ($files as $file) { + if (is_dir($file)) { + $file = $this->_slashify($file); + } + + $destfile = str_replace($source, $dest, $file); + + if (is_dir($file)) { + if (!is_dir($destfile)) { + // TODO "mkdir -p" here? (only natively supported by PHP 5) + if (!@mkdir($destfile)) { + return "409 Conflict"; + } + } + } else { + if (!@copy($file, $destfile)) { + return "409 Conflict"; + } + } + } + + $query = "INSERT INTO {$this->db_prefix}properties + SELECT * + FROM {$this->db_prefix}properties + WHERE path = '".$options['path']."'"; + } + + return ($new && !$existing_col) ? "201 Created" : "204 No Content"; + } + + /** + * PROPPATCH method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function PROPPATCH(&$options) + { + global $prefs, $tab; + + $msg = ""; + $path = $options["path"]; + $dir = dirname($path)."/"; + $base = basename($path); + + foreach ($options["props"] as $key => $prop) { + if ($prop["ns"] == "DAV:") { + $options["props"][$key]['status'] = "403 Forbidden"; + } else { + if (isset($prop["val"])) { + $query = "REPLACE INTO {$this->db_prefix}properties + SET path = '$options[path]' + , name = '$prop[name]' + , ns= '$prop[ns]' + , value = '$prop[val]'"; + } else { + $query = "DELETE FROM {$this->db_prefix}properties + WHERE path = '$options[path]' + AND name = '$prop[name]' + AND ns = '$prop[ns]'"; + } + mysql_query($query); + } + } + + return ""; + } + + + /** + * LOCK method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function LOCK(&$options) + { + // get absolute fs path to requested resource + $fspath = $this->base . $options["path"]; + + // TODO recursive locks on directories not supported yet + if (is_dir($fspath) && !empty($options["depth"])) { + return "409 Conflict"; + } + + $options["timeout"] = time()+300; // 5min. hardcoded + + if (isset($options["update"])) { // Lock Update + $where = "WHERE path = '$options[path]' AND token = '$options[update]'"; + + $query = "SELECT owner, exclusivelock FROM {$this->db_prefix}locks $where"; + $res = mysql_query($query); + $row = mysql_fetch_assoc($res); + mysql_free_result($res); + + if (is_array($row)) { + $query = "UPDATE {$this->db_prefix}locks + SET expires = '$options[timeout]' + , modified = ".time()." + $where"; + mysql_query($query); + + $options['owner'] = $row['owner']; + $options['scope'] = $row["exclusivelock"] ? "exclusive" : "shared"; + $options['type'] = $row["exclusivelock"] ? "write" : "read"; + + return true; + } else { + return false; + } + } + + $query = "INSERT INTO {$this->db_prefix}locks + SET token = '$options[locktoken]' + , path = '$options[path]' + , created = ".time()." + , modified = ".time()." + , owner = '$options[owner]' + , expires = '$options[timeout]' + , exclusivelock = " .($options['scope'] === "exclusive" ? "1" : "0") + ; + mysql_query($query); + + return mysql_affected_rows() ? "200 OK" : "409 Conflict"; + } + + /** + * UNLOCK method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function UNLOCK(&$options) + { + $query = "DELETE FROM {$this->db_prefix}locks + WHERE path = '$options[path]' + AND token = '$options[token]'"; + mysql_query($query); + + return mysql_affected_rows() ? "204 No Content" : "409 Conflict"; + } + + /** + * checkLock() helper + * + * @param string resource path to check for locks + * @return bool true on success + */ + function checkLock($path) + { + $result = false; + + $query = "SELECT owner, token, created, modified, expires, exclusivelock + FROM {$this->db_prefix}locks + WHERE path = '$path' + "; + $res = mysql_query($query); + + if ($res) { + $row = mysql_fetch_array($res); + mysql_free_result($res); + + if ($row) { + $result = array( "type" => "write", + "scope" => $row["exclusivelock"] ? "exclusive" : "shared", + "depth" => 0, + "owner" => $row['owner'], + "token" => $row['token'], + "created" => $row['created'], + "modified" => $row['modified'], + "expires" => $row['expires'] + ); + } + } + + return $result; + } + + + /** + * create database tables for property and lock storage + * + * @param void + * @return bool true on success + */ + function create_database() + { + // TODO + return false; + } +} + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode:nil + * End: + */ diff --git a/egw-pear/HTTP/WebDAV/Tools/_parse_lockinfo.php b/egw-pear/HTTP/WebDAV/Tools/_parse_lockinfo.php new file mode 100644 index 0000000000..8d33ead7c8 --- /dev/null +++ b/egw-pear/HTTP/WebDAV/Tools/_parse_lockinfo.php @@ -0,0 +1,237 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: _parse_lockinfo.php,v 1.4 2006/10/10 11:53:17 hholzgra Exp $ +// + +/** + * helper class for parsing LOCK request bodies + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version @package-version@ + */ +class _parse_lockinfo +{ + /** + * success state flag + * + * @var bool + * @access public + */ + var $success = false; + + /** + * lock type, currently only "write" + * + * @var string + * @access public + */ + var $locktype = ""; + + /** + * lock scope, "shared" or "exclusive" + * + * @var string + * @access public + */ + var $lockscope = ""; + + /** + * lock owner information + * + * @var string + * @access public + */ + var $owner = ""; + + /** + * flag that is set during lock owner read + * + * @var bool + * @access private + */ + var $collect_owner = false; + + /** + * constructor + * + * @param string path of stream to read + * @access public + */ + function _parse_lockinfo($path) + { + // we assume success unless problems occur + $this->success = true; + + // remember if any input was parsed + $had_input = false; + + // open stream + $f_in = fopen($path, "r"); + if (!$f_in) { + $this->success = false; + return; + } + + // create namespace aware parser + $xml_parser = xml_parser_create_ns("UTF-8", " "); + + // set tag and data handlers + xml_set_element_handler($xml_parser, + array(&$this, "_startElement"), + array(&$this, "_endElement")); + xml_set_character_data_handler($xml_parser, + array(&$this, "_data")); + + // we want a case sensitive parser + xml_parser_set_option($xml_parser, + XML_OPTION_CASE_FOLDING, false); + + // parse input + while ($this->success && !feof($f_in)) { + $line = fgets($f_in); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($xml_parser, $line, false); + } + } + + // finish parsing + if ($had_input) { + $this->success &= xml_parse($xml_parser, "", true); + } + + // check if required tags where found + $this->success &= !empty($this->locktype); + $this->success &= !empty($this->lockscope); + + // free parser resource + xml_parser_free($xml_parser); + + // close input stream + fclose($f_in); + } + + + /** + * tag start handler + * + * @param resource parser + * @param string tag name + * @param array tag attributes + * @return void + * @access private + */ + function _startElement($parser, $name, $attrs) + { + // namespace handling + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + } else { + $ns = ""; + $tag = $name; + } + + + if ($this->collect_owner) { + // everything within the tag needs to be collected + $ns_short = ""; + $ns_attr = ""; + if ($ns) { + if ($ns == "DAV:") { + $ns_short = "D:"; + } else { + $ns_attr = " xmlns='$ns'"; + } + } + $this->owner .= "<$ns_short$tag$ns_attr>"; + } else if ($ns == "DAV:") { + // parse only the essential tags + switch ($tag) { + case "write": + $this->locktype = $tag; + break; + case "exclusive": + case "shared": + $this->lockscope = $tag; + break; + case "owner": + $this->collect_owner = true; + break; + } + } + } + + /** + * data handler + * + * @param resource parser + * @param string data + * @return void + * @access private + */ + function _data($parser, $data) + { + // only the tag has data content + if ($this->collect_owner) { + $this->owner .= $data; + } + } + + /** + * tag end handler + * + * @param resource parser + * @param string tag name + * @return void + * @access private + */ + function _endElement($parser, $name) + { + // namespace handling + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + } else { + $ns = ""; + $tag = $name; + } + + // finished? + if (($ns == "DAV:") && ($tag == "owner")) { + $this->collect_owner = false; + } + + // within we have to collect everything + if ($this->collect_owner) { + $ns_short = ""; + $ns_attr = ""; + if ($ns) { + if ($ns == "DAV:") { + $ns_short = "D:"; + } else { + $ns_attr = " xmlns='$ns'"; + } + } + $this->owner .= ""; + } + } +} + +?> diff --git a/egw-pear/HTTP/WebDAV/Tools/_parse_propfind.php b/egw-pear/HTTP/WebDAV/Tools/_parse_propfind.php new file mode 100644 index 0000000000..07664dbf22 --- /dev/null +++ b/egw-pear/HTTP/WebDAV/Tools/_parse_propfind.php @@ -0,0 +1,251 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: _parse_propfind.php,v 1.4 2006/10/10 11:53:17 hholzgra Exp $ +// + +/** + * helper class for parsing PROPFIND request bodies + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version @package-version@ + */ +class _parse_propfind +{ + /** + * success state flag + * + * @var bool + * @access public + */ + var $success = false; + + /** + * found properties are collected here + * + * @var array + * @access public + */ + var $props = false; + + /** + * found (CalDAV) filters are collected here + * + * @var array + * @access public + */ + var $filters = false; + + /** + * found other tags, eg. CalDAV calendar-multiget href's + * + * @var array + * @access public + */ + var $other = false; + + /** + * what we are currently parsing: props or filters + * + * @var array + * @access private + */ + var $use = 'props'; + + /** + * Root tag, usually 'propfind' for PROPFIND, but can be eg. 'calendar-query' or 'calendar-multiget' for CalDAV REPORT + * + * @var array with keys 'name' and 'ns' + */ + var $root; + + /** + * internal tag nesting depth counter + * + * @var int + * @access private + */ + var $depth = 0; + + + /** + * constructor + * + * @access public + */ + function _parse_propfind($path) + { + // success state flag + $this->success = true; + + // property storage array + $this->props = array(); + + // internal tag depth counter + $this->depth = 0; + + // remember if any input was parsed + $had_input = false; + + // open input stream + $f_in = fopen($path, "r"); + if (!$f_in) { + $this->success = false; + return; + } + + // create XML parser + $xml_parser = xml_parser_create_ns("UTF-8", " "); + + // set tag and data handlers + xml_set_element_handler($xml_parser, + array(&$this, "_startElement"), + array(&$this, "_endElement")); + + xml_set_character_data_handler($xml_parser, + array(&$this,'_charData') + ); + + // we want a case sensitive parser + xml_parser_set_option($xml_parser, + XML_OPTION_CASE_FOLDING, false); + + + // parse input + while ($this->success && !feof($f_in)) { + $line = fgets($f_in); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($xml_parser, $line, false); + } + } + + // finish parsing + if ($had_input) { + $this->success &= xml_parse($xml_parser, "", true); + } + + // free parser + xml_parser_free($xml_parser); + + // close input stream + fclose($f_in); + + // if no input was parsed it was a request + if(!count($this->props)) $this->props = "all"; // default + } + + + /** + * start tag handler + * + * @access private + * @param resource parser + * @param string tag name + * @param array tag attributes + */ + function _startElement($parser, $name, $attrs) + { + // name space handling + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + if ($ns == "") + $this->success = false; + } else { + $ns = ""; + $tag = $name; + } + + // record root tag + if ($this->depth == 0) { + $this->root = array('name' => $tag, 'xmlns' => $ns); + } + + // special tags at level 1: and + if ($this->depth == 1) { + $this->use = 'props'; + switch ($tag) + { + case "allprop": + $this->props = "all"; + break; + case "propname": + $this->props = "names"; + break; + case 'prop': + break; + case 'filter': + $this->use = 'filters'; + break; + default: + $this->use = 'other'; + break; + } + } + + // requested properties are found at level 2 + // CalDAV filters can be at deeper levels too and we need the attrs, same for other tags (eg. multiget href's) + if ($this->depth == 2 || $this->use == 'filters' && $this->depth >= 2 || $this->use == 'other') { + $prop = array("name" => $tag); + if ($ns) + $prop["xmlns"] = $ns; + if ($this->use != 'props') { + $prop['attrs'] = $attrs; + $prop['depth'] = $this->depth; + } + // this can happen if we have allprop and prop in one propfind: + // , eg. blah is not automatic returned by allprop + if (!is_array($this->{$this->use}) && $this->{$this->use}) $this->{$this->use} = array($this->{$this->use}); + $this->{$this->use}[] = $prop; + } + + // increment depth count + $this->depth++; + } + + + /** + * end tag handler + * + * @access private + * @param resource parser + * @param string tag name + */ + function _endElement($parser, $name) + { + // here we only need to decrement the depth count + $this->depth--; + } + + + /** + * char data handler for non prop tags, eg. href's in CalDAV multiget, or filter contents + * + * @access private + * @param resource parser + * @param string character data + */ + function _charData($parser, $data) + { + if ($this->use != 'props' && ($n = count($this->{$this->use})) && ($data = trim($data))) { + $this->{$this->use}[$n-1]['data'] = $data; + } + } +} diff --git a/egw-pear/HTTP/WebDAV/Tools/_parse_proppatch.php b/egw-pear/HTTP/WebDAV/Tools/_parse_proppatch.php new file mode 100644 index 0000000000..396c3e34a4 --- /dev/null +++ b/egw-pear/HTTP/WebDAV/Tools/_parse_proppatch.php @@ -0,0 +1,223 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: _parse_proppatch.php,v 1.6 2006/10/10 11:53:17 hholzgra Exp $ +// + +/** + * helper class for parsing PROPPATCH request bodies + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version @package-version@ + */ +class _parse_proppatch +{ + /** + * + * + * @var + * @access + */ + var $success; + + /** + * + * + * @var + * @access + */ + var $props; + + /** + * + * + * @var + * @access + */ + var $depth; + + /** + * + * + * @var + * @access + */ + var $mode; + + /** + * + * + * @var + * @access + */ + var $current; + + /** + * constructor + * + * @param string path of input stream + * @access public + */ + function _parse_proppatch($path) + { + $this->success = true; + + $this->depth = 0; + $this->props = array(); + $had_input = false; + + $f_in = fopen($path, "r"); + if (!$f_in) { + $this->success = false; + return; + } + + $xml_parser = xml_parser_create_ns("UTF-8", " "); + + xml_set_element_handler($xml_parser, + array(&$this, "_startElement"), + array(&$this, "_endElement")); + + xml_set_character_data_handler($xml_parser, + array(&$this, "_data")); + + xml_parser_set_option($xml_parser, + XML_OPTION_CASE_FOLDING, false); + + while($this->success && !feof($f_in)) { + $line = fgets($f_in); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($xml_parser, $line, false); + } + } + + if($had_input) { + $this->success &= xml_parse($xml_parser, "", true); + } + + xml_parser_free($xml_parser); + + fclose($f_in); + } + + /** + * tag start handler + * + * @param resource parser + * @param string tag name + * @param array tag attributes + * @return void + * @access private + */ + function _startElement($parser, $name, $attrs) + { + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + if ($ns == "") + $this->success = false; + } else { + $ns = ""; + $tag = $name; + } + + if ($this->depth == 1) { + $this->mode = $tag; + } + + if ($this->depth == 3) { + $prop = array("name" => $tag); + $this->current = array("name" => $tag, "ns" => $ns, "status"=> 200); + if ($this->mode == "set") { + $this->current["val"] = ""; // default set val + } + } + + if ($this->depth >= 4) { + $this->current["val"] .= "<$tag"; + if (isset($attr)) { + foreach ($attr as $key => $val) { + $this->current["val"] .= ' '.$key.'="'.str_replace('"','"', $val).'"'; + } + } + $this->current["val"] .= ">"; + } + + + + $this->depth++; + } + + /** + * tag end handler + * + * @param resource parser + * @param string tag name + * @return void + * @access private + */ + function _endElement($parser, $name) + { + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + if ($ns == "") + $this->success = false; + } else { + $ns = ""; + $tag = $name; + } + + $this->depth--; + + if ($this->depth >= 4) { + $this->current["val"] .= ""; + } + + if ($this->depth == 3) { + if (isset($this->current)) { + $this->props[] = $this->current; + unset($this->current); + } + } + } + + /** + * input data handler + * + * @param resource parser + * @param string data + * @return void + * @access private + */ + function _data($parser, $data) + { + if (isset($this->current)) { + $this->current["val"] .= $data; + } + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode:nil + * End: + */ diff --git a/egw-pear/Log.php b/egw-pear/Log.php new file mode 100644 index 0000000000..7f2494df03 --- /dev/null +++ b/egw-pear/Log.php @@ -0,0 +1,824 @@ + + * @author Jon Parise + * @since Horde 1.3 + * @package Log + */ +class Log +{ + /** + * Indicates whether or not the log can been opened / connected. + * + * @var boolean + * @access private + */ + var $_opened = false; + + /** + * Instance-specific unique identification number. + * + * @var integer + * @access private + */ + var $_id = 0; + + /** + * The label that uniquely identifies this set of log messages. + * + * @var string + * @access private + */ + var $_ident = ''; + + /** + * The default priority to use when logging an event. + * + * @var integer + * @access private + */ + var $_priority = PEAR_LOG_INFO; + + /** + * The bitmask of allowed log levels. + * + * @var integer + * @access private + */ + var $_mask = PEAR_LOG_ALL; + + /** + * Holds all Log_observer objects that wish to be notified of new messages. + * + * @var array + * @access private + */ + var $_listeners = array(); + + /** + * Maps canonical format keys to position arguments for use in building + * "line format" strings. + * + * @var array + * @access private + */ + var $_formatMap = array('%{timestamp}' => '%1$s', + '%{ident}' => '%2$s', + '%{priority}' => '%3$s', + '%{message}' => '%4$s', + '%{file}' => '%5$s', + '%{line}' => '%6$s', + '%{function}' => '%7$s', + '%\{' => '%%{'); + + + /** + * Attempts to return a concrete Log instance of type $handler. + * + * @param string $handler The type of concrete Log subclass to return. + * Attempt to dynamically include the code for + * this subclass. Currently, valid values are + * 'console', 'syslog', 'sql', 'file', and 'mcal'. + * + * @param string $name The name of the actually log file, table, or + * other specific store to use. Defaults to an + * empty string, with which the subclass will + * attempt to do something intelligent. + * + * @param string $ident The identity reported to the log system. + * + * @param array $conf A hash containing any additional configuration + * information that a subclass might need. + * + * @param int $level Log messages up to and including this level. + * + * @return object Log The newly created concrete Log instance, or + * null on an error. + * @access public + * @since Log 1.0 + */ + function &factory($handler, $name = '', $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $handler = strtolower($handler); + $class = 'Log_' . $handler; + $classfile = 'Log/' . $handler . '.php'; + + /* + * Attempt to include our version of the named class, but don't treat + * a failure as fatal. The caller may have already included their own + * version of the named class. + */ + if (!class_exists($class)) { + include_once $classfile; + } + + /* If the class exists, return a new instance of it. */ + if (class_exists($class)) { + $obj = new $class($name, $ident, $conf, $level); + return $obj; + } + + $null = null; + return $null; + } + + /** + * Attempts to return a reference to a concrete Log instance of type + * $handler, only creating a new instance if no log instance with the same + * parameters currently exists. + * + * You should use this if there are multiple places you might create a + * logger, you don't want to create multiple loggers, and you don't want to + * check for the existance of one each time. The singleton pattern does all + * the checking work for you. + * + * You MUST call this method with the $var = &Log::singleton() syntax. + * Without the ampersand (&) in front of the method name, you will not get + * a reference, you will get a copy. + * + * @param string $handler The type of concrete Log subclass to return. + * Attempt to dynamically include the code for + * this subclass. Currently, valid values are + * 'console', 'syslog', 'sql', 'file', and 'mcal'. + * + * @param string $name The name of the actually log file, table, or + * other specific store to use. Defaults to an + * empty string, with which the subclass will + * attempt to do something intelligent. + * + * @param string $ident The identity reported to the log system. + * + * @param array $conf A hash containing any additional configuration + * information that a subclass might need. + * + * @param int $level Log messages up to and including this level. + * + * @return object Log The newly created concrete Log instance, or + * null on an error. + * @access public + * @since Log 1.0 + */ + function &singleton($handler, $name = '', $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + static $instances; + if (!isset($instances)) $instances = array(); + + $signature = serialize(array($handler, $name, $ident, $conf, $level)); + if (!isset($instances[$signature])) { + $instances[$signature] = &Log::factory($handler, $name, $ident, + $conf, $level); + } + + return $instances[$signature]; + } + + /** + * Abstract implementation of the open() method. + * @since Log 1.0 + */ + function open() + { + return false; + } + + /** + * Abstract implementation of the close() method. + * @since Log 1.0 + */ + function close() + { + return false; + } + + /** + * Abstract implementation of the flush() method. + * @since Log 1.8.2 + */ + function flush() + { + return false; + } + + /** + * Abstract implementation of the log() method. + * @since Log 1.0 + */ + function log($message, $priority = null) + { + return false; + } + + /** + * A convenience function for logging a emergency event. It will log a + * message at the PEAR_LOG_EMERG log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function emerg($message) + { + return $this->log($message, PEAR_LOG_EMERG); + } + + /** + * A convenience function for logging an alert event. It will log a + * message at the PEAR_LOG_ALERT log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function alert($message) + { + return $this->log($message, PEAR_LOG_ALERT); + } + + /** + * A convenience function for logging a critical event. It will log a + * message at the PEAR_LOG_CRIT log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function crit($message) + { + return $this->log($message, PEAR_LOG_CRIT); + } + + /** + * A convenience function for logging a error event. It will log a + * message at the PEAR_LOG_ERR log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function err($message) + { + return $this->log($message, PEAR_LOG_ERR); + } + + /** + * A convenience function for logging a warning event. It will log a + * message at the PEAR_LOG_WARNING log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function warning($message) + { + return $this->log($message, PEAR_LOG_WARNING); + } + + /** + * A convenience function for logging a notice event. It will log a + * message at the PEAR_LOG_NOTICE log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function notice($message) + { + return $this->log($message, PEAR_LOG_NOTICE); + } + + /** + * A convenience function for logging a information event. It will log a + * message at the PEAR_LOG_INFO log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function info($message) + { + return $this->log($message, PEAR_LOG_INFO); + } + + /** + * A convenience function for logging a debug event. It will log a + * message at the PEAR_LOG_DEBUG log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function debug($message) + { + return $this->log($message, PEAR_LOG_DEBUG); + } + + /** + * Returns the string representation of the message data. + * + * If $message is an object, _extractMessage() will attempt to extract + * the message text using a known method (such as a PEAR_Error object's + * getMessage() method). If a known method, cannot be found, the + * serialized representation of the object will be returned. + * + * If the message data is already a string, it will be returned unchanged. + * + * @param mixed $message The original message data. This may be a + * string or any object. + * + * @return string The string representation of the message. + * + * @access private + */ + function _extractMessage($message) + { + /* + * If we've been given an object, attempt to extract the message using + * a known method. If we can't find such a method, default to the + * "human-readable" version of the object. + * + * We also use the human-readable format for arrays. + */ + if (is_object($message)) { + if (method_exists($message, 'getmessage')) { + $message = $message->getMessage(); + } else if (method_exists($message, 'tostring')) { + $message = $message->toString(); + } else if (method_exists($message, '__tostring')) { + if (version_compare(PHP_VERSION, '5.0.0', 'ge')) { + $message = (string)$message; + } else { + $message = $message->__toString(); + } + } else { + $message = print_r($message, true); + } + } else if (is_array($message)) { + if (isset($message['message'])) { + $message = $message['message']; + } else { + $message = print_r($message, true); + } + } + + /* Otherwise, we assume the message is a string. */ + return $message; + } + + /** + * Using debug_backtrace(), returns the file, line, and enclosing function + * name of the source code context from which log() was invoked. + * + * @param int $depth The initial number of frames we should step + * back into the trace. + * + * @return array Array containing three strings: the filename, the line, + * and the function name from which log() was called. + * + * @access private + * @since Log 1.9.4 + */ + function _getBacktraceVars($depth) + { + /* Start by generating a backtrace from the current call (here). */ + $backtrace = debug_backtrace(); + + /* + * If we were ultimately invoked by the composite handler, we need to + * increase our depth one additional level to compensate. + */ + if (strcasecmp(@$backtrace[$depth+1]['class'], 'Log_composite') == 0) { + $depth++; + } + + /* + * We're interested in the frame which invoked the log() function, so + * we need to walk back some number of frames into the backtrace. The + * $depth parameter tells us where to start looking. We go one step + * further back to find the name of the encapsulating function from + * which log() was called. + */ + $file = @$backtrace[$depth]['file']; + $line = @$backtrace[$depth]['line']; + $func = @$backtrace[$depth + 1]['function']; + + /* + * However, if log() was called from one of our "shortcut" functions, + * we're going to need to go back an additional step. + */ + if (in_array($func, array('emerg', 'alert', 'crit', 'err', 'warning', + 'notice', 'info', 'debug'))) { + $file = @$backtrace[$depth + 1]['file']; + $line = @$backtrace[$depth + 1]['line']; + $func = @$backtrace[$depth + 2]['function']; + } + + /* + * If we couldn't extract a function name (perhaps because we were + * executed from the "main" context), provide a default value. + */ + if (is_null($func)) { + $func = '(none)'; + } + + /* Return a 3-tuple containing (file, line, function). */ + return array($file, $line, $func); + } + + /** + * Produces a formatted log line based on a format string and a set of + * variables representing the current log record and state. + * + * @return string Formatted log string. + * + * @access private + * @since Log 1.9.4 + */ + function _format($format, $timestamp, $priority, $message) + { + /* + * If the format string references any of the backtrace-driven + * variables (%5, %6, %7), generate the backtrace and fetch them. + */ + if (strpos($format, '%5') || strpos($format, '%6') || strpos($format, '%7')) { + list($file, $line, $func) = $this->_getBacktraceVars(2); + } + + /* + * Build the formatted string. We use the sprintf() function's + * "argument swapping" capability to dynamically select and position + * the variables which will ultimately appear in the log string. + */ + return sprintf($format, + $timestamp, + $this->_ident, + $this->priorityToString($priority), + $message, + isset($file) ? $file : '', + isset($line) ? $line : '', + isset($func) ? $func : ''); + } + + /** + * Returns the string representation of a PEAR_LOG_* integer constant. + * + * @param int $priority A PEAR_LOG_* integer constant. + * + * @return string The string representation of $level. + * + * @since Log 1.0 + */ + function priorityToString($priority) + { + $levels = array( + PEAR_LOG_EMERG => 'emergency', + PEAR_LOG_ALERT => 'alert', + PEAR_LOG_CRIT => 'critical', + PEAR_LOG_ERR => 'error', + PEAR_LOG_WARNING => 'warning', + PEAR_LOG_NOTICE => 'notice', + PEAR_LOG_INFO => 'info', + PEAR_LOG_DEBUG => 'debug' + ); + + return $levels[$priority]; + } + + /** + * Returns the the PEAR_LOG_* integer constant for the given string + * representation of a priority name. This function performs a + * case-insensitive search. + * + * @param string $name String containing a priority name. + * + * @return string The PEAR_LOG_* integer contstant corresponding + * the the specified priority name. + * + * @since Log 1.9.0 + */ + function stringToPriority($name) + { + $levels = array( + 'emergency' => PEAR_LOG_EMERG, + 'alert' => PEAR_LOG_ALERT, + 'critical' => PEAR_LOG_CRIT, + 'error' => PEAR_LOG_ERR, + 'warning' => PEAR_LOG_WARNING, + 'notice' => PEAR_LOG_NOTICE, + 'info' => PEAR_LOG_INFO, + 'debug' => PEAR_LOG_DEBUG + ); + + return $levels[strtolower($name)]; + } + + /** + * Calculate the log mask for the given priority. + * + * This method may be called statically. + * + * @param integer $priority The priority whose mask will be calculated. + * + * @return integer The calculated log mask. + * + * @access public + * @since Log 1.7.0 + */ + function MASK($priority) + { + return (1 << $priority); + } + + /** + * Calculate the log mask for all priorities up to the given priority. + * + * This method may be called statically. + * + * @param integer $priority The maximum priority covered by this mask. + * + * @return integer The resulting log mask. + * + * @access public + * @since Log 1.7.0 + * + * @deprecated deprecated since Log 1.9.4; use Log::MAX() instead + */ + function UPTO($priority) + { + return Log::MAX($priority); + } + + /** + * Calculate the log mask for all priorities greater than or equal to the + * given priority. In other words, $priority will be the lowest priority + * matched by the resulting mask. + * + * This method may be called statically. + * + * @param integer $priority The minimum priority covered by this mask. + * + * @return integer The resulting log mask. + * + * @access public + * @since Log 1.9.4 + */ + function MIN($priority) + { + return PEAR_LOG_ALL ^ ((1 << $priority) - 1); + } + + /** + * Calculate the log mask for all priorities less than or equal to the + * given priority. In other words, $priority will be the highests priority + * matched by the resulting mask. + * + * This method may be called statically. + * + * @param integer $priority The maximum priority covered by this mask. + * + * @return integer The resulting log mask. + * + * @access public + * @since Log 1.9.4 + */ + function MAX($priority) + { + return ((1 << ($priority + 1)) - 1); + } + + /** + * Set and return the level mask for the current Log instance. + * + * @param integer $mask A bitwise mask of log levels. + * + * @return integer The current level mask. + * + * @access public + * @since Log 1.7.0 + */ + function setMask($mask) + { + $this->_mask = $mask; + + return $this->_mask; + } + + /** + * Returns the current level mask. + * + * @return interger The current level mask. + * + * @access public + * @since Log 1.7.0 + */ + function getMask() + { + return $this->_mask; + } + + /** + * Check if the given priority is included in the current level mask. + * + * @param integer $priority The priority to check. + * + * @return boolean True if the given priority is included in the current + * log mask. + * + * @access private + * @since Log 1.7.0 + */ + function _isMasked($priority) + { + return (Log::MASK($priority) & $this->_mask); + } + + /** + * Returns the current default priority. + * + * @return integer The current default priority. + * + * @access public + * @since Log 1.8.4 + */ + function getPriority() + { + return $this->_priority; + } + + /** + * Sets the default priority to the specified value. + * + * @param integer $priority The new default priority. + * + * @access public + * @since Log 1.8.4 + */ + function setPriority($priority) + { + $this->_priority = $priority; + } + + /** + * Adds a Log_observer instance to the list of observers that are listening + * for messages emitted by this Log instance. + * + * @param object $observer The Log_observer instance to attach as a + * listener. + * + * @param boolean True if the observer is successfully attached. + * + * @access public + * @since Log 1.0 + */ + function attach(&$observer) + { + if (!is_a($observer, 'Log_observer')) { + return false; + } + + $this->_listeners[$observer->_id] = &$observer; + + return true; + } + + /** + * Removes a Log_observer instance from the list of observers. + * + * @param object $observer The Log_observer instance to detach from + * the list of listeners. + * + * @param boolean True if the observer is successfully detached. + * + * @access public + * @since Log 1.0 + */ + function detach($observer) + { + if (!is_a($observer, 'Log_observer') || + !isset($this->_listeners[$observer->_id])) { + return false; + } + + unset($this->_listeners[$observer->_id]); + + return true; + } + + /** + * Informs each registered observer instance that a new message has been + * logged. + * + * @param array $event A hash describing the log event. + * + * @access private + */ + function _announce($event) + { + foreach ($this->_listeners as $id => $listener) { + if ($event['priority'] <= $this->_listeners[$id]->_priority) { + $this->_listeners[$id]->notify($event); + } + } + } + + /** + * Indicates whether this is a composite class. + * + * @return boolean True if this is a composite class. + * + * @access public + * @since Log 1.0 + */ + function isComposite() + { + return false; + } + + /** + * Sets this Log instance's identification string. + * + * @param string $ident The new identification string. + * + * @access public + * @since Log 1.6.3 + */ + function setIdent($ident) + { + $this->_ident = $ident; + } + + /** + * Returns the current identification string. + * + * @return string The current Log instance's identification string. + * + * @access public + * @since Log 1.6.3 + */ + function getIdent() + { + return $this->_ident; + } +} diff --git a/egw-pear/Log/composite.php b/egw-pear/Log/composite.php new file mode 100644 index 0000000000..98a1d814ca --- /dev/null +++ b/egw-pear/Log/composite.php @@ -0,0 +1,231 @@ + + * @author Jon Parise + * + * @since Horde 1.3 + * @since Log 1.0 + * @package Log + * + * @example composite.php Using the composite handler. + */ +class Log_composite extends Log +{ + /** + * Array holding all of the Log instances to which log events should be + * sent. + * + * @var array + * @access private + */ + var $_children = array(); + + + /** + * Constructs a new composite Log object. + * + * @param boolean $name This parameter is ignored. + * @param boolean $ident This parameter is ignored. + * @param boolean $conf This parameter is ignored. + * @param boolean $level This parameter is ignored. + * + * @access public + */ + function Log_composite($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_ident = $ident; + } + + /** + * Opens all of the child instances. + * + * @return True if all of the child instances were successfully opened. + * + * @access public + */ + function open() + { + /* Attempt to open each of our children. */ + $this->_opened = true; + foreach ($this->_children as $id => $child) { + $this->_opened &= $this->_children[$id]->open(); + } + + /* If all children were opened, return success. */ + return $this->_opened; + } + + /** + * Closes all of the child instances. + * + * @return True if all of the child instances were successfully closed. + * + * @access public + */ + function close() + { + /* Attempt to close each of our children. */ + $closed = true; + foreach ($this->_children as $id => $child) { + $closed &= $this->_children[$id]->close(); + } + + /* Track the _opened state for consistency. */ + $this->_opened = false; + + /* If all children were closed, return success. */ + return $closed; + } + + /** + * Flushes all child instances. It is assumed that all of the children + * have been successfully opened. + * + * @return True if all of the child instances were successfully flushed. + * + * @access public + * @since Log 1.8.2 + */ + function flush() + { + /* Attempt to flush each of our children. */ + $flushed = true; + foreach ($this->_children as $id => $child) { + $flushed &= $this->_children[$id]->flush(); + } + + /* If all children were flushed, return success. */ + return $flushed; + } + + /** + * Sends $message and $priority to each child of this composite. If the + * children aren't already open, they will be opened here. + * + * @param mixed $message String or object containing the message + * to log. + * @param string $priority (optional) The priority of the message. + * Valid values are: PEAR_LOG_EMERG, + * PEAR_LOG_ALERT, PEAR_LOG_CRIT, + * PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and + * PEAR_LOG_DEBUG. + * + * @return boolean True if the entry is successfully logged. + * + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* + * If the handlers haven't been opened, attempt to open them now. + * However, we don't treat failure to open all of the handlers as a + * fatal error. We defer that consideration to the success of calling + * each handler's log() method below. + */ + if (!$this->_opened) { + $this->open(); + } + + /* Attempt to log the event using each of the children. */ + $success = true; + foreach ($this->_children as $id => $child) { + $success &= $this->_children[$id]->log($message, $priority); + } + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + /* Return success if all of the children logged the event. */ + return $success; + } + + /** + * Returns true if this is a composite. + * + * @return boolean True if this is a composite class. + * + * @access public + */ + function isComposite() + { + return true; + } + + /** + * Sets this identification string for all of this composite's children. + * + * @param string $ident The new identification string. + * + * @access public + * @since Log 1.6.7 + */ + function setIdent($ident) + { + /* Call our base class's setIdent() method. */ + parent::setIdent($ident); + + /* ... and then call setIdent() on all of our children. */ + foreach ($this->_children as $id => $child) { + $this->_children[$id]->setIdent($ident); + } + } + + /** + * Adds a Log instance to the list of children. + * + * @param object $child The Log instance to add. + * + * @return boolean True if the Log instance was successfully added. + * + * @access public + */ + function addChild(&$child) + { + /* Make sure this is a Log instance. */ + if (!is_a($child, 'Log')) { + return false; + } + + $this->_children[$child->_id] = &$child; + + return true; + } + + /** + * Removes a Log instance from the list of children. + * + * @param object $child The Log instance to remove. + * + * @return boolean True if the Log instance was successfully removed. + * + * @access public + */ + function removeChild($child) + { + if (!is_a($child, 'Log') || !isset($this->_children[$child->_id])) { + return false; + } + + unset($this->_children[$child->_id]); + + return true; + } + +} diff --git a/egw-pear/Log/console.php b/egw-pear/Log/console.php new file mode 100644 index 0000000000..0b2863dd2c --- /dev/null +++ b/egw-pear/Log/console.php @@ -0,0 +1,204 @@ + + * @since Log 1.1 + * @package Log + * + * @example console.php Using the console handler. + */ +class Log_console extends Log +{ + /** + * Handle to the current output stream. + * @var resource + * @access private + */ + var $_stream = STDOUT; + + /** + * Should the output be buffered or displayed immediately? + * @var string + * @access private + */ + var $_buffering = false; + + /** + * String holding the buffered output. + * @var string + * @access private + */ + var $_buffer = ''; + + /** + * String containing the format of a log line. + * @var string + * @access private + */ + var $_lineFormat = '%1$s %2$s [%3$s] %4$s'; + + /** + * String containing the timestamp format. It will be passed directly to + * strftime(). Note that the timestamp string will generated using the + * current locale. + * @var string + * @access private + */ + var $_timeFormat = '%b %d %H:%M:%S'; + + /** + * Constructs a new Log_console object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_console($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (!empty($conf['stream'])) { + $this->_stream = $conf['stream']; + } + + if (isset($conf['buffering'])) { + $this->_buffering = $conf['buffering']; + } + + if (!empty($conf['lineFormat'])) { + $this->_lineFormat = str_replace(array_keys($this->_formatMap), + array_values($this->_formatMap), + $conf['lineFormat']); + } + + if (!empty($conf['timeFormat'])) { + $this->_timeFormat = $conf['timeFormat']; + } + + /* + * If output buffering has been requested, we need to register a + * shutdown function that will dump the buffer upon termination. + */ + if ($this->_buffering) { + register_shutdown_function(array(&$this, '_Log_console')); + } + } + + /** + * Destructor + */ + function _Log_console() + { + $this->close(); + } + + /** + * Open the output stream. + * + * @access public + * @since Log 1.9.7 + */ + function open() + { + $this->_opened = true; + return true; + } + + /** + * Closes the output stream. + * + * This results in a call to flush(). + * + * @access public + * @since Log 1.9.0 + */ + function close() + { + $this->flush(); + $this->_opened = false; + return true; + } + + /** + * Flushes all pending ("buffered") data to the output stream. + * + * @access public + * @since Log 1.8.2 + */ + function flush() + { + /* + * If output buffering is enabled, dump the contents of the buffer to + * the output stream. + */ + if ($this->_buffering && (strlen($this->_buffer) > 0)) { + fwrite($this->_stream, $this->_buffer); + $this->_buffer = ''; + } + + return fflush($this->_stream); + } + + /** + * Writes $message to the text console. Also, passes the message + * along to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build the string containing the complete log line. */ + $line = $this->_format($this->_lineFormat, + strftime($this->_timeFormat), + $priority, $message) . "\n"; + + /* + * If buffering is enabled, append this line to the output buffer. + * Otherwise, print the line to the output stream immediately. + */ + if ($this->_buffering) { + $this->_buffer .= $line; + } else { + fwrite($this->_stream, $line); + } + + /* Notify observers about this log message. */ + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + +} diff --git a/egw-pear/Log/daemon.php b/egw-pear/Log/daemon.php new file mode 100644 index 0000000000..9873f2a400 --- /dev/null +++ b/egw-pear/Log/daemon.php @@ -0,0 +1,230 @@ + + * @version $Revision: 1.2 $ + * @package Log + */ +class Log_daemon extends Log +{ + /** + * Integer holding the log facility to use. + * @var string + */ + var $_name = LOG_DAEMON; + + /** + * Var holding the resource pointer to the socket + * @var resource + */ + var $_socket; + + /** + * The ip address or servername + * @see http://www.php.net/manual/en/transports.php + * @var string + */ + var $_ip = '127.0.0.1'; + + /** + * Protocol to use (tcp, udp, etc.) + * @see http://www.php.net/manual/en/transports.php + * @var string + */ + var $_proto = 'udp'; + + /** + * Port to connect to + * @var int + */ + var $_port = 514; + + /** + * Maximum message length in bytes + * @var int + */ + var $_maxsize = 4096; + + /** + * Socket timeout in seconds + * @var int + */ + var $_timeout = 1; + + + /** + * Constructs a new syslog object. + * + * @param string $name The syslog facility. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $maxLevel Maximum level at which to log. + * @access public + */ + function Log_daemon($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + /* Ensure we have a valid integer value for $name. */ + if (empty($name) || !is_int($name)) { + $name = LOG_SYSLOG; + } + + $this->_id = md5(microtime()); + $this->_name = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (isset($conf['ip'])) { + $this->_ip = $conf['ip']; + } + if (isset($conf['proto'])) { + $this->_proto = $conf['proto']; + } + if (isset($conf['port'])) { + $this->_port = $conf['port']; + } + if (isset($conf['maxsize'])) { + $this->_maxsize = $conf['maxsize']; + } + if (isset($conf['timeout'])) { + $this->_timeout = $conf['timeout']; + } + $this->_proto = $this->_proto . '://'; + + register_shutdown_function(array(&$this, '_Log_daemon')); + } + + /** + * Destructor. + * + * @access private + */ + function _Log_daemon() + { + $this->close(); + } + + /** + * Opens a connection to the system logger, if it has not already + * been opened. This is implicitly called by log(), if necessary. + * @access public + */ + function open() + { + if (!$this->_opened) { + $this->_opened = (bool)($this->_socket = @fsockopen( + $this->_proto . $this->_ip, + $this->_port, + $errno, + $errstr, + $this->_timeout)); + } + return $this->_opened; + } + + /** + * Closes the connection to the system logger, if it is open. + * @access public + */ + function close() + { + if ($this->_opened) { + $this->_opened = false; + return fclose($this->_socket); + } + return true; + } + + /** + * Sends $message to the currently open syslog connection. Calls + * open() if necessary. Also passes the message along to any Log_observer + * instances that are observing this Log. + * + * @param string $message The textual message to be logged. + * @param int $priority (optional) The priority of the message. Valid + * values are: LOG_EMERG, LOG_ALERT, LOG_CRIT, + * LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO, + * and LOG_DEBUG. The default is LOG_INFO. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Set the facility level. */ + $facility_level = intval($this->_name) + + intval($this->_toSyslog($priority)); + + /* Prepend ident info. */ + if (!empty($this->_ident)) { + $message = $this->_ident . ' ' . $message; + } + + /* Check for message length. */ + if (strlen($message) > $this->_maxsize) { + $message = substr($message, 0, ($this->_maxsize) - 10) . ' [...]'; + } + + /* Write to socket. */ + fwrite($this->_socket, '<' . $facility_level . '>' . $message . "\n"); + + $this->_announce(array('priority' => $priority, 'message' => $message)); + } + + /** + * Converts a PEAR_LOG_* constant into a syslog LOG_* constant. + * + * This function exists because, under Windows, not all of the LOG_* + * constants have unique values. Instead, the PEAR_LOG_* were introduced + * for global use, with the conversion to the LOG_* constants kept local to + * to the syslog driver. + * + * @param int $priority PEAR_LOG_* value to convert to LOG_* value. + * + * @return The LOG_* representation of $priority. + * + * @access private + */ + function _toSyslog($priority) + { + static $priorities = array( + PEAR_LOG_EMERG => LOG_EMERG, + PEAR_LOG_ALERT => LOG_ALERT, + PEAR_LOG_CRIT => LOG_CRIT, + PEAR_LOG_ERR => LOG_ERR, + PEAR_LOG_WARNING => LOG_WARNING, + PEAR_LOG_NOTICE => LOG_NOTICE, + PEAR_LOG_INFO => LOG_INFO, + PEAR_LOG_DEBUG => LOG_DEBUG + ); + + /* If we're passed an unknown priority, default to LOG_INFO. */ + if (!is_int($priority) || !in_array($priority, $priorities)) { + return LOG_INFO; + } + + return $priorities[$priority]; + } + +} diff --git a/egw-pear/Log/display.php b/egw-pear/Log/display.php new file mode 100644 index 0000000000..31ad1e7daa --- /dev/null +++ b/egw-pear/Log/display.php @@ -0,0 +1,141 @@ + + * @since Log 1.8.0 + * @package Log + * + * @example display.php Using the display handler. + */ +class Log_display extends Log +{ + /** + * String to output before an error message + * @var string + * @access private + */ + var $_error_prepend = ''; + + /** + * String to output after an error message + * @var string + * @access private + */ + var $_error_append = ''; + + /** + * String used to represent a line break. + * @var string + * @access private + */ + var $_linebreak = "
\n"; + + /** + * Constructs a new Log_display object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_display($name = '', $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (isset($conf['error_prepend'])) { + $this->_error_prepend = $conf['error_prepend']; + } else { + $this->_error_prepend = ini_get('error_prepend_string'); + } + + if (isset($conf['error_append'])) { + $this->_error_append = $conf['error_append']; + } else { + $this->_error_append = ini_get('error_append_string'); + } + + if (isset($conf['linebreak'])) { + $this->_linebreak = $conf['linebreak']; + } + } + + /** + * Opens the display handler. + * + * @access public + * @since Log 1.9.6 + */ + function open() + { + $this->_opened = true; + return true; + } + + /** + * Closes the display handler. + * + * @access public + * @since Log 1.9.6 + */ + function close() + { + $this->_opened = false; + return true; + } + + /** + * Writes $message to the text browser. Also, passes the message + * along to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build and output the complete log line. */ + echo $this->_error_prepend . + '' . ucfirst($this->priorityToString($priority)) . ': '. + nl2br(htmlspecialchars($message)) . + $this->_error_append . $this->_linebreak; + + /* Notify observers about this log message. */ + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + +} diff --git a/egw-pear/Log/error_log.php b/egw-pear/Log/error_log.php new file mode 100644 index 0000000000..117e96c488 --- /dev/null +++ b/egw-pear/Log/error_log.php @@ -0,0 +1,127 @@ + + * @since Log 1.7.0 + * @package Log + * + * @example error_log.php Using the error_log handler. + */ +class Log_error_log extends Log +{ + /** + * The error_log() log type. + * @var integer + * @access private + */ + var $_type = PEAR_LOG_TYPE_SYSTEM; + + /** + * The type-specific destination value. + * @var string + * @access private + */ + var $_destination = ''; + + /** + * Additional headers to pass to the mail() function when the + * PEAR_LOG_TYPE_MAIL type is used. + * @var string + * @access private + */ + var $_extra_headers = ''; + + /** + * Constructs a new Log_error_log object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_error_log($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_type = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (!empty($conf['destination'])) { + $this->_destination = $conf['destination']; + } + if (!empty($conf['extra_headers'])) { + $this->_extra_headers = $conf['extra_headers']; + } + } + + /** + * Opens the handler. + * + * @access public + * @since Log 1.9.6 + */ + function open() + { + $this->_opened = true; + return true; + } + + /** + * Closes the handler. + * + * @access public + * @since Log 1.9.6 + */ + function close() + { + $this->_opened = false; + return true; + } + + /** + * Logs $message using PHP's error_log() function. The message is also + * passed along to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + $success = error_log($this->_ident . ': ' . $message, $this->_type, + $this->_destination, $this->_extra_headers); + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return $success; + } + +} diff --git a/egw-pear/Log/file.php b/egw-pear/Log/file.php new file mode 100644 index 0000000000..cd0083e7a6 --- /dev/null +++ b/egw-pear/Log/file.php @@ -0,0 +1,312 @@ + + * @author Roman Neuhauser + * @since Log 1.0 + * @package Log + * + * @example file.php Using the file handler. + */ +class Log_file extends Log +{ + /** + * String containing the name of the log file. + * @var string + * @access private + */ + var $_filename = 'php.log'; + + /** + * Handle to the log file. + * @var resource + * @access private + */ + var $_fp = false; + + /** + * Should new log entries be append to an existing log file, or should the + * a new log file overwrite an existing one? + * @var boolean + * @access private + */ + var $_append = true; + + /** + * Should advisory file locking (i.e., flock()) be used? + * @var boolean + * @access private + */ + var $_locking = false; + + /** + * Integer (in octal) containing the log file's permissions mode. + * @var integer + * @access private + */ + var $_mode = 0644; + + /** + * Integer (in octal) specifying the file permission mode that will be + * used when creating directories that do not already exist. + * @var integer + * @access private + */ + var $_dirmode = 0755; + + /** + * String containing the format of a log line. + * @var string + * @access private + */ + var $_lineFormat = '%1$s %2$s [%3$s] %4$s'; + + /** + * String containing the timestamp format. It will be passed directly to + * strftime(). Note that the timestamp string will generated using the + * current locale. + * @var string + * @access private + */ + var $_timeFormat = '%b %d %H:%M:%S'; + + /** + * String containing the end-on-line character sequence. + * @var string + * @access private + */ + var $_eol = "\n"; + + /** + * Constructs a new Log_file object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_file($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_filename = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (isset($conf['append'])) { + $this->_append = $conf['append']; + } + + if (isset($conf['locking'])) { + $this->_locking = $conf['locking']; + } + + if (!empty($conf['mode'])) { + if (is_string($conf['mode'])) { + $this->_mode = octdec($conf['mode']); + } else { + $this->_mode = $conf['mode']; + } + } + + if (!empty($conf['dirmode'])) { + if (is_string($conf['dirmode'])) { + $this->_dirmode = octdec($conf['dirmode']); + } else { + $this->_dirmode = $conf['dirmode']; + } + } + + if (!empty($conf['lineFormat'])) { + $this->_lineFormat = str_replace(array_keys($this->_formatMap), + array_values($this->_formatMap), + $conf['lineFormat']); + } + + if (!empty($conf['timeFormat'])) { + $this->_timeFormat = $conf['timeFormat']; + } + + if (!empty($conf['eol'])) { + $this->_eol = $conf['eol']; + } else { + $this->_eol = (strstr(PHP_OS, 'WIN')) ? "\r\n" : "\n"; + } + + register_shutdown_function(array(&$this, '_Log_file')); + } + + /** + * Destructor + */ + function _Log_file() + { + if ($this->_opened) { + $this->close(); + } + } + + /** + * Creates the given directory path. If the parent directories don't + * already exist, they will be created, too. + * + * This implementation is inspired by Python's os.makedirs function. + * + * @param string $path The full directory path to create. + * @param integer $mode The permissions mode with which the + * directories will be created. + * + * @return True if the full path is successfully created or already + * exists. + * + * @access private + */ + function _mkpath($path, $mode = 0700) + { + /* Separate the last pathname component from the rest of the path. */ + $head = dirname($path); + $tail = basename($path); + + /* Make sure we've split the path into two complete components. */ + if (empty($tail)) { + $head = dirname($path); + $tail = basename($path); + } + + /* Recurse up the path if our current segment does not exist. */ + if (!empty($head) && !empty($tail) && !is_dir($head)) { + $this->_mkpath($head, $mode); + } + + /* Create this segment of the path. */ + return @mkdir($head, $mode); + } + + /** + * Opens the log file for output. If the specified log file does not + * already exist, it will be created. By default, new log entries are + * appended to the end of the log file. + * + * This is implicitly called by log(), if necessary. + * + * @access public + */ + function open() + { + if (!$this->_opened) { + /* If the log file's directory doesn't exist, create it. */ + if (!is_dir(dirname($this->_filename))) { + $this->_mkpath($this->_filename, $this->_dirmode); + } + + /* Determine whether the log file needs to be created. */ + $creating = !file_exists($this->_filename); + + /* Obtain a handle to the log file. */ + $this->_fp = fopen($this->_filename, ($this->_append) ? 'a' : 'w'); + + /* We consider the file "opened" if we have a valid file pointer. */ + $this->_opened = ($this->_fp !== false); + + /* Attempt to set the file's permissions if we just created it. */ + if ($creating && $this->_opened) { + chmod($this->_filename, $this->_mode); + } + } + + return $this->_opened; + } + + /** + * Closes the log file if it is open. + * + * @access public + */ + function close() + { + /* If the log file is open, close it. */ + if ($this->_opened && fclose($this->_fp)) { + $this->_opened = false; + } + + return ($this->_opened === false); + } + + /** + * Flushes all pending data to the file handle. + * + * @access public + * @since Log 1.8.2 + */ + function flush() + { + return fflush($this->_fp); + } + + /** + * Logs $message to the output window. The message is also passed along + * to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the log file isn't already open, open it now. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build the string containing the complete log line. */ + $line = $this->_format($this->_lineFormat, + strftime($this->_timeFormat), + $priority, $message) . $this->_eol; + + /* If locking is enabled, acquire an exclusive lock on the file. */ + if ($this->_locking) { + flock($this->_fp, LOCK_EX); + } + + /* Write the log line to the log file. */ + $success = (fwrite($this->_fp, $line) !== false); + + /* Unlock the file now that we're finished writing to it. */ + if ($this->_locking) { + flock($this->_fp, LOCK_UN); + } + + /* Notify observers about this log message. */ + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return $success; + } + +} diff --git a/egw-pear/Log/mail.php b/egw-pear/Log/mail.php new file mode 100644 index 0000000000..2c42db25bb --- /dev/null +++ b/egw-pear/Log/mail.php @@ -0,0 +1,246 @@ + + * @author Jon Parise + * @since Log 1.3 + * @package Log + * + * @example mail.php Using the mail handler. + */ +class Log_mail extends Log +{ + /** + * String holding the recipient's email address. + * @var string + * @access private + */ + var $_recipient = ''; + + /** + * String holding the sender's email address. + * @var string + * @access private + */ + var $_from = ''; + + /** + * String holding the email's subject. + * @var string + * @access private + */ + var $_subject = '[Log_mail] Log message'; + + /** + * String holding an optional preamble for the log messages. + * @var string + * @access private + */ + var $_preamble = ''; + + /** + * String containing the format of a log line. + * @var string + * @access private + */ + var $_lineFormat = '%1$s %2$s [%3$s] %4$s'; + + /** + * String containing the timestamp format. It will be passed directly to + * strftime(). Note that the timestamp string will generated using the + * current locale. + * @var string + * @access private + */ + var $_timeFormat = '%b %d %H:%M:%S'; + + /** + * String holding the mail message body. + * @var string + * @access private + */ + var $_message = ''; + + + /** + * Constructs a new Log_mail object. + * + * Here is how you can customize the mail driver with the conf[] hash : + * $conf['from'] : the mail's "From" header line, + * $conf['subject'] : the mail's "Subject" line. + * + * @param string $name The filename of the logfile. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_mail($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_recipient = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (!empty($conf['from'])) { + $this->_from = $conf['from']; + } else { + $this->_from = ini_get('sendmail_from'); + } + + if (!empty($conf['subject'])) { + $this->_subject = $conf['subject']; + } + + if (!empty($conf['preamble'])) { + $this->_preamble = $conf['preamble']; + } + + if (!empty($conf['lineFormat'])) { + $this->_lineFormat = str_replace(array_keys($this->_formatMap), + array_values($this->_formatMap), + $conf['lineFormat']); + } + + if (!empty($conf['timeFormat'])) { + $this->_timeFormat = $conf['timeFormat']; + } + + /* register the destructor */ + register_shutdown_function(array(&$this, '_Log_mail')); + } + + /** + * Destructor. Calls close(). + * + * @access private + */ + function _Log_mail() + { + $this->close(); + } + + /** + * Starts a new mail message. + * This is implicitly called by log(), if necessary. + * + * @access public + */ + function open() + { + if (!$this->_opened) { + if (!empty($this->_preamble)) { + $this->_message = $this->_preamble . "\r\n\r\n"; + } + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the message, if it is open, and sends the mail. + * This is implicitly called by the destructor, if necessary. + * + * @access public + */ + function close() + { + if ($this->_opened) { + if (!empty($this->_message)) { + $headers = "From: $this->_from\r\n"; + $headers .= "User-Agent: Log_mail"; + + if (mail($this->_recipient, $this->_subject, $this->_message, + $headers) == false) { + error_log("Log_mail: Failure executing mail()", 0); + return false; + } + + /* Clear the message string now that the email has been sent. */ + $this->_message = ''; + } + $this->_opened = false; + } + + return ($this->_opened === false); + } + + /** + * Flushes the log output by forcing the email message to be sent now. + * Events that are logged after flush() is called will be appended to a + * new email message. + * + * @access public + * @since Log 1.8.2 + */ + function flush() + { + /* + * It's sufficient to simply call close() to flush the output. + * The next call to log() will cause the handler to be reopened. + */ + return $this->close(); + } + + /** + * Writes $message to the currently open mail message. + * Calls open(), if necessary. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the message isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build the string containing the complete log line. */ + $this->_message .= $this->_format($this->_lineFormat, + strftime($this->_timeFormat), + $priority, $message) . "\r\n"; + + /* Notify observers about this log message. */ + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } +} diff --git a/egw-pear/Log/mcal.php b/egw-pear/Log/mcal.php new file mode 100644 index 0000000000..ab88d457e5 --- /dev/null +++ b/egw-pear/Log/mcal.php @@ -0,0 +1,170 @@ + + * @since Horde 1.3 + * @since Log 1.0 + * @package Log + */ +class Log_mcal extends Log +{ + /** + * holding the calendar specification to connect to. + * @var string + * @access private + */ + var $_calendar = '{localhost/mstore}'; + + /** + * holding the username to use. + * @var string + * @access private + */ + var $_username = ''; + + /** + * holding the password to use. + * @var string + * @access private + */ + var $_password = ''; + + /** + * holding the options to pass to the calendar stream. + * @var integer + * @access private + */ + var $_options = 0; + + /** + * ResourceID of the MCAL stream. + * @var string + * @access private + */ + var $_stream = ''; + + /** + * Integer holding the log facility to use. + * @var string + * @access private + */ + var $_name = LOG_SYSLOG; + + + /** + * Constructs a new Log_mcal object. + * + * @param string $name The category to use for our events. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_mcal($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_name = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + $this->_calendar = $conf['calendar']; + $this->_username = $conf['username']; + $this->_password = $conf['password']; + $this->_options = $conf['options']; + } + + /** + * Opens a calendar stream, if it has not already been + * opened. This is implicitly called by log(), if necessary. + * @access public + */ + function open() + { + if (!$this->_opened) { + $this->_stream = mcal_open($this->_calendar, $this->_username, + $this->_password, $this->_options); + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the calendar stream, if it is open. + * @access public + */ + function close() + { + if ($this->_opened) { + mcal_close($this->_stream); + $this->_opened = false; + } + + return ($this->_opened === false); + } + + /** + * Logs $message and associated information to the currently open + * calendar stream. Calls open() if necessary. Also passes the + * message along to any Log_observer instances that are observing + * this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + $date_str = date('Y:n:j:G:i:s'); + $dates = explode(':', $date_str); + + mcal_event_init($this->_stream); + mcal_event_set_title($this->_stream, $this->_ident); + mcal_event_set_category($this->_stream, $this->_name); + mcal_event_set_description($this->_stream, $message); + mcal_event_add_attribute($this->_stream, 'priority', $priority); + mcal_event_set_start($this->_stream, $dates[0], $dates[1], $dates[2], + $dates[3], $dates[4], $dates[5]); + mcal_event_set_end($this->_stream, $dates[0], $dates[1], $dates[2], + $dates[3], $dates[4], $dates[5]); + mcal_append_event($this->_stream); + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + +} diff --git a/egw-pear/Log/mdb2.php b/egw-pear/Log/mdb2.php new file mode 100644 index 0000000000..cc06787a31 --- /dev/null +++ b/egw-pear/Log/mdb2.php @@ -0,0 +1,358 @@ + + * @author Jon Parise + * @since Log 1.9.0 + * @package Log + */ +class Log_mdb2 extends Log +{ + /** + * Variable containing the DSN information. + * @var mixed + * @access private + */ + var $_dsn = ''; + + /** + * Array containing our set of DB configuration options. + * @var array + * @access private + */ + var $_options = array('persistent' => true); + + /** + * Object holding the database handle. + * @var object + * @access private + */ + var $_db = null; + + /** + * Resource holding the prepared statement handle. + * @var resource + * @access private + */ + var $_statement = null; + + /** + * Flag indicating that we're using an existing database connection. + * @var boolean + * @access private + */ + var $_existingConnection = false; + + /** + * String holding the database table to use. + * @var string + * @access private + */ + var $_table = 'log_table'; + + /** + * String holding the name of the ID sequence. + * @var string + * @access private + */ + var $_sequence = 'log_id'; + + /** + * Maximum length of the $ident string. This corresponds to the size of + * the 'ident' column in the SQL table. + * @var integer + * @access private + */ + var $_identLimit = 16; + + /** + * Set of field types used in the database table. + * @var array + * @access private + */ + var $_types = array( + 'id' => 'integer', + 'logtime' => 'timestamp', + 'ident' => 'text', + 'priority' => 'text', + 'message' => 'clob' + ); + + /** + * Constructs a new sql logging object. + * + * @param string $name The target SQL table. + * @param string $ident The identification field. + * @param array $conf The connection configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_mdb2($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_table = $name; + $this->_mask = Log::UPTO($level); + + /* If an options array was provided, use it. */ + if (isset($conf['options']) && is_array($conf['options'])) { + $this->_options = $conf['options']; + } + + /* If a specific sequence name was provided, use it. */ + if (!empty($conf['sequence'])) { + $this->_sequence = $conf['sequence']; + } + + /* If a specific sequence name was provided, use it. */ + if (isset($conf['identLimit'])) { + $this->_identLimit = $conf['identLimit']; + } + + /* Now that the ident limit is confirmed, set the ident string. */ + $this->setIdent($ident); + + /* If an existing database connection was provided, use it. */ + if (isset($conf['db'])) { + $this->_db = &$conf['db']; + $this->_existingConnection = true; + $this->_opened = true; + } elseif (isset($conf['singleton'])) { + $this->_db = &MDB2::singleton($conf['singleton'], $this->_options); + $this->_existingConnection = true; + $this->_opened = true; + } else { + $this->_dsn = $conf['dsn']; + } + } + + /** + * Opens a connection to the database, if it has not already + * been opened. This is implicitly called by log(), if necessary. + * + * @return boolean True on success, false on failure. + * @access public + */ + function open() + { + if (!$this->_opened) { + /* Use the DSN and options to create a database connection. */ + $this->_db = &MDB2::connect($this->_dsn, $this->_options); + if (PEAR::isError($this->_db)) { + return false; + } + + /* Create a prepared statement for repeated use in log(). */ + if (!$this->_prepareStatement()) { + return false; + } + + /* We now consider out connection open. */ + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the connection to the database if it is still open and we were + * the ones that opened it. It is the caller's responsible to close an + * existing connection that was passed to us via $conf['db']. + * + * @return boolean True on success, false on failure. + * @access public + */ + function close() + { + /* If we have a statement object, free it. */ + if (is_object($this->_statement)) { + $this->_statement->free(); + $this->_statement = null; + } + + /* If we opened the database connection, disconnect it. */ + if ($this->_opened && !$this->_existingConnection) { + $this->_opened = false; + return $this->_db->disconnect(); + } + + return ($this->_opened === false); + } + + /** + * Sets this Log instance's identification string. Note that this + * SQL-specific implementation will limit the length of the $ident string + * to sixteen (16) characters. + * + * @param string $ident The new identification string. + * + * @access public + * @since Log 1.8.5 + */ + function setIdent($ident) + { + $this->_ident = substr($ident, 0, $this->_identLimit); + } + + /** + * Inserts $message to the currently open database. Calls open(), + * if necessary. Also passes the message along to any Log_observer + * instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* If we don't already have a statement object, create one. */ + if (!is_object($this->_statement) && !$this->_prepareStatement()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build our set of values for this log entry. */ + $values = array( + 'id' => $this->_db->nextId($this->_sequence), + 'logtime' => MDB2_Date::mdbNow(), + 'ident' => $this->_ident, + 'priority' => $priority, + 'message' => $message + ); + + /* Execute the SQL query for this log entry insertion. */ + $this->_db->expectError(MDB2_ERROR_NOSUCHTABLE); + $result = &$this->_statement->execute($values); + $this->_db->popExpect(); + + /* Attempt to handle any errors. */ + if (PEAR::isError($result)) { + /* We can only handle MDB2_ERROR_NOSUCHTABLE errors. */ + if ($result->getCode() != MDB2_ERROR_NOSUCHTABLE) { + return false; + } + + /* Attempt to create the target table. */ + if (!$this->_createTable()) { + return false; + } + + /* Recreate our prepared statement resource. */ + $this->_statement->free(); + if (!$this->_prepareStatement()) { + return false; + } + + /* Attempt to re-execute the insertion query. */ + $result = $this->_statement->execute($values); + if (PEAR::isError($result)) { + return false; + } + } + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + + /** + * Create the log table in the database. + * + * @return boolean True on success or false on failure. + * @access private + */ + function _createTable() + { + $this->_db->loadModule('Manager', null, true); + $result = $this->_db->manager->createTable( + $this->_table, + array( + 'id' => array('type' => $this->_types['id']), + 'logtime' => array('type' => $this->_types['logtime']), + 'ident' => array('type' => $this->_types['ident']), + 'priority' => array('type' => $this->_types['priority']), + 'message' => array('type' => $this->_types['message']) + ) + ); + if (PEAR::isError($result)) { + return false; + } + + $result = $this->_db->manager->createIndex( + $this->_table, + 'unique_id', + array('fields' => array('id' => true), 'unique' => true) + ); + if (PEAR::isError($result)) { + return false; + } + + return true; + } + + /** + * Prepare the SQL insertion statement. + * + * @return boolean True if the statement was successfully created. + * + * @access private + * @since Log 1.9.0 + */ + function _prepareStatement() + { + $this->_statement = &$this->_db->prepare( + 'INSERT INTO ' . $this->_table . + ' (id, logtime, ident, priority, message)' . + ' VALUES(:id, :logtime, :ident, :priority, :message)', + $this->_types, MDB2_PREPARE_MANIP); + + /* Return success if we didn't generate an error. */ + return (PEAR::isError($this->_statement) === false); + } +} diff --git a/egw-pear/Log/null.php b/egw-pear/Log/null.php new file mode 100644 index 0000000000..58cb9b43f8 --- /dev/null +++ b/egw-pear/Log/null.php @@ -0,0 +1,91 @@ + + * @since Log 1.8.2 + * @package Log + * + * @example null.php Using the null handler. + */ +class Log_null extends Log +{ + /** + * Constructs a new Log_null object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_null($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + } + + /** + * Opens the handler. + * + * @access public + * @since Log 1.9.6 + */ + function open() + { + $this->_opened = true; + return true; + } + + /** + * Closes the handler. + * + * @access public + * @since Log 1.9.6 + */ + function close() + { + $this->_opened = false; + return true; + } + + /** + * Simply consumes the log event. The message will still be passed + * along to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + +} diff --git a/egw-pear/Log/observer.php b/egw-pear/Log/observer.php new file mode 100644 index 0000000000..ccb5c2528f --- /dev/null +++ b/egw-pear/Log/observer.php @@ -0,0 +1,129 @@ + + * @since Horde 1.3 + * @since Log 1.0 + * @package Log + * + * @example observer_mail.php An example Log_observer implementation. + */ +class Log_observer +{ + /** + * Instance-specific unique identification number. + * + * @var integer + * @access private + */ + var $_id = 0; + + /** + * The minimum priority level of message that we want to hear about. + * PEAR_LOG_EMERG is the highest priority, so we will only hear messages + * with an integer priority value less than or equal to ours. It defaults + * to PEAR_LOG_INFO, which listens to everything except PEAR_LOG_DEBUG. + * + * @var string + * @access private + */ + var $_priority = PEAR_LOG_INFO; + + /** + * Creates a new basic Log_observer instance. + * + * @param integer $priority The highest priority at which to receive + * log event notifications. + * + * @access public + */ + function Log_observer($priority = PEAR_LOG_INFO) + { + $this->_id = md5(microtime()); + $this->_priority = $priority; + } + + /** + * Attempts to return a new concrete Log_observer instance of the requested + * type. + * + * @param string $type The type of concreate Log_observer subclass + * to return. + * @param integer $priority The highest priority at which to receive + * log event notifications. + * @param array $conf Optional associative array of additional + * configuration values. + * + * @return object The newly created concrete Log_observer + * instance, or null on an error. + */ + function &factory($type, $priority = PEAR_LOG_INFO, $conf = array()) + { + $type = strtolower($type); + $class = 'Log_observer_' . $type; + + /* + * If the desired class already exists (because the caller has supplied + * it from some custom location), simply instantiate and return a new + * instance. + */ + if (class_exists($class)) { + $object = new $class($priority, $conf); + return $object; + } + + /* Support both the new-style and old-style file naming conventions. */ + $newstyle = true; + $classfile = dirname(__FILE__) . '/observer_' . $type . '.php'; + + if (!file_exists($classfile)) { + $classfile = 'Log/' . $type . '.php'; + $newstyle = false; + } + + /* + * Attempt to include our version of the named class, but don't treat + * a failure as fatal. The caller may have already included their own + * version of the named class. + */ + @include_once $classfile; + + /* If the class exists, return a new instance of it. */ + if (class_exists($class)) { + /* Support both new-style and old-style construction. */ + if ($newstyle) { + $object = new $class($priority, $conf); + } else { + $object = new $class($priority); + } + return $object; + } + + $null = null; + return $null; + } + + /** + * This is a stub method to make sure that Log_Observer classes do + * something when they are notified of a message. The default behavior + * is to just print the message, which is obviously not desireable in + * practically any situation - which is why you need to override this + * method. :) + * + * @param array $event A hash describing the log event. + */ + function notify($event) + { + print_r($event); + } +} diff --git a/egw-pear/Log/sql.php b/egw-pear/Log/sql.php new file mode 100644 index 0000000000..99f7a6dba0 --- /dev/null +++ b/egw-pear/Log/sql.php @@ -0,0 +1,294 @@ + + * @since Horde 1.3 + * @since Log 1.0 + * @package Log + * + * @example sql.php Using the SQL handler. + */ +class Log_sql extends Log +{ + /** + * Variable containing the DSN information. + * @var mixed + * @access private + */ + var $_dsn = ''; + + /** + * String containing the SQL insertion statement. + * + * @var string + * @access private + */ + var $_sql = ''; + + /** + * Array containing our set of DB configuration options. + * @var array + * @access private + */ + var $_options = array('persistent' => true); + + /** + * Object holding the database handle. + * @var object + * @access private + */ + var $_db = null; + + /** + * Resource holding the prepared statement handle. + * @var resource + * @access private + */ + var $_statement = null; + + /** + * Flag indicating that we're using an existing database connection. + * @var boolean + * @access private + */ + var $_existingConnection = false; + + /** + * String holding the database table to use. + * @var string + * @access private + */ + var $_table = 'log_table'; + + /** + * String holding the name of the ID sequence. + * @var string + * @access private + */ + var $_sequence = 'log_id'; + + /** + * Maximum length of the $ident string. This corresponds to the size of + * the 'ident' column in the SQL table. + * @var integer + * @access private + */ + var $_identLimit = 16; + + + /** + * Constructs a new sql logging object. + * + * @param string $name The target SQL table. + * @param string $ident The identification field. + * @param array $conf The connection configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_sql($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_table = $name; + $this->_mask = Log::UPTO($level); + + /* Now that we have a table name, assign our SQL statement. */ + if (!empty($this->_sql)) { + $this->_sql = $conf['sql']; + } else { + $this->_sql = 'INSERT INTO ' . $this->_table . + ' (id, logtime, ident, priority, message)' . + ' VALUES(?, CURRENT_TIMESTAMP, ?, ?, ?)'; + } + + /* If an options array was provided, use it. */ + if (isset($conf['options']) && is_array($conf['options'])) { + $this->_options = $conf['options']; + } + + /* If a specific sequence name was provided, use it. */ + if (!empty($conf['sequence'])) { + $this->_sequence = $conf['sequence']; + } + + /* If a specific sequence name was provided, use it. */ + if (isset($conf['identLimit'])) { + $this->_identLimit = $conf['identLimit']; + } + + /* Now that the ident limit is confirmed, set the ident string. */ + $this->setIdent($ident); + + /* If an existing database connection was provided, use it. */ + if (isset($conf['db'])) { + $this->_db = &$conf['db']; + $this->_existingConnection = true; + $this->_opened = true; + } else { + $this->_dsn = $conf['dsn']; + } + } + + /** + * Opens a connection to the database, if it has not already + * been opened. This is implicitly called by log(), if necessary. + * + * @return boolean True on success, false on failure. + * @access public + */ + function open() + { + if (!$this->_opened) { + /* Use the DSN and options to create a database connection. */ + $this->_db = &DB::connect($this->_dsn, $this->_options); + if (DB::isError($this->_db)) { + return false; + } + + /* Create a prepared statement for repeated use in log(). */ + if (!$this->_prepareStatement()) { + return false; + } + + /* We now consider out connection open. */ + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the connection to the database if it is still open and we were + * the ones that opened it. It is the caller's responsible to close an + * existing connection that was passed to us via $conf['db']. + * + * @return boolean True on success, false on failure. + * @access public + */ + function close() + { + if ($this->_opened && !$this->_existingConnection) { + $this->_opened = false; + $this->_db->freePrepared($this->_statement); + return $this->_db->disconnect(); + } + + return ($this->_opened === false); + } + + /** + * Sets this Log instance's identification string. Note that this + * SQL-specific implementation will limit the length of the $ident string + * to sixteen (16) characters. + * + * @param string $ident The new identification string. + * + * @access public + * @since Log 1.8.5 + */ + function setIdent($ident) + { + $this->_ident = substr($ident, 0, $this->_identLimit); + } + + /** + * Inserts $message to the currently open database. Calls open(), + * if necessary. Also passes the message along to any Log_observer + * instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* If we don't already have our statement object yet, create it. */ + if (!is_object($this->_statement) && !$this->_prepareStatement()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build our set of values for this log entry. */ + $id = $this->_db->nextId($this->_sequence); + $values = array($id, $this->_ident, $priority, $message); + + /* Execute the SQL query for this log entry insertion. */ + $result =& $this->_db->execute($this->_statement, $values); + if (DB::isError($result)) { + return false; + } + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + + /** + * Prepare the SQL insertion statement. + * + * @return boolean True if the statement was successfully created. + * + * @access private + * @since Log 1.9.1 + */ + function _prepareStatement() + { + $this->_statement = $this->_db->prepare($this->_sql); + + /* Return success if we didn't generate an error. */ + return (DB::isError($this->_statement) === false); + } +} diff --git a/egw-pear/Log/sqlite.php b/egw-pear/Log/sqlite.php new file mode 100644 index 0000000000..a558fee13b --- /dev/null +++ b/egw-pear/Log/sqlite.php @@ -0,0 +1,225 @@ + + * @author Jon Parise + * @since Log 1.8.3 + * @package Log + * + * @example sqlite.php Using the Sqlite handler. + */ +class Log_sqlite extends Log +{ + /** + * Array containing the connection defaults + * @var array + * @access private + */ + var $_options = array('mode' => 0666, + 'persistent' => false); + + /** + * Object holding the database handle. + * @var object + * @access private + */ + var $_db = null; + + /** + * Flag indicating that we're using an existing database connection. + * @var boolean + * @access private + */ + var $_existingConnection = false; + + /** + * String holding the database table to use. + * @var string + * @access private + */ + var $_table = 'log_table'; + + + /** + * Constructs a new sql logging object. + * + * @param string $name The target SQL table. + * @param string $ident The identification field. + * @param mixed $conf Can be an array of configuration options used + * to open a new database connection + * or an already opened sqlite connection. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_sqlite($name, $ident = '', &$conf, $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_table = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (is_array($conf)) { + foreach ($conf as $k => $opt) { + $this->_options[$k] = $opt; + } + } else { + // If an existing database connection was provided, use it. + $this->_db =& $conf; + $this->_existingConnection = true; + } + } + + /** + * Opens a connection to the database, if it has not already + * been opened. This is implicitly called by log(), if necessary. + * + * @return boolean True on success, false on failure. + * @access public + */ + function open() + { + if (is_resource($this->_db)) { + $this->_opened = true; + return $this->_createTable(); + } else { + /* Set the connection function based on the 'persistent' option. */ + if (empty($this->_options['persistent'])) { + $connectFunction = 'sqlite_open'; + } else { + $connectFunction = 'sqlite_popen'; + } + + /* Attempt to connect to the database. */ + if ($this->_db = $connectFunction($this->_options['filename'], + (int)$this->_options['mode'], + $error)) { + $this->_opened = true; + return $this->_createTable(); + } + } + + return $this->_opened; + } + + /** + * Closes the connection to the database if it is still open and we were + * the ones that opened it. It is the caller's responsible to close an + * existing connection that was passed to us via $conf['db']. + * + * @return boolean True on success, false on failure. + * @access public + */ + function close() + { + /* We never close existing connections. */ + if ($this->_existingConnection) { + return false; + } + + if ($this->_opened) { + $this->_opened = false; + sqlite_close($this->_db); + } + + return ($this->_opened === false); + } + + /** + * Inserts $message to the currently open database. Calls open(), + * if necessary. Also passes the message along to any Log_observer + * instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + // Extract the string representation of the message. + $message = $this->_extractMessage($message); + + // Build the SQL query for this log entry insertion. + $q = sprintf('INSERT INTO [%s] (logtime, ident, priority, message) ' . + "VALUES ('%s', '%s', %d, '%s')", + $this->_table, + strftime('%Y-%m-%d %H:%M:%S', time()), + sqlite_escape_string($this->_ident), + $priority, + sqlite_escape_string($message)); + if (!($res = @sqlite_unbuffered_query($this->_db, $q))) { + return false; + } + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + + /** + * Checks whether the log table exists and creates it if necessary. + * + * @return boolean True on success or false on failure. + * @access private + */ + function _createTable() + { + $q = "SELECT name FROM sqlite_master WHERE name='" . $this->_table . + "' AND type='table'"; + + $res = sqlite_query($this->_db, $q); + + if (sqlite_num_rows($res) == 0) { + $q = 'CREATE TABLE [' . $this->_table . '] (' . + 'id INTEGER PRIMARY KEY NOT NULL, ' . + 'logtime NOT NULL, ' . + 'ident CHAR(16) NOT NULL, ' . + 'priority INT NOT NULL, ' . + 'message)'; + + if (!($res = sqlite_unbuffered_query($this->_db, $q))) { + return false; + } + } + + return true; + } + +} diff --git a/egw-pear/Log/syslog.php b/egw-pear/Log/syslog.php new file mode 100644 index 0000000000..a34bc859d8 --- /dev/null +++ b/egw-pear/Log/syslog.php @@ -0,0 +1,160 @@ + + * @since Horde 1.3 + * @since Log 1.0 + * @package Log + * + * @example syslog.php Using the syslog handler. + */ +class Log_syslog extends Log +{ + /** + * Integer holding the log facility to use. + * @var string + * @access private + */ + var $_name = LOG_SYSLOG; + + /** + * Constructs a new syslog object. + * + * @param string $name The syslog facility. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_syslog($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + /* Ensure we have a valid integer value for $name. */ + if (empty($name) || !is_int($name)) { + $name = LOG_SYSLOG; + } + + $this->_id = md5(microtime()); + $this->_name = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + } + + /** + * Opens a connection to the system logger, if it has not already + * been opened. This is implicitly called by log(), if necessary. + * @access public + */ + function open() + { + if (!$this->_opened) { + openlog($this->_ident, LOG_PID, $this->_name); + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the connection to the system logger, if it is open. + * @access public + */ + function close() + { + if ($this->_opened) { + closelog(); + $this->_opened = false; + } + + return ($this->_opened === false); + } + + /** + * Sends $message to the currently open syslog connection. Calls + * open() if necessary. Also passes the message along to any Log_observer + * instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param int $priority (optional) The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + if (!syslog($this->_toSyslog($priority), $message)) { + return false; + } + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + + /** + * Converts a PEAR_LOG_* constant into a syslog LOG_* constant. + * + * This function exists because, under Windows, not all of the LOG_* + * constants have unique values. Instead, the PEAR_LOG_* were introduced + * for global use, with the conversion to the LOG_* constants kept local to + * to the syslog driver. + * + * @param int $priority PEAR_LOG_* value to convert to LOG_* value. + * + * @return The LOG_* representation of $priority. + * + * @access private + */ + function _toSyslog($priority) + { + static $priorities = array( + PEAR_LOG_EMERG => LOG_EMERG, + PEAR_LOG_ALERT => LOG_ALERT, + PEAR_LOG_CRIT => LOG_CRIT, + PEAR_LOG_ERR => LOG_ERR, + PEAR_LOG_WARNING => LOG_WARNING, + PEAR_LOG_NOTICE => LOG_NOTICE, + PEAR_LOG_INFO => LOG_INFO, + PEAR_LOG_DEBUG => LOG_DEBUG + ); + + /* If we're passed an unknown priority, default to LOG_INFO. */ + if (!is_int($priority) || !in_array($priority, $priorities)) { + return LOG_INFO; + } + + return $priorities[$priority]; + } + +} diff --git a/egw-pear/Log/win.php b/egw-pear/Log/win.php new file mode 100644 index 0000000000..21795d965a --- /dev/null +++ b/egw-pear/Log/win.php @@ -0,0 +1,269 @@ + + * @since Log 1.7.0 + * @package Log + * + * @example win.php Using the window handler. + */ +class Log_win extends Log +{ + /** + * The name of the output window. + * @var string + * @access private + */ + var $_name = 'LogWindow'; + + /** + * The title of the output window. + * @var string + * @access private + */ + var $_title = 'Log Output Window'; + + /** + * Mapping of log priorities to styles. + * @var array + * @access private + */ + var $_styles = array( + PEAR_LOG_EMERG => 'color: red;', + PEAR_LOG_ALERT => 'color: orange;', + PEAR_LOG_CRIT => 'color: yellow;', + PEAR_LOG_ERR => 'color: green;', + PEAR_LOG_WARNING => 'color: blue;', + PEAR_LOG_NOTICE => 'color: indigo;', + PEAR_LOG_INFO => 'color: violet;', + PEAR_LOG_DEBUG => 'color: black;' + ); + + /** + * String buffer that holds line that are pending output. + * @var array + * @access private + */ + var $_buffer = array(); + + /** + * Constructs a new Log_win object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_win($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_name = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (isset($conf['title'])) { + $this->_title = $conf['title']; + } + if (isset($conf['styles']) && is_array($conf['styles'])) { + $this->_styles = $conf['styles']; + } + if (isset($conf['colors']) && is_array($conf['colors'])) { + foreach ($conf['colors'] as $level => $color) { + $this->_styles[$level] .= "color: $color;"; + } + } + + register_shutdown_function(array(&$this, '_Log_win')); + } + + /** + * Destructor + */ + function _Log_win() + { + if ($this->_opened || (count($this->_buffer) > 0)) { + $this->close(); + } + } + + /** + * The first time open() is called, it will open a new browser window and + * prepare it for output. + * + * This is implicitly called by log(), if necessary. + * + * @access public + */ + function open() + { + if (!$this->_opened) { + $win = $this->_name; + $styles = $this->_styles; + + if (!empty($this->_ident)) { + $identHeader = "$win.document.writeln('Ident')"; + } else { + $identHeader = ''; + } + + echo <<< EOT + +EOT; + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the output stream if it is open. If there are still pending + * lines in the output buffer, the output window will be opened so that + * the buffer can be drained. + * + * @access public + */ + function close() + { + /* + * If there are still lines waiting to be written, open the output + * window so that we can drain the buffer. + */ + if (!$this->_opened && (count($this->_buffer) > 0)) { + $this->open(); + } + + if ($this->_opened) { + $this->_writeln(''); + $this->_writeln(''); + $this->_opened = false; + } + + return ($this->_opened === false); + } + + /** + * Writes a single line of text to the output window. + * + * @param string $line The line of text to write. + * + * @access private + */ + function _writeln($line) + { + /* Add this line to our output buffer. */ + $this->_buffer[] = $line; + + /* Buffer the output until this page's headers have been sent. */ + if (!headers_sent()) { + return; + } + + /* If we haven't already opened the output window, do so now. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Drain the buffer to the output window. */ + $win = $this->_name; + foreach ($this->_buffer as $line) { + echo "\n"; + } + + /* Now that the buffer has been drained, clear it. */ + $this->_buffer = array(); + } + + /** + * Logs $message to the output window. The message is also passed along + * to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + $message = preg_replace('/\r\n|\n|\r/', '
', $message); + + list($usec, $sec) = explode(' ', microtime()); + + /* Build the output line that contains the log entry row. */ + $line = ''; + $line .= sprintf('%s.%s', + strftime('%H:%M:%S', $sec), substr($usec, 2, 2)); + if (!empty($this->_ident)) { + $line .= '' . $this->_ident . ''; + } + $line .= '' . ucfirst($this->priorityToString($priority)) . ''; + $line .= sprintf('%s', $priority, $message); + $line .= ''; + + $this->_writeln($line); + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + +} diff --git a/egw-pear/Net/IMAP.php b/egw-pear/Net/IMAP.php new file mode 100644 index 0000000000..41ff1697bb --- /dev/null +++ b/egw-pear/Net/IMAP.php @@ -0,0 +1,2818 @@ + | +// +----------------------------------------------------------------------+ + + +require_once 'Net/IMAPProtocol.php'; + + +/** + * Provides an implementation of the IMAP protocol using PEAR's + * Net_Socket:: class. + * + * @package Net_IMAP + * @author Damian Alejandro Fernandez Sosa + */ +class Net_IMAP extends Net_IMAPProtocol { + + /** + * Constructor + * + * Instantiates a new Net_SMTP object, overriding any defaults + * with parameters that are passed in. + * + * @param string $host The server to connect to. + * @param int $port The port to connect to. + * @param bool $enableSTARTTLS enable STARTTLS support + */ + function Net_IMAP($host = 'localhost', $port = 143, $enableSTARTTLS = true) + { + $this->Net_IMAPProtocol(); + $ret = $this->connect( $host , $port, $enableSTARTTLS); + } + + + + /** + * Attempt to connect to the IMAP server located at $host $port + * @param string $host The IMAP server + * @param string $port The IMAP port + * @param bool $enableSTARTTLS enable STARTTLS support + * + * It is only useful in a very few circunstances + * because the contructor already makes this job + * + * @return true on success or PEAR_Error + * + * @access public + * @since 1.0 + */ + function connect($host, $port, $enableSTARTTLS = true) + { + $ret = $this->cmdConnect($host, $port); + if($ret === true ){ + // Determine server capabilities + $res = $this->cmdCapability(); + + // check if we can enable TLS via STARTTLS (requires PHP 5 >= 5.1.0RC1 for stream_socket_enable_crypto) + if ($this->hasCapability('STARTTLS') === true && $enableSTARTTLS === true && function_exists('stream_socket_enable_crypto') === true) { + if (PEAR::isError($res = $this->cmdStartTLS())) { + return $res; + } + } + return $ret; + } + if(empty($ret)){ + return new PEAR_Error("Unexpected response on connection"); + } + if(PEAR::isError($ret) ){ + return $ret; + } + if(isset( $ret["RESPONSE"]["CODE"] ) ){ + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + } + + return $ret; + } + + + + /** + * Attempt to authenticate to the IMAP server. + * @param string $user The userid to authenticate as. + * @param string $pass The password to authenticate with. + * @param string $useauthenticate true: authenticate using + * the IMAP AUTHENTICATE command. false: authenticate using + * the IMAP AUTHENTICATE command. 'string': authenticate using + * the IMAP AUTHENTICATE command but using the authMethod in 'string' + * @param boolean $selectMailbox automaticaly select inbox on login (false does not) + * + * @return true on success or PEAR_Error + * + * @access public + * @since 1.0 + */ + function login($user, $pass, $useauthenticate = true, $selectMailbox=true) + { + //error_log(__METHOD__.':'.$user.','.$pass.','.$useauthenticate.','.$selectMailbox); + if ( $useauthenticate ){ + //$useauthenticate = 'LOGIN'; + //error_log(__METHOD__.':'.'about to authenticate'); + //$useauthenticate is a string if the user hardcodes an AUTHMethod + // (the user calls $imap->login("user","password","CRAM-MD5"); for example! + + $method = is_string( $useauthenticate ) ? $useauthenticate : null; + + //Try the selected Auth method + if ( PEAR::isError( $ret = $this->cmdAuthenticate( $user , $pass , $method ) ) ) { + // Verify the methods that we have in common with the server + if(is_array($this->_serverAuthMethods)){ + $commonMethods=array_intersect ($this->supportedAuthMethods, $this->_serverAuthMethods ); + }else{ + $this->_serverAuthMethods=null; + } + if($this->_serverAuthMethods == null || count($commonMethods) == 0 || $this->supportedAuthMethods == null ){ + //error_log(__METHOD__.":The server does not have any auth method, so I try LOGIN"); + // The server does not have any auth method, so I try LOGIN + if ( PEAR::isError( $ret = $this->cmdLogin( $user, $pass ) ) ) { + return $ret; + } + }else{ + return $ret; + } + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + }else{ + //error_log(__METHOD__.':'.'about to use plain login'); + //The user request "PLAIN" auth, we use the login command + if ( PEAR::isError( $ret = $this->cmdLogin( $user, $pass ) ) ) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + } + + if($selectMailbox){ + //Select INBOX + if ( PEAR::isError( $ret=$this->cmdSelect( $this->getCurrentMailbox() ) ) ) { + return $ret; + } + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * Disconnect function. Sends the QUIT command + * and closes the socket. + * + * @param boolean $expungeOnExit (default = false) + * + * @return mixed true on success / Pear_Error on failure + * + * @access public + */ + function disconnect($expungeOnExit = false) + { + if($expungeOnExit){ + if (PEAR::isError($ret=$this->cmdExpunge())) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + $ret=$this->cmdLogout(); + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + } + + if (PEAR::isError($ret=$this->cmdLogout())) { + error_log(__METHOD__.$ret->message); + return $ret; + } else { + //error_log(__METHOD__.print_r($ret,true)); + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + error_log(__METHOD__.$ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + return true; + } + + + + /** + * Changes the default/current mailbox to $mailbox + * + * @param string $mailbox Mailbox to select + * + * @return mixed true on success / Pear_Error on failure + * + * @access public + */ + function selectMailbox($mailbox) + { + if (PEAR::isError($ret=$this->cmdSelect($mailbox))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * Checks the mailbox $mailbox + * + * @param string $mailbox Mailbox to examine + * + * @return mixed true on success / Pear_Error on failure + * + * @access public + */ + function examineMailbox($mailbox) + { + if (PEAR::isError($ret=$this->cmdExamine($mailbox))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + //$ret_aux["EXISTS"]=$ret["PARSED"]["EXISTS"]; + //$ret_aux["RECENT"]=$ret["PARSED"]["RECENT"]; + $ret = $ret["PARSED"]; + return $ret; + } + + + + /** + * Returns the raw headers of the specified message. + * + * @param int $msg_id Message number + * @param $part_id Part ID + * @param boolean $uidFetch msg_id contains UID's instead of Message Sequence Number if set to true + * + * @return mixed Either raw headers or false on error + * + * @access public + */ + function getRawHeaders($msg_id, $part_id = '', $uidFetch = false) + { + if($part_id != '') { + $command = 'BODY.PEEK[' . $part_id . '.HEADER]'; + $resp_command = 'BODY[' . $part_id . '.HEADER]'; + } else { + $command = 'BODY.PEEK[HEADER]'; + $resp_command = 'BODY[HEADER]'; + } + if($uidFetch == true) { + $ret=$this->cmdUidFetch($msg_id, $command); + } else { + $ret=$this->cmdFetch($msg_id, $command); + } + if (PEAR::isError($ret)) { + return $ret; + } + if(strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + $ret=$ret["PARSED"][0]["EXT"][$resp_command]["CONTENT"]; + return $ret; + } + + + + /** + * Returns the headers of the specified message in an + * associative array. Array keys are the header names, array + * values are the header values. In the case of multiple headers + * having the same names, eg Received:, the array value will be + * an indexed array of all the header values. + * + * @param int $msg_id Message number + * @param boolean $keysToUpper false (default) original header names + * true change keys (header names) toupper + * @param $part_id Part ID + * @param boolean $uidFetch msg_id contains UID's instead of Message Sequence Number if set to true + * + * @return mixed Either array of headers or false on error + * + * @access public + */ + function getParsedHeaders($msg_id, $keysToUpper = false, $part_id = '', $uidFetch = false) + { + if (PEAR::isError($ret=$this->getRawHeaders($msg_id, $part_id, $uidFetch))) { + return $ret; + } + if ($ret == 'NIL') return false; // no headers -> return false + + $raw_headers = rtrim($ret); + $raw_headers = preg_replace("/\r\n[ \t]+/", ' ', $raw_headers); // Unfold headers + $raw_headers = explode("\r\n", $raw_headers); + foreach ($raw_headers as $value) { + $name = substr($value, 0, $pos = strpos($value, ':')); + if ($keysToUpper) { + $name = strtoupper($name); + } + $value = ltrim(substr($value, $pos + 1)); + if (isset($headers[$name]) && is_array($headers[$name])) { + $headers[$name][] = $value; + } elseif (isset($headers[$name])) { + $headers[$name] = array($headers[$name], $value); + } else { + $headers[$name] = $value; + } + } + return $headers; + } + + + + /** + * Returns an array containing the message ID, the size and the UID + * of each message selected. + * message selection can be a valid IMAP command, a number or an array of + * messages + * + * @param $msg_id Message number + * + * @return mixed Either array of message data or PearError on error + * + * @access public + */ + function getMessagesList($msg_id = null) + { + if( $msg_id != null){ + if(is_array($msg_id)){ + $message_set=$this->_getSearchListFromArray($msg_id); + }else{ + $message_set=$msg_id; + } + }else{ + $message_set="1:*"; + } + if (PEAR::isError($ret=$this->cmdFetch($message_set,"(RFC822.SIZE UID)"))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + foreach($ret["PARSED"] as $msg){ + $ret_aux[]=array("msg_id"=>$msg["NRO"],"size" => $msg["EXT"]["RFC822.SIZE"],"uidl"=> $msg["EXT"]["UID"]); + } + return $ret_aux; + } + + + + /** + * Message summary + * + * @param mixed $msg_id Message number + * @param boolean $uidFetch msg_id contains UID's instead of Message Sequence Number if set to true + * + * @return mixed Either array of headers or PEAR::Error on error + * + * @access public + */ + function getSummary($msg_id = null, $uidFetch = false) + { + if( $msg_id != null){ + if(is_array($msg_id)){ + $message_set=$this->_getSearchListFromArray($msg_id); + }else{ + $message_set=$msg_id; + } + }else{ + $message_set="1:*"; + } + if($uidFetch) { + #error_log("egw-pear::NET::IMAP:getSummary->fetch by UID ".$message_set); + $ret=$this->cmdUidFetch($message_set,"(RFC822.SIZE UID FLAGS ENVELOPE INTERNALDATE BODY.PEEK[HEADER.FIELDS (CONTENT-TYPE X-PRIORITY)])"); + } else { + #error_log("egw-pear::NET::IMAP:getSummary->fetch message ".$message_set); + $ret=$this->cmdFetch($message_set,"(RFC822.SIZE UID FLAGS ENVELOPE INTERNALDATE BODY.PEEK[HEADER.FIELDS (CONTENT-TYPE X-PRIORITY)])"); + } + #error_log(print_r($ret['PARSED'][0],true)); + #$ret=$this->cmdFetch($message_set,"(RFC822.SIZE UID FLAGS ENVELOPE INTERNALDATE BODY[1.MIME])"); + if (PEAR::isError($ret) || strtoupper($ret["RESPONSE"]["CODE"]) != "OK") { + error_log("egw-pear::NET::IMAP:getSummary->error after Fetch for message(s):".$message_set." Trying to retrieve single messages."); + unset($ret); + # if there is an error, while retrieving the information for the whole list, try to retrieve the info one by one, to be more error tolerant + foreach (explode(',',$message_set) as $msgid) { + $retloop=$this->cmdUidFetch($msgid,"(RFC822.SIZE UID FLAGS ENVELOPE INTERNALDATE BODY.PEEK[HEADER.FIELDS (CONTENT-TYPE X-PRIORITY)])"); + if (PEAR::isError($retloop)|| strtoupper($retloop["RESPONSE"]["CODE"]) != "OK") { + # log the error, and create a dummy-message as placeholder, this may hold the possibility to read the message anyway + error_log("egw-pear::NET::IMAP:getSummary->error after Fetch for message with id:".$msgid); + error_log($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + $ret['PARSED'][]=array('COMMAND'=>"FETCH",'EXT'=>array('UID'=>$msgid,'ENVELOPE'=>array('SUBJECT'=>"[FELAMIMAIL:ERROR]can not parse this message(header).",))); + } else { + #error_log(print_r($retloop['PARSED'][0],true)); + # renew the response for every message retrieved, since the returnvalue is structured that way + $ret['RESPONSE']=$retloop['RESPONSE']; + $ret['PARSED'][]=$retloop['PARSED'][0]; + } + unset($retloop); + } + #return $ret; + } + # this seems to be obsolet, since errors while retrieving header informations are 'covered' above + #if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + # error_log("egw-pear::NET::IMAP:getSummary->ResponseCode not OK"); + # return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + #} + + #print "
"; + #error_log("egw-pear::NET::IMAP:getSummary->".print_r($ret["PARSED"],TRUE)); + #print "
"; + if(isset( $ret["PARSED"] ) ){ + for($i=0; $i X-Priority: 5\r\nContent-Type: multipart/alternative;\r\n\tboundary="b1_61838a67749ca51b425e42489adced98"\r\n\r\n\n + if(preg_match('/x-priority: ([0-9])/iU', $ret["PARSED"][$i]['EXT']['BODY[HEADER.FIELDS (CONTENT-TYPE X-PRIORITY)]']['CONTENT'], $matches)) { + $a['PRIORITY']=strtolower($matches[1]); + } + } elseif (isset($ret["PARSED"][$i]['EXT']['BODY[HEADER.FIELDS ("CONTENT-TYPE" "X-PRIORITY")]']['CONTENT'])) { + // some versions of cyrus send "CONTENT-TYPE" and CONTENT-TYPE only + if (preg_match('/content-type: (.*);/iU', $ret["PARSED"][$i]['EXT']['BODY[HEADER.FIELDS ("CONTENT-TYPE" "X-PRIORITY")]']['CONTENT'], $matches)) { + $a['MIMETYPE']=strtolower($matches[1]); + } + // fetch the priority [CONTENT] => X-Priority: 5\r\nContent-Type: multipart/alternative;\r\n\tboundary="b1_61838a67749ca51b425e42489adced98"\r\n\r\n\n + if (preg_match('/x-priority: ([0-9])/iU', $ret["PARSED"][$i]['EXT']['BODY[HEADER.FIELDS ("CONTENT-TYPE" "X-PRIORITY")]']['CONTENT'], $matches)) { + $a['PRIORITY']=strtolower($matches[1]); + } + } + $env[]=$a; + $a=null; + } + return $env; + } + + //return $ret; + } + + + + /** + * Returns the body of the message with given message number. + * + * @param $msg_id Message number + * @param boolean $uidFetch msg_id contains UID's instead of Message Sequence Number if set to true + * @param boolean $preserveSeen leaves the Seen Flag untouched if set to true (default is false) + * + * @return mixed Either message body or false on error + * + * @access public + */ + function getBody($msg_id, $uidFetch = false, $preserveSeen = false) + { + $peek = ($preserveSeen) ? ".PEEK" : ""; + if($uidFetch) { + $ret=$this->cmdUidFetch($msg_id, "BODY".$peek."[TEXT]"); + } else { + $ret=$this->cmdFetch($msg_id, "BODY".$peek."[TEXT]"); + } + if (PEAR::isError($ret)) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + $ret=$ret["PARSED"][0]["EXT"]["BODY[TEXT]"]["CONTENT"]; + //$ret=$resp["PARSED"][0]["EXT"]["RFC822"]["CONTENT"]; + return $ret; + } + + + /** + * Returns the body of the message with given message number. + * + * @param $msg_id Message number + * @param string $partId Message number + * @param boolean $uidFetch msg_id contains UID's instead of Message Sequence Number if set to true + * @param boolean $preserveSeen leaves the Seen Flag untouched if set to true (default is false) + * + * @return mixed Either message body or false on error + * + * @access public + */ + function getBodyPart($msg_id, $partId, $uidFetch = false, $preserveSeen = false) + { + $peek = ($preserveSeen) ? ".PEEK" : "" ; + if($uidFetch) { + $ret=$this->cmdUidFetch($msg_id,"BODY".$peek."[$partId]"); + } else { + $ret=$this->cmdFetch($msg_id,"BODY".$peek."[$partId]"); + } + if (PEAR::isError($ret)) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + $ret=$ret["PARSED"][0]["EXT"]["BODY[$partId]"]["CONTENT"]; + //$ret=$resp["PARSED"][0]["EXT"]["RFC822"]["CONTENT"]; + return $ret; + } + + + + /** + * Returns the body of the message with given message number. + * + * @param $msg_id Message number + * @param boolean $uidFetch msg_id contains UID's instead of Message Sequence Number if set to true + * + * @return mixed Either message body or false on error + * + * @access public + */ + function getStructure($msg_id, $uidFetch = false) + { + #print "IMAP.php::getStructure
";
+        #$this->setDebug(true);
+        #print "
";
+        if($uidFetch) {
+          $ret=$this->cmdUidFetch($msg_id,"BODYSTRUCTURE");
+        } else {
+          $ret=$this->cmdFetch($msg_id,"BODYSTRUCTURE");
+        }
+		#_debug_array($ret);
+        if (PEAR::isError($ret)) {
+            return $ret;
+        }
+        if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){
+            return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
+        }
+        $ret2=$ret["PARSED"][0]["EXT"]["BODYSTRUCTURE"][0];
+		// sometimes we get an [COMMAND] => OK with $ret["PARSED"][0] and no $ret["PARSED"][0]["EXT"]["BODYSTRUCTURE"]
+		if (is_array($ret) && empty($ret2) && isset($ret["PARSED"])) {
+			foreach($ret["PARSED"] as $substruct) {
+				if ($substruct["COMMAND"] == "FETCH") {
+					$ret2=$substruct["EXT"]["BODYSTRUCTURE"][0];
+					break;
+				}
+			}
+		}
+        $structure = array();
+
+        $mimeParts = array();
+        $this->_parseStructureArray($ret2, $mimeParts);
+        #_debug_array($ret);
+        return array_shift($mimeParts);
+    }
+
+
+    /**
+     * Parse structure array
+     *
+     * @param   $_structure
+     * @param   &$_mimeParts
+     * @param   $_partID
+     *
+     * @return  nothing
+     *
+     * @access  private
+     */
+    function _parseStructureArray($_structure, &$_mimeParts, $_partID = '')
+    {
+        // something went wrong
+        if(!is_array($_structure)) {
+          return false;
+        }
+
+        // print "
Net_IMAP::_parseStructureArray _partID: $_partID
"; + $mimeParts = array(); + $subPartID = 1; + $partID = ($_partID == '') ? '' : $_partID.'.'; + if(is_array($_structure[0])) { + $this->_parseStructureMultipartArray($_structure, $_mimeParts, $_partID); + } else { + switch(strtoupper($_structure[0])) { + case 'TEXT': + $this->_parseStructureTextArray($_structure, $_mimeParts, $partID.$subPartID); + break; + + case 'MESSAGE': + $this->_parseStructureMessageArray($_structure, $_mimeParts, $partID.$subPartID); + break; + + default: + $this->_parseStructureApplicationArray($_structure, $_mimeParts, $partID.$subPartID); + break; + } + } + + } + + + + /** + * Parse multibpart structure array + * + * @param $_structure + * @param &$_mimeParts + * @param $_partID + * @param boolean $_parentIsMessage + * + * @return noting + * + * @access private + */ + function _parseStructureMultipartArray($_structure, &$_mimeParts, $_partID, $_parentIsMessage = false) + { + #print "Net_IMAP::_parseStructureMultipartArray _partID: $_partID
"; + // a multipart/mixed, multipart/report or multipart/alternative or multipart/related get's no own partid, if the parent is message/rfc822 + if($_parentIsMessage == true && is_array($_structure[0])) { + foreach($_structure as $structurePart) { + if(!is_array($structurePart)) { + $subType = strtolower($structurePart); + break; + } + } + if($subType == 'mixed' || $subType == 'report' || $subType == 'alternative' || $subType == 'related') { + $_partID = substr($_partID, 0, strrpos($_partID, '.')); + } + } + + $subPartID = 1; + $partID = ($_partID == '') ? '' : $_partID.'.'; + $subMimeParts = array(); + foreach($_structure as $structurePart) { + if(is_array($structurePart)) { + if(is_array($structurePart[0])) { + // another multipart inside the multipart + $this->_parseStructureMultipartArray($structurePart, $subMimeParts, $partID.$subPartID); + } else { + switch(strtoupper($structurePart[0])) { + case 'IMAGE': + $this->_parseStructureImageArray($structurePart, $subMimeParts, $partID.$subPartID); + + break; + + case 'MESSAGE': + $this->_parseStructureMessageArray($structurePart, $subMimeParts, $partID.$subPartID); + + break; + + case 'TEXT': + $this->_parseStructureTextArray($structurePart, $subMimeParts, $partID.$subPartID); + + break; + + default: + $this->_parseStructureApplicationArray($structurePart, $subMimeParts, $partID.$subPartID); + + break; + + } + } + $subPartID++; + } else { + $part = new stdClass; + $part->type = 'MULTIPART'; + $part->subType = strtoupper($structurePart); + + $part->subParts = $subMimeParts; + + if($_partID == '') { + $part->partID = 0; + $_mimeParts = array(0 => $part); + } else { + $part->partID = $_partID; + $_mimeParts[$_partID] = $part; + } + + return; + } + } + } + + /** + * Parse structure image array + * + * @param $_structure + * @param &$_mimeParts + * @param $_partID + * + * @return noting + * + * @access private + */ + function _parseStructureImageArray($_structure, &$_mimeParts, $_partID) + { + #print "Net_IMAP::_parseStructureImageArray _partID: $_partID
"; + $part = $this->_parseStructureCommonFields($_structure); + $part->cid = $_structure[3]; + $part->partID = $_partID; + + $_mimeParts[$_partID] = $part; + } + + + + /** + * Parse structure application array + * + * @params $_structure + * @params &$_mimeParts + * @params $_partID + * + * @return noting + * + * @access private + */ + function _parseStructureApplicationArray($_structure, &$_mimeParts, $_partID) + { + #print "Net_IMAP::_parseStructureApplicationArray _partID: $_partID
"; + $part = $this->_parseStructureCommonFields($_structure); + if(is_array($_structure[8])) { + if(isset($_structure[8][0]) && $_structure[8][0] != 'NIL') { + $part->disposition = strtoupper($_structure[8][0]); + } + if(is_array($_structure[8][1])) { + foreach($_structure[8][1] as $key => $value) { + if($key%2 == 0) { + $part->dparameters[trim(strtoupper($_structure[8][1][$key]))] = $_structure[8][1][$key+1]; + } + } + } + } + $part->partID = $_partID; + + $_mimeParts[$_partID] = $part; + } + + + + /** + * Parse structure message array + * + * @params $_structure + * @params &$_mimeParts + * @params $_partID + * + * @return nothing + * + * @access private + */ + function _parseStructureMessageArray($_structure, &$_mimeParts, $_partID) + { + #print "Net_IMAP::_parseStructureMessageArray _partID: $_partID
"; + $part = $this->_parseStructureCommonFields($_structure); + + if(is_array($_structure[8][0])) { + $this->_parseStructureMultipartArray($_structure[8], $subMimeParts, $_partID.'.1', true); + } else { + $this->_parseStructureArray($_structure[8], $subMimeParts, $_partID); + } + + if(is_array($subMimeParts)) { + $part->subParts = $subMimeParts; + } + $part->partID = $_partID; + + $_mimeParts[$_partID] = $part; + } + + + + /** + * Parse structure text array + * + * @params $_structure + * @params &$_mimeParts + * @params $_partID + * + * @return nothing + * + * @access private + */ + function _parseStructureTextArray($_structure, &$_mimeParts, $_partID) + { + #print "Net_IMAP::_parseStructureTextArray _partID: $_partID
"; + $part = $this->_parseStructureCommonFields($_structure); + $part->lines = $_structure[7]; + + // what is the difference between $_structure[8] and $_structure[9]???? + + if(is_array($_structure[8])) { + if(isset($_structure[8][0]) && $_structure[8][0] != 'NIL') { + $part->disposition = strtoupper($_structure[8][0]); + } + if(is_array($_structure[8][1])) { + foreach($_structure[8][1] as $key => $value) { + if($key%2 == 0) { + $part->dparameters[trim(strtoupper($_structure[8][1][$key]))] = $_structure[8][1][$key+1]; + } + } + } + } + + if(is_array($_structure[9])) { + if(isset($_structure[9][0]) && $_structure[9][0] != 'NIL') { + $part->disposition = strtoupper($_structure[9][0]); + } + if(is_array($_structure[9][1])) { + foreach($_structure[9][1] as $key => $value) { + if($key%2 == 0) { + $part->dparameters[trim(strtoupper($_structure[9][1][$key]))] = $_structure[9][1][$key+1]; + } + } + } + } + + $part->partID = $_partID; + + $_mimeParts[$_partID] = $part; + } + + + + /** + * Parse structure common fields + * + * @param &$_structure + * + * @return object part object (stdClass) + * + * @access private + */ + function _parseStructureCommonFields(&$_structure) + { + #error_log(__METHOD__.print_r($_structure,true)." ".function_backtrace()); + #print "Net_IMAP::_parseStructureTextArray _partID: $_partID
"; + $part = new stdClass; + $part->type = strtoupper($_structure[0]); + //dovecot has no subtype for type attachment, and does not pass it as structure[2] + if (!is_array($_structure[1])) $part->subType = strtoupper($_structure[1]); + if(is_array($_structure[1])) { + foreach($_structure[1] as $key => $value) { + if($key%2 == 0) { + $part->parameters[trim(strtoupper($_structure[1][$key]))] = $_structure[1][$key+1]; + } + } + } + if(is_array($_structure[2])) { + foreach($_structure[2] as $key => $value) { + if($key%2 == 0) { + $part->parameters[strtoupper(trim($_structure[2][$key]))] = $_structure[2][$key+1]; + } + } + } + $part->filename = $_structure[4]; + $part->encoding = strtoupper($_structure[5]); + $part->bytes = $_structure[6]; + + return $part; + } + + + + /** + * Returns the entire message with given message number. + * + * @param $msg_id Message number (default = null) + * @param boolean $indexIsMessageNumber (default = true) + * + * @return mixed Either entire message or false on error + * + * @access public + */ + function getMessages($msg_id = null, $indexIsMessageNumber=true) + { + //$resp=$this->cmdFetch($msg_id,"(BODY[TEXT] BODY[HEADER])"); + if( $msg_id != null){ + if(is_array($msg_id)){ + $message_set=$this->_getSearchListFromArray($msg_id); + }else{ + $message_set=$msg_id; + } + }else{ + $message_set="1:*"; + } + + $ret=$this->cmdFetch($message_set,"RFC822"); + if (PEAR::isError($ret)) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + if(isset($ret["PARSED"])){ + foreach($ret["PARSED"] as $msg){ + if(isset($msg["EXT"]["RFC822"]["CONTENT"])){ + if($indexIsMessageNumber){ + $ret_aux[$msg["NRO"]]=$msg["EXT"]["RFC822"]["CONTENT"]; + }else{ + $ret_aux[]=$msg["EXT"]["RFC822"]["CONTENT"]; + } + } + } + return $ret_aux; + } + return array(); + } + + + + /** + * Returns number of messages in this mailbox + * + * @param string $mailbox the mailbox (default is current mailbox) + * + * @return mixed Either number of messages or Pear_Error on failure + * + * @access public + */ + function getNumberOfMessages($mailbox = '') + { + if ( $mailbox == '' || $mailbox == null ){ + $mailbox=$this->getCurrentMailbox(); + } + if (PEAR::isError($ret = $this->cmdStatus($mailbox, 'MESSAGES'))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + if( isset($ret["PARSED"]["STATUS"]["ATTRIBUTES"]["MESSAGES"] ) ){ + if( !is_numeric( $ret["PARSED"]["STATUS"]["ATTRIBUTES"]["MESSAGES"] ) ){ + // if this array does not exists means that there is no messages in the mailbox + return 0; + }else{ + return $ret["PARSED"]["STATUS"]["ATTRIBUTES"]["MESSAGES"]; + } + + } + return 0; + } + + + + /** + * Returns number of UnSeen messages in this mailbox + * + * @param string $mailbox the mailbox (default is current mailbox) + * + * @return mixed Either number of messages or Pear_Error on failure + * + * @access public + */ + function getNumberOfUnSeenMessages($mailbox = '') + { + if ( $mailbox == '' ){ + $mailbox = $this->getCurrentMailbox(); + } + if (PEAR::isError($ret = $this->cmdStatus($mailbox, 'UNSEEN'))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + if( isset($ret["PARSED"]["STATUS"]["ATTRIBUTES"]["UNSEEN"] ) ){ + if( !is_numeric( $ret["PARSED"]["STATUS"]["ATTRIBUTES"]["UNSEEN"] ) ){ + // if this array does not exists means that there is no messages in the mailbox + return 0; + }else{ + return $ret["PARSED"]["STATUS"]["ATTRIBUTES"]["UNSEEN"]; + } + + } + return 0; + } + + + + /** + * Returns number of UnSeen messages in this mailbox + * + * @param string $mailbox the mailbox (default is current mailbox) + * + * @return mixed Either number of messages or Pear_Error on failure + * + * @access public + */ + function getNumberOfRecentMessages($mailbox = '') + { + if ( $mailbox == '' ){ + $mailbox = $this->getCurrentMailbox(); + } + if (PEAR::isError($ret = $this->cmdStatus($mailbox, 'RECENT'))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + if( isset($ret["PARSED"]["STATUS"]["ATTRIBUTES"]["RECENT"] ) ){ + if( !is_numeric( $ret["PARSED"]["STATUS"]["ATTRIBUTES"]["RECENT"] ) ){ + // if this array does not exists means that there is no messages in the mailbox + return 0; + }else{ + return $ret["PARSED"]["STATUS"]["ATTRIBUTES"]["RECENT"]; + } + + } + return 0; + } + + + + /** + * Returns number of UnSeen messages in this mailbox + * + * @param string $mailbox the mailbox (default is current mailbox) + * + * @return mixed Either number of messages or Pear_Error on error + * + * @access public + */ + function getStatus($mailbox = '') + { + if ( $mailbox == '' ){ + $mailbox = $this->getCurrentMailbox(); + } + if (PEAR::isError($ret = $this->cmdStatus($mailbox, array('MESSAGES', 'RECENT', 'UIDNEXT', 'UIDVALIDITY', 'UNSEEN')))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + if( isset($ret["PARSED"]["STATUS"]["ATTRIBUTES"]["RECENT"] ) ){ + return $ret["PARSED"]["STATUS"]["ATTRIBUTES"]; + } + return 0; + } + + + + /** + * Returns an array containing the message envelope + * + * @param $mailbox get's not used anywhere (will be removed with next major release) + * @param mixed $msg_id Message number (default = null) + * @param boolean $uidFetch msg_id contains UID's instead of Message Sequence Number if set to true + * + * @return mixed Either the envelopes or Pear_Error on error + * + * @access public + */ + function getEnvelope($mailbox = '', $msg_id = null, $uidFetch = false) + { + if ( $mailbox == '' ){ + $mailbox = $this->getCurrentMailbox(); + } + + if( $msg_id != null){ + if(is_array($msg_id)){ + $message_set=$this->_getSearchListFromArray($msg_id); + }else{ + $message_set=$msg_id; + } + }else{ + $message_set="1:*"; + } + + + if($uidFetch) { + $ret=$this->cmdUidFetch($message_set,"ENVELOPE"); + } else { + $ret=$this->cmdFetch($message_set,"ENVELOPE"); + } + if (PEAR::isError($ret)) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + if(isset( $ret["PARSED"] ) ){ + for($i=0; $igetCurrentMailbox() ){ + // store the actual selected mailbox name + $mailbox_aux = $this->getCurrentMailbox(); + if ( PEAR::isError( $ret = $this->selectMailbox( $mailbox ) ) ) { + return $ret; + } + } + + $ret=$this->cmdFetch("1:*","RFC822.SIZE"); + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + // Restore the default mailbox if it was changed + if ( $mailbox != '' && $mailbox != $this->getCurrentMailbox() ){ + if ( PEAR::isError( $ret = $this->selectMailbox( $mailbox_aux ) ) ) { + return $ret; + } + } + // return 0 because the server says that there is no message in the mailbox + return 0; + } + + $sum=0; + + if(!isset($ret["PARSED"]) ){ + // if the server does not return a "PARSED" part + // we think that it does not suppoprt select or has no messages in it. + return 0; + } + foreach($ret["PARSED"] as $msgSize){ + if( isset($msgSize["EXT"]["RFC822.SIZE"]) ){ + $sum+= $msgSize["EXT"]["RFC822.SIZE"]; + } + } + + if ( $mailbox != '' && $mailbox != $this->getCurrentMailbox() ){ + // re-select the mailbox + if ( PEAR::isError( $ret = $this->selectMailbox( $mailbox_aux ) ) ) { + return $ret; + } + } + + return $sum; + } + + + + /** + * Marks a message for deletion. Only will be deleted if the + * disconnect() method is called with auto-expunge on true or expunge() + * method is called. + * + * @param $msg_id Message to delete (default = null) + * @param boolean $uidStore msg_id contains UID's instead of Message Sequence Number if set to true (default = false) + * + * @return mixed true on success / Pear_Error on failure + * + * @access public + */ + function deleteMessages($msg_id = null, $uidStore = false) + { + /* As said in RFC2060... + C: A003 STORE 2:4 +FLAGS (\Deleted) + S: * 2 FETCH FLAGS (\Deleted \Seen) + S: * 3 FETCH FLAGS (\Deleted) + S: * 4 FETCH FLAGS (\Deleted \Flagged \Seen) + S: A003 OK STORE completed + */ + //Called without parammeters deletes all the messages in the mailbox + // You can also provide an array of numbers to delete those emails + if( $msg_id != null){ + if(is_array($msg_id)){ + $message_set=$this->_getSearchListFromArray($msg_id); + }else{ + $message_set=$msg_id; + } + }else{ + $message_set="1:*"; + } + + + $dataitem="+FLAGS.SILENT"; + $value="\Deleted"; + if($uidStore == true) { + $ret=$this->cmdUidStore($message_set,$dataitem,$value); + } else { + $ret=$this->cmdStore($message_set,$dataitem,$value); + } + if (PEAR::isError($ret)) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * Copies mail from one folder to another + * + * @param string $dest_mailbox mailbox name to copy sessages to + * @param mixed $msg_id the messages that I want to copy (all by default) it also + * can be an array + * @param string $source_mailbox mailbox name from where the messages are copied (default is current mailbox) + * @param bool $uidCopy msg_id contains UID's instead of Message Sequence Number if set to true + * @param bool $returnUIDs return an array with uid => newuid + * + * @return mixed true on Success/PearError on Failure + * + * @access public + * @since 1.0 + */ + function copyMessages($dest_mailbox, $msg_id = null , $source_mailbox = null, $uidCopy = false, $returnUIDs = false ) + { + if($source_mailbox == null){ + $source_mailbox = $this->getCurrentMailbox(); + }else{ + if ( PEAR::isError( $ret = $this->selectMailbox( $source_mailbox ) ) ) { + return $ret; + } + } + //Called without parammeters copies all messages in the mailbox + // You can also provide an array of numbers to copy those emails + if( $msg_id != null){ + if(is_array($msg_id)){ + $message_set=$this->_getSearchListFromArray($msg_id); + }else{ + $message_set=$msg_id; + } + }else{ + $message_set="1:*"; + } + + if($uidCopy == true) { + $ret = $this->cmdUidCopy($message_set, $dest_mailbox ); + } else { + $ret = $this->cmdCopy($message_set, $dest_mailbox ); + } + //error_log(array2string($ret)); + if ( PEAR::isError( $ret ) ) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + if ($returnUIDs === false) + { + //error_log(__METHOD__.__LINE__." ReturnUIDs is set to false"); + return true; + } + else + { + //error_log(__METHOD__.__LINE__." ReturnUIDs is set to true".$ret["RESPONSE"]["STR_CODE"]); + list($cmd,$ts,$oldList,$newIds) = explode(' ',$ret["RESPONSE"]["STR_CODE"]); + if ($cmd == 'APPENDUID' || $cmd == 'COPYUID') // the server may not support this + { + $oldArray = explode(',',$oldList); + $newArray = explode(':',$newIds);# + foreach((array)$oldArray as $i => $uid) + { + $rv[$uid] = $newIds[$i]; + } + } + return (is_array($rv)?$rv:true); + } + } + + + + /** + * Appends a mail to a mailbox + * + * @param string $rfc_message the message to append in RFC822 format + * @param string $mailbox mailbox name to append to (default is current mailbox) + * @param string $flags_list set flags appended message + * + * @return mixed true (or the uid of the created message) on success / Pear_Error on failure + * + * @access public + * @since 1.0 + */ + function appendMessage($rfc_message, $mailbox = null , $flags_list = '') + { + if($mailbox == null){ + $mailbox = $this->getCurrentMailbox(); + } + $ret=$this->cmdAppend($mailbox,$rfc_message,$flags_list); + if (PEAR::isError($ret)) { + return $ret; + } + + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + // the expected response is something like that: [APPENDUID 1160024220 12] Completed + // the uid of the created message is the number just before the closing bracket + $retcode = explode(' ',$ret["RESPONSE"]["STR_CODE"]); + $retcode = explode(']',$retcode[2]); + if (intval($retcode[0]) > 0) return $retcode[0]; + // this should never happen, exept the parsed response is not as expected + return true; + } + + + + /** + * Get the namespace + * + * @return mixed namespace or PearError on failure + * + * @access public + * @since 1.1 + */ + function getNamespace() + { + if (PEAR::isError($ret = $this->cmdNamespace())) { + return $ret; + } + if(strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + foreach($ret["PARSED"]["NAMESPACES"] as $type => $singleNameSpace) { + if(!is_array($singleNameSpace)) { + continue; + } + + foreach ($singleNameSpace as $nameSpaceData) { + $nameSpaces[$type][] = array( + 'name' => $this->utf_7_decode($nameSpaceData[0]), + 'delimter' => $this->utf_7_decode($nameSpaceData[1]) + ); + } + } + + return $nameSpaces; + } + + + + /****************************************************************** + ** ** + ** MAILBOX RELATED METHODS ** + ** ** + ******************************************************************/ + + /** + * Gets the HierachyDelimiter character used to create subfolders cyrus users "." + * and wu-imapd uses "/" + * + * $param string the mailbox to get the hierarchy from + * + * @return string the hierarchy delimiter + * + * @access public + * @since 1.0 + */ + function getHierarchyDelimiter( $mailbox = '' ) + { + + /* RFC2060 says: "the command LIST "" "" means get the hierachy delimiter: + An empty ("" string) mailbox name argument is a special request to + return the hierarchy delimiter and the root name of the name given + in the reference. The value returned as the root MAY be null if + the reference is non-rooted or is null. In all cases, the + hierarchy delimiter is returned. This permits a client to get the + hierarchy delimiter even when no mailboxes by that name currently + exist." + */ + if( PEAR::isError( $ret = $this->cmdList( $mailbox , '' ) ) ){ + return $ret; + } + if(isset($ret["PARSED"][0]["EXT"]["LIST"]["HIERACHY_DELIMITER"]) ){ + return $ret["PARSED"][0]["EXT"]["LIST"]["HIERACHY_DELIMITER"]; + } + return new PEAR_Error( 'the IMAP Server does not support HIERACHY_DELIMITER!' ); + } + + + + /** + * Returns an array containing the names of the selected mailboxes + * + * @param string $reference base mailbox to start the search (default is current mailbox) + * @param string $restriction_search false or 0 means return all mailboxes + * true or 1 return only the mailbox that contains that exact name + * 2 return all mailboxes in that hierarchy level + * @param string $returnAttributes true means return an assoc array containing mailbox names and mailbox attributes + * false - the default - means return an array of mailboxes + * + * @return mixed true on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function getMailboxes($reference = '', $restriction_search = 0, $returnAttributes=false) + { + #echo (__METHOD__.$reference."#".$restriction_search.'#'.function_backtrace()."
"); + if ( is_bool($restriction_search) ){ + $restriction_search = (int) $restriction_search; + } + + if ( is_int( $restriction_search ) ){ + switch ( $restriction_search ) { + case 0: + $mailbox = "*"; + break; + case 1: + $mailbox = $reference; + $reference = ''; + break; + case 2: + $mailbox = "%"; + break; + } + }else{ + if ( is_string( $restriction_search ) ){ + $mailbox = $restriction_search; + }else { + return new PEAR_Error('Wrong data for 2nd parameter'); + } + } + + if( PEAR::isError( $ret = $this->cmdList($reference, $mailbox) ) ){ + return $ret; + } + + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + $ret_aux=array(); + if( isset($ret["PARSED"]) ){ + foreach( $ret["PARSED"] as $mbox ){ + + //If the folder has the \NoSelect atribute we don't put in the list + // it solves a bug in wu-imap that crash the IMAP server if we select that mailbox + if( isset($mbox["EXT"]["LIST"]["NAME_ATTRIBUTES"]) ){ + #if( !(in_array('\NoSelect',$mbox["EXT"]["LIST"]["NAME_ATTRIBUTES"]) || in_array('\Noselect',$mbox["EXT"]["LIST"]["NAME_ATTRIBUTES"])) ){ + if( $returnAttributes){ + $ret_aux[]=array( 'MAILBOX' => $mbox["EXT"]["LIST"]["MAILBOX_NAME"], + 'ATTRIBUTES' => $mbox["EXT"]["LIST"]["NAME_ATTRIBUTES"] , + 'HIERACHY_DELIMITER' => $mbox["EXT"]["LIST"]["HIERACHY_DELIMITER"] ) ; + }else{ + $ret_aux[]=$mbox["EXT"]["LIST"]["MAILBOX_NAME"]; + } + #} + } + } + } + return $ret_aux; + } + + + + /** + * check if the mailbox name exists + * + * @param string $mailbox mailbox name to check existance + * + * @return mixed boolean true/false or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function mailboxExist($mailbox) + { + // true means do an exact match + if( PEAR::isError( $ret = $this->getMailboxes( $mailbox, 1, false ) ) ){ + return $ret; + } + if( count( $ret ) > 0 ){ + foreach ($ret as $mailbox_name) { + if ($mailbox_name == $mailbox) { + return true; + } + } + } + return false; + } + + + + /** + * Creates the mailbox $mailbox + * + * @param string $mailbox mailbox name to create + * @param array $options options to pass to create (default is no options) + * + * @return mixed true on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function createMailbox($mailbox, $options = null) + { + if (PEAR::isError($ret = $this->cmdCreate($mailbox, $options))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * Deletes the mailbox $mailbox + * + * @param string $mailbox mailbox name to delete + * + * @return mixed true on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function deleteMailbox($mailbox) + { + // TODO verificar que el mailbox se encuentra vacio y, sino borrar los mensajes antes~!!!!!! + // ToDo find someone who can translate the above todo + if (PEAR::isError($ret = $this->cmdDelete($mailbox))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * Renames the mailbox $mailbox + * + * @param string $oldmailbox mailbox name to rename + * @param string $newmailbox new name for the mailbox + * @param array $options options to pass to rename + * + * @return mixed true on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function renameMailbox($oldmailbox, $newmailbox, $options = null) + { + if (PEAR::isError($ret = $this->cmdRename($oldmailbox, $newmailbox, $options))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + + /****************************************************************** + ** ** + ** SUBSCRIPTION METHODS ** + ** ** + ******************************************************************/ + + /** + * Subscribes to the selected mailbox + * + * @param string $mailbox mailbox name to subscribe (default is current mailbox) + * + * @return mixed true on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function subscribeMailbox($mailbox = null ) + { + if($mailbox == null){ + $mailbox = $this->getCurrentMailbox(); + } + if (PEAR::isError($ret = $this->cmdSubscribe($mailbox))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * Removes the subscription to a mailbox + * + * @param string $mailbox mailbox name to unsubscribe (default is current mailbox) + * + * @return mixed true on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function unsubscribeMailbox($mailbox = null) + { + if($mailbox == null){ + $mailbox = $this->getCurrentMailbox(); + } + if (PEAR::isError($ret = $this->cmdUnsubscribe($mailbox))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * Lists the subscription to mailboxes + * + * @param string $mailbox_base mailbox name start the search (see to getMailboxes() ) + * @param string $mailbox_name mailbox name filter the search (see to getMailboxes() ) + * + * @return mixed true on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function listsubscribedMailboxes($reference = '' , $restriction_search = 0, $returnAttributes = false) + { + #echo __METHOD__." called for ".$reference."#$restriction_search#
"; + if ( is_bool($restriction_search) ){ + $restriction_search = (int) $restriction_search; + } + + if ( is_int( $restriction_search ) ){ + switch ( $restriction_search ) { + case 0: + $mailbox = "*"; + break; + case 1: + $mailbox = $reference; + $reference = '%'; + break; + case 2: + $mailbox = "%"; + break; + } + }else{ + if ( is_string( $restriction_search ) ){ + $mailbox = $restriction_search; + }else { + return new PEAR_Error("UPS... you "); + } + } + + if( PEAR::isError( $ret=$this->cmdLsub($reference, $mailbox) ) ){ + return $ret; + } + //$ret=$this->cmdLsub($mailbox_base, $mailbox_name); + + + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + $ret_aux=array(); + if( isset($ret["PARSED"]) ){ + foreach( $ret["PARSED"] as $mbox ){ + if( isset($mbox["EXT"]["LSUB"]["MAILBOX_NAME"]) ){ + if( $returnAttributes){ + $ret_aux[]=array( + 'MAILBOX' => $mbox["EXT"]["LSUB"]["MAILBOX_NAME"], + 'ATTRIBUTES' => $mbox["EXT"]["LSUB"]["NAME_ATTRIBUTES"], + 'HIERACHY_DELIMITER' => $mbox["EXT"]["LSUB"]["HIERACHY_DELIMITER"] + ) ; + } else { + $ret_aux[]=$mbox["EXT"]["LSUB"]["MAILBOX_NAME"]; + } + } + } + } + return $ret_aux; + } + + + + + /****************************************************************** + ** ** + ** FLAGS METHODS ** + ** ** + ******************************************************************/ + + /** + * Lists the flags of the selected messages + * + * @param mixed $msg_id the message list + * + * @return mixed array on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function getFlags( $msg_id = null , $uidStore = false) + { + // You can also provide an array of numbers to those emails + if( $msg_id != null){ + if(is_array($msg_id)){ + $message_set=$this->_getSearchListFromArray($msg_id); + }else{ + $message_set=$msg_id; + } + }else{ + $message_set="1:*"; + } + if ($uidStore == true ) { + $ret = $this->cmdUidFetch($message_set, 'FLAGS'); + } else { + $ret = $this->cmdFetch($message_set, 'FLAGS'); + } + + if (PEAR::isError($ret)) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + $flags=array(); + if(isset($ret["PARSED"])){ + foreach($ret["PARSED"] as $msg_flags){ + if(isset($msg_flags["EXT"]["FLAGS"])){ + $flags[]=$msg_flags["EXT"]["FLAGS"]; + } + } + } + return $flags; + } + + + + /** + * Sets the flags of the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * @param mixed $flags flags to set (space separated String or array) + * @param string $mod "set" to set flags (default) + * "add" to add flags + * "remove" to remove flags + * @param boolean $uidStore msg_id contains UID's instead of Message Sequence Number if set to true + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function setFlags($msg_id, $flags, $mod = 'set', $uidStore = false) + { + #error_log("egw-pear::Net::setFlags"); + // you can also provide an array of numbers to those emails + if ($msg_id == 'all') { + $message_set = '1:*'; + } else { + if (is_array($msg_id)) { + $message_set = $this->_getSearchListFromArray($msg_id); + } else { + $message_set = $msg_id; + } + } + + $flaglist = ''; + if (is_array($flags)) { + $flaglist = implode(' ', $flags); + } else { + $flaglist = $flags; + } + + switch ($mod) { + case 'set': + $dataitem = 'FLAGS'; + break; + case 'add': + $dataitem = '+FLAGS'; + break; + case 'remove': + $dataitem = '-FLAGS'; + break; + default: + // Wrong Input + return new PEAR_Error('wrong input $mod'); + break; + } + #error_log("egw-pear::Net::setFlags for Message: ".print_r($message_set,true)."->".$flaglist); + if($uidStore == true) { + $ret=$this->cmdUidStore($message_set, $dataitem, $flaglist); + } else { + $ret=$this->cmdStore($message_set, $dataitem, $flaglist); + } + if (PEAR::isError($ret)) { + return $ret; + } + if (strtoupper($ret['RESPONSE']['CODE']) != 'OK') { + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + return true; + } + + + + /** + * adds flags to the selected messages + * + * @param mixed $flags flags to set (space separated String or array) + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function addFlags($msg_id, $flags) + { + return $this->setFlags($msg_id, $flags, $mod = 'add'); + } + + + + /** + * adds the Seen flag (\Seen) to the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function addSeen($msg_id) + { + return $this->setFlags($msg_id, '\Seen', $mod = 'add'); + } + + + + /** + * adds the Answered flag (\Answered) to the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function addAnswered($msg_id) + { + return $this->setFlags($msg_id, '\Answered', $mod = 'add'); + } + + + + /** + * adds the Deleted flag (\Deleted) to the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function addDeleted($msg_id) + { + return $this->setFlags($msg_id, '\Deleted', $mod = 'add'); + } + + + + /** + * adds the Flagged flag (\Flagged) to the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function addFlagged($msg_id) + { + return $this->setFlags($msg_id, '\Flagged', $mod = 'add'); + } + + + + /** + * adds the Draft flag (\Draft) to the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function addDraft($msg_id) + { + return $this->setFlags($msg_id, '\Draft', $mod = 'add'); + } + + + + /** + * remove flags from the selected messages + * + * @param mixed $flags flags to remove (space separated string or array) + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function removeFlags($msg_id, $flags) + { + return $this->setFlags($msg_id, $flags, $mod = 'remove'); + } + + + + /** + * remove the Seen flag (\Seen) from the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function removeSeen($msg_id) + { + return $this->setFlags($msg_id, '\Seen', $mod = 'remove'); + } + + + + /** + * remove the Answered flag (\Answered) from the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function removeAnswered($msg_id) + { + return $this->setFlags($msg_id, '\Answered', $mod = 'remove'); + } + + + + /** + * remove the Deleted flag (\Deleted) from the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function removeDeleted($msg_id) + { + return $this->setFlags($msg_id, '\Deleted', $mod = 'remove'); + } + + + + /** + * remove the Flagged flag (\Flagged) from the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function removeFlagged($msg_id) + { + return $this->setFlags($msg_id, '\Flagged', $mod = 'remove'); + } + + + + /** + * remove the Draft flag (\Draft) from the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function removeDraft($msg_id) + { + return $this->setFlags($msg_id, '\Draft', $mod = 'remove'); + } + + + + /** + * check the Seen flag + * + * @param mixed $message_nro the message to check + * + * @return mixed true or false if the flag is set PearError on Failure + * + * @access public + * @since 1.0 + */ + function isSeen($message_nro) + { + return $this->hasFlag( $message_nro, "\\Seen" ); + } + + + + /** + * check the Answered flag + * + * @param mixed $message_nro the message to check + * + * @return mixed true or false if the flag is set PearError on failure + * + * @access public + * @since 1.0 + */ + function isAnswered($message_nro) + { + return $this->hasFlag( $message_nro, "\\Answered" ); + } + + + + /** + * check the flagged flag + * + * @param mixed $message_nro the message to check + * + * @return mixed true or false if the flag is set PearError on failure + * + * @access public + * @since 1.0 + */ + function isFlagged($message_nro) + { + return $this->hasFlag( $message_nro, "\\Flagged" ); + } + + + + /** + * check the Draft flag + * + * @param mixed $message_nro the message to check + * + * @return mixed true or false if the flag is set PearError on failure + * + * @access public + * @since 1.0 + */ + function isDraft($message_nro) + { + return $this->hasFlag( $message_nro, "\\Draft" ); + } + + + + /** + * check the Deleted flag + * + * @param mixed $message_nro the message to check + * + * @return mixed true or false if the flag is set PearError on failure + * + * @access public + * @since 1.0 + */ + function isDeleted($message_nro) + { + return $this->hasFlag( $message_nro, "\\Deleted" ); + } + + + + /** + * checks if a flag is set + * + * @param mixed $message_nro the message to check + * @param string $flag the flag that should be checked + * + * @return mixed true or false if the flag is set PearError on Failure + * + * @since 1.0 + * @access public + */ + function hasFlag($message_nro,$flag) + { + if ( PEAR::isError( $resp = $this->getFlags( $message_nro ) ) ) { + return $resp; + } + if(isset($resp[0]) ){ + if( is_array( $resp[0] ) ){ + if( in_array( $flag , $resp[0] ) ) + return true; + } + } + return false; + } + + + + + /****************************************************************** + ** ** + ** MISC METHODS ** + ** ** + ******************************************************************/ + + + /** + * expunge function. Sends the EXPUNGE command + * + * @return mixed true on success / PEAR Error on failure + * + * @access public + * @since 1.0 + */ + function expunge() + { + if (PEAR::isError($ret = $this->cmdExpunge())) { + return $ret; + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * search function. Sends the SEARCH command + * + * @param string $search_list search criterias + * @param boolean $uidSearch if set to true UID SEARCH is send instead of SEARCH + * + * @return mixed message array or PEAR Error on failure + * + * @access public + * @since 1.0 + */ + function search($search_list, $uidSearch = false) + { + if($uidSearch){ + $ret = $this->cmdUidSearch($search_list); + }else{ + $ret = $this->cmdSearch($search_list); + } + if (PEAR::isError($ret)) { + return $ret; + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return $ret["PARSED"]["SEARCH"]["SEARCH_LIST"]; + } + + + + /** + * sort function. Sends the SORT command + * + * @param string $sort_list sort program + * @param string $charset charset specification (default = 'US-ASCII') + * @param string $search_list searching criteria + * @param boolean $uidSort if set to true UID SORT is send instead of SORT + * + * @return mixed message array or PEAR Error on failure + * + * @access public + * @since 1.1 + */ + function sort($sort_list, $charset='US-ASCII', $search_list = 'ALL', $uidSort = false) + { + $sort_command = sprintf("(%s) %s %s", $sort_list, strtoupper($charset), $search_list); + + if ($uidSort) { + $ret = $this->cmdUidSort($sort_command); + } else { + $ret = $this->cmdSort($sort_command); + } + if (PEAR::isError($ret)) { + return $ret; + } + if (strtoupper($ret['RESPONSE']['CODE']) != 'OK') { + return new PEAR_Error($ret['RESPONSE']['CODE'] . ", " . $ret['RESPONSE']['STR_CODE']); + } + return $ret['PARSED']['SORT']['SORT_LIST']; + } + + + + + /****************************************************************** + ** ** + ** QUOTA METHODS ** + ** ** + ******************************************************************/ + + + /** + * Returns STORAGE quota details + * + * @param string $mailbox_name Mailbox to get quota info. (default is current mailbox) + * + * @return assoc array contaning the quota info on success or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function getStorageQuotaRoot($mailbox_name = null ) + { + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + + + if ( PEAR::isError( $ret = $this->cmdGetQuotaRoot($mailbox_name) ) ) { + return new PEAR_Error($ret->getMessage()); + } + + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + // if the error is that the user does not have quota set return an array + // and not pear error + if( substr(strtoupper($ret["RESPONSE"]["STR_CODE"]),0,9) == "QUOTAROOT" ){ + return array('USED'=>'NOT SET', 'QMAX'=>'NOT SET'); + } + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + if( isset( $ret['PARSED']['EXT']['QUOTA']['STORAGE'] ) ){ + return $ret['PARSED']['EXT']['QUOTA']['STORAGE']; + } + return array('USED'=>'NOT SET', 'QMAX'=>'NOT SET'); + } + + + + /** + * Returns STORAGE quota details + * + * @param string $mailbox_name Mailbox to get quota info. (default is current mailbox) + * + * @return assoc array contaning the quota info on success or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function getStorageQuota($mailbox_name = null ) + { + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + + + if ( PEAR::isError( $ret = $this->cmdGetQuota($mailbox_name) ) ) { + return new PEAR_Error($ret->getMessage()); + } + + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + // if the error is that the user does not have quota set return an array + // and not pear error + if( substr(strtoupper($ret["RESPONSE"]["STR_CODE"]),0,5) == "QUOTA" ){ + return array('USED'=>'NOT SET', 'QMAX'=>'NOT SET'); + } + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + if( isset( $ret['PARSED']['EXT']['QUOTA']['STORAGE'] ) ){ + return $ret['PARSED']['EXT']['QUOTA']['STORAGE']; + } + return array('USED'=>'NOT SET', 'QMAX'=>'NOT SET'); + } + + + + /** + * Returns MESSAGES quota details + * + * @param string $mailbox_name Mailbox to get quota info. (default is current mailbox) + * + * @return assoc array contaning the quota info on success or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function getMessagesQuota($mailbox_name = null ) + { + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + + if ( PEAR::isError( $ret = $this->cmdGetQuota($mailbox_name) ) ) { + return new PEAR_Error($ret->getMessage()); + } + + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + // if the error is that the user does not have quota set return an array + // and not pear error + if( substr(strtoupper($ret["RESPONSE"]["STR_CODE"]),0,5) == "QUOTA" ){ + return array('USED'=>'NOT SET', 'QMAX'=>'NOT SET'); + } + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + if( isset( $ret['PARSED']['EXT']['QUOTA']['MESSAGES'] ) ){ + return $ret['PARSED']['EXT']['QUOTA']['MESSAGES']; + } + return array('USED'=>'NOT SET', 'QMAX'=>'NOT SET'); + } + + + + /** + * sets STORAGE quota + * + * @param string $mailbox_name Mailbox to set quota + * @param int $quota Quotasize + * + * @return true on success or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function setStorageQuota($mailbox_name, $quota) + { + if ( PEAR::isError( $ret = $this->cmdSetQuota($mailbox_name,$quota) ) ) { + return new PEAR_Error($ret->getMessage()); + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * sets MESSAGES quota + * + * @param string $mailbox_name Mailbox to set quota + * @param int $quota Quotasize + * + * @return true on success or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function setMessagesQuota($mailbox_name, $quota) + { + if ( PEAR::isError( $ret = $this->cmdSetQuota($mailbox_name,'',$quota) ) ) { + return new PEAR_Error($ret->getMessage()); + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + + /****************************************************************** + ** ** + ** ACL METHODS ** + ** ** + ******************************************************************/ + + + /** + * get the Access Control List details + * + * @param string $mailbox_name Mailbox to get ACL info. (default is current mailbox) + * + * @return mixed string on success or false or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function getACL($mailbox_name = null ) + { + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + if ( PEAR::isError( $ret = $this->cmdGetACL($mailbox_name) ) ) { + return new PEAR_Error($ret->getMessage()); + } + + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + if( isset($ret['PARSED']['USERS']) ){ + return $ret['PARSED']['USERS']; + }else{ + return false; + } + } + + + + /** + * Set ACL on a mailbox + * + * @param string $mailbox_name the mailbox + * @param string $user user to set the ACL + * @param string $acl ACL list + * + * @return mixed true on success or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function setACL($mailbox_name, $user, $acl) + { + if ( PEAR::isError( $ret = $this->cmdSetACL($mailbox_name, $user, $acl) ) ) { + return new PEAR_Error($ret->getMessage()); + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * deletes the ACL on a mailbox + * + * @param string $mailbox_name the mailbox + * @param string $user user to delete the ACL + * + * @return mixed true on success, or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function deleteACL($mailbox_name, $user) + { + if ( PEAR::isError( $ret = $this->cmdDeleteACL($mailbox_name, $user) ) ) { + return new PEAR_Error($ret->getMessage()); + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * returns the rights that the user logged on has on the mailbox + * this method can be used by any user, not only the administrator + * + * @param string $mailbox_name the mailbox to query rights (default is current mailbox) + * + * @return mixed string containing the list of rights on success, or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function getMyRights($mailbox_name = null) + { + + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + + + if ( PEAR::isError( $ret = $this->cmdMyRights($mailbox_name) ) ) { + return new PEAR_Error($ret->getMessage()); + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + if(isset($ret['PARSED']['GRANTED'])){ + return $ret['PARSED']['GRANTED']; + } + + return new PEAR_Error('Bogus response from server!' ); + } + + + + /** + * returns an array containing the rights for given user on the mailbox + * this method can be used by any user, not only the administrator + * + * @param string $user the user to query rights + * @param string $mailbox_name the mailbox to query rights (default is current mailbox) + * + * @return mixed string containing the list of rights on success, or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function getACLRights($user,$mailbox_name = null) + { + + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + + + if ( PEAR::isError( $ret = $this->cmdListRights($mailbox_name, $user) ) ) { + return new PEAR_Error($ret->getMessage()); + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + + if(isset($ret['PARSED']['GRANTED'])){ + return $ret['PARSED']['GRANTED']; + } + + return new PEAR_Error('Bogus response from server!' ); + + } + + + + + /****************************************************************** + ** ** + ** ANNOTATEMORE METHODS ** + ** ** + ******************************************************************/ + + + /** + * set annotation + * + * @param string $entry + * @param array $values + * @param string $mailbox_name (default is current mailbox) + * + * @return mixed true on success or PEAR Error on failure + * + * @access public + * @since 1.0.2 + */ + function setAnnotation($entry, $values, $mailbox_name = null ) + { + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + + if (PEAR::isError($ret = $this->cmdSetAnnotation($mailbox_name, $entry, $values))) { + return new PEAR_Error($ret->getMessage()); + } + if (strtoupper($ret['RESPONSE']['CODE']) != 'OK') { + return new PEAR_Error($ret['RESPONSE']['CODE'] . ', ' . $ret['RESPONSE']['STR_CODE']); + } + return true; + } + + + /** + * delete annotation + * + * @param string $entry + * @param array $values + * @param string $mailbox_name (default is current mailbox) + * + * @return mixed true on success or PEAR Error on failure + * + * @access public + * @since 1.0.2 + */ + function deleteAnnotation($entry, $values, $mailbox_name = null ) + { + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + + if (PEAR::isError($ret = $this->cmdDeleteAnnotation($mailbox_name, $entry, $values))) { + return new PEAR_Error($ret->getMessage()); + } + if (strtoupper($ret['RESPONSE']['CODE']) != 'OK') { + return new PEAR_Error($ret['RESPONSE']['CODE'] . ', ' . $ret['RESPONSE']['STR_CODE']); + } + return true; + } + + + /** + * get annotation + * + * @param string $entry + * @param array $values + * @param string $mailbox_name (default is current mailbox) + * + * @return mixed array containing annotations on success or PEAR Error on failure + * + * @access public + * @since 1.0.2 + */ + function getAnnotation($entries, $values, $mailbox_name = null) + { + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + if (!is_array($entries)) { + $entries = array($entries); + } + if (!is_array($values)) { + $values = array($values); + } + + if (PEAR::isError($ret = $this->cmdGetAnnotation($mailbox_name, $entries, $values))) { + return new PEAR_Error($ret->getMessage()); + } + if (strtoupper($ret['RESPONSE']['CODE']) != 'OK') { + return new PEAR_Error($ret['RESPONSE']['CODE'] . ', ' . $ret['RESPONSE']['STR_CODE']); + } + $ret_aux = array(); + if (isset($ret['PARSED'])) { + foreach ($ret['PARSED'] as $mbox) { + $rawvalues = $mbox['EXT']['ATTRIBUTES']; + $values = array(); + for ($i = 0; $i < count($rawvalues); $i += 2) { + $values[$rawvalues[$i]] = $rawvalues[$i + 1]; + } + $mbox['EXT']['ATTRIBUTES'] = $values; + $ret_aux[] = $mbox['EXT']; + } + } + if (count($ret_aux) == 1 && $ret_aux[0]['MAILBOX'] == $mailbox_name) { + if (count($entries) == 1 && $ret_aux[0]['ENTRY'] == $entries[0]) { + if (count($ret_aux[0]['ATTRIBUTES']) == 1 && count($values) == 1) { + $attrs = array_keys($ret_aux[0]['ATTRIBUTES']); + $vals = array_keys($values); + if ($attrs[0] == $vals[0]) { + return $ret_aux[0]['ATTRIBUTES'][$attrs[0]]; + } + } + } + } + return $ret_aux; + } + + + + /** + * Transform an array to a list to be used in the cmdFetch method + * + * @param array $arr array to transform + * + * @return string transformed array + * + * @access private + */ + function _getSearchListFromArray($arr){ + + $txt=implode(',' , $arr); + return $txt; + } + + + + + /***************************************************** + Net_POP3 Compatibility functions: + + Warning!!! + Those functions could dissapear in the future + + *********************************************************/ + + + /** + * same as getMailboxSize() + * Net_POP3 Compatibility function + * + * @return same as getMailboxSize(); + * + * @access public + */ + function getSize(){ + return $this->getMailboxSize(); + } + + /** + * same as getNumberOfMessages($mailbox) + * Net_POP3 Compatibility function + * + * @param string $mailbox Mailbox (default is current mailbox) + * + * @return same as getNumberOfMessages($mailbox) + * + * @access public + */ + function numMsg($mailbox = null){ + return $this->getNumberOfMessages($mailbox); + } + + + /** + * Returns the entire message with given message number. + * Net_POP3 Compatibility function + * + * @param $msg_id Message number + * + * @return mixed either entire message or PEAR Error on failure + * + * @access public + */ + function getMsg($msg_id) + { + if (PEAR::isError($ret = $this->getMessages($msg_id, false))) { + return $ret; + } + // false means that getMessages() must not use the msg number as array key + if(isset($ret[0])){ + return $ret[0]; + }else{ + return $ret; + } + + } + + + + /** + * same as getMessagesList($msg_id) + * Net_POP3 Compatibility function + * + * @param $msg_id Message number + * + * @return same as getMessagesList() + * + * @access public + */ + function getListing($msg_id = null) + { + return $this->getMessagesList($msg_id); + } + + + + /** + * same as deleteMessages($msg_id) + * Net_POP3 Compatibility function + * + * @param $msg_id Message number + * + * @return same as deleteMessages() + * + * @access public + */ + function deleteMsg($msg_id){ + return $this->deleteMessages($msg_id); + } + + +} +?> diff --git a/egw-pear/Net/IMAPProtocol.php b/egw-pear/Net/IMAPProtocol.php new file mode 100644 index 0000000000..591f232c06 --- /dev/null +++ b/egw-pear/Net/IMAPProtocol.php @@ -0,0 +1,3460 @@ + | +// +----------------------------------------------------------------------+ +require_once 'Net/Socket.php'; + + + +/** + * Provides an implementation of the IMAP protocol using PEAR's + * Net_Socket:: class. + * + * @package Net_IMAP/Protocol + * @author Damian Alejandro Fernandez Sosa + */ +class Net_IMAPProtocol { + + + /** + * The auth methods this class support + * @var array + */ + var $supportedAuthMethods=array('DIGEST-MD5', 'CRAM-MD5', 'LOGIN', 'PLAIN'); + + + /** + * The auth methods this class support + * @var array + */ + var $supportedSASLAuthMethods=array('DIGEST-MD5', 'CRAM-MD5'); + + + /** + * _serverAuthMethods + * @var boolean + */ + var $_serverAuthMethods = null; + + + /** + * The the current mailbox + * @var string + */ + var $currentMailbox = "INBOX" ; + + + /** + * The socket resource being used to connect to the IMAP server. + * @var resource + */ + var $_socket = null; + + + /** + * The timeout for the connection to the IMAP server. + * @var int + */ + var $_timeout = null; + + + /** + * The options for SSL/TLS connection + * (see documentation for stream_context_create) + * @var array + */ + var $_streamContextOptions = null; + + + /** + * To allow class debuging + * @var boolean + */ + var $_debug = false; + var $dbgDialog = ''; + + + /** + * Print error messages + * @var boolean + */ + var $_printErrors = false; + + + /** + * Command Number + * @var int + */ + var $_cmd_counter = 1; + + + /** + * Command Number for IMAP commands + * @var int + */ + var $_lastCmdID = 1; + + + /** + * Command Number + * @var boolean + */ + var $_unParsedReturn = false; + + + /** + * _connected: checks if there is a connection made to a imap server or not + * @var boolean + */ + var $_connected = false; + + + /** + * Capabilities + * @var boolean + */ + var $_serverSupportedCapabilities = null; + + + /** + * Use UTF-7 funcionallity + * @var boolean + */ + var $_useUTF_7 = true; + + + + /** + * Constructor + * + * Instantiates a new Net_IMAP object. + * + * @since 1.0 + */ + function Net_IMAPProtocol() + { + $this->_socket = new Net_Socket(); + + /* + * Include the Auth_SASL package. If the package is not available, + * we disable the authentication methods that depend upon it. + */ + + + if ((@include_once 'Auth/SASL.php') == false) { + foreach($this->supportedSASLAuthMethods as $SASLMethod){ + $pos = array_search( $SASLMethod , $this->supportedAuthMethods); + unset($this->supportedAuthMethods[$pos]); + } + } + + } + + + /** + * Attempt to connect to the IMAP server. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdConnect($host= "localhost" , $port = 143) + { + if( $this->_connected ){ + return new PEAR_Error( 'already connected, logout first!' ); + } + if (PEAR::isError($error = $this->_socket->connect($host, $port, null, $this->_timeout, $this->_streamContextOptions))) { + return $error; + } + if ( PEAR::isError( $this->_getRawResponse() ) ) { + return new PEAR_Error( 'unable to open socket' ); + } + $this->_connected = true; + return true; + } + + + /** + * get the cmd ID + * + * @return string Returns the CmdID and increment the counter + * + * @access private + * @since 1.0 + */ + function _getCmdId() + { + $this->_lastCmdID = "A000" . $this->_cmd_counter ; + $this->_cmd_counter++; + return $this->_lastCmdID; + } + + + /** + * get the last cmd ID + * + * @return string Returns the last cmdId + * + * @access public + * @since 1.0 + */ + function getLastCmdId() + { + return $this->_lastCmdID; + } + + + + + /** + * get current mailbox name + * + * @return string Returns the current mailbox + * + * @access public + * @since 1.0 + */ + function getCurrentMailbox() + { + return $this->currentMailbox; + } + + + + + /** + * Sets the debuging information on or off + * + * @param boolean True or false + * + * @return nothing + * @access public + * @since 1.0 + */ + function setDebug($debug = true) + { + $this->_debug = $debug; + } + + + function getDebugDialog() + { + return $this->dbgDialog; + } + + /** + * Sets printed output of errors on or of + * + * @param boolean true or false + * + * @return nothing + * @access public + * @since 1.1 + */ + function setPrintErrors($printErrors = true) + { + $this->_printErrors = $printErrors; + } + + + /** + * Send the given string of data to the server. + * + * @param string $data The string of data to send. + * + * @return mixed True on success or a PEAR_Error object on failure. + * + * @access private + * @since 1.0 + */ + function _send($data) + { + if($this->_socket->eof() ){ + return new PEAR_Error( 'Failed to write to socket: (connection lost!) ' ); + } + if ( PEAR::isError( $error = $this->_socket->write( $data ) ) ) { + + return new PEAR_Error( 'Failed to write to socket: ' . + $error->getMessage() ); + } + + if( $this->_debug ){ + // C: means this data was sent by the client (this class) + echo "C: $data"; + $this->dbgDialog.="C: $data"; + } + return true; + } + + /** + * Receive the given string of data from the server. + * + * @return mixed a line of response on success or a PEAR_Error object on failure. + * + * @access private + * @since 1.0 + */ + function _recvLn() + { + + if (PEAR::isError( $this->lastline = $this->_socket->gets( 8192 ) ) ) { + return new PEAR_Error('Failed to write to socket: ' . + $this->lastline->getMessage() ); + } + if($this->_debug){ + // S: means this data was sent by the IMAP Server + echo "S: " . $this->lastline . "" ; + $this->dbgDialog.="S: " . $this->lastline . "" ; + } + if( $this->lastline == '' ){ + return new PEAR_Error('Failed to receive from the socket: ' ); + } + return $this->lastline; + } + + + + + + /** + * Send a command to the server with an optional string of arguments. + * A carriage return / linefeed (CRLF) sequence will be appended to each + * command string before it is sent to the IMAP server. + * + * @param string $commandId The IMAP cmdID to send to the server. + * @param string $command The IMAP command to send to the server. + * @param string $args A string of optional arguments to append + * to the command. + * + * @return mixed The result of the _send() call. + * + * @access private + * @since 1.0 + */ + function _putCMD($commandId , $command, $args = '') + { + if ( !empty( $args ) ) { + return $this->_send( $commandId . " " . $command . " " . $args . "\r\n" ); + } + return $this->_send( $commandId . " " . $command . "\r\n" ); + } + + + + + + + /** + * Get a response from the server with an optional string of commandID. + * A carriage return / linefeed (CRLF) sequence will be appended to each + * command string before it is sent to the IMAP server. + * + * @param string $commandid The IMAP commandid retrive from the server. + * + * @return string The result response. + * + * @access private + */ + function _getRawResponse($commandId = '*') + { + $arguments = ''; + while ( !PEAR::isError( $this->_recvLn() ) ) { + $reply_code = strtok( $this->lastline , ' ' ); + $arguments.= $this->lastline; + if ( !(strcmp( $commandId , $reply_code ) ) ) { + return $arguments; + } + } + return $arguments; + } + + + + + + /** + * get the "returning of the unparsed response" feature status + * + * @return boolean return if the unparsed response is returned or not + * + * @access public + * @since 1.0 + * + */ + function getUnparsedResponse() + { + return $this->_unParsedReturn; + } + + /** + * set the options for a SSL/TLS connection + * (see documentation for stream_context_create) + * + * @param array $options the options for the SSL/TLS connection + * @return nothing + * + * @access public + * @since 1.1 + */ + function setStreamContextOptions($options) + { + $this->_streamContextOptions = $options; + } + + /** + * set the the timeout for the connection to the IMAP server. + * + * @param int $timeout the timeout + * @return nothing + * + * @access public + * @since 1.1 + */ + function setTimeout($timeout) + { + $this->_timeout = $timeout; + } + + + /** + * set the "returning of the unparsed response" feature on or off + * + * @param boolean $status: true: feature is on + * @return nothing + * + * @access public + * @since 1.0 + */ + function setUnparsedResponse($status) + { + $this->_unParsedReturn = $status; + } + + + + + + + /** + * Attempt to login to the iMAP server. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdLogin($uid , $pwd) + { + $param="\"$uid\" \"$pwd\""; + return $this->_genericCommand('LOGIN', $param); + } + + + + + + + /** + * Attempt to authenticate to the iMAP server. + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * @param string The cmdID. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdAuthenticate($uid , $pwd , $userMethod = null) + { + + if( !$this->_connected ){ + return new PEAR_Error('not connected!'); + } + + $cmdid = $this->_getCmdId(); + + + if ( PEAR::isError( $method = $this->_getBestAuthMethod($userMethod) ) ) { + return $method; + } + + + switch ($method) { + case 'DIGEST-MD5': + $result = $this->_authDigest_MD5( $uid , $pwd , $cmdid ); + break; + case 'CRAM-MD5': + $result = $this->_authCRAM_MD5( $uid , $pwd ,$cmdid ); + break; + case 'LOGIN': + $result = $this->_authLOGIN( $uid , $pwd , $cmdid ); + break; + case 'PLAIN': + $result = $this->_authPLAIN( $uid , $pwd , $cmdid ); + break; + + default : + $result = new PEAR_Error( "$method is not a supported authentication method" ); + break; + } + + $args = $this->_getRawResponse( $cmdid ); + return $this->_genericImapResponseParser( $args , $cmdid ); + + } + + + + + + + + + /* Authenticates the user using the DIGEST-MD5 method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * @param string The cmdID. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authDigest_MD5($uid , $pwd , $cmdid) + { + class_exists('Auth_SASL') || require_once 'Auth/SASL.php'; + if ( PEAR::isError($error = $this->_putCMD( $cmdid ,"AUTHENTICATE" , "DIGEST-MD5") ) ) { + return $error; + } + + if (PEAR::isError( $args = $this->_recvLn() ) ) { + return $args; + } + + $this->_getNextToken( $args , $plus ); + + $this->_getNextToken( $args , $space ); + + $this->_getNextToken( $args , $challenge ); + + $challenge = base64_decode( $challenge ); + + $digest = &Auth_SASL::factory('digestmd5'); + + $auth_str = base64_encode($digest->getResponse($uid, $pwd, $challenge,"localhost", "imap")); + + if ( PEAR::isError( $error = $this->_send("$auth_str\r\n"))) { + return $error; + } + + if ( PEAR::isError( $args = $this->_recvLn() )) { + return $args; + } + /* + * We don't use the protocol's third step because IMAP doesn't allow + * subsequent authentication, so we just silently ignore it. + */ + if ( PEAR::isError( $error = $this->_send( "\r\n" ) ) ) { + return $error; + } + } + + + + + + + + + /* Authenticates the user using the CRAM-MD5 method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * @param string The cmdID. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authCRAM_MD5($uid, $pwd, $cmdid) + { + + class_exists('Auth_SASL') || require_once 'Auth/SASL.php'; + + if ( PEAR::isError($error = $this->_putCMD( $cmdid ,"AUTHENTICATE" , "CRAM-MD5") ) ) { + return $error; + } + + if ( PEAR::isError( $args = $this->_recvLn() ) ) { + return $args; + } + + $this->_getNextToken( $args , $plus ); + + $this->_getNextToken( $args , $space ); + + $this->_getNextToken( $args , $challenge ); + + $challenge = base64_decode( $challenge ); + + $cram = &Auth_SASL::factory('crammd5'); + + $auth_str = base64_encode( $cram->getResponse( $uid , $pwd , $challenge ) ); + + if ( PEAR::isError( $error = $this->_send( $auth_str."\r\n" ) ) ) { + return $error; + } + + } + + + + + + + + + + /* Authenticates the user using the LOGIN method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * @param string The cmdID. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authLOGIN($uid, $pwd, $cmdid) + { + + if (PEAR::isError($error = $this->_putCMD($cmdid,"AUTHENTICATE", "LOGIN"))) { + return $error; + } + + if (PEAR::isError($args = $this->_recvLn() )) { + return $args; + } + + $this->_getNextToken( $args , $plus ); + + $this->_getNextToken( $args , $space ); + + $this->_getNextToken( $args , $challenge ); + + $challenge = base64_decode( $challenge ); + + $auth_str = base64_encode( "$uid" ); + + if ( PEAR::isError( $error = $this->_send( $auth_str."\r\n" ) ) ) { + return $error; + } + + if (PEAR::isError( $args = $this->_recvLn() ) ) { + return $args; + } + + $auth_str = base64_encode( "$pwd" ); + + if ( PEAR::isError($error = $this->_send( $auth_str."\r\n" ) ) ) { + return $error; + } + + } + + + + + + /* Authenticates the user using the PLAIN method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * @param string The cmdID. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authPLAIN($uid, $pwd, $cmdid) + { + + if (PEAR::isError($error = $this->_putCMD($cmdid,"AUTHENTICATE", "PLAIN"))) { + return $error; + } + + if (PEAR::isError($args = $this->_recvLn() )) { + return $args; + } + + $this->_getNextToken( $args , $plus ); + + $this->_getNextToken( $args , $space ); + + $this->_getNextToken( $args , $challenge ); + + $challenge = base64_decode( $challenge ); + + $auth_str = base64_encode(chr(0).$uid.chr(0).$pwd ); + + if ( PEAR::isError( $error = $this->_send( $auth_str."\r\n" ) ) ) { + return $error; + } + + } + + + + /** + * Returns the name of the best authentication method that the server + * has advertised. + * + * @param string if !=null,authenticate with this method ($userMethod). + * + * @return mixed Returns a string containing the name of the best + * supported authentication method or a PEAR_Error object + * if a failure condition is encountered. + * @access private + * @since 1.0 + */ + function _getBestAuthMethod($userMethod = null) + { + $this->cmdCapability(); + + if($userMethod != null ){ + + $methods = array(); + + $methods[] = $userMethod; + + }else{ + $methods = $this->supportedAuthMethods; + } + + if( ($methods != null) && ($this->_serverAuthMethods != null)){ + foreach ( $methods as $method ) { + if ( in_array( $method , $this->_serverAuthMethods ) ) { + return $method; + } + } + $serverMethods=implode(',' ,$this->_serverAuthMethods); + $myMethods=implode(',' ,$this->supportedAuthMethods); + if (!empty($userMethod) && !in_array($userMethod,$this->_serverAuthMethods)) + { + foreach ( $this->supportedAuthMethods as $method ) { + if ( in_array( $method , $this->_serverAuthMethods ) ) { + if ($this->_debug) error_log(__METHOD__." UserMethod $userMethod not supported by server; trying best ServerMethod $method"); + return $method; + } + } + } + + return new PEAR_Error("$method NOT supported authentication method!. This IMAP server " . + "supports these methods: $serverMethods, but I support $myMethods"); + }else{ + return new PEAR_Error("This IMAP server don't support any Auth methods"); + } + } + + + + + + + + + + /** + * Attempt to disconnect from the iMAP server. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdLogout() + { + if( !$this->_connected ){ + return new PEAR_Error( 'not connected!' ); + } + + if ( PEAR::isError( $args = $this->_genericCommand( 'LOGOUT' ) ) ) { + error_log(__METHOD__.$args->message); + return $args; + } + if (PEAR::isError( $reval = $this->_socket->disconnect() ) ) { + error_log(__METHOD__.$reval->message); + return new PEAR_Error('socket disconnect failed'); + } + + return $args; + // not for now + //return $this->_genericImapResponseParser($args,$cmdid); + + } + + + + + + /** + * Send the NOOP command. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdNoop() + { + return $this->_genericCommand('NOOP'); + } + + + + + + + + + + /** + * Send the CHECK command. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdCheck() + { + return $this->_genericCommand('CHECK'); + } + + + + + + + + + + + /** + * Send the Select Mailbox Command + * + * @param string The mailbox to select. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdSelect($mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + if( !PEAR::isError( $ret= $this->_genericCommand('SELECT', $mailbox_name) ) ){ + $this->currentMailbox = $mailbox; + } + return $ret; + } + + + + + + + + + + + /** + * Send the EXAMINE Mailbox Command + * + * @param string The mailbox to examine. + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdExamine($mailbox) + { + + $mailbox_name=$this->_createQuotedString($mailbox); + $ret=$this->_genericCommand('EXAMINE', $mailbox_name); + $parsed=''; + if ( PEAR::isError( $ret ) ) { + error_log(__METHOD__.__LINE__.$ret->message); + return new PEAR_Error( 'unable to examine '.$mailbox.':'.$ret->message ); + } + + if(isset( $ret["PARSED"] ) ){ + for($i=0;$i$parsed,"RESPONSE"=>$ret["RESPONSE"]); + } + + + + + + + + /** + * Send the CREATE Mailbox Command + * + * @param string $mailbox The mailbox to create. + * @param array $options options to pass to create + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdCreate($mailbox, $options = null) + { + $args = ""; + $mailbox_name=$this->_createQuotedString($mailbox); + $args = $this->_getCreateParams($options); + return $this->_genericCommand('CREATE', $mailbox_name.$args); + } + + /** + * Send the RENAME Mailbox Command + * + * @param string $mailbox The old mailbox name. + * @param string $new_mailbox The new (renamed) mailbox name. + * @param array $options options to pass to create + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdRename($mailbox, $new_mailbox, $options = null) + { + $mailbox_name=$this->_createQuotedString($mailbox); + $new_mailbox_name=$this->_createQuotedString($new_mailbox); + $args = $this->_getCreateParams($options); + return $this->_genericCommand('RENAME', "$mailbox_name $new_mailbox_name".$args ); + } + + /** + * Send the DELETE Mailbox Command + * + * @param string The mailbox name to delete. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdDelete($mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + return $this->_genericCommand('DELETE', $mailbox_name); + } + + + + + + + + /** + * Send the SUSCRIBE Mailbox Command + * + * @param string The mailbox name to suscribe. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdSubscribe($mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + return $this->_genericCommand('SUBSCRIBE', $mailbox_name ); + } + + + + + + + + + /** + * Send the UNSUSCRIBE Mailbox Command + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdUnsubscribe($mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + return $this->_genericCommand('UNSUBSCRIBE', $mailbox_name ); + } + + + + + + + + + /** + * Send the FETCH Command + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdFetch($msgset, $fetchparam) + { + return $this->_genericCommand('FETCH' , "$msgset $fetchparam" ); + } + + + + + + + + /** + * Send the CAPABILITY Command + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdCapability() + { + $ret = $this->_genericCommand( 'CAPABILITY' ); + + if(isset( $ret["PARSED"] ) ){ + foreach($ret["PARSED"] as $substruct) { + if ($substruct["COMMAND"] == "CAPABILITY") { + $subrv=$substruct["EXT"]["CAPABILITY"]; + break; + } + } + $ret["PARSED"]=$subrv; + //fill the $this->_serverAuthMethods and $this->_serverSupportedCapabilities arrays + foreach( (array)$ret["PARSED"]["CAPABILITIES"] as $auth_method ){ + if( strtoupper( substr( $auth_method , 0 ,5 ) ) == "AUTH=" ) + $this->_serverAuthMethods[] = substr( $auth_method , 5 ); + } + // Keep the capabilities response to use ir later + $this->_serverSupportedCapabilities = $ret["PARSED"]["CAPABILITIES"]; + } + + return $ret; + } + + /** + * Send the CAPABILITY Command + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdNamespace() + { + $ret = $this->_genericCommand( 'NAMESPACE' ); + + if(isset( $ret["PARSED"] ) ){ + $ret["PARSED"]=$ret["PARSED"][0]["EXT"]["NAMESPACE"]; + // Keep the namespace response for later use + $this->_namespace = $ret["PARSED"]["NAMESPACES"]; + } + + return $ret; + } + + + /** + * Send the STATUS Mailbox Command + * + * @param string $mailbox the mailbox name + * @param mixed $request the request status + * it could be an array or space separated string of + * MESSAGES | RECENT | UIDNEXT + * UIDVALIDITY | UNSEEN + * @return array Returns a Parsed Response + * + * @access public + * @since 1.0 + */ + function cmdStatus($mailbox, $request) + { + $mailbox_name=$this->_createQuotedString($mailbox); + + // make array from $request if it is none + if (!is_array($request)) { + $request = explode(' ', $request); + } + + // see RFC 3501 + $valid_status_data = array('MESSAGES', 'RECENT', 'UIDNEXT', 'UIDVALIDITY', 'UNSEEN'); + + foreach ($request as $status_data) { + if (!in_array($status_data, $valid_status_data)) { + $this->_prot_error("request '$status_data' is invalid! see RFC 3501!!!!" , __LINE__ , __FILE__); + } + } + + // back to space separated string + $request = implode(' ', $request); + + $ret = $this->_genericCommand('STATUS', $mailbox_name.' ('.$request.')'); + + if (isset($ret['PARSED'])) { + foreach ($ret['PARSED'] as &$parsed) + { + if (!empty($parsed['EXT'])) + { + if(empty($ret['RESPONSE']['CODE'])) $ret['RESPONSE']['CODE'] ='OK'; + $ret['PARSED'] = $parsed['EXT']; + break; + } + } + } + return $ret; + } + + + + + + + /** + * Send the LIST Command + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdList($mailbox_base, $mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + $mailbox_base=$this->_createQuotedString($mailbox_base); + return $this->_genericCommand('LIST', "$mailbox_base $mailbox_name" ); + } + + + + + + + /** + * Send the LSUB Command + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdLsub($mailbox_base, $mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + $mailbox_base=$this->_createQuotedString($mailbox_base); + return $this->_genericCommand('LSUB', "$mailbox_base $mailbox_name" ); + } + + + + + + + /** + * Send the APPEND Command + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdAppend($mailbox, $msg , $flags_list = '' ,$time = '') + { + if(!$this->_connected){ + return new PEAR_Error('not connected!'); + } + + + $cmdid=$this->_getCmdId(); + $msg_size=$this->_getLineLength($msg); + + $mailbox_name=$this->_createQuotedString($mailbox); + if($flags_list != '') { + $flags_list = " ($flags_list)"; + } + // TODO: + // Falta el codigo para que flags list y time hagan algo!! + if( $this->hasCapability( "LITERAL+" ) == true ){ + $param=sprintf("%s%s%s {%s+}\r\n%s",$mailbox_name,$flags_list,$time,$msg_size,$msg); + if (PEAR::isError($error = $this->_putCMD($cmdid , 'APPEND' , $param ) ) ) { + return $error; + } + }else{ + $param=sprintf("%s%s%s {%s}",$mailbox_name,$flags_list,$time,$msg_size); + if (PEAR::isError($error = $this->_putCMD($cmdid , 'APPEND' , $param ) ) ) { + return $error; + } + if (PEAR::isError($error = $this->_recvLn() ) ) { + return $error; + } + + if (PEAR::isError($error = $this->_send( $msg."\r\n" ) ) ) { + return $error; + } + } + + + $args=$this->_getRawResponse($cmdid); + $ret = $this->_genericImapResponseParser($args,$cmdid); + return $ret; + } + + + + /** + * Send the CLOSE command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdClose() + { + return $this->_genericCommand('CLOSE'); + } + + + + + + + /** + * Send the EXPUNGE command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdExpunge() + { + $ret=$this->_genericCommand('EXPUNGE'); + if (PEAR::isError($ret)) return new PEAR_Error('could not Expunge!'); + if(isset( $ret["PARSED"] ) ){ + $parsed=$ret["PARSED"]; + unset($ret["PARSED"]); + foreach($parsed as $command){ + if( strtoupper($command["COMMAND"]) == 'EXPUNGE' ){ + $ret["PARSED"][$command["COMMAND"]][]=$command["NRO"]; + }else{ + $ret["PARSED"][$command["COMMAND"]]=$command["NRO"]; + } + } + } + return $ret; + } + + + + + + + + /** + * Send the SEARCH command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + + function cmdSearch($search_cmd) + { + /* if($_charset != '' ) + $_charset = "[$_charset] "; + $param=sprintf("%s%s",$charset,$search_cmd); + */ + $ret = $this->_genericCommand('SEARCH', $search_cmd ); + if(isset( $ret["PARSED"] ) ){ + $ret["PARSED"]=$ret["PARSED"][0]["EXT"]; + } + return $ret; + } + + + /** + * Send the SORT command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.1 + */ + function cmdSort($sort_cmd) + { + /* + if ($_charset != '' ) + $_charset = "[$_charset] "; + $param = sprintf("%s%s",$charset,$search_cmd); + */ + $ret = $this->_genericCommand('SORT', $sort_cmd); + if (isset($ret['PARSED'])) { + $ret['PARSED'] = $ret['PARSED'][0]['EXT']; + } + return $ret; + } + + + /** + * Send the STORE command. + * + * @param string $message_set the sessage_set + * @param string $dataitem: the way we store the flags + * FLAGS: replace the flags whith $value + * FLAGS.SILENT: replace the flags whith $value but don't return untagged responses + * + * +FLAGS: Add the flags whith $value + * +FLAGS.SILENT: Add the flags whith $value but don't return untagged responses + * + * -FLAGS: Remove the flags whith $value + * -FLAGS.SILENT: Remove the flags whith $value but don't return untagged responses + * + * @param string $value + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + + function cmdStore($message_set, $dataitem, $value) + { + /* As said in RFC2060... + C: A003 STORE 2:4 +FLAGS (\Deleted) + S: * 2 FETCH FLAGS (\Deleted \Seen) + S: * 3 FETCH FLAGS (\Deleted) + S: * 4 FETCH FLAGS (\Deleted \Flagged \Seen) + S: A003 OK STORE completed + */ + if( $dataitem!="FLAGS" && $dataitem!="FLAGS.SILENT" && $dataitem!="+FLAGS" && + $dataitem!="+FLAGS.SILENT" && $dataitem!="-FLAGS" && $dataitem!="-FLAGS.SILENT" ){ + $this->_prot_error("dataitem '$dataitem' is invalid! see RFC2060!!!!" , __LINE__ , __FILE__ ); + } + $param=sprintf("%s %s (%s)",$message_set,$dataitem,$value); + return $this->_genericCommand('STORE', $param ); + } + + + + + + + + /** + * Send the COPY command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + + function cmdCopy($message_set, $mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + return $this->_genericCommand('COPY', sprintf("%s %s",$message_set,$mailbox_name) ); + } + + + + + + + + + + + + + + function cmdUidFetch($msgset, $fetchparam) + { + return $this->_genericCommand('UID FETCH', sprintf("%s %s",$msgset,$fetchparam) ); + } + + + + + + + + + function cmdUidCopy($message_set, $mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + return $this->_genericCommand('UID COPY', sprintf("%s %s",$message_set,$mailbox_name) ); + } + + + + + + + + + /** + * Send the UID STORE command. + * + * @param string $message_set the sessage_set + * @param string $dataitem: the way we store the flags + * FLAGS: replace the flags whith $value + * FLAGS.SILENT: replace the flags whith $value but don't return untagged responses + * + * +FLAGS: Add the flags whith $value + * +FLAGS.SILENT: Add the flags whith $value but don't return untagged responses + * + * -FLAGS: Remove the flags whith $value + * -FLAGS.SILENT: Remove the flags whith $value but don't return untagged responses + * + * @param string $value + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + + function cmdUidStore($message_set, $dataitem, $value) + { + /* As said in RFC2060... + C: A003 STORE 2:4 +FLAGS (\Deleted) + S: * 2 FETCH FLAGS (\Deleted \Seen) + S: * 3 FETCH FLAGS (\Deleted) + S: * 4 FETCH FLAGS (\Deleted \Flagged \Seen) + S: A003 OK STORE completed + */ + if( $dataitem!="FLAGS" && $dataitem!="FLAGS.SILENT" && $dataitem!="+FLAGS" && + $dataitem!="+FLAGS.SILENT" && $dataitem!="-FLAGS" && $dataitem!="-FLAGS.SILENT" ){ + $this->_prot_error("dataitem '$dataitem' is invalid! see RFC2060!!!!" , __LINE__ , __FILE__ ); + } + return $this->_genericCommand('UID STORE', sprintf("%s %s (%s)",$message_set,$dataitem,$value) ); + } + + + + + + + + + + + /** + * Send the SEARCH command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + + function cmdUidSearch($search_cmd) + { + $ret=$this->_genericCommand('UID SEARCH', sprintf("%s",$search_cmd) ); + if(isset( $ret["PARSED"] ) ){ + $ret["PARSED"]=$ret["PARSED"][0]["EXT"]; + } + return $ret; + } + + + /** + * Send the UID SORT command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.1 + */ + function cmdUidSort($sort_cmd) + { + $ret=$this->_genericCommand('UID SORT', sprintf("%s",$sort_cmd)); + if (isset($ret['PARSED'])) { + $ret["PARSED"]=$ret["PARSED"][0]["EXT"]; + } + return $ret; + } + + + /** + * Send the X command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + + function cmdX($atom, $parameters) + { + return $this->_genericCommand("X$atom", $parameters ); + } + + + + + + + + +/******************************************************************** +*** +*** HERE ENDS the RFC2060 IMAPS FUNCTIONS +*** AND BEGIN THE EXTENSIONS FUNCTIONS +*** +********************************************************************/ + + + + + + + +/******************************************************************** +*** RFC2087 IMAP4 QUOTA extension BEGINS HERE +********************************************************************/ + + + /** + * Send the GETQUOTA command. + * + * @param string $mailbox_name the mailbox name to query for quota data + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or quota data on success + * @access public + * @since 1.0 + */ + + function cmdGetQuota($mailbox_name) + { + + + //Check if the IMAP server has QUOTA support + if( ! $this->hasQuotaSupport() ){ + return new PEAR_Error("This IMAP server does not support QUOTA's! "); + } + $mailbox_name=sprintf("%s",$this->utf_7_encode($mailbox_name) ); + $ret = $this->_genericCommand('GETQUOTA', $mailbox_name ); + if(!is_object($ret) && isset( $ret["PARSED"] ) ){ + // remove the array index because the quota response returns only 1 line of output + $ret['PARSED']=$ret["PARSED"][0]; + } + return $ret; + } + + + /** + * Send the GETQUOTAROOT command. + * + * @param string $mailbox_name the mailbox name to query for quota data + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or quota data on success + * @access public + * @since 1.0 + */ + + function cmdGetQuotaRoot($mailbox_name) + { + //Check if the IMAP server has QUOTA support + if( ! $this->hasQuotaSupport() ){ + return new PEAR_Error("This IMAP server does not support QUOTA's! "); + } + $mailbox_name=sprintf("%s",$this->utf_7_encode($mailbox_name) ); + $ret = $this->_genericCommand('GETQUOTAROOT', $mailbox_name ); + + if(!is_object($ret) && isset( $ret["PARSED"] ) ){ + // remove the array index because the quota response returns only 1 line of output + $ret['PARSED']=$ret["PARSED"][1]; + } + return $ret; + } + + + + + /** + * Send the SETQUOTA command. + * + * @param string $mailbox_name the mailbox name to query for quota data + * @param string $storageQuota sets the max number of bytes this mailbox can handle + * @param string $messagesQuota sets the max number of messages this mailbox can handle + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or quota data on success + * @access public + * @since 1.0 + */ +// TODO: implement the quota by number of emails!! + function cmdSetQuota($mailbox_name, $storageQuota = null ,$messagesQuota = null ) + { + //Check if the IMAP server has QUOTA support + if( ! $this->hasQuotaSupport() ){ + return new PEAR_Error("This IMAP server does not support QUOTA's! "); + } + + if( ($messagesQuota == null) && ( $storageQuota == null) ){ + return new PEAR_Error('$storageQuota and $messagesQuota parameters can\'t be both null if you want to use quota'); + } + $mailbox_name=$this->_createQuotedString($mailbox_name); + //Make the command request + $param=sprintf("%s (",$mailbox_name); + if($storageQuota != null ){ + if ($storageQuota == -1) { + // set -1 to remove a quota + $param = sprintf("%s", $param); + } elseif ($storageQuota == strtolower('remove')) { + // this is a cyrus rmquota specific feature + // see http://email.uoa.gr/projects/cyrus/quota-patches/rmquota/ + $param = sprintf("%sREMOVE 1", $param); + } else { + $param = sprintf("%sSTORAGE %s", $param, $storageQuota); + } + if( $messagesQuota != null ){ + //if we have both types of quota on the same call we must append an space between + // those parameters + $param=sprintf("%s ",$param); + } + } + if($messagesQuota != null ){ + $param=sprintf("%sMESSAGES %s",$param,$messagesQuota); + + } + $param=sprintf("%s)",$param); + + return $this->_genericCommand('SETQUOTA', $param ); + } + + + + /** + * Send the SETQUOTAROOT command. + * + * @param string $mailbox_name the mailbox name to query for quota data + * @param string $storageQuota sets the max number of bytes this mailbox can handle + * @param string $messagesQuota sets the max number of messages this mailbox can handle + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or quota data on success + * @access public + * @since 1.0 + */ + function cmdSetQuotaRoot($mailbox_name, $storageQuota = null ,$messagesQuota = null) + { + //Check if the IMAP server has QUOTA support + if( ! $this->hasQuotaSupport() ){ + return new PEAR_Error("This IMAP server does not support QUOTA's! "); + } + + if( ($messagesQuota == null) && ( $storageQuota == null) ){ + return new PEAR_Error('$storageQuota and $messagesQuota parameters can\'t be both null if you want to use quota'); + } + $mailbox_name=$this->_createQuotedString($mailbox_name); + //Make the command request + $param=sprintf("%s (",$mailbox_name); + if($storageQuota != null ){ + $param=sprintf("%sSTORAGE %s",$param,$storageQuota); + if( $messagesQuota != null ){ + //if we have both types of quota on the same call we must append an space between + // those parameters + $param=sprintf("%s ",$param); + } + } + if($messagesQuota != null ){ + $param=sprintf("%sMESSAGES %s",$param,$messagesQuota); + + } + $param=sprintf("%s)",$param); + + return $this->_genericCommand('SETQUOTAROOT', $param ); + } + + + +/******************************************************************** +*** RFC2087 IMAP4 QUOTA extension ENDS HERE +********************************************************************/ + + + + + + +/******************************************************************** +*** RFC2086 IMAP4 ACL extension BEGINS HERE +********************************************************************/ + + + + + function cmdSetACL($mailbox_name, $user, $acl) + { + + //Check if the IMAP server has ACL support + if( ! $this->hasAclSupport() ){ + return new PEAR_Error("This IMAP server does not support ACL's! "); + } + $mailbox_name=$this->_createQuotedString($mailbox_name); + $user_name=$this->_createQuotedString($user); + if(is_array($acl)){ + $acl=implode('',$acl); + } + return $this->_genericCommand('SETACL', sprintf("%s %s \"%s\"",$mailbox_name,$user_name,$acl) ); + } + + + + + + + function cmdDeleteACL($mailbox_name, $user) + { + //Check if the IMAP server has ACL support + if( ! $this->hasAclSupport() ){ + return new PEAR_Error("This IMAP server does not support ACL's! "); + } + $mailbox_name=$this->_createQuotedString($mailbox_name); + + return $this->_genericCommand('DELETEACL', sprintf("%s \"%s\"",$mailbox_name,$user) ); + } + + + + + + + + + + function cmdGetACL($mailbox_name) + { + //Check if the IMAP server has ACL support + if( ! $this->hasAclSupport() ){ + return new PEAR_Error("This IMAP server does not support ACL's! "); + } + $mailbox_name=$this->_createQuotedString($mailbox_name); + $ret = $this->_genericCommand('GETACL', sprintf("%s",$mailbox_name) ); + if(isset( $ret["PARSED"] ) ){ + $ret['PARSED']=$ret["PARSED"][0]["EXT"]; + + } + return $ret; + } + + + + + + + + function cmdListRights($mailbox_name, $user) + { + //Check if the IMAP server has ACL support + if( ! $this->hasAclSupport() ){ + return new PEAR_Error("This IMAP server does not support ACL's! "); + } + $mailbox_name=$this->_createQuotedString($mailbox_name); + $ret = $this->_genericCommand('LISTRIGHTS', sprintf("%s \"%s\"",$mailbox_name,$user) ); + if(isset( $ret["PARSED"] ) ){ + $ret["PARSED"]=$ret["PARSED"][0]["EXT"]; + } + return $ret; + } + + + + + + + + + + function cmdMyRights($mailbox_name) + { + //Check if the IMAP server has ACL support + if( ! $this->hasAclSupport() ){ + return new PEAR_Error("This IMAP server does not support ACL's! "); + } + $mailbox_name=$this->_createQuotedString($mailbox_name); + $ret = $this->_genericCommand('MYRIGHTS', sprintf("%s",$mailbox_name) ); + if(isset( $ret["PARSED"] ) ){ + $ret["PARSED"]=$ret["PARSED"][0]["EXT"]; + } + return $ret; + } + + +/******************************************************************** +*** RFC2086 IMAP4 ACL extension ENDs HERE +********************************************************************/ + + + + + + + + + + + + +/******************************************************************************* +*** draft-daboo-imap-annotatemore-05 IMAP4 ANNOTATEMORE extension BEGINS HERE +********************************************************************************/ + + + + function cmdSetAnnotation($mailbox_name, $entry, $values) + { + // Check if the IMAP server has ANNOTATEMORE support + if(!$this->hasAnnotateMoreSupport()) { + return new PEAR_Error('This IMAP server does not support the ANNOTATEMORE extension!'); + } + if (!is_array($values)) { + return new PEAR_Error('Invalid $values argument passed to cmdSetAnnotation'); + } + + $vallist = ''; + foreach ($values as $name => $value) { + $vallist .= "\"$name\" \"$value\" "; + } + $vallist = rtrim($vallist); + + return $this->_genericCommand('SETANNOTATION', sprintf('"%s" "%s" (%s)', $mailbox_name, $entry, $vallist)); + } + + + + + + + + + + + + + + function cmdDeleteAnnotation($mailbox_name, $entry, $values) + { + // Check if the IMAP server has ANNOTATEMORE support + if(!$this->hasAnnotateMoreSupport()) { + return new PEAR_Error('This IMAP server does not support the ANNOTATEMORE extension!'); + } + if (!is_array($values)) { + return new PEAR_Error('Invalid $values argument passed to cmdDeleteAnnotation'); + } + + $vallist = ''; + foreach ($values as $name) { + $vallist .= "\"$name\" NIL "; + } + $vallist = rtrim($vallist); + + return $this->_genericCommand('SETANNOTATION', sprintf('"%s" "%s" (%s)', $mailbox_name, $entry, $vallist)); + } + + + + + + + + + + + + + function cmdGetAnnotation($mailbox_name, $entries, $values) + { + // Check if the IMAP server has ANNOTATEMORE support + if(!$this->hasAnnotateMoreSupport()) { + return new PEAR_Error('This IMAP server does not support the ANNOTATEMORE extension!'); + } + + $entlist = ''; + + if (!is_array($entries)) { + $entries = array($entries); + } + + foreach ($entries as $name) { + $entlist .= "\"$name\" "; + } + $entlist = rtrim($entlist); + if (count($entries) > 1) { + $entlist = "($entlist)"; + } + + + + $vallist = ''; + if (!is_array($values)) { + $values = array($values); + } + + foreach ($values as $name) { + $vallist .= "\"$name\" "; + } + $vallist = rtrim($vallist); + if (count($values) > 1) { + $vallist = "($vallist)"; + } + + return $this->_genericCommand('GETANNOTATION', sprintf('"%s" %s %s', $mailbox_name, $entlist, $vallist)); + } + + +/***************************************************************************** +*** draft-daboo-imap-annotatemore-05 IMAP4 ANNOTATEMORE extension ENDs HERE +******************************************************************************/ + + + + + + + +/******************************************************************** +*** +*** HERE ENDS THE EXTENSIONS FUNCTIONS +*** AND BEGIN THE AUXILIARY FUNCTIONS +*** +********************************************************************/ + + + + + + /** + * tell if the server has capability $capability + * + * @return true or false + * + * @access public + * @since 1.0 + */ + function getServerAuthMethods() + { + if( $this->_serverAuthMethods == null ){ + $this->cmdCapability(); + return $this->_serverAuthMethods; + } + return false; + } + + + + + + + + /** + * tell if the server has capability $capability + * + * @return true or false + * + * @access public + * @since 1.0 + */ + function hasCapability($capability) + { + if( $this->_serverSupportedCapabilities == null ){ + $this->cmdCapability(); + } + if($this->_serverSupportedCapabilities != null ){ + if( in_array( $capability , $this->_serverSupportedCapabilities ) ){ + return true; + } + } + return false; + } + + + + /** + * tell if the server has Quota support + * + * @return true or false + * + * @access public + * @since 1.0 + */ + function hasQuotaSupport() + { + return $this->hasCapability('QUOTA'); + } + + + + + + /** + * tell if the server has Quota support + * + * @return true or false + * + * @access public + * @since 1.0 + */ + function hasAclSupport() + { + return $this->hasCapability('ACL'); + } + + + + + + /** + * tell if the server has support for the ANNOTATEMORE extension + * + * @return true or false + * + * @access public + * @since 1.0 + */ + function hasAnnotateMoreSupport() + { + return $this->hasCapability('ANNOTATEMORE'); + } + + + + function _createQuotedString($mailbox) + { + $search = array('\\', '"'); + $replace = array('\\\\', '\\"'); + + $mailbox_name = str_replace($search, $replace, $mailbox); + $mailbox_name=sprintf("\"%s\"",$this->utf_7_encode($mailbox_name) ); + + return $mailbox_name; + } + + + + + + + /** + * Parses the responses like RFC822.SIZE and INTERNALDATE + * + * @param string the IMAP's server response + * + * @return string containing the parsed response + * @access private + * @since 1.0 + */ + + function _parseOneStringResponse(&$str, $line,$file) + { + $this->_parseSpace($str , $line , $file ); + $size = $this->_getNextToken($str,$uid); + return $uid; + } + + + /** + * Parses the FLAG response + * + * @param string the IMAP's server response + * + * @return Array containing the parsed response + * @access private + * @since 1.0 + */ + function _parseFLAGSresponse(&$str) + { + $this->_parseSpace($str , __LINE__ , __FILE__ ); + $params_arr[] = $this->_arrayfy_content($str); + $flags_arr=array(); + for( $i = 0 ; $i < count($params_arr[0]) ; $i++ ){ + $flags_arr[] = $params_arr[0][$i]; + } + return $flags_arr; + } + + + + + + /** + * Parses the BODY response + * + * @param string the IMAP's server response + * + * @return Array containing the parsed response + * @access private + * @since 1.0 + */ + + function _parseBodyResponse(&$str, $command) + { + $this->_parseSpace($str , __LINE__ , __FILE__ ); + while($str[0] != ')' && $str!=''){ + $params_arr[] = $this->_arrayfy_content($str); + } + + return $params_arr; + } + + + + + + + /** + * Makes the content an Array + * + * @param string the IMAP's server response + * + * @return Array containing the parsed response + * @access private + * @since 1.0 + */ + function _arrayfy_content(&$str) + { + $params_arr=array(); + $this->_getNextToken($str,$params); + if($params != '(' ){ + return $params; + } + $this->_getNextToken($str,$params,false,false); + while ( $str != '' && $params != ')'){ + if($params != '' ){ + if($params[0] == '(' ){ + $params=$this->_arrayfy_content( $params ); + } + if($params != ' ' ){ + //I don't remove the colons (") to handle the case of retriving " " + // If I remove the colons the parser will interpret this field as an imap separator (space) + // instead of a valid field so I remove the colons here + if($params=='""'){ + $params=''; + }else{ + if($params[0]=='"'){ + $params=$this->_getSubstr($params,1,$this->_getLineLength($params)-2); + } + } + $params_arr[]=$params; + } + }else{ + //if params if empty (for example i'm parsing 2 quotes ("") + // I'll append an array entry to mantain compatibility + $params_arr[]=$params; + } + $this->_getNextToken($str,$params,false,false); + } + $this->arrayfy_content_level--; + return $params_arr; + } + + + + + /** + * Parses the BODY[],BODY[TEXT],.... responses + * + * @param string the IMAP's server response + * + * @return Array containing the parsed response + * @access private + * @since 1.0 + */ + function _parseContentresponse(&$str, $command) + { + $content = ''; + $this->_parseSpace($str , __LINE__ , __FILE__ ); + $size =$this->_getNextToken($str,$content); + return array( "CONTENT"=> $content , "CONTENT_SIZE" =>$size ); + } + + + + + + + + + /** + * Parses the ENVELOPE response + * + * @param string the IMAP's server response + * + * @return Array containing the parsed response + * @access private + * @since 1.0 + */ + function _parseENVELOPEresponse(&$str) + { + $content = ''; + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + $this->_getNextToken($str,$parenthesis); + if( $parenthesis != '(' ){ + $this->_prot_error("must be a '(' but is a '$parenthesis' !!!!" , __LINE__ , __FILE__ ); + } + // Get the email's Date + $this->_getNextToken($str,$date); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + // Get the email's Subject: + $this->_getNextToken($str,$subject); + //$subject=$this->decode($subject); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + //FROM LIST; + $from_arr = $this->_getAddressList($str); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + //"SENDER LIST\n"; + $sender_arr = $this->_getAddressList($str); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + //"REPLY-TO LIST\n"; + $reply_to_arr=$this->_getAddressList($str); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + //"TO LIST\n"; + $to_arr = $this->_getAddressList($str); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + //"CC LIST\n"; + $cc_arr = $this->_getAddressList($str); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + //"BCC LIST|$str|\n"; + $bcc_arr = $this->_getAddressList($str); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + $this->_getNextToken($str,$in_reply_to); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + $this->_getNextToken($str,$message_id); + + $this->_getNextToken($str,$parenthesis); + + if( $parenthesis != ')' ){ + $this->_prot_error("must be a ')' but is a '$parenthesis' !!!!" , __LINE__ , __FILE__ ); + } + + return array( "DATE"=> $date , "SUBJECT" => $subject,"FROM" => $from_arr, + "SENDER" => $sender_arr , "REPLY_TO" => $reply_to_arr, "TO" => $to_arr, + "CC" =>$cc_arr, "BCC"=> $bcc_arr, "IN_REPLY_TO" =>$in_reply_to, "MESSAGE_ID"=>$message_id ); + } + + + + + + /** + * Parses the ARRDLIST as defined in RFC + * + * @param string the IMAP's server response + * + * @return Array containing the parsed response + * @access private + * @since 1.0 + */ + function _getAddressList(&$str) + { + $params_arr = $this->_arrayfy_content($str); + if( !isset( $params_arr ) ){ + return $params_arr; + } + + if( is_array($params_arr) ){ + foreach ($params_arr as $index => $address_arr) { + $personal_name = $address_arr[0]; + $at_domain_list = $address_arr[1]; + $mailbox_name = $address_arr[2]; + $host_name = $address_arr[3]; + if( $mailbox_name!='' && $host_name!='' ){ + $email=$mailbox_name . "@" . $host_name; + }else{ + $email=false; + } + if($email==false){ + $rfc822_email=false; + }else{ + if(!isset($personal_name)){ + $rfc822_email= "<". $email . ">"; + }else{ + $rfc822_email= "\"". $personal_name ."\" <". $email . ">"; + } + } + $email_arr[] = array ( "PERSONAL_NAME"=> $personal_name , "AT_DOMAIN_LIST"=>$at_domain_list , + "MAILBOX_NAME"=> $this->utf_7_decode($mailbox_name), "HOST_NAME"=> $host_name, + "EMAIL"=>$email , "RFC822_EMAIL" => $rfc822_email ); + } + return $email_arr; + } + + return array(); + } + + + + + + + + /** + * Utility funcion to find the closing parenthesis ")" Position it takes care of quoted ones + * + * @param string the IMAP's server response + * + * @return int containing the pos of the closing parenthesis ")" + * @access private + * @since 1.0 + */ + function _getClosingBracesPos($str_line, $startDelim ='(', $stopDelim = ')' ) + { + $len = $this->_getLineLength( $str_line ); + $pos = 0; + // ignore all extra characters + // If inside of a string, skip string -- Boundary IDs and other + // things can have ) in them. + if ( $str_line[$pos] != $startDelim ) { + $this->_prot_error("_getClosingParenthesisPos: must start with a '".$startDelim."' but is a '". $str_line[$pos] ."'!!!!\n" . + "STR_LINE:$str_line|size:$len|POS: $pos\n" , __LINE__ , __FILE__ ); + return( $len ); + } + for( $pos = 1 ; $pos < $len ; $pos++ ){ + if ($str_line[$pos] == $stopDelim ) { + break; + } + if ($str_line[$pos] == '"') { + $this->_advanceOverStr($str_line,$pos,$len,$startDelim,$stopDelim); + } + if ( $str_line[$pos] == $startDelim ) { + #$str_line_aux = substr( $str_line , $pos ); + $str_line_aux = $this->_getSubstr( $str_line , $pos ); + $pos_aux = $this->_getClosingBracesPos( $str_line_aux ); + $pos+=$pos_aux; + if ($pos == $len-1) break; + } + } + if( $str_line[$pos] != $stopDelim ){ + $this->_prot_error("_getClosingBracesPos: must be a $stopDelim but is a '". $str_line[$pos] ."'|POS:$pos|STR_LINE:$str_line!!!!" , __LINE__ , __FILE__ ); + } + + if( $pos >= $len ) + return false; + return $pos; + } + + + /** + * Advances the position $pos in $str over an correcty escaped string + * + * Examples: $str='"\\\"First Last\\\""', $pos=0 + * --> returns true and $pos=strlen($str)-1 + * + * @param string $str + * @param int &$pos current position in $str pointing to a double quote ("), on return pointing on the closing double quote + * @param int $len length of $str in bytes(!) + * @return boolean true if we advanced over a correct string, false otherwise + */ + function _advanceOverStr($str,&$pos,$len,$startDelim ='(', $stopDelim = ')' ) + { + #error_log(__METHOD__. $len . "#".$str."\n"); + $startingpos = $pos; + if ($str[$pos] !== '"') return false; // start condition failed + $pos++; + $delimCount=0; + while($str[$pos] !== '"' && $pos < $len) { + // this is a fix to stop before the delimiter, in broken string messages containing an odd number of double quotes + // the idea is to check for a stopDelimited followed by eiter a new startDelimiter or an other stopDelimiter + // that allows to have something like '"Name (Nick)" ' containing one delimiter + // if you have something like "Name ((something))" we must count the delimiters (and hope that they are not unbalanced too) + // and check if we have a negative amount of delimiters or no delimiters to meet the stop condition, before we run into a closing double quote + if ($str[$pos] === $startDelim) $delimCount++; + if ($str[$pos] === $stopDelim) $delimCount--; + if ($str[$pos] === $stopDelim && ($str[$pos+1] === $startDelim || ($str[$pos+1] === $stopDelim && $delimCount<=0))) { + $encoding =mb_internal_encoding(); + //if (mb_check_encoding($str)) { + // error_log(__METHOD__.' Encoding used:'.mb_internal_encoding().' Detected:'.mb_detect_encoding($str)); + // $encoding = mb_detect_encoding($str); + //} + // beware as mb_substr_count does not support the offset parameter. + $numOfQuotes = substr_count(substr($str,$startingpos),'"'); + $numOfMaskedQuotes = substr_count(substr($str,$startingpos),'\"'); + if ((($numOfQuotes - $numOfMaskedQuotes) % 2 ) == 0) { + // quotes are balanced, so its unlikely that we meet a stop condition here as strings may contain )( + //error_log(__METHOD__. "->Length: $len; NumOfQuotes: $numOfQuotes - NumofMaskedQuotes:$numOfMaskedQuotes #".$str."\n"); + error_log(__METHOD__." problem at $pos with:".$str[$pos]."(last character) Numberof delimiters ('".$startDelim."','".$stopDelim."') found:".$delimCount.' String:'.substr($str,$startingpos,$pos).' called from:'.function_backtrace()); + //return false; + } else { + $pos--; // stopDelimited need to be parsed outside! + return false; + } + } + if ($str[$pos] === '\\') $pos++; // all escaped chars are overread (eg. \\, \", \x) + $pos++; + } + return $pos < $len && $str[$pos] === '"'; + } + + + + + /** + * Utility funcion to get from here to the end of the line + * + * @param string the IMAP's server response + * + * @return string containing the string to the end of the line + * @access private + * @since 1.0 + */ + + function _getToEOL(&$str , $including = true) + { + $len = $this->_getLineLength( $str ); + if( $including ){ + for($i=0;$i<$len;$i++){ + if( $str[$i] =="\n" ) + break; + } + $content=$this->_getSubstr($str,0,$i + 1); + $str=$this->_getSubstr($str,$i + 1); + return $content; + + }else{ + for( $i = 0 ; $i < $len ; $i++ ){ + if( $str[$i] =="\n" || $str[$i] == "\r") + break; + } + $content = $this->_getSubstr( $str ,0 , $i ); + $str = $this->_getSubstr( $str , $i ); + return $content; + } + } + + + + + /** + * Fetches the next IMAP token or parenthesis + * + * @param string the IMAP's server response + * @param string the next token + * @param boolean true: the parenthesis IS a token, false: I consider + * all the response in parenthesis as a token + * + * @return int containing the content size + * @access private + * @since 1.0 + */ + + + function _getNextToken(&$str, &$content, $parenthesisIsToken=true,$colonIsToken=true){ + $len = $this->_getLineLength($str); + $pos = 0; + $content_size = false; + $content = false; + if($str == '' || $len < 2 ){ + $content=$str; + return $len; + } + switch( $str[0] ){ + case '{': + if( ($posClosingBraces = $this->_getClosingBracesPos($str, '{' , '}' )) == false ){ + $this->_prot_error("_getClosingBracesPos() error!!!" , __LINE__ , __FILE__ ); + } + if(! is_numeric( ( $strBytes = $this->_getSubstr( $str , 1 , $posClosingBraces - 1) ) ) ){ + $this->_prot_error("must be a number but is a '" . $strBytes ."'!!!!" , __LINE__ , __FILE__ ); + } + if( $str[$posClosingBraces] != '}' ){ + $this->_prot_error("must be a '}' but is a '" . $str[$posClosingBraces] ."'!!!!" , __LINE__ , __FILE__ ); + } + if( $str[$posClosingBraces + 1] != "\r" ){ + $this->_prot_error("must be a '\\r' but is a '" . $str[$posClosingBraces + 1] ."'!!!!" , __LINE__ , __FILE__ ); + } + if( $str[$posClosingBraces + 2] != "\n" ){ + $this->_prot_error("must be a '\\n' but is a '" . $str[$posClosingBraces + 2] ."'!!!!" , __LINE__ , __FILE__ ); + } + $content = $this->_getSubstr( $str , $posClosingBraces + 3 , $strBytes ); + if( $this->_getLineLength( $content ) != $strBytes ){ + $this->_prot_error("content size is ". $this->_getLineLength($content) . " but the string reports a size of $strBytes!!!\n" , __LINE__ , __FILE__ ); + } + $content_size = $strBytes; + //Advance the string + $str = $this->_getSubstr( $str , $posClosingBraces + $strBytes + 3 ); + break; + case '"': + if($colonIsToken){ + for($pos=1;$pos<$len;$pos++){ + if ( $str[$pos] == "\"" ) { + break; + } + if ($str[$pos] == "\\" && $str[$pos + 1 ] == "\"" ) + $pos++; + if ($str[$pos] == "\\" && $str[$pos + 1 ] == "\\" ) + $pos++; + } + if($str[$pos] != '"' ){ + $this->_prot_error("must be a '\"' but is a '" . $str[$pos] ."'!!!!" , __LINE__ , __FILE__ ); + } + $content_size = $pos; + $content = $this->_getSubstr( $str , 1 , $pos - 1 ); + //Advance the string + $str = $this->_getSubstr( $str , $pos + 1 ); + }else{ + for($pos=1;$pos<$len;$pos++){ + if ( $str[$pos] == "\"" ) { + break; + } + if ($str[$pos] == "\\" && $str[$pos + 1 ] == "\"" ) + $pos++; + if ($str[$pos] == "\\" && $str[$pos + 1 ] == "\\" ) + $pos++; + } + if($str[$pos] != '"' ){ + $this->_prot_error("must be a '\"' but is a '" . $str[$pos] ."'!!!!" , __LINE__ , __FILE__ ); + } + $content_size = $pos; + $content = $this->_getSubstr( $str , 0 , $pos + 1 ); + //Advance the string + $str = $this->_getSubstr( $str , $pos + 1 ); + + } + # we need to strip slashes for a quoted string + $content = stripslashes($content); + break; + + case "\r": + $pos = 1; + if( $str[1] == "\n") + $pos++; + $content_size = $pos; + $content = $this->_getSubstr( $str , 0 , $pos ); + $str = $this->_getSubstr( $str , $pos ); + break; + case "\n": + $pos = 1; + $content_size = $pos; + $content = $this->_getSubstr( $str , 0 , $pos ); + $str = $this->_getSubstr( $str , $pos ); + break; + case '(': + if( $parenthesisIsToken == false ){ + $pos = $this->_getClosingBracesPos( $str ); + $content_size = $pos + 1; + $content = $this->_getSubstr( $str , 0 , $pos + 1 ); + $str = $this->_getSubstr( $str , $pos + 1 ); + }else{ + $pos = 1; + $content_size = $pos; + $content = $this->_getSubstr( $str , 0 , $pos ); + $str = $this->_getSubstr( $str , $pos ); + } + break; + case ')': + $pos = 1; + $content_size = $pos; + $content = $this->_getSubstr( $str , 0 , $pos ); + $str = $this->_getSubstr( $str , $pos ); + break; + case ' ': + $pos = 1; + $content_size = $pos; + $content = $this->_getSubstr( $str , 0 , $pos ); + $str = $this->_getSubstr( $str , $pos ); + break; + default: + for( $pos = 0 ; $pos < $len ; $pos++ ){ + if($this->_getSubstr( $str , 0 , 5 ) == 'BODY[' || $this->_getSubstr( $str , 0 , 5 ) == 'BODY.') { + if($str[$pos] == ']') { + $pos++; + break; + } + } elseif ( $str[$pos] == ' ' || $str[$pos] == "\r" || $str[$pos] == ')' || $str[$pos] == '(' || $str[$pos] == "\n" ) { + break; + } + if ( $str[$pos] == "\\" && $str[$pos + 1 ] == ' ' ) + $pos++; + if ( $str[$pos] == "\\" && $str[$pos + 1 ] == "\\" ) + $pos++; + } + //Advance the string + if( $pos == 0 ){ + $content_size = 1; + $content = $this->_getSubstr( $str , 0 , 1 ); + $str = $this->_getSubstr( $str , 1 ); + }else{ + $content_size = $pos; + $content = $this->_getSubstr( $str , 0 , $pos ); + if($pos < $len){ + $str = $this->_getSubstr( $str , $pos ); + }else{ + //if this is the end of the string... exit the switch + break; + } + + + } + break; + } + #error_log("egw-pear::NET::IMAPProtocoll:_getNextToken:".$str); + return $content_size; + } + + + + + + // ToDo: all real errors should be returned as PEAR error, others hidden by default + // NO extra output from this class! + /** + * Utility funcion to display to console the protocol errors + * printErrors() additionally has to be set to true + * + * @param string $str the error message + * @param int $line the line producing the error + * @param string $file file where the error was produced + * + * @return nothing + * @access private + * @since 1.0 + */ + function _prot_error($str , $line , $file, $printError = true) + { + if ($this->_printErrors && $printError) { + echo "$line,$file,PROTOCOL ERROR!:$str\n"; + } + } + + + + + function _getEXTarray(&$str , $startDelim = '(' , $stopDelim = ')'){ + /* I let choose the $startDelim and $stopDelim to allow parsing + the OK response so I also can parse a response like this + * OK [UIDNEXT 150] Predicted next UID + */ + $this->_getNextToken( $str , $parenthesis ); + if( $parenthesis != $startDelim ){ + $this->_prot_error("must be a '$startDelim' but is a '$parenthesis' !!!!" , __LINE__ , __FILE__ ); + } + $parenthesis = ''; + $struct_arr = array(); + while( $parenthesis != $stopDelim && $str != '' ){ + // The command + $this->_getNextToken( $str , $token ); + $token = strtoupper( $token ); + + if( ( $ret = $this->_retrParsedResponse( $str , $token ) ) != false ){ + //$struct_arr[$token] = $ret; + $struct_arr=array_merge($struct_arr, $ret); + } + + $parenthesis=$token; + + }//While + + if( $parenthesis != $stopDelim ){ + $this->_prot_error("1_must be a '$stopDelim' but is a '$parenthesis' !!!!" , __LINE__ , __FILE__ ); + } + return $struct_arr; + } + + + + + + function _retrParsedResponse( &$str , $token, $previousToken = null) + { + + //echo "\n\nTOKEN:$token\r\n"; + $token = strtoupper($token); + switch( $token ){ + case "RFC822.SIZE" : + return array($token=>$this->_parseOneStringResponse( $str,__LINE__ , __FILE__ )); + break; +// case "RFC822.TEXT" : + +// case "RFC822.HEADER" : + + + case "RFC822" : + return array($token=>$this->_parseContentresponse( $str , $token )); + break; + case "FLAGS" : + + case "PERMANENTFLAGS" : + return array($token=>$this->_parseFLAGSresponse( $str )); + break; + + case "ENVELOPE" : + return array($token=>$this->_parseENVELOPEresponse( $str )); + break; + case "EXPUNGE" : + return false; + break; + + case 'NOMODSEQ': + // ToDo: implement RFC 4551 + return array($token=>''); + break; + + case "UID" : + + case "UIDNEXT" : + + case "UIDVALIDITY" : + + case "UNSEEN" : + + case "MESSAGES" : + + case "UIDNEXT" : + + case "UIDVALIDITY" : + + case "UNSEEN" : + + case "INTERNALDATE" : + return array($token=>$this->_parseOneStringResponse( $str,__LINE__ , __FILE__ )); + break; + case "BODY" : + + case "BODYSTRUCTURE" : + return array($token=>$this->_parseBodyResponse( $str , $token )); + break; + case "RECENT" : + if( $previousToken != null ){ + $aux["RECENT"]=$previousToken; + return $aux; + }else{ + return array($token=>$this->_parseOneStringResponse( $str,__LINE__ , __FILE__ )); + } + break; + + case "EXISTS" : + return array($token=>$previousToken); + break; + case "READ-WRITE" : + + case "READ-ONLY" : + return array($token=>$token); + break; + case "QUOTA" : + /* + A tipical GETQUOTA DIALOG IS AS FOLLOWS + + C: A0004 GETQUOTA user.damian + S: * QUOTA user.damian (STORAGE 1781460 4000000) + S: A0004 OK Completed + + another example of QUOTA response from GETQUOTAROOT: + C: A0008 GETQUOTAROOT INBOX + S: * QUOTAROOT INBOX "" + S: * QUOTA "" (STORAGE 0 1024000 MESSAGE 0 40000) + S: A0008 OK GETQUOTAROOT finished. + + RFC 2087 section 5.1 says the list could be empty: + + C: A0004 GETQUOTA user.damian + S: * QUOTA user.damian () + S: A0004 OK Completed + + quota_list ::= "(" #quota_resource ")" + quota_resource ::= atom SP number SP number + quota_response ::= "QUOTA" SP astring SP quota_list + */ + $mailbox = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + $ret_aux = array('MAILBOX'=>$this->utf_7_decode($mailbox)); + + // courier fix + if ($str[0].$str[1] == "\r\n") { + return array($token => $ret_aux); + } + // end courier fix + + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_parseString( $str , '(' , __LINE__ , __FILE__ ); + + // fetching quota resources ( BNF ::= #quota_resource but spce separated instead of comma) + $this->_getNextToken($str, $quota_resp ); + while ($quota_resp != ')') { + if (($ext = $this->_retrParsedResponse($str, $quota_resp)) == false) { + $this->_prot_error("bogus response!!!!" , __LINE__ , __FILE__ ); + } + $ret_aux=array_merge($ret_aux,$ext); + + $this->_getNextToken($str, $quota_resp); + if ($quota_resp == ' ') { + $this->_getNextToken($str, $quota_resp); + } + } + + // if empty list, apparently no STORAGE or MESSAGE quota set + return array($token=>$ret_aux); + break; + + case "QUOTAROOT" : + /* + A tipical GETQUOTA DIALOG IS AS FOLLOWS + + C: A0004 GETQUOTA user.damian + S: * QUOTA user.damian (STORAGE 1781460 4000000) + S: A0004 OK Completed + */ + $mailbox = $this->utf_7_decode($this->_parseOneStringResponse( $str,__LINE__ , __FILE__ )); + + $str_line = rtrim( substr( $this->_getToEOL( $str , false ) , 0 ) ); + if(empty($str_line)) { + $ret = @array( "MAILBOX"=>$this->utf_7_decode($mailbox)); + } else { + $quotaroot = $this->_parseOneStringResponse( $str_line,__LINE__ , __FILE__ ); + $ret = @array( "MAILBOX"=>$this->utf_7_decode($mailbox) , $token=>$quotaroot ); + } + return array($token=>$ret); + break; + case "STORAGE" : + $used = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + $qmax = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + return array($token=>array("USED"=> $used, "QMAX" => $qmax)); + break; + case "MESSAGE" : + $mused = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + $mmax = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + return array($token=>array("MUSED"=> $mused, "MMAX" => $mmax)); + break; + case "LEVEL" : + $lused = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + $lmax = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + return array($token=>array("LUSED"=> $lused, "LMAX" => $lmax)); + break; + case "MAILBOX" : + $mbused = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + $mbmax = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + return array(); //throw away this information as this info seems quite useless with a QUOTA Response, AND we use the KEYWORD otherwise + break; + case "EXPIRATION" : + $expused = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + $expmax = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + return array(); //throw away this information as this info seems quite useless + break; + case "FETCH" : + $this->_parseSpace( $str ,__LINE__ ,__FILE__ ); + // Get the parsed pathenthesis + $struct_arr = $this->_getEXTarray( $str ); + return $struct_arr; + break; + case "NAMESPACE" : + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken($str , $personal, false); + $struct_arr['NAMESPACES']['personal'] = $this->_arrayfy_content($personal); + + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken($str , $others, false); + $struct_arr['NAMESPACES']['others'] = $this->_arrayfy_content($others); + + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken($str , $shared, false); + $struct_arr['NAMESPACES']['shared'] = $this->_arrayfy_content($shared); + + return array($token=>$struct_arr); + break; + case "CAPABILITY" : + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $str_line = rtrim( substr( $this->_getToEOL( $str , false ) , 0 ) ); + $struct_arr["CAPABILITIES"] = explode( ' ' , $str_line ); + return array($token=>$struct_arr); + break; + case "STATUS" : + $mailbox = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $ext = $this->_getEXTarray( $str ); + $struct_arr["MAILBOX"] = $this->utf_7_decode($mailbox); + $struct_arr["ATTRIBUTES"] = $ext; + return array($token=>$struct_arr); + break; + case "LIST" : + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $params_arr = $this->_arrayfy_content( $str ); + + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken( $str , $hierarchydelim ); + + $this->_parseSpace( $str,__LINE__ , __FILE__); + $this->_getNextToken( $str , $mailbox_name ); + + $result_array = array( "NAME_ATTRIBUTES"=>$params_arr , "HIERACHY_DELIMITER"=>$hierarchydelim , "MAILBOX_NAME"=> $this->utf_7_decode($mailbox_name) ); + return array($token=>$result_array); + break; + case "LSUB" : + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $params_arr = $this->_arrayfy_content( $str ); + + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken( $str , $hierarchydelim ); + + $this->_parseSpace( $str,__LINE__ , __FILE__); + $this->_getNextToken( $str , $mailbox_name ); + + $result_array = array( "NAME_ATTRIBUTES"=>$params_arr , "HIERACHY_DELIMITER"=>$hierarchydelim , "MAILBOX_NAME"=> $this->utf_7_decode($mailbox_name) ); + return array($token=>$result_array); + break; + + case "SEARCH" : + case 'SORT': + $str_line = rtrim( substr( $this->_getToEOL( $str , false ) , 1) ); + $struct_arr[$token.'_LIST'] = explode(' ', $str_line); + if (count($struct_arr[$token.'_LIST']) == 1 && $struct_arr[$token.'_LIST'][0]=='') { + $struct_arr[$token.'_LIST'] = null; + } + return array($token=>$struct_arr); + break; + + case "OK" : + /* TODO: + parse the [ .... ] part of the response, use the method + _getEXTarray(&$str,'[',$stopDelim=']') + + */ + $str_line = rtrim( substr( $this->_getToEOL( $str , false ) , 1 ) ); + if($str_line[0] == '[' ){ + $braceLen=$this->_getClosingBracesPos($str_line, '[', ']' ); + $str_aux='('. substr($str_line,1,$braceLen -1). ')'; + $ext_arr=$this->_getEXTarray($str_aux); + //$ext_arr=array($token=>$this->_getEXTarray($str_aux)); + }else{ + //$ext_arr=$str_line; + $ext_arr=array($token=>$str_line); + } + $result_array = $ext_arr; + return $result_array; + break; + case "NO" : + /* TODO: + parse the [ .... ] part of the response, use the method + _getEXTarray(&$str,'[',$stopDelim=']') + + */ + + $str_line = rtrim( substr( $this->_getToEOL( $str , false ) , 1 ) ); + $result_array[] = @array( "COMMAND"=>$token , "EXT"=>$str_line ); + return $result_array; + break; + case "BAD" : + /* TODO: + parse the [ .... ] part of the response, use the method + _getEXTarray(&$str,'[',$stopDelim=']') + + */ + + $str_line = rtrim( substr( $this->_getToEOL( $str , false ) , 1 ) ); + $result_array[] = array( "COMMAND"=>$token , "EXT"=>$str_line ); + return $result_array; + break; + case "BYE" : + /* TODO: + parse the [ .... ] part of the response, use the method + _getEXTarray(&$str,'[',$stopDelim=']') + + */ + + $str_line = rtrim( substr( $this->_getToEOL( $str , false ) , 1 ) ); + $result_array[] = array( "COMMAND"=>$token , "EXT"=> $str_line ); + return $result_array; + break; + + case "LISTRIGHTS" : + $this->_parseSpace( $str ,__LINE__ , __FILE__ ); + $this->_getNextToken( $str , $mailbox ); + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken( $str , $user ); + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken( $str , $granted ); + + $ungranted = explode( ' ' , rtrim( substr( $this->_getToEOL( $str , false ) , 1 ) ) ); + + $result_array = @array( "MAILBOX"=>$this->utf_7_decode($mailbox) , "USER"=>$user , "GRANTED"=>$granted , "UNGRANTED"=>$ungranted ); + return $result_array; + break; + + case "MYRIGHTS" : + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken( $str ,$mailbox ); + // Patch to handle the alternate MYRIGHTS response from Courier-IMAP + if ($str==')'){ + $granted = $mailbox; + $mailbox = $this->currentMailbox; + }else{ + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken( $str , $granted ); + } + // End Patch + + $result_array = array( "MAILBOX"=>$this->utf_7_decode($mailbox) , "GRANTED"=>$granted ); + return $result_array; + break; + + case 'ACL': + /* + RFC 4314: + acl-data = "ACL" SP mailbox *(SP identifier SP rights) + identifier = astring + rights = astring ;; only lowercase ASCII letters and digits are allowed. + */ + //$str = " INBOX\r\nA0006 OK Completed\r\n"; + $this->_parseSpace($str, __LINE__, __FILE__); + $this->_getNextToken($str, $mailbox); + + $arr = array(); + while (substr($str, 0, 2) != "\r\n") { + $this->_parseSpace($str, __LINE__, __FILE__); + $this->_getNextToken($str, $acl_user); + $this->_parseSpace($str, __LINE__, __FILE__); + $this->_getNextToken($str, $acl_rights); + $arr[] = array('USER'=>$acl_user, 'RIGHTS'=>$acl_rights); + } + + $result_array = array('MAILBOX'=>$this->utf_7_decode($mailbox), 'USERS'=>$arr); + return $result_array; + break; + + case "ANNOTATION" : + $this->_parseSpace($str, __LINE__, __FILE__); + $this->_getNextToken($str, $mailbox); + + $this->_parseSpace($str, __LINE__, __FILE__); + $this->_getNextToken($str, $entry); + + $this->_parseSpace($str, __LINE__, __FILE__); + $attrs = $this->_arrayfy_content($str); + + $result_array = array('MAILBOX' => $mailbox, 'ENTRY' => $entry , 'ATTRIBUTES' => $attrs); + return $result_array; + break; + + case "": + $this->_prot_error( "PROTOCOL ERROR!:str empty!!" , __LINE__ , __FILE__ ); + break; + case "(": + $this->_prot_error("OPENING PARENTHESIS ERROR!!!!!!!!!!!!!!!!!" , __LINE__ , __FILE__ ); + break; + case ")": + //"CLOSING PARENTHESIS BREAK!!!!!!!" + break; + case "\r\n": + $this->_prot_error("BREAK!!!!!!!!!!!!!!!!!" , __LINE__ , __FILE__ ); + break; + case ' ': + // this can happen and we just ignore it + // This happens when - for example - fetch returns more than 1 parammeter + // for example you ask to get RFC822.SIZE and UID + //$this->_prot_error("SPACE BREAK!!!!!!!!!!!!!!!!!" , __LINE__ , __FILE__ ); + break; + default: + $body_token=strtoupper(substr($token,0,5)); + $rfc822_token=strtoupper(substr($token,0,7)); + + if( $body_token == 'BODY[' || $body_token == 'BODY.' || $rfc822_token == 'RFC822.' ) { + //echo "TOKEN:$token\n"; + //$this->_getNextToken( $str , $mailbox ); + return array($token=>$this->_parseContentresponse( $str , $token )); + }else{ + $this->_prot_error( "UNIMPLEMMENTED! I don't know the parameter '$token' !!!" , __LINE__ , __FILE__ ); + } + break; + } + return false; +} + + + + + + + /* + * Verifies that the next character IS a space + */ + function _parseSpace(&$str, $line, $file, $printError = true) + { + /* + This code repeats a lot in this class + so i make it a function to make all the code shorter + */ + $this->_getNextToken( $str , $space ); + if( $space != ' ' ){ + $this->_prot_error("must be a ' ' but is a '$space' !!!!" , $line , $file,$printError ); + } + return $space; + } + + + + + + + function _parseString( &$str , $char , $line , $file ) + { + /* + This code repeats a lot in this class + so i make it a function to make all the code shorter + */ + $this->_getNextToken( $str , $char_aux ); + if( strtoupper($char_aux) != strtoupper( $char ) ){ + $this->_prot_error("must be a $char but is a '$char_aux' !!!!", $line , $file ); + } + return $char_aux; + } + + + + + + function _genericImapResponseParser( &$str , $cmdid = null ) + { + + $result_array=array(); + if( $this->_unParsedReturn ){ + $unparsed_str = $str; + } + + $this->_getNextToken($str, $token); + #error_log(" egw-pear::NET::IMAPProtocoll:_genericIMAPResponseParser: After retrieving the first token:".$token); + while ($token != $cmdid && $str != '') { + if ($token == '+' ) { + //if the token is + ignore the line + // TODO: verify that this is correct!!! + $this->_getToEOL($str); + $this->_getNextToken($str, $token); + } + + $this->_parseString($str, ' ', __LINE__, __FILE__); + + $this->_getNextToken($str, $token); + if ($token == '+') { + $this->_getToEOL($str); + $this->_getNextToken($str, $token); + } else { + if (is_numeric($token)) { + // The token is a NUMBER so I store it + $msg_nro = $token; + $this->_parseSpace($str, __LINE__, __FILE__); + + // I get the command + $this->_getNextToken($str, $command); + + if (($ext_arr = $this->_retrParsedResponse($str, $command, $msg_nro)) == false) { + // if this bogus response cis a FLAGS () or EXPUNGE response + // the ignore it + if ($command != 'FLAGS' && $command != 'EXPUNGE') { + $this->_prot_error("bogus response!!!!" , __LINE__ , __FILE__, false); + } + } + $result_array[] = array('COMMAND'=>$command, 'NRO'=>$msg_nro, 'EXT'=>$ext_arr); + } else { + // OK the token is not a NUMBER so it MUST be a COMMAND + $command = $token; + + /* Call the parser return the array + take care of bogus responses! + */ + + if (($ext_arr = $this->_retrParsedResponse($str, $command)) == false) { + $this->_prot_error("bogus response!!!! (COMMAND:$command)", __LINE__, __FILE__); + } + $result_array[] = array('COMMAND'=>$command, 'EXT'=>$ext_arr); + } + } + + + $this->_getNextToken($str, $token); + + $token = strtoupper($token); + if( $token != "\r\n" && $token != '' ){ + $this->_prot_error("PARSE ERROR!!! must be a '\\r\\n' here but is a '$token'!!!! (getting the next line)|STR:|$str|" , __LINE__ , __FILE__ ); + } + $this->_getNextToken( $str , $token ); + + if($token == "+" ){ + //if the token is + ignore the line + // TODO: verify that this is correct!!! + $this->_getToEOL( $str ); + $this->_getNextToken( $str , $token ); + } + }//While + // OK we finish the UNTAGGED Response now we must parse the FINAL TAGGED RESPONSE + //TODO: make this a litle more elegant! + $this->_parseSpace( $str , __LINE__ , __FILE__, false ); + + $this->_getNextToken( $str , $cmd_status ); + + $str_line = rtrim (substr( $this->_getToEOL( $str ) , 1 ) ); + + + $response["RESPONSE"]=array( "CODE"=>$cmd_status , "STR_CODE"=>$str_line , "CMDID"=>$cmdid ); + + $ret=$response; + if( !empty($result_array)){ + $ret=array_merge($ret,array("PARSED"=>$result_array) ); + } + + if( $this->_unParsedReturn ){ + $unparsed["UNPARSED"]=$unparsed_str; + $ret=array_merge($ret,$unparsed); + } + + + if( isset($status_arr) ){ + $status["STATUS"]=$status_arr; + $ret=array_merge($ret,$status); + } + return $ret; + +} + + + + + function _genericCommand($command, $params = '') + { + if( !$this->_connected ){ + return new PEAR_Error( "not connected! (CMD:$command)" ); + } + $cmdid = $this->_getCmdId(); + $this->_putCMD( $cmdid , $command , $params ); + $args=$this->_getRawResponse( $cmdid ); + #error_log("egw-pear::NET::IMAPProtocoll:_genericCommand:".$command." result:".print_r($args,TRUE)); + return $this->_genericImapResponseParser( $args , $cmdid ); + } + + + + function utf_7_encode($str) + { + if($this->_useUTF_7 == false ){ + return $str; + } + + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($str, "UTF7-IMAP", "ISO-8859-1"); + } + + $encoded_utf7 = ''; + $base64_part = ''; + if(is_array($str)){ + return new PEAR_Error('error'); + } + + for ($i = 0; $i < $this->_getLineLength($str); $i++) { + //those chars should be base64 encoded + if ( ((ord($str[$i]) >= 39 ) and (ord($str[$i]) <= 126 )) or ((ord($str[$i]) >= 32 ) and (ord($str[$i]) <= 37 )) ) { + if ($base64_part) { + $encoded_utf7 = sprintf("%s&%s-", $encoded_utf7, str_replace('=', '',base64_encode($base64_part)) ); + $base64_part = ''; + } + $encoded_utf7 = sprintf("%s%s",$encoded_utf7 , $str[$i]); + } else { + //handle & + if (ord($str[$i]) == 38 ) { + if ($base64_part) { + $encoded_utf7 = sprintf("%s&%s-", $encoded_utf7, str_replace('=', '',base64_encode($base64_part)) ); + $base64_part = ''; + } + $encoded_utf7 = sprintf("%s&-", $encoded_utf7 ); + } else { + $base64_part = sprintf("%s%s",$base64_part , $str[$i]); + //$base64_part = sprintf("%s%s%s",$base64_part , chr(0) , $str[$i]); + } + } + } + if ($base64_part) { + $encoded_utf7 = sprintf("%s&%s-", $encoded_utf7, str_replace('=', '',base64_encode($base64_part)) ); + $base64_part = ''; + } + + return $encoded_utf7; + } + + + function utf_7_decode($str) + { + + if($this->_useUTF_7 == false ){ + return $str; + } + + //return imap_utf7_decode($str); + + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($str, "ISO-8859-1", "UTF7-IMAP"); + } + + $base64_part = ''; + $decoded_utf7 = ''; + + for ($i = 0; $i < $this->_getLineLength($str); $i++) { + if ( $this->_getLineLength($base64_part) > 0 ) { + if ($str[$i] == '-') { + if ($base64_part == '&') { + $decoded_utf7 = sprintf("%s&" , $decoded_utf7 ); + } else { + $next_part_decoded= base64_decode( substr( $base64_part, 1 ) ) ; + $decoded_utf7 = sprintf("%s%s", $decoded_utf7 , $next_part_decoded ); + } + $base64_part = ''; + + } else { + $base64_part = sprintf("%s%s", $base64_part , $str[$i] ); + } + } else { + if ($str[$i] == '&') { + $base64_part = '&'; + } else { + $decoded_utf7 = sprintf("%s%s", $decoded_utf7 , $str[$i] ); + } + } + } + return $decoded_utf7; + } + + /** + * Make CREATE/RENAME compatible option params + * + * @param array $options options to format + * @return string Returns a string for formatted parameters + * + * @access private + * @since 1.1 + */ + function _getCreateParams($options) + { + $args = ""; + if(is_null($options) === false && is_array($options) === true) { + foreach($options as $opt => $data) { + switch(strtoupper($opt)) { + case "PARTITION": + $args .= sprintf(" %s",$this->utf_7_encode($data)); + break; + default: + // ignore any unknown options + break; + } + } + } + return $args; + } + + /** + * Return true if the TLS negotiation was successful + * + * @access public + * @return mixed true on success, PEAR_Error on failure + */ + function cmdStartTLS() + { + if (PEAR::isError($res = $this->_genericCommand("STARTTLS"))) { + return $res; + } + + if(stream_socket_enable_crypto($this->_socket->fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT) == false) { + $msg = 'Failed to establish TLS connection'; + return new PEAR_Error($msg); + } + + if($this->_debug === true) { + echo "STARTTLS Negotiation Successful\n"; + } + + // RFC says we need to query the server capabilities again + if(PEAR::isError($res = $this->cmdCapability() )) { + $msg = 'Failed to connect, server said: ' . $res->getMessage(); + return new PEAR_Error($msg); + } + return true; + } + + function _getLineLength($string) + { + if (extension_loaded('mbstring')) { + return mb_strlen($string,'latin1'); + } else { + return strlen($string); + } + } + + function _getSubstr($string, $start, $length = false) + { + if (extension_loaded('mbstring')) { + if($length !== false) { + return mb_substr($string, $start, $length, 'latin1'); + } else { + $strlen = mb_strlen($string,'latin1'); + return mb_substr($string, $start, $strlen, 'latin1'); + } + } else { + if($length !== false) { + return substr($string, $start, $length); + } else { + return substr($string, $start); + } + } + } + +}//Class +?> diff --git a/egw-pear/Net/Sieve.php b/egw-pear/Net/Sieve.php new file mode 100644 index 0000000000..c00857cde0 --- /dev/null +++ b/egw-pear/Net/Sieve.php @@ -0,0 +1,1145 @@ + | +// | Co-Author: Damian Fernandez Sosa | +// | Co-Author: Anish Mistry | +// +-----------------------------------------------------------------------+ + +require_once('Net/Socket.php'); + +/** +* TODO +* +* o supportsAuthMech() +*/ + +/** +* Disconnected state +* @const NET_SIEVE_STATE_DISCONNECTED +*/ +define('NET_SIEVE_STATE_DISCONNECTED', 1, true); + +/** +* Authorisation state +* @const NET_SIEVE_STATE_AUTHORISATION +*/ +define('NET_SIEVE_STATE_AUTHORISATION', 2, true); + +/** +* Transaction state +* @const NET_SIEVE_STATE_TRANSACTION +*/ +define('NET_SIEVE_STATE_TRANSACTION', 3, true); + +/** +* A class for talking to the timsieved server which +* comes with Cyrus IMAP. +* +* SIEVE: RFC3028 http://www.ietf.org/rfc/rfc3028.txt +* MANAGE-SIEVE: http://www.ietf.org/internet-drafts/draft-martin-managesieve-06.txt +* +* @author Richard Heyes +* @author Damian Fernandez Sosa +* @author Anish Mistry +* @access public +* @version 1.2.0 +* @package Net_Sieve +*/ + +class Net_Sieve +{ + /** + * The socket object + * @var object + */ + var $_sock; + + /** + * Info about the connect + * @var array + */ + var $_data; + + /** + * Current state of the connection + * @var integer + */ + var $_state; + + /** + * Constructor error is any + * @var object + */ + var $_error; + + /** + * To allow class debuging + * @var boolean + */ + var $_debug = false; + + /** + * Allows picking up of an already established connection + * @var boolean + */ + var $_bypassAuth = false; + + /** + * Whether to use TLS if available + * @var boolean + */ + var $_useTLS = true; + + /** + * The auth methods this class support + * @var array + */ + var $supportedAuthMethods=array('DIGEST-MD5', 'CRAM-MD5', 'PLAIN' , 'LOGIN'); + //if you have problems using DIGEST-MD5 authentication please comment the line above and uncomment the following line + //var $supportedAuthMethods=array( 'CRAM-MD5', 'PLAIN' , 'LOGIN'); + + //var $supportedAuthMethods=array( 'PLAIN' , 'LOGIN'); + + /** + * The auth methods this class support + * @var array + */ + var $supportedSASLAuthMethods=array('DIGEST-MD5', 'CRAM-MD5'); + + /** + * Handles posible referral loops + * @var array + */ + var $_maxReferralCount = 15; + + /** + * Constructor + * Sets up the object, connects to the server and logs in. stores + * any generated error in $this->_error, which can be retrieved + * using the getError() method. + * + * @param string $user Login username + * @param string $pass Login password + * @param string $host Hostname of server + * @param string $port Port of server + * @param string $logintype Type of login to perform + * @param string $euser Effective User (if $user=admin, login as $euser) + * @param string $bypassAuth Skip the authentication phase. Useful if the socket + is already open. + * @param boolean $useTLS Use TLS if available + */ + function Net_Sieve($user = null , $pass = null , $host = 'localhost', $port = 2000, $logintype = '', $euser = '', $debug = false, $bypassAuth = false, $useTLS = true) + { + $this->_state = NET_SIEVE_STATE_DISCONNECTED; + $this->_data['user'] = $user; + $this->_data['pass'] = $pass; + $this->_data['host'] = $host; + $this->_data['port'] = $port; + $this->_data['logintype'] = $logintype; + $this->_data['euser'] = $euser; + $this->_sock = new Net_Socket(); + $this->_debug = $debug; + $this->_bypassAuth = $bypassAuth; + $this->_useTLS = $useTLS; + /* + * Include the Auth_SASL package. If the package is not available, + * we disable the authentication methods that depend upon it. + */ + if ((@include_once 'Auth/SASL.php') === false) { + if($this->_debug){ + echo "AUTH_SASL NOT PRESENT!\n"; + } + foreach($this->supportedSASLAuthMethods as $SASLMethod){ + $pos = array_search( $SASLMethod, $this->supportedAuthMethods ); + if($this->_debug){ + echo "DISABLING METHOD $SASLMethod\n"; + } + unset($this->supportedAuthMethods[$pos]); + } + } + if( ($user != null) && ($pass != null) ){ + $this->_error = $this->_handleConnectAndLogin(); + } + } + + /** + * Handles the errors the class can find + * on the server + * + * @access private + * @param mixed $msg Text error message or PEAR error object + * @param integer $code Numeric error code + * @return PEAR_Error + */ + function _raiseError($msg, $code) + { + include_once 'PEAR.php'; + return PEAR::raiseError($msg, $code); + } + + /** + * Handles connect and login. + * on the server + * + * @access private + * @return mixed Indexed array of scriptnames or PEAR_Error on failure + */ + function _handleConnectAndLogin() + { + if (PEAR::isError($res = $this->connect($this->_data['host'] , $this->_data['port'], $this->_useTLS ))) { + return $res; + } + if($this->_bypassAuth === false) { + if (PEAR::isError($res = $this->login($this->_data['user'], $this->_data['pass'], $this->_data['logintype'] , $this->_data['euser'] , $this->_bypassAuth) ) ) { + return $res; + } + } + return true; + } + + /** + * Returns an indexed array of scripts currently + * on the server + * + * @return mixed Indexed array of scriptnames or PEAR_Error on failure + */ + function listScripts() + { + if (is_array($scripts = $this->_cmdListScripts())) { + $this->_active = $scripts[1]; + return $scripts[0]; + } else { + return $scripts; + } + } + + /** + * Returns the active script + * + * @return mixed The active scriptname or PEAR_Error on failure + */ + function getActive() + { + if (!empty($this->_active)) { + return $this->_active; + + } elseif (is_array($scripts = $this->_cmdListScripts())) { + $this->_active = $scripts[1]; + return $scripts[1]; + } + } + + /** + * Sets the active script + * + * @param string $scriptname The name of the script to be set as active + * @return mixed true on success, PEAR_Error on failure + */ + function setActive($scriptname) + { + return $this->_cmdSetActive($scriptname); + } + + /** + * Retrieves a script + * + * @param string $scriptname The name of the script to be retrieved + * @return mixed The script on success, PEAR_Error on failure + */ + function getScript($scriptname) + { + return $this->_cmdGetScript($scriptname); + } + + /** + * Adds a script to the server + * + * @param string $scriptname Name of the script + * @param string $script The script + * @param boolean $makeactive Whether to make this the active script + * @return mixed true on success, PEAR_Error on failure + */ + function installScript($scriptname, $script, $makeactive = false) + { + if (PEAR::isError($res = $this->_cmdPutScript($scriptname, $script))) { + return $res; + + } elseif ($makeactive) { + return $this->_cmdSetActive($scriptname); + + } else { + return true; + } + } + + /** + * Removes a script from the server + * + * @param string $scriptname Name of the script + * @return mixed True on success, PEAR_Error on failure + */ + function removeScript($scriptname) + { + return $this->_cmdDeleteScript($scriptname); + } + + /** + * Returns any error that may have been generated in the + * constructor + * + * @return mixed False if no error, PEAR_Error otherwise + */ + function getError() + { + return PEAR::isError($this->_error) ? $this->_error : false; + } + + /** + * Handles connecting to the server and checking the + * response is valid. + * + * @access private + * @param string $host Hostname of server + * @param string $port Port of server + * @param array $options List of options to pass to connect + * @param boolean $useTLS Use TLS if available + * @return mixed True on success, PEAR_Error otherwise + */ + function connect($host, $port, $options = null, $useTLS = true) + { + if (NET_SIEVE_STATE_DISCONNECTED != $this->_state) { + $msg='Not currently in DISCONNECTED state'; + $code=1; + return $this->_raiseError($msg,$code); + } + + if (PEAR::isError($res = $this->_sock->connect($host, $port, false, 5, $options))) { + return $res; + } + + if($this->_bypassAuth === false) { + $this->_state = NET_SIEVE_STATE_AUTHORISATION; + if (PEAR::isError($res = $this->_doCmd())) { + return $res; + } + } else { + $this->_state = NET_SIEVE_STATE_TRANSACTION; + } + + // Explicitly ask for the capabilities in case the connection + // is picked up from an existing connection. + if(PEAR::isError($res = $this->_cmdCapability() )) { + $msg='Failed to connect, server said: ' . $res->getMessage(); + $code=2; + return $this->_raiseError($msg,$code); + } + + // Get logon greeting/capability and parse + $this->_parseCapability($res); + + if($useTLS === true) { + // check if we can enable TLS via STARTTLS + if(isset($this->_capability['starttls']) && function_exists('stream_socket_enable_crypto') === true) { + if (PEAR::isError($res = $this->_startTLS())) { + return $res; + } + } + } + + return true; + } + + /** + * Logs into server. + * + * @param string $user Login username + * @param string $pass Login password + * @param string $logintype Type of login method to use + * @param string $euser Effective UID (perform on behalf of $euser) + * @param boolean $bypassAuth Do not perform authentication + * @return mixed True on success, PEAR_Error otherwise + */ + function login($user, $pass, $logintype = null , $euser = '', $bypassAuth = false) + { + if (NET_SIEVE_STATE_AUTHORISATION != $this->_state) { + $msg='Not currently in AUTHORISATION state'; + $code=1; + return $this->_raiseError($msg,$code); + } + + if( $bypassAuth === false ){ + if(PEAR::isError($res=$this->_cmdAuthenticate($user , $pass , $logintype, $euser ) ) ){ + return $res; + } + } + $this->_state = NET_SIEVE_STATE_TRANSACTION; + return true; + } + + /** + * Handles the authentication using any known method + * + * @param string $uid The userid to authenticate as. + * @param string $pwd The password to authenticate with. + * @param string $userMethod The method to use ( if $userMethod == '' then the class chooses the best method (the stronger is the best ) ) + * @param string $euser The effective uid to authenticate as. + * + * @return mixed string or PEAR_Error + * + * @access private + * @since 1.0 + */ + function _cmdAuthenticate($uid , $pwd , $userMethod = null , $euser = '' ) + { + if ( PEAR::isError( $method = $this->_getBestAuthMethod($userMethod) ) ) { + return $method; + } + switch ($method) { + case 'DIGEST-MD5': + $result = $this->_authDigest_MD5( $uid , $pwd , $euser ); + return $result; + break; + case 'CRAM-MD5': + $result = $this->_authCRAM_MD5( $uid , $pwd, $euser); + break; + case 'LOGIN': + $result = $this->_authLOGIN( $uid , $pwd , $euser ); + break; + case 'PLAIN': + $result = $this->_authPLAIN( $uid , $pwd , $euser ); + break; + default : + $result = new PEAR_Error( "$method is not a supported authentication method" ); + break; + } + + if (PEAR::isError($res = $this->_doCmd() )) { + return $res; + } + return $result; + } + + /** + * Authenticates the user using the PLAIN method. + * + * @param string $user The userid to authenticate as. + * @param string $pass The password to authenticate with. + * @param string $euser The effective uid to authenticate as. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authPLAIN($user, $pass , $euser ) + { + if ($euser != '') { + $cmd=sprintf('AUTHENTICATE "PLAIN" "%s"', base64_encode($euser . chr(0) . $user . chr(0) . $pass ) ) ; + } else { + $cmd=sprintf('AUTHENTICATE "PLAIN" "%s"', base64_encode( chr(0) . $user . chr(0) . $pass ) ); + } + return $this->_sendCmd( $cmd ) ; + } + + /** + * Authenticates the user using the PLAIN method. + * + * @param string $user The userid to authenticate as. + * @param string $pass The password to authenticate with. + * @param string $euser The effective uid to authenticate as. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authLOGIN($user, $pass , $euser ) + { + $this->_sendCmd('AUTHENTICATE "LOGIN"'); + $this->_doCmd(sprintf('"%s"', base64_encode($user))); + $this->_doCmd(sprintf('"%s"', base64_encode($pass))); + } + + /** + * Authenticates the user using the CRAM-MD5 method. + * + * @param string $uid The userid to authenticate as. + * @param string $pwd The password to authenticate with. + * @param string $euser The effective uid to authenticate as. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authCRAM_MD5($uid, $pwd, $euser) + { + if ( PEAR::isError( $challenge = $this->_doCmd( 'AUTHENTICATE "CRAM-MD5"' ) ) ) { + $this->_error=challenge ; + return challenge ; + } + $challenge=trim($challenge); + $challenge = base64_decode( trim($challenge) ); + $cram = &Auth_SASL::factory('crammd5'); + if ( PEAR::isError($resp=$cram->getResponse( $uid , $pwd , $challenge ) ) ) { + $this->_error=$resp; + return $resp; + } + $auth_str = base64_encode( $resp ); + if ( PEAR::isError($error = $this->_sendStringResponse( $auth_str ) ) ) { + $this->_error=$error; + return $error; + } + + } + + /** + * Authenticates the user using the DIGEST-MD5 method. + * + * @param string $uid The userid to authenticate as. + * @param string $pwd The password to authenticate with. + * @param string $euser The effective uid to authenticate as. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authDigest_MD5($uid, $pwd, $euser) + { + if ( PEAR::isError( $challenge = $this->_doCmd('AUTHENTICATE "DIGEST-MD5"') ) ) { + $this->_error=challenge ; + return challenge ; + } + $challenge = base64_decode( $challenge ); + $digest = &Auth_SASL::factory('digestmd5'); + + if(PEAR::isError($param=$digest->getResponse($uid, $pwd, $challenge, "localhost", "sieve" , $euser) )) { + return $param; + } + $auth_str = base64_encode($param); + + if ( PEAR::isError($error = $this->_sendStringResponse( $auth_str ) ) ) { + $this->_error=$error; + return $error; + } + + if ( PEAR::isError( $challenge = $this->_doCmd() ) ) { + $this->_error=$challenge ; + return $challenge ; + } + + if( strtoupper(substr($challenge,0,2))== 'OK' ){ + return true; + } + + /** + * We don't use the protocol's third step because SIEVE doesn't allow + * subsequent authentication, so we just silently ignore it. + */ + if ( PEAR::isError($error = $this->_sendStringResponse( '' ) ) ) { + $this->_error=$error; + return $error; + } + + if (PEAR::isError($res = $this->_doCmd() )) { + return $res; + } + } + + /** + * Removes a script from the server + * + * @access private + * @param string $scriptname Name of the script to delete + * @return mixed True on success, PEAR_Error otherwise + */ + function _cmdDeleteScript($scriptname) + { + if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { + $msg='Not currently in AUTHORISATION state'; + $code=1; + return $this->_raiseError($msg,$code); + } + if (PEAR::isError($res = $this->_doCmd(sprintf('DELETESCRIPT "%s"', $scriptname) ) )) { + return $res; + } + return true; + } + + /** + * Retrieves the contents of the named script + * + * @access private + * @param string $scriptname Name of the script to retrieve + * @return mixed The script if successful, PEAR_Error otherwise + */ + function _cmdGetScript($scriptname) + { + if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { + $msg='Not currently in AUTHORISATION state'; + $code=1; + return $this->_raiseError($msg,$code); + } + + if (PEAR::isError($res = $this->_doCmd(sprintf('GETSCRIPT "%s"', $scriptname) ) ) ) { + return $res; + } + + return preg_replace('/{[0-9]+}\r\n/', '', $res); + } + + /** + * Sets the ACTIVE script, ie the one that gets run on new mail + * by the server + * + * @access private + * @param string $scriptname The name of the script to mark as active + * @return mixed True on success, PEAR_Error otherwise + */ + function _cmdSetActive($scriptname) + { + if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { + $msg='Not currently in AUTHORISATION state'; + $code=1; + return $this->_raiseError($msg,$code); + } + + if (PEAR::isError($res = $this->_doCmd(sprintf('SETACTIVE "%s"', $scriptname) ) ) ) { + return $res; + } + + $this->_activeScript = $scriptname; + return true; + } + + /** + * Sends the LISTSCRIPTS command + * + * @access private + * @return mixed Two item array of scripts, and active script on success, + * PEAR_Error otherwise. + */ + function _cmdListScripts() + { + if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { + $msg='Not currently in AUTHORISATION state'; + $code=1; + return $this->_raiseError($msg,$code); + } + + $scripts = array(); + $activescript = null; + + if (PEAR::isError($res = $this->_doCmd('LISTSCRIPTS'))) { + return $res; + } + + $res = explode("\r\n", $res); + + foreach ($res as $value) { + if (preg_match('/^"(.*)"( ACTIVE)?$/i', $value, $matches)) { + $scripts[] = $matches[1]; + if (!empty($matches[2])) { + $activescript = $matches[1]; + } + } + } + + return array($scripts, $activescript); + } + + /** + * Sends the PUTSCRIPT command to add a script to + * the server. + * + * @access private + * @param string $scriptname Name of the new script + * @param string $scriptdata The new script + * @return mixed True on success, PEAR_Error otherwise + */ + function _cmdPutScript($scriptname, $scriptdata) + { + if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { + $msg='Not currently in TRANSACTION state'; + $code=1; + return $this->_raiseError($msg,$code); + } + + $stringLength = $this->_getLineLength($scriptdata); + + if (PEAR::isError($res = $this->_doCmd(sprintf("PUTSCRIPT \"%s\" {%d+}\r\n%s", $scriptname, $stringLength, $scriptdata) ))) { + return $res; + } + + return true; + } + + /** + * Sends the LOGOUT command and terminates the connection + * + * @access private + * @param boolean $sendLogoutCMD True to send LOGOUT command before disconnecting + * @return mixed True on success, PEAR_Error otherwise + */ + function _cmdLogout($sendLogoutCMD=true) + { + if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) { + $msg='Not currently connected'; + $code=1; + return $this->_raiseError($msg,$code); + //return PEAR::raiseError('Not currently connected'); + } + + if($sendLogoutCMD){ + if (PEAR::isError($res = $this->_doCmd('LOGOUT'))) { + return $res; + } + } + + $this->_sock->disconnect(); + $this->_state = NET_SIEVE_STATE_DISCONNECTED; + return true; + } + + /** + * Sends the CAPABILITY command + * + * @access private + * @return mixed True on success, PEAR_Error otherwise + */ + function _cmdCapability() + { + if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) { + $msg='Not currently connected'; + $code=1; + return $this->_raiseError($msg,$code); + } + + if (PEAR::isError($res = $this->_doCmd('CAPABILITY'))) { + return $res; + } + $this->_parseCapability($res); + return true; + } + + /** + * Checks if the server has space to store the script + * by the server + * + * @param string $scriptname The name of the script to mark as active + * @param integer $size The size of the script + * @return mixed True on success, PEAR_Error otherwise + */ + function haveSpace($scriptname,$size) + { + if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { + $msg='Not currently in TRANSACTION state'; + $code=1; + return $this->_raiseError($msg,$code); + } + + if (PEAR::isError($res = $this->_doCmd(sprintf('HAVESPACE "%s" %d', $scriptname, $size) ) ) ) { + return $res; + } + + return true; + } + + /** + * Parses the response from the capability command. Stores + * the result in $this->_capability + * + * @access private + * @param string $data The response from the capability command + */ + function _parseCapability($data) + { + $data = preg_split('/\r?\n/', $data, -1, PREG_SPLIT_NO_EMPTY); + + for ($i = 0; $i < count($data); $i++) { + if (preg_match('/^"([a-z]+)"( "(.*)")?$/i', $data[$i], $matches)) { + switch (strtolower($matches[1])) { + case 'implementation': + $this->_capability['implementation'] = $matches[3]; + break; + + case 'sasl': + $this->_capability['sasl'] = preg_split('/\s+/', $matches[3]); + break; + + case 'sieve': + $this->_capability['extensions'] = preg_split('/\s+/', $matches[3]); + break; + + case 'starttls': + $this->_capability['starttls'] = true; + break; + } + } + } + } + + /** + * Sends a command to the server + * + * @access private + * @param string $cmd The command to send + */ + function _sendCmd($cmd) + { + $status = $this->_sock->getStatus(); + if (PEAR::isError($status) || $status['eof']) { + return new PEAR_Error( 'Failed to write to socket: (connection lost!) ' ); + } + if ( PEAR::isError( $error = $this->_sock->write( $cmd . "\r\n" ) ) ) { + return new PEAR_Error( 'Failed to write to socket: ' . $error->getMessage() ); + } + + if( $this->_debug ){ + // C: means this data was sent by the client (this class) + echo "C:$cmd\n"; + } + return true; + } + + /** + * Sends a string response to the server + * + * @access private + * @param string $cmd The command to send + */ + function _sendStringResponse($str) + { + $response='{' . $this->_getLineLength($str) . "+}\r\n" . $str ; + return $this->_sendCmd($response); + } + + function _recvLn() + { + $lastline=''; + if (PEAR::isError( $lastline = $this->_sock->gets( 8192 ) ) ) { + return new PEAR_Error( 'Failed to write to socket: ' . $lastline->getMessage() ); + } + $lastline=rtrim($lastline); + if($this->_debug){ + // S: means this data was sent by the IMAP Server + echo "S:$lastline\n" ; + } + + if( $lastline === '' ) { + return new PEAR_Error( 'Failed to receive from the socket' ); + } + + return $lastline; + } + + /** + * Send a command and retrieves a response from the server. + * + * + * @access private + * @param string $cmd The command to send + * @return mixed Reponse string if an OK response, PEAR_Error if a NO response + */ + function _doCmd($cmd = '' ) + { + $referralCount=0; + while($referralCount < $this->_maxReferralCount ){ + + if($cmd != '' ){ + if(PEAR::isError($error = $this->_sendCmd($cmd) )) { + return $error; + } + } + $response = ''; + + while (true) { + if(PEAR::isError( $line=$this->_recvLn() )){ + return $line; + } + if ('ok' === strtolower(substr($line, 0, 2))) { + $response .= $line; + return rtrim($response); + + } elseif ('no' === strtolower(substr($line, 0, 2))) { + // Check for string literal error message + if (preg_match('/^no {([0-9]+)\+?}/i', $line, $matches)) { + $line .= str_replace("\r\n", ' ', $this->_sock->read($matches[1] + 2 )); + if($this->_debug){ + echo "S:$line\n"; + } + } + $msg=trim($response . substr($line, 2)); + $code=3; + return $this->_raiseError($msg,$code); + } elseif ('bye' === strtolower(substr($line, 0, 3))) { + + if(PEAR::isError($error = $this->disconnect(false) ) ){ + $msg="Can't handle bye, The error was= " . $error->getMessage() ; + $code=4; + return $this->_raiseError($msg,$code); + } + //if (preg_match('/^bye \(referral "([^"]+)/i', $line, $matches)) { + if (preg_match('/^bye \(referral "(sieve:\/\/)?([^"]+)/i', $line, $matches)) { + // Check for referral, then follow it. Otherwise, carp an error. + // Replace the old host with the referral host preserving any protocol prefix + $this->_data['host'] = preg_replace('/\w+(?!(\w|\:\/\/)).*/',$matches[2],$this->_data['host']); + if (PEAR::isError($error = $this->_handleConnectAndLogin() ) ){ + $msg="Can't follow referral to " . $this->_data['host'] . ", The error was= " . $error->getMessage() ; + $code=5; + return $this->_raiseError($msg,$code); + } + break; + // Retry the command + if(PEAR::isError($error = $this->_sendCmd($cmd) )) { + return $error; + } + continue; + } + $msg=trim($response . $line); + $code=6; + return $this->_raiseError($msg,$code); + } elseif (preg_match('/^{([0-9]+)\+?}/i', $line, $matches)) { + // Matches String Responses. + //$line = str_replace("\r\n", ' ', $this->_sock->read($matches[1] + 2 )); + $str_size = $matches[1] + 2; + $line = ''; + $line_length = 0; + while ($line_length < $str_size) { + $line .= $this->_sock->read($str_size - $line_length); + $line_length = $this->_getLineLength($line); + } + if($this->_debug){ + echo "S:$line\n"; + } + // receive the pending OK + $this->_recvLn(); + return $line; + } + $response .= $line . "\r\n"; + $referralCount++; + } + } + $msg="Max referral count reached ($referralCount times) Cyrus murder loop error?"; + $code=7; + return $this->_raiseError($msg,$code); + } + + /** + * Sets the debug state + * + * @param boolean $debug + * @return void + */ + function setDebug($debug = true) + { + $this->_debug = $debug; + } + + /** + * Disconnect from the Sieve server + * + * @param string $scriptname The name of the script to be set as active + * @return mixed true on success, PEAR_Error on failure + */ + function disconnect($sendLogoutCMD=true) + { + return $this->_cmdLogout($sendLogoutCMD); + } + + /** + * Returns the name of the best authentication method that the server + * has advertised. + * + * @param string if !=null,authenticate with this method ($userMethod). + * + * @return mixed Returns a string containing the name of the best + * supported authentication method or a PEAR_Error object + * if a failure condition is encountered. + * @access private + * @since 1.0 + */ + function _getBestAuthMethod($userMethod = null) + { + if( isset($this->_capability['sasl']) ){ + $serverMethods=$this->_capability['sasl']; + }else{ + // if the server don't send an sasl capability fallback to login auth + //return 'LOGIN'; + return new PEAR_Error("This server don't support any Auth methods SASL problem?"); + } + + if($userMethod != null ){ + $methods = array(); + $methods[] = $userMethod; + }else{ + + $methods = $this->supportedAuthMethods; + } + if( ($methods != null) && ($serverMethods != null)){ + foreach ( $methods as $method ) { + if ( in_array( $method , $serverMethods ) ) { + return $method; + } + } + $serverMethods=implode(',' , $serverMethods ); + $myMethods=implode(',' ,$this->supportedAuthMethods); + return new PEAR_Error("$method NOT supported authentication method!. This server " . + "supports these methods= $serverMethods, but I support $myMethods"); + }else{ + return new PEAR_Error("This server don't support any Auth methods"); + } + } + + /** + * Return the list of extensions the server supports + * + * @return mixed array on success, PEAR_Error on failure + */ + function getExtensions() + { + if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) { + $msg='Not currently connected'; + $code=7; + return $this->_raiseError($msg,$code); + } + + return $this->_capability['extensions']; + } + + /** + * Return true if tyhe server has that extension + * + * @param string the extension to compare + * @return mixed array on success, PEAR_Error on failure + */ + function hasExtension($extension) + { + if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) { + $msg='Not currently connected'; + $code=7; + return $this->_raiseError($msg,$code); + } + + if(is_array($this->_capability['extensions'] ) ){ + foreach( $this->_capability['extensions'] as $ext){ + if( trim( strtolower( $ext ) ) === trim( strtolower( $extension ) ) ) + return true; + } + } + return false; + } + + /** + * Return the list of auth methods the server supports + * + * @return mixed array on success, PEAR_Error on failure + */ + function getAuthMechs() + { + if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) { + $msg='Not currently connected'; + $code=7; + return $this->_raiseError($msg,$code); + } + if(!isset($this->_capability['sasl']) ){ + $this->_capability['sasl']=array(); + } + return $this->_capability['sasl']; + } + + /** + * Return true if the server has that extension + * + * @param string the extension to compare + * @return mixed array on success, PEAR_Error on failure + */ + function hasAuthMech($method) + { + if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) { + $msg='Not currently connected'; + $code=7; + return $this->_raiseError($msg,$code); + //return PEAR::raiseError('Not currently connected'); + } + + if(is_array($this->_capability['sasl'] ) ){ + foreach( $this->_capability['sasl'] as $ext){ + if( trim( strtolower( $ext ) ) === trim( strtolower( $method ) ) ) + return true; + } + } + return false; + } + + /** + * Return true if the TLS negotiation was successful + * + * @access private + * @return mixed true on success, PEAR_Error on failure + */ + function _startTLS() + { + if (PEAR::isError($res = $this->_doCmd("STARTTLS"))) { + return $res; + } + + if(stream_socket_enable_crypto($this->_sock->fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT) == false) { + $msg='Failed to establish TLS connection'; + $code=2; + return $this->_raiseError($msg,$code); + } + + if($this->_debug === true) { + echo "STARTTLS Negotiation Successful\n"; + } + + // RFC says we need to query the server capabilities again + if(PEAR::isError($res = $this->_cmdCapability() )) { + $msg='Failed to connect, server said: ' . $res->getMessage(); + $code=2; + return $this->_raiseError($msg,$code); + } + return true; + } + + function _getLineLength($string) { + if (extension_loaded('mbstring') || @dl(PHP_SHLIB_PREFIX.'mbstring.'.PHP_SHLIB_SUFFIX)) { + return mb_strlen($string,'latin1'); + } else { + return strlen($string); + } + } +} +?> diff --git a/egw-pear/Net/Socket.php b/egw-pear/Net/Socket.php new file mode 100644 index 0000000000..b11e9ed764 --- /dev/null +++ b/egw-pear/Net/Socket.php @@ -0,0 +1,556 @@ + | +// | Chuck Hagenbuch | +// +----------------------------------------------------------------------+ +// +// $Id: Socket.php,v 1.28 2006/12/13 21:32:03 cweiske Exp $ + +require_once 'PEAR.php'; + +define('NET_SOCKET_READ', 1); +define('NET_SOCKET_WRITE', 2); +define('NET_SOCKET_ERROR', 4); + +/** + * Generalized Socket class. + * + * @version 1.1 + * @author Stig Bakken + * @author Chuck Hagenbuch + */ +class Net_Socket extends PEAR { + + /** + * Socket file pointer. + * @var resource $fp + */ + var $fp = null; + + /** + * Whether the socket is blocking. Defaults to true. + * @var boolean $blocking + */ + var $blocking = true; + + /** + * Whether the socket is persistent. Defaults to false. + * @var boolean $persistent + */ + var $persistent = false; + + /** + * The IP address to connect to. + * @var string $addr + */ + var $addr = ''; + + /** + * The port number to connect to. + * @var integer $port + */ + var $port = 0; + + /** + * Number of seconds to wait on socket connections before assuming + * there's no more data. Defaults to no timeout. + * @var integer $timeout + */ + var $timeout = false; + + /** + * Number of bytes to read at a time in readLine() and + * readAll(). Defaults to 2048. + * @var integer $lineLength + */ + var $lineLength = 2048; + + /** + * Connect to the specified port. If called when the socket is + * already connected, it disconnects and connects again. + * + * @param string $addr IP address or host name. + * @param integer $port TCP port number. + * @param boolean $persistent (optional) Whether the connection is + * persistent (kept open between requests + * by the web server). + * @param integer $timeout (optional) How long to wait for data. + * @param array $options See options for stream_context_create. + * + * @access public + * + * @return boolean | PEAR_Error True on success or a PEAR_Error on failure. + */ + function connect($addr, $port = 0, $persistent = null, $timeout = null, $options = null) + { + if (is_resource($this->fp)) { + @fclose($this->fp); + $this->fp = null; + } + + if (!$addr) { + return $this->raiseError('$addr cannot be empty'); + } elseif (strspn($addr, '.0123456789') == strlen($addr) || + strstr($addr, '/') !== false) { + $this->addr = $addr; + } else { + $this->addr = @gethostbyname($addr); + } + + $this->port = $port % 65536; + + if ($persistent !== null) { + $this->persistent = $persistent; + } + + if ($timeout !== null) { + $this->timeout = $timeout; + } + + $errno = 0; + $errstr = ''; + if ($options && function_exists('stream_socket_client')) { + if ($this->timeout) { + $timeout = $this->timeout; + } else { + $timeout = 0; + } + + $context = stream_context_create($options); + $flags = ($this->persistent === true ? STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT : STREAM_CLIENT_CONNECT); + $fp = @stream_socket_client($this->addr.':'.$this->port, $errno, $errstr, $timeout, $flags, $context); + } else { + $openfunc = $this->persistent ? 'pfsockopen' : 'fsockopen'; + if ($this->timeout) { + $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $this->timeout); + } else { + $fp = @$openfunc($this->addr, $this->port, $errno, $errstr); + } + } + + if (!$fp) { + return $this->raiseError($errstr, $errno); + } + + $this->fp = $fp; + + return $this->setBlocking($this->blocking); + } + + /** + * Disconnects from the peer, closes the socket. + * + * @access public + * @return mixed true on success or an error object otherwise + */ + function disconnect() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + @fclose($this->fp); + $this->fp = null; + return true; + } + + /** + * Find out if the socket is in blocking mode. + * + * @access public + * @return boolean The current blocking mode. + */ + function isBlocking() + { + return $this->blocking; + } + + /** + * Sets whether the socket connection should be blocking or + * not. A read call to a non-blocking socket will return immediately + * if there is no data available, whereas it will block until there + * is data for blocking sockets. + * + * @param boolean $mode True for blocking sockets, false for nonblocking. + * @access public + * @return mixed true on success or an error object otherwise + */ + function setBlocking($mode) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $this->blocking = $mode; + socket_set_blocking($this->fp, $this->blocking); + return true; + } + + /** + * Sets the timeout value on socket descriptor, + * expressed in the sum of seconds and microseconds + * + * @param integer $seconds Seconds. + * @param integer $microseconds Microseconds. + * @access public + * @return mixed true on success or an error object otherwise + */ + function setTimeout($seconds, $microseconds) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return socket_set_timeout($this->fp, $seconds, $microseconds); + } + + /** + * Sets the file buffering size on the stream. + * See php's stream_set_write_buffer for more information. + * + * @param integer $size Write buffer size. + * @access public + * @return mixed on success or an PEAR_Error object otherwise + */ + function setWriteBuffer($size) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $returned = stream_set_write_buffer($this->fp, $code); + if ($returned == 0) { + return true; + } + return $this->raiseError('Cannot set write buffer.'); + } + + /** + * Returns information about an existing socket resource. + * Currently returns four entries in the result array: + * + *

+ * timed_out (bool) - The socket timed out waiting for data
+ * blocked (bool) - The socket was blocked
+ * eof (bool) - Indicates EOF event
+ * unread_bytes (int) - Number of bytes left in the socket buffer
+ *

+ * + * @access public + * @return mixed Array containing information about existing socket resource or an error object otherwise + */ + function getStatus() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return socket_get_status($this->fp); + } + + /** + * Get a specified line of data + * + * @access public + * @return $size bytes of data from the socket, or a PEAR_Error if + * not connected. + */ + function gets($size) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return @fgets($this->fp, $size); + } + + /** + * Read a specified amount of data. This is guaranteed to return, + * and has the added benefit of getting everything in one fread() + * chunk; if you know the size of the data you're getting + * beforehand, this is definitely the way to go. + * + * @param integer $size The number of bytes to read from the socket. + * @access public + * @return $size bytes of data from the socket, or a PEAR_Error if + * not connected. + */ + function read($size) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return @fread($this->fp, $size); + } + + /** + * Write a specified amount of data. + * + * @param string $data Data to write. + * @param integer $blocksize Amount of data to write at once. + * NULL means all at once. + * + * @access public + * @return mixed true on success or an error object otherwise + */ + function write($data, $blocksize = null) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + if (is_null($blocksize) && !OS_WINDOWS) { + return fwrite($this->fp, $data); + } else { + if (is_null($blocksize)) { + $blocksize = 1024; + } + + $pos = 0; + $size = strlen($data); + while ($pos < $size) { + $written = @fwrite($this->fp, substr($data, $pos, $blocksize)); + if ($written === false) { + return false; + } + $pos += $written; + } + + return $pos; + } + } + + /** + * Write a line of data to the socket, followed by a trailing "\r\n". + * + * @access public + * @return mixed fputs result, or an error + */ + function writeLine($data) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return fwrite($this->fp, $data . "\r\n"); + } + + /** + * Tests for end-of-file on a socket descriptor. + * + * Also returns true if the socket is disconnected. + * + * @access public + * @return bool + */ + function eof() + { + return (!is_resource($this->fp) || feof($this->fp)); + } + + /** + * Reads a byte of data + * + * @access public + * @return 1 byte of data from the socket, or a PEAR_Error if + * not connected. + */ + function readByte() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return ord(@fread($this->fp, 1)); + } + + /** + * Reads a word of data + * + * @access public + * @return 1 word of data from the socket, or a PEAR_Error if + * not connected. + */ + function readWord() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $buf = @fread($this->fp, 2); + return (ord($buf[0]) + (ord($buf[1]) << 8)); + } + + /** + * Reads an int of data + * + * @access public + * @return integer 1 int of data from the socket, or a PEAR_Error if + * not connected. + */ + function readInt() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $buf = @fread($this->fp, 4); + return (ord($buf[0]) + (ord($buf[1]) << 8) + + (ord($buf[2]) << 16) + (ord($buf[3]) << 24)); + } + + /** + * Reads a zero-terminated string of data + * + * @access public + * @return string, or a PEAR_Error if + * not connected. + */ + function readString() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $string = ''; + while (($char = @fread($this->fp, 1)) != "\x00") { + $string .= $char; + } + return $string; + } + + /** + * Reads an IP Address and returns it in a dot formated string + * + * @access public + * @return Dot formated string, or a PEAR_Error if + * not connected. + */ + function readIPAddress() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $buf = @fread($this->fp, 4); + return sprintf("%s.%s.%s.%s", ord($buf[0]), ord($buf[1]), + ord($buf[2]), ord($buf[3])); + } + + /** + * Read until either the end of the socket or a newline, whichever + * comes first. Strips the trailing newline from the returned data. + * + * @access public + * @return All available data up to a newline, without that + * newline, or until the end of the socket, or a PEAR_Error if + * not connected. + */ + function readLine() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + ob_start(); + $line = ''; + $timeout = time() + $this->timeout; + while (!feof($this->fp) && (!$this->timeout || time() < $timeout)) { + $line .= fgets($this->fp, $this->lineLength); + if (substr($line, -1) == "\n") { + ob_end_clean(); + return rtrim($line, "\r\n"); + } + } + ob_end_clean(); + return $line; + } + + /** + * Read until the socket closes, or until there is no more data in + * the inner PHP buffer. If the inner buffer is empty, in blocking + * mode we wait for at least 1 byte of data. Therefore, in + * blocking mode, if there is no data at all to be read, this + * function will never exit (unless the socket is closed on the + * remote end). + * + * @access public + * + * @return string All data until the socket closes, or a PEAR_Error if + * not connected. + */ + function readAll() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $data = ''; + while (!feof($this->fp)) { + $data .= @fread($this->fp, $this->lineLength); + } + return $data; + } + + /** + * Runs the equivalent of the select() system call on the socket + * with a timeout specified by tv_sec and tv_usec. + * + * @param integer $state Which of read/write/error to check for. + * @param integer $tv_sec Number of seconds for timeout. + * @param integer $tv_usec Number of microseconds for timeout. + * + * @access public + * @return False if select fails, integer describing which of read/write/error + * are ready, or PEAR_Error if not connected. + */ + function select($state, $tv_sec, $tv_usec = 0) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $read = null; + $write = null; + $except = null; + if ($state & NET_SOCKET_READ) { + $read[] = $this->fp; + } + if ($state & NET_SOCKET_WRITE) { + $write[] = $this->fp; + } + if ($state & NET_SOCKET_ERROR) { + $except[] = $this->fp; + } + if (false === ($sr = stream_select($read, $write, $except, $tv_sec, $tv_usec))) { + return false; + } + + $result = 0; + if (count($read)) { + $result |= NET_SOCKET_READ; + } + if (count($write)) { + $result |= NET_SOCKET_WRITE; + } + if (count($except)) { + $result |= NET_SOCKET_ERROR; + } + return $result; + } + +} diff --git a/egw-pear/setup/setup.inc.php b/egw-pear/setup/setup.inc.php new file mode 100644 index 0000000000..9d3703a0f0 --- /dev/null +++ b/egw-pear/setup/setup.inc.php @@ -0,0 +1,49 @@ + 'PEAR - PHP Extension and Application Repository', + 'url' => 'http://pear.php.net', +); +$setup_info['egw-pear']['license'] = 'PHP'; +$setup_info['egw-pear']['description'] = + 'A place for PEAR modules modified for eGroupWare.'; + +$setup_info['egw-pear']['note'] = + 'This application is a place for PEAR modules used by eGroupWare, which are NOT YET available from pear, + because we patched them somehow and the PEAR modules are not released upstream. + This application is under the LGPL license because the GPL is not compatible with the PHP license. + If the modules are available from PEAR they do NOT belong here anymore.'; + +$setup_info['egw-pear']['maintainer'] = array( + 'name' => 'eGroupWare coreteam', + 'email' => 'egroupware-developers@lists.sourceforge.net', +); + +// installation checks for egw-pear +$setup_info['egw-pear']['check_install'] = array( + // we need pear itself to be installed + '' => array( + 'func' => 'pear_check', + 'from' => 'FMail', + ), + // Net_Socket is required from Net_IMAP & Net_Sieve + 'Net_Socket' => array( + 'func' => 'pear_check', + 'from' => 'FMail', + ), +); diff --git a/emailadmin/doc/dbmail.schema b/emailadmin/doc/dbmail.schema new file mode 100644 index 0000000000..a1e3469371 --- /dev/null +++ b/emailadmin/doc/dbmail.schema @@ -0,0 +1,71 @@ +# +# dbmail-ldap v3 directory schema +# +# Based on the Qmail schema +# Modified for dbmail by Paul Stevens +# Modified for dbmail by Lars Kneschke too +# +# This schema depends on: +# - core.schema +# - cosine.schema +# - nis.schema +# +# This schema conflicts with +# - qmailuser.schema + +# Attribute Type Definitions + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.1 NAME 'mailQuota' + DESC 'The amount of space the user can use until all further messages get bounced.' + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 + SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.2 NAME 'mailForwardingAddress' + DESC 'Address(es) to forward all incoming messages to.' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.3 NAME 'mailHost' + DESC 'Name or address of the MTA host to use for recipient' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.4 NAME 'dbmailUID' + DESC 'UID of the user on the mailsystem' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.5 NAME 'dbmailGID' + DESC 'GID of the user on the mailsystem' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.6 NAME 'mailAlternateAddress' + DESC 'Secondary (alias) mailaddresses for the same user' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.7 NAME 'deliveryMode' + DESC 'multi field entries of: normal, forwardonly' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.8 NAME 'accountStatus' + DESC 'The status of a user account: active, disabled' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE ) + +# Object Class Definitions + +objectclass ( 1.3.6.1.4.1.12340.6.2.2.1 NAME 'dbmailUser' + DESC 'DBMail-LDAP User' SUP top AUXILIARY + MUST ( uid $ mail ) + MAY ( userPassword $ uidNumber $ gidNumber $ mailQuota $ mailForwardingAddress $ mailHost $ mailAlternateAddress $ dbmailUID $ dbmailGID $ deliveryMode $ accountStatus ) ) + +objectclass ( 1.3.6.1.4.1.12340.6.2.2.2 NAME 'dbmailForwardingAddress' + DESC 'DBMail-LDAP Forwarding Address' SUP top AUXILIARY + MUST ( mail $ mailForwardingAddress ) ) diff --git a/emailadmin/doc/main.cf b/emailadmin/doc/main.cf new file mode 100644 index 0000000000..e7c741dd90 --- /dev/null +++ b/emailadmin/doc/main.cf @@ -0,0 +1,754 @@ +# Global Postfix configuration file. This file lists only a subset +# of all 300+ parameters. See the sample-xxx.cf files for a full list. +# +# The general format is lines with parameter = value pairs. Lines +# that begin with whitespace continue the previous line. A value can +# contain references to other $names or ${name}s. +# +# NOTE - CHANGE NO MORE THAN 2-3 PARAMETERS AT A TIME, AND TEST IF +# POSTFIX STILL WORKS AFTER EVERY CHANGE. + +# SOFT BOUNCE +# +# The soft_bounce parameter provides a limited safety net for +# testing. When soft_bounce is enabled, mail will remain queued that +# would otherwise bounce. This parameter disables locally-generated +# bounces, and prevents the SMTP server from rejecting mail permanently +# (by changing 5xx replies into 4xx replies). However, soft_bounce +# is no cure for address rewriting mistakes or mail routing mistakes. +# +#soft_bounce = no + +# LOCAL PATHNAME INFORMATION +# +# The queue_directory specifies the location of the Postfix queue. +# This is also the root directory of Postfix daemons that run chrooted. +# See the files in examples/chroot-setup for setting up Postfix chroot +# environments on different UNIX systems. +# +queue_directory = /var/spool/postfix + +# The command_directory parameter specifies the location of all +# postXXX commands. +# +command_directory = /usr/sbin + +# The daemon_directory parameter specifies the location of all Postfix +# daemon programs (i.e. programs listed in the master.cf file). This +# directory must be owned by root. +# +daemon_directory = /usr/lib/postfix + +# QUEUE AND PROCESS OWNERSHIP +# +# The mail_owner parameter specifies the owner of the Postfix queue +# and of most Postfix daemon processes. Specify the name of a user +# account THAT DOES NOT SHARE ITS USER OR GROUP ID WITH OTHER ACCOUNTS +# AND THAT OWNS NO OTHER FILES OR PROCESSES ON THE SYSTEM. In +# particular, don't specify nobody or daemon. PLEASE USE A DEDICATED +# USER. +# +mail_owner = postfix + +# The default_privs parameter specifies the default rights used by +# the local delivery agent for delivery to external file or command. +# These rights are used in the absence of a recipient user context. +# DO NOT SPECIFY A PRIVILEGED USER OR THE POSTFIX OWNER. +# +#default_privs = nobody + +# INTERNET HOST AND DOMAIN NAMES +# +# The myhostname parameter specifies the internet hostname of this +# mail system. The default is to use the fully-qualified domain name +# from gethostname(). $myhostname is used as a default value for many +# other configuration parameters. +# +#myhostname = host.domain.tld +#myhostname = virtual.domain.tld + +# The mydomain parameter specifies the local internet domain name. +# The default is to use $myhostname minus the first component. +# $mydomain is used as a default value for many other configuration +# parameters. +# +#mydomain = domain.tld + +# SENDING MAIL +# +# The myorigin parameter specifies the domain that locally-posted +# mail appears to come from. The default is to append $myhostname, +# which is fine for small sites. If you run a domain with multiple +# machines, you should (1) change this to $mydomain and (2) set up +# a domain-wide alias database that aliases each user to +# user@that.users.mailhost. +# +# For the sake of consistency between sender and recipient addresses, +# myorigin also specifies the default domain name that is appended +# to recipient addresses that have no @domain part. +# +#myorigin = $myhostname +#myorigin = $mydomain + +# RECEIVING MAIL + +# The inet_interfaces parameter specifies the network interface +# addresses that this mail system receives mail on. By default, +# the software claims all active interfaces on the machine. The +# parameter also controls delivery of mail to user@[ip.address]. +# +# See also the proxy_interfaces parameter, for network addresses that +# are forwarded to us via a proxy or network address translator. +# +# Note: you need to stop/start Postfix when this parameter changes. +# +#inet_interfaces = all +#inet_interfaces = $myhostname +#inet_interfaces = $myhostname, localhost + +# The proxy_interfaces parameter specifies the network interface +# addresses that this mail system receives mail on by way of a +# proxy or network address translation unit. This setting extends +# the address list specified with the inet_interfaces parameter. +# +# You must specify your proxy/NAT addresses when your system is a +# backup MX host for other domains, otherwise mail delivery loops +# will happen when the primary MX host is down. +# +#proxy_interfaces = +#proxy_interfaces = 1.2.3.4 + +# The mydestination parameter specifies the list of domains that this +# machine considers itself the final destination for. +# +# These domains are routed to the delivery agent specified with the +# local_transport parameter setting. By default, that is the UNIX +# compatible delivery agent that lookups all recipients in /etc/passwd +# and /etc/aliases or their equivalent. +# +# The default is $myhostname + localhost.$mydomain. On a mail domain +# gateway, you should also include $mydomain. +# +# Do not specify the names of virtual domains - those domains are +# specified elsewhere (see sample-virtual.cf). +# +# Do not specify the names of domains that this machine is backup MX +# host for. Specify those names via the relay_domains settings for +# the SMTP server, or use permit_mx_backup if you are lazy (see +# sample-smtpd.cf). +# +# The local machine is always the final destination for mail addressed +# to user@[the.net.work.address] of an interface that the mail system +# receives mail on (see the inet_interfaces parameter). +# +# Specify a list of host or domain names, /file/name or type:table +# patterns, separated by commas and/or whitespace. A /file/name +# pattern is replaced by its contents; a type:table is matched when +# a name matches a lookup key (the right-hand side is ignored). +# Continue long lines by starting the next line with whitespace. +# +# DO NOT LIST RELAY DESTINATIONS IN MYDESTINATION. +# SPECIFY RELAY DESTINATIONS IN RELAY_DOMAINS. +# +# See also below, section "REJECTING MAIL FOR UNKNOWN LOCAL USERS". +# +#mydestination = $myhostname, localhost.$mydomain +#mydestination = $myhostname, localhost.$mydomain $mydomain +#mydestination = $myhostname, localhost.$mydomain, $mydomain, +# mail.$mydomain, www.$mydomain, ftp.$mydomain +mydestination = $myhostname, localhost.$mydomain $mydomain, + kneschke.de, phpgw.de, egroupware.org, linux-at-work.de, lists.kneschke.de + +# REJECTING MAIL FOR UNKNOWN LOCAL USERS +# +# The local_recipient_maps parameter specifies optional lookup tables +# with all names or addresses of users that are local with respect +# to $mydestination and $inet_interfaces. +# +# If this parameter is defined, then the SMTP server will reject +# mail for unknown local users. This parameter is defined by default. +# +# To turn off local recipient checking in the SMTP server, specify +# local_recipient_maps = (i.e. empty). +# +# The default setting assumes that you use the default Postfix local +# delivery agent for local delivery. You need to update the +# local_recipient_maps setting if: +# +# - You define $mydestination domain recipients in files other than +# /etc/passwd, /etc/aliases, or the $virtual_alias_maps files. +# For example, you define $mydestination domain recipients in +# the $virtual_mailbox_maps files. +# +# - You redefine the local delivery agent in master.cf. +# +# - You redefine the "local_transport" setting in main.cf. +# +# - You use the "luser_relay", "mailbox_transport", or "fallback_transport" +# feature of the Postfix local delivery agent (see sample-local.cf). +# +# Details are described in the LOCAL_RECIPIENT_README file. +# +# Beware: if the Postfix SMTP server runs chrooted, you probably have +# to access the passwd file via the proxymap service, in order to +# overcome chroot restrictions. The alternative, having a copy of +# the system passwd file in the chroot jail is just not practical. +# +# The right-hand side of the lookup tables is conveniently ignored. +# In the left-hand side, specify a bare username, an @domain.tld +# wild-card, or specify a user@domain.tld address. +# +#local_recipient_maps = unix:passwd.byname $alias_maps +#local_recipient_maps = proxy:unix:passwd.byname $alias_maps +#local_recipient_maps = + +# The unknown_local_recipient_reject_code specifies the SMTP server +# response code when a recipient domain matches $mydestination or +# $inet_interfaces, while $local_recipient_maps is non-empty and the +# recipient address or address local-part is not found. +# +# The default setting is 550 (reject mail) but it is safer to start +# with 450 (try again later) until you are certain that your +# local_recipient_maps settings are OK. +# +unknown_local_recipient_reject_code = 550 +#unknown_local_recipient_reject_code = 450 + +# TRUST AND RELAY CONTROL + +# The mynetworks parameter specifies the list of "trusted" SMTP +# clients that have more privileges than "strangers". +# +# In particular, "trusted" SMTP clients are allowed to relay mail +# through Postfix. See the smtpd_recipient_restrictions parameter +# in file sample-smtpd.cf. +# +# You can specify the list of "trusted" network addresses by hand +# or you can let Postfix do it for you (which is the default). +# +# By default (mynetworks_style = subnet), Postfix "trusts" SMTP +# clients in the same IP subnetworks as the local machine. +# On Linux, this does works correctly only with interfaces specified +# with the "ifconfig" command. +# +# Specify "mynetworks_style = class" when Postfix should "trust" SMTP +# clients in the same IP class A/B/C networks as the local machine. +# Don't do this with a dialup site - it would cause Postfix to "trust" +# your entire provider's network. Instead, specify an explicit +# mynetworks list by hand, as described below. +# +# Specify "mynetworks_style = host" when Postfix should "trust" +# only the local machine. +# +#mynetworks_style = class +#mynetworks_style = subnet +#mynetworks_style = host + +# Alternatively, you can specify the mynetworks list by hand, in +# which case Postfix ignores the mynetworks_style setting. +# +# Specify an explicit list of network/netmask patterns, where the +# mask specifies the number of bits in the network part of a host +# address. +# +# You can also specify the absolute pathname of a pattern file instead +# of listing the patterns here. Specify type:table for table-based lookups +# (the value on the table right-hand side is not used). +# +#mynetworks = 168.100.189.0/28, 127.0.0.0/8 +#mynetworks = $config_directory/mynetworks +#mynetworks = hash:/etc/postfix/network_table + +# The relay_domains parameter restricts what destinations this system will +# relay mail to. See the smtpd_recipient_restrictions restriction in the +# file sample-smtpd.cf for detailed information. +# +# By default, Postfix relays mail +# - from "trusted" clients (IP address matches $mynetworks) to any destination, +# - from "untrusted" clients to destinations that match $relay_domains or +# subdomains thereof, except addresses with sender-specified routing. +# The default relay_domains value is $mydestination. +# +# In addition to the above, the Postfix SMTP server by default accepts mail +# that Postfix is final destination for: +# - destinations that match $inet_interfaces, +# - destinations that match $mydestination +# - destinations that match $virtual_alias_domains, +# - destinations that match $virtual_mailbox_domains. +# These destinations do not need to be listed in $relay_domains. +# +# Specify a list of hosts or domains, /file/name patterns or type:name +# lookup tables, separated by commas and/or whitespace. Continue +# long lines by starting the next line with whitespace. A file name +# is replaced by its contents; a type:name table is matched when a +# (parent) domain appears as lookup key. +# +# NOTE: Postfix will not automatically forward mail for domains that +# list this system as their primary or backup MX host. See the +# permit_mx_backup restriction in the file sample-smtpd.cf. +# +#relay_domains = $mydestination + +# INTERNET OR INTRANET + +# The relayhost parameter specifies the default host to send mail to +# when no entry is matched in the optional transport(5) table. When +# no relayhost is given, mail is routed directly to the destination. +# +# On an intranet, specify the organizational domain name. If your +# internal DNS uses no MX records, specify the name of the intranet +# gateway host instead. +# +# In the case of SMTP, specify a domain, host, host:port, [host]:port, +# [address] or [address]:port; the form [host] turns off MX lookups. +# +# If you're connected via UUCP, see also the default_transport parameter. +# +#relayhost = $mydomain +#relayhost = gateway.my.domain +#relayhost = uucphost +#relayhost = [an.ip.add.ress] + +# REJECTING UNKNOWN RELAY USERS +# +# The relay_recipient_maps parameter specifies optional lookup tables +# with all addresses in the domains that match $relay_domains. +# +# If this parameter is defined, then the SMTP server will reject +# mail for unknown relay users. This feature is off by default. +# +# The right-hand side of the lookup tables is conveniently ignored. +# In the left-hand side, specify an @domain.tld wild-card, or specify +# a user@domain.tld address. +# +#relay_recipient_maps = hash:/etc/postfix/relay_recipients + +# INPUT RATE CONTROL +# +# The in_flow_delay configuration parameter implements mail input +# flow control. This feature is turned on by default, although it +# still needs further development (it's disabled on SCO UNIX due +# to an SCO bug). +# +# A Postfix process will pause for $in_flow_delay seconds before +# accepting a new message, when the message arrival rate exceeds the +# message delivery rate. With the default 100 SMTP server process +# limit, this limits the mail inflow to 100 messages a second more +# than the number of messages delivered per second. +# +# Specify 0 to disable the feature. Valid delays are 0..10. +# +#in_flow_delay = 1s + +# ADDRESS REWRITING +# +# Insert text from sample-rewrite.cf if you need to do address +# masquerading. +# +# Insert text from sample-canonical.cf if you need to do address +# rewriting, or if you need username->Firstname.Lastname mapping. + +# ADDRESS REDIRECTION (VIRTUAL DOMAIN) +# +# Insert text from sample-virtual.cf if you need virtual domain support. + +# "USER HAS MOVED" BOUNCE MESSAGES +# +# Insert text from sample-relocated.cf if you need "user has moved" +# style bounce messages. Alternatively, you can bounce recipients +# with an SMTP server access table. See sample-smtpd.cf. + +# TRANSPORT MAP +# +# Insert text from sample-transport.cf if you need explicit routing. + +# ALIAS DATABASE +# +# The alias_maps parameter specifies the list of alias databases used +# by the local delivery agent. The default list is system dependent. +# +# On systems with NIS, the default is to search the local alias +# database, then the NIS alias database. See aliases(5) for syntax +# details. +# +# If you change the alias database, run "postalias /etc/aliases" (or +# wherever your system stores the mail alias file), or simply run +# "newaliases" to build the necessary DBM or DB file. +# +# It will take a minute or so before changes become visible. Use +# "postfix reload" to eliminate the delay. +# +#alias_maps = dbm:/etc/aliases +#alias_maps = hash:/etc/aliases +#alias_maps = hash:/etc/aliases, nis:mail.aliases +#alias_maps = netinfo:/aliases + +# The alias_database parameter specifies the alias database(s) that +# are built with "newaliases" or "sendmail -bi". This is a separate +# configuration parameter, because alias_maps (see above) may specify +# tables that are not necessarily all under control by Postfix. +# +#alias_database = dbm:/etc/aliases +#alias_database = dbm:/etc/mail/aliases +#alias_database = hash:/etc/aliases +#alias_database = hash:/etc/aliases, hash:/opt/majordomo/aliases + +# ADDRESS EXTENSIONS (e.g., user+foo) +# +# The recipient_delimiter parameter specifies the separator between +# user names and address extensions (user+foo). See canonical(5), +# local(8), relocated(5) and virtual(5) for the effects this has on +# aliases, canonical, virtual, relocated and .forward file lookups. +# Basically, the software tries user+foo and .forward+foo before +# trying user and .forward. +# +#recipient_delimiter = + + +# DELIVERY TO MAILBOX +# +# The home_mailbox parameter specifies the optional pathname of a +# mailbox file relative to a user's home directory. The default +# mailbox file is /var/spool/mail/user or /var/mail/user. Specify +# "Maildir/" for qmail-style delivery (the / is required). +# +#home_mailbox = Mailbox +#home_mailbox = Maildir/ + +# The mail_spool_directory parameter specifies the directory where +# UNIX-style mailboxes are kept. The default setting depends on the +# system type. +# +#mail_spool_directory = /var/mail +#mail_spool_directory = /var/spool/mail + +# The mailbox_command parameter specifies the optional external +# command to use instead of mailbox delivery. The command is run as +# the recipient with proper HOME, SHELL and LOGNAME environment settings. +# Exception: delivery for root is done as $default_user. +# +# Other environment variables of interest: USER (recipient username), +# EXTENSION (address extension), DOMAIN (domain part of address), +# and LOCAL (the address localpart). +# +# Unlike other Postfix configuration parameters, the mailbox_command +# parameter is not subjected to $parameter substitutions. This is to +# make it easier to specify shell syntax (see example below). +# +# Avoid shell meta characters because they will force Postfix to run +# an expensive shell process. Procmail alone is expensive enough. +# +# IF YOU USE THIS TO DELIVER MAIL SYSTEM-WIDE, YOU MUST SET UP AN +# ALIAS THAT FORWARDS MAIL FOR ROOT TO A REAL USER. +# +#mailbox_command = /some/where/procmail +#mailbox_command = /some/where/procmail -a "$EXTENSION" + +# The mailbox_transport specifies the optional transport in master.cf +# to use after processing aliases and .forward files. This parameter +# has precedence over the mailbox_command, fallback_transport and +# luser_relay parameters. +# +# Specify a string of the form transport:nexthop, where transport is +# the name of a mail delivery transport defined in master.cf. The +# :nexthop part is optional. For more details see the sample transport +# configuration file. +# +# NOTE: if you use this feature for accounts not in the UNIX password +# file, then you must update the "local_recipient_maps" setting in +# the main.cf file, otherwise the SMTP server will reject mail for +# non-UNIX accounts with "User unknown in local recipient table". +# +#mailbox_transport = lmtp:unix:/file/name +mailbox_transport = lmtp:unix:/var/imap/socket/lmtp +#mailbox_transport = cyrus + +# The fallback_transport specifies the optional transport in master.cf +# to use for recipients that are not found in the UNIX passwd database. +# This parameter has precedence over the luser_relay parameter. +# +# Specify a string of the form transport:nexthop, where transport is +# the name of a mail delivery transport defined in master.cf. The +# :nexthop part is optional. For more details see the sample transport +# configuration file. +# +# NOTE: if you use this feature for accounts not in the UNIX password +# file, then you must update the "local_recipient_maps" setting in +# the main.cf file, otherwise the SMTP server will reject mail for +# non-UNIX accounts with "User unknown in local recipient table". +# +#fallback_transport = lmtp:unix:/file/name +#fallback_transport = cyrus +#fallback_transport = + +# The luser_relay parameter specifies an optional destination address +# for unknown recipients. By default, mail for unknown@$mydestination +# and unknown@[$inet_interfaces] is returned as undeliverable. +# +# The following expansions are done on luser_relay: $user (recipient +# username), $shell (recipient shell), $home (recipient home directory), +# $recipient (full recipient address), $extension (recipient address +# extension), $domain (recipient domain), $local (entire recipient +# localpart), $recipient_delimiter. Specify ${name?value} or +# ${name:value} to expand value only when $name does (does not) exist. +# +# luser_relay works only for the default Postfix local delivery agent. +# +# NOTE: if you use this feature for accounts not in the UNIX password +# file, then you must specify "local_recipient_maps =" (i.e. empty) in +# the main.cf file, otherwise the SMTP server will reject mail for +# non-UNIX accounts with "User unknown in local recipient table". +# +#luser_relay = $user@other.host +#luser_relay = $local@other.host +#luser_relay = admin+$local + +# JUNK MAIL CONTROLS +# +# The controls listed here are only a very small subset. See the file +# sample-smtpd.cf for an elaborate list of anti-UCE controls. + +# The header_checks parameter specifies an optional table with patterns +# that each logical message header is matched against, including +# headers that span multiple physical lines. +# +# By default, these patterns also apply to MIME headers and to the +# headers of attached messages. With older Postfix versions, MIME and +# attached message headers were treated as body text. +# +# For details, see the sample-filter.cf file. +# +#header_checks = regexp:/etc/postfix/header_checks + +# FAST ETRN SERVICE +# +# Postfix maintains per-destination logfiles with information about +# deferred mail, so that mail can be flushed quickly with the SMTP +# "ETRN domain.tld" command, or by executing "sendmail -qRdomain.tld". +# +# By default, Postfix maintains deferred mail logfile information +# only for destinations that Postfix is willing to relay to (as +# specified in the relay_domains parameter). For other destinations, +# Postfix attempts to deliver ALL queued mail after receiving the +# SMTP "ETRN domain.tld" command, or after execution of "sendmail +# -qRdomain.tld". This can be slow when a lot of mail is queued. +# +# The fast_flush_domains parameter controls what destinations are +# eligible for this "fast ETRN/sendmail -qR" service. +# +#fast_flush_domains = $relay_domains +#fast_flush_domains = + +# The disable_vrfy_command parameter allows you to disable the SMTP +# VRFY command. This stops some techniques used by spammers to harvest +# email addresses. +# +disable_vrfy_command = yes + +# SHOW SOFTWARE VERSION OR NOT +# +# The smtpd_banner parameter specifies the text that follows the 220 +# code in the SMTP server's greeting banner. Some people like to see +# the mail version advertised. By default, Postfix shows no version. +# +# You MUST specify $myhostname at the start of the text. That is an +# RFC requirement. Postfix itself does not care. +# +#smtpd_banner = $myhostname ESMTP $mail_name +#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version) + +# PARALLEL DELIVERY TO THE SAME DESTINATION +# +# How many parallel deliveries to the same user or domain? With local +# delivery, it does not make sense to do massively parallel delivery +# to the same user, because mailbox updates must happen sequentially, +# and expensive pipelines in .forward files can cause disasters when +# too many are run at the same time. With SMTP deliveries, 10 +# simultaneous connections to the same domain could be sufficient to +# raise eyebrows. +# +# Each message delivery transport has its XXX_destination_concurrency_limit +# parameter. The default is $default_destination_concurrency_limit for +# most delivery transports. For the local delivery agent the default is 2. + +#local_destination_concurrency_limit = 2 +#default_destination_concurrency_limit = 20 + +# DEBUGGING CONTROL +# +# The debug_peer_level parameter specifies the increment in verbose +# logging level when an SMTP client or server host name or address +# matches a pattern in the debug_peer_list parameter. +# +debug_peer_level = 2 + +# The debug_peer_list parameter specifies an optional list of domain +# or network patterns, /file/name patterns or type:name tables. When +# an SMTP client or server host name or address matches a pattern, +# increase the verbose logging level by the amount specified in the +# debug_peer_level parameter. +# +#debug_peer_list = 127.0.0.1 +#debug_peer_list = some.domain + +# The debugger_command specifies the external command that is executed +# when a Postfix daemon program is run with the -D option. +# +# Use "command .. & sleep 5" so that the debugger can attach before +# the process marches on. If you use an X-based debugger, be sure to +# set up your XAUTHORITY environment variable before starting Postfix. +# +debugger_command = + PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin + xxgdb $daemon_directory/$process_name $process_id & sleep 5 + +# If you don't have X installed on the Postfix machine, try: +# debugger_command = +# PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont; +# echo where) | gdb $daemon_directory/$process_name $process_id 2>&1 +# >$config_directory/$process_name.$process_id.log & sleep 5 + +# INSTALL-TIME CONFIGURATION INFORMATION +# +# The following parameters are used when installing a new Postfix version. +# +# sendmail_path: The full pathname of the Postfix sendmail command. +# This is the Sendmail-compatible mail posting interface. +# +sendmail_path = /usr/sbin/sendmail + +# newaliases_path: The full pathname of the Postfix newaliases command. +# This is the Sendmail-compatible command to build alias databases. +# +newaliases_path = /usr/bin/newaliases + +# mailq_path: The full pathname of the Postfix mailq command. This +# is the Sendmail-compatible mail queue listing command. +# +mailq_path = /usr/bin/mailq + +# setgid_group: The group for mail submission and queue management +# commands. This must be a group name with a numerical group ID that +# is not shared with other accounts, not even with the Postfix account. +# +setgid_group = postdrop + +# manpage_directory: The location of the Postfix on-line manual pages. +# +manpage_directory = /usr/share/man + +# sample_directory: The location of the Postfix sample configuration files. +# +sample_directory = /usr/share/doc/postfix-2.0.19/sample + +# readme_directory: The location of the Postfix README files. +# +readme_directory = /usr/share/doc/postfix-2.0.19/readme +default_destination_concurrency_limit = 2 +#alias_database = hash:/etc/mail/aliases +local_destination_concurrency_limit = 2 +alias_maps = hash:/etc/mail/aliases + +content_filter = smtp-amavis:[127.0.0.1]:10024 +queue_minfree = 100000000 +message_size_limit = 50000000 +mailbox_size_limit = 500000000 +smtpd_helo_required=yes +smtpd_helo_restrictions=permit_mynetworks, reject_invalid_hostname, reject_invalid_hostname +smtpd_sender_restrictions=permit_mynetworks, reject_unknown_sender_domain, reject_non_fqdn_sender + +virtual_maps = ldap:aliases, ldap:mailboxes + +aliases_server_host = 127.0.0.1 +aliases_search_base = dc=domain,dc=loc +aliases_query_filter = (&(|(mail=%s)(mailalternateaddress=%s))(objectclass=posixaccount)(deliveryMode=forwardonly)(accountstatus=active)) +aliases_bind_dn = cn=thepostfixadmin,dc=domain,dc=loc +aliases_bind_pw = thepassword +aliases_result_attribute = mailforwardingaddress +aliases_version = 3 + +mailboxes_server_host = 127.0.0.1 +mailboxes_search_base = dc=domain,dc=loc +mailboxes_query_filter = (&(|(mail=%s)(mailalternateaddress=%s))(objectclass=posixaccount)(accountstatus=active)) +mailboxes_bind_dn = cn=thepostfixadmin,dc=domain,dc=loc +mailboxes_bind_pw = thepassword +mailboxes_result_attribute = uid, mailforwardingaddress +mailboxes_version = 3 + + +#SMTPD mit SASL-Authentification verwenden +smtpd_sasl_auth_enable = yes + +#Zusatz-Optionen: Keine anonyme-Anmeldung verwenden +smtpd_sasl_security_options = noanonymous + +#Wieder ein Workaround für ältere Clients und Outlook +broken_sasl_auth_clients = yes + +# ODER meine Netze und SASL erlauben +smtpd_recipient_restrictions = + permit_mynetworks, + permit_sasl_authenticated, + reject_rbl_client relays.ordb.org, + reject_rbl_client sbl-xbl.spamhaus.org, + reject_rbl_client opm.blitzed.org, + reject_rbl_client dnsbl.njabl.org, + reject_rbl_client blackholes.wirehub.net, + reject_rbl_client list.dsbl.org, + reject_rbl_client dnsbl.sorbs.net, + reject_unauth_destination, + reject_non_fqdn_sender, + reject_non_fqdn_recipient, + reject_unauth_pipelining, + reject_unknown_sender_domain, + reject_unknown_recipient_domain + +# reject_unknown_client +# reject_rbl_client proxies.relays.monkeys.com, + +# incoming SSL +smtpd_use_tls = yes +#smtpd_tls_auth_only = yes +smtpd_tls_key_file = /etc/ssl/private/smtp.linux-at-work.de/smtp.linux-at-work.de.key +smtpd_tls_cert_file = /etc/ssl/private/smtp.linux-at-work.de/smtp.linux-at-work.de.crt +smtpd_tls_CAfile = /etc/ssl/certs/ca-cert.pem +smtpd_tls_loglevel = 1 +smtpd_tls_received_header = yes +smtpd_tls_session_cache_timeout = 3600s +tls_random_source = dev:/dev/urandom + +#outgoing SSL +smtp_tls_key_file = /etc/ssl/private/smtp.linux-at-work.de/smtp.linux-at-work.de.key +smtp_tls_cert_file = /etc/ssl/private/smtp.linux-at-work.de/smtp.linux-at-work.de.crt +smtp_tls_CAfile = /etc/ssl/certs/ca-cert.pem +smtp_tls_CApath = /etc/ssl/certs +smtp_tls_loglevel = 2 +# The server and client negotiate a session, which takes some computer time +# and network bandwidth. The session is cached only in the smtpd process +# actually using this session and is lost when the process dies. +# To share the session information between the smtp processes, a disc based +# session cache can be used based on the SDBM databases (routines included +# in Postfix/TLS). Since concurrent writing must be supported, only SDBM +# can be used. +# +smtp_tls_session_cache_database = sdbm:/etc/postfix/smtp_scache + +# By default TLS is disabled, so no difference to plain postfix is visible. +# If you enable TLS it will be used when offered by the server. +# WARNING: I didn't have access to other software (except those explicitely +# listed) to test the interaction. On corresponding mailing list +# there was a discussion going on about MS exchange servers offering +# STARTTLS even if it is not configured, so it might be wise to not +# use this option on your central mail hub, as you don't know in advance +# whether you are going to hit such host. Use the recipient/site specific +# options instead. +# HINT: I have it switched on on my mailservers and did experience one +# single failure since client side TLS is implemented. (There was one +# misconfired MS Exchange server; I contacted ths admin.) Hence, I am happy +# with it running all the time, but I am interested in testing anyway. +# You have been warned, however :-) +# +# In case of failure, a "4xx" code is issued and the mail stays in the queue. +# +# Explicitely switch it on here, if you want it. +# +#smtp_use_tls = yes diff --git a/emailadmin/doc/qmailuser.schema b/emailadmin/doc/qmailuser.schema new file mode 100644 index 0000000000..336761e6af --- /dev/null +++ b/emailadmin/doc/qmailuser.schema @@ -0,0 +1,103 @@ +# +# qmail-ldap v3 directory schema +# +# The offical qmail-ldap OID assigned by IANA is 7914 +# +# Created by: David E. Storey +# +# Modified and included into qmail-ldap by Andre Oppermann +# +# Schema fixes by Mike Jackson +# +# +# This schema depends on: +# - core.schema +# - cosine.schema +# - nis.schema +# + +# +# Example from new format +# +# attributetype ( 1.3.6.1.1.1.1.0 NAME 'uidNumber' +# DESC 'An integer uniquely identifying a user in an administrative domain' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# Attribute Type Definitions + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.1 NAME 'qmailUID' + DESC 'UID of the user on the mailsystem' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.2 NAME 'qmailGID' + DESC 'GID of the user on the mailsystem' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.3 NAME 'mailMessageStore' + DESC 'Path to the maildir/mbox on the mail system' + EQUALITY caseExactIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.4 NAME 'mailAlternateAddress' + DESC 'Secondary (alias) mailaddresses for the same user' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.5 NAME 'mailQuota' + DESC 'The amount of space the user can use until all further messages get bounced.' + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.6 NAME 'mailHost' + DESC 'On which qmail server the messagestore of this user is located.' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.7 NAME 'mailForwardingAddress' + DESC 'Address(es) to forward all incoming messages to.' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.8 NAME 'deliveryProgramPath' + DESC 'Program to execute for all incoming mails.' + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.9 NAME 'qmailDotMode' + DESC 'Interpretation of .qmail files: both, dotonly, ldaponly, ldapwithprog, none' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.10 NAME 'deliveryMode' + DESC 'multi field entries of: normal, forwardonly, nombox, localdelivery, reply, echo' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.11 NAME 'mailReplyText' + DESC 'A reply text for every incoming message' + SUBSTR caseIgnoreSubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.12 NAME 'accountStatus' + DESC 'The status of a user account: active, nopop, disabled, deleted' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.14 NAME 'qmailAccountPurge' + DESC 'The earliest date when a mailMessageStore will be purged' + EQUALITY numericStringMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 SINGLE-VALUE ) + +# Object Class Definitions + +objectclass ( 1.3.6.1.4.1.7914.1.2.2.1 NAME 'qmailUser' + DESC 'QMail-LDAP User' SUP top AUXILIARY + MUST ( mail $ uid ) + MAY ( mailMessageStore $ homeDirectory $ userPassword $ + mailAlternateAddress $ qmailUID $ qmailGID $ mailQuota $ + mailHost $ mailForwardingAddress $ deliveryProgramPath $ + qmailDotMode $ deliveryMode $ mailReplyText $ + accountStatus $ qmailAccountPurge ) ) diff --git a/emailadmin/inc/class.ajaxemailadmin.inc.php b/emailadmin/inc/class.ajaxemailadmin.inc.php new file mode 100644 index 0000000000..5b479c03e5 --- /dev/null +++ b/emailadmin/inc/class.ajaxemailadmin.inc.php @@ -0,0 +1,46 @@ +bo = new emailadmin_bo(); + } + + function addACL($_accountName, $_aclData) + { + if(!empty($_accountName)) + { + $acl = implode('',(array)$_aclData['acl']); + $data = $this->bofelamimail->addACL($this->sessionDataAjax['folderName'], $_accountName, $acl); + #$response = new xajaxResponse(); + #$response->addScript("window.close();"); + #$response->addAssign("accountName", "value", $this->sessionDataAjax['folderName'].'-'.$_accountName.'-'.$acl); + #return $response->getXML(); + + } + } + + function updateACLView() + { + $folderACL = $this->bofelamimail->getIMAPACL($this->sessionDataAjax['folderName']); + + $response = new xajaxResponse(); + $response->addAssign("aclTable", "innerHTML", $this->createACLTable($folderACL)); + return $response->getXML(); + } + + } +?> diff --git a/emailadmin/inc/class.cyrusimap.inc.php b/emailadmin/inc/class.cyrusimap.inc.php new file mode 100644 index 0000000000..bf72b39e31 --- /dev/null +++ b/emailadmin/inc/class.cyrusimap.inc.php @@ -0,0 +1,209 @@ + + * @author Klaus Leithoff + * @author Lars Kneschke + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.defaultimap.inc.php"); + +/** + * Manages connection to Cyrus IMAP server + */ +class cyrusimap extends defaultimap +{ + /** + * Capabilities of this class (pipe-separated): default, sieve, admin, logintypeemail + */ + const CAPABILITIES = 'default|sieve|admin|logintypeemail'; + + // mailbox delimiter + var $mailboxDelimiter = '.'; + + // mailbox prefix + var $mailboxPrefix = ''; + + var $enableCyrusAdmin = false; + + var $cyrusAdminUsername; + + var $cyrusAdminPassword; + + /** + * Updates an account + * + * @param array $_hookValues only value for key 'account_lid' and 'new_passwd' is used + */ + function addAccount($_hookValues) + { + return $this->updateAccount($_hookValues); + } + + /** + * Delete an account + * + * @param array $_hookValues only value for key 'account_lid' is used + */ + function deleteAccount($_hookValues) + { + // some precausion to really delete just _one_ account + if (strpos($_hookValues['account_lid'],'%') !== false || + strpos($_hookValues['account_lid'],'*') !== false) + { + return false; + } + return !!$this->deleteUsers($_hookValues['account_lid']); + } + + /** + * Delete multiple (user-)mailboxes via a wildcard, eg. '%' for whole domain + * + * Domain is the configured domain and it uses the Cyrus admin user + * + * @return string $username='%' username containing wildcards, default '%' for all users of a domain + * @return int|boolean number of deleted mailboxes on success or false on error + */ + function deleteUsers($username='%') + { + if(!$this->enableCyrusAdmin || empty($username)) { + return false; + } + + // we need a admin connection + if($this->_connected === true && !$this->isAdminConnection) { + $this->disconnect(); + if(!$this->openConnection(true)) { + return false; + } + } + $mailboxName = $this->getUserMailboxString($username); + list($reference,$restriction) = explode($username,$mailboxName,2); + $mboxes = $this->getMailboxes($reference,$username.$restriction); + //error_log(__METHOD__."('$username') getMailboxes('$reference','$username$restriction') = ".array2string($mboxes)); + + foreach($mboxes as $mbox) { + // give the admin account the rights to delete this mailbox + if(PEAR::isError($this->setACL($mbox, $this->adminUsername, 'lrswipcda'))) { + $this->disconnect(); + return false; + } + + if(PEAR::isError($this->deleteMailbox($mbox))) { + $this->disconnect(); + return false; + } + } + $this->disconnect(); + + return count($mboxes); + } + + /** + * returns information about a user + * currently only supported information is the current quota + * + * @param string $_username + * @return array userdata + */ + function getUserData($_username) + { + if($this->_connected === true) { + //error_log(__METHOD__."try to disconnect"); + $this->disconnect(); + } + + $this->openConnection(true); + $userData = array(); + + if($quota = $this->getQuotaByUser($_username)) { + $userData['quotaLimit'] = $quota / 1024; + } + + $this->disconnect(); + + return $userData; + } + + /** + * Set information about a user + * currently only supported information is the current quota + * + * @param string $_username + * @param int $_quota + */ + function setUserData($_username, $_quota) + { + if(!$this->enableCyrusAdmin) { + return false; + } + + if($this->_connected === true) { + $this->disconnect(); + } + + // create a admin connection + if(!$this->openConnection(true)) { + return false; + } + + $mailboxName = $this->getUserMailboxString($_username); + + if((int)$_quota > 0) { + // enable quota + $quota_value = $this->setStorageQuota($mailboxName, (int)$_quota*1024); + } else { + // disable quota + $quota_value = $this->setStorageQuota($mailboxName, -1); + } + + $this->disconnect(); + + return true; + } + + /** + * Updates an account + * + * @param array $_hookValues only value for key 'account_lid' and 'new_passwd' is used + */ + function updateAccount($_hookValues) + { + if(!$this->enableCyrusAdmin) { + return false; + } + #_debug_array($_hookValues); + $username = $_hookValues['account_lid']; + if(isset($_hookValues['new_passwd'])) { + $userPassword = $_hookValues['new_passwd']; + } + + if($this->_connected === true) { + $this->disconnect(); + } + + // we need a admin connection + if(!$this->openConnection(true)) { + return false; + } + + // create the mailbox, with the account_lid, as it is passed from the hook values (gets transformed there if needed) + $mailboxName = $this->getUserMailboxString($username, $mailboxName); + // make sure we use the correct username here. + $username = $this->getMailBoxUserName($username); + $folderInfo = $this->getMailboxes('', $mailboxName, true); + if(empty($folderInfo)) { + if(!PEAR::isError($this->createMailbox($mailboxName))) { + if(PEAR::isError($this->setACL($mailboxName, $username, "lrswipcda"))) { + # log error message + } + } + } + $this->disconnect(); + } +} diff --git a/emailadmin/inc/class.dbmaildbmailuser.inc.php b/emailadmin/inc/class.dbmaildbmailuser.inc.php new file mode 100755 index 0000000000..fcb80143d3 --- /dev/null +++ b/emailadmin/inc/class.dbmaildbmailuser.inc.php @@ -0,0 +1,182 @@ + + * @author Klaus Leithoff + * @author Lars Kneschke + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.defaultimap.inc.php"); + +/** + * Support for DBMail IMAP with qmailUser LDAP schema + * + * @todo base this class on dbmailqmailuser or the other way around + */ +class dbmaildbmailuser extends defaultimap +{ + /** + * Capabilities of this class (pipe-separated): default, sieve, admin, logintypeemail + */ + const CAPABILITIES = 'default|sieve'; + + function addAccount($_hookValues) { + return $this->updateAccount($_hookValues); + } + + #function deleteAccount($_hookValues) { + #} + function getUserData($_username) { + $userData = array(); + + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; + } + + $filter = '(&(objectclass=posixaccount)(uid='. $_username .')(dbmailGID='. sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])) .'))'; + $justthese = array('dn', 'objectclass', 'mailQuota'); + if($sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese)) { + + if($info = ldap_get_entries($ds, $sri)) { + if(isset($info[0]['mailquota'][0])) { + $userData['quotaLimit'] = $info[0]['mailquota'][0] / 1048576; + } + } + } + return $userData; + } + + function updateAccount($_hookValues) { + if(!$uidnumber = (int)$_hookValues['account_id']) { + return false; + } + + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; + } + + $filter = '(&(objectclass=posixaccount)(uidnumber='. $uidnumber .'))'; + $justthese = array('dn', 'objectclass', 'dbmailUID', 'dbmailGID', 'mail'); + $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); + + if($info = ldap_get_entries($ds, $sri)) { + if((!in_array('dbmailuser',$info[0]['objectclass']) && !in_array('dbmailUser',$info[0]['objectclass'])) && $info[0]['mail']) { + $newData['objectclass'] = $info[0]['objectclass']; + unset($newData['objectclass']['count']); + $newData['objectclass'][] = 'dbmailuser'; + sort($newData['objectclass']); + $newData['dbmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + $newData['dbmailUID'] = (!empty($this->domainName)) ? $_hookValues['account_lid'] .'@'. $this->domainName : $_hookValues['account_lid']; + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + } + + return true; + } else { + $newData = array(); + $newData['dbmailUID'] = (!empty($this->domainName)) ? $_hookValues['account_lid'] .'@'. $this->domainName : $_hookValues['account_lid']; + $newData['dbmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + print ldap_error($ds); + _debug_array($newData); + exit; + #return false; + } + } + } + + return false; + } + + function setUserData($_username, $_quota) { + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; + } + + $filter = '(&(objectclass=posixaccount)(uid='. $_username .'))'; + $justthese = array('dn', 'objectclass', 'dbmailGID', 'dbmailUID', 'mail'); + $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); + + if($info = ldap_get_entries($ds, $sri)) { + $validLDAPConfig = false; + if(in_array('dbmailuser',$info[0]['objectclass']) || in_array('dbmailUser',$info[0]['objectclass'])) { + $validLDAPConfig = true; + } + + if(!in_array('dbmailuser',$info[0]['objectclass']) && !in_array('dbmailUser',$info[0]['objectclass']) && $info[0]['mail']) { + $newData['objectclass'] = $info[0]['objectclass']; + unset($newData['objectclass']['count']); + $newData['objectclass'][] = 'dbmailUser'; + sort($newData['objectclass']); + $newData['dbmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + $newData['dbmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; + + if(ldap_modify($ds, $info[0]['dn'], $newData)) { + $validLDAPConfig = true; + } + } else { + if ((in_array('dbmailuser',$info[0]['objectclass']) || in_array('dbmailUser',$info[0]['objectclass'])) && !$info[0]['dbmailuid']) { + $newData = array(); + $newData['dbmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + #return false; + } + } + + if ((in_array('dbmailuser',$info[0]['objectclass']) || in_array('dbmailUser',$info[0]['objectclass'])) && !$info[0]['dbmailgid']) { + $newData = array(); + $newData['dbmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + #return false; + } + } + } + + if($validLDAPConfig) { + $newData = array(); + + if((int)$_quota >= 0) { + $newData['mailQuota'] = (int)$_quota * 1048576; + } else { + $newData['mailQuota'] = array(); + } + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + return false; + } + } + return true; + } + return false; + } +} diff --git a/emailadmin/inc/class.dbmailqmailuser.inc.php b/emailadmin/inc/class.dbmailqmailuser.inc.php new file mode 100644 index 0000000000..1933778a2a --- /dev/null +++ b/emailadmin/inc/class.dbmailqmailuser.inc.php @@ -0,0 +1,161 @@ + + * @author Klaus Leithoff + * @author Lars Kneschke + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.defaultimap.inc.php"); + +/** + * Support for DBMail IMAP with qmailUser LDAP schema + * + * @todo base this class on dbmaildbmailuser or the other way around + */ +class dbmailqmailuser extends defaultimap +{ + /** + * Capabilities of this class (pipe-separated): default, sieve, admin, logintypeemail + */ + const CAPABILITIES = 'default|sieve'; + + function addAccount($_hookValues) { + return $this->updateAccount($_hookValues); + } + + #function deleteAccount($_hookValues) { + #} + function getUserData($_username) { + $userData = array(); + + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; + } + + $filter = '(&(objectclass=posixaccount)(uid='. $_username .')(qmailGID='. sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])) .'))'; + $justthese = array('dn', 'objectclass', 'mailQuota'); + if($sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese)) { + + if($info = ldap_get_entries($ds, $sri)) { + if(isset($info[0]['mailquota'][0])) { + $userData['quotaLimit'] = $info[0]['mailquota'][0] / 1048576; + } + } + } + return $userData; + } + + function updateAccount($_hookValues) { + if(!$uidnumber = (int)$_hookValues['account_id']) { + return false; + } + + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; + } + + $filter = '(&(objectclass=posixaccount)(uidnumber='. $uidnumber .'))'; + $justthese = array('dn', 'objectclass', 'qmailUID', 'qmailGID', 'mail'); + $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); + + if($info = ldap_get_entries($ds, $sri)) { + if(!in_array('qmailuser',$info[0]['objectclass']) && $info[0]['email']) { + $newData['objectclass'] = $info[0]['objectclass']; + unset($newData['objectclass']['count']); + $newData['objectclass'][] = 'qmailuser'; + sort($newData['objectclass']); + $newData['qmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + #$newData['qmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; + + ldap_modify($ds, $info[0]['dn'], $newData); + + return true; + } else { + $newData = array(); + $newData['qmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + #$newData['qmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + #return false; + } + } + } + + return false; + } + + function setUserData($_username, $_quota) { + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; + } + + $filter = '(&(objectclass=posixaccount)(uid='. $_username .'))'; + $justthese = array('dn', 'objectclass', 'qmailGID', 'mail'); + $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); + + if($info = ldap_get_entries($ds, $sri)) { + #_debug_array($info); + if(!in_array('qmailuser',$info[0]['objectclass']) && $info[0]['email']) { + $newData['objectclass'] = $info[0]['objectclass']; + unset($newData['objectclass']['count']); + $newData['objectclass'][] = 'qmailuser'; + sort($newData['objectclass']); + $newData['qmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + + ldap_modify($ds, $info[0]['dn'], $newData); + } else { + if (in_array('qmailuser',$info[0]['objectclass']) && !$info[0]['qmailgid']) { + $newData = array(); + $newData['qmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + #return false; + } + } + } + + $newData = array(); + + if((int)$_quota >= 0) { + $newData['mailQuota'] = (int)$_quota * 1048576; + } else { + $newData['mailQuota'] = array(); + } + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + return false; + } + + return true; + } + + return false; + } +} diff --git a/emailadmin/inc/class.defaultimap.inc.php b/emailadmin/inc/class.defaultimap.inc.php new file mode 100644 index 0000000000..d193bf764e --- /dev/null +++ b/emailadmin/inc/class.defaultimap.inc.php @@ -0,0 +1,669 @@ + + * @author Klaus Leithoff + * @author Lars Kneschke + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +require_once 'Net/IMAP.php'; + +define('IMAP_NAMESPACE_PERSONAL', 'personal'); +define('IMAP_NAMESPACE_OTHERS' , 'others'); +define('IMAP_NAMESPACE_SHARED' , 'shared'); +define('IMAP_NAMESPACE_ALL' , 'all'); + +/** + * This class holds all information about the imap connection. + * This is the base class for all other imap classes. + * + * Also proxies Sieve calls to emailadmin_sieve (eg. it behaves like the former felamimail bosieve), + * to allow IMAP plugins to also manage Sieve connection. + */ +class defaultimap extends Net_IMAP +{ + /** + * Capabilities of this class (pipe-separated): default, sieve, admin, logintypeemail + */ + const CAPABILITIES = 'default|sieve'; + + /** + * ImapServerId + * + * @var int + */ + var $ImapServerId; + + /** + * the password to be used for admin connections + * + * @var string + */ + var $adminPassword; + + /** + * the username to be used for admin connections + * + * @var string + */ + var $adminUsername; + + /** + * enable encryption + * + * @var bool + */ + var $encryption; + + /** + * the hostname/ip address of the imap server + * + * @var string + */ + var $host; + + /** + * the password for the user + * + * @var string + */ + var $password; + + /** + * the port of the imap server + * + * @var integer + */ + var $port = 143; + + /** + * the username + * + * @var string + */ + var $username; + + /** + * the domainname to be used for vmailmgr logins + * + * @var string + */ + var $domainName = false; + + /** + * validate ssl certificate + * + * @var bool + */ + var $validatecert; + + /** + * the mailbox delimiter + * + * @var string + */ + var $mailboxDelimiter = '/'; + + /** + * the mailbox prefix. maybe used by uw-imap only? + * + * @var string + */ + var $mailboxPrefix = '~/mail'; + + /** + * is the mbstring extension available + * + * @var unknown_type + */ + var $mbAvailable; + + /** + * Mailboxes which get automatic created for new accounts (INBOX == '') + * + * @var array + */ + var $imapLoginType; + var $defaultDomain; + + + /** + * disable internal conversion from/to ut7 + * get's used by Net_IMAP + * + * @var array + */ + var $_useUTF_7 = false; + + /** + * a debug switch + */ + var $debug = false; + + /** + * Sieve available + * + * @var boolean + */ + var $enableSieve = false; + + /** + * Hostname / IP of sieve host + * + * @var string + */ + var $sieveHost; + + /** + * Port of Sieve service + * + * @var int + */ + var $sievePort = 2000; + + /** + * the construtor + * + * @return void + */ + function __construct() + { + if (function_exists('mb_convert_encoding')) { + $this->mbAvailable = TRUE; + } + + $this->restoreSessionData(); + + // construtor for Net_IMAP stuff + $this->Net_IMAPProtocol(); + } + + /** + * Magic method to re-connect with the imapserver, if the object get's restored from the session + */ + function __wakeup() + { + #$this->openConnection($this->isAdminConnection); // we need to re-connect + } + + /** + * adds a account on the imap server + * + * @param array $_hookValues + * @return bool true on success, false on failure + */ + function addAccount($_hookValues) + { + return true; + } + + /** + * updates a account on the imap server + * + * @param array $_hookValues + * @return bool true on success, false on failure + */ + function updateAccount($_hookValues) + { + return true; + } + + /** + * deletes a account on the imap server + * + * @param array $_hookValues + * @return bool true on success, false on failure + */ + function deleteAccount($_hookValues) + { + return true; + } + + function disconnect() + { + //error_log(__METHOD__.function_backtrace()); + $retval = parent::disconnect(); + if( PEAR::isError($retval)) error_log(__METHOD__.$retval->message); + $this->_connected = false; + } + + /** + * converts a foldername from current system charset to UTF7 + * + * @param string $_folderName + * @return string the encoded foldername + */ + function encodeFolderName($_folderName) + { + if($this->mbAvailable) { + return mb_convert_encoding($_folderName, "UTF7-IMAP", $GLOBALS['egw']->translation->charset()); + } + + // if not + // we can encode only from ISO 8859-1 + return imap_utf7_encode($_folderName); + } + + /** + * returns the supported capabilities of the imap server + * return false if the imap server does not support capabilities + * + * @return array the supported capabilites + */ + function getCapabilities() + { + if(!is_array($this->sessionData['capabilities'][$this->host])) { + return false; + } + + return $this->sessionData['capabilities'][$this->host]; + } + + /** + * return the delimiter used by the current imap server + * + * @return string the delimimiter + */ + function getDelimiter() + { + return isset($this->sessionData['delimiter'][$this->host]) ? $this->sessionData['delimiter'][$this->host] : $this->mailboxDelimiter; + } + + /** + * Create transport string + * + * @return string the transportstring + */ + function _getTransportString() + { + if($this->encryption == 2) { + $connectionString = "tls://". $this->host; + } elseif($this->encryption == 3) { + $connectionString = "ssl://". $this->host; + } else { + // no tls + $connectionString = $this->host; + } + + return $connectionString; + } + + /** + * Create the options array for SSL/TLS connections + * + * @return string the transportstring + */ + function _getTransportOptions() + { + if($this->validatecert === false) { + if($this->encryption == 2) { + return array( + 'tls' => array( + 'verify_peer' => false, + 'allow_self_signed' => true, + ) + ); + } elseif($this->encryption == 3) { + return array( + 'ssl' => array( + 'verify_peer' => false, + 'allow_self_signed' => true, + ) + ); + } + } else { + if($this->encryption == 2) { + return array( + 'tls' => array( + 'verify_peer' => true, + 'allow_self_signed' => false, + ) + ); + } elseif($this->encryption == 3) { + return array( + 'ssl' => array( + 'verify_peer' => true, + 'allow_self_signed' => false, + ) + ); + } + } + + return null; + } + + /** + * get the effective Username for the Mailbox, as it is depending on the loginType + * @param string $_username + * @return string the effective username to be used to access the Mailbox + */ + function getMailBoxUserName($_username) + { + switch ($this->loginType) + { + case 'email': + $_username = $_username; + $accountID = $GLOBALS['egw']->accounts->name2id($_username); + $accountemail = $GLOBALS['egw']->accounts->id2name($accountID,'account_email'); + //$accountemail = $GLOBALS['egw']->accounts->read($GLOBALS['egw']->accounts->name2id($_username,'account_email')); + if (!empty($accountemail)) + { + list($lusername,$domain) = explode('@',$accountemail,2); + if (strtolower($domain) == strtolower($this->domainName) && !empty($lusername)) + { + $_username = $lusername; + } + } + break; + + case 'uidNumber': + $_username = 'u'.$GLOBALS['egw']->accounts->name2id($_username); + break; + } + return $_username; + } + + /** + * Create mailbox string from given mailbox-name and user-name + * + * @param string $_folderName='' + * @return string utf-7 encoded (done in getMailboxName) + */ + function getUserMailboxString($_username, $_folderName='') + { + $nameSpaces = $this->getNameSpaces(); + + if(!isset($nameSpaces['others'])) { + return false; + } + + $_username = $this->getMailBoxUserName($_username); + if($this->loginType == 'vmailmgr' || $this->loginType == 'email' || $this->loginType == 'uidNumber') { + $_username .= '@'. $this->domainName; + } + + $mailboxString = $nameSpaces['others'][0]['name'] . $_username . (!empty($_folderName) ? $nameSpaces['others'][0]['delimiter'] . $_folderName : ''); + + return $mailboxString; + } + /** + * get list of namespaces + * + * @return array array containing information about namespace + */ + function getNameSpaces() + { + if(!$this->_connected) { + return false; + } + $retrieveDefault = false; + if($this->hasCapability('NAMESPACE')) { + $nameSpace = $this->getNamespace(); + if( PEAR::isError($nameSpace)) { + //error_log("emailadmin::defaultimap->getNameSpaces: called from->".function_backtrace()); + if ($this->debug) error_log("emailadmin::defaultimap->getNameSpaces:".print_r($nameSpace,true)); + $retrieveDefault = true; + } else { + $result = array(); + + $result['personal'] = $nameSpace['personal']; + + if(is_array($nameSpace['others'])) { + $result['others'] = $nameSpace['others']; + } + + if(is_array($nameSpace['shared'])) { + $result['shared'] = $nameSpace['shared']; + } + } + } + if (!$this->hasCapability('NAMESPACE') || $retrieveDefault) { + $delimiter = $this->getHierarchyDelimiter(); + if( PEAR::isError($delimiter)) $delimiter = '/'; + + $result['personal'] = array( + 0 => array( + 'name' => '', + 'delimiter' => $delimiter + ) + ); + } + + return $result; + } + + /** + * returns the quota for given foldername + * gets quota for the current user only + * + * @param string $_folderName + * @return string the current quota for this folder + */ +# function getQuota($_folderName) +# { +# if(!is_resource($this->mbox)) { +# $this->openConnection(); +# } +# +# if(function_exists('imap_get_quotaroot') && $this->supportsCapability('QUOTA')) { +# $quota = @imap_get_quotaroot($this->mbox, $this->encodeFolderName($_folderName)); +# if(is_array($quota) && isset($quota['STORAGE'])) { +# return $quota['STORAGE']; +# } +# } +# +# return false; +# } + + /** + * return the quota for another user + * used by admin connections only + * + * @param string $_username + * @return string the quota for specified user + */ + function getQuotaByUser($_username) + { + $mailboxName = $this->getUserMailboxString($_username); + //error_log(__METHOD__.$mailboxName); + $storageQuota = $this->getStorageQuota($mailboxName); + //error_log(__METHOD__.$_username); + //error_log(__METHOD__.$mailboxName); + if ( PEAR::isError($storageQuota)) error_log(__METHOD__.$storageQuota->message); + if(is_array($storageQuota) && isset($storageQuota['QMAX'])) { + return (int)$storageQuota['QMAX']; + } + + return false; + } + + /** + * returns information about a user + * + * Only a stub, as admin connection requires, which is only supported for Cyrus + * + * @param string $_username + * @return array userdata + */ + function getUserData($_username) + { + return array(); + } + + /** + * opens a connection to a imap server + * + * @param bool $_adminConnection create admin connection if true + * + * @return resource the imap connection + */ + function openConnection($_adminConnection=false) + { + //error_log(__METHOD__.function_backtrace()); + //error_log(__METHOD__.__LINE__.($_adminConnection?' Adminconnection':'').array2string($this)); + unset($this->_connectionErrorObject); + + if($_adminConnection) { + $username = $this->adminUsername; + $password = $this->adminPassword; + $options = ''; + $this->isAdminConnection = true; + } else { + $username = $this->loginName; + $password = $this->password; + $options = $_options; + $this->isAdminConnection = false; + } + + $this->setStreamContextOptions($this->_getTransportOptions()); + $this->setTimeout(20); + if( PEAR::isError($status = parent::connect($this->_getTransportString(), $this->port, $this->encryption == 1)) ) { + if ($this->debug) error_log(__METHOD__."Could not connect with ".$this->_getTransportString()." on Port ".$this->port." Encryption==1?".$this->encryption); + if ($this->debug) error_log(__METHOD__."Status connect:".$status->message); + $this->_connectionErrorObject = $status; + return false; + } + if(empty($username)) + { + if ($this->debug) error_log(__METHOD__."No username supplied.".function_backtrace()); + return false; + } + if( PEAR::isError($status = parent::login($username, $password, 'LOGIN', !$this->isAdminConnection)) ) { + if ($this->debug) error_log(__METHOD__."Could not log in with ->".$username.":".$password."<-"); + if ($this->debug) error_log(__METHOD__."Status login:".array2string($status->message)); + //error_log(__METHOD__.'Called from:'.function_backtrace()); + $this->disconnect(); + $this->_connectionErrorObject = $status; + return false; + } + + return true; + } + + /** + * restore session variable + * + */ + function restoreSessionData() + { + $this->sessionData = $GLOBALS['egw']->session->appsession('imap_session_data'); + } + + /** + * save session variable + * + */ + function saveSessionData() + { + $GLOBALS['egw']->session->appsession('imap_session_data','',$this->sessionData); + } + + /** + * set userdata + * + * @param string $_username username of the user + * @param int $_quota quota in bytes + * @return bool true on success, false on failure + */ + function setUserData($_username, $_quota) + { + return true; + } + + /** + * check if imap server supports given capability + * + * @param string $_capability the capability to check for + * @return bool true if capability is supported, false if not + */ + function supportsCapability($_capability) + { + return $this->hasCapability($_capability); + } + + /** + * Instance of emailadmin_sieve + * + * @var emailadmin_sieve + */ + private $sieve; + + public $scriptName; + public $error; + + //public $error; + + /** + * Proxy former felamimail bosieve methods to internal emailadmin_sieve instance + * + * @param string $name + * @param array $params + */ + public function __call($name,array $params=null) + { + if ($this->debug) error_log(__METHOD__.'->'.$name.' with params:'.array2string($params)); + switch($name) + { + case 'installScript': + case 'getScript': + case 'setActive': + case 'setEmailNotification': + case 'getEmailNotification': + case 'setRules': + case 'getRules': + case 'retrieveRules': + case 'getVacation': + case 'setVacation': + if (is_null($this->sieve)) + { + $this->sieve = new emailadmin_sieve($this); + $this->scriptName =& $this->sieve->scriptName; + $this->error =& $this->sieve->error; + } + $ret = call_user_func_array(array($this->sieve,$name),$params); + //error_log(__CLASS__.'->'.$name.'('.array2string($params).') returns '.array2string($ret)); + return $ret; + } + throw new egw_exception_wrong_parameter("No method '$name' implemented!"); + } + + public function setVacationUser($_euser, $_scriptName, $_vacation) + { + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.' User:'.array2string($_euser).' Scriptname:'.array2string($_scriptName).' VacationMessage:'.array2string($_vacation)); + if (is_null($this->sieve)) + { + $this->sieve = new emailadmin_sieve(); + $this->scriptName =& $this->sieve->scriptName; + $this->error =& $this->sieve->error; + $this->sieve->icServer = $this; + } + return $this->sieve->setVacationUser($_euser, $_scriptName, $_vacation); + } + + /** + * set the asyncjob for a timed vacation + * + * @param array $_vacation the vacation to set/unset + * @return void + */ + function setAsyncJob ($_vacation, $_scriptName=null) + { + // setting up an async job to enable/disable the vacation message + $async = new asyncservice(); + $user = (isset($_vacation['account_id'])&&!empty($_vacation['account_id'])?$_vacation['account_id']:$GLOBALS['egw_info']['user']['account_id']); + $async_id = (isset($_vacation['id'])&&!empty($_vacation['id'])?$_vacation['id']:"felamimail-vacation-$user"); + $async->delete($async_id); // ="felamimail-vacation-$user"); + $_scriptName = (!empty($_scriptName)?$_scriptName:(isset($_vacation['scriptName'])&&!empty($_vacation['scriptName'])?$_vacation['scriptName']:'felamimail')); + $end_date = $_vacation['end_date'] + 24*3600; // end-date is inclusive, so we have to add 24h + if ($_vacation['status'] == 'by_date' && time() < $end_date) + { + $time = time() < $_vacation['start_date'] ? $_vacation['start_date'] : $end_date; + $async->set_timer($time,$async_id,'felamimail.bosieve.async_vacation',$_vacation+array('scriptName'=>$_scriptName),$user); + } + } +} diff --git a/emailadmin/inc/class.defaultpop.inc.php b/emailadmin/inc/class.defaultpop.inc.php new file mode 100644 index 0000000000..ea623b3db4 --- /dev/null +++ b/emailadmin/inc/class.defaultpop.inc.php @@ -0,0 +1,94 @@ +profileData = $_profileData; + } + + function addAccount($_hookValues) + { + return true; + } + + function deleteAccount($_hookValues) + { + return true; + } + + function encodeFolderName($_folderName) + { + if($this->mbAvailable) + { + return mb_convert_encoding( $_folderName, "UTF7-IMAP", "ISO_8859-1" ); + } + + // if not + return imap_utf7_encode($_folderName); + } + + function getMailboxString($_folderName='') + { + if($this->profileData['imapTLSEncryption'] == 'yes' && + $this->profileData['imapTLSAuthentication'] == 'yes') + { + if(empty($this->profileData['imapPort'])) + $port = '995'; + else + $port = $this->profileData['imapPort']; + + $mailboxString = sprintf("{%s:%s/pop3/ssl}%s", + $this->profileData['imapServer'], + $port, + $_folderName); + } + // don't check cert + elseif($this->profileData['imapTLSEncryption'] == 'yes') + { + if(empty($this->profileData['imapPort'])) + $port = '995'; + else + $port = $this->profileData['imapPort']; + + $mailboxString = sprintf("{%s:%s/pop3/ssl/novalidate-cert}%s", + $this->profileData['imapServer'], + $port, + $_folderName); + } + // no tls + else + { + if(empty($this->profileData['imapPort'])) + $port = '110'; + else + $port = $this->profileData['imapPort']; + + $mailboxString = sprintf("{%s:%s/pop3}%s", + $this->profileData['imapServer'], + $port, + $_folderName); + } + + return $this->encodeFolderName($mailboxString); + } + + function updateAccount($_hookValues) + { + return true; + } + } +?> diff --git a/emailadmin/inc/class.defaultsmtp.inc.php b/emailadmin/inc/class.defaultsmtp.inc.php new file mode 100644 index 0000000000..75b6606cf8 --- /dev/null +++ b/emailadmin/inc/class.defaultsmtp.inc.php @@ -0,0 +1,97 @@ +defaultDomain = $defaultDomain ? $defaultDomain : $GLOBALS['egw_info']['server']['mail_suffix']; + } + + // add a account + function addAccount($_hookValues) + { + return true; + } + + // delete a account + function deleteAccount($_hookValues) + { + return true; + } + + function getAccountEmailAddress($_accountName) + { + $accountID = $GLOBALS['egw']->accounts->name2id($_accountName); + $emailAddress = $GLOBALS['egw']->accounts->id2name($accountID,'account_email'); + if(empty($emailAddress)) + $emailAddress = $_accountName.'@'.$this->defaultDomain; + + $realName = trim($GLOBALS['egw_info']['user']['firstname'] . (!empty($GLOBALS['egw_info']['user']['firstname']) ? ' ' : '') . $GLOBALS['egw_info']['user']['lastname']); + + return array( + array( + 'name' => $realName, + 'address' => $emailAddress, + 'type' => 'default' + ) + ); + } + + function getUserData($_uidnumber) { + $userData = array(); + + return $userData; + } + + function saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy) { + return true; + } + + function setUserData($_uidnumber, $_mailAlternateAddress, $_mailForwardingAddress, $_deliveryMode) { + return true; + } + + // update a account + function updateAccount($_hookValues) { + return true; + } + } +?> diff --git a/emailadmin/inc/class.ea_identity.inc.php b/emailadmin/inc/class.ea_identity.inc.php new file mode 100644 index 0000000000..aa8d19b7ec --- /dev/null +++ b/emailadmin/inc/class.ea_identity.inc.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/emailadmin/inc/class.ea_preferences.inc.php b/emailadmin/inc/class.ea_preferences.inc.php new file mode 100644 index 0000000000..9c209cb64a --- /dev/null +++ b/emailadmin/inc/class.ea_preferences.inc.php @@ -0,0 +1,160 @@ +identities[$_id]; + } + else + { + //error_log(__METHOD__.__LINE__.' called with $_id=-1 ->'.function_backtrace()); + return $this->identities; + } + } + + function getIncomingServer($_id = false) + { + if($_id !== false) + { + //error_log(__METHOD__.__LINE__.' called with $_id='.$_id.' ->'.function_backtrace()); + return $this->ic_server[$_id]; + } + else + { + //error_log(__METHOD__.__LINE__.' called with $_id=false ->'.function_backtrace()); + return $this->ic_server; + } + } + + function getOutgoingServer($_id = false) + { + if($_id !== false ) + { + return $this->og_server[$_id]; + } + else + { + //error_log(__METHOD__.__LINE__.' called with $_id=false ->'.function_backtrace()); + return $this->og_server; + } + } + + function getPreferences() { + return $this->preferences; + } + + function getUserEMailAddresses() { + $identities = $this->getIdentity(); + + if(count($identities) == 0) { + return false; + } + + $userEMailAdresses = array(); + + foreach($identities as $identity) { + $userEMailAdresses[$identity->emailAddress] = $identity->realName; + } + + return $userEMailAdresses; + } + + function setIdentity($_identityObject, $_id = false) + { + if(is_a($_identityObject, 'ea_identity')) + { + if($_id !== false) + { + $this->identities[$_id] = $_identityObject; + } + else + { + //error_log(__METHOD__.__LINE__.' called with $_id=false ->'.function_backtrace()); + $this->identities[] = $_identityObject; + } + + return true; + } + + return false; + } + + function setIncomingServer($_serverObject, $_id = false) + { + if(is_a($_serverObject, 'defaultimap')) + { + if($_id !== false) + { + $this->ic_server[$_id] = $_serverObject; + } + else + { + //error_log(__METHOD__.__LINE__.' called with $_id=false ->'.function_backtrace()); + $this->ic_server[] = $_serverObject; + } + + return true; + } + + return false; + } + + function setOutgoingServer($_serverObject, $_id = false) + { + if(is_a($_serverObject, 'defaultsmtp')) + { + if($_id !== false) + { + $this->og_server[$_id] = $_serverObject; + } + else + { + //error_log(__METHOD__.__LINE__.' called with $_id=false ->'.function_backtrace()); + $this->og_server[] = $_serverObject; + } + + return true; + } + + return false; + } + + function setPreferences($_preferences) + { + $this->preferences = $_preferences; + + return true; + } + } +?> diff --git a/emailadmin/inc/class.emailadmin_bo.inc.php b/emailadmin/inc/class.emailadmin_bo.inc.php new file mode 100644 index 0000000000..39232a1331 --- /dev/null +++ b/emailadmin/inc/class.emailadmin_bo.inc.php @@ -0,0 +1,925 @@ + + * @author Klaus Leithoff + * @author Lars Kneschke + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * Business logic + */ +class emailadmin_bo extends so_sql +{ + /** + * Name of our table + */ + const TABLE = 'egw_emailadmin'; + /** + * Name of app the table is registered + */ + const APP = 'emailadmin'; + /** + * Fields that are numeric + */ + static $numericfields = array( + 'ea_profile_id', + 'ea_smtp_port', + 'ea_smtp_auth', + 'ea_editforwardingaddress', + 'ea_smtp_ldap_use_default', + 'ea_imap_port', + 'ea_imap_tsl_auth', + 'ea_imap_tsl_encryption', + 'ea_imap_enable_cyrus', + 'ea_imap_enable_sieve', + 'ea_imap_sieve_port', + 'ea_user_defined_identities', + 'ea_user_defined_accounts', + 'ea_order', + 'ea_active', + 'ea_group', + 'ea_user', + 'ea_appname', + 'ea_user_defined_signatures', + ); + + static $sessionData = array(); + #var $userSessionData; + var $LDAPData; + + //var $SMTPServerType = array(); // holds a list of config options + static $SMTPServerType = array( + 'defaultsmtp' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType' + ), + 'description' => 'standard SMTP-Server', + 'classname' => 'defaultsmtp' + ), + 'postfixldap' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + 'editforwardingaddress', + 'smtpLDAPServer', + 'smtpLDAPAdminDN', + 'smtpLDAPAdminPW', + 'smtpLDAPBaseDN', + 'smtpLDAPUseDefault' + ), + 'description' => 'Postfix (qmail Schema)', + 'classname' => 'postfixldap' + ), + 'postfixinetorgperson' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + ), + 'description' => 'Postfix (inetOrgPerson Schema)', + 'classname' => 'postfixinetorgperson' + ), + 'smtpplesk' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + 'editforwardingaddress', + ), + 'description' => 'Plesk SMTP-Server (Qmail)', + 'classname' => 'smtpplesk' + ), + 'postfixdbmailuser' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + 'editforwardingaddress', + 'smtpLDAPServer', + 'smtpLDAPAdminDN', + 'smtpLDAPAdminPW', + 'smtpLDAPBaseDN', + 'smtpLDAPUseDefault' + ), + 'description' => 'Postfix (dbmail Schema)', + 'classname' => 'postfixdbmailuser' + ), + ); + //var $IMAPServerType = array(); // holds a list of config options + static $IMAPServerType = array( + 'defaultimap' => array( + 'fieldNames' => array( + 'imapServer', + 'imapPort', + 'imapType', + 'imapLoginType', + 'imapTLSEncryption', + 'imapTLSAuthentication', + 'imapAuthUsername', + 'imapAuthPassword' + ), + 'description' => 'standard IMAP server', + 'protocol' => 'imap', + 'classname' => 'defaultimap' + ), + 'cyrusimap' => array( + 'fieldNames' => array( + 'imapServer', + 'imapPort', + 'imapType', + 'imapLoginType', + 'imapTLSEncryption', + 'imapTLSAuthentication', + 'imapEnableCyrusAdmin', + 'imapAdminUsername', + 'imapAdminPW', + 'imapEnableSieve', + 'imapSieveServer', + 'imapSievePort', + 'imapAuthUsername', + 'imapAuthPassword' + ), + 'description' => 'Cyrus IMAP Server', + 'protocol' => 'imap', + 'classname' => 'cyrusimap' + ), + 'dbmailqmailuser' => array( + 'fieldNames' => array( + 'imapServer', + 'imapPort', + 'imapType', + 'imapLoginType', + 'imapTLSEncryption', + 'imapTLSAuthentication', + 'imapEnableSieve', + 'imapSieveServer', + 'imapSievePort', + 'imapAuthUsername', + 'imapAuthPassword', + ), + 'description' => 'DBMail (qmailUser schema)', + 'protocol' => 'imap', + 'classname' => 'dbmailqmailuser' + ), + 'pleskimap' => array( + 'fieldNames' => array( + 'imapServer', + 'imapPort', + 'imapType', + 'imapLoginType', + 'imapTLSEncryption', + 'imapTLSAuthentication', + 'imapAuthUsername', + 'imapAuthPassword' + ), + 'description' => 'Plesk IMAP Server (Courier)', + 'protocol' => 'imap', + 'classname' => 'pleskimap' + ), + 'dbmaildbmailuser' => array( + 'fieldNames' => array( + 'imapServer', + 'imapPort', + 'imapType', + 'imapLoginType', + 'imapTLSEncryption', + 'imapTLSAuthentication', + 'imapEnableSieve', + 'imapSieveServer', + 'imapSievePort', + 'imapAuthUsername', + 'imapAuthPassword' + ), + 'description' => 'DBMail (dbmailUser schema)', + 'protocol' => 'imap', + 'classname' => 'dbmaildbmailuser' + ), + ); + + var $imapClass; // holds the imap/pop3 class + var $smtpClass; // holds the smtp class + var $tracking; // holds the tracking object + + function __construct($_profileID=false,$_restoreSesssion=true) + { + parent::__construct(self::APP,self::TABLE,null,'',true); + //error_log(__METHOD__.function_backtrace()); + if (!is_object($GLOBALS['emailadmin_bo'])) + { + $GLOBALS['emailadmin_bo'] = $this; + } + $this->soemailadmin = new emailadmin_so(); + //translate the standard entry description + self::$SMTPServerType['defaultsmtp']['description'] = lang('standard SMTP-Server'); + self::$IMAPServerType['defaultimap']['description'] = lang('standard IMAP Server'); + if ($_restoreSesssion) // && !(is_array(self::$sessionData) && (count(self::$sessionData)>0)) ) + { + $this->restoreSessionData(); + } + if ($_restoreSesssion===false) // && (is_array(self::$sessionData) && (count(self::$sessionData)>0)) ) + { + // make sure session data will be created new + self::$sessionData = array(); + self::saveSessionData(); + } + #_debug_array(self::$sessionData); + if(!($_profileID === false)) + { + $this->profileID = $_profileID; + + $this->profileData = $this->getProfile($_profileID); + + // try autoloading class, if that fails include it from emailadmin + $class = self::$IMAPServerType[$this->profileData['imapType']]['classname']; + if (!empty($class)) + { + if (!class_exists($class)) + { + include_once(EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php'); + } + $this->imapClass = new $class; + } + $class = self::$SMTPServerType[$this->profileData['smtpType']]['classname']; + if (!empty($class)) + { + if (!class_exists($class)) + { + include_once(EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php'); + } + $this->smtpClass = new $class; + } + } + $this->tracking = new emailadmin_tracking($this); + } + + function delete($profileid=null) + { + if (empty($profileid)) return 0; + $deleted = parent::delete(array('ea_profile_id' => $profileid)); + if (!is_array($profileid)) $profileid = (array)$profileid; + foreach ($profileid as $tk => $pid) + { + self::$sessionData['profile'][$pid] = array(); + } + $GLOBALS['egw']->contenthistory->updateTimeStamp('emailadmin_profiles', $profileid, 'delete', time()); + self::saveSessionData(); + return $deleted; + } + + function save() + { + $content = $this->data; + $old = $this->read($content); + $this->data = $content; + if ((!isset($this->data['ea_appname']) || empty($this->data['ea_appname']) ) && + (!isset($this->data['ea_group']) || empty($this->data['ea_group']) ) && + (!isset($this->data['ea_user']) || empty($this->data['ea_user']) ) && + (isset($this->data['ea_active']) && !empty($this->data['ea_active']) && $this->data['ea_active'] )) + { + //error_log(__METHOD__.__LINE__.' Content to save:'.array2string($this->data)); + $new_config = array(); + foreach(array( + 'ea_imap_server' => 'mail_server', + 'ea_imap_type' => 'mail_server_type', + 'ea_imap_login_type' => 'mail_login_type', + 'ea_default_domain' => 'mail_suffix', + 'ea_smtp_server' => 'smtp_server', + 'ea_smtp_port' => 'smpt_port', + )+($this->data['ea_smtp_auth']=='yes' ? array( //ToDo: if no, we may have to reset config values for that too? + 'ea_smtp_auth_username' => 'smtp_auth_user', + 'ea_smtp_auth_password' => 'smtp_auth_passwd', + ) : array()) as $ea_name => $config_name) + { + if (isset($this->data[$ea_name])) + { + if ($ea_name != 'ea_imap_type') + { + $new_config[$config_name] = $this->data[$ea_name]; + } + else // imap type, no pop3 code anymore + { + $new_config[$config_name] = 'imap'.($this->data['ea_imap_tsl_encryption'] ? 's' : ''); + } + } + } + if (count($new_config)) + { + foreach($new_config as $name => $value) + { + //error_log(__METHOD__.__LINE__.' Saving to config:'."$name,$value,phpgwapi"); + config::save_value($name,$value,'phpgwapi'); + } + //echo "

eGW configuration update: ".print_r($new_config,true)."

\n"; + } + } + if (!($result = parent::save())) + { + $GLOBALS['egw']->contenthistory->updateTimeStamp('emailadmin_profiles', $this->data['ea_profile_id'], $old === false ? 'add' : 'modify', time()); + //error_log(__METHOD__.__LINE__.array2string($content)); + $this->tracking->track($content,(is_array($old)?$old:array()),null,false,null,true); + } + return $result; + } + + function addAccount($_hookValues) + { + if (is_object($this->imapClass)) + { + #ExecMethod("emailadmin.".$this->imapClass.".addAccount",$_hookValues,3,$this->profileData); + $this->imapClass->addAccount($_hookValues); + } + + if (is_object($this->smtpClass)) + { + #ExecMethod("emailadmin.".$this->smtpClass.".addAccount",$_hookValues,3,$this->profileData); + $this->smtpClass->addAccount($_hookValues); + } + self::$sessionData =array(); + $this->saveSessionData(); + } + + function deleteAccount($_hookValues) + { + if (is_object($this->imapClass)) + { + #ExecMethod("emailadmin.".$this->imapClass.".deleteAccount",$_hookValues,3,$this->profileData); + $this->imapClass->deleteAccount($_hookValues); + } + + if (is_object($this->smtpClass)) + { + #ExecMethod("emailadmin.".$this->smtpClass.".deleteAccount",$_hookValues,3,$this->profileData); + $this->smtpClass->deleteAccount($_hookValues); + } + self::$sessionData = array(); + $this->saveSessionData(); + } + + function getAccountEmailAddress($_accountName, $_profileID) + { + $profileData = $this->getProfile($_profileID); + + #$smtpClass = self::$SMTPServerType[$profileData['smtpType']]['classname']; + $smtpClass = CreateObject('emailadmin.'.self::$SMTPServerType[$profileData['smtpType']]['classname']); + + #return empty($smtpClass) ? False : ExecMethod("emailadmin.$smtpClass.getAccountEmailAddress",$_accountName,3,$profileData); + return is_object($smtpClass) ? $smtpClass->getAccountEmailAddress($_accountName) : False; + } + + function getFieldNames($_serverTypeID, $_class) + { + switch($_class) + { + case 'imap': + return self::$IMAPServerType[$_serverTypeID]['fieldNames']; + break; + case 'smtp': + return self::$SMTPServerType[$_serverTypeID]['fieldNames']; + break; + } + } + + function getLDAPStorageData($_serverid) + { + $storageData = $this->soemailadmin->getLDAPStorageData($_serverid); + return $storageData; + } + + function getMailboxString($_folderName) + { + if (is_object($this->imapClass)) + { + return ExecMethod("emailadmin.".$this->imapClass.".getMailboxString",$_folderName,3,$this->profileData); + return $this->imapClass->getMailboxString($_folderName); + } + else + { + return false; + } + } + + function getProfile($_profileID) + { + if (!(is_array(self::$sessionData) && (count(self::$sessionData)>0))) $this->restoreSessionData(); + if (is_array(self::$sessionData) && (count(self::$sessionData)>0) && self::$sessionData['profile'][$_profileID]) { + //error_log("sessionData Restored for Profile $_profileID
"); + return self::$sessionData['profile'][$_profileID]; + } + $profileData = $this->soemailadmin->getProfileList($_profileID); + $found = false; + if (is_array($profileData) && count($profileData)) + { + foreach($profileData as $n => $data) + { + if ($data['ProfileID'] == $_profileID) + { + $found = $n; + break; + } + } + } + if ($found === false) // no existing profile selected + { + if (is_array($profileData) && count($profileData)) { // if we have a profile use that + reset($profileData); + list($found,$data) = each($profileData); + $this->profileID = $_profileID = $data['profileID']; + } elseif ($GLOBALS['egw_info']['server']['smtp_server']) { // create a default profile, from the data in the api config + $this->profileID = $_profileID = $this->soemailadmin->addProfile(array( + 'description' => $GLOBALS['egw_info']['server']['smtp_server'], + 'defaultDomain' => $GLOBALS['egw_info']['server']['mail_suffix'], + 'organisationName' => '', + 'userDefinedAccounts' => '', + 'userDefinedIdentities' => '', + ),array( + 'smtpServer' => $GLOBALS['egw_info']['server']['smtp_server'], + 'smtpPort' => $GLOBALS['egw_info']['server']['smtp_port'], + 'smtpAuth' => '', + 'smtpType' => 'defaultsmtp', + ),array( + 'imapServer' => $GLOBALS['egw_info']['server']['mail_server'] ? + $GLOBALS['egw_info']['server']['mail_server'] : $GLOBALS['egw_info']['server']['smtp_server'], + 'imapPort' => '143', + 'imapType' => 'defaultimap', // imap + 'imapLoginType' => $GLOBALS['egw_info']['server']['mail_login_type'] ? + $GLOBALS['egw_info']['server']['mail_login_type'] : 'standard', + 'imapTLSEncryption' => '0', + 'imapTLSAuthentication' => '', + )); + $profileData[$found = 0] = array( + 'smtpType' => 'defaultsmtp', + 'imapType' => 'defaultimap', + ); + } + } + $fieldNames = array(); + if (isset($profileData[$found])) + { + $fieldNames = array_merge(self::$SMTPServerType[$profileData[$found]['smtpType']]['fieldNames'], + self::$IMAPServerType[$profileData[$found]['imapType']]['fieldNames']); + } + $fieldNames[] = 'description'; + $fieldNames[] = 'defaultDomain'; + $fieldNames[] = 'profileID'; + $fieldNames[] = 'organisationName'; + $fieldNames[] = 'userDefinedAccounts'; + $fieldNames[] = 'userDefinedIdentities'; + $fieldNames[] = 'ea_appname'; + $fieldNames[] = 'ea_group'; + $fieldNames[] = 'ea_user'; + $fieldNames[] = 'ea_active'; + $fieldNames[] = 'ea_user_defined_signatures'; + $fieldNames[] = 'ea_default_signature'; + $fieldNames[] = 'ea_stationery_active_templates'; + + $profileData = $this->soemailadmin->getProfile($_profileID, $fieldNames); + $profileData['imapTLSEncryption'] = ($profileData['imapTLSEncryption'] == 'yes' ? 1 : (int)$profileData['imapTLSEncryption']); + if(strlen($profileData['ea_stationery_active_templates']) > 0) + { + $profileData['ea_stationery_active_templates'] = explode(',',$profileData['ea_stationery_active_templates']); + } + self::$sessionData['profile'][$_profileID] = $profileData; + $this->saveSessionData(); + return $profileData; + } + + function getProfileList($_profileID='',$_appName=false,$_groupID=false,$_accountID=false) + { + if ($_appName!==false ||$_groupID!==false ||$_accountID!==false) { + return $this->soemailadmin->getProfileList($_profileID,false,$_appName,$_groupID,$_accountID); + } else { + return $this->soemailadmin->getProfileList($_profileID); + } + } + + /** + * Get a list of supported SMTP servers + * + * Calls hook "smtp_server_types" to allow applications to supply own server-types + * + * @return array classname => label pairs + */ + static public function getSMTPServerTypes() + { + $retData = array(); + foreach(self::$SMTPServerType as $key => $value) + { + $retData[$key] = $value['description']; + } + foreach($GLOBALS['egw']->hooks->process('smtp_server_types',array(),true) as $app => $data) + { + if ($data) $retData += $data; + } + return $retData; + } + + /** + * Get a list of supported IMAP servers + * + * Calls hook "imap_server_types" to allow applications to supply own server-types + * + * @param boolean $extended=true + * @return array classname => label pairs + */ + static public function getIMAPServerTypes($extended=true) + { + $retData = array(); + foreach(self::$IMAPServerType as $key => $value) + { + if ($extended) + { + $retData[$key]['description'] = $value['description']; + $retData[$key]['protocol'] = $value['protocol']; + } + else + { + $retData[$key] = $value['description']; + } + } + foreach($GLOBALS['egw']->hooks->process(array( + 'location' => 'imap_server_types', + 'extended' => $extended, + ),array(),true) as $app => $data) + { + if ($data) $retData += $data; + } + return $retData; + } + + /** + * Get EMailAdmin profile for a user + * + * @param string $_appName='' + * @param int|array $_groups='' + * @return ea_preferences + */ + function getUserProfile($_appName='', $_groups='') + { + if (!(is_array(self::$sessionData) && (count(self::$sessionData)>0))) $this->restoreSessionData(); + if (is_array(self::$sessionData) && count(self::$sessionData)>0 && self::$sessionData['ea_preferences']) + { + //error_log("sessionData Restored for UserProfile
"); + return self::$sessionData['ea_preferences']; + } + $appName = ($_appName != '' ? $_appName : $GLOBALS['egw_info']['flags']['currentapp']); + if(!is_array($_groups)) { + // initialize with 0 => means no group id + $groups = array(0); + // set the second entry to the users primary group + $groups[] = $GLOBALS['egw_info']['user']['account_primary_group']; + $userGroups = $GLOBALS['egw']->accounts->membership($GLOBALS['egw_info']['user']['account_id']); + foreach((array)$userGroups as $groupInfo) { + $groups[] = $groupInfo['account_id']; + } + } else { + $groups = $_groups; + } + + if($data = $this->soemailadmin->getUserProfile($appName, $groups,$GLOBALS['egw_info']['user']['account_id'])) + { + //error_log(__METHOD__.__LINE__.array2string($data)); + $eaPreferences = CreateObject('emailadmin.ea_preferences'); + + // fetch the IMAP / incomming server data + if (!class_exists($icClass=$data['imapType'])) + { + if (!file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$icClass.'.inc.php')) + { + $file = EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.($icClass='defaultimap').'.inc.php'; + } + include_once($file); + } + $icServer = new $icClass; + $icServer->ImapServerId = $data['profileID']*-1; + $icServer->encryption = ($data['imapTLSEncryption'] == 'yes' ? 1 : (int)$data['imapTLSEncryption']); + $icServer->host = $data['imapServer']; + $icServer->port = $data['imapPort']; + $icServer->validatecert = $data['imapTLSAuthentication'] == 'yes'; + $icServer->username = $GLOBALS['egw_info']['user']['account_lid']; + $icServer->password = $GLOBALS['egw_info']['user']['passwd']; + // restore the default loginType and check if there are forced/predefined user access Data ($imapAuthType may be set to admin) + list($data['imapLoginType'],$imapAuthType) = explode('#',$data['imapLoginType'],2); + $icServer->loginType = $data['imapLoginType']; + $icServer->domainName = $data['defaultDomain']; +// $icServer->loginName = $data['imapLoginType'] == 'standard' ? $GLOBALS['egw_info']['user']['account_lid'] : $GLOBALS['egw_info']['user']['account_lid'].'@'.$data['defaultDomain']; + $icServer->loginName = emailadmin_smtp_ldap::mailbox_addr($GLOBALS['egw_info']['user'],$data['defaultDomain'],$data['imapLoginType']); + $icServer->enableCyrusAdmin = ($data['imapEnableCyrusAdmin'] == 'yes'); + $icServer->adminUsername = $data['imapAdminUsername']; + $icServer->adminPassword = $data['imapAdminPW']; + $icServer->enableSieve = ($data['imapEnableSieve'] == 'yes'); + if (!empty($data['imapSieveServer'])) + { + $icServer->sieveHost = $data['imapSieveServer']; + } + $icServer->sievePort = $data['imapSievePort']; + if ($imapAuthType == 'admin') { + if (!empty($data['imapAuthUsername'])) $icServer->username = $icServer->loginName = $data['imapAuthUsername']; + if (!empty($data['imapAuthPassword'])) $icServer->password = $data['imapAuthPassword']; + } + if ($imapAuthType == 'email' || $icServer->loginType == 'email') { + $icServer->username = $icServer->loginName = $GLOBALS['egw_info']['user']['account_email']; + } + if (method_exists($icServer,'init')) $icServer->init(); + $eaPreferences->setIncomingServer($icServer,(int)$icServer->ImapServerId); + + // fetch the SMTP / outgoing server data + if (!class_exists($ogClass=$data['smtpType'])) + { + if (!file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$ogClass.'.inc.php')) + { + $file = EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.($ogClass='defaultsmtp').'.inc.php'; + } + include_once($file); + } + $ogServer = new $ogClass($icServer->domainName); + $ogServer->SmtpServerId = $data['profileID']*-1; + $ogServer->host = $data['smtpServer']; + $ogServer->port = $data['smtpPort']; + $ogServer->editForwardingAddress = ($data['editforwardingaddress'] == 'yes'); + $ogServer->smtpAuth = $data['smtpAuth'] == 'yes'; + if($ogServer->smtpAuth) { + if(!empty($data['ea_smtp_auth_username'])) { + $ogServer->username = $data['ea_smtp_auth_username']; + } else { + // if we use special logintypes for IMAP, we assume this to be used for SMTP too + if ($imapAuthType == 'email' || $icServer->loginType == 'email') { + $ogServer->username = $GLOBALS['egw_info']['user']['account_email']; + } elseif ($icServer->loginType == 'vmailmgr') { + $ogServer->username = $GLOBALS['egw_info']['user']['account_lid'].'@'.$icServer->domainName; + } else { + $ogServer->username = $GLOBALS['egw_info']['user']['account_lid']; + } + } + if(!empty($data['ea_smtp_auth_password'])) { + $ogServer->password = $data['ea_smtp_auth_password']; + } else { + $ogServer->password = $GLOBALS['egw_info']['user']['passwd']; + } + } + if (method_exists($ogServer,'init')) $ogServer->init(); + $eaPreferences->setOutgoingServer($ogServer,(int)$ogServer->SmtpServerId); + + $i=0; + foreach($ogServer->getAccountEmailAddress($GLOBALS['egw_info']['user']['account_lid']) as $emailAddresses) + { + $identity = CreateObject('emailadmin.ea_identity'); + $identity->emailAddress = $emailAddresses['address']; + $identity->realName = $emailAddresses['name']; + $identity->default = ($emailAddresses['type'] == 'default'); + $identity->organization = $data['organisationName']; + $identity->id = ($i==0?$data['profileID']*-1:$i); + // first identity found will be associated with the profileID + $eaPreferences->setIdentity($identity,($i==0?$data['profileID']*-1:$i)); + $i++; + } + + $eaPreferences->userDefinedAccounts = ($data['userDefinedAccounts'] == 'yes'); + $eaPreferences->userDefinedIdentities = ($data['userDefinedIdentities'] == 'yes'); + $eaPreferences->ea_user_defined_signatures = ($data['ea_user_defined_signatures'] == 'yes'); + $eaPreferences->ea_default_signature = $data['ea_default_signature']; + if(strlen($data['ea_stationery_active_templates']) > 0) + { + $eaPreferences->ea_stationery_active_templates = explode(',',$data['ea_stationery_active_templates']); + } + self::$sessionData['ea_preferences'] = $eaPreferences; + $this->saveSessionData(); + return $eaPreferences; + } + + return false; + } + + function getUserData($_accountID) + { + + if($userProfile = $this->getUserProfile('felamimail')) { + $icServerKeys = array_keys((array)$userProfile->ic_server); + $profileID = array_shift($icServerKeys); + $icServer = $userProfile->getIncomingServer($profileID); + if(is_a($icServer, 'defaultimap') && $username = $GLOBALS['egw']->accounts->id2name($_accountID)) { + $icUserData = $icServer->getUserData($username); + } + + $ogServerKeys = array_keys((array)$userProfile->og_server); + $profileID = array_shift($ogServerKeys); + $ogServer = $userProfile->getOutgoingServer($profileID); + if(is_a($ogServer, 'defaultsmtp')) { + $ogUserData = $ogServer->getUserData($_accountID); + } + + return (array)$icUserData + (array)$ogUserData; + + } + + return false; + } + + function restoreSessionData() + { + $GLOBALS['egw_info']['flags']['autoload'] = array(__CLASS__,'autoload'); + + //echo function_backtrace()."
"; + //unserializing the sessiondata, since they are serialized for objects sake + self::$sessionData = (array) unserialize($GLOBALS['egw']->session->appsession('session_data','emailadmin')); + } + + /** + * Autoload classes from emailadmin, 'til they get autoloading conform names + * + * @param string $class + */ + static function autoload($class) + { + if (file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php')) + { + include_once($file); + } + } + + function saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy) + { + if (is_object($this->smtpClass)) + { + #$smtpClass = CreateObject('emailadmin.'.$this->smtpClass,$this->profileID); + #$smtpClass->saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy); + $this->smtpClass->saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy); + } + + } + + /** + * called by the validation hook in setup + * + * @param array $settings following keys: mail_server, mail_server_type {IMAP|IMAPS|POP-3|POP-3S}, + * mail_login_type {standard|vmailmgr}, mail_suffix (domain), smtp_server, smtp_port, smtp_auth_user, smtp_auth_passwd + */ + function setDefaultProfile($settings) + { + if (($profiles = $this->soemailadmin->getProfileList(0,true))) + { + //error_log(__METHOD__.__LINE__.' Found profile 2 merge'); + $profile = array_shift($profiles); + } + else + { + //error_log(__METHOD__.__LINE__.' Create profile 4 merge'); + $profile = array( + 'smtpType' => 'defaultsmtp', + 'description' => 'default profile (created by setup)', + //'ea_appname' => '', // default is null, and expected to be null if empty + //'ea_group' => 0, + //'ea_user' => 0, + 'ea_active' => 1, + ); + + if (empty($settings['mail_server'])) $profile['userDefinedAccounts'] = 'yes'; + if (empty($settings['mail_server'])) $profile['userDefinedIdentities'] == 'yes'; + if (empty($settings['mail_server'])) $profile['ea_user_defined_signatures'] == 'yes'; + } + foreach($to_parse = array( + 'mail_server' => 'imapServer', + 'mail_server_type' => array( + 'imap' => array( + 'imapType' => 'defaultimap', + 'imapPort' => 143, + 'imapTLSEncryption' => 0, + ), + 'imaps' => array( + 'imapType' => 'defaultimap', + 'imapPort' => 993, + 'imapTLSEncryption' => '3', + ), + ), + 'mail_login_type' => 'imapLoginType', + 'mail_suffix' => 'defaultDomain', + 'smtp_server' => 'smtpServer', + 'smtp_port' => 'smtpPort', + 'smtp_auth_user' => 'ea_smtp_auth_username', + 'smtp_auth_passwd' => 'ea_smtp_auth_password', + ) as $setup_name => $ea_name_data) + { + if (!is_array($ea_name_data)) + { + $profile[$ea_name_data] = $settings[$setup_name]; + if ($setup_name == 'smtp_auth_user') $profile['stmpAuth'] = !empty($settings['smtp_auth_user']); + } + else + { + foreach($ea_name_data as $setup_val => $ea_data) + { + if ($setup_val == $settings[$setup_name]) + { + foreach($ea_data as $var => $val) + { + if ($var != 'imapType' || $val != 'defaultimap') // old code: || $profile[$var] < 3) // dont kill special imap server types + { + $profile[$var] = $val; + } + } + break; + } + } + } + } + // merge the other not processed values unchanged + $profile = array_merge($profile,array_diff_assoc($settings,$to_parse)); + //error_log(__METHOD__.__LINE__.' Profile to Save:'.array2string($profile).' Profile to Parse:'.array2string($to_parse)); + $this->soemailadmin->updateProfile($profile); + self::$sessionData['profile'] = array(); + $this->saveSessionData(); + //echo "

EMailAdmin profile update: ".print_r($profile,true)."

\n"; exit; + } + + function saveSessionData() + { + // serializing the session data, for the sake of objects + if (is_object($GLOBALS['egw']->session)) // otherwise setup(-cli) fails + { + $GLOBALS['egw']->session->appsession('session_data','emailadmin',serialize(self::$sessionData)); + } + #$GLOBALS['egw']->session->appsession('user_session_data','',$this->userSessionData); + } + + function saveUserData($_accountID, $_formData) { + + if($userProfile = $this->getUserProfile('felamimail')) + { + $ogServerKeys = array_keys((array)$userProfile->og_server); + $profileID = array_shift($ogServerKeys); + $ogServer = $userProfile->getOutgoingServer($profileID); + if(is_a($ogServer, 'defaultsmtp')) { + $ogServer->setUserData($_accountID, + (array)$_formData['mailAlternateAddress'], + (array)$_formData['mailForwardingAddress'], + $_formData['deliveryMode'], + $_formData['accountStatus'], + $_formData['mailLocalAddress'] + ); + } + + $icServerKeys = array_keys((array)$userProfile->ic_server); + $profileID = array_shift($icServerKeys); + $icServer = $userProfile->getIncomingServer($profileID); + if(is_a($icServer, 'defaultimap') && $username = $GLOBALS['egw']->accounts->id2name($_accountID)) { + $icServer->setUserData($username, $_formData['quotaLimit']); + } + + // calling a hook to allow other apps to monitor the changes + $_formData['account_id'] = $_accountID; + $_formData['location'] = 'editaccountemail'; + $GLOBALS['egw']->hooks->process($_formData); + + return true; + self::$sessionData = array(); + $this->saveSessionData(); + } + + return false; + } + + function setOrder($_order) { + if(is_array($_order)) { + $this->soemailadmin->setOrder($_order); + } + self::$sessionData = array(); + $this->saveSessionData(); + } + + function updateAccount($_hookValues) { + if (is_object($this->imapClass)) { + #ExecMethod("emailadmin.".$this->imapClass.".updateAccount",$_hookValues,3,$this->profileData); + $this->imapClass->updateAccount($_hookValues); + } + + if (is_object($this->smtpClass)) { + #ExecMethod("emailadmin.".$this->smtpClass.".updateAccount",$_hookValues,3,$this->profileData); + $this->smtpClass->updateAccount($_hookValues); + } + self::$sessionData = array(); + $this->saveSessionData(); + } +} diff --git a/emailadmin/inc/class.emailadmin_hooks.inc.php b/emailadmin/inc/class.emailadmin_hooks.inc.php new file mode 100644 index 0000000000..a107a156da --- /dev/null +++ b/emailadmin/inc/class.emailadmin_hooks.inc.php @@ -0,0 +1,121 @@ + + * @copyright (c) 2008-8 by leithoff-At-stylite.de + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * diverse static emailadmin hooks + */ +class emailadmin_hooks +{ + // hook to plug in into admin (managable) applications list + static function admin() + { + // Only Modify the $file and $title variables..... + $title = $appname = 'emailadmin'; + $file = Array( + 'Site Configuration' => $GLOBALS['egw']->link('/index.php','menuaction=emailadmin.emailadmin_ui.index') + ); + + //Do not modify below this line + display_section($appname,$title,$file); + } + + /** + * Hook called if account emailadim settings has to be modified + * + * @param array $data + * @param int $data['account_id'] numerical id + */ + static function edit_user($data) + { + //echo "called hook and function
".function_backtrace()."
"; + //_debug_array($data); + + if ($data['account_id'] && // can't set it on add + $GLOBALS['egw_info']['user']['apps']['emailadmin']) + { + $GLOBALS['menuData'][] = array( + 'description' => 'eMailAdmin: User assigned Profile', + 'url' => '/index.php', + 'extradata' => 'menuaction=emailadmin.emailadmin_ui.index' + ); + } + } + + /** + * Hook called after group emailadim settings has to be modified + * + * @param array $data + * @param int $data['account_id'] numerical id + */ + static function edit_group($data) + { + #echo "called hook and function
"; + #_debug_array($data); + # somehow the $data var seems to be quite sparsely populated, so we dont check any further + if (#!empty($data['account_id']) && $data['account_id'] < 0 && // can't set it on add + $GLOBALS['egw_info']['user']['apps']['emailadmin']) + { + $GLOBALS['menuData'][] = array( + 'description' => 'eMailAdmin: Group assigned Profile', + 'url' => '/index.php', + 'extradata' => 'menuaction=emailadmin.emailadmin_ui.index' + ); + } + } + + /** + * Hook called before an account get deleted + * + * @param array $data + * @param int $data['account_id'] numerical id + * @param string $data['account_lid'] account-name + * @param int $data['new_owner'] account-id of new owner, or false if data should get deleted + */ + static function deleteaccount(array $data) + { + if((int)$data['account_id'] > 0 && + $GLOBALS['egw_info']['user']['apps']['emailadmin']) + { + $boemailadmin = new emailadmin_bo(); + $profileList = $boemailadmin->getProfileList($profileID,$appName,$groupID,(int) $data['account_id']); + if (is_array($profileList)) { + foreach ($profileList as $key => $value) { + $boemailadmin->delete($value['profileID']); + } + } + } + + } + + /** + * Hook called before a group get deleted + * + * @param array $data + * @param int $data['account_id'] numerical id + * @param string $data['account_name'] account-name + */ + static function deletegroup(array $data) + { + if ((int)$data['account_id'] < 0 && + $GLOBALS['egw_info']['user']['apps']['emailadmin']) + { + $boemailadmin = new emailadmin_bo(); + $profileList = $boemailadmin->getProfileList($profileID,$appName,(int) $data['account_id'],$accountID); + if (is_array($profileList)) { + foreach ($profileList as $key => $value) { + $boemailadmin->deleteProfile($value['profileID']); + } + } + } + } + +} diff --git a/emailadmin/inc/class.emailadmin_script.inc.php b/emailadmin/inc/class.emailadmin_script.inc.php new file mode 100644 index 0000000000..8479ba59aa --- /dev/null +++ b/emailadmin/inc/class.emailadmin_script.inc.php @@ -0,0 +1,518 @@ + + * @copyright 2002 by Stephen Grier + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * Support for Sieve scripts + */ +class emailadmin_script { + + var $name; /* filename of script. */ + var $script; /* full ascii text of script from server. */ + var $size; /* size of script in bytes. */ + var $so; /* boolean: is it safe to overwrite script? + * only safe if we recognise encoding. */ + var $mode; /* basic or advanced. Smartsieve can only read/write basic. */ + var $rules; /* array of sieve rules. */ + var $vacation; /* vacation settings. */ + var $emailNotification; /* email notification settings. */ + var $pcount; /* highest priority value in ruleset. */ + var $errstr; /* error text. */ + /** + * Switch on some error_log debug messages + * + * @var boolean + */ + var $debug=false; + + // class constructor + function __construct ($scriptname) { + $this->name = $scriptname; + $this->script = ''; + $this->size = 0; + $this->so = true; + $this->mode = ''; + $this->rules = array(); + $this->vacation = array(); + $this->emailNotification = array(); // Added email notifications + $this->pcount = 0; + $this->errstr = ''; + } + + // get sieve script rules for this user + /** + * Retrieve the rules + * + * @param bosieve $connection + * @return boolean true, if script written successfull + */ + function retrieveRules ($connection) { + #global $_SESSION; + $continuebit = 1; + $sizebit = 2; + $anyofbit = 4; + $keepbit = 8; + $regexbit = 128; + + if (!isset($this->name)){ + $this->errstr = 'retrieveRules: no script name specified'; + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": no script name specified"); + return false; + } + + if (!is_object($connection)) { + $this->errstr = "retrieveRules: no sieve session open"; + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": no sieve session open"); + return false; + } + + // if script doesn't yet exist, nothing to retrieve. + // safe to write to this script file. + #LK if (!AppSession::scriptExists($this->name)) { + #LK $this->so = true; + #LK return true; + #LK } + + #print "



get Script ". $this->name ."
"; + + if(PEAR::isError($script = $connection->getScript($this->name))) { + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": error retrieving script: ".$script->getMessage()); + return $script; + } + + #print "
AAA: Script is ". htmlentities($script) ."
"; + $lines = array(); + $lines = preg_split("/\n/",$script); //,PREG_SPLIT_NO_EMPTY); + + $rules = array(); + $vacation = array(); + $emailNotification = array(); // Added email notifications + $regexps = array('^ *##PSEUDO','^ *#rule','^ *#vacation','^ *#mode'); + $regexps[] = '^ *#notify'; // Added email notifications + + /* first line should be the script size. eg: {123}. */ + #$line = array_shift($lines); + #if (!preg_match("/^\{(\d+)\}$/", $line, $bits)){ + # print 'retrieveRules: unexpected value: ' . $line .'
'; + # $this->errstr = 'retrieveRules: unexpected value: ' . $line; + # return false; + #} + #LK $this->size = $bits[1]; + + /* next line should be the recognised encoded head. if not, the script + * is of an unrecognised format, and we should not overwrite it. */ + $line = array_shift($lines); + if (!preg_match("/^# ?Mail(.*)rules for/", $line)){ + $this->errstr = 'retrieveRules: encoding not recognised'; + $this->so = false; + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": encoding not recognised"); + return false; + } + $this->so = true; + + $line = array_shift($lines); + + while (isset($line)){ + foreach ($regexps as $regexp){ + if (preg_match("/$regexp/i",$line)){ + $line = rtrim($line); + if (preg_match("/^ *#rule&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)$/i",$line,$bits)){ + $rule = array(); + $rule['priority'] = $bits[1]; + $rule['status'] = $bits[2]; + $rule['from'] = stripslashes($bits[3]); + $rule['to'] = stripslashes($bits[4]); + $rule['subject'] = stripslashes($bits[5]); + $rule['action'] = $bits[6]; + $rule['action_arg'] = $bits[7]; + // s will be encoded as \\n. undo this. + $rule['action_arg'] = preg_replace("/\\\\n/","\r\n",$rule['action_arg']); + $rule['action_arg'] = stripslashes($rule['action_arg']); + $rule['flg'] = $bits[8]; // bitwise flag + $rule['field'] = stripslashes($bits[9]); + $rule['field_val'] = stripslashes($bits[10]); + $rule['size'] = $bits[11]; + $rule['continue'] = ($bits[8] & $continuebit); + $rule['gthan'] = ($bits[8] & $sizebit); // use 'greater than' + $rule['anyof'] = ($bits[8] & $anyofbit); + $rule['keep'] = ($bits[8] & $keepbit); + $rule['regexp'] = ($bits[8] & $regexbit); + $rule['unconditional'] = 0; + if (!$rule['from'] && !$rule['to'] && !$rule['subject'] && + !$rule['field'] && !$rule['size'] && $rule['action']) { + $rule['unconditional'] = 1; + } + + array_push($rules,$rule); + + if ($rule['priority'] > $this->pcount) { + $this->pcount = $rule['priority']; + } + } + + if (preg_match("/^ *#vacation&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)/i",$line,$bits) || + preg_match("/^ *#vacation&&(.*)&&(.*)&&(.*)&&(.*)/i",$line,$bits)) { + $vacation['days'] = $bits[1]; + $vaddresslist = $bits[2]; + $vaddresslist = preg_replace("/\"|\s/","",$vaddresslist); + $vaddresses = array(); + $vaddresses = preg_split("/,/",$vaddresslist); + $vacation['text'] = $bits[3]; + + // s will be encoded as \\n. undo this. + $vacation['text'] = preg_replace("/\\\\n/","\r\n",$vacation['text']); + + if (strpos($bits[4],'-')!== false) + { + $vacation['status'] = 'by_date'; + list($vacation['start_date'],$vacation['end_date']) = explode('-',$bits[4]); + } + else + { + $vacation['status'] = $bits[4]; + } + $vacation['addresses'] = &$vaddresses; + + $vacation['forwards'] = $bits[5]; + } + + if (preg_match("/^ *#notify&&(.*)&&(.*)&&(.*)/i",$line,$bits)) { + $emailNotification['status'] = $bits[1]; + $emailNotification['externalEmail'] = $bits[2]; + $emailNotification['displaySubject'] = $bits[3]; + } + + if (preg_match("/^ *#mode&&(.*)/i",$line,$bits)){ + if ($bits[1] == 'basic') + $this->mode = 'basic'; + elseif ($bits[1] == 'advanced') + $this->mode = 'advanced'; + else + $this->mode = 'unknown'; + } + } + } + $line = array_shift($lines); + } + + $this->script = $script; + $this->rules = $rules; + $this->vacation = $vacation; + $this->emailNotification = $emailNotification; // Added email notifications + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": Script succesful retrieved: ".print_r($vacation,true)); + + return true; + } + + + // update and save sieve script + function updateScript ($connection) + { + #global $_SESSION,$default,$sieve; + global $default,$sieve; + + $activerules = 0; + $regexused = 0; + $rejectused = 0; + + $username = $GLOBALS['egw_info']['user']['account_lid']; + $version = $GLOBALS['egw_info']['apps']['felamimail']['version']; + + //include "$default->lib_dir/version.php"; + + if (!is_object($connection)) + { + $this->errstr = "updateScript: no sieve session open"; + return false; + } + + // don't overwrite a file if not created by SmartSieve, + // unless configured to do so. +#LK if (!$this->so && !$default->allow_write_unrecognised_scripts) { +#LK $this->errstr = 'updateScript: encoding not recognised: not safe to overwrite ' . $this->name; +#LK return false; +#LK } + + // lets generate the main body of the script from our rules + + $newscriptbody = ""; + $continue = 1; + + foreach ($this->rules as $rule) { + $newruletext = ""; + + // don't print this rule if disabled. + if ($rule['status'] != 'ENABLED') { + } else { + + $activerules = 1; + + // conditions + + $anyall = "allof"; + if ($rule['anyof']) $anyall = "anyof"; + if ($rule['regexp']) { + $regexused = 1; + } + $started = 0; + + if (!$rule['unconditional']) { + if (!$continue) $newruletext .= "els"; + $newruletext .= "if " . $anyall . " ("; + if ($rule['from']) { + if (preg_match("/^\s*!/", $rule['from'])){ + $newruletext .= 'not '; + $rule['from'] = preg_replace("/^\s*!/","",$rule['from']); + } + $match = ':contains'; + if (preg_match("/\*|\?/", $rule['from'])) $match = ':matches'; + if ($rule['regexp']) $match = ':regex'; + $newruletext .= "address " . $match . " [\"From\"]"; + $newruletext .= " \"" . addslashes($rule['from']) . "\""; + $started = 1; + } + if ($rule['to']) { + if ($started) $newruletext .= ", "; + if (preg_match("/^\s*!/", $rule['to'])){ + $newruletext .= 'not '; + $rule['to'] = preg_replace("/^\s*!/","",$rule['to']); + } + $match = ':contains'; + if (preg_match("/\*|\?/", $rule['to'])) $match = ':matches'; + if ($rule['regexp']) $match = ':regex'; + $newruletext .= "address " . $match . " [\"To\",\"TO\",\"Cc\",\"CC\"]"; + $newruletext .= " \"" . addslashes($rule['to']) . "\""; + $started = 1; + } + if ($rule['subject']) { + if ($started) $newruletext .= ", "; + if (preg_match("/^\s*!/", $rule['subject'])){ + $newruletext .= 'not '; + $rule['subject'] = preg_replace("/^\s*!/","",$rule['subject']); + } + $match = ':contains'; + if (preg_match("/\*|\?/", $rule['subject'])) $match = ':matches'; + if ($rule['regexp']) $match = ':regex'; + $newruletext .= "header " . $match . " \"subject\""; + $newruletext .= " \"" . addslashes($rule['subject']) . "\""; + $started = 1; + } + if ($rule['field'] && $rule['field_val']) { + if ($started) $newruletext .= ", "; + if (preg_match("/^\s*!/", $rule['field_val'])){ + $newruletext .= 'not '; + $rule['field_val'] = preg_replace("/^\s*!/","",$rule['field_val']); + } + $match = ':contains'; + if (preg_match("/\*|\?/", $rule['field_val'])) $match = ':matches'; + if ($rule['regexp']) $match = ':regex'; + $newruletext .= "header " . $match . " \"" . addslashes($rule['field']) . "\""; + $newruletext .= " \"" . addslashes($rule['field_val']) . "\""; + $started = 1; + } + if ($rule['size']) { + $xthan = " :under "; + if ($rule['gthan']) $xthan = " :over "; + if ($started) $newruletext .= ", "; + $newruletext .= "size " . $xthan . $rule['size'] . "K"; + $started = 1; + } + + } + + // actions + + if (!$rule['unconditional']) $newruletext .= ") {\n\t"; + + if (preg_match("/folder/i",$rule['action'])) { + $newruletext .= "fileinto \"" . $rule['action_arg'] . "\";"; + } + if (preg_match("/reject/i",$rule['action'])) { + $newruletext .= "reject text: \n" . $rule['action_arg'] . "\n.\n;"; + $rejectused = 1; + } + if (preg_match("/address/i",$rule['action'])) { + $newruletext .= "redirect \"" . $rule['action_arg'] . "\";"; + } + if (preg_match("/discard/i",$rule['action'])) { + $newruletext .= "discard;"; + } + if ($rule['keep']) $newruletext .= "\n\tkeep;"; + if (!$rule['unconditional']) $newruletext .= "\n}"; + + $continue = 0; + if ($rule['continue']) $continue = 1; + if ($rule['unconditional']) $continue = 1; + + $newscriptbody .= $newruletext . "\n\n"; + + } // end 'if ! ENABLED' + } + + // vacation rule + + if ($this->vacation) { + $vacation = $this->vacation; + if (!$vacation['days']) $vacation['days'] = $default->vacation_days; + if (!$vacation['text']) $vacation['text'] = $default->vacation_text; + if (!$vacation['status']) $vacation['status'] = 'on'; + + // filter out invalid addresses. + $ok_vaddrs = array(); + foreach($vacation['addresses'] as $addr){ + if ($addr != '' && preg_match("/\@/",$addr)) + array_push($ok_vaddrs,$addr); + } + $vacation['addresses'] = $ok_vaddrs; + + if (!$vacation['addresses'][0]){ + $defaultaddr = $sieve->user . '@' . $sieve->maildomain; + array_push($vacation['addresses'],$defaultaddr); + } + if ($vacation['status'] == 'on' || $vacation['status'] == 'by_date' && + $vacation['start_date'] <= time() && time() < $vacation['end_date']+24*3600) // +24*3600 to include the end_date day + { + if (trim($vacation['forwards'])) { + $if = array(); + foreach($vacation['addresses'] as $addr) { + $if[] = 'address :contains ["To","TO","Cc","CC"] "'.$addr.'"'; + } + $newscriptbody .= 'if anyof ('.implode(', ',$if).") {\n"; + foreach(preg_split('/, ?/',$vacation['forwards']) as $addr) { + $newscriptbody .= "\tredirect \"".$addr."\";\n"; + } + $newscriptbody .= "\tkeep;\n}\n"; + } + $vacation_active = true; + $newscriptbody .= "vacation :days " . $vacation['days'] . " :addresses ["; + $first = 1; + foreach ($vacation['addresses'] as $vaddress) { + if (!$first) $newscriptbody .= ", "; + $newscriptbody .= "\"" . $vaddress . "\""; + $first = 0; + } + $message = $vacation['text']; + if ($vacation['start_date'] || $vacation['end_date']) + { + $message = str_replace(array('$$start$$','$$end$$'),array( + date($GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],$vacation['start_date']), + date($GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],$vacation['end_date']), + ),$message); + } + $newscriptbody .= "] text:\n" . $message . "\n.\n;\n\n"; + } + + // update with any changes. + $this->vacation = $vacation; + } + + if ($this->emailNotification && $this->emailNotification['status'] == 'on') { + // format notification email header components + $notification_email = $this->emailNotification['externalEmail']; + + // format notification body + $egw_site_title = $GLOBALS['egw_info']['server']['site_title']; + $notification_body = lang("You have received a new message on the")." {$egw_site_title}"."\n"; + $notification_body .= "\n"; + $notification_body .= 'From: $from$'."\n"; + if ($this->emailNotification['displaySubject']) { + $notification_body .= 'Subject: $subject$'."\n"; + } + //$notification_body .= 'Size: $size$'."\n"; + + $newscriptbody .= 'notify :message "'.$notification_body.'" :method "mailto" :options "'.$notification_email.'";'."\n"; + //$newscriptbody .= 'notify :message "'.$notification_body.'" :method "mailto" :options "'.$notification_email.'?subject='.$notification_subject.'";'."\n"; + $newscriptbody .= 'keep;'."\n\n"; + } + + // generate the script head + + $newscripthead = ""; + $newscripthead .= "#Mail filter rules for " . $username . "\n"; + $newscripthead .= '#Generated by ' . $username . ' using FeLaMiMail ' . $version . ' ' . date($default->script_date_format); + $newscripthead .= "\n"; + + if ($activerules) { + $newscripthead .= "require [\"fileinto\""; + if ($regexused) $newscripthead .= ",\"regex\""; + if ($rejectused) $newscripthead .= ",\"reject\""; + if ($this->vacation && $vacation_active) { + $newscripthead .= ",\"vacation\""; + } + if ($this->emailNotification && $this->emailNotification['status'] == 'on') $newscripthead .= ',"notify"'; // Added email notifications + $newscripthead .= "];\n\n"; + } else { + // no active rules, but might still have an active vacation rule + if ($this->vacation && $vacation_active) + $newscripthead .= "require [\"vacation\"];\n\n"; + if ($this->emailNotification && $this->emailNotification['status'] == 'on') $newscripthead .= "require [\"notify\"];\n\n"; // Added email notifications + } + + + // generate the encoded script foot + + $newscriptfoot = ""; + $pcount = 1; + $newscriptfoot .= "##PSEUDO script start\n"; + foreach ($this->rules as $rule) { + // only add rule to foot if status != deleted. this is how we delete a rule. + if ($rule['status'] != 'DELETED') { + $rule['action_arg'] = addslashes($rule['action_arg']); + // we need to handle \r\n here. + $rule['action_arg'] = preg_replace("/\r\n/","\\n",$rule['action_arg']); + /* reset priority value. note: we only do this + * for compatibility with Websieve. */ + $rule['priority'] = $pcount; + $newscriptfoot .= "#rule&&" . $rule['priority'] . "&&" . $rule['status'] . "&&" . + addslashes($rule['from']) . "&&" . addslashes($rule['to']) . "&&" . addslashes($rule['subject']) . "&&" . $rule['action'] . "&&" . + addslashes($rule['action_arg']) . "&&" . $rule['flg'] . "&&" . addslashes($rule['field']) . "&&" . addslashes($rule['field_val']) . "&&" . $rule['size'] . "\n"; + $pcount = $pcount+2; + } + } + + if ($this->vacation) { + $vacation = $this->vacation; + $newscriptfoot .= "#vacation&&" . $vacation['days'] . "&&"; + $first = 1; + foreach ($vacation['addresses'] as $address) { + if (!$first) $newscriptfoot .= ", "; + $newscriptfoot .= "\"" . $address . "\""; + $first = 0; + } + + $vacation['text'] = preg_replace("/\r\n/","\\n",$vacation['text']); + $newscriptfoot .= "&&" . $vacation['text'] . "&&" . + ($vacation['status']=='by_date' ? $vacation['start_date'].'-'.$vacation['end_date'] : $vacation['status']); + if ($vacation['forwards']) $newscriptfoot .= '&&' . $vacation['forwards']; + $newscriptfoot .= "\n"; + } + if ($this->emailNotification) { + $emailNotification = $this->emailNotification; + $newscriptfoot .= "#notify&&" . $emailNotification['status'] . "&&" . $emailNotification['externalEmail'] . "&&" . $emailNotification['displaySubject'] . "\n"; + } + + $newscriptfoot .= "#mode&&basic\n"; + + $newscript = $newscripthead . $newscriptbody . $newscriptfoot; + $this->script = $newscript; + #print "
$newscript
"; exit; + $scriptfile = $this->name; + #print "
".htmlentities($newscript)."

"; + if (!$connection->installScript($this->name, $newscript, true)) { + $this->errstr = 'updateScript: putscript failed: ' . $connection->errstr; + return false; + } + + return true; + } +} diff --git a/emailadmin/inc/class.emailadmin_sieve.inc.php b/emailadmin/inc/class.emailadmin_sieve.inc.php new file mode 100644 index 0000000000..aebb362ab9 --- /dev/null +++ b/emailadmin/inc/class.emailadmin_sieve.inc.php @@ -0,0 +1,214 @@ + + * @author Klaus Leithoff + * @author Lars Kneschke + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +include_once('Net/Sieve.php'); + +/** + * Support for Sieve scripts + */ +class emailadmin_sieve extends Net_Sieve +{ + /** + * @var object $icServer object containing the information about the imapserver + */ + var $icServer; + + /** + * @var object $icServer object containing the information about the imapserver + */ + var $scriptName; + + /** + * @var object $error the last PEAR error object + */ + var $error; + + /** + * Switch on some error_log debug messages + * + * @var boolean + */ + var $debug = false; + + /** + * Constructor + * + * @param defaultimap $_icServer + */ + function __construct(defaultimap $_icServer=null) + { + parent::Net_Sieve(); + + $this->scriptName = !empty($GLOBALS['egw_info']['user']['preferences']['felamimail']['sieveScriptName']) ? $GLOBALS['egw_info']['user']['preferences']['felamimail']['sieveScriptName'] : 'felamimail'; + + $this->displayCharset = $GLOBALS['egw']->translation->charset(); + + if (!is_null($_icServer) && $this->_connect($_icServer) === 'die') { + die('Sieve not activated'); + } + } + + /** + * Open connection to the sieve server + * + * @param defaultimap $_icServer + * @param string $euser='' effictive user, if given the Cyrus admin account is used to login on behalf of $euser + * @return mixed 'die' = sieve not enabled, false=connect or login failure, true=success + */ + function _connect($_icServer,$euser='') + { + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.array2string($euser)); + if(is_a($_icServer,'defaultimap') && $_icServer->enableSieve) { + if (!empty($_icServer->sieveHost)) + { + $sieveHost = $_icServer->sieveHost; + } + else + { + $sieveHost = $_icServer->host; + } + //error_log(__METHOD__.__LINE__.'->'.$sieveHost); + $sievePort = $_icServer->sievePort; + $useTLS = $_icServer->encryption > 0; + if ($euser) { + $username = $_icServer->adminUsername; + $password = $_icServer->adminPassword; + } else { + $username = $_icServer->loginName; + $password = $_icServer->password; + } + $this->icServer = $_icServer; + } else { + return 'die'; + } + + if(PEAR::isError($this->error = $this->connect($sieveHost , $sievePort, null, $useTLS) ) ){ + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": error in connect($sieveHost,$sievePort): ".$this->error->getMessage()); + return false; + } + if(PEAR::isError($this->error = $this->login($username, $password, null, $euser) ) ){ + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.array2string($this->icServer)); + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": error in login($username,$password,null,$euser): ".$this->error->getMessage()); + return false; + } + return true; + } + + function getRules($_scriptName) { + return $this->rules; + } + + function getVacation($_scriptName) { + return $this->vacation; + } + + function getEmailNotification($_scriptName) { + return $this->emailNotification; + } + + function setRules($_scriptName, $_rules) + { + if (!$_scriptName) $_scriptName = $this->scriptName; + $script = new emailadmin_script($_scriptName); + $script->debug = $this->debug; + + if($script->retrieveRules($this)) { + $script->rules = $_rules; + $script->updateScript($this); + + return true; + } + + return false; + } + + function setVacation($_scriptName, $_vacation) + { + if (!$_scriptName) $_scriptName = $this->scriptName; + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__."($_scriptName,".print_r($_vacation,true).')'); + $script = new emailadmin_script($_scriptName); + $script->debug = $this->debug; + + if($script->retrieveRules($this)) { + $script->vacation = $_vacation; + $script->updateScript($this); + /* + // setting up an async job to enable/disable the vacation message + $async = new asyncservice(); + $user = $GLOBALS['egw_info']['user']['account_id']; + $async->delete($async_id ="felamimail-vacation-$user"); + $end_date = $_vacation['end_date'] + 24*3600; // end-date is inclusive, so we have to add 24h + if ($_vacation['status'] == 'by_date' && time() < $end_date) + { + $time = time() < $_vacation['start_date'] ? $_vacation['start_date'] : $end_date; + $async->set_timer($time,$async_id,'felamimail.bosieve.async_vacation',$_vacation+array('scriptName'=>$_scriptName),$user); + } + */ + return true; + } + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__."($_scriptName,".print_r($_vacation,true).') could not retrieve rules!'); + + return false; + } + + /** + * Set vacation with admin right for an other user, used to async enable/disable vacation + * + * @param string $_euser + * @param string $_scriptName + * @param string $_vaction + * @return boolean true on success false otherwise + */ + function setVacationUser($_euser, $_scriptName, $_vacation) + { + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.' User:'.array2string($_euser).' Scriptname:'.array2string($_scriptName).' VacationMessage:'.array2string($_vacation)); + if (!$_scriptName) $_scriptName = $this->scriptName; + if ($this->_connect($this->icServer,$_euser) === true) { + $this->setVacation($_scriptName,$_vacation); + // we need to logout, so further vacation's get processed + $error = $this->_cmdLogout(); + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.' logout '.(PEAR::isError($error) ? 'failed: '.$ret->getMessage() : 'successful')); + return true; + } + return false; + } + + function setEmailNotification($_scriptName, $_emailNotification) { + if (!$_scriptName) $_scriptName = $this->scriptName; + if ($_emailNotification['externalEmail'] == '' || !preg_match("/\@/",$_emailNotification['externalEmail'])) { + $_emailNotification['status'] = 'off'; + $_emailNotification['externalEmail'] = ''; + } + + $script = new emailadmin_script($_scriptName); + if ($script->retrieveRules($this)) { + $script->emailNotification = $_emailNotification; + return $script->updateScript($this); + } + return false; + } + + function retrieveRules($_scriptName) { + if (!$_scriptName) $_scriptName = $this->scriptName; + $script = new emailadmin_script($_scriptName); + + if($script->retrieveRules($this)) { + $this->rules = $script->rules; + $this->vacation = $script->vacation; + $this->emailNotification = $script->emailNotification; // Added email notifications + return true; + } + + return false; + } +} diff --git a/emailadmin/inc/class.emailadmin_smtp_ldap.inc.php b/emailadmin/inc/class.emailadmin_smtp_ldap.inc.php new file mode 100644 index 0000000000..2f8a9dab58 --- /dev/null +++ b/emailadmin/inc/class.emailadmin_smtp_ldap.inc.php @@ -0,0 +1,468 @@ + + * @copyright (c) 2010 by Ralf Becker + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +include_once(EGW_INCLUDE_ROOT.'/emailadmin/inc/class.defaultsmtp.inc.php'); + +/** + * Generic base class for SMTP configuration via LDAP + * + * This class uses just inetOrgPerson schema to store primary mail address and aliases + * + * Aliases are stored as aditional mail Attributes. The primary mail address is the first one. + * This schema does NOT support forwarding or disabling of an account for mail. + * + * Please do NOT copy this class! Extend it and set the constants different + * (incl. protected config var as long as we can not require PHP5.3 for LSB). + */ +class emailadmin_smtp_ldap extends defaultsmtp +{ + /** + * Name of schema, has to be in the right case! + */ + const SCHEMA = 'inetOrgPerson'; + + /** + * Attribute to enable mail for an account, OR false if existence of ALIAS_ATTR is enough for mail delivery + */ + const MAIL_ENABLE_ATTR = false; + /** + * Attribute value to enable mail for an account, OR false if existense of attribute is enough to enable account + */ + const MAIL_ENABLED = false; + + /** + * Attribute for aliases OR false to use mail + */ + const ALIAS_ATTR = false; + + /** + * Primary mail address required as an alias too: true or false + */ + const REQUIRE_MAIL_AS_ALIAS=false; + + /** + * Attribute for forwards OR false if not possible + */ + const FORWARD_ATTR = false; + + /** + * Attribute to only forward mail, OR false if not available + */ + const FORWARD_ONLY_ATTR = false; + /** + * Attribute value to only forward mail + */ + const FORWARD_ONLY = false; + + /** + * Attribute for mailbox, to which mail gets delivered OR false if not supported + */ + const MAILBOX_ATTR = false; + + /** + * Log all LDAP writes / actions to error_log + */ + var $debug = false; + + /** + * LDAP schema configuration + * + * Parent can NOT use constants direct as we have no late static binding in currenlty required PHP 5.2 + * + * @var array + */ + protected $config = array( + 'schema' => self::SCHEMA, + 'mail_enable_attr' => self::MAIL_ENABLE_ATTR, + 'mail_enabled' => self::MAIL_ENABLED, + 'alias_attr' => self::ALIAS_ATTR, + 'require_mail_as_alias' => self::REQUIRE_MAIL_AS_ALIAS, + 'forward_attr' => self::FORWARD_ATTR, + 'forward_only_attr' => self::FORWARD_ONLY_ATTR, + 'forward_only' => self::FORWARD_ONLY, + 'mailbox_attr' => self::MAILBOX_ATTR, + ); + + /** + * from here on implementation, please do NOT copy but extend it! + */ + + /** + * Hook called on account creation + * + * @param array $_hookValues values for keys 'account_email', 'account_firstname', 'account_lastname', 'account_lid' + * @return boolean true on success, false on error writing to ldap + */ + function addAccount($_hookValues) + { + $mailLocalAddress = $_hookValues['account_email'] ? $_hookValues['account_email'] : + common::email_address($_hookValues['account_firstname'], + $_hookValues['account_lastname'],$_hookValues['account_lid'],$this->defaultDomain); + + $ds = $GLOBALS['egw']->ldap->ldapConnect(); + + $filter = "uid=".$_hookValues['account_lid']; + + if (!($sri = @ldap_search($ds,$GLOBALS['egw_info']['server']['ldap_context'],$filter))) + { + return false; + } + $allValues = ldap_get_entries($ds, $sri); + $accountDN = $allValues[0]['dn']; + $objectClasses = $allValues[0]['objectclass']; + unset($objectClasses['count']); + + // add our mail schema, if not already set + if(!in_array($this->config['schema'],$objectClasses) && !in_array(strtolower($this->config['schema']),$objectClasses)) + { + $objectClasses[] = $this->config['schema']; + } + // the new code for postfix+cyrus+ldap + $newData = array( + 'mail' => $mailLocalAddress, + 'objectclass' => $objectClasses + ); + // does schema have explicit alias attribute AND require mail added as alias too + if ($this->config['alias_attr'] && $this->config['require_mail_as_alias'] && $this->config['alias_attr']) + { + $newData[$this->config['alias_attr']] = $mailLocalAddress; + } + // does schema support enabling/disabling mail via attribute + if ($this->config['mail_enable_attr']) + { + $newData[$this->config['mail_enable_attr']] = $this->config['mail_enabled']; + } + // does schema support an explicit mailbox name --> set it + if ($this->config['mailbox_attr']) + { + $newData[$this->config['mailbox_attr']] = self::mailbox_addr($_hookValues); + } + + if (!($ret = ldap_mod_replace($ds, $accountDN, $newData)) || $this->debug) + { + error_log(__METHOD__.'('.array2string(func_get_args()).") --> ldap_mod_replace(,'$accountDN',". + array2string($newData).') returning '.array2string($ret). + (!$ret?' ('.ldap_error($ds).')':'')); + } + return $ret; + } + + /** + * Get all email addresses of an account + * + * @param string $_accountName + * @return array + */ + function getAccountEmailAddress($_accountName) + { + $emailAddresses = array(); + $ds = $GLOBALS['egw']->ldap->ldapConnect(); + $filter = sprintf("(&(uid=%s)(objectclass=posixAccount))",$_accountName); + $attributes = array('dn','mail',$this->config['alias_attr']); + $sri = @ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $attributes); + + if ($sri) + { + $realName = trim($GLOBALS['egw_info']['user']['firstname'] . (!empty($GLOBALS['egw_info']['user']['firstname']) ? ' ' : '') . $GLOBALS['egw_info']['user']['lastname']); + $allValues = ldap_get_entries($ds, $sri); + + if(isset($allValues[0]['mail'])) + { + foreach($allValues[0]['mail'] as $key => $value) + { + if ($key === 'count') continue; + + $emailAddresses[] = array ( + 'name' => $realName, + 'address' => $value, + 'type' => !$key ? 'default' : 'alternate', + ); + } + } + if ($this->config['alias_attr'] && isset($allValues[0][$this->config['alias_attr']])) + { + foreach($allValues[0][$this->config['alias_attr']] as $key => $value) + { + if ($key === 'count') continue; + + $emailAddresses[] = array( + 'name' => $realName, + 'address' => $value, + 'type' => 'alternate' + ); + } + } + } + if ($this->debug) error_log(__METHOD__."('$_acountName') returning ".array2string($emailAddresses)); + + return $emailAddresses; + } + + /** + * Get the data of a given user + * + * @param int $_uidnumber numerical user-id + * @return array + */ + function getUserData($_uidnumber) + { + $userData = array(); + + $ldap = $GLOBALS['egw']->ldap->ldapConnect(); + + if (($sri = @ldap_search($ldap,$GLOBALS['egw_info']['server']['ldap_context'],'(uidnumber='.(int)$_uidnumber.')',array($this->config['schema'])))) + { + $allValues = ldap_get_entries($ldap, $sri); + if ($this->debug) error_log(__METHOD__."($_uidnumber) --> ldap_search(,{$GLOBALS['egw_info']['server']['ldap_context']},'(uidnumber=$_uidnumber)') --> ldap_get_entries=".array2string($allValues[0])); + + if ($allValues['count'] > 0) + { + $userData['mailLocalAddress'] = $allValues[0]['mail'][0]; + if ($this->config['alias_attr']) + { + $userData['mailAlternateAddress'] = (array)$allValues[0][$this->config['alias_attr']]; + unset($userData['mailAlternateAddress']['count']); + } + else + { + $userData['mailAlternateAddress'] = (array)$allValues[0]['mail']; + unset($userData['mailAlternateAddress']['count']); + unset($userData['mailAlternateAddress'][0]); + $userData['mailAlternateAddress'] = array_values($userData['mailAlternateAddress']); + } + if ($this->config['mail_enable_attr']) + { + $userData['accountStatus'] = isset($allValues[0][$this->config['mail_enable_attr']]) && + ($this->config['mail_enabled'] && $allValues[0][$this->config['mail_enable_attr']][0] == $this->config['mail_enabled'] || + !$this->config['mail_enabled'] && $allValues[0][$this->config['alias_attr']]['count'] > 0) ? 'active' : ''; + } + else + { + $userData['accountStatus'] = $allValues[0][$this->config['alias_attr']]['count'] > 0 ? 'active' : ''; + } + $userData['mailForwardingAddress'] = $this->config['forward_attr'] ? $allValues[0][$this->config['forward_attr']] : array(); + unset($userData['mailForwardingAddress']['count']); + + //$userData['deliveryProgramPath'] = $allValues[0][$this->config['mailbox_attr']][0]; + if ($this->config['mailbox_attr']) $userData[$this->config['mailbox_attr']] = $allValues[0][$this->config['mailbox_attr']][0]; + + if ($this->config['forward_only_attr']) + { + $userData['deliveryMode'] = isset($allValues[0][$this->config['forward_only_attr']]) && + ($this->config['forward_only'] && $allValues[0][$this->config['forward_only_attr']][0] == $this->config['forward_only'] || + !$this->config['forward_only'] && $allValues[0][$this->config['forward_only_attr']]['count'] > 0) ? 'forwardOnly' : ''; + } + else + { + $userData['deliveryMode'] = ''; + } + // eg. suse stores all email addresses as aliases + if ($this->config['require_mail_as_alias'] && + ($k = array_search($userData['mailLocalAddress'],$userData['mailAlternateAddress'])) !== false) + { + unset($userData['mailAlternateAddress'][$k]); + } + } + } + if ($this->debug) error_log(__METHOD__."('$_uidnumber') returning ".array2string($userData)); + + return $userData; + } + + /** + * Set the data of a given user + * + * @param int $_uidnumber numerical user-id + * @param array $_mailAlternateAddress + * @param array $_mailForwardingAddress + * @param string $_deliveryMode + * @param string $_accountStatus + * @param string $_mailLocalAddress + * @return boolean true on success, false on error writing to ldap + */ + function setUserData($_uidnumber, $_mailAlternateAddress, $_mailForwardingAddress, $_deliveryMode, $_accountStatus, $_mailLocalAddress) + { + $filter = 'uidnumber='.(int)$_uidnumber; + + $ldap = $GLOBALS['egw']->ldap->ldapConnect(); + + if (!($sri = @ldap_search($ldap,$GLOBALS['egw_info']['server']['ldap_context'],$filter))) + { + return false; + } + $allValues = ldap_get_entries($ldap, $sri); + + $accountDN = $allValues[0]['dn']; + $uid = $allValues[0]['uid'][0]; + $objectClasses = $allValues[0]['objectclass']; + + unset($objectClasses['count']); + + if(!in_array($this->config['schema'],$objectClasses) && !in_array(strtolower($this->config['schema']),$objectClasses)) + { + $objectClasses[] = $this->config['schema']; + $newData['objectclass'] = $objectClasses; + } + + sort($_mailAlternateAddress); + sort($_mailForwardingAddress); + + $newData['mail'] = $_mailLocalAddress; + // does schema have explicit alias attribute + if ($this->config['alias_attr']) + { + $newData[$this->config['alias_attr']] = (array)$_mailAlternateAddress; + + // all email must be stored as alias for suse + if ($this->config['require_mail_as_alias'] && !in_array($_mailLocalAddress,(array)$_mailAlternateAddress)) + { + $newData[$this->config['alias_attr']][] = $_mailLocalAddress; + } + } + // or de we add them - if existing - to mail attr + elseif ($_mailAlternateAddress) + { + $newData['mail'] = array_merge((array)$newData['mail'],(array)$_mailAlternateAddress); + } + // does schema support to store forwards + if ($this->config['forward_attr']) + { + $newData[$this->config['forward_attr']] = (array)$_mailForwardingAddress; + } + // does schema support only forwarding incomming mail + if ($this->config['forward_only_attr']) + { + $newData[$this->config['forward_only_attr']] = $_deliveryMode ? $this->config['forward_only'] : array(); + } + // does schema support enabling/disabling mail via attribute + if ($this->config['mail_enable_attr']) + { + $newData[$this->config['mail_enable_attr']] = $_accountStatus ? $this->config['mail_enabled'] : array(); + } + // does schema support an explicit mailbox name --> set it with $uid@$domain + if ($this->config['mailbox_attr']) + { + $newData[$this->config['mailbox_attr']] = self::mailbox_addr(array( + 'account_id' => $_uidnumber, + 'account_lid' => $uid, + 'account_email' => $_mailLocalAddress, + )); + } + if ($this->debug) error_log(__METHOD__.'('.array2string(func_get_args()).") --> ldap_mod_replace(,'$accountDN',".array2string($newData).')'); + + return ldap_mod_replace($ldap, $accountDN, $newData); + } + + /** + * Saves the forwarding information + * + * @param int $_accountID + * @param string $_forwardingAddress + * @param string $_keepLocalCopy 'yes' + * @return boolean true on success, false on error writing to ldap + */ + function saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy) + { + $ds = $GLOBALS['egw']->ldap->ldapConnect(); + $filter = sprintf('(&(uidnumber=%d)(objectclass=posixAccount))',$_accountID); + $attributes = array('dn',$this->config['forward_attr'],'objectclass'); + if ($this->config['forward_only_attr']) + { + $attributes[] = $this->config['forward_only_attr']; + } + $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $attributes); + + if ($sri) + { + $newData = array(); + $allValues = ldap_get_entries($ds, $sri); + $objectClasses = $allValues[0]['objectclass']; + $newData['objectclass'] = $allValues[0]['objectclass']; + + unset($newData['objectclass']['count']); + + if(!in_array($this->config['schema'],$objectClasses)) + { + $newData['objectclass'][] = $this->config['schema']; + } + if ($this->config['forward_attr']) + { + if(!empty($_forwardingAddress)) + { + if(is_array($allValues[0][$this->config['forward_attr']])) + { + $newData[$this->config['forward_attr']] = $allValues[0][$this->config['forward_attr']]; + unset($newData[$this->config['forward_attr']]['count']); + $newData[$this->config['forward_attr']][0] = $_forwardingAddress; + } + else + { + $newData[$this->config['forward_attr']] = (array)$_forwardingAddress; + } + if ($this->config['forward_only_attr']) + { + $newData['deliverymode'] = $_keepLocalCopy == 'yes' ? array() : $this->config['forward_only']; + } + } + else + { + $newData[$this->config['forward_attr']] = array(); + } + } + if ($this->debug) error_log(__METHOD__.'('.array2string(func_get_args()).") --> ldap_mod_replace(,'$accountDN',".array2string($newData).')'); + + return ldap_modify ($ds, $allValues[0]['dn'], $newData); + } + } + + /** + * Build mailbox address for given account and mail_addr_type + * + * If $account is an array (with values for keys account_(id|lid|email), it does NOT call accounts class + * + * @param int|array $account account_id or whole account array with values for keys + * @param string $domain=null domain, default use $this->defaultDomain + * @param string $mail_login_type=null standard(uid), vmailmgr(uid@domain), email or uidNumber, + * default use $GLOBALS['egw_info']['server']['mail_login_type'] + * @return string + */ + /*static*/ public function mailbox_addr($account,$domain=null,$mail_login_type=null) + { + if (is_null($domain)) $domain = $this->defaultDomain; + if (is_null($mail_login_type)) $mail_login_type = $GLOBALS['egw_info']['server']['mail_login_type']; + + switch($mail_login_type) + { + case 'email': + $mbox = is_array($account) ? $account['account_email'] : $GLOBALS['egw']->accounts->id2name($account,'account_email'); + break; + + case 'uidNumber': + if (is_array($account)) $account = $account['account_id']; + $mbox = 'u'.$account.'@'.$domain; + break; + + case 'standard': + $mbox = is_array($account) ? $account['account_lid'] : $GLOBALS['egw']->accounts->id2name($account); + break; + + case 'vmailmgr': + default: + $mbox = is_array($account) ? $account['account_lid'] : $GLOBALS['egw']->accounts->id2name($account); + $mbox .= '@'.$domain; + break; + } + if ($this->debug) error_log(__METHOD__."(".array2string($account).",'$domain','$mail_login_type') = '$mbox'"); + + return $mbox; + } +} diff --git a/emailadmin/inc/class.emailadmin_so.inc.php b/emailadmin/inc/class.emailadmin_so.inc.php new file mode 100644 index 0000000000..1b89366040 --- /dev/null +++ b/emailadmin/inc/class.emailadmin_so.inc.php @@ -0,0 +1,462 @@ + 'profileID', + 'ea_smtp_server' => 'smtpServer', + 'ea_smtp_type' => 'smtpType', + 'ea_smtp_port' => 'smtpPort', + 'ea_smtp_auth' => 'smtpAuth', + 'ea_editforwardingaddress' => 'editforwardingaddress', + 'ea_smtp_ldap_server' => 'smtpLDAPServer', + 'ea_smtp_ldap_basedn' => 'smtpLDAPBaseDN', + 'ea_smtp_ldap_admindn' => 'smtpLDAPAdminDN', + 'ea_smtp_ldap_adminpw' => 'smtpLDAPAdminPW', + 'ea_smtp_ldap_use_default' => 'smtpLDAPUseDefault', + 'ea_imap_server' => 'imapServer', + 'ea_imap_type' => 'imapType', + 'ea_imap_port' => 'imapPort', + 'ea_imap_login_type' => 'imapLoginType', + 'ea_imap_auth_username' => 'imapAuthUsername', + 'ea_imap_auth_password' => 'imapAuthPassword', + 'ea_imap_tsl_auth' => 'imapTLSAuthentication', + 'ea_imap_tsl_encryption' => 'imapTLSEncryption', + 'ea_imap_enable_cyrus' => 'imapEnableCyrusAdmin', + 'ea_imap_admin_user' => 'imapAdminUsername', + 'ea_imap_admin_pw' => 'imapAdminPW', + 'ea_imap_enable_sieve' => 'imapEnableSieve', + 'ea_imap_sieve_server' => 'imapSieveServer', + 'ea_imap_sieve_port' => 'imapSievePort', + 'ea_description' => 'description', + 'ea_default_domain' => 'defaultDomain', + 'ea_organisation_name' => 'organisationName', + 'ea_user_defined_identities' => 'userDefinedIdentities', + 'ea_user_defined_accounts' => 'userDefinedAccounts', + 'ea_order' => 'ea_order', + 'ea_active' => 'ea_active', + 'ea_group' => 'ea_group', + 'ea_user' => 'ea_user', + 'ea_appname' => 'ea_appname', + 'ea_smtp_auth_username' => 'ea_smtp_auth_username', + 'ea_smtp_auth_password' => 'ea_smtp_auth_password', + 'ea_user_defined_signatures' => 'ea_user_defined_signatures', + 'ea_default_signature' => 'ea_default_signature', + 'ea_stationery_active_templates' => 'ea_stationery_active_templates', + ); + + function __construct() + { + if (is_object($GLOBALS['egw_setup']->db)) + { + $this->db = clone($GLOBALS['egw_setup']->db); + } + else + { + $this->db = clone($GLOBALS['egw']->db); + } + $this->db->set_app('emailadmin'); + } + + /** + * Convert array with internal values/names to db-column-names + * + * @param array $vals + * @return array + */ + function vals2db($vals) + { + $cols = array(); + foreach($vals as $key => $val) + { + if (($k = array_search($key,$this->db_cols)) === false) $k = $key; + + $cols[$k] = $val; + } + return $cols; + } + + /** + * Convert array with db-columns/-values to internal names + * + * @param array $vals + * @return array + */ + function db2vals($cols) + { + $vals = array(); + foreach($cols as $key => $val) + { + if (isset($this->db_cols[$key])) $key = $this->db_cols[$key]; + + $vals[$key] = $val; + } + return $vals; + } + + function updateProfile($_globalSettings, $_smtpSettings=array(), $_imapSettings=array()) + { + $profileID = (int) $_globalSettings['profileID']; + unset($_globalSettings['profileID']); + + $where = $profileID ? array('ea_profile_id' => $profileID) : false; + + $this->db->insert($this->table,$this->vals2db($_smtpSettings+$_globalSettings+$_imapSettings),$where,__LINE__,__FILE__); + + return $profileID ? $profileID : $this->db->get_last_insert_id($this->table,'ea_profile_id'); + } + + function addProfile($_globalSettings, $_smtpSettings, $_imapSettings) + { + unset($_globalSettings['profileID']); // just in case + + return $this->updateProfile($_globalSettings, $_smtpSettings, $_imapSettings); + } + + function deleteProfile($_profileID) + { + $this->db->delete($this->table,array('ea_profile_id' => $_profileID),__LINE__ , __FILE__); + } + + function getProfile($_profileID, $_fieldNames) + { + $_fieldNames = array_keys($this->vals2db(array_flip($_fieldNames))); + $this->db->select($this->table,$_fieldNames,array('ea_profile_id' => $_profileID), __LINE__, __FILE__); + + if (($data = $this->db->row(true))) { + return $this->db2vals($data); + } + return $data; + } + + function getUserProfile($_appName, $_groups, $_user = NULL) + { + if(empty($_appName) || !is_array($_groups)) + return false; + if (!empty($_user)) { + $where = $this->db->expression( + $this->table,'(', + array('ea_appname'=>$_appName), + ' OR ea_appname IS NULL or ea_appname = \'\') and ', + '(', + array('ea_group'=>$_groups), + ' OR ea_group IS NULL or ea_group = \'\') and ', + '(', + array('ea_user'=>$_user), + ' OR ea_user IS NULL or ea_user = \'0\' or ea_user = \'\')' + ); + } else { + $where = $this->db->expression( + $this->table,'(', + array('ea_appname'=>$_appName), + ' OR ea_appname IS NULL or ea_appname = \'\') and ', + '(', + array('ea_group'=>$_groups), + ' OR ea_group IS NULL or ea_group = \'\')' + ); + } + $anyValues = 0; + // retrieve the Global/Overall Settings + $this->db->select($this->table,'ea_profile_id',$where, __LINE__, __FILE__, false, 'ORDER BY ea_order', false, 1); + if (($data = $this->db->row(true))) { + $globalDefaults = $this->getProfile($data['ea_profile_id'], $this->db_cols); + $anyValues++; + } else { + error_log("emailadmin::emailadmin_so->getUserProfile, no Default configured"); + $globalDefaults = array(); + } + // retrieve application settings if set + if (strlen($_appName)>0) { + $this->db->select($this->table,'ea_profile_id',$this->db->expression($this->table,'(',array('ea_appname'=>$_appName),' and ea_active=1)'), __LINE__, __FILE__, false, 'ORDER BY ea_order', false, 1); + if (($data = $this->db->row(true))) { + $appDefaults = $this->getProfile($data['ea_profile_id'], $this->db_cols); + $globalDefaults = self::mergeProfileData($globalDefaults, $appDefaults); + $anyValues++; + } + } + // retrieve primary-group settings if set + if (is_array($_groups) && $_groups[1] == $GLOBALS['egw_info']['user']['account_primary_group']) { + $this->db->select($this->table,'ea_profile_id',$this->db->expression($this->table,'(',array('ea_group'=>$_groups[1]),' and ea_active=1)'), __LINE__, __FILE__, false, 'ORDER BY ea_order', false, 1); + if (($data = $this->db->row(true))) { + $groupDefaults = $this->getProfile($data['ea_profile_id'], $this->db_cols); + $globalDefaults = self::mergeProfileData($globalDefaults, $groupDefaults); + $anyValues++; + } + } + // retrieve usersettings if set + if (!empty($_user) && $_user != 0) { + $this->db->select($this->table,'ea_profile_id',$this->db->expression($this->table,'(',array('ea_user'=>$_user),' and ea_active=1)'), __LINE__, __FILE__, false, 'ORDER BY ea_order', false, 1); + if (($data = $this->db->row(true))) { + $userDefaults = $this->getProfile($data['ea_profile_id'], $this->db_cols); + $globalDefaults = self::mergeProfileData($globalDefaults, $userDefaults); + $anyValues++; + } + } + if ($anyValues) { + return $globalDefaults; + } else { + return false; + } + } + + /* + * merge profile data. + * for each key of the mergeInTo Array check if there is a value set in the toMerge Array and replace it. + */ + static function mergeProfileData($mergeInTo, $toMerge) + { + if (is_array($toMerge) && count($toMerge)>0) + { + $allkeys = array_unique(array_keys($mergeInTo)+array_keys($toMerge)); + foreach ($allkeys as $i => $key) { + if (!array_key_exists($key, $mergeInTo) && array_key_exists($key, $toMerge) && !empty($toMerge[$key])) + { + $mergeInTo[$key]=$toMerge[$key]; + } else { + if (array_key_exists($key, $toMerge) && !empty($toMerge[$key])) + { + #error_log($key.'->'.$toMerge[$key]); + switch ($key) { + case 'imapLoginType': + // if the logintype is admin, it will be added to the default value + if ($toMerge[$key] =='admin' || $toMerge[$key] =='email') { + // take the first value found by explode, which is assumed the default value + list($mergeInTo[$key],$rest) = explode('#',$mergeInTo[$key],2); + $mergeInTo[$key] = $mergeInTo[$key].'#'.$toMerge[$key]; + #error_log($mergeInTo[$key]); + break; + } + case 'imapServer': + case 'imapType': + case 'imapPort': + case 'imapTLSEncryption': + case 'imapTLSAuthentication': + case 'imapEnableCyrusAdmin': + case 'imapAdminUsername': + case 'imapAdminPW': + if (strlen($toMerge['imapServer'])>0) $mergeInTo[$key]=$toMerge[$key]; + break; + case 'smtpPort': + case 'smtpType': + case 'smtpServer': + if (strlen($toMerge['smtpServer'])>0) $mergeInTo[$key]=$toMerge[$key]; + break; + case 'smtpLDAPServer': + case 'smtpLDAPBaseDN': + case 'smtpLDAPAdminDN': + case 'smtpLDAPAdminPW': + case 'smtpLDAPUseDefault': + if (strlen($toMerge['smtpLDAPServer'])>0) $mergeInTo[$key]=$toMerge[$key]; + break; + case 'ea_default_signature': + $testVal = $toMerge['ea_default_signature']; + //bofelamimail::getCleanHTML($testVal); + $testVal = html::purify($testVal); + if (strlen($testVal)>10 || $testVal != '
' || $testVal != '
') $mergeInTo[$key]=$toMerge[$key]; + break; + default: + $mergeInTo[$key]=$toMerge[$key]; + } + } + } + } + } + return $mergeInTo; + } + + function getProfileList($_profileID=0,$_defaultProfile=false,$_appName=false,$_groupID=false,$_accountID=false) + { + $where = false; + if ((int) $_profileID) + { + $where = array('ea_profile_id' => $_profileID); + } + elseif ($_defaultProfile) + { + $where[] = "(ea_appname ='' or ea_appname is NULL)"; + $where[] = "(ea_group=0 or ea_group is NULL)"; + $where[] = "(ea_user =0 or ea_user is NULL)"; + } + elseif ($_appName) + { + $where['ea_appname'] = $_appName; + } + elseif ((int) $_groupID) + { + $where['ea_group'] = (int) $_groupID; + } + elseif ((int) $_accountID) + { + $where['ea_user'] = (int) $_accountID; + } + //error_log(__METHOD__.__LINE__.' Where Condition:'.array2string($where).' Backtrace:'.function_backtrace()); + $this->db->select($this->table,'*',$where, __LINE__,__FILE__,false,(int) $_profileID ? '' : 'ORDER BY ea_order'); + + $serverList = false; + while (($row = $this->db->row(true))) + { + $serverList[] = $this->db2vals($row); + } + return $serverList; + } + + function getUserData($_accountID) + { + $ldap = $GLOBALS['egw']->common->ldapConnect(); + + if (($sri = @ldap_search($ldap,$GLOBALS['egw_info']['server']['ldap_context'],"(uidnumber=$_accountID)"))) + { + $allValues = ldap_get_entries($ldap, $sri); + if ($allValues['count'] > 0) + { + #print "found something
"; + $userData["mailLocalAddress"] = $allValues[0]["mail"][0]; + $userData["mailAlternateAddress"] = $allValues[0]["mailalternateaddress"]; + $userData["accountStatus"] = $allValues[0]["accountstatus"][0]; + $userData["mailRoutingAddress"] = $allValues[0]["mailforwardingaddress"]; + $userData["qmailDotMode"] = $allValues[0]["qmaildotmode"][0]; + $userData["deliveryProgramPath"] = $allValues[0]["deliveryprogrampath"][0]; + $userData["deliveryMode"] = $allValues[0]["deliverymode"][0]; + + unset($userData["mailAlternateAddress"]["count"]); + unset($userData["mailRoutingAddress"]["count"]); + + return $userData; + } + } + + // if we did not return before, return false + return false; + } + + function saveUserData($_accountID, $_accountData) + { + $ldap = $GLOBALS['egw']->common->ldapConnect(); + // need to be fixed + if(is_numeric($_accountID)) + { + $filter = "uidnumber=$_accountID"; + } + else + { + $filter = "uid=$_accountID"; + } + + $sri = @ldap_search($ldap,$GLOBALS['egw_info']['server']['ldap_context'],$filter); + if ($sri) + { + $allValues = ldap_get_entries($ldap, $sri); + $accountDN = $allValues[0]['dn']; + $uid = $allValues[0]['uid'][0]; + $homedirectory = $allValues[0]['homedirectory'][0]; + $objectClasses = $allValues[0]['objectclass']; + + unset($objectClasses['count']); + } + else + { + return false; + } + + if(empty($homedirectory)) + { + $homedirectory = "/home/".$uid; + } + + // the old code for qmail ldap + $newData = array + ( + 'mail' => $_accountData["mailLocalAddress"], + 'mailAlternateAddress' => $_accountData["mailAlternateAddress"], + 'mailRoutingAddress' => $_accountData["mailRoutingAddress"], + 'homedirectory' => $homedirectory, + 'mailMessageStore' => $homedirectory."/Maildir/", + 'gidnumber' => '1000', + 'qmailDotMode' => $_accountData["qmailDotMode"], + 'deliveryProgramPath' => $_accountData["deliveryProgramPath"] + ); + + if(!in_array('qmailUser',$objectClasses) && + !in_array('qmailuser',$objectClasses)) + { + $objectClasses[] = 'qmailuser'; + } + + // the new code for postfix+cyrus+ldap + $newData = array + ( + 'mail' => $_accountData["mailLocalAddress"], + 'accountStatus' => $_accountData["accountStatus"], + 'objectclass' => $objectClasses + ); + + if(is_array($_accountData["mailAlternateAddress"])) + { + $newData['mailAlternateAddress'] = $_accountData["mailAlternateAddress"]; + } + else + { + $newData['mailAlternateAddress'] = array(); + } + + if($_accountData["accountStatus"] == 'active') + { + $newData['accountStatus'] = 'active'; + } + else + { + $newData['accountStatus'] = 'disabled'; + } + + if(!empty($_accountData["deliveryMode"])) + { + $newData['deliveryMode'] = $_accountData["deliveryMode"]; + } + else + { + $newData['deliveryMode'] = array(); + } + + + if(is_array($_accountData["mailRoutingAddress"])) + { + $newData['mailForwardingAddress'] = $_accountData["mailRoutingAddress"]; + } + else + { + $newData['mailForwardingAddress'] = array(); + } + + #print "DN: $accountDN
"; + ldap_mod_replace ($ldap, $accountDN, $newData); + #print ldap_error($ldap); + + // also update the account_email field in egw_accounts + // when using sql account storage + if($GLOBALS['egw_info']['server']['account_repository'] == 'sql') + { + $this->db->update('egw_accounts',array( + 'account_email' => $_accountData["mailLocalAddress"] + ), + array( + 'account_id' => $_accountID + ),__LINE__,__FILE__ + ); + } + return true; + } + } +?> diff --git a/emailadmin/inc/class.emailadmin_tracking.inc.php b/emailadmin/inc/class.emailadmin_tracking.inc.php new file mode 100644 index 0000000000..ca27914aac --- /dev/null +++ b/emailadmin/inc/class.emailadmin_tracking.inc.php @@ -0,0 +1,281 @@ + + * @package addressbook + * @copyright (c) 2007 by Ralf Becker + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id: class.emailadmin_tracking.inc.php 29941 2010-04-22 15:39:32Z nathangray $ + */ + +/** + * EMailAdmin - tracking object + */ +class emailadmin_tracking extends bo_tracking +{ + /** + * Application we are tracking (required!) + * + * @var string + */ + var $app = 'emailadmin'; + /** + * Name of the id-field, used as id in the history log (required!) + * + * @var string + */ + var $id_field = 'ea_profile_id'; + /** + * Name of the field with the creator id, if the creator of an entry should be notified + * + * @var string + */ + //var $creator_field = ''; + /** + * Name of the field with the id(s) of assinged users, if they should be notified + * + * @var string + */ + //var $assigned_field = ''; + /** + * Translate field-name to 2-char history status + * + * @var array + */ + var $field2history = array( + 'ea_smtp_server' => 'ea_smtp_server', + 'ea_smtp_type' => 'ea_smtp_type', + 'ea_smtp_port' => 'ea_smtp_port', + 'ea_smtp_auth' => 'ea_smtp_auth', + 'ea_editforwardingaddress' => 'ea_editforwardingaddress', + 'ea_smtp_ldap_server' => 'ea_smtp_ldap_server', + 'ea_smtp_ldap_basedn' => 'ea_smtp_ldap_basedn', + 'ea_smtp_ldap_admindn' => 'ea_smtp_ldap_admindn', + 'ea_smtp_ldap_adminpw' => 'ea_smtp_ldap_adminpw', + 'ea_smtp_ldap_use_default' => 'ea_smtp_ldap_use_default', + 'ea_imap_server' => 'ea_imap_server', + 'ea_imap_type' => 'ea_imap_type', + 'ea_imap_port' => 'ea_imap_port', + 'ea_imap_login_type' => 'ea_imap_login_type', + 'ea_imap_tsl_auth' => 'ea_imap_tsl_auth', + 'ea_imap_tsl_encryption' => 'ea_imap_tsl_encryption', + 'ea_imap_enable_cyrus' => 'ea_imap_enable_cyrus', + 'ea_imap_admin_user' => 'ea_imap_admin_user', + 'ea_imap_admin_pw' => 'ea_imap_admin_pw', + 'ea_imap_enable_sieve' => 'ea_imap_enable_sieve', + 'ea_imap_sieve_server' => 'ea_imap_sieve_server', + 'ea_imap_sieve_port' => 'ea_imap_sieve_port', + 'ea_description' => 'ea_description', + 'ea_default_domain' => 'ea_default_domain', + 'ea_organisation_name' => 'ea_organisation_name', + 'ea_user_defined_identities' => 'ea_user_defined_identities', + 'ea_user_defined_accounts' => 'ea_user_defined_accounts', + 'ea_order' => 'ea_order', + 'ea_appname' => 'ea_appname', + 'ea_group' => 'ea_group', + 'ea_user' => 'ea_user', + 'ea_active' => 'ea_active', + 'ea_smtp_auth_username' => 'ea_smtp_auth_username', + 'ea_smtp_auth_password' => 'ea_smtp_auth_password', + 'ea_user_defined_signatures' => 'ea_user_defined_signatures', + 'ea_default_signature' => 'ea_default_signature', + 'ea_imap_auth_username' => 'ea_imap_auth_username', + 'ea_imap_auth_password' => 'ea_imap_auth_password', + 'ea_stationery_active_templates' => 'ea_stationery_active_templates' + ); + + /** + * Translate field name to label + */ + public $field2label = array( + 'ea_smtp_server' => 'SMTP server', + 'ea_smtp_type' => 'SMTP type', + 'ea_smtp_port' => 'SMTP port', + 'ea_smtp_auth' => 'SMTP authentification', + 'ea_editforwardingaddress' => 'edit forwarding address', + 'ea_smtp_ldap_server' => 'SMTP Ldap Server', + 'ea_smtp_ldap_basedn' => '', + 'ea_smtp_ldap_admindn' => '', + 'ea_smtp_ldap_adminpw' => 'SMTP Ldap admin password', + 'ea_smtp_ldap_use_default' => 'SMTP Ldap use default', + 'ea_imap_server' => 'IMAP server', + 'ea_imap_type' => 'IMAP type', + 'ea_imap_port' => 'IMAP port', + 'ea_imap_login_type' => 'IMAP login type', + 'ea_imap_tsl_auth' => 'IMAP Tsl authentification', + 'ea_imap_tsl_encryption' => 'IMAP Tsl encryption', + 'ea_imap_enable_cyrus' => 'IMAP enable Cyrus', + 'ea_imap_admin_user' => 'IMAP admin user', + 'ea_imap_admin_pw' => 'IMAP admin password', + 'ea_imap_enable_sieve' => 'IMAP enable Sieve', + 'ea_imap_sieve_server' => 'IMAP Sieve server', + 'ea_imap_sieve_port' => 'IMAP Sieve port', + 'ea_description' => 'Description', + 'ea_default_domain' => 'Default domain', + 'ea_organisation_name' => 'Organisation', + 'ea_user_defined_identities' => 'User defined identities', + 'ea_user_defined_accounts' => 'User defined accounts', + 'ea_order' => 'Order', + 'ea_appname' => 'Application', + 'ea_group' => 'Group', + 'ea_user' => 'User', + 'ea_active' => 'Active', + 'ea_smtp_auth_username' => 'SMTP authentification user', + 'ea_smtp_auth_password' => 'SMTP authentification password', + 'ea_user_defined_signatures' => 'User defined signatures', + 'ea_default_signature' => 'Default signature', + 'ea_imap_auth_username' => 'IMAP authentification user', + 'ea_imap_auth_password' => 'IMAP authentification password', + 'ea_stationery_active_templates' => '' + ); + + /** + * Fields that contain passwords + */ + static $passwordFields = array( + 'ea_smtp_auth_password', + 'ea_imap_auth_password', + 'ea_smtp_ldap_adminpw', + 'ea_imap_admin_pw', + ); + + /** + * Should the user (passed to the track method or current user if not passed) be used as sender or get_config('sender') + * + * @var boolean + */ + var $prefer_user_as_sender = false; + /** + * Instance of the emailadmin_bo class calling us + * + * @access private + * @var emailadmin_bo + */ + var $emailadmin_bo; + + /** + * Constructor + * + * @param emailadmin_bo &$emailadmin_bo + * @return tracker_tracking + */ + function __construct(&$emailadmin_bo) + { + parent::__construct(); // calling the constructor of the extended class + + $this->emailadmin_bo =& $emailadmin_bo; + } + + /** + * Tracks the changes in one entry $data, by comparing it with the last version in $old + * + * @param array $data current entry + * @param array $old=null old/last state of the entry or null for a new entry + * @param int $user=null user who made the changes, default to current user + * @param boolean $deleted=null can be set to true to let the tracking know the item got deleted or undeleted + * @param array $changed_fields=null changed fields from ealier call to $this->changed_fields($data,$old), to not compute it again + * @param boolean $skip_notification=false do NOT send any notification + * @return int|boolean false on error, integer number of changes logged or true for new entries ($old == null) + */ + public function track(array $data,array $old=null,$user=null,$deleted=null,array $changed_fields=null,$skip_notification=false) + { + foreach (self::$passwordFields as $k => $v) + { + if (is_array($data)) + { + foreach($data as $key => &$dd) + { + if ($key == $v && !empty($dd)) + { + $dd = $this->maskstring($dd); + } + } + } + if (is_array($old)) + { + foreach($old as $ko => &$do) + { + //error_log(__METHOD__.__LINE__.$ko); + if ($ko == $v && !empty($do)) + { + $do = $this->maskstring($do); + } + } + } + } + //error_log(__METHOD__.__LINE__.array2string($data)); + //error_log(__METHOD__.__LINE__.array2string($old)); + + return parent::track($data,$old,$user,$deleted,$changed_fields,$skip_notifications); + } + + private function maskstring($data) + { + $length =strlen($data); + $first = substr($data,0,1); + $last = substr($data,-1); + if ($length<3) + { + $data = str_repeat('*',$length); + } + else + { + $data = $first.str_repeat('*',($length-2>0?$length-2:1)).$last; + } + return $data; + } + + /** + * Get a notification-config value + * + * @param string $what + * - 'copy' array of email addresses notifications should be copied too, can depend on $data + * - 'lang' string lang code for copy mail + * - 'sender' string send email address + * @param array $data current entry + * @param array $old=null old/last state of the entry or null for a new entry + * @return mixed + */ + function get_config($name,$data,$old=null) + { + return null; + } + + /** + * Get the modified / new message (1. line of mail body) for a given entry, can be reimplemented + * + * @param array $data + * @param array $old + * @return string + */ + function get_message($data,$old) + { + return null; + } + + /** + * Get the subject of the notification + * + * @param array $data + * @param array $old + * @return string + */ + function get_subject($data,$old) + { + return null; + } + + /** + * Get the details of an entry + * + * @param array $data + * + * @return array of details as array with values for keys 'label','value','type' + */ + function get_details($data) + { + return null; + } +} diff --git a/emailadmin/inc/class.emailadmin_ui.inc.php b/emailadmin/inc/class.emailadmin_ui.inc.php new file mode 100644 index 0000000000..c9c5d3a733 --- /dev/null +++ b/emailadmin/inc/class.emailadmin_ui.inc.php @@ -0,0 +1,428 @@ + + * @copyright (c) 2009-10 by Klaus Leithoff + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * User interface + */ +class emailadmin_ui extends emailadmin_bo +{ + var $public_functions = array + ( + 'index' => True, + 'add' => True, + 'delete' => True, + 'edit' => True, + 'save' => True, + 'listProfiles' => True, + ); + + function __construct() + { + parent::__construct(); + } + + /** + * Main emailadmin page + * + * @param array $content=null + * @param string $msg=null + */ + function index(array $content=null,$msg=null) + { + $accountID = false; + $groupID = false; + $filter = ''; + $rowsfound = 0; + if(is_int(intval($_GET['account_id'])) && !empty($_GET['account_id'])) + { + if ( intval($_GET['account_id']) < 0 ) { + $groupID = intval($_GET['account_id']); + $filter['ea_group'] = intval($_GET['account_id']); + } else { + $accountID = intval($_GET['account_id']); + $filter['ea_user'] = intval($_GET['account_id']); + } + $r = parent::search($filter); + $rowsfound = count($r); + } + if ($rowsfound) + { + if (($accountID || !empty($groupID)) && $rowsfound == 1) + { + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.edit', + 'profileid' => $r[0]['ea_profile_id'] + ); + $addJavaScript = "'; + } + } else { + if ($accountID || !empty($groupID)) { + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.edit', + 'account_id' => ($accountID ? $accountID : $groupID) + ); + $addJavaScript = "'; + } + } + if ($accountID || !empty($groupID)) { + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.index', + ); + $listLink = ''. + lang('reset filter').''; + + if ($GLOBALS['egw_info']['user']['apps']['admin']) { + $linkData = array + ( + 'menuaction' => 'admin.uiaccounts.list_'.($accountID ? 'users' : 'groups'), + ); + $listLink2 = ''.($accountID ? lang('Back to Admin/Userlist'): lang('Back to Admin/Grouplist')).''; + } + unset($r); + $subtitle = ($accountID || !empty($groupID) ? ' '.($accountID ? lang('filtered by Account') : lang('filtered by Group')).' ['.$listLink.']'.' ['.$listLink2.']': ''); + } + //_debug_array($content); + $tpl = new etemplate('emailadmin.index'); + if (!is_array($content)) + { + $content = array( + 'nm' => $GLOBALS['egw']->session->appsession('index',parent::APP), + ); + if (!is_array($content['nm'])) + { + $content['nm'] = array( + 'get_rows' => 'emailadmin.emailadmin_ui.get_rows', // I method/callback to request the data for the rows + 'no_filter' => True, // nofilter + 'no_filter2' => True, // I disable the 2. filter (params are the same as for filter) + 'no_cat' => True, // I disable the cat-selectbox + 'lettersearch' => True, // I show a lettersearch + 'searchletter' => false, // I0 active letter of the lettersearch or false for [all] + 'start' => 0, // IO position in list + 'order' => 'ea_order, ea_profile_id', // IO name of the column to sort after (optional for the sortheaders) + 'sort' => 'ASC', // IO direction of the sort: 'ASC' or 'DESC' + //'default_cols' => '!comment,ctime', // I columns to use if there's no user or default pref (! as first char uses all but the columns listed) + 'csv_fields' => false, // I false=disable csv export, true or unset=enable it with auto-detected fieldnames, + //or array with name=>label or name=>array('label'=>label,'type'=>type) pairs (type is a eT widget-type) + ); + } + } + elseif(isset($content['nm']['rows']['delete'])) + { + list($profileids) = each($content['nm']['rows']['delete']); + unset($content['nm']['rows']['delete']); + if ($profileids && self::delete($profileids)) + { + $content['msg'] = lang('%1 entries deleted.',1); + } + else + { + $content['msg'] = lang('Error deleting entry!'); + } + } + elseif(isset($content['delete'])) + { + unset($content['delete']); + if (($deleted = self::delete($content['nm']['rows']['selected']))) + { + $content['msg'] = lang('%1 entries deleted.',$deleted); + } + else + { + $content['msg'] = lang('Error deleting entry!'); + } + } + + if (isset($_GET['msg'])) $msg = $_GET['msg']; + $content['msg'] .= $msg; + /* + if ($content['action'] || $content['nm']['rows']) + { + if ($content['action']) + { + // SOME ACTION AS EDIT, DELETE, ... + $content['msg'] = self::action($content['action'],$content['nm']['rows']['checked']); + unset($content['action']); + } + elseif($content['nm']['rows']['delete']) + { + $content['msg'] = self::action('delete',array_keys($content['nm']['rows']['delete'])); + } + unset($content['nm']['rows']); + } + */ + if ($content['AddProfile']) + { + unset($content['AddProfile']); + } + if ($content['button']) + { + if ($content['button']) + { + list($button) = each($content['button']); + unset($content['button']); + } + switch($button) + { + default: + break; + } + } + $sel_options['ea_smtp_type']=parent::getSMTPServerTypes(); + $sel_options['ea_imap_type']=parent::getIMAPServerTypes(false); + $sel_options['ea_appname'] =self::getAllowedApps(); + // setting for the top of the app, etc. + $content['addJavaScript'] = $addJavaScript; + $content['subtitle'] = $subtitle; + if (!empty($filter)) foreach ($filter as $fk => $fv) $content['nm']['col_filter'][$fk] = $fv; + // seTting the Title of the app + $GLOBALS['egw_info']['flags']['app_header'] = lang('emailadmin'); + $tpl->exec('emailadmin.emailadmin_ui.index',$content,$sel_options,$readonlys,array('nm' => $content['nm'])); + } + + /** + * query the table + * + * reimplemented from so_sql to disable action-buttons based on the acl and make some modification on the data + * + * @param array &$query + * @param array &$rows returned rows/cups + * @param array &$readonlys eg. to disable buttons based on acl + * @param boolean $id_only=false if true only return (via $rows) an array of ids, dont save state to session + * @return int total number of rows matching the selection + */ + function get_rows(&$query_in,&$rows,&$readonlys,$id_only=false) + { + $query = $query_in; + $filteredby = ''; + if ($query['searchletter']) // only show rows if the order-criteria starts with the given letter + { + $query['col_filter'][] = (in_array($query['order'],parent::$numericfields) || (is_string($query['order']) && !(strpos($query['order'],',')===false)) ? 'ea_description' : $query['order']).' '. + $GLOBALS['egw']->db->capabilities['case_insensitive_like'].' '.$GLOBALS['egw']->db->quote($query['searchletter'].'%'); + if (in_array($query['order'],parent::$numericfields)) $query_in['order'] = $query['order'] = 'ea_description'; + $filteredby = $query['order'].' '.lang('starts with').' '.$query['searchletter']; + } + $GLOBALS['egw_info']['flags']['app_header'] = lang('emailadmin').($filteredby? ' - '.$filteredby:''); + $total = parent::get_rows($query,$rows,$readonlys); + return $total; + } + + static function getAllowedApps() + { + $applications = array( + 'calendar' => $GLOBALS['egw_info']['apps']['calendar']['title'], + 'felamimail' => $GLOBALS['egw_info']['apps']['felamimail']['title'], + ); + asort($applications); + return $applications = array_merge(array('' => lang('any application')),$applications); + } + + static function getIMAPLoginTypes($serverclass='defaultimap') + { + if (empty($serverclass)) $serverclass = 'defaultimap'; + //error_log(__METHOD__.' called with:'.$serverclass." with capabilities:".parent::$IMAPServerType[$serverclass]['imapcapabilities']); + $returnval = array( + 'standard' => lang('username (standard)'), + 'vmailmgr' => lang('username@domainname (Virtual MAIL ManaGeR)'), + 'admin' => lang('Username/Password defined by admin'), + 'uidNumber' => lang('UserId@domain eg. u1234@domain'), + ); + if (strpos($serverclass,'_') === false) + { + include_once(EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$serverclass.'.inc.php'); + } + if (!empty($serverclass) && stripos(constant($serverclass.'::CAPABILITIES'),'logintypeemail') !== false) + { + $returnval['email'] = lang('use Users eMail-Address (as seen in Useraccount)'); + } + return $returnval; + } + + function edit($content=null) + { + //$this->editProfile($profileid); + $etpl = new etemplate(parent::APP.'.edit'); + if(!is_array($content)) + { + $rowfound = false; + $filter = array(); + if(is_int(intval($_GET['account_id'])) && !empty($_GET['account_id'])) + { + $GLOBALS['egw']->accounts->get_account_name(intval($_GET['account_id']),$lid,$fname,$lname); + if ( intval($_GET['account_id']) < 0 ) { + $groupID = intval($_GET['account_id']); + $content['ea_group'] = $filter['ea_group'] = $groupID; + } else { + $accountID = intval($_GET['account_id']); + $content['ea_user'] = $filter['ea_user'] = $accountID; + } + $content['ea_active'] = 'yes'; + $content['ea_imap_login_type'] = 'admin'; + $content['ea_description'] = common::display_fullname($lid,$fname,$lname,intval($_GET['account_id'])); + } + if (!empty($_GET['profileid'])) + { + $profileID = intval($_GET['profileid']); + $filter['ea_profile_id'] = $profileID; + $rowfound = parent::read($filter); + } + else + { + $content['ea_user_defined_accounts'] = "yes"; + } + } + else + { + $rowfound = true; + // handle action/submit buttons + if (isset($content['delete'])) + { + unset($content['delete']); + $button = 'delete'; + } + if (isset($content['cancel'])) + { + unset($content['cancel']); + $button = 'cancel'; + } + if (isset($content['apply'])) + { + unset($content['apply']); + $button = 'apply'; + } + if (isset($content['save'])) + { + unset($content['save']); + $button = 'save'; + } + unset($content['manage_stationery_templates']); + //unset($content['tabs']); + if (!empty($content['smtp_senders_email'])) + { + $content['ea_smtp_auth_username'] = $content['ea_smtp_auth_username'].';'.$content['smtp_senders_email']; + unset($content['smtp_senders_email']); + } + $this->data = $content; + switch ($button) + { + case 'delete': + if (($deleted = self::delete($content['ea_profile_id']))) + { + $msg = lang('%1 entries deleted.',$deleted); + } + else + { + $msg = lang('Error deleting entry!'); + } + $js = "opener.location.href='".$GLOBALS['egw']->link('/index.php',array( + 'menuaction' => parent::APP.'.emailadmin_ui.index', + 'msg' => $msg, + ))."';"; + $js .= 'window.close();'; + echo "\n\n\n\n\n"; + $GLOBALS['egw']->common->egw_exit(); + break; + case 'cancel': + $js .= 'window.close();'; + echo "\n\n\n\n\n"; + $GLOBALS['egw']->common->egw_exit(); + break; + case 'apply': + case 'save': + if ($etpl->validation_errors()) break; // the user need to fix the error, before we can save the entry + //_debug_array($this->data); + if (parent::save() != 0) + { + $msg = lang('Error saving the entry!!!'); + $button = ''; + } + else + { + $msg = lang('Entry saved'); + } + $js = "opener.location.href='".$GLOBALS['egw']->link('/index.php',array( + 'menuaction' => parent::APP.'.emailadmin_ui.index', + 'msg' => $msg, + ))."';"; + if ($button == 'save') + { + $js .= 'window.close();'; + echo "\n\n\n\n\n"; + $GLOBALS['egw']->common->egw_exit(); + break; + } + $row; + } + } + if ($rowfound) $content = array_merge($this->data,array()); + $preserv['smtpcapabilities'] = $content['smtpcapabilities'] = + constant((!empty($content['ea_smtp_type'])?$content['ea_smtp_type']:'defaultsmtp').'::CAPABILITIES'); + $preserv['imapcapabilities'] = $content['imapcapabilities'] = + constant((!empty($content['ea_imap_type'])?$content['ea_imap_type']:'defaultimap').'::CAPABILITIES'); + if (!empty($msg)) $content['msg'] = $msg; + list($content['ea_smtp_auth_username'],$content['smtp_senders_email']) = explode(';',$content['ea_smtp_auth_username']); + $preserv['ea_profile_id'] = $content['ea_profile_id']; + //$preserv['ea_stationery_active_templates'] = $content['ea_stationery_active_templates']; + $sel_options['ea_smtp_type']=parent::getSMTPServerTypes(); + $sel_options['ea_imap_type']=parent::getIMAPServerTypes(false); + $sel_options['ea_appname'] =self::getAllowedApps(); + $sel_options['ea_imap_login_type'] = self::getIMAPLoginTypes($content['ea_imap_type']); + // Stationery settings + $bostationery = new felamimail_bostationery(); + $sel_options['ea_stationery_active_templates'] = $bostationery->get_stored_templates(); + // setup history + $content['history'] = array( + 'id' => $content['ea_profile_id'], + 'app' => 'emailadmin' + ); + //_debug_array($content); + foreach($this->tracking->field2label as $field => $label) { + $sel_options['status'][$field] = lang($label); + } + /* + $content['stored_templates'] = html::checkbox_multiselect( + 'ea_stationery_active_templates',$content['ea_stationery_active_templates'] + ,$bostationery->get_stored_templates(),true,'',3,true,'width: 100%;'); + + $content['manage_stationery_templates'] = + html::a_href( + lang('manage stationery templates'), + '/index.php?menuaction=etemplate.editor.edit', + array('name' => 'felamimail.stationery'), + 'target="_blank"' + ); + */ + //_debug_array($this->data); + return $etpl->exec(parent::APP.'.emailadmin_ui.edit',$content,$sel_options,$readonlys,$preserv,2); + } + + function add() + { + $this->edit(); + } + + function delete($profileid=null) + { + $_profileID = ($profileid ? $profileid : (int)$_GET['profileid']); + if (empty($_profileID)) return 0; + return parent::delete($_profileID); + } + + function listProfiles() + { + $GLOBALS['egw']->hooks->register_all_hooks(); + self::index(); + } +} diff --git a/emailadmin/inc/class.pleskimap.inc.php b/emailadmin/inc/class.pleskimap.inc.php new file mode 100644 index 0000000000..4c7461aad8 --- /dev/null +++ b/emailadmin/inc/class.pleskimap.inc.php @@ -0,0 +1,458 @@ + as with the "LDAP, Postfix & Cyrus" plugin the plesk one creates mail * +* users and manages passwords, aliases, forwards and quota from within * +* eGroupWare - no need to additionally visit the plesk interface anymore * +* ------------------------------------------------------------------------- * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU General Public License as published by the * +* Free Software Foundation; version 2 of the License. * +\***************************************************************************/ +/* $Id$ */ + +include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.defaultimap.inc.php"); + +class pleskimap extends defaultimap +{ + /** + * @var string $psa_mail_script full path to Plesk's mail.sh (Linux including sudo!) or mail.exe (Windows) interface + */ + var $psa_mail_script = '/usr/bin/sudo /usr/local/psa/bin/mail.sh'; // 'C:/psa/bin/mail.exe' + /** + * @var boolean $allways_create_mailbox true = allways create a mailbox on user creation, + * false = only if a local email (no forward) is given. To use felamimail you need a mailbox! + */ + var $allways_create_mailbox = true; + /** + * @var array $create_folders=array('Send','Trash') folders to automatic create and subscribe on account creation + */ + var $create_folders = array('Sent','Trash'); + /** + * @var string/boolean $error string with last error-message or false + */ + var $error = false; + + /** + * Create a full mailbox or just forward, depending on the given email address + * If email matches the default domain, we create a full mailbox, otherwise we create a forward + * + * @param array $hookValues + * @param string $action='create' + * @return boolean true on success, false otherwise + */ + function addAccount($hookValues,$action='create') + { + //echo "

pleskimap::addAccount(".print_r($hookValues,true).")

\n"; + + $defaultDomain = $this->profileData['defaultDomain'] ? $this->profileData['defaultDomain'] : + $GLOBALS['egw_info']['server']['mail_suffix']; + + $localEmail = $hookValues['account_lid'].'@'.$defaultDomain; + $aliases = $forwards = array(); + + // is the given email a local address from our default domain? + if (substr($hookValues['account_email'],-1-strlen($defaultDomain)) != '@'.$defaultDomain) + { + $forwards[] = $hookValues['account_email']; + } + elseif ($hookValues['account_email'] != $localEmail) + { + $aliases[] = $hookValues['account_email']; + } + // add a default alias with Firstname.Lastname + if (!in_array($alias=$hookValues['account_firstname'].'.'.$hookValues['account_lastname'],$aliases) && + $this->is_email($alias)) + { + $aliases[] = $alias; + } + $info = $this->plesk_mail($action,$hookValues['account_lid'],$hookValues['account_passwd'], + $action != 'create' && !$aliases ? null : $aliases,$forwards,$this->allways_create_mailbox); + + if (!$info['SUCCESS']) return false; + + if ($forwards && !$this->allways_create_mailbox) return true; // no mailbox created, only a forward + + // create Sent & Trash mailboxes and subscribe them + if(($mbox = @imap_open ($this->getMailboxString(),$localEmail,$hookValues['account_passwd']))) + { + $list = imap_getmailboxes($mbox, $this->getMailboxString(),'INBOX'); + $delimiter = isset($list[0]->delimiter) ? $list[0]->delimiter : '.'; + imap_subscribe($mbox,$this->getMailboxString('INBOX')); + + foreach($this->create_folders as $folder) + { + $mailBoxName = 'INBOX'.$delimiter.$folder; + if(imap_createmailbox($mbox,imap_utf7_encode('{'.$this->profileData['imapServer'].'}'.$mailBoxName))) + { + imap_subscribe($mbox,$this->getMailboxString($mailBoxName)); + } + } + imap_close($mbox); + } + return true; + } + + function deleteAccount($hookValues) + { + //echo "

pleskimap::deleteAccount(".print_r($hookValues,true).")

\n"; + + return $this->plesk_mail('remove',$hookValues['account_lid']); + } + + function updateAccount($hookValues) + { + //echo "

pleskimap::updateAccount(".print_r($hookValues,true).")

\n"; + + if($hookValues['account_lid'] != $hookValues['old_loginid']) + { + $this->error = lang("Plesk can't rename users --> request ignored"); + return false; + } + return $this->addAccount($hookValues,'update'); + } + + /** + * Read data from the mail account + * + * @param string/int $accountID + * @return array/boolean with keys mailLocalAddress, mailAlternateAddress, accountStatus, mailRoutingAddress, ... or false if not found + */ + function getUserData($accountID) + { + //echo "

pleskimap::getUserData('$accountID')

\n"; + + if (!($info = $this->plesk_mail('info',$accountID))) return false; + //_debug_array($info); + + $data = array( + 'mailLocalAddress' => $info['Mailname'].'@'.$info['Domain'], + 'mailAlternateAddress' => $info['Alias(es)'] ? explode(' ',$info['Alias(es)']) : array(), + 'accountStatus' => $info['Mailbox'] == 'true' || $info['Redirect'] == 'true' ? 'active' : 'disabled', + 'mailRoutingAddress' => $info['Redirect address'] ? explode(' ',$info['Redirect address']) : false, + 'deliveryMode' => $info['Redirect'] == 'true' && $info['Mailbox'] == 'false' ? 'forwardOnly' : '', +// 'qmailDotMode' => false, +// 'deliveryProgramPath' => false, + 'quotaLimit' => $info['Mbox quota'] == 'Unlimited' ? '' : $info['Mbox quota']/1024.0, + ); + //_debug_array($data); + return $data; + } + + /** + * Save mail account data + * + * @param string/int $accountID + * @param array $accountData with keys mailLocalAddress, mailAlternateAddress, accountStatus, mailRoutingAddress, ... + * @return boolean true on success, false otherwise + */ + function saveUserData($accountID, $accountData) + { + //echo "

pleskimap::saveUserData('$accountID',".print_r($accountData,true).")

\n"; + + // not used: $accountData['accountStatus']=='active', $accountData['qmailDotMode'], $accountData['deliveryProgramPath'] + $info = $this->plesk_mail('update',$accountID,null, + $accountData['mailAlternateAddress'] ? $accountData['mailAlternateAddress'] : array(), + $accountData['mailRoutingAddress'] ? $accountData['mailRoutingAddress'] : array(), + empty($accountData['deliveryMode']), + 1024*(float)$accountData['quotaLimit'],$accountData['accountStatus']=='active'); + + if (!$info['SUCCSESS']) + { + if ($info) $this->error = implode(', ',$info); + return false; + } + return true; + } + + /** + * call plesk's mail command line interface + * + * Usage: mail.sh command [options] + * + * Available commands: + * --create or -c @ creates mail account + * --update or -u @ updates mail account parameters + * --remove or -r @ removes mail account + * --info or -i @ retrieves mail account information + * --on enables mail service for domain + * --off disables mail service for domain + * --help or -h displays this help page + * + * Available options: + * -cp_access enables control panel access (default: + * true) + * -mailbox creates/removes mailbox + * -passwd sets mailbox password [see the note + * below for details] + * -boxpass obsolete alias for option "passwd" + * (this option may be removed from + * future releases) + * -passwd_type specifies the type of mailbox + * password, ignored if no password + * specified [see the note below for + * details] + * -mbox_quota limits the mailbox quota to the + * desired amount + * -boxquota obsolete alias for option "mbox_quota" + * (this option may be removed from + * future releases) + * -aliases : adds or deletes mail + * alias(es) to/from mailname + * -mgroups : adds or removes mail name + * to/from mail group + * -redirect switches mail redirect on/off + * -rediraddr sets redirect to address (required if + * redirect is enabled) + * -group switches mail group on/off + * -groupmem : adds/removes address(-es) + * to/from mail group + * -repo : adds/removes file to/from + * attachments repository + * [deprecated, use + * autoresponder.sh] + * -autorsp switches all autoresponders on/off + * [deprecated, use autoresponder.sh] + * -autoname autoresponder name (required for all + * autoresponder options) [deprecated, + * use autoresponder.sh] + * -autostatus switches on/off autoresponder with + * specified name (true) [deprecated, + * use autoresponder.sh] + * -autoreq : or defines the condition + * for the autoresponder + * to be activated + * whether the + * specified pattern is + * encountered in the + * subject or body, or + * to respond always + * [deprecated, use + * autoresponder.sh] + * -autosubj the subject line to be set up into + * autoresponder ("Re: ") or a custom string + * [deprecated, use autoresponder.sh] + * -auto_replyto return address that will be set up + * into the autoresponder's messages + * [deprecated, use autoresponder.sh] + * -autotext autoresponder message text + * [deprecated, use autoresponder.sh] + * -autoatch : adds/removes autoresponder + * attachment files + * [deprecated, use + * autoresponder.sh] + * -autofrq defines the maximum number of + * responses to a unique e-mail address + * per day [deprecated, use + * autoresponder.sh] + * -autostor defines the number of unique addresses + * to be stored for autoresponder + * [deprecated, use autoresponder.sh] + * -autored defines the e-mail address to forward + * all incoming mail to [deprecated, use + * autoresponder.sh] + * -multiple-sessions allow multiple sessions + * + * Note: + * For security reasons, you can transfer not encrypted passwords via environment + * variable PSA_PASSWORD, by specifying the empty value in the command line for + * the passwd arguments (like " -passwd ''") and setting the password value in + * the PSA_PASSWORD variable. + * Similarly, you can transfer the crypted password via the environment variable + * PSA_CRYPTED_PASSWORD, by specifying the empty value in the command line for + * the passwd arguments (like " -passwd ''") and by setting the password value in + * the PSA_CRYPTED_PASSWORD variable. + * + * Version: psa v7.5.0_build75041208.07 os_SuSE 9.1 + * + * mail.sh --info account@domain.com + * Mailname: account + * Domain: domain.com + * Alias(es): Firstname.Lastname + * CP Access: true + * Mailbox: true + * Password: geheim + * Password type: plain + * Mbox quota: Unlimited + * Redirect: false + * Mailgroup: false + * File repository: Empty + * Autoresponder: false + * Antivirus mail + * checking: Disabled + * + * SUCCESS: Gathering information for 'account@domain.com' complete + * + * mail.sh --info bogus@domain.com + * An error occured during getting mailname information: Mailname 'bogus@domain.com' doesn't exists + * + * @param string $action 'info', 'create', 'update' or 'remove' + * @param string/int $account account_lid or numerical account_id + * @param string $password=null string with password or null to not change + * @param array $aliases=null array with aliases or null to not change the aliases + * @param array $forwards=null array of email address to forward or null to not change + * @param boolean $keepLocalCopy=null if forwarding keep a local copy or not, null = dont change + * @param int $quota_kb=null mailbox quota in kb + * @return boolean/array array with returned values or false otherwise, error-message in $this->error + */ + function plesk_mail($action,$account,$password=null,$aliases=null,$forwards=null,$keepLocalCopy=null,$quota_kb=null) + { + //echo "

smtpplesk::plesk_mail('$action','$account','$password',".print_r($aliases,true).",".print_r($forwards,true).",".(is_null($keepLocalCopy)?'':(int)$keepLocalCopy).",$quota_kb)

\n"; + + $this->error = false; + + if (is_numeric($account)) + { + $account_lid = $GLOBALS['egw']->accounts->id2name($account); + } + elseif ($GLOBALS['egw']->accounts->name2id($account)) + { + $account_lid = $account; + } + if (!$account_lid) + { + $this->error = lang("Account '%1' not found !!!",$account); + return false; + } + if (!in_array($action,array('info','create','update','remove'))) + { + $this->error = lang("Unsupported action '%1' !!!",$action); + return false; + } + $defaultDomain = $this->profileData['defaultDomain'] ? $this->profileData['defaultDomain'] : + $GLOBALS['egw_info']['server']['mail_suffix']; + + if ($action == 'update' && !($info = $this->plesk_mail('info',$account))) + { + $action = 'create'; // mail-account does not yet exist --> create it + } + $localEmail = $account_lid.'@'.$defaultDomain; + $script = $this->psa_mail_script . ' --'.$action . ' ' . $localEmail; + + if ($action != 'info') + { + // invalidate our cache + $GLOBALS['egw']->session->appsession('plesk-email-'.$account_lid,'emailadmin',false); + + // we dont set passwords shorten then 5 chars, as it only give an error in plesk + if (!is_null($password) && $password) + { + if (strlen($password) < 5 || strpos($password,$account_lid) !== false) + { + $this->error = lang('Plesk requires passwords to have at least 5 characters and not contain the account-name --> password NOT set!!!'); + } + else + { + $script .= ' -passwd \''.str_replace('\'','\\\'',$password).'\' -passwd_type plain'; + } + } + if ($action == 'create' || !is_null($forwards) || !is_null($keepLocalCopy)) + { + $script .= ' -mailbox '.(!$forwards || $keepLocalCopy ? 'true' : 'false'); + } + // plesk allows only one forwarding address, we ignore everything but the first + if (!is_null($forwards) && (!$forwards || $this->is_email($forwards[0]))) + { + $script .= ' -redirect '.(!$forwards ? 'false' : 'true -rediraddr '.$forwards[0]); + } + if ($action == 'update') + { + if (!is_null($aliases)) + { + $existing_aliases = explode(' ',$info['Alias(es)']); // without domain! + $delete_aliases = array(); + foreach($existing_aliases as $alias) + { + if ($alias && !in_array($alias,$aliases) && !in_array($alias.'@'.$defaultDomain,$aliases)) + { + $delete_aliases[] = $alias; + } + } + if ($delete_aliases) + { + $script .= ' -aliases del:'.implode(',',$delete_aliases); + } + foreach($aliases as $n => $alias) + { + if (in_array($alias,$existing_aliases) || in_array(str_replace('@'.$defaultDomain,'',$alias),$existing_aliases)) + { + unset($aliases[$n]); // no change + } + } + } + } + if (!is_null($aliases) && count($aliases)) + { + foreach($aliases as $alias) + { + if (!$this->is_email($alias)) return false; // security precausion + } + $script .= ' -aliases add:'.str_replace('@'.$defaultDomain,'',implode(',',$aliases)); + } + if (!is_null($quota_kb) && (int)$quota_kb) + { + $script .= ' -mbox_quota '.(int)$quota_kb; + } + } + //echo "

$script

\n"; + if (!($fp = popen($script.' 2>&1','r'))) + { + $this->error = lang("Plesk mail script '%1' not found !!!",$this->psa_mail_script); + return false; + } + $values = array(); + while(!feof($fp)) + { + $line = trim(fgets($fp)); + list($name,$value) = preg_split('/: */',$line,2); + if (!is_null($value) && strpos($name,'An error occured') === false && $name) + { + $values[$name] = $value; + } + elseif ($line) + { + $values[] = $line; + } + } + pclose($fp); + + if (!$values['SUCCESS']) + { + $this->error = implode(', ',$values); + return false; + } + return $values; + } + + /** + * checks for valid email addresse (local mail address dont need a domain!) + * + * Important as we run shell scripts with the address and one could try to run arbitrary commands this way!!! + * We only allow letters a-z, numbers and the following other chars: _ . - @ + * + * @return boolean + */ + function is_email($email) + { + return preg_match('/^[@a-z0-9_.-]+$/i',$email); + } +} diff --git a/emailadmin/inc/class.postfixdbmailuser.inc.php b/emailadmin/inc/class.postfixdbmailuser.inc.php new file mode 100755 index 0000000000..96b32a7e3e --- /dev/null +++ b/emailadmin/inc/class.postfixdbmailuser.inc.php @@ -0,0 +1,92 @@ + + * @copyright (c) 2010 by Ralf Becker + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * Postfix with dbmailUser schema + */ +class postfixdbmailuser extends emailadmin_smtp_ldap +//class emailadmin_smtp_dbmailuser extends emailadmin_smtp_ldap +{ + /** + * Capabilities of this class (pipe-separated): default, forward + */ + const CAPABILITIES = 'default|forward'; + + /** + * Name of schema, has to be the correct case! + */ + const SCHEMA = 'dbmailUser'; + + /** + * Attribute to enable mail for an account, OR false if existence of ALIAS_ATTR is enough for mail delivery + */ + const MAIL_ENABLE_ATTR = 'accountstatus'; + /** + * Attribute value to enable mail for an account, OR false if existense of attribute is enough to enable account + */ + const MAIL_ENABLED = 'active'; + + /** + * Attribute for aliases OR false to use mail + */ + const ALIAS_ATTR = 'mailalternateaddress'; + + /** + * Primary mail address required as an alias too: true or false + */ + const REQUIRE_MAIL_AS_ALIAS=false; + + /** + * Attribute for forwards OR false if not possible + */ + const FORWARD_ATTR = 'mailforwardingaddress'; + + /** + * Attribute to only forward mail, OR false if not available + */ + const FORWARD_ONLY_ATTR = 'deliverymode'; + /** + * Attribute value to only forward mail + */ + const FORWARD_ONLY = 'forwardOnly'; + + /** + * Attribute for mailbox, to which mail gets delivered OR false if not supported + */ + //const MAILBOX_ATTR = 'deliveryprogrampath'; + //const MAILBOX_ATTR = 'dbmailuid'; + const MAILBOX_ATTR = false; + + /** + * Log all LDAP writes / actions to error_log + */ + var $debug = false; + + /** + * LDAP schema configuration + * + * Parent can NOT use constants direct as we have no late static binding in currenlty required PHP 5.2 + * + * @var array + */ + protected $config = array( + 'schema' => self::SCHEMA, + 'mail_enable_attr' => self::MAIL_ENABLE_ATTR, + 'mail_enabled' => self::MAIL_ENABLED, + 'alias_attr' => self::ALIAS_ATTR, + 'require_mail_as_alias' => self::REQUIRE_MAIL_AS_ALIAS, + 'forward_attr' => self::FORWARD_ATTR, + 'forward_only_attr' => self::FORWARD_ONLY_ATTR, + 'forward_only' => self::FORWARD_ONLY, + 'mailbox_attr' => self::MAILBOX_ATTR, + ); +} diff --git a/emailadmin/inc/class.postfixinetorgperson.inc.php b/emailadmin/inc/class.postfixinetorgperson.inc.php new file mode 100644 index 0000000000..39f66f2dd0 --- /dev/null +++ b/emailadmin/inc/class.postfixinetorgperson.inc.php @@ -0,0 +1,16 @@ + + * @copyright (c) 2010 by Ralf Becker + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * Postfix with old qmailUser schema + */ +class postfixldap extends emailadmin_smtp_ldap +//class emailadmin_smtp_qmailuser extends emailadmin_smtp_ldap +{ + /** + * Capabilities of this class (pipe-separated): default, forward + */ + const CAPABILITIES = 'default|forward'; + + /** + * Name of schema, has to be in the right case! + */ + const SCHEMA = 'qmailUser'; + + /** + * Attribute to enable mail for an account, OR false if existence of ALIAS_ATTR is enough for mail delivery + */ + const MAIL_ENABLE_ATTR = 'accountstatus'; + /** + * Attribute value to enable mail for an account, OR false if existense of attribute is enough to enable account + */ + const MAIL_ENABLED = 'active'; + + /** + * Attribute for aliases OR false to use mail + */ + const ALIAS_ATTR = 'mailalternateaddress'; + + /** + * Primary mail address required as an alias too: true or false + */ + const REQUIRE_MAIL_AS_ALIAS=false; + + /** + * Attribute for forwards OR false if not possible + */ + const FORWARD_ATTR = 'mailforwardingaddress'; + + /** + * Attribute to only forward mail, OR false if not available + */ + const FORWARD_ONLY_ATTR = 'deliverymode'; + /** + * Attribute value to only forward mail + */ + const FORWARD_ONLY = 'forwardOnly'; + + /** + * Attribute for mailbox, to which mail gets delivered OR false if not supported + */ + const MAILBOX_ATTR = 'mailmessagestore'; + + /** + * Log all LDAP writes / actions to error_log + */ + var $debug = false; + + /** + * LDAP schema configuration + * + * Parent can NOT use constants direct as we have no late static binding in currenlty required PHP 5.2 + * + * @var array + */ + protected $config = array( + 'schema' => self::SCHEMA, + 'mail_enable_attr' => self::MAIL_ENABLE_ATTR, + 'mail_enabled' => self::MAIL_ENABLED, + 'alias_attr' => self::ALIAS_ATTR, + 'require_mail_as_alias' => self::REQUIRE_MAIL_AS_ALIAS, + 'forward_attr' => self::FORWARD_ATTR, + 'forward_only_attr' => self::FORWARD_ONLY_ATTR, + 'forward_only' => self::FORWARD_ONLY, + 'mailbox_attr' => self::MAILBOX_ATTR, + ); +} diff --git a/emailadmin/inc/class.smtpplesk.inc.php b/emailadmin/inc/class.smtpplesk.inc.php new file mode 100644 index 0000000000..da4dcbcd91 --- /dev/null +++ b/emailadmin/inc/class.smtpplesk.inc.php @@ -0,0 +1,98 @@ + as with the "LDAP, Postfix & Cyrus" plugin the plesk one creates mail * +* users and manages passwords, aliases, forwards and quota from within * +* eGroupWare - no need to additionally visit the plesk interface anymore * +* ------------------------------------------------------------------------- * +* This program is free software; you can redistribute it and/or modify it * +* under the terms of the GNU General Public License as published by the * +* Free Software Foundation; either version 2 of the License, or (at your * +* option) any later version. * +\***************************************************************************/ +/* $Id$ */ + +include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.defaultsmtp.inc.php"); +include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.pleskimap.inc.php"); + +class smtpplesk extends defaultsmtp +{ + /** + * Capabilities of this class (pipe-separated): default, forward + */ + const CAPABILITIES = 'default|forward'; + + /** + * @var string/boolean $error string with last error-message or false + */ + var $error = false; + + /** + * call plesk's mail command line interface + * + * The actual code is in the pleskimap class, to not double it. + * + * @param string $action 'info', 'create', 'update' or 'remove' + * @param string/int $account account_lid or numerical account_id + * @param string $password=null string with password or null to not change + * @param array $aliases=null array with aliases or null to not change the aliases + * @param string/boolean $forward=null email address to forward, false to not forward or null to not change + * @param boolean $keepLocalCopy=null if forwarding keep a local copy or not, null = dont change + * @param int $quota_kb=null mailbox quota in kb + * @return boolean/array array with returned values or false otherwise, error-message in $this->error + */ + function plesk_mail($action,$account,$password=null,$aliases=null,$forward=null,$keepLocalCopy=null,$quota_kb=null) + { + static $plesk; + if (!is_object($plesk)) + { + $plesk = new pleskimap(null); + $this->error =& $plesk->error; + } + return $plesk->plesk_mail($action,$account,$password,$aliases,$forward,$keepLocalCopy,$quota_kb); + } + + function addAccount($hookValues) + { + // account is added via pleskimap::addAccount(); + } + + /** + * Returns the email address of the current user + * + * @param string/int $accountName account-id or -lis (name) + * @return array of arrays with keys name, address and type={default|alternate} + */ + function getAccountEmailAddress() + { + //echo "

smtpplesk::getAccountEmailAddress()

\n"; + + return array(array( + 'name' => $GLOBALS['egw_info']['user']['fullname'], + 'address' => $GLOBALS['egw_info']['user']['email'], + 'type' => 'default' + )); + } + + /** + * Save SMTP forwarding address + * + * @param int $accountID user-id + * @param string $forwardingAddress email to forward to + * @param string $keepLocalCopy 'yes' or something else + */ + function saveSMTPForwarding($accountID, $forwardingAddress, $keepLocalCopy) + { + //echo "

smtpplesk::saveSMTPForwarding('$accountID','$forwardingAddress','$keepLocalCopy')

\n"; + + return $this->plesk_mail('update',$accountID,null,null,array($forwardingAddress),$keepLocalCopy == 'yes'); + } +} diff --git a/emailadmin/inc/class.uiuserdata.inc.php b/emailadmin/inc/class.uiuserdata.inc.php new file mode 100644 index 0000000000..f609bd51d2 --- /dev/null +++ b/emailadmin/inc/class.uiuserdata.inc.php @@ -0,0 +1,219 @@ + + * @author Lars Kneschke + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * Edit user account + */ +class uiuserdata +{ + var $public_functions = array + ( + 'editUserData' => True, + 'saveUserData' => True + ); + + /** + * @var Template + */ + var $t; + + /** + * @var emailadmin_bo + */ + var $boemailadmin; + + /** + * Constructor + */ + function __construct() + { + $this->t = new Template(EGW_APP_TPL); + $this->boemailadmin = new emailadmin_bo(); + } + + function display_app_header() + { + $GLOBALS['egw']->js->validate_file('jscode','editUserdata','emailadmin'); + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + + $GLOBALS['egw']->common->egw_header(); + echo parse_navbar(); + } + + function editUserData($_useCache='0') + { + $accountID = $_GET['account_id']; + $GLOBALS['account_id'] = $accountID; + + $this->display_app_header(); + + $this->translate(); + + $this->t->set_file(array("editUserData" => "edituserdata.tpl")); + $this->t->set_block('editUserData','form','form'); + $this->t->set_block('editUserData','link_row','link_row'); + $this->t->set_var("th_bg",$GLOBALS['egw_info']["theme"]["th_bg"]); + $this->t->set_var("tr_color1",$GLOBALS['egw_info']["theme"]["row_on"]); + $this->t->set_var("tr_color2",$GLOBALS['egw_info']["theme"]["row_off"]); + + $this->t->set_var("lang_email_config",lang("edit email settings")); + $this->t->set_var("lang_emailAddress",lang("email address")); + $this->t->set_var("lang_emailaccount_active",lang("email account active")); + $this->t->set_var("lang_mailAlternateAddress",lang("alternate email address")); + $this->t->set_var("lang_mailRoutingAddress",lang("forward email's to")); + $this->t->set_var("lang_forward_also_to",lang("forward also to")); + $this->t->set_var("lang_button",lang("save")); + $this->t->set_var("lang_deliver_extern",lang("deliver extern")); + $this->t->set_var("lang_deliver_extern",lang("deliver extern")); + $this->t->set_var("lang_edit_email_settings",lang("edit email settings")); + $this->t->set_var("lang_ready",lang("Done")); + $this->t->set_var("link_back",$GLOBALS['egw']->link('/admin/accounts.php')); + + $linkData = array + ( + 'menuaction' => 'emailadmin.uiuserdata.saveUserData', + 'account_id' => $accountID + ); + $this->t->set_var("form_action", $GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->set_var('url_image_add',$GLOBALS['egw']->common->image('phpgwapi','new')); + $this->t->set_var('url_image_edit',$GLOBALS['egw']->common->image('phpgwapi','edit')); + $this->t->set_var('url_image_delete',$GLOBALS['egw']->common->image('phpgwapi','delete')); + + // only when we show a existing user + if($userData = $this->boemailadmin->getUserData($accountID)) { + $addresses = array(); + foreach((array)$userData['mailAlternateAddress'] as $data) { + $addresses[$data] = $data; + } + $this->t->set_var('selectbox_mailAlternateAddress', html::select( + 'mailAlternateAddress', + '', + $addresses, + true, + "style='width: 100%;' id='mailAlternateAddress'", + 5) + ); + + $addresses = array(); + foreach((array)$userData['mailForwardingAddress'] as $data) { + $addresses[$data] = $data; + } + $this->t->set_var('selectbox_mailRoutingAddress', html::select( + 'mailForwardingAddress', + '', + $addresses, + true, + "style='width: 100%;' id='mailRoutingAddress'", + 5) + ); + + $this->t->set_var("quotaLimit",$userData["quotaLimit"]); + + $this->t->set_var("mailLocalAddress",$userData["mailLocalAddress"]); + $this->t->set_var("mailAlternateAddress",''); + $this->t->set_var("mailRoutingAddress",''); + $this->t->set_var("selected_".$userData["qmailDotMode"],'selected'); + $this->t->set_var("deliveryProgramPath",$userData["deliveryProgramPath"]); + + $this->t->set_var("uid",rawurlencode($_accountData["dn"])); + if ($userData["accountStatus"] == "active") + $this->t->set_var("account_checked","checked"); + if ($userData["deliveryMode"] == "forwardOnly") + $this->t->set_var("forwardOnly_checked","checked"); + if ($_accountData["deliverExtern"] == "active") + $this->t->set_var("deliver_checked","checked"); + } else { + $this->t->set_var("mailLocalAddress",''); + $this->t->set_var("mailAlternateAddress",''); + $this->t->set_var("mailRoutingAddress",''); + $this->t->set_var("options_mailAlternateAddress",lang('no alternate email address')); + $this->t->set_var("options_mailRoutingAddress",lang('no forwarding email address')); + $this->t->set_var("account_checked",''); + $this->t->set_var("forwardOnly_checked",''); + + $this->t->set_var('selectbox_mailAlternateAddress', html::select( + 'mailAlternateAddress', + '', + array(), + true, + "style='width: 100%;' id='mailAlternateAddress'", + 5) + ); + + $this->t->set_var('selectbox_mailRoutingAddress', html::select( + 'mailForwardingAddress', + '', + array(), + true, + "style='width: 100%;' id='mailRoutingAddress'", + 5) + ); + + $this->t->set_var('quotaLimit',''); + } + + // create the menu on the left, if needed + $menuClass =& CreateObject('admin.uimenuclass'); + $this->t->set_var('rows',$menuClass->createHTMLCode('edit_user')); + + $this->t->pparse("out","form"); + + } + + function saveUserData() + { + if($_POST["accountStatus"] == "on") { + $accountStatus = "active"; + } + + if($_POST["forwardOnly"] == "on") { + $deliveryMode = "forwardOnly"; + } + + $formData = array ( + 'mailLocalAddress' => $_POST["mailLocalAddress"], + 'mailAlternateAddress' => $_POST["mailAlternateAddress"], + 'mailForwardingAddress' => $_POST["mailForwardingAddress"], + 'quotaLimit' => $_POST["quotaLimit"], + 'qmailDotMode' => $_POST["qmailDotMode"], + 'deliveryProgramPath' => $_POST["deliveryProgramPath"], + 'accountStatus' => $accountStatus, + 'deliveryMode' => $deliveryMode + ); + + $this->boemailadmin->saveUserData($_GET['account_id'], $formData); + + // read date fresh from ldap storage + $this->editUserData(); + } + + function translate() + { + $this->t->set_var('th_bg',$GLOBALS['egw_info']['theme']['th_bg']); + + $this->t->set_var('lang_add',lang('add')); + $this->t->set_var('lang_done',lang('Done')); + $this->t->set_var('lang_remove',lang('remove')); + $this->t->set_var('lang_remove',lang('remove')); + $this->t->set_var('lang_advanced_options',lang('advanced options')); + $this->t->set_var('lang_qmaildotmode',lang('qmaildotmode')); + $this->t->set_var('lang_default',lang('default')); + $this->t->set_var('lang_quota_settings',lang('quota settings')); + $this->t->set_var('lang_qoutainmbyte',lang('qouta size in MByte')); + $this->t->set_var('lang_inmbyte',lang('in MByte')); + $this->t->set_var('lang_0forunlimited',lang('leave empty for no quota')); + $this->t->set_var('lang_forward_only',lang('forward only')); + $this->t->set_var('lang_enter_new_address',lang('Add new email address:')); + $this->t->set_var('lang_update_current_address',lang('Update current email address:')); + } +} diff --git a/emailadmin/index.php b/emailadmin/index.php new file mode 100644 index 0000000000..ca0c5b8181 --- /dev/null +++ b/emailadmin/index.php @@ -0,0 +1,13 @@ + + * @copyright (c) 2009-10 by Klaus Leithoff + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + \***************************************************************************/ + +header('Location: ../index.php?menuaction=emailadmin.emailadmin_ui.index'. + (isset($_GET['sessionid']) ? '&sessionid='.$_GET['sessionid'].'&kp3='.$_GET['kp3'] : '')); diff --git a/emailadmin/js/jscode/editProfile.js b/emailadmin/js/jscode/editProfile.js new file mode 100644 index 0000000000..8adf90b38c --- /dev/null +++ b/emailadmin/js/jscode/editProfile.js @@ -0,0 +1,42 @@ +var tab = new Tabs(5,'activetab','inactivetab','tab','tabcontent','','','tabpage'); +var smtp = new Tabs(5,'activetab','inactivetab','smtp','smtpcontent','smtpselector','',''); +var imap = new Tabs(6,'activetab','inactivetab','imap','imapcontent','imapselector','',''); + +function initAll() { + tab.init(); + smtp.init(); + imap.init(); + var imapType = document.getElementsByName("imapsettings[imapType]")[0]; + var v=imapType.value; imap.display(imapType.value); imapType.value=v; + onchange_imapsettings(v, 'imapLoginType'); +} + +function ea_setIMAPDefaults(_imapType) { + var currentInput = document.getElementsByName("imapsettings[" + _imapType + "][imapPort]")[0]; + onchange_imapsettings(_imapType, 'imapLoginType'); + if(_imapType > 1) { + // imap + if(currentInput.value == '110') { + currentInput.value = '143'; + } + } else { + // pop3 + if(currentInput.value == '143') { + currentInput.value = '110'; + } + } +} + +function onchange_imapsettings(_imapType,_varname) { + var currentAuthType = document.getElementsByName("imapsettings[" + _imapType + "][" + _varname + "]")[0]; + var imapuser = document.getElementsByName("imapsettings[" + _imapType + "][imapAuthUsername]")[0]; + var imappw = document.getElementsByName("imapsettings[" + _imapType + "][imapAuthPassword]")[0]; + + if (currentAuthType.value == "admin") { + imapuser.disabled = false; + imappw.disabled = false; + } else { + imapuser.disabled=true; + imappw.disabled=true; + } +} diff --git a/emailadmin/js/jscode/editUserdata.js b/emailadmin/js/jscode/editUserdata.js new file mode 100644 index 0000000000..452540d869 --- /dev/null +++ b/emailadmin/js/jscode/editUserdata.js @@ -0,0 +1,59 @@ +function addRow(_selectBoxName, _prompt) { + result = prompt(_prompt, ''); + + if((result == '') || (result == null)) { + return false; + } + + var newOption = new Option(result, result); + + selectBox = document.getElementById(_selectBoxName); + var length = selectBox.length; + + selectBox.options[length] = newOption; + selectBox.selectedIndex = length; +} + +function editRow(_selectBoxName, _prompt) { + selectBox = document.getElementById(_selectBoxName); + + selectedItem = selectBox.selectedIndex; + + if(selectedItem != null && selectedItem != -1) { + value = selectBox.options[selectedItem].text; + result = prompt(_prompt, value); + + if((result == '') || (result == null)) { + return false; + } + + var newOption = new Option(result, result); + + selectBox.options[selectedItem] = newOption; + selectBox.selectedIndex = selectedItem; + } +} + +function removeRow(_selectBoxName) { + selectBox = document.getElementById(_selectBoxName); + + selectedItem = selectBox.selectedIndex; + if(selectedItem != null) { + selectBox.options[selectedItem] = null; + } + selectedItem--; + if(selectedItem >= 0) { + selectBox.selectedIndex = selectedItem; + } else if (selectBox.length > 0) { + selectBox.selectedIndex = 0; + } +} + +function selectAllOptions(_selectBoxName) { + selectBox = document.getElementById(_selectBoxName); + + for(var i=0;i0) + order = order + ','; + order = order + inputElements[i].id; + } + + return order; +} + +function moveUp(node) { + // get the row node + thisRow = node.parentNode.parentNode; + if(thisRow.previousSibling) + { + currentNode = thisRow.previousSibling; + while(currentNode.nodeType != 1) + { + if(!currentNode.previousSibling) + return; + currentNode = currentNode.previousSibling; + } + thisRow.parentNode.insertBefore(thisRow,currentNode); + + //getOrder('tabel1'); + } +} + +function moveDown(node) { + // get the row node + thisRow = node.parentNode.parentNode; + if(thisRow.nextSibling) + { + currentNode = thisRow.nextSibling; + while(currentNode.nodeType != 1) + { + if(!currentNode.nextSibling) + return; + currentNode = currentNode.nextSibling; + } + thisRow.parentNode.insertBefore(currentNode,thisRow); + + //getOrder('tabel1'); + } +} + +function saveOrder() +{ + xajax_doXMLHTTP("emailadmin.ajaxemailadmin.setOrder", getOrder('nextMatchBody')); +} diff --git a/emailadmin/lang/egw_ca.lang b/emailadmin/lang/egw_ca.lang new file mode 100644 index 0000000000..bbe976983b --- /dev/null +++ b/emailadmin/lang/egw_ca.lang @@ -0,0 +1,68 @@ +add profile emailadmin ca Afegir perfil +admin dn emailadmin ca dn del administrador +admin password emailadmin ca Contrasenya del administrador +admin username emailadmin ca Mom d'usuari del administrador +advanced options emailadmin ca Opcions avançades +alternate email address emailadmin ca Adreça de correu alternativa +cyrus imap server emailadmin ca Servidor IMAP Cyrus +cyrus imap server administration emailadmin ca Administració del servidor IMAP Cyrus +default emailadmin ca predeterminada +deliver extern emailadmin ca entrega externa +do you really want to delete this profile emailadmin ca Realmente voleu esborrar aquest perfil? +domainname emailadmin ca Nom del domini +edit email settings emailadmin ca Editar configuració del compte +email account active emailadmin ca Compte de correu electrònic actiu +email address emailadmin ca Adreça de correu electrònic +enable cyrus imap server administration emailadmin ca activar administració del servidor Cyrus IMAP +enable sieve emailadmin ca Activar Sieve +enter your default mail domain (from: user@domain) emailadmin ca Entreu el domini predeterminat (de usuari@domini) +forward also to emailadmin ca Reenviar també a +forward email's to emailadmin ca Reenviar correus a +forward only emailadmin ca Només reenviar +imap admin password admin ca Contrasenya de l'administrador IMAP +imap admin user admin ca Usuari administrador IMAP +imap c-client version < 2001 emailadmin ca Versió C-Client IMAP < 2001 +imap server hostname or ip address emailadmin ca Servidor IMAP o adreça IP +imap server logintyp emailadmin ca Tipus de sessió del servidor IMAP +imap server port emailadmin ca Port del servidor IMAP +imap/pop3 server name emailadmin ca Nom del servidor POP/IMAP +in mbyte emailadmin ca en MBytes +ldap basedn emailadmin ca basedn per a LDAP +ldap server emailadmin ca Aervidor LDAP +ldap server accounts dn emailadmin ca Comptes DN del servidor LDAP +ldap server admin dn emailadmin ca Administrador DN del servidor LDAP +ldap server admin password emailadmin ca Contrasenya del administrador del servidor LDAP +ldap server hostname or ip address emailadmin ca Nom del servidor LDAP o adreça IP +ldap settings emailadmin ca Configuració LDAP +leave empty for no quota emailadmin ca Deixar en blanc per a no posar quota +mail settings admin ca Configuració del correu +name of organisation emailadmin ca Nom de l'organització +no alternate email address emailadmin ca sense adreça de correu alternativa +no forwarding email address emailadmin ca sense adreça de correu per a reenviar +pop3 server hostname or ip address emailadmin ca Nom del servidor POP3 o adreça IP +pop3 server port emailadmin ca Port del servidor POP3 +postfix with ldap emailadmin ca Postfix amb LDAP +profile list emailadmin ca Llista de perfils +profile name emailadmin ca Nom del perfil +qmaildotmode emailadmin ca Modus de punt de qmail +qouta size in mbyte emailadmin ca Mida de la quota en MBytes +quota settings emailadmin ca Configuració de les quotas +remove emailadmin ca Esborrar +select type of imap/pop3 server emailadmin ca Seleccioneu el tipus de servidor IMAP/POP3 +select type of smtp server emailadmin ca Seleccioneu el tipus de servidor SMTP +sieve server hostname or ip address emailadmin ca Nom del servidor Sieve o adreça IP +sieve server port emailadmin ca Port del servidor Sieve +sieve settings emailadmin ca Configuració de Sieve +smtp server name emailadmin ca Nom del servidor SMTP +smtp-server hostname or ip address emailadmin ca Nom del servidor SMTP o adreça IP +smtp-server port emailadmin ca Port del servidor SMTP +standard emailadmin ca Estàndar +standard imap server emailadmin ca Servidor IMAP estàndar +standard pop3 server emailadmin ca Servidor POP3 estàndar +standard smtp-server emailadmin ca Servidor SMTP estàndar +use ldap defaults emailadmin ca Usar les opcions predeterminades per LDAP +use smtp auth emailadmin ca Usar identificació SMTP +use tls authentication emailadmin ca Usar identificació TLS +use tls encryption emailadmin ca Usar xifrat TLS +users can define their own emailaccounts emailadmin ca Els usuaris poden definir els seus propis comptes de correu +virtual mail manager emailadmin ca Gestor de correu virtual diff --git a/emailadmin/lang/egw_cs.lang b/emailadmin/lang/egw_cs.lang new file mode 100644 index 0000000000..f5846148b7 --- /dev/null +++ b/emailadmin/lang/egw_cs.lang @@ -0,0 +1,143 @@ +account '%1' not found !!! emailadmin cs ÚÄet '%1' nebyl nalezen !!! +active templates emailadmin cs Aktivní Å¡ablony +add new email address: emailadmin cs PÅ™idat novou e-mailovou adresu: +add profile emailadmin cs PÅ™idat profil +admin dn emailadmin cs Dn (distiguished name) administrátora +admin password emailadmin cs Heslo administrátora +admin username emailadmin cs Uživatelské jméno administrátora +advanced options emailadmin cs Rozšířené volby +alternate email address emailadmin cs Alternativní e-mailová adresa +any application emailadmin cs Kterákoli aplikace +any group emailadmin cs Kterákoli skupina +any user emailadmin cs Kterýkoli uživatel +back to admin/grouplist emailadmin cs ZpÄ›t na Administrátor/Skupiny uživatelů +back to admin/userlist emailadmin cs ZpÄ›t na Administrátor/Uživatelské úÄty +bad login name or password. emailadmin cs Chybné pÅ™ihlaÅ¡ovací jméno nebo heslo. +bad or malformed request. server responded: %s emailadmin cs Chybný nebo Å¡patnÄ› fomulovaný požadavek. Server odpovÄ›dÄ›l: %s +bad request: %s emailadmin cs Chybný požadavek: %s +can be used by application emailadmin cs Může být použit aplikací +can be used by group emailadmin cs Může být použit skupinou +can be used by user emailadmin cs Může být použit uživatelem +connection dropped by imap server. emailadmin cs PÅ™ipojení ukonÄeno IMAP serverem. +could not complete request. reason given: %s emailadmin cs Nemohu dokonÄit požadavek. Důvod: %s +could not open secure connection to the imap server. %s : %s. emailadmin cs Nemohu otevřít zabezpeÄené pÅ™ipojení na IMAP server. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin cs CRAM-MD5 nebo DIGEST-MD5 vyžadují nainstalovaný balíÄek Auth_SASL. +cyrus imap server emailadmin cs Cyrus IMAP Server +cyrus imap server administration emailadmin cs Administrace Cyrus IMAP serveru +default emailadmin cs výchozí +deliver extern emailadmin cs doruÄit externÄ› +do not validate certificate emailadmin cs Neověřovat certifikát +do you really want to delete this profile emailadmin cs Opravdu chcete smazat tento profil +do you really want to reset the filter for the profile listing emailadmin cs Opravdu chcete vyresetovat filtr pro seznam profilů +domainname emailadmin cs Doménové jméno +edit email settings emailadmin cs Editovat nastavení e-mailu +email account active emailadmin cs E-mailový úÄet aktivní +email address emailadmin cs E-mailová adresa +email settings common cs Nastavení e-mailu +emailadmin emailadmin cs Administrátor poÅ¡ty +emailadmin: group assigned profile common cs Administrátor poÅ¡ty: profil pÅ™idÄ›lený skupinÄ› +emailadmin: user assigned profile common cs Administrátor poÅ¡ty: profil pÅ™idÄ›lený uživateli +enable cyrus imap server administration emailadmin cs Povolit administraci Cyrus IMAP serveru +enable sieve emailadmin cs Povolit Sieve +encrypted connection emailadmin cs Å ifrované pÅ™ipojení +encryption settings emailadmin cs Nastavení Å¡ifrování +enter your default mail domain (from: user@domain) emailadmin cs Zadejte VaÅ¡i výchozí poÅ¡tovní doménu (z: uživatel@doména) +error connecting to imap server. %s : %s. emailadmin cs Chyba spojení na IMAP server. %s : %s. +error connecting to imap server: [%s] %s. emailadmin cs Chyba spojení na IMAP server: [%s] %s. +filtered by account emailadmin cs filtrováno podle úÄtu +filtered by group emailadmin cs filtrováno podle skupiny +forward also to emailadmin cs PÅ™eposlat také na +forward email's to emailadmin cs PÅ™eposílat e-maily na +forward only emailadmin cs Jen pÅ™eposlat +global options emailadmin cs Globální volby +if using ssl or tls, you must have the php openssl extension loaded. emailadmin cs Pokud chcete používat SSL nebo TLS, musíte mít nahráno openssl rozšíření PHP. +imap admin password admin cs Heslo IMAP administrátora +imap admin user admin cs Uživatelský úÄet IMAP administrátora +imap c-client version < 2001 emailadmin cs IMAP C-klient verze < 2001 +imap server closed the connection. emailadmin cs IMAP server ukonÄil spojení. +imap server closed the connection. server responded: %s emailadmin cs IMAP server ukonÄil spojení. Server odpovÄ›dÄ›l: %s +imap server hostname or ip address emailadmin cs DNS jméno nebo IP adresa IMAP serveru +imap server logintyp emailadmin cs Typ pÅ™ihlášení na IMAP server +imap server name emailadmin cs Název IMAP serveru +imap server port emailadmin cs Port IMAP serveru +imap/pop3 server name emailadmin cs Název IMAP/POP3 serveru +in mbyte emailadmin cs v MBytech +inactive emailadmin cs neaktivní +ldap basedn emailadmin cs LDAP basedn +ldap server emailadmin cs LDAP server +ldap server accounts dn emailadmin cs DN (distinguished name) úÄtů na LDAP serveru +ldap server admin dn emailadmin cs DN (distinguished name) administrátora LDAP serveru +ldap server admin password emailadmin cs Heslo administrátora LDAP serveru +ldap server hostname or ip address emailadmin cs DNS jméno nebo IP adresa LDAP serveru +ldap settings emailadmin cs LDAP nastavení +leave empty for no quota emailadmin cs ponechte prázdné, nechcete-li kvótu +mail settings admin cs Nastavení poÅ¡ty +manage stationery templates emailadmin cs Spravovat Å¡ablony dopisů +name of organisation emailadmin cs Název organizace +no alternate email address emailadmin cs bez alternativní e-mailové adresy +no encryption emailadmin cs bez Å¡ifrování +no forwarding email address emailadmin cs bez e-mailové adresy pro pÅ™eposílání +no message returned. emailadmin cs Žádná zpráva se nevrátila. +no supported imap authentication method could be found. emailadmin cs Nebyla nalezena žádná podporovaná metoda IMAP autentikace. +order emailadmin cs PoÅ™adí +organisation emailadmin cs Organizace +plesk can't rename users --> request ignored emailadmin cs Plesk nemůže pÅ™ejmenovávat uživatele --> požadavek ignorován +plesk imap server (courier) emailadmin cs Plesk IMAP server (Courier) +plesk mail script '%1' not found !!! emailadmin cs Plesk poÅ¡tovní skript '%1' nebyl nalezen !!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin cs Plesk vyžaduje, aby mÄ›la hesla nejménÄ› 5 znaků a neobsahovala název úÄtu --> heslo nebylo nastaveno!!! +plesk smtp-server (qmail) emailadmin cs Plesk SMTP server (Qmail) +pop3 server hostname or ip address emailadmin cs DNS jméno nebo IP adresa POP3 serveru +pop3 server port emailadmin cs Port POP3 serveru +postfix with ldap emailadmin cs Postfix s LDAP +profile access rights emailadmin cs přístupová práva profilu +profile is active emailadmin cs Profil je aktivní +profile list emailadmin cs Seznam profilů +profile name emailadmin cs Název profilu +qmaildotmode emailadmin cs TeÄkový režim Qmail +qouta size in mbyte emailadmin cs Velikost kvóty v MBytech +quota settings emailadmin cs Nastavení kvóty +remove emailadmin cs Odstranit +reset filter emailadmin cs vyresetovat filtr +select type of imap server emailadmin cs Vyberte typ IMAP serveru +select type of imap/pop3 server emailadmin cs Vyberte typ IMAP/POP3 serveru +select type of smtp server emailadmin cs Vyberte typ SMTP serveru +send using this email-address emailadmin cs Odeslat s touto e-mailovou adresou +server settings emailadmin cs Nastavení serveru +sieve server hostname or ip address emailadmin cs DNS jméno nebo IP adresa Sieve serveru +sieve server port emailadmin cs Port Sieve serveru +sieve settings emailadmin cs Nastavení sieve +smtp authentication emailadmin cs SMTP autentikace +smtp options emailadmin cs Volby SMTP +smtp server name emailadmin cs Jméno SMTP serveru +smtp settings emailadmin cs Nastavení SMTP +smtp-server hostname or ip address emailadmin cs DNS jméno nebo IP adresa SMTP serveru +smtp-server port emailadmin cs Port SMTP serveru +standard emailadmin cs Standardní +standard imap server emailadmin cs Standardní IMAP server +standard pop3 server emailadmin cs Standardní POP3 server +standard smtp-server emailadmin cs Standardní SMTP server +stationery emailadmin cs Å ablony +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin cs Vypadá to, že IMAP server nepodporuje vybranou autentikaÄní metodu. Zkontaktujte prosím VaÅ¡eho systémového administrátora. +this php has no imap support compiled in!! emailadmin cs Toto PHP nemá zkompilovanou podporu IMAPu. +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin cs Pro použití TLS pÅ™ipojení musíte provozovat verzi PHP 5.1.0 nebo vyšší. +unexpected response from server to authenticate command. emailadmin cs NeoÄekávaná odpovÄ›Ä serveru na příkaz AUTHENTICATE. +unexpected response from server to digest-md5 response. emailadmin cs NeoÄekávaná odpovÄ›Ä serveru na Digest-MD5 odpovÄ›Ä. +unexpected response from server to login command. emailadmin cs NeoÄekávaná odpovÄ›Ä serveru na příkaz LOGIN. +unknown imap response from the server. server responded: %s emailadmin cs Neznámá IMAP odpovÄ›Ä server. OdpovÄ›dÄ›l: %s +unsupported action '%1' !!! emailadmin cs Nepodporovaná akce '%1' !!! +update current email address: emailadmin cs Aktualizovat souÄasnou e-mailovou adresu: +use ldap defaults emailadmin cs Použít výchozí hodnoty LDAP +use predefined username and password defined below emailadmin cs Použít pÅ™eddefinované uživatelské jméno a heslo uvedené níže +use smtp auth emailadmin cs Použít SMTP autentikaci +use tls authentication emailadmin cs Použít TLS autentikaci +use tls encryption emailadmin cs Použít TLS Å¡ifrování +user can edit forwarding address emailadmin cs Uživatel smí editovat adresu pro pÅ™eposílání +username (standard) emailadmin cs uživatelské jméno (standardní) +username/password defined by admin emailadmin cs Uživatelské jméno/Heslo definované administrátorem +username@domainname (virtual mail manager) emailadmin cs uživatelskéjméno@doména (Virtuální správce poÅ¡ty) +users can define their own emailaccounts emailadmin cs Uživatelé smí definovat vlastní poÅ¡tovní úÄty +users can define their own identities emailadmin cs Uživatelé smí definovat své vlastní identity +users can define their own signatures emailadmin cs Uživatelé smí definovat své vlastní podpisy +users can utilize these stationery templates emailadmin cs Uživatelé mohou využívat tyto Å¡ablony dopisů +vaction messages with start- and end-date require an admin account to be set! emailadmin cs Automatické odpovÄ›di v nepřítomnosti, které mají urÄeno poÄáteÄní a koncové datum, vyžadují nastavení administrátorského úÄtu. +virtual mail manager emailadmin cs Virtuální správce poÅ¡ty diff --git a/emailadmin/lang/egw_da.lang b/emailadmin/lang/egw_da.lang new file mode 100644 index 0000000000..eca0f7475f --- /dev/null +++ b/emailadmin/lang/egw_da.lang @@ -0,0 +1,69 @@ +add profile emailadmin da Tilføj Profil +admin dn emailadmin da admin dn +admin password emailadmin da admin adgangskode +admin passwort emailadmin da admin adgangskode +admin username emailadmin da admin brugernavn +advanced options emailadmin da avanceret indstillinger +alternate email address emailadmin da alternativ e-mail adresse +cyrus imap server emailadmin da Cyrus IMAP Server +cyrus imap server administration emailadmin da Cyrus IMAP server administration +default emailadmin da standart +deliver extern emailadmin da lever ekstern +do you really want to delete this profile emailadmin da Vil du virkelig slette denne profil +domainname emailadmin da domæne navn +edit email settings emailadmin da redigere e-mail indstillingerne +email account active emailadmin da e-mail konto aktiv +email address emailadmin da e-mail adresse +enable cyrus imap server administration emailadmin da aktivere Cyrus IMAP server administration +enable sieve emailadmin da aktiver Sieve +enter your default mail domain (from: user@domain) emailadmin da Indtast dit standart post domæne (fra: bruger@domæne) +forward also to emailadmin da videresend ogsÃ¥ til +forward email's to emailadmin da videresend e-mails til +forward only emailadmin da videresend kun +imap admin password admin da IMAP admin adgangskode +imap admin user admin da IMAP admin bruger +imap c-client version < 2001 emailadmin da IMAP C-Klient Version < 2001 +imap server hostname or ip address emailadmin da IMAP server domænenavn eller IP adresse +imap server logintyp emailadmin da IMAP server login type +imap server port emailadmin da IMAP server port +imap/pop3 server name emailadmin da IMAP/POP3 server navn +in mbyte emailadmin da i Megabytes +ldap basedn emailadmin da LDAP basedn +ldap server emailadmin da LDAP server +ldap server accounts dn emailadmin da LDAP server konto DN +ldap server admin dn emailadmin da LDAP server admin DN +ldap server admin password emailadmin da LDAP server admin adgangskode +ldap server hostname or ip address emailadmin da LDAP server domænenavn eller IP adresse +ldap settings emailadmin da LDAP indstillinger +leave empty for no quota emailadmin da efterlad tom hvis ingen citat +mail settings admin da Post indstillinger +name of organisation emailadmin da Navn pÃ¥ organisation +no alternate email address emailadmin da ingen alternativ e-mail adresse +no forwarding email address emailadmin da ingen viderestillet e-mail adresse +pop3 server hostname or ip address emailadmin da POP3 server domænenavn eller IP adresse +pop3 server port emailadmin da POP server port +postfix with ldap emailadmin da Postfix med LDAP +profile list emailadmin da Profil liste +profile name emailadmin da Profil navn +qmaildotmode emailadmin da qmaildotmode +qouta size in mbyte emailadmin da quota størrelse i Megabytes +quota settings emailadmin da quota indstillinger +remove emailadmin da fjern +select type of imap/pop3 server emailadmin da Vælg type IMAP/POP3 server +select type of smtp server emailadmin da Vælg time POP3 server +sieve server hostname or ip address emailadmin da Sieve server domænenavn eller IP adresse +sieve server port emailadmin da Sieve server port +sieve settings emailadmin da Sieve indstillinger +smtp server name emailadmin da SMTP server navn +smtp-server hostname or ip address emailadmin da SMTP server domænenavn eller IP adresse +smtp-server port emailadmin da SMTP server port +standard emailadmin da Standart +standard imap server emailadmin da Standart IMAP server +standard pop3 server emailadmin da Standart POP3 server +standard smtp-server emailadmin da Standart SMTP server +use ldap defaults emailadmin da brug LDAP standarter +use smtp auth emailadmin da Brug SMTP autorisation +use tls authentication emailadmin da Brug TLS autorisation +use tls encryption emailadmin da Brug TLS kryptering +users can define their own emailaccounts emailadmin da Brugere kan selv definere deres egne e-mail kontoer +virtual mail manager emailadmin da Virtuel post hÃ¥ndtering diff --git a/emailadmin/lang/egw_de.lang b/emailadmin/lang/egw_de.lang new file mode 100644 index 0000000000..a91e67605e --- /dev/null +++ b/emailadmin/lang/egw_de.lang @@ -0,0 +1,151 @@ +%1 entries deleted. emailadmin de %1 Einträge gelöscht +account '%1' not found !!! emailadmin de Benutzerkonto '%1' nicht gefunden !!! +active templates emailadmin de Aktive Vorlagen +add new email address: emailadmin de Neue EMailadresse hinzufügen +add profile emailadmin de Profil hinzufügen +admin dn emailadmin de Admin DN +admin password emailadmin de Admin Passwort +admin username emailadmin de Administrator Benutzername +advanced options emailadmin de erweiterte Einstellungen +alternate email address emailadmin de zusätzliche E-Mail-Adressen +any application emailadmin de jede Anwendung +any group emailadmin de jede Gruppe +any user emailadmin de jeder Benutzer +back to admin/grouplist emailadmin de Zurück zu: Admin/Gruppenverwaltung +back to admin/userlist emailadmin de Zurück zu: Admin/Benutzerverwaltung +bad login name or password. emailadmin de Falscher Benutzername oder Passwort. +bad or malformed request. server responded: %s emailadmin de Falsche oder ungültige Anfrage. Server antwortet: %s +bad request: %s emailadmin de Falsche Anfrage: %s +can be used by application emailadmin de Kann von folgender Anwendung verwendet werden +can be used by group emailadmin de Kann von folgender Gruppe verwendet werden +can be used by user emailadmin de Kann von folgendem Benutzer verwendet werden +connection dropped by imap server. emailadmin de Verbindung von IMAP-Server beendet. +could not complete request. reason given: %s emailadmin de Konnte Anfrage nicht beenden. Grund: %s +could not open secure connection to the imap server. %s : %s. emailadmin de Konnte keine sichere Verbindung zum IMAP Server aufbauen. %s: %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin de CRAM-MD5 oder DIGEST-MD5 erfordert, das das Auth_SASL Packet installiert ist. +cyrus imap server emailadmin de Cyrus IMAP-Server +cyrus imap server administration emailadmin de Cyrus IMAP-Server Administration +default emailadmin de Vorgabe +deliver extern emailadmin de extern ausliefern +do not validate certificate emailadmin de Zertifikat nicht überprüfen +do you really want to delete this profile emailadmin de Wollen Sie dieses Profil wirklich löschen +do you really want to reset the filter for the profile listing emailadmin de Möchten Sie den Filter für die Profilliste wirklich zurücksetzen? +domainname emailadmin de Domänenname +edit email settings emailadmin de E-Mail-Einstellungen +email account active emailadmin de E-Mail-Konto aktiv +email address emailadmin de E-Mail-Adresse +email settings common de E-Mail-Konto +emailadmin emailadmin de EMailAdmin +emailadmin: group assigned profile common de eMailAdmin: Vordefiniertes Gruppenprofil +emailadmin: user assigned profile common de eMailAdmin: Vordefiniertes Benutzerprofil +enable cyrus imap server administration emailadmin de Cyrus IMAP-Server Administration aktivieren +enable sieve emailadmin de Sieve aktivieren +encrypted connection emailadmin de verschlüsselte Verbindung +encryption settings emailadmin de Verschlüsselungseinstellungen +enter your default mail domain (from: user@domain) emailadmin de Standard E-Mail-Domain (Von: benutzer@domain) +entry saved emailadmin de Eintrag gespeichert +error connecting to imap server. %s : %s. emailadmin de Fehler beim Verbinden mit dem IMAP Server. %s : %s. +error connecting to imap server: [%s] %s. emailadmin de Fehler beim Verbinden mit dem IMAP Server. [%s] %s. +error deleting entry! emailadmin de Fehler beim löschen des Eintrags +error saving the entry!!! emailadmin de Fehler beim speichern!!! +filtered by account emailadmin de Suche nach Benutzerprofilen +filtered by group emailadmin de Suche nach Gruppenprofilen +forward also to emailadmin de zusätzlich weiterleiten +forward email's to emailadmin de E-Mails weiterleiten an +forward only emailadmin de nur weiterleiten +global options emailadmin de Globale Optionen +if using ssl or tls, you must have the php openssl extension loaded. emailadmin de Wenn Sie SSL oder TLS benutzen, müssen Sie die openssl PHP Erweiterung geladen haben. +imap admin password admin de IMAP Administrator Passwort +imap admin user admin de IMAP Administrator Benutzer +imap c-client version < 2001 emailadmin de IMAP C-Client Version < 2001 +imap server closed the connection. emailadmin de IMAP Server hat die Verbindung beendet. +imap server closed the connection. server responded: %s emailadmin de IMAP Server hat die Verbindung beendet. Server Antwort: %s +imap server hostname or ip address emailadmin de IMAP-Server Hostname oder IP-Adresse +imap server logintyp emailadmin de IMAP-Server Loginverfahren +imap server name emailadmin de IMAP-Server Name +imap server port emailadmin de IMAP-Server Port +imap/pop3 server name emailadmin de IMAP/POP3-Server Name +in mbyte emailadmin de in MByte +inactive emailadmin de inaktiv +ldap basedn emailadmin de LDAP BaseDN +ldap server emailadmin de LDAP Server +ldap server accounts dn emailadmin de LDAP-Server Benutzerkonten DN +ldap server admin dn emailadmin de LDAP-Server Administrator DN +ldap server admin password emailadmin de LDAP-Server Administrator-Passwort +ldap server hostname or ip address emailadmin de LDAP-Server Hostname oder IP-Adresse +ldap settings emailadmin de LDAP-Einstellungen +leave empty for no quota emailadmin de leer lassen um Quota zu deaktivieren +mail settings admin de E-Mail-Einstellungen +manage stationery templates emailadmin de Briefpapiervorlagen verwalten +name of organisation emailadmin de Name der Organisation +no alternate email address emailadmin de keine zusätzlichen E-Mail-Adressen +no encryption emailadmin de keine Verschlüsselung +no forwarding email address emailadmin de keine Weiterleitungsadresse definiert +no message returned. emailadmin de Keine Nachricht zurückgeliefert. +no supported imap authentication method could be found. emailadmin de Keine unterstützte IMAP-Authentifizierungsmethode gefunden. +order emailadmin de Reihenfolge +organisation emailadmin de Organisation +plesk can't rename users --> request ignored emailadmin de Plesk kann keine Benutzer umbenennen --> Anforderung ignoriert +plesk imap server (courier) emailadmin de Plesk IMAP Server (Courier) +plesk mail script '%1' not found !!! emailadmin de Plesk Mail Skript '%1' nicht gefunden !!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin de Plesk verlangt, dass Passworte mindestens 5 Zeichen lang sind und nicht den Benutzernamen enthalten --> Passwort nicht gesetzt!!! +plesk smtp-server (qmail) emailadmin de Plesk SMTP-Server (Qmail) +pop3 server hostname or ip address emailadmin de POP3-Server Hostname oder IP-Adresse +pop3 server port emailadmin de POP3-Server Port +postfix with ldap emailadmin de Postfix mit LDAP +profile access rights emailadmin de Profilzugriffsrechte +profile is active emailadmin de Profil ist aktiv +profile list emailadmin de Profilliste +profile name emailadmin de Profilname +qmaildotmode emailadmin de qmaildotmode +qouta size in mbyte emailadmin de Quota Größe in MByte +quota settings emailadmin de Quota Einstellungen +remove emailadmin de Entfernen +reset filter emailadmin de Filter zurücksetzen +select type of imap server emailadmin de IMAP-Server Typ auswählen +select type of imap/pop3 server emailadmin de IMAP/POP3-Server Typ auswählen +select type of smtp server emailadmin de SMTP-Server Typ auswählen +send using this email-address emailadmin de zum Versenden wird diese E-Mail Adresse benutzt +server settings emailadmin de Server-Einstellungen +sieve server hostname or ip address emailadmin de Sieve-Server Hostname oder IP-Adresse +sieve server port emailadmin de Sieve-Server Port +sieve settings emailadmin de Sieve Einstellungen +smtp authentication emailadmin de SMTP Anmeldung +smtp options emailadmin de SMTP Optionen +smtp server name emailadmin de SMTP-Server Name +smtp settings emailadmin de SMTP Einstellungen +smtp-server hostname or ip address emailadmin de SMTP-Server Hostname oder IP-Adresse +smtp-server port emailadmin de SMTP-Server Port +standard emailadmin de Vorgabe +standard imap server emailadmin de Standard IMAP-Server +standard pop3 server emailadmin de Standard POP3-Server +standard smtp-server emailadmin de Standard SMTP-Server +starts with emailadmin de startet mit +stationery emailadmin de Briefpapier +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin de Der IMAP Server scheint die eingestellte Authentifizierungsmethode nicht zu unterstützen. Bitte fragen Sie ihren Systemadministrator. +this php has no imap support compiled in!! emailadmin de Dieses PHP hat keine IMAP Unterstützung!!! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin de Um eine TLS Verbindung zu verwenden, benötigen Sie PHP 5.1.0 oder neuer. +unexpected response from server to authenticate command. emailadmin de Unerwartete Antwort des Servers auf das AUTHENTICATE Kommando. +unexpected response from server to digest-md5 response. emailadmin de Unerwartete Antwort des Servers auf die Digest-MD5 Antwort. +unexpected response from server to login command. emailadmin de Unerwartete Antwort des Servers auf das LOGIN Komando. +unknown imap response from the server. server responded: %s emailadmin de Unbekannte IMAP Antwort vom Server. Server antwortet: %s +unsupported action '%1' !!! emailadmin de Nicht unterstützte Aktion '%1' !!! +update current email address: emailadmin de Aktualisiere aktuelle EMailadresse +use ldap defaults emailadmin de LDAP Standardeinstellungen benutzen +use predefined username and password defined below emailadmin de Verwende den unten vordefinierten Benutzernamen und Passwort +use smtp auth emailadmin de SMTP Auth benutzen +use tls authentication emailadmin de TLS Authentifizierung benutzen +use tls encryption emailadmin de TLS Verschlüsselung benutzen +use users email-address (as seen in useraccount) emailadmin de Benutzt E-Mail Adresse des Benutzters (Die unter seinem Benutzerkonto angezeigt wird) +user can edit forwarding address emailadmin de Anwender können ihre Weiterleitungsadresse bearbeiten +userid@domain eg. u1234@domain emailadmin de UserId@domain z.B. u1234@domain +username (standard) emailadmin de Benutzername (Standard) +username/password defined by admin emailadmin de Benutzername/Passwort vordefiniert +username@domainname (virtual mail manager) emailadmin de Benutzername@Domänenname (Virtual MAIL ManaGeR) +users can define their own emailaccounts emailadmin de Anwender können ihre eigenen Konten definieren +users can define their own identities emailadmin de Anwender können ihre eigenen Identitäten definieren +users can define their own signatures emailadmin de Anwender können ihre eigenen Signaturen definieren +users can utilize these stationery templates emailadmin de Benutzer können diese Briefpapiervorlagen verwenden +vaction messages with start- and end-date require an admin account to be set! emailadmin de Urlaubsbenachrichtigungen mit Start- und Enddatum benötigen einen gesetzten Administrator Benutzer! +virtual mail manager emailadmin de Virtual MAIL ManaGeR +you have received a new message on the emailadmin de Sie haben eine neue Nachricht erhalten diff --git a/emailadmin/lang/egw_en.lang b/emailadmin/lang/egw_en.lang new file mode 100755 index 0000000000..fd04617698 --- /dev/null +++ b/emailadmin/lang/egw_en.lang @@ -0,0 +1,151 @@ +%1 entries deleted. emailadmin en %1 entries deleted. +account '%1' not found !!! emailadmin en Account '%1' not found! +active templates emailadmin en Active templates +add new email address: emailadmin en Add new email address: +add profile emailadmin en Add profile +admin dn emailadmin en Admin dn +admin password emailadmin en Admin password +admin username emailadmin en Admin user name +advanced options emailadmin en Advanced options +alternate email address emailadmin en Alternate email address +any application emailadmin en Any application +any group emailadmin en Any group +any user emailadmin en Any user +back to admin/grouplist emailadmin en Back to Admin / Group list +back to admin/userlist emailadmin en Back to Admin / User list +bad login name or password. emailadmin en Bad login name or password. +bad or malformed request. server responded: %s emailadmin en Bad or malformed request. %s +bad request: %s emailadmin en Bad request: %s +can be used by application emailadmin en Can be used by application +can be used by group emailadmin en Can be used by group +can be used by user emailadmin en Can be used by user +connection dropped by imap server. emailadmin en Connection dropped by IMAP server. +could not complete request. reason given: %s emailadmin en Could not complete request. %s +could not open secure connection to the imap server. %s : %s. emailadmin en Could not open secure connection to the IMAP server. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin en CRAM-MD5 or DIGEST-MD5 requires the Auth_SASL package to be installed. +cyrus imap server emailadmin en Cyrus IMAP server +cyrus imap server administration emailadmin en Cyrus IMAP server administration +default emailadmin en Default +deliver extern emailadmin en Deliver extern +do not validate certificate emailadmin en Do not validate certificate +do you really want to delete this profile emailadmin en Do you really want to delete this profile? +do you really want to reset the filter for the profile listing emailadmin en Do you really want to reset the filter for the profile listing? +domainname emailadmin en Domain name +edit email settings emailadmin en Edit email settings +email account active emailadmin en Email account active +email address emailadmin en Email address +email settings common en Email settings +emailadmin emailadmin en eMailAdmin +emailadmin: group assigned profile common en eMailAdmin: Group assigned profile +emailadmin: user assigned profile common en eMailAdmin: User assigned profile +enable cyrus imap server administration emailadmin en Enable Cyrus IMAP server administration +enable sieve emailadmin en Enable Sieve +encrypted connection emailadmin en Encrypted connection +encryption settings emailadmin en Encryption settings +enter your default mail domain (from: user@domain) emailadmin en Enter your default mail domain from: user@domain +entry saved emailadmin en Entry saved +error connecting to imap server. %s : %s. emailadmin en Error connecting to IMAP server. %s : %s. +error connecting to imap server: [%s] %s. emailadmin en Error connecting to IMAP server: [%s] %s. +error deleting entry! emailadmin en Error deleting entry! +error saving the entry!!! emailadmin en Error saving the entry! +filtered by account emailadmin en Filtered by account +filtered by group emailadmin en Filtered by group +forward also to emailadmin en Forward also to +forward email's to emailadmin en Forward email's to +forward only emailadmin en Forward only +global options emailadmin en Global options +if using ssl or tls, you must have the php openssl extension loaded. emailadmin en If using SSL or TLS, you must have the PHP openssl extension loaded. +imap admin password admin en IMAP admin password +imap admin user admin en IMAP admin user +imap c-client version < 2001 emailadmin en IMAP C-Client Version < 2001 +imap server closed the connection. emailadmin en IMAP server closed the connection. +imap server closed the connection. server responded: %s emailadmin en IMAP Server closed the connection. Server Responded: %s +imap server hostname or ip address emailadmin en IMAP server hostname or ip address +imap server logintyp emailadmin en IMAP server login type +imap server name emailadmin en IMAP server name +imap server port emailadmin en IMAP server port +imap/pop3 server name emailadmin en IMAP/POP3 server name +in mbyte emailadmin en in MByte +inactive emailadmin en Inactive +ldap basedn emailadmin en LDAP basedn +ldap server emailadmin en LDAP server +ldap server accounts dn emailadmin en LDAP server accounts DN +ldap server admin dn emailadmin en LDAP server admin DN +ldap server admin password emailadmin en LDAP server admin password +ldap server hostname or ip address emailadmin en LDAP server host name or IP address +ldap settings emailadmin en LDAP settings +leave empty for no quota emailadmin en Leave empty for no quota +mail settings admin en Mail settings +manage stationery templates emailadmin en Manage stationery templates +name of organisation emailadmin en Name of organization +no alternate email address emailadmin en No alternate email address +no encryption emailadmin en No encryption +no forwarding email address emailadmin en No forwarding email address +no message returned. emailadmin en No message returned +no supported imap authentication method could be found. emailadmin en No supported IMAP authentication method could be found. +order emailadmin en Order +organisation emailadmin en Organisation +plesk can't rename users --> request ignored emailadmin en Plesk can't rename users --> request ignored +plesk imap server (courier) emailadmin en Plesk IMAP Server (Courier) +plesk mail script '%1' not found !!! emailadmin en Plesk mail script '%1' not found! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin en Plesk requires passwords to have at least 5 characters and not contain the account name --> password NOT set! +plesk smtp-server (qmail) emailadmin en Plesk SMTP-Server (Qmail) +pop3 server hostname or ip address emailadmin en POP3 server hostname or IP address +pop3 server port emailadmin en POP3 server port +postfix with ldap emailadmin en Postfix with LDAP +profile access rights emailadmin en Profile access rights +profile is active emailadmin en Profile is active +profile list emailadmin en Profile list +profile name emailadmin en Profile name +qmaildotmode emailadmin en qmaildotmode +qouta size in mbyte emailadmin en Qouta size in MByte +quota settings emailadmin en Quota settings +remove emailadmin en Remove +reset filter emailadmin en Reset filter +select type of imap server emailadmin en Select type of IMAP server +select type of imap/pop3 server emailadmin en Select type of IMAP/POP3 server +select type of smtp server emailadmin en Select type of SMTP server +send using this email-address emailadmin en Send using this email address +server settings emailadmin en Server settings +sieve server hostname or ip address emailadmin en Sieve server hostname or IP address +sieve server port emailadmin en Sieve server port +sieve settings emailadmin en Sieve settings +smtp authentication emailadmin en SMTP authentication +smtp options emailadmin en SMTP options +smtp server name emailadmin en SMTP server name +smtp settings emailadmin en SMTP settings +smtp-server hostname or ip address emailadmin en SMTP server hostname or IP address +smtp-server port emailadmin en SMTP server port +standard emailadmin en Standard +standard imap server emailadmin en Standard IMAP server +standard pop3 server emailadmin en Standard POP3 server +standard smtp-server emailadmin en Standard SMTP server +starts with emailadmin en Starts with +stationery emailadmin en Stationery +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin en The IMAP server does not appear to support the authentication method selected. Contact your system administrator. +this php has no imap support compiled in!! emailadmin en This PHP has no IMAP support compiled in!! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin en To use a TLS connection, you must be running a version of PHP 5.1.0 or higher. +unexpected response from server to authenticate command. emailadmin en Unexpected response from server to AUTHENTICATE command. +unexpected response from server to digest-md5 response. emailadmin en Unexpected response from server to Digest-MD5 response. +unexpected response from server to login command. emailadmin en Unexpected response from server to LOGIN command. +unknown imap response from the server. server responded: %s emailadmin en Unknown IMAP response from the server. %s +unsupported action '%1' !!! emailadmin en Unsupported action '%1' ! +update current email address: emailadmin en Update current email address: +use ldap defaults emailadmin en Use LDAP defaults +use predefined username and password defined below emailadmin en Use predefined username and password defined below +use smtp auth emailadmin en Use SMTP authentication +use tls authentication emailadmin en Use TLS authentication +use tls encryption emailadmin en Use TLS encryption +use users email-address (as seen in useraccount) emailadmin en Use users email address, as set in user account +user can edit forwarding address emailadmin en User can edit forwarding address +userid@domain eg. u1234@domain emailadmin en UserId@domain eg. u1234@domain +username (standard) emailadmin en Username (standard) +username/password defined by admin emailadmin en Username / Password defined by admin +username@domainname (virtual mail manager) emailadmin en username@domainname (Virtual MAIL ManaGeR) +users can define their own emailaccounts emailadmin en Users can define their own email accounts +users can define their own identities emailadmin en Users can define their own identities +users can define their own signatures emailadmin en Users can define their own signatures +users can utilize these stationery templates emailadmin en Users can utilize these stationery templates +vaction messages with start- and end-date require an admin account to be set! emailadmin en Vacation messages with start and end date require an admin account to be set! +virtual mail manager emailadmin en Virtual MAIL ManaGeR +you have received a new message on the emailadmin en You have received a new message on the diff --git a/emailadmin/lang/egw_es-es.lang b/emailadmin/lang/egw_es-es.lang new file mode 100644 index 0000000000..df347fc022 --- /dev/null +++ b/emailadmin/lang/egw_es-es.lang @@ -0,0 +1,143 @@ +account '%1' not found !!! emailadmin es-es ¡No se encontró la cuenta '%1'! +active templates emailadmin es-es Plantillas activas +add new email address: emailadmin es-es Añadir nueva dirección de correo +add profile emailadmin es-es Añadir perfil +admin dn emailadmin es-es dn del administrador +admin password emailadmin es-es contraseña del administrador +admin username emailadmin es-es usuario del administrador +advanced options emailadmin es-es opciones avanzadas +alternate email address emailadmin es-es dirección de correo alternativa +any application emailadmin es-es cualquier aplicación +any group emailadmin es-es cualquier grupo +any user emailadmin es-es cualquier usuario +back to admin/grouplist emailadmin es-es Volver a Administración/Lista de grupos +back to admin/userlist emailadmin es-es Volver a Administración/Lista de usuarios +bad login name or password. emailadmin es-es Nombre de usuario o contraseña incorrectos +bad or malformed request. server responded: %s emailadmin es-es Petición errónea o mal formado. El servidor respondió: %s +bad request: %s emailadmin es-es Petición errónea: %s +can be used by application emailadmin es-es puede usarse por la aplicación +can be used by group emailadmin es-es puede usarse por el grupo +can be used by user emailadmin es-es puede usarse por el usuario +connection dropped by imap server. emailadmin es-es El servidor IMAP ha interrumpido la conexión +could not complete request. reason given: %s emailadmin es-es No se pudo completar la solicitud. Motivo: %s +could not open secure connection to the imap server. %s : %s. emailadmin es-es No se pudo abrir una conexión segura con el servidor IMAP. %s: %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin es-es CRAM-MD5 o DIGEST-MD5 necesitan el paquete Auth_SASL para estar instalado. +cyrus imap server emailadmin es-es Servidor IMAP Cyrus +cyrus imap server administration emailadmin es-es Administración del servidor IMAP Cyrus +default emailadmin es-es predeterminada +deliver extern emailadmin es-es entrega externa +do not validate certificate emailadmin es-es No validar el certificado +do you really want to delete this profile emailadmin es-es ¿Realmente desea borrar este perfil? +do you really want to reset the filter for the profile listing emailadmin es-es Realmente desea restablecer el filtro para la lista de perfiles +domainname emailadmin es-es nombre del dominio +edit email settings emailadmin es-es editar configuración de la cuenta +email account active emailadmin es-es cuenta de correo electrónico activa +email address emailadmin es-es dirección de correo electrónico +email settings common es-es Configuración del correo electrónico +emailadmin emailadmin es-es Administración del correo electrónico +emailadmin: group assigned profile common es-es eMailAdmin: perfil asignado al grupo +emailadmin: user assigned profile common es-es eMailAdmin: perfil asignado al usuario +enable cyrus imap server administration emailadmin es-es activar administración del servidor Cyrus IMAP +enable sieve emailadmin es-es activar Sieve +encrypted connection emailadmin es-es conexión cifrada +encryption settings emailadmin es-es configuración del cifrado +enter your default mail domain (from: user@domain) emailadmin es-es introduzca el dominio predeterminado (de usuario@dominio) +error connecting to imap server. %s : %s. emailadmin es-es Error al conectar con el servidor IMAP. %s: %s. +error connecting to imap server: [%s] %s. emailadmin es-es Error al conectar con el servidor IMAP: [%s] %s. +filtered by account emailadmin es-es filtrado por cuenta +filtered by group emailadmin es-es filtrado por grupo +forward also to emailadmin es-es reenviar también a +forward email's to emailadmin es-es reenviar correos a +forward only emailadmin es-es sólo reenviar +global options emailadmin es-es opciones globales +if using ssl or tls, you must have the php openssl extension loaded. emailadmin es-es Si usa SSL o TLS, debe tener cargada la extensión openssl de PHP. +imap admin password admin es-es contraseña del administrador IMAP +imap admin user admin es-es usuario administrador IMAP +imap c-client version < 2001 emailadmin es-es Versión C-Cliente IMAP < 2001 +imap server closed the connection. emailadmin es-es El servidor IMAP cerró la conexión. +imap server closed the connection. server responded: %s emailadmin es-es El servidor IMAP cerró la conexión. El servidor respondió: %s +imap server hostname or ip address emailadmin es-es Servidor IMAP o dirección IP +imap server logintyp emailadmin es-es Tipo de sesión del servidor IMAP +imap server name emailadmin es-es Nombre del servidor IMAP +imap server port emailadmin es-es Puerto del servidor IMAP +imap/pop3 server name emailadmin es-es Nombre del servidor POP/IMAP +in mbyte emailadmin es-es en MBytes +inactive emailadmin es-es inactivo +ldap basedn emailadmin es-es basedn para LDAP +ldap server emailadmin es-es servidor LDAP +ldap server accounts dn emailadmin es-es DN para cuentas del servidor LDAP +ldap server admin dn emailadmin es-es DN del administrador del servidor LDAP +ldap server admin password emailadmin es-es contraseña del administrador del servidor LDAP +ldap server hostname or ip address emailadmin es-es Nombre del servidor LDAP o dirección IP +ldap settings emailadmin es-es Configuración LDAP +leave empty for no quota emailadmin es-es Dejar en blanco para no poner cuota +mail settings admin es-es Configuración del correo. +manage stationery templates emailadmin es-es Gestionar plantillas preimpresas +name of organisation emailadmin es-es Nombre de la organización +no alternate email address emailadmin es-es Sin dirección de correo alternativa +no encryption emailadmin es-es Sin cifrar +no forwarding email address emailadmin es-es Sin dirección de correo para reenviar +no message returned. emailadmin es-es No se devolvió ningún mensaje. +no supported imap authentication method could be found. emailadmin es-es No se pudo encontrar ningún método soportado de identificación IMAP. +order emailadmin es-es orden +organisation emailadmin es-es organización +plesk can't rename users --> request ignored emailadmin es-es Plesk no puede renombrar usuarios --> Se ignora la solicitud +plesk imap server (courier) emailadmin es-es Servidor IMAP Plesk (Courier) +plesk mail script '%1' not found !!! emailadmin es-es ¡No se encontró el script de correo de Plesk '%1'! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin es-es Plesk requiere que las contraseñas tengan al menos 5 caracteres y no contengan el nombre de la cuenta --> NO se establece la contraseña +plesk smtp-server (qmail) emailadmin es-es Servidor SMTP de Plesk (Qmail) +pop3 server hostname or ip address emailadmin es-es Nombre del servidor POP3 o dirección IP +pop3 server port emailadmin es-es Puerto del servidor POP3 +postfix with ldap emailadmin es-es Postfix con LDAP +profile access rights emailadmin es-es Derechos de acceso del perfil +profile is active emailadmin es-es el perfil está activo +profile list emailadmin es-es Lista de perfiles +profile name emailadmin es-es Nombre del perfil +qmaildotmode emailadmin es-es Modo de punto de qmail +qouta size in mbyte emailadmin es-es Tamaño de la cuota en MBytes +quota settings emailadmin es-es Configuración de las cuotas +remove emailadmin es-es borrar +reset filter emailadmin es-es restablecer filtro +select type of imap server emailadmin es-es Seleccione el tipo de servidor IMAP +select type of imap/pop3 server emailadmin es-es Seleccione el tipo de servidor IMAP/POP3 +select type of smtp server emailadmin es-es Seleccione el tipo de servidor SMTP +send using this email-address emailadmin es-es enviar usando esta dirección de correo electrónico +server settings emailadmin es-es configuración del servidor +sieve server hostname or ip address emailadmin es-es Nombre del servidor Sieve o dirección IP +sieve server port emailadmin es-es Puerto del servidor Sieve +sieve settings emailadmin es-es Configuración de Sieve +smtp authentication emailadmin es-es identificación SMTP +smtp options emailadmin es-es opciones SMTP +smtp server name emailadmin es-es Nombre del servidor SMTP +smtp settings emailadmin es-es configuración SMTP +smtp-server hostname or ip address emailadmin es-es Nombre del servidor SMTP o dirección IP +smtp-server port emailadmin es-es Puerto del servidor SMTP +standard emailadmin es-es Estándar +standard imap server emailadmin es-es Servidor IMAP estándar +standard pop3 server emailadmin es-es Servidor POP3 estándar +standard smtp-server emailadmin es-es Servidor SMTP estándar +stationery emailadmin es-es material preimpreso +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin es-es El servidor IMAP no parece soportar el método de identificación seleccionado. Por favor, póngase en contacto el administrador de su sistema. +this php has no imap support compiled in!! emailadmin es-es ¡¡Esta instalación de PHP no tiene soporte IMAP!! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin es-es Para usar una conexión TLS, debe ejecutar una versión de PHP 5.1.0 o superior. +unexpected response from server to authenticate command. emailadmin es-es Respuesta inesperada del servidor al comando AUTHENTICATE. +unexpected response from server to digest-md5 response. emailadmin es-es Respuesta inesperada del servidor a la respuesta Digest-MD5. +unexpected response from server to login command. emailadmin es-es Respuesta inesperada del servidor al comando LOGIN. +unknown imap response from the server. server responded: %s emailadmin es-es Respuesta IMAP desconocida del servidor. El servidor respondió: %s +unsupported action '%1' !!! emailadmin es-es ¡La acción '%1' no está soportada! +update current email address: emailadmin es-es Actualizar la dirección de correo actual: +use ldap defaults emailadmin es-es usar las opciones predeterminadas para LDAP +use predefined username and password defined below emailadmin es-es Usar el usuario predefinido y las contraseñas definidas debajo +use smtp auth emailadmin es-es Usar identificación SMTP +use tls authentication emailadmin es-es Usar identificación TLS +use tls encryption emailadmin es-es Usar cifrado TLS +user can edit forwarding address emailadmin es-es El usuario puede editar la dirección de reenvío +username (standard) emailadmin es-es usuario (estándar) +username/password defined by admin emailadmin es-es Usuario/contraseña definida por el administrador +username@domainname (virtual mail manager) emailadmin es-es usuario@dominio (Gestor de correo virtual) +users can define their own emailaccounts emailadmin es-es Los usuarios pueden definir sus propias cuentas de correo +users can define their own identities emailadmin es-es Los usuarios pueden definir sus propias identidades +users can define their own signatures emailadmin es-es Los usuarios pueden definir sus propias firmas +users can utilize these stationery templates emailadmin es-es Los usuarios pueden utilizar estas plantillas preimpresas +vaction messages with start- and end-date require an admin account to be set! emailadmin es-es Los mensajes con fecha de inicio y fin requieren establecer una cuenta de administrador +virtual mail manager emailadmin es-es Gestor de correo virtual diff --git a/emailadmin/lang/egw_et.lang b/emailadmin/lang/egw_et.lang new file mode 100755 index 0000000000..b47f1d1ac9 --- /dev/null +++ b/emailadmin/lang/egw_et.lang @@ -0,0 +1,45 @@ +account '%1' not found !!! emailadmin et Kontot '%1' ei leitud !!! +add new email address: emailadmin et Lisa uus email aadress +add profile emailadmin et Lisa Profiil +admin password emailadmin et admin parool +admin username emailadmin et admin kasutajanimi +alternate email address emailadmin et Alternatiivne email aadress +bad login name or password. emailadmin et Vale kasutajanimi või parool +cyrus imap server emailadmin et Cyrus IMAP Server +cyrus imap server administration emailadmin et Cyrus IMAP server administreerimine +default emailadmin et vaikimisi +do not validate certificate emailadmin et ära valideeri sertifikaati +do you really want to delete this profile emailadmin et Tahad tõesti kustutada seda Profiili +domainname emailadmin et Doomeninimi +edit email settings emailadmin et muuda emaili setinguid +email account active emailadmin et email konto aktiivne +email address emailadmin et email aadress +email settings common et Email setingud +encrypted connection emailadmin et krüpteeritud ühendus +encryption settings emailadmin et Krüpteerimise setingud +enter your default mail domain (from: user@domain) emailadmin et Sisesta oma vaikimisi mail doomen (kasutaja@doomen) +global options emailadmin et Globaalsed omadused +imap admin password admin et IMAP admin parool +imap admin user admin et IMAP admin kasutaja +imap c-client version < 2001 emailadmin et IMAP C-Client Versioon < 2001 +imap server closed the connection. emailadmin et IMAP server sulges ühenduse. +imap server closed the connection. server responded: %s emailadmin et IMAP Server sulges ühenduse. Server Vastas: %s +imap server name emailadmin et imap serveri nimi +imap server port emailadmin et IMAP serveri port +imap/pop3 server name emailadmin et IMAP/POP3 server nimi +ldap settings emailadmin et LDAP setingud +mail settings admin et Mail setingud +no alternate email address emailadmin et pole alternatiivset email aadressi +no encryption emailadmin et ilna krüpteeringutta +organisation emailadmin et Organisatsioon +pop3 server port emailadmin et POP3 serveri port +remove emailadmin et eemalda +select type of imap server emailadmin et vali IMAP serveri tüüp +select type of imap/pop3 server emailadmin et vali IMAP/POP3 serveri tüüp +select type of smtp server emailadmin et Vali SMTP serveri tüüp +server settings emailadmin et Serveri setingud +sieve server port emailadmin et Sieve serveri port +sieve settings emailadmin et Sieve setingud +smtp server name emailadmin et SMTP serveri nimi +smtp settings emailadmin et SMTP setingud +smtp-server port emailadmin et SMTP serveri port diff --git a/emailadmin/lang/egw_fa.lang b/emailadmin/lang/egw_fa.lang new file mode 100644 index 0000000000..906d7486ea --- /dev/null +++ b/emailadmin/lang/egw_fa.lang @@ -0,0 +1,66 @@ +add profile emailadmin fa اÙزودن مجموعه تنظیمات +admin dn emailadmin fa dn مدیر +admin password emailadmin fa گذرواژه مدیر +admin passwort emailadmin fa گذرواژه مدیر +admin username emailadmin fa نام کاربری مدیر +advanced options emailadmin fa تنظیمات پیشرÙته +alternate email address emailadmin fa نشانی پست الکترونیکی دیگر +any application emailadmin fa همه کاربردها +any group emailadmin fa همه گروهها +can be used by application emailadmin fa استÙاده شود توسط کاربرد +can be used by group emailadmin fa استÙاده شود توسط گروه +default emailadmin fa پیش Ùرض +deliver extern emailadmin fa حمل بیرونی +do you really want to delete this profile emailadmin fa آیا واقعا Ù…ÛŒ خواهید این مجموعه تنظیمات را حذ٠کنید؟ +domainname emailadmin fa نام حوزه +edit email settings emailadmin fa ویرایش تنظیمات نامه الکترونیکی +email account active emailadmin fa حساب نامه الکترونیکی Ùعال +email address emailadmin fa نشانی الکترونیکی +emailadmin emailadmin fa مدیر رایانامه +enable sieve emailadmin fa Ùعالسازی Sieve +encryption settings emailadmin fa تنظیمات رمز نگاری +enter your default mail domain (from: user@domain) emailadmin fa حوزه پیش Ùرض خود را وارد کنید:(مثلا: fgpars.net) +forward also to emailadmin fa همچنین ارسال به +forward email's to emailadmin fa ارسال نامه ها به +forward only emailadmin fa Ùقط ارسال به +global options emailadmin fa گزینه های عمومی +imap admin password admin fa گذرواژه مدیر IMAP +imap admin user admin fa کاربر مدیر IMAP +imap server hostname or ip address emailadmin fa نام میزبان یا نشانی IP کارگزار IMAP +imap server logintyp emailadmin fa نوع ورود کارگزار IMAP +imap server port emailadmin fa درگاه کارگزار IMAP +imap/pop3 server name emailadmin fa نام کارگزار IMAP/POP3 +in mbyte emailadmin fa به مگابایت +leave empty for no quota emailadmin fa برای بدون سهمیه بودن، خالی بگذارید +mail settings admin fa تنظیمات نامه +name of organisation emailadmin fa نام سازمان +no alternate email address emailadmin fa بدون نشانی نامه الکترونیکی دیگر +no forwarding email address emailadmin fa بدون نشانی نامه الکترونیکی ارسال به دیگری +order emailadmin fa ترتیب +organisation emailadmin fa سازمان +pop3 server hostname or ip address emailadmin fa نام میزبان یا نشانی IP کارگزار POP3 +pop3 server port emailadmin fa درگاه کارگزار POP3 +profile access rights emailadmin fa حقوق دسترسی مجموعه تنظیمات +profile list emailadmin fa لیست مجموعه تنظیمات +profile name emailadmin fa نام مجموعه تنظیمات +qouta size in mbyte emailadmin fa اندازه سهمیه به مگابایت +quota settings emailadmin fa تنظیمات سهمیه +remove emailadmin fa حذ٠+select type of imap/pop3 server emailadmin fa نوع کارگزار IMAP/POP3 را انتخاب کنید +select type of smtp server emailadmin fa نوع کارگزار SMTP را انتخاب کنید +server settings emailadmin fa تنظیمات کارگزار +sieve server hostname or ip address emailadmin fa نام میزبان یا نشانی IP کارگزار Sieve +sieve server port emailadmin fa درگاه کارگزار Sieve +sieve settings emailadmin fa تنظیمات Sieve +smtp authentication emailadmin fa تصدیق smtp +smtp server name emailadmin fa نام کارگزار SMTP +smtp settings emailadmin fa تنظیمات smtp +smtp-server hostname or ip address emailadmin fa نشانی IP یا نام میزبان SMTP +smtp-server port emailadmin fa درگاه کارگزار SMTP +standard emailadmin fa استاندارد +standard imap server emailadmin fa کارگزار استاندارد IMAP +standard pop3 server emailadmin fa کارگزار استاندارد POP3 +standard smtp-server emailadmin fa کارگزار استاندارد SMTP +use ldap defaults emailadmin fa از پیش Ùرضهای LDAP استÙاده شود +use smtp auth emailadmin fa استÙاده از تصدیق در SMTP +users can define their own emailaccounts emailadmin fa کاربران Ù…ÛŒ توانند حسابهای کاربری را خودشان تعری٠کنند diff --git a/emailadmin/lang/egw_fi.lang b/emailadmin/lang/egw_fi.lang new file mode 100644 index 0000000000..6b50482c50 --- /dev/null +++ b/emailadmin/lang/egw_fi.lang @@ -0,0 +1,151 @@ +%1 entries deleted. emailadmin fi %1 tapahtumaa poistettu +account '%1' not found !!! emailadmin fi Tiliä '%1' ei löytynyt! +active templates emailadmin fi Aktiiviset mallipohjat +add new email address: emailadmin fi Lisää uusi sähköpostiosoite +add profile emailadmin fi Lisää profiili +admin dn emailadmin fi Ylläpitäjän dn +admin password emailadmin fi Ylläpitäjän salasana +admin username emailadmin fi Ylläpitäjän käyttäjätunnus +advanced options emailadmin fi Lisäasetukset +alternate email address emailadmin fi Vaihtoehtoinen sähköpostiosoite +any application emailadmin fi Mikä tahansa sovellus +any group emailadmin fi Mikä tahansa ryhmä +any user emailadmin fi Kuka tahansa käyttäjä +back to admin/grouplist emailadmin fi Takaisin ylläpitoon / Ryhmäluetteloon +back to admin/userlist emailadmin fi Takaisin ylläpitoon / Käyttäjäluetteloon +bad login name or password. emailadmin fi Väärä käyttäjätunnus tai salasana +bad or malformed request. server responded: %s emailadmin fi Väärä tai viallinen pyyntö. %s +bad request: %s emailadmin fi Väärä pyyntö: %s +can be used by application emailadmin fi Sovellukselle +can be used by group emailadmin fi Ryhmälle +can be used by user emailadmin fi Käyttäjälle +connection dropped by imap server. emailadmin fi Yhteys IMAP palvelimeen katkesi. +could not complete request. reason given: %s emailadmin fi Pyyntöä ei voitu toteuttaa. %s +could not open secure connection to the imap server. %s : %s. emailadmin fi Turvattua yhteyttä IMAP palvelimeen ei voitu avata. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin fi CRAM-MD5 tai DIGEST-MD5 käyttö edellyttää Auth_SASL paketin asentamista. +cyrus imap server emailadmin fi Cyrus IMAP -palvelin +cyrus imap server administration emailadmin fi Cyrus IMAP -palvelimen hallinta +default emailadmin fi Oletus +deliver extern emailadmin fi Deliver extern +do not validate certificate emailadmin fi Älä tarkista sertifikaattia +do you really want to delete this profile emailadmin fi Haluatko varmasti poistaa tämän profiilin? +do you really want to reset the filter for the profile listing emailadmin fi Haluatko varmasti uudelleenasettaa suotimen profiililuetteloon? +domainname emailadmin fi Verkkotunnus +edit email settings emailadmin fi Muokkaa sähköpostin asetuksia +email account active emailadmin fi Sähköpostitili käytössä +email address emailadmin fi Sähköpostiosoite +email settings common fi Sähköpostin asetukset +emailadmin emailadmin fi Sähköpostin ylläpito +emailadmin: group assigned profile common fi Sähköpostin ylläpito: Ryhmälle suunnattu profiili +emailadmin: user assigned profile common fi Sähköpostin ylläpito: Käyttäjälle suunnattu profiili +enable cyrus imap server administration emailadmin fi Ota Cyrus IMAP -palvelimen hallinta käyttöön +enable sieve emailadmin fi Ota Sieve käyttöön +encrypted connection emailadmin fi Yhteyden suojaus +encryption settings emailadmin fi Yhteyden suojausasetukset +enter your default mail domain (from: user@domain) emailadmin fi Anna oletusverkkotunnus (käyttäjä@verkkotunnus) +entry saved emailadmin fi Tallennettu +error connecting to imap server. %s : %s. emailadmin fi Virhe yhdistettäessä IMAP palvelimeen. %s : %s. +error connecting to imap server: [%s] %s. emailadmin fi Virhe yhdistettäessä IMAP palvelimeen. [%s] %s. +error deleting entry! emailadmin fi Virhe poistettaessa! +error saving the entry!!! emailadmin fi Virhe tallennettaessa! +filtered by account emailadmin fi Käyttäjätilien mukaan +filtered by group emailadmin fi Ryhmän mukaan +forward also to emailadmin fi Välitä osoitteeseen +forward email's to emailadmin fi Välitä osoitteeseen +forward only emailadmin fi Ainoastaan edelleenlähetys +global options emailadmin fi Yleiset asetukset +if using ssl or tls, you must have the php openssl extension loaded. emailadmin fi Jos SSL tai TLS on käytössä, PHP openssl lisäosa pitää olla ladattuna. +imap admin password admin fi IMAP admin salasana +imap admin user admin fi IMAP admin käyttäjätunnus +imap c-client version < 2001 emailadmin fi IMAP C-Client versio < 2001 +imap server closed the connection. emailadmin fi IMAP palvelin katkaisi yhteyden. +imap server closed the connection. server responded: %s emailadmin fi IMAP palvelin katkaisi yhteyden. %s +imap server hostname or ip address emailadmin fi IMAP -palvelimen nimi tai IP-osoite +imap server logintyp emailadmin fi IMAP -palvelimen käyttäjätunnistus +imap server name emailadmin fi IMAP -palvelimen nimi +imap server port emailadmin fi IMAP -palvelimen portti +imap/pop3 server name emailadmin fi IMAP / POP3 -palvelimen nimi +in mbyte emailadmin fi Megatavua +inactive emailadmin fi Ei käytössä +ldap basedn emailadmin fi LDAP basedn +ldap server emailadmin fi LDAP -palvelin +ldap server accounts dn emailadmin fi LDAP -tunnusten DN +ldap server admin dn emailadmin fi LDAP -ylläpidon DN +ldap server admin password emailadmin fi LDAP -hallinnan salasana +ldap server hostname or ip address emailadmin fi LDAP -palvelimen nimi tai IP-osoite +ldap settings emailadmin fi LDAP -asetukset +leave empty for no quota emailadmin fi Jätä tyhjäksi, jos ei rajoiteta +mail settings admin fi Sähköpostin asetukset +manage stationery templates emailadmin fi Hallitse sähköpostin taustakuvamallipohjia +name of organisation emailadmin fi Organisaation nimi +no alternate email address emailadmin fi Ei vaihtoehtoista osoitetta +no encryption emailadmin fi Ei suojausta +no forwarding email address emailadmin fi Välityksen sähköpostiosoitetta ei löytynyt +no message returned. emailadmin fi Viestiä ei palautettu +no supported imap authentication method could be found. emailadmin fi Tuettua IMAP tunnistustapaa ei löydetty. +order emailadmin fi Järjestys +organisation emailadmin fi Organisaatio +plesk can't rename users --> request ignored emailadmin fi Plesk ei voi nimetä käyttäjiä --> pyyntö hylätty +plesk imap server (courier) emailadmin fi Plesk IMAP palvelin (Courier) +plesk mail script '%1' not found !!! emailadmin fi Plesk sähköpostiskriptiä '%1' ei löydy !!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin fi Plesk:n salasanassa pitää olla vähintään 5 merkkiä, eikä se saa olla käyttäjätilin nimi --> salasanaa EI ole asetettu !!! +plesk smtp-server (qmail) emailadmin fi Plesk SMTP-palvelin (Qmail) +pop3 server hostname or ip address emailadmin fi POP3 -palvelimen nimi tai IP-osoite +pop3 server port emailadmin fi POP3 -palvelimen portti +postfix with ldap emailadmin fi Postfix ja LDAP +profile access rights emailadmin fi Profiilin käyttöoikeudet +profile is active emailadmin fi Profiili on aktiivinen +profile list emailadmin fi Profiileiluettelo +profile name emailadmin fi Profiilin nimi +qmaildotmode emailadmin fi qmaildotmode +qouta size in mbyte emailadmin fi Tallennuskiintiö Mt +quota settings emailadmin fi Tallennuskiintiön asetukset +remove emailadmin fi Poista +reset filter emailadmin fi Poista suodatin +select type of imap server emailadmin fi Valitse IMAP -palvelimen tyyppi +select type of imap/pop3 server emailadmin fi Valitse IMAP / POP3 -palvelimen tyyppi +select type of smtp server emailadmin fi Valitse SMTP -palvelimen tyyppi +send using this email-address emailadmin fi Lähetä käyttäen tätä sähköpostiosoitetta +server settings emailadmin fi Palvelimen asetukset +sieve server hostname or ip address emailadmin fi Sieve -palvelimen nimi tai IP-osoite +sieve server port emailadmin fi Sieve -palvelimen portti +sieve settings emailadmin fi Sieven asetukset +smtp authentication emailadmin fi SMTP -tunnistus +smtp options emailadmin fi SMTP -asetukset +smtp server name emailadmin fi SMTP -palvelimen nimi +smtp settings emailadmin fi SMTP -asetukset +smtp-server hostname or ip address emailadmin fi SMTP -palvelimen nimi tai IP-osoite +smtp-server port emailadmin fi SMTP -palvelimen portti +standard emailadmin fi Vakio +standard imap server emailadmin fi Vakio IMAP -palvelin +standard pop3 server emailadmin fi Vakio POP3 -palvelin +standard smtp-server emailadmin fi Vakio SMTP -palvelin +starts with emailadmin fi Alkaa: +stationery emailadmin fi Sähköpostin taustakuvamallipohjat +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin fi IMAP palvelimelta ei löydy tukea valitulle tunnistusmuodolle, ota yhteyttä järjestelmän pääkäyttäjään. +this php has no imap support compiled in!! emailadmin fi Tämä PHP ei sisällä IMAP tukea!! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin fi Käyttääksesi TLS yhteyttä, sinulla pitää olla käytössä PHP 5.1.0 tai uudempi versio. +unexpected response from server to authenticate command. emailadmin fi Odottamaton vastaus palvelimen AUTHENTICATE komennolta. +unexpected response from server to digest-md5 response. emailadmin fi Odottamaton vastaus palvelimen Digest-MD5 vastauksesta. +unexpected response from server to login command. emailadmin fi Odottamaton vastaus palvelimen LOGIN komennolta. +unknown imap response from the server. server responded: %s emailadmin fi Tuntematon IMAP vastaus palvelimelta. Palvelin vastasi: %s +unsupported action '%1' !!! emailadmin fi Toiminto, jota ei tueta '%1' !!! +update current email address: emailadmin fi Päivitä nykyinen sähköpostiosoite: +use ldap defaults emailadmin fi Käytä LDAP -oletuksia +use predefined username and password defined below emailadmin fi Käytä esimääriteltyä käyttäjänimeä ja salasanaa +use smtp auth emailadmin fi Käytä SMTP -käyttäjätunnistusta +use tls authentication emailadmin fi Käytä TLS -käyttäjätunnistusta +use tls encryption emailadmin fi Käytä TLS -salausta +use users email-address (as seen in useraccount) emailadmin fi Käytä käyttäjän sähköpostiosoitetta +user can edit forwarding address emailadmin fi Käyttäjä voi muokata välitys osoitetta +userid@domain eg. u1234@domain emailadmin fi käyttäjätunnus@verkkotunnus +username (standard) emailadmin fi Käyttäjätunnus (standardi) +username/password defined by admin emailadmin fi Ylläpidon määrittelemä käyttäjätunnus/salasana +username@domainname (virtual mail manager) emailadmin fi käyttäjätunnus@verkkotunnus (Virtual MAIL ManaGeR) +users can define their own emailaccounts emailadmin fi Käyttäjät voivat määritellä omia sähköpostitilejä +users can define their own identities emailadmin fi Käyttäjät voivat määritellä omia identiteettejä +users can define their own signatures emailadmin fi Käyttäjät voivat määritellä omia allekirjoituksia +users can utilize these stationery templates emailadmin fi Käyttäjät voivat määritellä omia sähköpostin taustakuvamallipohjia +vaction messages with start- and end-date require an admin account to be set! emailadmin fi Lomavastaajaviestit alkamis- ja loppumispäiväyksellä vaativat ylläpitotilin asetuksen. +virtual mail manager emailadmin fi Virtual MAIL ManaGeR +you have received a new message on the emailadmin fi Sinulle on uusi viesti diff --git a/emailadmin/lang/egw_fr.lang b/emailadmin/lang/egw_fr.lang new file mode 100644 index 0000000000..51b247c648 --- /dev/null +++ b/emailadmin/lang/egw_fr.lang @@ -0,0 +1,122 @@ +account '%1' not found !!! emailadmin fr Le compte %1 n'a pas été trouvé!!! +add new email address: emailadmin fr Ajouter une nouvelle adresse email: +add profile emailadmin fr Ajouter un profil +admin dn emailadmin fr DN administrateur +admin password emailadmin fr Mot de passe administrateur +admin username emailadmin fr Nom d'utilisateur de l'administrateur +advanced options emailadmin fr Options avancées +alternate email address emailadmin fr Adresse email alternative +any application emailadmin fr Toutes les applications +any group emailadmin fr Tous les groupes +bad login name or password. emailadmin fr ID login ou mot de passe erroné +bad or malformed request. server responded: %s emailadmin fr Requête invalide ou erronnée. Réponse serveur: %s +bad request: %s emailadmin fr Requête invalide: %s +can be used by application emailadmin fr Peut être utilisée par application +can be used by group emailadmin fr Peut être utilisée par groupe +connection dropped by imap server. emailadmin fr Connexion interrompue par le Serveur IMAP. +could not complete request. reason given: %s emailadmin fr Impossible d'effectuer la requête. Raison invoquée: %s +could not open secure connection to the imap server. %s : %s. emailadmin fr Impossible d'ouvrir la connexion sécurisée avec le serveur IMAP. %s: %s +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin fr CRAM-MD5 ou DIGEST-MD5 requiert l'installation du progiciel Auth_SASL +cyrus imap server emailadmin fr Serveur Cyrus IMAP +cyrus imap server administration emailadmin fr Administration du serveur Cyrus IMAP +default emailadmin fr défaut +deliver extern emailadmin fr Relai de messagerie +do not validate certificate emailadmin fr ne pas valider le certificat +do you really want to delete this profile emailadmin fr Voulez-vous vraiment supprimer ce profil? +domainname emailadmin fr Nom de domaine +edit email settings emailadmin fr Modifier les paramètres de messagerie +email account active emailadmin fr Compte de messagerie actif +email address emailadmin fr Adresse de messagerie +email settings common fr Paramètres de messagerie +emailadmin emailadmin fr Administration de la messagerie +enable cyrus imap server administration emailadmin fr Activer la gestion du serveur Cyrus IMAP +enable sieve emailadmin fr Activer Sieve +encrypted connection emailadmin fr connexion chiffrée +encryption settings emailadmin fr Paramètres de chiffrement +enter your default mail domain (from: user@domain) emailadmin fr Introduisez votre domaine par défaut (utilisateur@domaine.com) +error connecting to imap server. %s : %s. emailadmin fr Erreur de connexion avec le serveur IMAP. %s: %s. +error connecting to imap server: [%s] %s. emailadmin fr Erreur de connexion avec le serveur IMAP. [%s] %s. +forward also to emailadmin fr Transférer aussi à +forward email's to emailadmin fr Transférer les emails à +forward only emailadmin fr Seulement transférer +global options emailadmin fr Options globales +if using ssl or tls, you must have the php openssl extension loaded. emailadmin fr Si vous utilisez SSl ou TLS, vous devez avoir chargé l'extension PHP openssl +imap admin password admin fr Mot de passe de l'administrateur IMAP +imap admin user admin fr ID administrateur IMAP +imap c-client version < 2001 emailadmin fr IMAP C-Client Version < 2001 +imap server closed the connection. emailadmin fr Le serveur IMAP a interrompu la connexion. +imap server closed the connection. server responded: %s emailadmin fr Le serveur IMAP a interrompu la connexion. Réponse du serveur: %s. +imap server hostname or ip address emailadmin fr Nom du serveur IMAP ou adresse IP +imap server logintyp emailadmin fr Type d'authentification IMAP +imap server name emailadmin fr Nom du serveur IMAP +imap server port emailadmin fr Port IMAP +imap/pop3 server name emailadmin fr Nom du serveur IMAP/POP3 +in mbyte emailadmin fr en Mo +ldap basedn emailadmin fr LDAP DN de base +ldap server emailadmin fr LDAP Serveur +ldap server accounts dn emailadmin fr LDAP DN contenant les comptes utilisateurs +ldap server admin dn emailadmin fr LDAP DN administrateur +ldap server admin password emailadmin fr LDAP Mot de passe administateur +ldap server hostname or ip address emailadmin fr LDAP Nom du serveur ou adresse IP +ldap settings emailadmin fr LDAP Paramètres +leave empty for no quota emailadmin fr Laisser vide pour ne pas avoir de quota +mail settings admin fr Paramètres de messagerie +name of organisation emailadmin fr Nom de l'entreprise +no alternate email address emailadmin fr Pas d'adresse email alternative +no encryption emailadmin fr pas de chiffrement +no forwarding email address emailadmin fr Pas d'adresse email de transfert +no message returned. emailadmin fr Aucun message n'est retourné. +no supported imap authentication method could be found. emailadmin fr Il n'a été trouvé aucune méthode d'authentification IMAP supportée +order emailadmin fr Ordre +organisation emailadmin fr Organisation +plesk can't rename users --> request ignored emailadmin fr Plesk ne peut pas renommer les utilisateurs --> requête ignorée +plesk imap server (courier) emailadmin fr Serveur IMAP Plesk (Courier) +plesk mail script '%1' not found !!! emailadmin fr Le script email Plesk '%1' introuvable!!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin fr Plesk requiert des mots de passe d'au moins 5 caractères qui ne comprennent pas le nom du compte --> le mot de passe n'est PAS fixé!!! +plesk smtp-server (qmail) emailadmin fr Serveur SMTP Plesk (Qmail) +pop3 server hostname or ip address emailadmin fr Nom ou adresse IP du POP3 +pop3 server port emailadmin fr Port POP3 +postfix with ldap emailadmin fr Postfix avec support LDAP +profile access rights emailadmin fr droits d'accès du profil +profile list emailadmin fr Liste des profils +profile name emailadmin fr Nom de profil +qmaildotmode emailadmin fr qmaildotmode +qouta size in mbyte emailadmin fr Taille du quota en Mo +quota settings emailadmin fr Paramètres de quota +remove emailadmin fr Supprimer +select type of imap server emailadmin fr Sélectionner le type de serveur IMAP +select type of imap/pop3 server emailadmin fr Sélectionner le type de serveur IMAP/POP3 +select type of smtp server emailadmin fr Sélectionner le type de serveur SMTP +server settings emailadmin fr Configuration du serveur +sieve server hostname or ip address emailadmin fr Nom ou adresse IP du serveur Sieve +sieve server port emailadmin fr Port Sieve +sieve settings emailadmin fr Paramètres Sieve +smtp authentication emailadmin fr Authentication SMTP +smtp options emailadmin fr Options SMTP +smtp server name emailadmin fr Nom du serveur SMTP +smtp settings emailadmin fr Paramètres SMTP +smtp-server hostname or ip address emailadmin fr Nom ou adresse IP du serveur SMTP +smtp-server port emailadmin fr Port SMTP +standard emailadmin fr Standard +standard imap server emailadmin fr Serveur IMAP standard +standard pop3 server emailadmin fr Serveur POP3 standard +standard smtp-server emailadmin fr Serveur SMTP standard +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin fr Le serveur IMAP ne supporterait pas la méthode d'authentication sélectionnée. Veuillez contacter votre administrateur système. +this php has no imap support compiled in!! emailadmin fr Ce PHP ne comprend pas de support IMAP!! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin fr Pour utiliser une connexion TLS, vous devez utiliser une version PHP 5.1.0 ou plus élevée. +unexpected response from server to authenticate command. emailadmin fr Réponse inattendue du serveur à la commande AUTHENTICATE. +unexpected response from server to digest-md5 response. emailadmin fr Réponse inattendue du serveur à la réponse Digest-MD5. +unexpected response from server to login command. emailadmin fr Réponse inattendue du serveur à la commande LOGIN. +unknown imap response from the server. server responded: %s emailadmin fr Réponse IMAP inconnue du serveur. Le serveur a répondu: %s +unsupported action '%1' !!! emailadmin fr Action '%1' non supportée!!! +update current email address: emailadmin fr Mettre à jour l'adresse email actuelle: +use ldap defaults emailadmin fr Utiliser les paramètres LDAP par défaut +use smtp auth emailadmin fr Utiliser l'authentification SMTP +use tls authentication emailadmin fr Utiliser l'authentification TLS +use tls encryption emailadmin fr Utiliser le cryptage TLS +user can edit forwarding address emailadmin fr L'utilisateur peut modifier l'adresse de transfert. +username (standard) emailadmin fr nom de l'utilisateur (standard) +username@domainname (virtual mail manager) emailadmin fr utilisateur@domaine (Virtual MAIL ManaGeR) +users can define their own emailaccounts emailadmin fr Les utilisateurs peuvent définir leurs propres comptes de messagerie +users can define their own signatures emailadmin fr les utilisateurs peuvent définir leurs propres signatures +virtual mail manager emailadmin fr Virtual MAIL ManaGeR diff --git a/emailadmin/lang/egw_hr.lang b/emailadmin/lang/egw_hr.lang new file mode 100755 index 0000000000..05089347a6 --- /dev/null +++ b/emailadmin/lang/egw_hr.lang @@ -0,0 +1,68 @@ +add profile emailadmin hr Add Profile +admin dn emailadmin hr admin dn +admin password emailadmin hr admin password +admin username emailadmin hr admin username +advanced options emailadmin hr advanced options +alternate email address emailadmin hr alternate email address +cyrus imap server emailadmin hr Cyrus IMAP Server +cyrus imap server administration emailadmin hr Cyrus IMAP server administration +default emailadmin hr default +deliver extern emailadmin hr deliver extern +do you really want to delete this profile emailadmin hr Do you really want to delete this Profile +domainname emailadmin hr domainname +edit email settings emailadmin hr edit email settings +email account active emailadmin hr email account active +email address emailadmin hr email address +enable cyrus imap server administration emailadmin hr enable Cyrus IMAP server administration +enable sieve emailadmin hr enable Sieve +enter your default mail domain (from: user@domain) emailadmin hr Enter your default mail domain (from: user@domain) +forward also to emailadmin hr forward also to +forward email's to emailadmin hr forward email's to +forward only emailadmin hr forward only +imap admin password admin hr IMAP admin password +imap admin user admin hr IMAP admin user +imap server hostname or ip address emailadmin hr IMAP server hostname or ip address +imap server logintyp emailadmin hr IMAP server login type +imap server port emailadmin hr IMAP server port +imap/pop3 server name emailadmin hr IMAP/POP3 server name +in mbyte emailadmin hr in MByte +ldap basedn emailadmin hr LDAP basedn +ldap server emailadmin hr LDAP server +ldap server accounts dn emailadmin hr LDAP server accounts DN +ldap server admin dn emailadmin hr LDAP server admin DN +ldap server admin password emailadmin hr LDAP server admin password +ldap server hostname or ip address emailadmin hr LDAP server hostname or ip address +ldap settings emailadmin hr LDAP settings +leave empty for no quota emailadmin hr leave empty for no quota +mail settings admin hr Mail settings +name of organisation emailadmin hr Name of organization +no alternate email address emailadmin hr no alternate email address +no forwarding email address emailadmin hr no forwarding email address +pop3 server hostname or ip address emailadmin hr POP3 server hostname or ip address +pop3 server port emailadmin hr POP3 server port +postfix with ldap emailadmin hr Postfix with LDAP +profile list emailadmin hr Profile List +profile name emailadmin hr Profile Name +qmaildotmode emailadmin hr qmaildotmode +qouta size in mbyte emailadmin hr qouta size in MByte +quota settings emailadmin hr quota settings +remove emailadmin hr remove +select type of imap/pop3 server emailadmin hr Select type of IMAP/POP3 server +select type of smtp server emailadmin hr Select type of SMTP Server +sieve server hostname or ip address emailadmin hr Sieve server hostname or ip address +sieve server port emailadmin hr Sieve server port +sieve settings emailadmin hr Sieve settings +smtp server name emailadmin hr SMTP server name +smtp-server hostname or ip address emailadmin hr SMTP server hostname or IP address +smtp-server port emailadmin hr SMTP server port +standard emailadmin hr Standard +standard imap server emailadmin hr Standard IMAP server +standard pop3 server emailadmin hr Standard POP3 server +standard smtp-server emailadmin hr Standard SMTP server +use ldap defaults emailadmin hr use LDAP defaults +use smtp auth emailadmin hr Use SMTP auth +use tls authentication emailadmin hr Use TLS authentication +use tls encryption emailadmin hr Use TLS encryption +users can define their own emailaccounts emailadmin hr Users can define their own email accounts +virtual mail manager emailadmin hr Virtual MAIL ManaGeR +IMAP C-Client Version < 2001 emailadmin hr IMAP C-Client Version < 2001 diff --git a/emailadmin/lang/egw_hu.lang b/emailadmin/lang/egw_hu.lang new file mode 100644 index 0000000000..09fa47037b --- /dev/null +++ b/emailadmin/lang/egw_hu.lang @@ -0,0 +1,143 @@ +account '%1' not found !!! emailadmin hu '%1' felhasználói azonosító nem található! +active templates emailadmin hu Aktív vázlatok +add new email address: emailadmin hu Új email cím hozzáadása: +add profile emailadmin hu Profil hozzáadása +admin dn emailadmin hu Admin dn +admin password emailadmin hu adminisztrátor jelszava +admin username emailadmin hu adminisztrátor neve +advanced options emailadmin hu haladó beállítások +alternate email address emailadmin hu alternatív emailcím +any application emailadmin hu Bármelyik modul +any group emailadmin hu Bármelyik csoport +any user emailadmin hu bármely felhasználó +back to admin/grouplist emailadmin hu Vissza az csoportok adminisztráláshoz +back to admin/userlist emailadmin hu Vissza a felhasználók adminisztráláshoz +bad login name or password. emailadmin hu Hibás belépési név vagy jelszó. +bad or malformed request. server responded: %s emailadmin hu Hibás kérés. Szerver válasza: %s +bad request: %s emailadmin hu Hibás kérés: %s +can be used by application emailadmin hu Ez a modul használhatja +can be used by group emailadmin hu Ez a csoport használhatja +can be used by user emailadmin hu a felhasználó alkalmazhatja +connection dropped by imap server. emailadmin hu A kapcsolatot az IMAP szerver eldobta. +could not complete request. reason given: %s emailadmin hu Kérést nem lehet teljesíteni. Az ok: %s +could not open secure connection to the imap server. %s : %s. emailadmin hu Nem létesíthetÅ‘ titkos csatorna az IMAP szerverhez. %s : %s +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin hu CRAM-MD5 vagy DIGEST-MD5 használatához az Auth_SASL csomagot telepíteni kell. +cyrus imap server emailadmin hu Cyrus IMAP-kiszolgáló +cyrus imap server administration emailadmin hu Cyrus IMAP-kiszolgáló adminisztrációja +default emailadmin hu Alapértelmezett +deliver extern emailadmin hu külsÅ‘ kézbesítés +do not validate certificate emailadmin hu ne ellenÅ‘rizze a tanúsítványt +do you really want to delete this profile emailadmin hu Valóban törölni kívánja ezt a profilt +do you really want to reset the filter for the profile listing emailadmin hu Valóban törölni szeretnéd a profillista szűrÅ‘t? +domainname emailadmin hu tartománynév +edit email settings emailadmin hu email beállítások szerkesztése +email account active emailadmin hu email azonosító aktív +email address emailadmin hu email cím +email settings common hu Email beállítások +emailadmin emailadmin hu EmailAdmin +emailadmin: group assigned profile common hu eMailAdmin: csoport a profilhoz hozzárendelve +emailadmin: user assigned profile common hu eMailAdmin: felhasználó a profilhoz hozzárendelve +enable cyrus imap server administration emailadmin hu Cyrus IMAP-kiszolgáló adminisztrációjának engedélyezése +enable sieve emailadmin hu Sieve engedélyezése +encrypted connection emailadmin hu titkosított kapcsolat +encryption settings emailadmin hu Titkosítás beállításai +enter your default mail domain (from: user@domain) emailadmin hu Adja meg az alapértelmezett levelezési tartományt (a felhasználó@tartomány-ból) +error connecting to imap server. %s : %s. emailadmin hu Hiba történt az IMAP szerverhez csatlakozás közben. %s : %s +error connecting to imap server: [%s] %s. emailadmin hu Hiba történt az IMAP szerverhez csatlakozás közben. [%s ]: %s +filtered by account emailadmin hu Fiók szerint szűrve +filtered by group emailadmin hu Csoport szerint szűrve +forward also to emailadmin hu továbbítsd ide is +forward email's to emailadmin hu email továbbítása ide +forward only emailadmin hu továbbítás csak ide +global options emailadmin hu Globális opciók +if using ssl or tls, you must have the php openssl extension loaded. emailadmin hu SSL vagy TLS használatához a PHP openssl kiterjesztését telepíteni kell. +imap admin password admin hu IMAP adminisztrátor jelszava +imap admin user admin hu IMAP adminisztrátor felhasználóneve +imap c-client version < 2001 emailadmin hu IMAP C-Client verzió < 2001 +imap server closed the connection. emailadmin hu Az IMAP szerver lezárta a kapcsolatot. +imap server closed the connection. server responded: %s emailadmin hu Az IMAP szerver lezárta a kapcsolatot: %s +imap server hostname or ip address emailadmin hu IMAP szerver hosztneve vagy IP címe +imap server logintyp emailadmin hu IMAP szerver bejelentkezési típusa +imap server name emailadmin hu IMAP szerver neve +imap server port emailadmin hu IMAP szerver portja +imap/pop3 server name emailadmin hu IMAP/POP3 szerver neve +in mbyte emailadmin hu MBájtban +inactive emailadmin hu inaktív +ldap basedn emailadmin hu LDAP basedn +ldap server emailadmin hu LDAP szerver +ldap server accounts dn emailadmin hu LDAP szerver accounts DN +ldap server admin dn emailadmin hu LDAP szerver admin DN +ldap server admin password emailadmin hu LDAP szerver adminisztrátorának jelszava +ldap server hostname or ip address emailadmin hu LDAP szerver hosztneve vagy IP címe +ldap settings emailadmin hu LDAP beállítások +leave empty for no quota emailadmin hu hagyja üresen a kvóta figyelmen kívül hagyásához +mail settings admin hu Levelezési beállítások +manage stationery templates emailadmin hu Irodaszer minták kezelése +name of organisation emailadmin hu Szervezet neve +no alternate email address emailadmin hu nincs alternatív email cím +no encryption emailadmin hu titkosítás nélkül +no forwarding email address emailadmin hu nincs továbbküldési email cím +no message returned. emailadmin hu Nincs visszaadott üzenet. +no supported imap authentication method could be found. emailadmin hu Nem található támogatott IMAP hitelesítés. +order emailadmin hu Rendezés +organisation emailadmin hu Szervezet +plesk can't rename users --> request ignored emailadmin hu A Plesk nem tudja átnevezni a felhasználókat -> kérés figyelmen kívül hagyva +plesk imap server (courier) emailadmin hu Plesk IMAP Szerver (Courier) +plesk mail script '%1' not found !!! emailadmin hu Plesk levél szkript '%1' nem található!!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin hu Plesk megköveteli, hogy a jelszó legalább 5 karakter legyen és ne tartalmazza a felhasználói nevet --> jelszó beállítása NEM történt meg!!! +plesk smtp-server (qmail) emailadmin hu Plesk SMTP-Szerver (Qmail) +pop3 server hostname or ip address emailadmin hu POP3 szerver hosztneve vagy IP címe +pop3 server port emailadmin hu POP3 szerver portja +postfix with ldap emailadmin hu Postfix LDAP-vel +profile access rights emailadmin hu profil elérési jogosultságok +profile is active emailadmin hu a profil inaktív +profile list emailadmin hu Profil lista +profile name emailadmin hu Profilnév +qmaildotmode emailadmin hu qmaildotmode +qouta size in mbyte emailadmin hu kvóta mérete Megabájtban +quota settings emailadmin hu kvóta beállításai +remove emailadmin hu eltávolítás +reset filter emailadmin hu szűrö törlése +select type of imap server emailadmin hu IMAP szerver típusának kiválasztása +select type of imap/pop3 server emailadmin hu Válassza ki az IMAP/POP3 szerver típusát +select type of smtp server emailadmin hu Válassza ki az SMTP szerver típusát +send using this email-address emailadmin hu Küldés errÅ‘l az e-mail címrÅ‘l +server settings emailadmin hu Szerver beállítások +sieve server hostname or ip address emailadmin hu Sieve szerver hosztneve vagy IP címe +sieve server port emailadmin hu Sieve szerver port +sieve settings emailadmin hu SIEVE beállítások +smtp authentication emailadmin hu SMTP azonosítás +smtp options emailadmin hu SMTP opciók +smtp server name emailadmin hu SMTP szerver neve +smtp settings emailadmin hu SMTP beállítások +smtp-server hostname or ip address emailadmin hu SMTP szerver hosztneve vagy IP címe +smtp-server port emailadmin hu SMTP szerver portja +standard emailadmin hu Szabványos +standard imap server emailadmin hu Szabványos IMAP-kiszolgáló +standard pop3 server emailadmin hu Szabványos POP3-kiszolgáló +standard smtp-server emailadmin hu Szabványos SMTP-kiszolgáló +stationery emailadmin hu Irodaszer +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin hu Az IMAP szerver úgy tűnik nem támogatja a kiválasztott hitelesítést. Lépjen kapcsolatba az adminisztrátorral. +this php has no imap support compiled in!! emailadmin hu A használt PHP verzió nem tartalmaz IMAP támogatást! (telepíteni kell) +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin hu TLS kapcsolat használatához legalább PHP 5.1.0-val kell rendelkeznie. +unexpected response from server to authenticate command. emailadmin hu Váratlan válasz a szervertÅ‘l az AUTHENTICATE parancsra. +unexpected response from server to digest-md5 response. emailadmin hu Váratlan válasz a szervertÅ‘l a Digest-MD5 parancsra. +unexpected response from server to login command. emailadmin hu Váratlan válasz a szervertÅ‘l a LOGIN parancsra. +unknown imap response from the server. server responded: %s emailadmin hu Váratlan válasz a szervertÅ‘l: %s +unsupported action '%1' !!! emailadmin hu Nem támogatott művelet '%1' !!! +update current email address: emailadmin hu Jelenlegi email cím frissítése: +use ldap defaults emailadmin hu használja az LDAP alapbeállításokat +use predefined username and password defined below emailadmin hu Használd a lent megadott felhasználónevet és jelszót +use smtp auth emailadmin hu SMTP hitelesítés használata +use tls authentication emailadmin hu TLS hitelesítés használata +use tls encryption emailadmin hu TLS kódolás használata +user can edit forwarding address emailadmin hu Felhasználó szerkesztheti a továbbításkor a címeket +username (standard) emailadmin hu felhasználó név (standard) +username/password defined by admin emailadmin hu Az adminisztrátok által meghatározott felhasználó és jelszó +username@domainname (virtual mail manager) emailadmin hu felhasználónév@tartománynév (Virtual MAIL ManaGeR) +users can define their own emailaccounts emailadmin hu A felhasználók saját maguk állíthatják be az email postafiókjaikat +users can define their own identities emailadmin hu A felhasználók beállíthatják a saját azonosítójukat +users can define their own signatures emailadmin hu A felhasználók beállíthatják a saját aláírásukat +users can utilize these stationery templates emailadmin hu A felhasználók alkalmazhatják az irodaszer mintákat +vaction messages with start- and end-date require an admin account to be set! emailadmin hu A házon kívül üzenet érvényességi dátumának megadása adminisztrátor szintű hozzáférést igényel! +virtual mail manager emailadmin hu Virtuális MAIL ManaGeR diff --git a/emailadmin/lang/egw_id.lang b/emailadmin/lang/egw_id.lang new file mode 100644 index 0000000000..32a4c5aa2e --- /dev/null +++ b/emailadmin/lang/egw_id.lang @@ -0,0 +1,86 @@ +%1 entries deleted. emailadmin id %1 entri dihapus. +account '%1' not found !!! emailadmin id Akoun '%1' tidak ditemukan !!! +active templates emailadmin id Templat yang aktif +add new email address: emailadmin id Tambah alamat email baru: +add profile emailadmin id Tambah Profil +admin dn emailadmin id Admin dn +admin password emailadmin id Password Admin +admin username emailadmin id Nama Admin +advanced options emailadmin id Opsi Canggih +alternate email address emailadmin id Alamat email pengganti +any application emailadmin id Semua aplikasi +any group emailadmin id Semua kelompok +any user emailadmin id semua pengguna +back to admin/grouplist emailadmin id Kembali ke Admin/Daftar Kelompok +back to admin/userlist emailadmin id Kembali ke Admin/Daftar pengguna +bad login name or password. emailadmin id Nama atau password tidak benar. +could not open secure connection to the imap server. %s : %s. emailadmin id Could not open secure connection to the IMAP server. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin id CRAM-MD5 or DIGEST-MD5 requires the Auth_SASL package to be installed. +cyrus imap server emailadmin id Server Cyrus IMAP +cyrus imap server administration emailadmin id Administrasi server Cyrus IMAP +default emailadmin id bawaan +deliver extern emailadmin id pengiriman eksternal +domainname emailadmin id Nama Domain +edit email settings emailadmin id Edit pengaturan email +email account active emailadmin id Akoun Email aktif +email address emailadmin id Alamat Email +email settings common id Pengaturan Email +emailadmin emailadmin id AdminEMail +emailadmin: group assigned profile common id AdminEMail: Profil menurut kelompok +emailadmin: user assigned profile common id AdminEMail: Profil menurut pengguna +enable sieve emailadmin id Bolehkan Sieve +encrypted connection emailadmin id koneksi ter-enkripsi +encryption settings emailadmin id Pengaturan Enkripsi +enter your default mail domain (from: user@domain) emailadmin id Berikan nama domain email anda (dari: pengguna@domain) +filtered by account emailadmin id saringan menurut Akoun +filtered by group emailadmin id saringan menurut Kelompok +forward only emailadmin id Hanya Forward +global options emailadmin id Opsi Global +imap admin password admin id password admin IMAP +imap admin user admin id admin IMAP +imap c-client version < 2001 emailadmin id IMAP C-Client Version < 2001 +in mbyte emailadmin id dalam MByte +inactive emailadmin id tidak aktif +ldap basedn emailadmin id LDAP basedn +ldap server emailadmin id LDAP server +ldap settings emailadmin id Pengaturan LDAP +leave empty for no quota emailadmin id kosongkan bila tanpa kuota +mail settings admin id Pengaturan Mail +name of organisation emailadmin id Nama Organisasi +no alternate email address emailadmin id tanpa alamat email pengganti +no encryption emailadmin id tanpa enkripsi +order emailadmin id Urutan +organisation emailadmin id Organisasi +profile list emailadmin id Daftar Profil +profile name emailadmin id Nama Profil +qmaildotmode emailadmin id qmaildotmode +qouta size in mbyte emailadmin id Kuota dalam MByte +quota settings emailadmin id Pengaturan Kuota +remove emailadmin id Buang +reset filter emailadmin id ulangi penyaringan +select type of imap server emailadmin id Pilih tipe Server IMAP +select type of imap/pop3 server emailadmin id Pilih tipe Server IMAP/POP3 +select type of smtp server emailadmin id Pilih tipe Server SMTP +send using this email-address emailadmin id kirim menggunakan alamat eMail ini +server settings emailadmin id Pengaturan Server +sieve server hostname or ip address emailadmin id Sieve server hostname or ip address +sieve server port emailadmin id Sieve server port +sieve settings emailadmin id Pengaturan Sieve +smtp authentication emailadmin id Otentikasi SMTP +smtp options emailadmin id Opsi SMTP +smtp server name emailadmin id Nama server SMTP +smtp settings emailadmin id Pengaturan SMTP +smtp-server hostname or ip address emailadmin id Nama atau alamat IP server SMTP +smtp-server port emailadmin id Port server SMTP +standard emailadmin id Standar +standard imap server emailadmin id Server IMAP Standar +standard pop3 server emailadmin id Server POP3 Standar +standard smtp-server emailadmin id Server SMTP Standar +starts with emailadmin id diawali dengan +stationery emailadmin id Stationery +unexpected response from server to login command. emailadmin id Unexpected response from server to LOGIN command. +update current email address: emailadmin id Memperbarui alamat email saat ini: +username (standard) emailadmin id namapengguna (standar) +username/password defined by admin emailadmin id Namapengguna/Password dibuat oleh admin +username@domainname (virtual mail manager) emailadmin id username@domainname (Virtual MAIL ManaGeR) +virtual mail manager emailadmin id Virtual MAIL ManaGeR diff --git a/emailadmin/lang/egw_it.lang b/emailadmin/lang/egw_it.lang new file mode 100644 index 0000000000..4d24e3efe4 --- /dev/null +++ b/emailadmin/lang/egw_it.lang @@ -0,0 +1,97 @@ +account '%1' not found !!! emailadmin it Account '%1' non trovato !!! +add profile emailadmin it Aggiungi Profilo +admin dn emailadmin it dn amministratore +admin password emailadmin it password amministratore +admin username emailadmin it username amministratore +advanced options emailadmin it opzioni avanzate +alternate email address emailadmin it indirizzo email alternativo +any application emailadmin it ogni applicazione +any group emailadmin it ogni gruppo +bad login name or password. emailadmin it Nome utente o password errati. +bad or malformed request. server responded: %s emailadmin it Richiesta errata o mal composta. Il Server ha risposto: %s +bad request: %s emailadmin it Richiesta errata: %s +can be used by application emailadmin it può essere usato da applicazione +can be used by group emailadmin it può essere usato da gruppo +connection dropped by imap server. emailadmin it Connessione interrotta dal sever IMAP. +could not complete request. reason given: %s emailadmin it Impossibile completare la richiesta. Motivazione data: %s +could not open secure connection to the imap server. %s : %s. emailadmin it Non è possibile aprire una connessione sicura al server IMAP. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin it CRAM-MD5 o DIGEST-MD5 richiede che il pacchetto Auth_SASL sia installato. +cyrus imap server emailadmin it Server IMAP Cyrus +cyrus imap server administration emailadmin it Amministrazione Server IMAP Cyrus +default emailadmin it predefinito +do you really want to delete this profile emailadmin it Vuoi davvero cancellare questo Profilo +domainname emailadmin it nome dominio +edit email settings emailadmin it modifica impostazioni email +email account active emailadmin it account email attivo +email address emailadmin it indirizzo email +email settings common it Impostazioni email +emailadmin emailadmin it Gestione Email +enable cyrus imap server administration emailadmin it abilita amministrazione Server IMAP Cyrus +enable sieve emailadmin it abilita Sieve +encryption settings emailadmin it impostazioni cifratura +enter your default mail domain (from: user@domain) emailadmin it Inserisci il tuo dominio di posta predefinito (da: utente@dominio) +error connecting to imap server. %s : %s. emailadmin it Errore in connessione al server IMAP. %s : %s. +error connecting to imap server: [%s] %s. emailadmin it Errore in connessione al server IMAP: [%s] %s. +forward also to emailadmin it Inoltra anche a +forward email's to emailadmin it Inoltra email a +forward only emailadmin it Inoltra solo +global options emailadmin it Opzioni globali +imap admin password admin it Password amministratore IMAP +imap admin user admin it User amministratore IMAP +imap c-client version < 2001 emailadmin it Versione C-Cliente < 2001 +imap server hostname or ip address emailadmin it Nome Host o IP del server IMAP +imap server logintyp emailadmin it Tipo login server IMAP +imap server port emailadmin it Porta server IMAP +imap/pop3 server name emailadmin it Nome server IMAP/POP3 +in mbyte emailadmin it in MByte +ldap basedn emailadmin it LDAP basedn +ldap server emailadmin it server LDAP +ldap server accounts dn emailadmin it DN account server LDAP +ldap server admin dn emailadmin it DN amministratore server LDAP +ldap server admin password emailadmin it password amministratore server LDAP +ldap server hostname or ip address emailadmin it Nome host o IP server LDAP +ldap settings emailadmin it impostazioni LDAP +leave empty for no quota emailadmin it lascia vuoto per nessuna quota +mail settings admin it Impostazioni Posta +name of organisation emailadmin it Nome dell'organizzazione +no alternate email address emailadmin it nessun indirizzo email alternativo +no forwarding email address emailadmin it nessun indirizzo email di inoltro +no message returned. emailadmin it nessun messaggio ricevuto +order emailadmin it ordine +organisation emailadmin it organizzazione +pop3 server hostname or ip address emailadmin it Nome host o IP server POP3 +pop3 server port emailadmin it porta server POP3 +postfix with ldap emailadmin it Postfix con LDAP +profile access rights emailadmin it diritti di accesso profilo +profile list emailadmin it Elenco Profili +profile name emailadmin it Nome Profilo +qmaildotmode emailadmin it qmaildotmode +qouta size in mbyte emailadmin it dimensione quota in MByte +quota settings emailadmin it impostazioni quota +remove emailadmin it rimuovi +select type of imap/pop3 server emailadmin it Seleziona il tipo si server IMAP/POP3 +select type of smtp server emailadmin it Seleziona il tipo di server SMTP +server settings emailadmin it impostazioni server +sieve server hostname or ip address emailadmin it Nome host o IP server Sieve +sieve server port emailadmin it porta server Sieve +sieve settings emailadmin it impostazioni SIeve +smtp authentication emailadmin it autenticazione smtp +smtp options emailadmin it opzioni smtp +smtp server name emailadmin it nome server SMTP +smtp settings emailadmin it impostazioni smtp +smtp-server hostname or ip address emailadmin it Nome host o IP server SMTP +smtp-server port emailadmin it porta server SMTP +standard emailadmin it Standard +standard imap server emailadmin it Server IMAP standard +standard pop3 server emailadmin it Server POP3 standard +standard smtp-server emailadmin it Server SMTP standard +unsupported action '%1' !!! emailadmin it Azione non supportata '%1' !!! +use ldap defaults emailadmin it usa predefiniti LDAP +use smtp auth emailadmin it usa autenticazione SMTP +use tls authentication emailadmin it usa autenticazione TLS +use tls encryption emailadmin it usa crittografia TLS +user can edit forwarding address emailadmin it l'utente può modificare indirizzo di inoltro +username (standard) emailadmin it nome utente (standard) +username@domainname (virtual mail manager) emailadmin it nomeutente@nome dominio (ManaGeR MAIL Virtuale) +users can define their own emailaccounts emailadmin it Gli utenti possono definire i propri account email +virtual mail manager emailadmin it ManaGeR MAIL Virtuale diff --git a/emailadmin/lang/egw_iw.lang b/emailadmin/lang/egw_iw.lang new file mode 100755 index 0000000000..57347f8f30 --- /dev/null +++ b/emailadmin/lang/egw_iw.lang @@ -0,0 +1,68 @@ +add profile emailadmin iw הוסף פרופיל +admin dn emailadmin iw של המנהל dn +admin password emailadmin iw סיסמת מנהל +admin username emailadmin iw ×©× ×ž×©×ª×ž×© של המנהל +advanced options emailadmin iw ×ופציות מתקדמות +alternate email address emailadmin iw כתובת דו×ר ×לקטרוני חילופי +cyrus imap server emailadmin iw Cyrus IMAP שרת +cyrus imap server administration emailadmin iw Cyrus IMAP ניהול שרת +default emailadmin iw ברירת מחדל +deliver extern emailadmin iw מסירה חיצונית +do you really want to delete this profile emailadmin iw בטוח שברצונך למחוק פרופיל ×–×” +domainname emailadmin iw ×©× ×”×“×•×ž×™×™×Ÿ +edit email settings emailadmin iw ערוך הגדרות דו×ר ×לקטרוני +email account active emailadmin iw חשבון דו×ר ×לקטרוני פעיל +email address emailadmin iw כתובת דו×ר ×לקטרוני +enable cyrus imap server administration emailadmin iw Cyrus IMAP ×יפשור ניהול שרת +enable sieve emailadmin iw Sieve ×ישפור +enter your default mail domain (from: user@domain) emailadmin iw (user@domain :ציין ×ת דומיין דו×ר המחדלי שלך (×œ×“×•×’×ž× +forward also to emailadmin iw להעביר ×’× ×ל +forward email's to emailadmin iw להעביר דו×ר ×לקטרוני ×ל +forward only emailadmin iw העבר בלבד +imap admin password admin iw IMAP סיסמת ניהול +imap admin user admin iw IMAP ×©× ×ž× ×”×œ +imap c-client version < 2001 emailadmin iw IMAP C-Client Version < 2001 +imap server hostname or ip address emailadmin iw שלו IP- ×ו כתובת ×”IMAP ×©× ×©×¨×ª +imap server logintyp emailadmin iw IMAP סוג כניסה לשרת +imap server port emailadmin iw IMAP פורט שרת +imap/pop3 server name emailadmin iw IMAP/POP3 ×©× ×©×¨×ª +in mbyte emailadmin iw MB-ב +ldap basedn emailadmin iw dn הביסי של LDAP +ldap server emailadmin iw LDAP שרת +ldap server accounts dn emailadmin iw LDAP של שרת חשבונות DN +ldap server admin dn emailadmin iw LDAP מנהל שרת של DN +ldap server admin password emailadmin iw LDAP סיסמה של מנהל שרת +ldap server hostname or ip address emailadmin iw IP ×ו כתובת LDAP ×©× ×©×¨×ª +ldap settings emailadmin iw LDAP הגדרות +leave empty for no quota emailadmin iw הש×ר ריק ×œ×œ× ×”×§×¦××” +mail settings admin iw הגדרות דו×ר +name of organisation emailadmin iw ×©× ×”×ירגון +no alternate email address emailadmin iw ×ין כתובת דו×ר ×לקטרוני חלופי +no forwarding email address emailadmin iw ×ין כתובת להעברת דו×ר ×לקטרוני +pop3 server hostname or ip address emailadmin iw IP ×ו כתובת pop3 ×©× ×©×¨×ª +pop3 server port emailadmin iw POP3 פורט שרת +postfix with ldap emailadmin iw LDAP ×¢× Postfix +profile list emailadmin iw רשימת ×¤×¨×•×¤×™×œ×™× +profile name emailadmin iw ×©× ×¤×¨×•×¤×™×œ +qmaildotmode emailadmin iw qmaildotmode +qouta size in mbyte emailadmin iw MB-גודל הקצ××” ב +quota settings emailadmin iw הגדרות הקצ××” +remove emailadmin iw הסר +select type of imap/pop3 server emailadmin iw IMAP/POP3 בחר סוג שרת +select type of smtp server emailadmin iw SMTP בחר סוג שרת +sieve server hostname or ip address emailadmin iw IP ×ו כתובת Sieve ×©× ×©×¨×ª +sieve server port emailadmin iw Sieve פורט שרת +sieve settings emailadmin iw Sieve הגדרות +smtp server name emailadmin iw SMTP ×©× ×©×¨×ª +smtp-server hostname or ip address emailadmin iw IP ×ו כתובת SMTP ×©× ×©×¨×ª +smtp-server port emailadmin iw SMTP פורת שרת +standard emailadmin iw תקני +standard imap server emailadmin iw תקני IMAP שרת +standard pop3 server emailadmin iw תקני POP3 שרת +standard smtp-server emailadmin iw תקני SMTP שרת +use ldap defaults emailadmin iw LDAP השתמש בברירות מחדל של +use smtp auth emailadmin iw LDAP השתמש ב×ימות ×ž×©×ª×ž×©×™× ×©×œ +use tls authentication emailadmin iw TLS השתמש ב×ימות +use tls encryption emailadmin iw TLS השתמש בהצפנת +users can define their own emailaccounts emailadmin iw ×ž×©×ª×ž×©×™× ×™×›×•×œ×™× ×œ×”×’×“×™×¨ ×‘×¢×¦×ž× ×ת חשבונות דו×ר ×”×לקטרוני ×©×œ×”× +virtual mail manager emailadmin iw מלהל דו×ר וירטו×לי diff --git a/emailadmin/lang/egw_lt.lang b/emailadmin/lang/egw_lt.lang new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/emailadmin/lang/egw_lt.lang @@ -0,0 +1 @@ + diff --git a/emailadmin/lang/egw_lv.lang b/emailadmin/lang/egw_lv.lang new file mode 100644 index 0000000000..1cbd7303b9 --- /dev/null +++ b/emailadmin/lang/egw_lv.lang @@ -0,0 +1,61 @@ +add profile emailadmin lv Pievienot profilu +admin dn emailadmin lv administratora dn +admin password emailadmin lv administratora parole +admin username emailadmin lv administratora lietotÄjvÄrds +advanced options emailadmin lv uzlabotÄs iespÄ“jas +alternate email address emailadmin lv alternatÄ«vas e-pasta adreses +cyrus imap server emailadmin lv Cyrus IMAP serveris +cyrus imap server administration emailadmin lv Cyrus IMAP servera administrÄ“Å¡ana +default emailadmin lv noklusÄ“jums +do you really want to delete this profile emailadmin lv Vai tu tieÅ¡Äm vÄ“lies dzÄ“st Å¡o profilu? +domainname emailadmin lv domÄ“na vÄrds +edit email settings emailadmin lv rediģēt e-pasta uzstÄdÄ«jumus +email account active emailadmin lv e-pasta konts aktÄ«vs +email address emailadmin lv e-pasta adrese +enable cyrus imap server administration emailadmin lv atļaut Cyrus IMAP servera administrÄ“Å¡anu +enable sieve emailadmin lv atļaut Sieve +enter your default mail domain (from: user@domain) emailadmin lv Ievadi noklusÄ“to pasta domÄ“nu (no: lietotÄjs@domÄ“ns) +forward also to emailadmin lv pÄrsÅ«tÄ«t arÄ« +forward email's to emailadmin lv pÄrsÅ«tÄ«t e-pasta vÄ“stules +forward only emailadmin lv tikai pÄrsÅ«tÄ«t +imap admin password admin lv IMAP administratora parole +imap admin user admin lv IMAP administrators +imap c-client version < 2001 emailadmin lv IMAP C-Client Version <2001 +imap server hostname or ip address emailadmin lv IMAP servera hosta vÄrds vai IP adrese +imap server logintyp emailadmin lv IMAP servera autorizÄcijas veids +imap server port emailadmin lv IMAP servera ports +imap/pop3 server name emailadmin lv IMAP/POP3 servera nosaukums +ldap basedn emailadmin lv LDAP bÄzes dn +ldap server emailadmin lv LDAP serveris +ldap server accounts dn emailadmin lv LDAP servera konti DN +ldap server admin dn emailadmin lv LDAP servera administratora DN +ldap server admin password emailadmin lv LDAP servera administratora parole +ldap server hostname or ip address emailadmin lv LDAP servera hosta vÄrds vai IP adrese +ldap settings emailadmin lv LDAP uzstÄdÄ«jumi +mail settings admin lv Pasta uzstÄdÄ«jumi +name of organisation emailadmin lv OrganizÄcijas nosaukums +no alternate email address emailadmin lv nav alternatÄ«vas e-pasta adreses +no forwarding email address emailadmin lv nav pÄrsÅ«tÄmÄs e-pasta adreses +pop3 server hostname or ip address emailadmin lv POP3 servera hosta vÄrds vai IP adrese +pop3 server port emailadmin lv POP3 servera ports +profile list emailadmin lv Profila saraksts +profile name emailadmin lv Profila vÄrds +remove emailadmin lv pÄrvietot +select type of imap/pop3 server emailadmin lv AtzÄ«mÄ“t IMAP/POP3 servera tipu +select type of smtp server emailadmin lv AtzÄ«mÄ“t SMTP servera tipu +sieve server hostname or ip address emailadmin lv ?Sieve? servera hosta vÄrds vai IP adrese +sieve server port emailadmin lv Sieve servera ports +sieve settings emailadmin lv Sieve uzstadÄ«jumi +smtp server name emailadmin lv SMTP servera nosaukums +smtp-server hostname or ip address emailadmin lv SMTP servera hosta vÄrds vai IP adrese +smtp-server port emailadmin lv SMTP servera ports +standard emailadmin lv Standarta +standard imap server emailadmin lv Standarta IMAP serveris +standard pop3 server emailadmin lv Standarta POP3 serveris +standard smtp-server emailadmin lv Standarta SMTP serveris +use ldap defaults emailadmin lv lieto LDAP noklusÄ“jumus +use smtp auth emailadmin lv Lieto SMTP autentifikÄciju +use tls authentication emailadmin lv Lieto TLS autentifikÄciju +use tls encryption emailadmin lv Lieto TLS Å¡ifrÄ“Å¡anu +users can define their own emailaccounts emailadmin lv LIetotÄji paÅ¡i var definÄ“t savus e-pasta kontus +virtual mail manager emailadmin lv VIrtuÄlais MAIL ManaGeR diff --git a/emailadmin/lang/egw_nl.lang b/emailadmin/lang/egw_nl.lang new file mode 100644 index 0000000000..805ed67ccf --- /dev/null +++ b/emailadmin/lang/egw_nl.lang @@ -0,0 +1,138 @@ +account '%1' not found !!! emailadmin nl Account '%1' niet gevonden !!! +add new email address: emailadmin nl Voeg nieuw emailadres toe: +add profile emailadmin nl Profiel toevoegen +admin dn emailadmin nl admin dn +admin password emailadmin nl Admin wachtwoord +admin username emailadmin nl Admin gebruikersnaam +advanced options emailadmin nl Geavanceerde opties +alternate email address emailadmin nl Alternatief emailadres +any application emailadmin nl Iedere toepassing +any group emailadmin nl Iedere groep +any user emailadmin nl iedere gebruiker +back to admin/grouplist emailadmin nl Terug naar Beheer/Groepslijst +back to admin/userlist emailadmin nl Terug naar Beheer/Gebruikerslijst +bad login name or password. emailadmin nl Ongeldige login of paswoord +bad or malformed request. server responded: %s emailadmin nl Ongeldig of slecht geformuleerde aanvraag. Server reageerde: %s +bad request: %s emailadmin nl Slechte vraag: %s +can be used by application emailadmin nl Kan gebruikt worden door toepassing +can be used by group emailadmin nl Kan gebruikt worden door groep +can be used by user emailadmin nl kan door gebruiker gebruikt worden +connection dropped by imap server. emailadmin nl Verbinding viel uit door IMAP server +could not complete request. reason given: %s emailadmin nl Kan verzoek niet afmaken. Opgegeven reden: %s +could not open secure connection to the imap server. %s : %s. emailadmin nl Kon geen veilige verbinding openen met de IMAP server. %s : %s +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin nl CRAM-MDS of DIGEST-MDS vereist de installatie van het Auth_SASL pakket. +cyrus imap server emailadmin nl Cyrus IMAP-server +cyrus imap server administration emailadmin nl Cyrus IMAP-serverbeheer +default emailadmin nl standaard +deliver extern emailadmin nl bezorg extern +do not validate certificate emailadmin nl het certificaat niet valideren +do you really want to delete this profile emailadmin nl Weet u zeker dat u dit profiel wilt verwijderen +do you really want to reset the filter for the profile listing emailadmin nl Wilt u werkelijk het filter voor de profielenlijst opnieuw instellen +domainname emailadmin nl Domeinnaam +edit email settings emailadmin nl Wijzig emailinstellingen +email account active emailadmin nl Emailaccount actief +email address emailadmin nl Emailadres +email settings common nl Emailinstellingen +emailadmin emailadmin nl EmailAdmin +emailadmin: group assigned profile common nl eMailAdmin: Groep heeft profiel toegewezen gekregen +emailadmin: user assigned profile common nl eMailAdmin: Gebruiker heeft profiel toegewezen gekregen +enable cyrus imap server administration emailadmin nl activier Cyrus IMAP serverbeheer +enable sieve emailadmin nl activeer Sieve +encrypted connection emailadmin nl versleutelde verbinding +encryption settings emailadmin nl encryptie instellingen +enter your default mail domain (from: user@domain) emailadmin nl Voer uw standaard emaildomein in (uit: gebruiker@domein) +error connecting to imap server. %s : %s. emailadmin nl Fout verbinden met de IMAP server. %s : %s +error connecting to imap server: [%s] %s. emailadmin nl Fout verbinden met de IMAP server: [%s] %s +filtered by account emailadmin nl gefilterd op Account +filtered by group emailadmin nl gefilterd op Groep +forward also to emailadmin nl Ook doorsturen naar +forward email's to emailadmin nl Emails doorsturen naar +forward only emailadmin nl Alleen doorsturen +global options emailadmin nl Algemene opties +if using ssl or tls, you must have the php openssl extension loaded. emailadmin nl Indien SSL of TSL wordt gebruikt, moet u de PHP openssl extensie opgeladen hebben +imap admin password admin nl IMAP beheerders wachtwoord +imap admin user admin nl IMAP beheerdersgebruiker +imap c-client version < 2001 emailadmin nl IMAP C-Client Versie < 2001 +imap server closed the connection. emailadmin nl IMAP server sloot de verbinding +imap server closed the connection. server responded: %s emailadmin nl IMAP Server sloot de verbinding. Server reageerde: %s +imap server hostname or ip address emailadmin nl IMAP-server hostnaam of IP-adres +imap server logintyp emailadmin nl IMAP-server logintype +imap server name emailadmin nl imap server naam +imap server port emailadmin nl IMAP-serverpoort +imap/pop3 server name emailadmin nl IMAP/POP3-servernaam +in mbyte emailadmin nl in MBytes +inactive emailadmin nl inactief +ldap basedn emailadmin nl LDAP basedn +ldap server emailadmin nl LDAP-server +ldap server accounts dn emailadmin nl LDAP server accounts DN +ldap server admin dn emailadmin nl LDAP server admin DN +ldap server admin password emailadmin nl LDAP-server admin wachtwoord +ldap server hostname or ip address emailadmin nl LDAP-serverhostnaam of IP-adres +ldap settings emailadmin nl LDAP-instellingen +leave empty for no quota emailadmin nl Laat leeg voor geen quota +mail settings admin nl Mailinstellingen +name of organisation emailadmin nl Naam van de Organisatie +no alternate email address emailadmin nl geen alternatief emailadres +no encryption emailadmin nl geen versleuteling +no forwarding email address emailadmin nl geen emailadres om naar door te sturen +no message returned. emailadmin nl Geen bericht teruggekomen. +no supported imap authentication method could be found. emailadmin nl Geen ondersteunde IMAP authenticatiemethode kon gevonden worden. +order emailadmin nl Volgorde +organisation emailadmin nl Organisatie +plesk can't rename users --> request ignored emailadmin nl Plesk kan gebruikers niet hernoemen --> verzoek genegeerd +plesk imap server (courier) emailadmin nl Plesk IMAP Server (Courier) +plesk mail script '%1' not found !!! emailadmin nl Plesk mail script '%1' niet gevonden !!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin nl Plesk vereist dat wachtwoorden minstens 5 karakters bevatten en niet de accountnaam mogen bevatten --> wachtwoord niet gewijzigd !!! +plesk smtp-server (qmail) emailadmin nl Plesk SMTP-Server (Qmail) +pop3 server hostname or ip address emailadmin nl POP3-server hostnaam of IP-adres +pop3 server port emailadmin nl POP3-serverpoort +postfix with ldap emailadmin nl Postfix met LDAP +profile access rights emailadmin nl profiel toegangsrechten +profile is active emailadmin nl profiel is actief +profile list emailadmin nl Profiellijst +profile name emailadmin nl Profielnaam +qmaildotmode emailadmin nl qmaildotmode +qouta size in mbyte emailadmin nl quota grootte in MBytes +quota settings emailadmin nl Quota-installingen +remove emailadmin nl Verwijderen +reset filter emailadmin nl filter opnieuw instellen +select type of imap server emailadmin nl selecteer IMAP servertype +select type of imap/pop3 server emailadmin nl Selecteer IMAP/POP3-servertype +select type of smtp server emailadmin nl Selecteer SMTP-servertype +server settings emailadmin nl server instellingen +sieve server hostname or ip address emailadmin nl Sieve-serverhostnaam of IP-adres +sieve server port emailadmin nl Sieve-serverpoort +sieve settings emailadmin nl Sieve instellingen +smtp authentication emailadmin nl SMTP authenticatie +smtp options emailadmin nl SMTP opties +smtp server name emailadmin nl SMTP-servernaam +smtp settings emailadmin nl SMTP instellingen +smtp-server hostname or ip address emailadmin nl SMTP-serverhostnaam of IP-adres +smtp-server port emailadmin nl SMTP-serverpoort +standard emailadmin nl Standaard +standard imap server emailadmin nl Standaard IMAP-server +standard pop3 server emailadmin nl Standaard POP3-server +standard smtp-server emailadmin nl Standaard SMTP-server +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin nl The IMAP server blijkt geen authenticatiemethode te ondersteunen. Gelieve uw systeembeheerder te contacteren. +this php has no imap support compiled in!! emailadmin nl Deze PHP heeft geen IMAP ondersteuning verzamelt in!! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin nl Om een TLS verbinding te gebruiken, moet u een versie van PHP 5.1.0 of hoger gebruiken. +unexpected response from server to authenticate command. emailadmin nl Onverwachte reactie van de server om de opdracht te AUTHENTICEREN. +unexpected response from server to digest-md5 response. emailadmin nl Onverwachte reactie van de server op Digest-MD5 reactie. +unexpected response from server to login command. emailadmin nl Onverwachte reactie van de server op LOGIN opdracht. +unknown imap response from the server. server responded: %s emailadmin nl Onverwachte IMAP reactie van de server. Server reageerde: %s +unsupported action '%1' !!! emailadmin nl Niet-ondersteunde actie '%1' +update current email address: emailadmin nl Huidige emailadres bijwerken: +use ldap defaults emailadmin nl gebruik LDAP standaard instellingen +use predefined username and password defined below emailadmin nl Gebruik voorgekozen gebruikersnaam en wachtwoord zoals hieronder is ingesteld +use smtp auth emailadmin nl Gebruik SMTP authenticatie +use tls authentication emailadmin nl Gebruik TLS authenticatie +use tls encryption emailadmin nl Gebruik TLS-encryptie +user can edit forwarding address emailadmin nl Gebruiker kan het doorstuuradres aanpassen +username (standard) emailadmin nl gebruikersnaam (standaard) +username/password defined by admin emailadmin nl Gebruikersnaam/Wachtwoord ingesteld door beheerder +username@domainname (virtual mail manager) emailadmin nl gebruikersnaam@domeinnaam (Virtual MAIL ManaGeR) +users can define their own emailaccounts emailadmin nl Gebruikers kunnen hun eigen emailaccounts definiëren +users can define their own identities emailadmin nl gebruikers kunnen hun eigen identiteit instellen +users can define their own signatures emailadmin nl gebruikers kunnen hun eigen ondertekening instellen +vaction messages with start- and end-date require an admin account to be set! emailadmin nl Afwezigheidsmeldingen met een start- en einddatum vereisen dat een beheerders account is ingesteld! +virtual mail manager emailadmin nl Virtual MAIL ManaGeR diff --git a/emailadmin/lang/egw_no.lang b/emailadmin/lang/egw_no.lang new file mode 100644 index 0000000000..a180b7ac22 --- /dev/null +++ b/emailadmin/lang/egw_no.lang @@ -0,0 +1,68 @@ +add profile emailadmin no Legg til profil +admin dn emailadmin no Admin dn +admin password emailadmin no Admin passord +admin username emailadmin no Admin brukernavn +advanced options emailadmin no Avanserte valg +alternate email address emailadmin no Alternativ e-mailadresse +cyrus imap server emailadmin no Cyrus IMAP tjener +cyrus imap server administration emailadmin no Cyrys IMAP tjeneradministrasjon +default emailadmin no standard +deliver extern emailadmin no lever eksternt +do you really want to delete this profile emailadmin no Ønsker du virkelig Ã¥ slette denne profilen +domainname emailadmin no Domenenavn +edit email settings emailadmin no Rediger e-mail oppsett +email account active emailadmin no E-mailkonto aktiv +email address emailadmin no E-mailadresse +enable cyrus imap server administration emailadmin no Tillat Cyrus IMAP-tjener administrasjon +enable sieve emailadmin no Tillat Sieve +enter your default mail domain (from: user@domain) emailadmin no Registrer ditt standard Emaildomene (fra: bruker@domene) +forward also to emailadmin no videresend ogsÃ¥ til +forward email's to emailadmin no videresend e-mailer til +forward only emailadmin no bare videresending +imap admin password admin no IMAP Administrasjonspassord +imap admin user admin no IMAP Administrasjonsbruker +imap c-client version < 2001 emailadmin no IMAP C-klient versjon < 2001 +imap server hostname or ip address emailadmin no Tjenernavn eller IP-adresse for IMAP tjener +imap server logintyp emailadmin no IMAP Tjener pÃ¥loggingstype +imap server port emailadmin no IMAP Tjenerport +imap/pop3 server name emailadmin no IMAP/POP3 tjenernavn +in mbyte emailadmin no i MByte +ldap basedn emailadmin no LDAP basedn +ldap server emailadmin no LDAP Tjener +ldap server accounts dn emailadmin no LDAP Tjenerkonti DN +ldap server admin dn emailadmin no LDAP Tjeneradmin. DN +ldap server admin password emailadmin no LDAP Tjeneradmin. passord +ldap server hostname or ip address emailadmin no Tjenernavn eller IP-adresse for LDAP tjener +ldap settings emailadmin no LDAP Instillinger +leave empty for no quota emailadmin no La stÃ¥ tomt for ingen begrensning. +mail settings admin no E-post innstillinger +name of organisation emailadmin no Navn pÃ¥ organisasjon +no alternate email address emailadmin no ingen alternativ e-mailadresse +no forwarding email address emailadmin no ingen e-mailadresse for videresending +pop3 server hostname or ip address emailadmin no Tjenernavn eller IP-adresse for POP3 tjener +pop3 server port emailadmin no POP3 Tjenerport +postfix with ldap emailadmin no Postfix med LDAP +profile list emailadmin no Profilliste +profile name emailadmin no Profilnavn +qmaildotmode emailadmin no qmaildotmodus +qouta size in mbyte emailadmin no Grense Str. i Mbyte +quota settings emailadmin no Grenseinstillinger +remove emailadmin no fjern +select type of imap/pop3 server emailadmin no Velg type for IMAP/POP3 Tjener +select type of smtp server emailadmin no Velg type SMTP Tjener +sieve server hostname or ip address emailadmin no Tjenernavn eller IP-adresse for Sieve-tjener +sieve server port emailadmin no Sieve tjenerport +sieve settings emailadmin no Sieve innstillinger +smtp server name emailadmin no SMTP Tjenernavn +smtp-server hostname or ip address emailadmin no Tjenernavn eller IP-Adresse for SMTP-Tjener +smtp-server port emailadmin no SMTP Tjenerport +standard emailadmin no standard +standard imap server emailadmin no Standard IMAP tjener +standard pop3 server emailadmin no Standard POP3 tjener +standard smtp-server emailadmin no Standard SMTP tjener +use ldap defaults emailadmin no Bruk LDAP standaroppsett +use smtp auth emailadmin no Bruk SMTP autentisering +use tls authentication emailadmin no Bruk TLS autentisering +use tls encryption emailadmin no Bruk TLS kryptering +users can define their own emailaccounts emailadmin no Brukere kan definere egne e-post kontoer +virtual mail manager emailadmin no Virtuell Mail Manager diff --git a/emailadmin/lang/egw_pl.lang b/emailadmin/lang/egw_pl.lang new file mode 100644 index 0000000000..a1a2bcbd17 --- /dev/null +++ b/emailadmin/lang/egw_pl.lang @@ -0,0 +1,108 @@ +account '%1' not found !!! emailadmin pl Konto '%1' nie zostaÅ‚o znalezione! +add new email address: emailadmin pl Dodaj nowy adres poczty elektronicznej: +add profile emailadmin pl Dodaj profil +admin dn emailadmin pl DN (nazwa wyróżniajÄ…ca) administratora +admin password emailadmin pl HasÅ‚o administratora +admin username emailadmin pl Nazwa użytkownika konta administratora +advanced options emailadmin pl Ustawienia zaawansowane +alternate email address emailadmin pl Alternatywny adres email +any application emailadmin pl Dowolna aplikacja +any group emailadmin pl Dowolna grupa +bad login name or password. emailadmin pl ZÅ‚a nazwa użytkownika lub hasÅ‚o +bad or malformed request. server responded: %s emailadmin pl NieprawidÅ‚owe lub źle skonstruowane żądane. Serwer odpowiedziaÅ‚: %s +bad request: %s emailadmin pl NieprawidÅ‚owe żądanie: %s +can be used by application emailadmin pl Może być używane przez aplikacjÄ™ +can be used by group emailadmin pl Może byc używane przez grupÄ™ +connection dropped by imap server. emailadmin pl PoÅ‚Ä…czenie zerwane przez serwer IMAP +could not complete request. reason given: %s emailadmin pl Nie udaÅ‚o siÄ™ zrealizować żądania. Powód: %s +could not open secure connection to the imap server. %s : %s. emailadmin pl Nie udaÅ‚o siÄ™ stworzyć bezpiecznego poÅ‚Ä…czenia do serwera IMAP. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin pl CRAM-MD5 lub DIGEST-MD5 wymagajÄ…, aby pakiet Auth_SASL (Perl) byÅ‚ zainstalowany +cyrus imap server emailadmin pl Serwer IMAP Cyrus +cyrus imap server administration emailadmin pl Administracja serwerem IMAP Cyrus +default emailadmin pl domyÅ›lny +deliver extern emailadmin pl dostarczanie na zewnÄ…trz +do you really want to delete this profile emailadmin pl Czy na pewno chcesz usunąć ten profil? +domainname emailadmin pl Nazwa domeny +edit email settings emailadmin pl Edytuj ustawienia poczty elektronicznej +email account active emailadmin pl Konto poczty aktywne +email address emailadmin pl Adres poczty elektronicznej +email settings common pl Ustawienia poczty elektronicznej +emailadmin emailadmin pl Poczta Elektroniczna - Administracja +enable cyrus imap server administration emailadmin pl aktywuj administracjÄ™ serwerem IMAP Cyrus +enable sieve emailadmin pl aktywuj sito (Sieve) +encryption settings emailadmin pl ustawienia szyfrowania +enter your default mail domain (from: user@domain) emailadmin pl Wprowadź domyÅ›lnÄ… domenÄ™ pocztowÄ… (z użytkownik@domena) +error connecting to imap server. %s : %s. emailadmin pl BÅ‚Ä…d poÅ‚Ä…czenia do serwera IMAP. %s : %s +error connecting to imap server: [%s] %s. emailadmin pl BÅ‚Ä…d poÅ‚Ä…czenia do serwera IMAP. [%s] %s +forward also to emailadmin pl PrzeÅ›lij również do +forward email's to emailadmin pl PrzeÅ›lij wiadomoÅ›ci do +forward only emailadmin pl PrzeÅ›lij tylko +global options emailadmin pl Ustawienia globalne +if using ssl or tls, you must have the php openssl extension loaded. emailadmin pl Jeżeli korzystasz z SSL lub TLS, musisz zapewnić obsÅ‚ugÄ™ OpenSSL w PHP. +imap admin password admin pl HasÅ‚o administratora IMAP +imap admin user admin pl Login administratora IMAP +imap c-client version < 2001 emailadmin pl Wersja C-Client IMAP < 2001 +imap server closed the connection. emailadmin pl Serwer IMAP zakoÅ„czyÅ‚ poÅ‚Ä…czenie. +imap server closed the connection. server responded: %s emailadmin pl Serwer IMAP zakoÅ„czyÅ‚ poÅ‚Ä…czenie. Jego odpowiedź: %s +imap server hostname or ip address emailadmin pl Nazwa hosta lub IP serwera IMAP +imap server logintyp emailadmin pl Sposób logowania do serwera IMAP +imap server port emailadmin pl Port serwera IMAP +imap/pop3 server name emailadmin pl Nazwa serwera IMAP/POP3 +in mbyte emailadmin pl w megabajtach +ldap basedn emailadmin pl Bazowy DN w LDAP +ldap server emailadmin pl Serwer LDAP +ldap server accounts dn emailadmin pl DN dla kont w LDAP +ldap server admin dn emailadmin pl DN administratora w LDAP +ldap server admin password emailadmin pl HasÅ‚o administratora serwera LDAP +ldap server hostname or ip address emailadmin pl Nazwa hosta lub IP serwera LDAP +ldap settings emailadmin pl Ustawienia LDAP +leave empty for no quota emailadmin pl zostaw puste aby wyÅ‚Ä…czyć quota +mail settings admin pl Ustawienia poczty elektronicznej +name of organisation emailadmin pl Nazwa lub organizacja +no alternate email address emailadmin pl brak zapasowego adresu e-mail +no encryption emailadmin pl brak szyfrowania +no forwarding email address emailadmin pl brak adresu poczty przesyÅ‚anej +no message returned. emailadmin pl Nie otrzymano wiadomoÅ›ci. +no supported imap authentication method could be found. emailadmin pl Nie znaleziono obsÅ‚ugiwanej metody autentykacji dla IMAP +order emailadmin pl PorzÄ…dek +organisation emailadmin pl Organizacja +pop3 server hostname or ip address emailadmin pl Nazwa hosta lub IP serwera POP3 +pop3 server port emailadmin pl Port serwera POP3 +postfix with ldap emailadmin pl Postfix z LDAP +profile access rights emailadmin pl prawa dostÄ™pu do profilu +profile list emailadmin pl Lista profili +profile name emailadmin pl Nazwa Profilu +qouta size in mbyte emailadmin pl rozmiar quoty w megabajtach +quota settings emailadmin pl ustawnienia quoty +remove emailadmin pl UsuÅ„ +select type of imap/pop3 server emailadmin pl Wybierz rodzaj serwera IMAP/POP3 +select type of smtp server emailadmin pl Wybierz rodzaj serwera SMTP +server settings emailadmin pl Ustawienia serwera +smtp authentication emailadmin pl Autentykacja SMTP +smtp options emailadmin pl Opcje SMTP +smtp server name emailadmin pl Nazwa serwera SMTP +smtp settings emailadmin pl Ustawienia SMTP +smtp-server hostname or ip address emailadmin pl Nazwa hosta lub IP serwera SMTP +smtp-server port emailadmin pl Port serwera SMTP +standard emailadmin pl Standard +standard imap server emailadmin pl Standardowy serwer IMAP +standard pop3 server emailadmin pl Standardowy serwer POP3 +standard smtp-server emailadmin pl Standardowy serwer SMTP +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin pl Serwer IMAP nie obsÅ‚uguje wskazanej metody autentykacji. ProszÄ™ skontaktować siÄ™ z administratorem. +this php has no imap support compiled in!! emailadmin pl Interpreter PHP nie posiada obsÅ‚ugi IMAP! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin pl Aby skorzystać z poÅ‚Ä…czenia TLS, musisz posiadać wersjÄ™ PHP 5.1.0 lub wyższÄ…. +unexpected response from server to authenticate command. emailadmin pl Niespodziewana odpowiedź serwera na polecenie AUTHENTICATE. +unexpected response from server to digest-md5 response. emailadmin pl Niespodziewana odpowiedź serwera na zapytanie Digest-MD5 +unexpected response from server to login command. emailadmin pl Niespodziewana odpowiedź serwera na polecenie LOGIN. +unknown imap response from the server. server responded: %s emailadmin pl Nieznana odpowiedź z serwera IMAP. Serwer przesÅ‚aÅ‚: %s +unsupported action '%1' !!! emailadmin pl Operacja nieobsÅ‚ugiwana '%1'! +update current email address: emailadmin pl Uaktualnij bieżący adres pocztowy +use ldap defaults emailadmin pl Skorzystaj z domyÅ›lnych wartoÅ›ci LDAP +use smtp auth emailadmin pl Skorzystaj z autentykacji SMTP +use tls authentication emailadmin pl Skorzystaj z autentykacji TLS +use tls encryption emailadmin pl Skorzystaj z szyfrowania TLS +user can edit forwarding address emailadmin pl Użytkownik może zmieniać adres przekazywania +username (standard) emailadmin pl login (standardowo) +username@domainname (virtual mail manager) emailadmin pl login@domena (wirtualny zarzÄ…dca kont) +users can define their own emailaccounts emailadmin pl Użytkownicy mogÄ… definiować swoje wÅ‚asne konta poczty elektronicznej +virtual mail manager emailadmin pl Wirtualny Serwer Pocztowy - zarzÄ…dca diff --git a/emailadmin/lang/egw_pt-br.lang b/emailadmin/lang/egw_pt-br.lang new file mode 100644 index 0000000000..d67f16560d --- /dev/null +++ b/emailadmin/lang/egw_pt-br.lang @@ -0,0 +1,138 @@ +account '%1' not found !!! emailadmin pt-br Conta '%1' não encontrada !!! +add new email address: emailadmin pt-br Adicionar novo e-mail: +add profile emailadmin pt-br Adicionar Perfil +admin dn emailadmin pt-br dn do administrador +admin password emailadmin pt-br senha do administrador +admin username emailadmin pt-br nome de usuário do administrador +advanced options emailadmin pt-br opções avançadas +alternate email address emailadmin pt-br endereço de e-mail alternativo +any application emailadmin pt-br qualquer aplicação +any group emailadmin pt-br qualquer grupo +any user emailadmin pt-br qualquer usuário +back to admin/grouplist emailadmin pt-br Voltar para Administração/Lista de Grupos +back to admin/userlist emailadmin pt-br Voltar para Administração/Lista de Usuários +bad login name or password. emailadmin pt-br Nome de usuário ou senha inválido(s). +bad or malformed request. server responded: %s emailadmin pt-br Solicitação inválida. Resposta do servidor: %s +bad request: %s emailadmin pt-br Solicitação inválida: %s +can be used by application emailadmin pt-br pode ser usado pela aplicação +can be used by group emailadmin pt-br pode ser usado pelo grupo +can be used by user emailadmin pt-br pode ser usado pelo usuário +connection dropped by imap server. emailadmin pt-br Conexão interrompida pelo servidor IMAP. +could not complete request. reason given: %s emailadmin pt-br Não foi possível completar a solicitação. Resposta do servidor: %s +could not open secure connection to the imap server. %s : %s. emailadmin pt-br Não foi possível abrir conexão segura com o servidor IMAP. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin pt-br CRAM-MD5 ou DIGEST-MD5 necessitam que o pacote Auth_SASL esteja instalado. +cyrus imap server emailadmin pt-br Servidor Cyrus IMAP +cyrus imap server administration emailadmin pt-br Administração do Servidor Cyrus IMAP +default emailadmin pt-br padrão +deliver extern emailadmin pt-br entrega externa +do not validate certificate emailadmin pt-br não validar certificado +do you really want to delete this profile emailadmin pt-br Tem certeza que deseja remover esse perfil? +do you really want to reset the filter for the profile listing emailadmin pt-br Tem certeza que deseja reiniciar o filtro para a listagem do perfil +domainname emailadmin pt-br nome do domínio +edit email settings emailadmin pt-br editar configurações de e-mail +email account active emailadmin pt-br conta de e-mail ativa +email address emailadmin pt-br endrereço de e-mail +email settings common pt-br Configurações do E-mail +emailadmin emailadmin pt-br Administração do E-Mail +emailadmin: group assigned profile common pt-br Administração de eMail: Perfil de Grupo +emailadmin: user assigned profile common pt-br Administração de eMail: Perfil de Usuário +enable cyrus imap server administration emailadmin pt-br habilitar administração do Servidor Cyrus IMAP +enable sieve emailadmin pt-br habilitar Sieve +encrypted connection emailadmin pt-br conexão criptografada +encryption settings emailadmin pt-br configurações de criptografia +enter your default mail domain (from: user@domain) emailadmin pt-br Entre com o domínio de e-mail padrão (de: usuario@dominio) +error connecting to imap server. %s : %s. emailadmin pt-br Erro conectando ao servidor IMAP. %s : %s. +error connecting to imap server: [%s] %s. emailadmin pt-br Erro conectando ao servidor IMAP: [%s] %s. +filtered by account emailadmin pt-br filtrado por Conta +filtered by group emailadmin pt-br filtrado por Grupo +forward also to emailadmin pt-br encaminhar também para +forward email's to emailadmin pt-br encaminhar mensagens para +forward only emailadmin pt-br encaminhar somente +global options emailadmin pt-br opções globais +if using ssl or tls, you must have the php openssl extension loaded. emailadmin pt-br Se estiver usando SSL ou TLS, você deverá ter a extensão PHP 'openssl' carretada. +imap admin password admin pt-br Senha do administrador IMAP +imap admin user admin pt-br Usuário administrador do IMAP +imap c-client version < 2001 emailadmin pt-br IMAP C-Cliente Versão < 2001 +imap server closed the connection. emailadmin pt-br O servidor IMAP fechou a conexão. +imap server closed the connection. server responded: %s emailadmin pt-br O servidor IMAP fechou a conexão. Resposta do servidor: %s +imap server hostname or ip address emailadmin pt-br Nome ou IP do servidor IMAP +imap server logintyp emailadmin pt-br Tipo de login do servidor IMAP +imap server name emailadmin pt-br nome do servidor imap +imap server port emailadmin pt-br Porta do servidor IMAP +imap/pop3 server name emailadmin pt-br Nome do servidor IMAP/POP3 +in mbyte emailadmin pt-br em Mbytes +inactive emailadmin pt-br inativo +ldap basedn emailadmin pt-br DN Base do LDAP +ldap server emailadmin pt-br Servidor LDAP +ldap server accounts dn emailadmin pt-br Contas DN de servidores LDAP +ldap server admin dn emailadmin pt-br Administrador DN de servidor LDAP +ldap server admin password emailadmin pt-br Senha do administrador DN de servidor LDAP +ldap server hostname or ip address emailadmin pt-br Nome ou endereço IP do servidor LDAP +ldap settings emailadmin pt-br Configurações do LDAP +leave empty for no quota emailadmin pt-br deixe em branco para nenhuma quota +mail settings admin pt-br Configurações de E-Mail +name of organisation emailadmin pt-br Nome da organização +no alternate email address emailadmin pt-br sem conta de e-mail alternativa +no encryption emailadmin pt-br sem criptografia +no forwarding email address emailadmin pt-br sem conta de e-mail para encaminhar +no message returned. emailadmin pt-br Nenhuma mensagem retornada. +no supported imap authentication method could be found. emailadmin pt-br Nenhum método de autenticação IMAP suportado pôde ser encontrado. +order emailadmin pt-br ordem +organisation emailadmin pt-br organização +plesk can't rename users --> request ignored emailadmin pt-br Plesk não pode renomear usuários --> solicitação ignorada +plesk imap server (courier) emailadmin pt-br Servidor IMAP Plesk (Courier) +plesk mail script '%1' not found !!! emailadmin pt-br Script de e-mail Plesk '%1' não encontrado !!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin pt-br Plesk exige que senhas tenha no mínimo 5 caracteres e não contenham o nome da conta --> senha NÃO configurada!!! +plesk smtp-server (qmail) emailadmin pt-br Servidor SMTP Plesk (Qmail) +pop3 server hostname or ip address emailadmin pt-br Nome ou endereço IP do servidor POP3 +pop3 server port emailadmin pt-br Porta do servidor POP3 +postfix with ldap emailadmin pt-br Postfix com LDAP +profile access rights emailadmin pt-br direito de acesso aos perfis +profile is active emailadmin pt-br perfil está ativo +profile list emailadmin pt-br Lista de perfis +profile name emailadmin pt-br Nome do perfil +qmaildotmode emailadmin pt-br modo dos arquivos qmail (.qmail) +qouta size in mbyte emailadmin pt-br tamanho da quota em MBytes +quota settings emailadmin pt-br configurações de quota +remove emailadmin pt-br remover +reset filter emailadmin pt-br reiniciar filtro +select type of imap server emailadmin pt-br selecione o tipo de servidor IMAP +select type of imap/pop3 server emailadmin pt-br Selecione o tipo de servidor IMAP/POP3 +select type of smtp server emailadmin pt-br Selecione o tipo de servidor SMTP +server settings emailadmin pt-br configurações do servidor +sieve server hostname or ip address emailadmin pt-br Nome ou endereço IP do servidor Sieve +sieve server port emailadmin pt-br Porta do Servidor Sieve +sieve settings emailadmin pt-br Configurações Sieve +smtp authentication emailadmin pt-br autenticação smtp +smtp options emailadmin pt-br opções smtp +smtp server name emailadmin pt-br Nome do Servidor SMTP +smtp settings emailadmin pt-br configurações SMTP +smtp-server hostname or ip address emailadmin pt-br Nome ou endereço IP do servidor SMTP +smtp-server port emailadmin pt-br Porta do servidor SMTP +standard emailadmin pt-br Padrão +standard imap server emailadmin pt-br Servidor IMAP padrão +standard pop3 server emailadmin pt-br Servidor POP3 padrão +standard smtp-server emailadmin pt-br Servidor SMTP padrão +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin pt-br O servidor IMAP não parece suportar o método de autenticação selecionado. Por favor contacte o administrador do seu sistema. +this php has no imap support compiled in!! emailadmin pt-br Este PHP não tem suporte a IMAP compilado nele! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin pt-br Para usar uma conexão TLS, você deve estar rodando PHP versão 5.1.0 ou maior. +unexpected response from server to authenticate command. emailadmin pt-br Resposta inesperada do servidor para o comando AUTHENTICATE. +unexpected response from server to digest-md5 response. emailadmin pt-br Resposta inesperada do servidor para a resposta Digest-MD5. +unexpected response from server to login command. emailadmin pt-br Resposta inesperada do servidor para o comando LOGIN. +unknown imap response from the server. server responded: %s emailadmin pt-br Resposta desconhecida do servidor IMAP. Resposta do servidor: %s +unsupported action '%1' !!! emailadmin pt-br Ação não suportada: '%1' !!! +update current email address: emailadmin pt-br Atualizar e-mail atual: +use ldap defaults emailadmin pt-br usar padrões LDAP +use predefined username and password defined below emailadmin pt-br Usar usuário e senha pré-definidos abaixo +use smtp auth emailadmin pt-br usar SMTP Autenticado +use tls authentication emailadmin pt-br Usar autenticação TLS +use tls encryption emailadmin pt-br Usar encriptação TLS +user can edit forwarding address emailadmin pt-br usuário pode editar endereço de encaminhamento +username (standard) emailadmin pt-br nome do usuário (padrão) +username/password defined by admin emailadmin pt-br Nome de usuário/Senha definidos pelo administrador +username@domainname (virtual mail manager) emailadmin pt-br nomedousuario@nomedodominio (Gerenciador Virtual Mail) +users can define their own emailaccounts emailadmin pt-br Os usuários podem definir sua próprias contas de correio +users can define their own identities emailadmin pt-br usuários podem definir suas próprias identidades +users can define their own signatures emailadmin pt-br usuários podem definir suas próprias assinaturas +vaction messages with start- and end-date require an admin account to be set! emailadmin pt-br Mensagens de ausência com datas de início e término necessitam de uma conta de administrador para serem definidas! +virtual mail manager emailadmin pt-br Gerenciador Virtual Mail diff --git a/emailadmin/lang/egw_pt.lang b/emailadmin/lang/egw_pt.lang new file mode 100644 index 0000000000..c1be26b66d --- /dev/null +++ b/emailadmin/lang/egw_pt.lang @@ -0,0 +1,85 @@ +add profile emailadmin pt Adicionar perfil +admin dn emailadmin pt DN do administrador +admin password emailadmin pt Senha do administrador +admin passwort emailadmin pt Senha do administrador +admin username emailadmin pt Nome do utilizador do administrador +advanced options emailadmin pt Opções avançadas +alternate email address emailadmin pt Endereço de correio electrónico alternativo +any application emailadmin pt Qualquer aplicação +any group emailadmin pt Qualquer grupo +can be used by application emailadmin pt Pode ser utilizado pela aplicação +can be used by group emailadmin pt Pode ser utilizado pelo grupo +cyrus imap server emailadmin pt Servidor IMAP Cyrus +cyrus imap server administration emailadmin pt Administração do servidor IMAP Cyrus +default emailadmin pt Por omissão +deliver extern emailadmin pt Entrega externa +do you really want to delete this profile emailadmin pt Deseja relamente eliminar este perfil +domainname emailadmin pt Nome de domínio +edit email settings emailadmin pt Editar configurações do correio electrónico +email account active emailadmin pt Conta de correio electrónico activa +email address emailadmin pt Endereço de correio electrónico +enable cyrus imap server administration emailadmin pt Activar administração do servidor IMAP Cyrus +enable sieve emailadmin pt Activar Sieve +encryption settings emailadmin pt Definições de cifragem +enter your default mail domain (from: user@domain) emailadmin pt Insira o seu domínio de correio electrónico por omissão (de: utilizador@domínio) +forward also to emailadmin pt Reencaminhar também para +forward email's to emailadmin pt Reencaminhar mensagens para +forward only emailadmin pt Reencaminhar apenas +global options emailadmin pt Opções gerais +imap admin password admin pt Senha do administrador IMAP +imap admin user admin pt Utilizador do administrador IMAP +imap c-client version < 2001 emailadmin pt Versão C-Client IMAP < 2001 +imap server hostname or ip address emailadmin pt Nome do servidor ou endereço IP do servidor IMAP +imap server logintyp emailadmin pt Tipo de acesso do servidor IMAP +imap server port emailadmin pt Porto do servidor IMAP +imap/pop3 server name emailadmin pt Nome do servidor IMAP/POP3 +in mbyte emailadmin pt em MBytes +ldap basedn emailadmin pt Base DN LDAP +ldap server emailadmin pt Servidor LDAP +ldap server accounts dn emailadmin pt DN das contas de servidor LDAP +ldap server admin dn emailadmin pt DN do administrador de servidor LDAP +ldap server admin password emailadmin pt Senha do administrador de servidor LDAP +ldap server hostname or ip address emailadmin pt Nome do servidor ou endereço IP do servidor LDAP +ldap settings emailadmin pt Configurações do LDAP +leave empty for no quota emailadmin pt Deixar vazio para quota sem limites +mail settings admin pt Configurações do correio electrónico +name of organisation emailadmin pt Nome da empresa +no alternate email address emailadmin pt Sem endereço de correio electrónico alternativo +no forwarding email address emailadmin pt Sem endereço de correio electrónico para reencaminhamento +order emailadmin pt Ordem +organisation emailadmin pt Empresa +pop3 server hostname or ip address emailadmin pt Nome do servidor ou endereço IP do servidor POP3 +pop3 server port emailadmin pt Porto de servidor POP3 +postfix with ldap emailadmin pt Postfix com LDAP +profile access rights emailadmin pt Perfil de direitos de acesso +profile list emailadmin pt Lista de perfis +profile name emailadmin pt Nome do perfil +qmaildotmode emailadmin pt Quota do correio electrónico no modo Idot +qouta size in mbyte emailadmin pt Quota em MBytes +quota settings emailadmin pt Configurações da quota +remove emailadmin pt Remover +select type of imap/pop3 server emailadmin pt Seleccionar tipo de servidor IMAP/POP3 +select type of smtp server emailadmin pt Seleccionar tipo de servidor SMTP +server settings emailadmin pt Definições do servidor +sieve server hostname or ip address emailadmin pt Nome do servidor ou endereço IP do servidor Sieve +sieve server port emailadmin pt Porto do servidor Sieve +sieve settings emailadmin pt Configurações do SIeve +smtp authentication emailadmin pt Autenticação SMTP +smtp options emailadmin pt Opções do SMTP +smtp server name emailadmin pt Nome do servidor SMTP +smtp settings emailadmin pt Definições do SMTP +smtp-server hostname or ip address emailadmin pt Nome do servidor ou endereço IP do servidor SMTP +smtp-server port emailadmin pt Porto do servidor SMTP +standard emailadmin pt Por omissão +standard imap server emailadmin pt Servidor IMAP por omissão +standard pop3 server emailadmin pt Servidor POP3 por omissão +standard smtp-server emailadmin pt Servidor SMTP por omissão +use ldap defaults emailadmin pt Utilizar definições por omissão do LDAP +use smtp auth emailadmin pt Utilizar autenticação SMTP +use tls authentication emailadmin pt Utilizar autenticação TLS +use tls encryption emailadmin pt Utilizar cifra TLS +user can edit forwarding address emailadmin pt O utilizador pode editar endereços reencaminhados +username (standard) emailadmin pt Nome de utilizador (por omissão) +username@domainname (virtual mail manager) emailadmin pt utilizador@dominio (Gestor virtual de correio electrónico) +users can define their own emailaccounts emailadmin pt Os utilizadores podem definir as suas contas de correio electrónico +virtual mail manager emailadmin pt Gestor virtual de correio electrónico diff --git a/emailadmin/lang/egw_ru.lang b/emailadmin/lang/egw_ru.lang new file mode 100644 index 0000000000..1d1453cc2c --- /dev/null +++ b/emailadmin/lang/egw_ru.lang @@ -0,0 +1,134 @@ +account '%1' not found !!! emailadmin ru Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ '%1' не найдена !!! +add new email address: emailadmin ru Добавить новый Ð°Ð´Ñ€ÐµÑ Ñл. почты: +add profile emailadmin ru Добавить Профиль +admin dn emailadmin ru DN админиÑтратора +admin password emailadmin ru Пароль админиÑтратора +admin username emailadmin ru Ð˜Ð¼Ñ Ð²Ñ…Ð¾Ð´Ð° админиÑтратора +advanced options emailadmin ru РаÑширенные наÑтройки +alternate email address emailadmin ru Добавочный Ð°Ð´Ñ€ÐµÑ Ñл. почты +any application emailadmin ru Любое приложение +any group emailadmin ru Ð›ÑŽÐ±Ð°Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð° +any user emailadmin ru любой пользователь +back to admin/userlist emailadmin ru Ðазад к ÐдминиÑтрированию/СпиÑку пользователей +bad login name or password. emailadmin ru Ðеверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ пароль. +bad or malformed request. server responded: %s emailadmin ru Ðеверный или нераÑпознанный запроÑ. Ответ Сервера: %s +bad request: %s emailadmin ru Ðеверный запроÑ: %s +can be used by application emailadmin ru Может быть иÑпользовано приложением +can be used by group emailadmin ru Может быть иÑпользовано группой +can be used by user emailadmin ru может быть иÑпользовано пользователем +connection dropped by imap server. emailadmin ru Соединение разорвано Ñервером IMAP +could not complete request. reason given: %s emailadmin ru Ðе могу завершить запроÑ. Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ ÐŸÑ€Ð¸Ñ‡Ð¸Ð½Ð°: %s +could not open secure connection to the imap server. %s : %s. emailadmin ru Ðе могу уÑтановть защищенное Ñоединение Ñ Ñервером IMAP. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin ru CRAM-MD5 и DIGEST-MD5 требуют уÑтановленного пакета Auth_SASL. +cyrus imap server emailadmin ru IMAP Ñервер Cyrus +cyrus imap server administration emailadmin ru админиÑтрирование IMAP Ñервера Cyrus +default emailadmin ru по-умолчанию +deliver extern emailadmin ru доÑтавить внешний (Ñнаружи?) +do not validate certificate emailadmin ru не проверÑÑ‚ÑŒ Ñертификат +do you really want to delete this profile emailadmin ru Ð’Ñ‹ уверенны, что хотите удалить Ñтот Профиль +do you really want to reset the filter for the profile listing emailadmin ru Ð’Ñ‹ уверены что хотите очиÑтить фильтр Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑпиÑка Профилей +domainname emailadmin ru ИмÑДомена +edit email settings emailadmin ru Редактировать наÑтройки почты +email account active emailadmin ru Ð£Ñ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ включена +email address emailadmin ru ÐÐ´Ñ€ÐµÑ Ñл. почты +email settings common ru ÐаÑтройки почты +emailadmin emailadmin ru ÐдминПочты +enable cyrus imap server administration emailadmin ru включить админиÑтрирование IMAP Ñервера Cyrus +enable sieve emailadmin ru Включить Sieve +encrypted connection emailadmin ru зашифрованное Ñоединение +encryption settings emailadmin ru ÐаÑтройки ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ +enter your default mail domain (from: user@domain) emailadmin ru Укажите ваш почтовый домен по умолчанию (от: user@domain) +error connecting to imap server. %s : %s. emailadmin ru Ошибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ñервером IMAP. %s : %s. +error connecting to imap server: [%s] %s. emailadmin ru Ошибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ñервером IMAP: [%s] %s. +filtered by account emailadmin ru отфильтровано по Учетной запиÑи +forward also to emailadmin ru Ðаправить также в +forward email's to emailadmin ru ÐаправлÑÑ‚ÑŒ пиÑьма в +forward only emailadmin ru Только перенаправлÑÑ‚ÑŒ +global options emailadmin ru Общие наÑтройки +if using ssl or tls, you must have the php openssl extension loaded. emailadmin ru При иÑпользовании SSL или TLS, у Ð²Ð°Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть PHP Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð½Ñ‹Ð¼ раÑширением openssl +imap admin password admin ru пароль админиÑтратора IMAP +imap admin user admin ru Пользователь IMAP Ñ Ð¿Ñ€Ð°Ð²Ð°Ð¼Ð¸ админиÑтратора(?) +imap c-client version < 2001 emailadmin ru ВерÑÐ¸Ñ C-клиента IMAP < 2001 +imap server closed the connection. emailadmin ru Сервер IMAP разорвал Ñоединение. +imap server closed the connection. server responded: %s emailadmin ru Сервер IMAP разорвал Ñоединение. Сервер Ñообщил: %s +imap server hostname or ip address emailadmin ru Ð˜Ð¼Ñ Ñервера IMAP или его ip-Ð°Ð´Ñ€ÐµÑ +imap server logintyp emailadmin ru Тип входа Ñервера IMAP +imap server name emailadmin ru Ðазвание Ñервера imap +imap server port emailadmin ru порт Ñервера IMAP +imap/pop3 server name emailadmin ru название Ñервера IMAP/POP3 +in mbyte emailadmin ru в МБайтах +inactive emailadmin ru неактивно +ldap basedn emailadmin ru начальный DN LDAP +ldap server emailadmin ru Ñервер LDAP +ldap server accounts dn emailadmin ru DN учетных запиÑей Ñервера LDAP +ldap server admin dn emailadmin ru DN админиÑтратора Ñервера LDAP +ldap server admin password emailadmin ru Пароль админиÑтратора Ñервера LDAP +ldap server hostname or ip address emailadmin ru Ð˜Ð¼Ñ Ñервера LDAP или его ip-Ð°Ð´Ñ€ÐµÑ +ldap settings emailadmin ru ÐаÑтройки LDAP +leave empty for no quota emailadmin ru оÑтавте пуÑтым Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÐºÐ²Ð¾Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ +mail settings admin ru ÐаÑтройки почты +name of organisation emailadmin ru Ðазвание организации +no alternate email address emailadmin ru дополнительный Ñл. Ð°Ð´Ñ€ÐµÑ Ð½Ðµ иÑпользуетÑÑ +no encryption emailadmin ru без ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ +no forwarding email address emailadmin ru без адреÑа Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ +no message returned. emailadmin ru И никакого ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² ответ +no supported imap authentication method could be found. emailadmin ru Ðе ожет быть найден поддерживаемый метод авторизации IMAP. +order emailadmin ru УпорÑдочить +organisation emailadmin ru ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ +plesk can't rename users --> request ignored emailadmin ru Plesk не может переименовать пользователей --> Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ñ€Ð¾Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€Ð¾Ð²Ð°Ð½ +plesk imap server (courier) emailadmin ru Сервер IMAP Plesk (Courier) +plesk mail script '%1' not found !!! emailadmin ru Ðе найден Ñкрипт '%1' почты Plesk!!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin ru Plesk требует длины Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ðµ менее 5 Ñимволов не Ñодержащий имени аккаунта --> пароль ÐЕ уÑтановлен!!! +plesk smtp-server (qmail) emailadmin ru Plesk SMTP Ñервер (Qmail) +pop3 server hostname or ip address emailadmin ru Ð˜Ð¼Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° или ip-Ð°Ð´Ñ€ÐµÑ Ñервера POP3 +pop3 server port emailadmin ru Порт Ñервера POP3 +postfix with ldap emailadmin ru Postfix Ñ LDAP +profile access rights emailadmin ru права доÑтупа к профилю +profile is active emailadmin ru профиль активен +profile list emailadmin ru СпиÑок Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ +profile name emailadmin ru Ðазвание Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ +qmaildotmode emailadmin ru режим qmaildot +qouta size in mbyte emailadmin ru Размер квоты МБайт +quota settings emailadmin ru ÐаÑтройки ÐºÐ²Ð¾Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ +remove emailadmin ru Удалить +reset filter emailadmin ru очиÑтить фильтр +select type of imap server emailadmin ru выбор типа Ñервера IMAP +select type of imap/pop3 server emailadmin ru Выбор типаÑервера IMAP/POP3 +select type of smtp server emailadmin ru Выбор типа Ñервера SMTP +server settings emailadmin ru ÐаÑтройки Ñервера +sieve server hostname or ip address emailadmin ru Ð˜Ð¼Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° или IP-Ð°Ð´Ñ€ÐµÑ Ñервера Sieve +sieve server port emailadmin ru Порт Ñервера Sieve +sieve settings emailadmin ru ÐаÑтройки Sieve +smtp authentication emailadmin ru ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ SMTP +smtp options emailadmin ru Параметры SMTP +smtp server name emailadmin ru Ð˜Ð¼Ñ Ñервера SMTP +smtp settings emailadmin ru УÑтановки SMTP +smtp-server hostname or ip address emailadmin ru Ð˜Ð¼Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° или IP-Ð°Ð´Ñ€ÐµÑ Ñервера SMTP +smtp-server port emailadmin ru Порт Ñервера SMTP +standard emailadmin ru Стандартный +standard imap server emailadmin ru Стандартный IMAP Ñервер +standard pop3 server emailadmin ru Стандартный POP3 Ñервер +standard smtp-server emailadmin ru Стандартный SMTP Ñервер +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin ru Сервер IMAP не Ñообщил о поддержке выбранного метода авторизации. ПожалуйÑта ÑвÑжитеÑÑŒ Ñо Ñвоим ÑиÑтемным админиÑтратором. +this php has no imap support compiled in!! emailadmin ru Эта верÑÐ¸Ñ PHP Ñобрана без поддержки IMAP!! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin ru Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ TLS, у Ð²Ð°Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть запущен PHP 5.1.0 или выше. +unexpected response from server to authenticate command. emailadmin ru ÐепредуÑмотренный ответ Ñервера на команду AUTHENTICATE. +unexpected response from server to digest-md5 response. emailadmin ru ÐепредуÑмотренный ответ Ñервера на Ñигнал Digest-MD5. +unexpected response from server to login command. emailadmin ru ÐепредуÑмотренный ответ Ñервера на команду LOGIN. +unknown imap response from the server. server responded: %s emailadmin ru ÐеизвеÑтный IMAP-ответ от Ñервера. Сервер Ñообщил: %s +unsupported action '%1' !!! emailadmin ru Ðеподдерживаемое дейÑтвие '%1' !!! +update current email address: emailadmin ru Обновить текущий Ð°Ð´Ñ€ÐµÑ Ñл.почты: +use ldap defaults emailadmin ru ИÑпользовать наÑтройки LDAP по-умолчанию +use predefined username and password defined below emailadmin ru ИÑпользовать предопределенное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ пароль указанный ниже +use smtp auth emailadmin ru ИÑпользовать авторизацию SMTP +use tls authentication emailadmin ru ИÑпользовать авторизацию TLS +use tls encryption emailadmin ru ИÑползовать шифрование TLS +user can edit forwarding address emailadmin ru Ползователь может редактировать Ð°Ð´Ñ€ÐµÑ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ +username (standard) emailadmin ru Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (Ñтандартное) +username/password defined by admin emailadmin ru Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ/Пароль уÑтановлены админиÑтратором +username@domainname (virtual mail manager) emailadmin ru username@domainname (Менеджер Виртуальной ПОЧТЫ) +users can define their own emailaccounts emailadmin ru Пользователь может назначать Ñвои ÑобÑтвенные учетные запиÑи Ñл. почты. +users can define their own identities emailadmin ru пользователи могут уÑтанавливать Ñвои ÑобÑтвенные данные идентификации +users can define their own signatures emailadmin ru пользователи могут уÑтанавливать Ñвои ÑобÑтвенные подпиÑи +vaction messages with start- and end-date require an admin account to be set! emailadmin ru Vaction-ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ (ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± отпуÑке? ваканÑиÑÑ…? выÑвобождении? незанÑÑ‚Ñ‹Ñ… периодах? вовÑе ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ объекта Java VAction? ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð²Ð¸Ñ€Ñ‚ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ñ… дейÑтвий?) Ñ Ð´Ð°Ñ‚Ð°Ð¼Ð¸ начала и Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ñ‚Ñ€ÐµÐ±ÑƒÑŽÑ‚ уÑтановленной учетной запиÑи админиÑтратора! +virtual mail manager emailadmin ru Менеджер Виртуальной ПОЧТЫ diff --git a/emailadmin/lang/egw_sk.lang b/emailadmin/lang/egw_sk.lang new file mode 100644 index 0000000000..eb0ee538fd --- /dev/null +++ b/emailadmin/lang/egw_sk.lang @@ -0,0 +1,146 @@ +%1 entries deleted. emailadmin sk %1 položiek odstránených. +account '%1' not found !!! emailadmin sk ÚÄet '%1' sa nenaÅ¡iel !!! +active templates emailadmin sk Aktívne Å¡ablóny +add new email address: emailadmin sk PridaÅ¥ novú E-mailovú adresu: +add profile emailadmin sk PridaÅ¥ profil +admin dn emailadmin sk Správcov dn +admin password emailadmin sk Heslo správcu +admin username emailadmin sk Používateľské meno správcu +advanced options emailadmin sk PokroÄilé možnosti +alternate email address emailadmin sk Alternatívna E-mailová adresa +any application emailadmin sk Ktorákoľvek aplikácia +any group emailadmin sk Ktorákoľvek skupina +any user emailadmin sk Ktorýkoľvek používateľ +back to admin/grouplist emailadmin sk Späť na Správu/Skupiny +back to admin/userlist emailadmin sk Späť na Správu/Používateľov +bad login name or password. emailadmin sk Chybné prihlasovacie meno alebo heslo. +bad or malformed request. server responded: %s emailadmin sk Chybná požiadavka. OdpoveÄ servera: %s +bad request: %s emailadmin sk Chybná požiadavka: %s +can be used by application emailadmin sk môže byÅ¥ použité aplikáciou +can be used by group emailadmin sk môže byÅ¥ použité skupinou +can be used by user emailadmin sk môže byÅ¥ použité používateľom +connection dropped by imap server. emailadmin sk Spojenie preruÅ¡ené IMAP serverom. +could not complete request. reason given: %s emailadmin sk Nemožno dokonÄiÅ¥ požiadavku. Dôvod: %s +could not open secure connection to the imap server. %s : %s. emailadmin sk Nepodarilo sa nadviazaÅ¥ zabezpeÄené pripojenie k IMAP serveru. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin sk CRAM-MD5 alebo DIGEST-MD5 vyžaduje, aby bol nainÅ¡talovaný balík Auth_SASL. +cyrus imap server emailadmin sk Cyrus IMAP Server +cyrus imap server administration emailadmin sk Správa servera Cyrus IMAP +default emailadmin sk predvolené +deliver extern emailadmin sk doruÄiÅ¥ extern +do not validate certificate emailadmin sk neoveriÅ¥ certifikát +do you really want to delete this profile emailadmin sk Naozaj chcete odstrániÅ¥ tento Profil +do you really want to reset the filter for the profile listing emailadmin sk Naozaj chcete vynulovaÅ¥ filter pre výpis profilu? +domainname emailadmin sk názov domény +edit email settings emailadmin sk upraviÅ¥ nastavenia E-mailu +email account active emailadmin sk E-mailový úÄet je aktívny +email address emailadmin sk E-mailová adresa +email settings common sk Nastavenia E-mailu +emailadmin emailadmin sk EMailAdmin +emailadmin: group assigned profile common sk eMailAdmin: skupinovo priradený Profil +emailadmin: user assigned profile common sk eMailAdmin: používateľsky priradený Profil +enable cyrus imap server administration emailadmin sk zapnúť správu servera Cyrus IMAP +enable sieve emailadmin sk zapnúť Sieve +encrypted connection emailadmin sk Å¡ifrované spojenie +encryption settings emailadmin sk nastavenia Å¡ifrovania +enter your default mail domain (from: user@domain) emailadmin sk Zadajte vaÅ¡u predvolenú doménu (z tvaru: user@domain) +entry saved emailadmin sk Položka bola uložená +error connecting to imap server. %s : %s. emailadmin sk Chyba poÄas pripájania k IMAP serveru. %s : %s. +error connecting to imap server: [%s] %s. emailadmin sk Chyba poÄas pripájania k IMAP serveru: [%s] %s. +error deleting entry! emailadmin sk Chyba pri odstraňovaní položky! +error saving the entry!!! emailadmin sk Chyba pri ukladaní položky!!! +filtered by account emailadmin sk filtrované podľa ÚÄtu +filtered by group emailadmin sk filtrované podľa Skupiny +forward also to emailadmin sk preposlaÅ¥ taktiež (komu) +forward email's to emailadmin sk preposlaÅ¥ emaily (kam) +forward only emailadmin sk preposlaÅ¥ iba +global options emailadmin sk Globálne možnosti +if using ssl or tls, you must have the php openssl extension loaded. emailadmin sk Ak používate SSL alebo TLS, musíte maÅ¥ nahraté rozšírenie PHP openssl. +imap admin password admin sk heslo správcu IMAP +imap admin user admin sk používateľ pre správu IMAP +imap c-client version < 2001 emailadmin sk IMAP C-klient verzia < 2001 +imap server closed the connection. emailadmin sk IMAP server ukonÄil spojenie. +imap server closed the connection. server responded: %s emailadmin sk IMAP server ukonÄil spojenie. OdpoveÄ servera: %s +imap server hostname or ip address emailadmin sk názov (hostname) alebo IP adresa IMAP servera +imap server logintyp emailadmin sk typ prihlásenia IMAP servera +imap server name emailadmin sk názov IMAP servera +imap server port emailadmin sk port IMAP servera +imap/pop3 server name emailadmin sk názov IMAP/POP3 servera +in mbyte emailadmin sk v Megabajtoch +inactive emailadmin sk neaktívne +ldap basedn emailadmin sk LDAP basedn +ldap server emailadmin sk LDAP server +ldap server accounts dn emailadmin sk DN úÄtov LDAP servera +ldap server admin dn emailadmin sk DN správcu LDAP servera +ldap server admin password emailadmin sk heslo správcu LDAP servera +ldap server hostname or ip address emailadmin sk názov (hostname) alebo IP adresa LDAP servera +ldap settings emailadmin sk nastavenia LDAP +leave empty for no quota emailadmin sk ak nechcete kvóty, ponechajte prázdne +mail settings admin sk nastavenia PoÅ¡ty +name of organisation emailadmin sk Názov organizácie +no alternate email address emailadmin sk žiadna alternatívna E-mailová adresa +no encryption emailadmin sk bez Å¡ifrovania +no forwarding email address emailadmin sk žiadna emailová adresa pre preposielanie +no message returned. emailadmin sk Žiadne správy sa nevrátili. +no supported imap authentication method could be found. emailadmin sk NenaÅ¡iel som žiadnu podporovanú overovaciu metódu IMAP. +order emailadmin sk Poradie +organisation emailadmin sk Organizácia +plesk can't rename users --> request ignored emailadmin sk Plesk používatelia sa nedajú premenovaÅ¥ --> požiadavka ignorovaná +plesk imap server (courier) emailadmin sk Plesk IMAP Server (Courier) +plesk mail script '%1' not found !!! emailadmin sk Plesk mail script '%1' sa nenaÅ¡lo !!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin sk Plesk vyžaduje, aby heslá mali aspoň 5 znakov a neobsahovali názov úÄtu --> heslo NEBOLO nastavené!!! +plesk smtp-server (qmail) emailadmin sk Plesk SMTP-Server (qmail) +pop3 server hostname or ip address emailadmin sk názov (hostname) alebo IP adresa POP3 servera +pop3 server port emailadmin sk port POP3 servera +postfix with ldap emailadmin sk Postfix + LDAP +profile access rights emailadmin sk prístupové práva profilu +profile is active emailadmin sk profil je aktívny +profile list emailadmin sk Zoznam profilov +profile name emailadmin sk Názov profilu +qmaildotmode emailadmin sk qmail bodkový režim +qouta size in mbyte emailadmin sk NeľkosÅ¥ kvóty v Megabajtoch +quota settings emailadmin sk Nastavenia kvóty +remove emailadmin sk OdstrániÅ¥ +reset filter emailadmin sk vynulovaÅ¥ filter +select type of imap server emailadmin sk Vyberte typ IMAP servera +select type of imap/pop3 server emailadmin sk Vyberte typ IMAP/POP3 servera +select type of smtp server emailadmin sk Vyberte typ SMTP servera +send using this email-address emailadmin sk odoslaÅ¥ pomocou tejto e-mailovej adresy +server settings emailadmin sk Nastavenia servera +sieve server hostname or ip address emailadmin sk Názov (hostname) alebo IP Sieve servera +sieve server port emailadmin sk Nort Sieve servera +sieve settings emailadmin sk Nastavenia Sieve +smtp authentication emailadmin sk SMTP overovanie +smtp options emailadmin sk SMTP možnosti +smtp server name emailadmin sk Názov SMTP servera +smtp settings emailadmin sk SMTP nastavenia +smtp-server hostname or ip address emailadmin sk názov (hostname) alebo IP adresa SMTP servera +smtp-server port emailadmin sk port SMTP servera +standard emailadmin sk Å tandard +standard imap server emailadmin sk Å tandardný IMAP server +standard pop3 server emailadmin sk Å tandardný POP3 server +standard smtp-server emailadmin sk Å tandardný SMTP server +starts with emailadmin sk zaÄaÅ¥ s +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin sk Tento IMAP server, zdá sa, nepodporuje zvolenú overovaciu metódu. Prosím kontaktujte správcu systému. +this php has no imap support compiled in!! emailadmin sk Toto PHP nemá zakompilovanú podporu pre IMAP !! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin sk Ak chcete používaÅ¥ pripojenie TLS, musíte fungovaÅ¥ na verzii PHP 5.1.0 alebo vyÅ¡Å¡ej. +unexpected response from server to authenticate command. emailadmin sk NeoÄakávaná odpoveÄ od servera na príkaz AUTENTICATE. +unexpected response from server to digest-md5 response. emailadmin sk NeoÄakávaná odpoveÄ od servera na Digest-MD5 odpoveÄ. +unexpected response from server to login command. emailadmin sk NeoÄakávaná odpoveÄ od servera na príkaz LOGIN. +unknown imap response from the server. server responded: %s emailadmin sk Neznáma IMAP odpoveÄ od servera. Server odpovedal: %s +unsupported action '%1' !!! emailadmin sk Nepodporovaná akcia '%1' !!! +update current email address: emailadmin sk AktualizovaÅ¥ súÄasnú E-mailovú adresu: +use ldap defaults emailadmin sk PoužiÅ¥ predvolené hodnoty LDAP +use predefined username and password defined below emailadmin sk PoužiÅ¥ preddefinované používateľské meno a heslo, definované nižšie +use smtp auth emailadmin sk PoužiÅ¥ SMTP overovanie +use tls authentication emailadmin sk PoužiÅ¥ TLS overovanie +use tls encryption emailadmin sk PoužiÅ¥ TLS Å¡ifrovanie +use users email-address (as seen in useraccount) emailadmin sk použiÅ¥ emailové adresy používateľov (ako vidno v používateľskom úÄte) +user can edit forwarding address emailadmin sk Používateľ môže upraviÅ¥ adresu preposielania +username (standard) emailadmin sk používateľské meno (Å¡tandardné) +username/password defined by admin emailadmin sk Používateľské meno/heslo definované správcom +username@domainname (virtual mail manager) emailadmin sk používateľ@doména (Virtuálny Mail ManaGeR) +users can define their own emailaccounts emailadmin sk Používatelia môžu definovaÅ¥ ich vlastné E-mailové úÄty +users can define their own identities emailadmin sk Používatelia môžu definovaÅ¥ svoje vlastné identity +users can define their own signatures emailadmin sk Používatelia môžu definovaÅ¥ svoje vlastné podpisy +vaction messages with start- and end-date require an admin account to be set! emailadmin sk Správy v neprítomnosti s poÄiatoÄným a koncovým dátumom vyžadujú, aby bol nastavený úÄet správcu! +virtual mail manager emailadmin sk Virtuálny MAIL ManaGeR diff --git a/emailadmin/lang/egw_sl.lang b/emailadmin/lang/egw_sl.lang new file mode 100644 index 0000000000..7ec8a4d4e7 --- /dev/null +++ b/emailadmin/lang/egw_sl.lang @@ -0,0 +1,138 @@ +account '%1' not found !!! emailadmin sl RaÄun '%1' ni bil najden! +add new email address: emailadmin sl Dodaj nov e-naslov: +add profile emailadmin sl Dodaj profil +admin dn emailadmin sl Oskrbnikov dn +admin password emailadmin sl Oskrbnikovo geslo +admin username emailadmin sl Oskrbnikovo uporabniÅ¡ko ime +advanced options emailadmin sl Napredne izbire +alternate email address emailadmin sl Alternativen E-naslov +any application emailadmin sl Katerakoli aplikacija +any group emailadmin sl Katerakoli skupina +any user emailadmin sl Katerikoli uporabnik +back to admin/grouplist emailadmin sl Nazaj na Admin/Seznam skupin +back to admin/userlist emailadmin sl Nazaj na Admin/Seznam uporabnikov +bad login name or password. emailadmin sl NapaÄno uporabniÅ¡ko ime ali geslo. +bad or malformed request. server responded: %s emailadmin sl NapaÄna ali napaÄno oblikovana zahteva. Odgovor strežnika: %s +bad request: %s emailadmin sl NapaÄna zahteva: %s +can be used by application emailadmin sl Je lahko uporabljen iz aplikacije +can be used by group emailadmin sl Je lahko uporabljen iz skupine +can be used by user emailadmin sl Lahko uporablja uporabnik +connection dropped by imap server. emailadmin sl Strežnik IMAP je prekinil povezavo. +could not complete request. reason given: %s emailadmin sl Ne morem dokonÄati zahteve. Podan vzrok: %s +could not open secure connection to the imap server. %s : %s. emailadmin sl Ne morem odpreti varne povezave s strežnikom IMAP. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin sl CRAM-MD5 ali DIGEST-MD5 zahteva, da je nameÅ¡Äen paket Auth_SASL. +cyrus imap server emailadmin sl Cyrus IMAP strežnik +cyrus imap server administration emailadmin sl Upravljanje Cyrus IMAP strežnika +default emailadmin sl Privzeto +deliver extern emailadmin sl Zunanja dostava +do not validate certificate emailadmin sl Ne preverjaj certifikata +do you really want to delete this profile emailadmin sl Ali res želite izbrisati ta profil? +do you really want to reset the filter for the profile listing emailadmin sl Res želite ponastaviti filter za listanje profilov? +domainname emailadmin sl Ime domene +edit email settings emailadmin sl Uredi nastavitve E-poÅ¡te +email account active emailadmin sl Nabiralnik E-poÅ¡te je aktiven +email address emailadmin sl E-naslov +email settings common sl Nastavitve E-poÅ¡te +emailadmin emailadmin sl EMailAdmin +emailadmin: group assigned profile common sl eMailAdmin: profil, dodeljen skupini +emailadmin: user assigned profile common sl eMailAdmin: profil, dodeljen uprabniku +enable cyrus imap server administration emailadmin sl OmogoÄi upravljanje Cyrus IMAP strežnika +enable sieve emailadmin sl OmogoÄi Sieve +encrypted connection emailadmin sl Kodirana povezava +encryption settings emailadmin sl Nastavitve Å¡ifriranja +enter your default mail domain (from: user@domain) emailadmin sl Vnesite privzeto domeno (oblika: uporabnik@domena) +error connecting to imap server. %s : %s. emailadmin sl Napaka pri povezavi s strežnikom IMAP. %s: %s. +error connecting to imap server: [%s] %s. emailadmin sl Napaka pri povezavi s strežnikom IMAP: [%s] %s. +filtered by account emailadmin sl Filtrirano s strani raÄuna +filtered by group emailadmin sl Filtrirano s strani skupine +forward also to emailadmin sl Posreduj tudi +forward email's to emailadmin sl Posreduj sporoÄila k +forward only emailadmin sl Samo posreduj +global options emailadmin sl Globalne možnosti +if using ssl or tls, you must have the php openssl extension loaded. emailadmin sl ÄŒe uporabljate SSL ali TLS, morate imeti naloženo razÅ¡iritev PHP openssl +imap admin password admin sl Geslo oskrbnika IMAPa +imap admin user admin sl UporabniÅ¡ko ime oskrbnika IMAP-a +imap c-client version < 2001 emailadmin sl IMAP C-klient razliÄica pred 2001 +imap server closed the connection. emailadmin sl Strežnik IMAP je prekinil povezavo. +imap server closed the connection. server responded: %s emailadmin sl Strežnik IMAP je prekinil povezavo. Odgovor strežnika: %s +imap server hostname or ip address emailadmin sl Ime ali IP strežnika IMAP +imap server logintyp emailadmin sl NaÄin prijave strežnik IMAP +imap server name emailadmin sl Ime strežnika IMAP +imap server port emailadmin sl Vrata strežnika IMAP +imap/pop3 server name emailadmin sl Ime strežnika IMAP/POP3 +in mbyte emailadmin sl v MB +inactive emailadmin sl Neaktivno +ldap basedn emailadmin sl Osnovni DN LDAP +ldap server emailadmin sl Strežnik LDAP +ldap server accounts dn emailadmin sl DN raÄunov LDAP strežnika +ldap server admin dn emailadmin sl Oskrbnikov DN LDAP strežnika +ldap server admin password emailadmin sl Geslo oskrbnika LDAP strežnika +ldap server hostname or ip address emailadmin sl Ime ali IP strežnika LDAP +ldap settings emailadmin sl Nastavitve LDAP +leave empty for no quota emailadmin sl Pustite prazno za neomejeno +mail settings admin sl Nastavitve E-poÅ¡te +name of organisation emailadmin sl Ime organizacije +no alternate email address emailadmin sl Ni alternativnega E-naslova +no encryption emailadmin sl Brez Å¡ifriranja +no forwarding email address emailadmin sl Ni E-naslova za posredovanje +no message returned. emailadmin sl Ni vrnjenega sporoÄila. +no supported imap authentication method could be found. emailadmin sl Ni najdena metoda avtentikacije IMAP. +order emailadmin sl Vrstni red +organisation emailadmin sl Organizacija +plesk can't rename users --> request ignored emailadmin sl Plesk ne more preimenovati uporabnikov --> zahteva presliÅ¡ana +plesk imap server (courier) emailadmin sl Strežnik Plesk IMAP (Courier) +plesk mail script '%1' not found !!! emailadmin sl PoÅ¡tni skript Plesk '%1' ni bil najden! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin sl Plesk zahteva geslo, dolga najmanj 5 znakov in ne sme vsebovati imena raÄuna --> geslo ni bilo nastavljeno! +plesk smtp-server (qmail) emailadmin sl Strežnik Plesk IMAP (Qmail) +pop3 server hostname or ip address emailadmin sl Ime ali IP POP3 strežnika +pop3 server port emailadmin sl Vrata POP3 strežnika +postfix with ldap emailadmin sl KonÄnica pri LDAP +profile access rights emailadmin sl Pravice dostopa do profila +profile is active emailadmin sl Profil je aktiven +profile list emailadmin sl Seznam profilov +profile name emailadmin sl Ime profila +qmaildotmode emailadmin sl NaÄin za qmaildot +qouta size in mbyte emailadmin sl Kvota v MB +quota settings emailadmin sl Nastavitvev kvote +remove emailadmin sl Odstrani +reset filter emailadmin sl Ponastavi filter +select type of imap server emailadmin sl Izberite vrsto strežnika IMAP +select type of imap/pop3 server emailadmin sl Izberite tip IMAP/POP3 strežnika +select type of smtp server emailadmin sl Izberite tip SMTP strežnika +server settings emailadmin sl Nastavitve strežnika +sieve server hostname or ip address emailadmin sl IP ali naslov strežnika za sito (Sieve) +sieve server port emailadmin sl Vrata strežnika za sito (Sieve) +sieve settings emailadmin sl Nastavitve sita (Sieve) +smtp authentication emailadmin sl SMTP avtentikacija +smtp options emailadmin sl SMTP možnosti +smtp server name emailadmin sl ime SMTP strežnika +smtp settings emailadmin sl SMTP nastavitve +smtp-server hostname or ip address emailadmin sl Ime ali IP SMTP strežnika +smtp-server port emailadmin sl Vrata SMTP strežnika +standard emailadmin sl Standarden +standard imap server emailadmin sl Standardni IMAP strežnik +standard pop3 server emailadmin sl Standardni POP3 strežnik +standard smtp-server emailadmin sl Standardni SMTP strežnik +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin sl Strežnik IMAP ne podpira izbrane metode avtentikacije. Kontaktirajte sistemskega upravitelja. +this php has no imap support compiled in!! emailadmin sl Ta PHP ne vsebuje podpore za IMAP! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin sl ÄŒe želite uporabljati povezavo TLS, morate imeti nameÅ¡Äeno razliÄico PHP 5.1.0 ali viÅ¡jo. +unexpected response from server to authenticate command. emailadmin sl NepriÄakovan odgovor strežnika na ukaz AUTHENTICATE. +unexpected response from server to digest-md5 response. emailadmin sl NepriÄakovan odgovor strežnika na odgovor Digest-MD5. +unexpected response from server to login command. emailadmin sl NepriÄakovan odgovor strežnika na ukaz LOGIN. +unknown imap response from the server. server responded: %s emailadmin sl Neznan odgovor IMAP s strani strežnika. Odgovor strežnika: %s +unsupported action '%1' !!! emailadmin sl Nepodprto dejanje '%1'! +update current email address: emailadmin sl Posodobi trenutni e-naslov: +use ldap defaults emailadmin sl Uporabi privzeto za LDAP +use predefined username and password defined below emailadmin sl Uporabi spodnje, vnaprej doloÄeno uporabniÅ¡ko ime in geslo +use smtp auth emailadmin sl Uporabi SMTP avtentikacijo +use tls authentication emailadmin sl Uporabi TLS avtentikacijo +use tls encryption emailadmin sl Uporabi TLS enkripcijo +user can edit forwarding address emailadmin sl Uporabnik lahko doloÄa posredovalni naslov +username (standard) emailadmin sl Uporabnik (standardno) +username/password defined by admin emailadmin sl UporabniÅ¡ko ime/geslo dodeljeno s strani administratorja +username@domainname (virtual mail manager) emailadmin sl uporabnik@domena (Virtual MAIL ManaGeR) +users can define their own emailaccounts emailadmin sl Uporabniki lahko doloÄajo lastne E-poÅ¡tne predale +users can define their own identities emailadmin sl Uporabniki lahko doloÄijo lastne identitete +users can define their own signatures emailadmin sl Uporabniki lahko doloÄijo lastne podpise +vaction messages with start- and end-date require an admin account to be set! emailadmin sl Nastavitev sporoÄila o odsotnosti z zaÄetnim in konÄnim datumom zahteva nastavljen administratorski raÄun! +virtual mail manager emailadmin sl Virtualni upravljalec E-poÅ¡te diff --git a/emailadmin/lang/egw_sv.lang b/emailadmin/lang/egw_sv.lang new file mode 100644 index 0000000000..8dbc762450 --- /dev/null +++ b/emailadmin/lang/egw_sv.lang @@ -0,0 +1,68 @@ +add profile emailadmin sv Skapa profil +admin dn emailadmin sv Admin dn +admin password emailadmin sv Admin lösenord +admin username emailadmin sv Admin användare +advanced options emailadmin sv Avanserade alternativ +alternate email address emailadmin sv Alternerande e-post adress +cyrus imap server emailadmin sv Cyrus IMAP Server +cyrus imap server administration emailadmin sv Cyrus IMAP server administration +default emailadmin sv Standard +deliver extern emailadmin sv Leverera extern +do you really want to delete this profile emailadmin sv Vill du verkligen radera profilen? +domainname emailadmin sv Domän namn +edit email settings emailadmin sv Redigera e-post alternativ +email account active emailadmin sv Aktivt e-post konto +email address emailadmin sv E-post adress +enable cyrus imap server administration emailadmin sv Aktivera Cyrus IMAP server administration +enable sieve emailadmin sv Aktivera Sieve +enter your default mail domain (from: user@domain) emailadmin sv Standard e-post domän (frÃ¥n: user@domain) +forward also to emailadmin sv Vidarebefodra även till +forward email's to emailadmin sv Vidarebefodra e-post till +forward only emailadmin sv Vidarebefodra endast +imap admin password admin sv IMAP admin lösenord +imap admin user admin sv IMAP admin användare +imap c-client version < 2001 emailadmin sv IMAP C-Client version < 2001 +imap server hostname or ip address emailadmin sv IMAP server hostnamn eller IP adress +imap server logintyp emailadmin sv IMAP server inloggnings typ +imap server port emailadmin sv IMAP server port +imap/pop3 server name emailadmin sv IMAP/POP3 server namn +in mbyte emailadmin sv i MByte +ldap basedn emailadmin sv LDAP basedn +ldap server emailadmin sv LDAP server +ldap server accounts dn emailadmin sv LDAP server konton DN +ldap server admin dn emailadmin sv LDAP server admin DN +ldap server admin password emailadmin sv LDAP server admin lösenord +ldap server hostname or ip address emailadmin sv LDAP server hostnamn eller IP adress +ldap settings emailadmin sv LDAP alternativ +leave empty for no quota emailadmin sv Lämna tomt för ingen kvot +mail settings admin sv E-post alternativ +name of organisation emailadmin sv Organisations namn +no alternate email address emailadmin sv Ingen alternerande e-post adress +no forwarding email address emailadmin sv Ingen e-post vidarebefodrings adress +pop3 server hostname or ip address emailadmin sv POP3 server hostnamn eller IP adress +pop3 server port emailadmin sv POP3 server port +postfix with ldap emailadmin sv Postfix med LDAP +profile list emailadmin sv Profil lista +profile name emailadmin sv Profil namn +qmaildotmode emailadmin sv qmaildotmode +qouta size in mbyte emailadmin sv Kvot storlek i Mb +quota settings emailadmin sv Kvot alternativ +remove emailadmin sv Radera +select type of imap/pop3 server emailadmin sv Välj typ av IMAP/POP3 server +select type of smtp server emailadmin sv Välj typ av SMTP Server +sieve server hostname or ip address emailadmin sv Sieve server hostnamn eller IP adress +sieve server port emailadmin sv Sieve server port +sieve settings emailadmin sv Sieve alternativ +smtp server name emailadmin sv SMTP server namn +smtp-server hostname or ip address emailadmin sv SMTP server hostnamn eller IP adress +smtp-server port emailadmin sv SMTP server port +standard emailadmin sv Standard +standard imap server emailadmin sv Standard IMAP server +standard pop3 server emailadmin sv Standard POP3 server +standard smtp-server emailadmin sv Standard SMTP server +use ldap defaults emailadmin sv använd LDAP standarder +use smtp auth emailadmin sv Använd SMTP autentisering +use tls authentication emailadmin sv Använd TLS autentisering +use tls encryption emailadmin sv Använd TLS kryptering +users can define their own emailaccounts emailadmin sv Användare kan definiera egna epost konton? +virtual mail manager emailadmin sv Virtuell E-post administration diff --git a/emailadmin/lang/egw_zh-tw.lang b/emailadmin/lang/egw_zh-tw.lang new file mode 100644 index 0000000000..032e81c7ec --- /dev/null +++ b/emailadmin/lang/egw_zh-tw.lang @@ -0,0 +1,121 @@ +account '%1' not found !!! emailadmin zh-tw 找ä¸åˆ°å¸³è™Ÿ '%1'ï¼ +add new email address: emailadmin zh-tw 新增信箱: +add profile emailadmin zh-tw 新增資料 +admin dn emailadmin zh-tw ç®¡ç† dn +admin password emailadmin zh-tw 管ç†å¯†ç¢¼ +admin username emailadmin zh-tw 管ç†å¸³è™Ÿ +advanced options emailadmin zh-tw 進階é¸é … +alternate email address emailadmin zh-tw 替代郵件ä½å€ +any application emailadmin zh-tw 任何模組 +any group emailadmin zh-tw 任何群組 +bad login name or password. emailadmin zh-tw 帳號或密碼有誤。 +bad or malformed request. server responded: %s emailadmin zh-tw 錯誤的請求,伺æœå™¨å›žæ‡‰ï¼š %s +bad request: %s emailadmin zh-tw 錯誤的請求: %s +can be used by application emailadmin zh-tw å¯ä»¥å–用資料的模組 +can be used by group emailadmin zh-tw å¯ä»¥å–用資料的群組 +connection dropped by imap server. emailadmin zh-tw 連線被 IMAP 伺æœå™¨ä¸­æ–·äº† +could not complete request. reason given: %s emailadmin zh-tw 無法完æˆè«‹æ±‚,ç†ç”±ï¼š %s +could not open secure connection to the imap server. %s : %s. emailadmin zh-tw 無法開啟安全連線到 IMAP 伺æœå™¨ã€‚%s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin zh-tw CRAM-MD5 或 DIGEST-MD5 需è¦å…ˆå®‰è£ Auth_SASL æ‰èƒ½ä½¿ç”¨ã€‚ +cyrus imap server emailadmin zh-tw Cyrus IMAP伺æœå™¨ +cyrus imap server administration emailadmin zh-tw Cyrus IMAP伺æœå™¨ç®¡ç† +default emailadmin zh-tw é è¨­ +deliver extern emailadmin zh-tw 傳é€åˆ°å¤–部 +do not validate certificate emailadmin zh-tw 沒有å¯ç”¨çš„執照 +do you really want to delete this profile emailadmin zh-tw 您確定è¦åˆªé™¤é€™å€‹è³‡æ–™ +domainname emailadmin zh-tw 網域å稱 +edit email settings emailadmin zh-tw 編輯郵件設定 +email account active emailadmin zh-tw 郵件帳號啟用 +email address emailadmin zh-tw 郵件ä½å€ +email settings common zh-tw 郵件設定 +emailadmin emailadmin zh-tw éƒµä»¶ç®¡ç† +enable cyrus imap server administration emailadmin zh-tw 啟用Cyrus IMAP伺æœå™¨ç®¡ç† +enable sieve emailadmin zh-tw 啟用Sieve +encrypted connection emailadmin zh-tw 加密連線 +encryption settings emailadmin zh-tw 加密設定 +enter your default mail domain (from: user@domain) emailadmin zh-tw 輸入您的é è¨­éƒµä»¶ç¶²åŸŸ(å°è€é¼ å¾Œé¢æ‰€æœ‰å­—:帳號@網域) +error connecting to imap server. %s : %s. emailadmin zh-tw 連線到 IMAP 伺æœå™¨æ™‚發生錯誤。 %s : %s +error connecting to imap server: [%s] %s. emailadmin zh-tw 連線到 IMAP 伺æœå™¨æ™‚發生錯誤。 [%s] %s +forward also to emailadmin zh-tw åŒæ™‚轉寄到 +forward email's to emailadmin zh-tw 轉寄信件到 +forward only emailadmin zh-tw 轉寄 +global options emailadmin zh-tw 全域é¸é … +if using ssl or tls, you must have the php openssl extension loaded. emailadmin zh-tw 如果使用 SSL 或 TLS,您必須先載入 PHP openssl 外掛。 +imap admin password admin zh-tw IMAP管ç†è€…密碼 +imap admin user admin zh-tw IMAP管ç†è€…帳號 +imap c-client version < 2001 emailadmin zh-tw IMAP C-終端的版本å°æ–¼2001 +imap server closed the connection. emailadmin zh-tw IMAP伺æœå™¨é—œé–‰é€£ç·š +imap server closed the connection. server responded: %s emailadmin zh-tw IMAP伺æœå™¨é—œé–‰é€£ç·šï¼Œä¼ºæœå™¨å›žæ‡‰ï¼š %s +imap server hostname or ip address emailadmin zh-tw IMAP伺æœå™¨çš„主機å稱或是IPä½å€ +imap server logintyp emailadmin zh-tw IMAP伺æœå™¨ç™»å…¥é¡žåž‹ +imap server name emailadmin zh-tw IMAP伺æœå™¨å稱 +imap server port emailadmin zh-tw IMAP伺æœå™¨é€£æŽ¥åŸ  +imap/pop3 server name emailadmin zh-tw IMAP/POP3伺æœå™¨å稱 +in mbyte emailadmin zh-tw 以MB顯示 +ldap basedn emailadmin zh-tw LDAP basedn +ldap server emailadmin zh-tw LDAP 伺æœå™¨ +ldap server accounts dn emailadmin zh-tw LDAP 伺æœå™¨å¸³è™Ÿ DN +ldap server admin dn emailadmin zh-tw LDAP 伺æœå™¨ç®¡ç†è€… DN +ldap server admin password emailadmin zh-tw LDAP 伺æœå™¨ç®¡ç†è€…密碼 +ldap server hostname or ip address emailadmin zh-tw LDAP 伺æœå™¨ä¸»æ©Ÿå稱或是IPä½å€ +ldap settings emailadmin zh-tw LDAP 設定 +leave empty for no quota emailadmin zh-tw ä¸å¡«å…¥ä»»ä½•è³‡æ–™è¡¨ç¤ºç„¡é™åˆ¶ +mail settings admin zh-tw 郵件設定 +name of organisation emailadmin zh-tw 組織å稱 +no alternate email address emailadmin zh-tw 沒有å¯æ›¿æ›çš„郵件ä½å€ +no encryption emailadmin zh-tw 沒有加密 +no forwarding email address emailadmin zh-tw 沒有轉寄郵件ä½å€ +no message returned. emailadmin zh-tw 沒有訊æ¯å›žæ‡‰ã€‚ +no supported imap authentication method could be found. emailadmin zh-tw 找ä¸åˆ°å¯ä»¥æ”¯æ´çš„ IMAP èªè­‰æ–¹å¼ã€‚ +order emailadmin zh-tw é †åº +organisation emailadmin zh-tw 組織 +plesk can't rename users --> request ignored emailadmin zh-tw Plesk 無法修改使用者å稱 --> 忽略 +plesk imap server (courier) emailadmin zh-tw Plesk IMAP 伺æœå™¨(Courier) +plesk mail script '%1' not found !!! emailadmin zh-tw 找ä¸åˆ° Plesk 郵件指令 '%1' ï¼ +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin zh-tw Plesk è¦æ±‚密碼至少必須有 5 個字元而且ä¸èƒ½åŒ…å«å¸³è™Ÿå稱 --> å¯†ç¢¼æ²’æœ‰è¨­å®šï¼ +plesk smtp-server (qmail) emailadmin zh-tw Plesk SMTP伺æœå™¨ (Qmail) +pop3 server hostname or ip address emailadmin zh-tw POP3伺æœå™¨ä¸»æ©Ÿå稱或是IPä½å€ +pop3 server port emailadmin zh-tw POP3伺æœå™¨é€£æŽ¥åŸ  +postfix with ldap emailadmin zh-tw 使用LDAP與 Postfix +profile access rights emailadmin zh-tw å­˜å–è³‡æ–™æ¬Šé™ +profile list emailadmin zh-tw 資料清單 +profile name emailadmin zh-tw 資料å稱 +qmaildotmode emailadmin zh-tw qmaildotmode +qouta size in mbyte emailadmin zh-tw é…é¡(MB) +quota settings emailadmin zh-tw é…é¡è¨­å®š +remove emailadmin zh-tw 移除 +select type of imap server emailadmin zh-tw é¸æ“‡IMAP伺æœå™¨é¡žåž‹ +select type of imap/pop3 server emailadmin zh-tw é¸æ“‡IMAP/POP3伺æœå™¨çš„æ ¼å¼ +select type of smtp server emailadmin zh-tw é¸æ“‡SMTP伺æœå™¨çš„æ ¼å¼ +server settings emailadmin zh-tw 伺æœå™¨è¨­å®š +sieve server hostname or ip address emailadmin zh-tw Sieve伺æœå™¨ä¸»æ©Ÿå稱或是IPä½å€ +sieve server port emailadmin zh-tw Sieve伺æœå™¨é€£æŽ¥åŸ  +sieve settings emailadmin zh-tw Sieve設定 +smtp authentication emailadmin zh-tw SMTP èªè­‰ +smtp options emailadmin zh-tw SMTP é¸é … +smtp server name emailadmin zh-tw SMTP伺æœå™¨å稱 +smtp settings emailadmin zh-tw SMTP 設定 +smtp-server hostname or ip address emailadmin zh-tw SMTP伺æœå™¨ä¸»æ©Ÿå稱或是IPä½å€ +smtp-server port emailadmin zh-tw SMTP伺æœå™¨é€£æŽ¥åŸ  +standard emailadmin zh-tw 標準 +standard imap server emailadmin zh-tw 標準IMAP伺æœå™¨ +standard pop3 server emailadmin zh-tw 標準POP3伺æœå™¨ +standard smtp-server emailadmin zh-tw 標準SMTP伺æœå™¨ +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin zh-tw IMAP 伺æœå™¨ä¸æ”¯æ´æŒ‡å®šçš„èªè­‰æ–¹å¼ï¼Œè«‹è¯çµ¡æ‚¨çš„系統管ç†å“¡ã€‚ +this php has no imap support compiled in!! emailadmin zh-tw 您的PHP並未編譯為支æ´IMAP的狀態 +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin zh-tw è¦ä½¿ç”¨ TLS 連線,您必須執行在 PHP 5.1.0 或是更新版本。 +unexpected response from server to authenticate command. emailadmin zh-tw AUTHENTICATE 指令讓伺æœå™¨å‚³å›žä¸å¦‚é æœŸçš„回應。 +unexpected response from server to digest-md5 response. emailadmin zh-tw 伺æœå™¨å‚³å›žä¸å¦‚é æœŸçš„ Digest-MD5 回應。 +unexpected response from server to login command. emailadmin zh-tw 伺æœå™¨å‚³å›žä¸å¦‚é æœŸçš„ LOGIN 指令。 +unknown imap response from the server. server responded: %s emailadmin zh-tw ä¸çŸ¥åçš„ IMAP 伺æœå™¨å›žæ‡‰ï¼Œå›žæ‡‰å…§å®¹ï¼š %s +unsupported action '%1' !!! emailadmin zh-tw ä¸æ”¯æ´ '%1' 這個æ“ä½œï¼ +update current email address: emailadmin zh-tw æ›´æ–°ç›®å‰ä¿¡ç®±ï¼š +use ldap defaults emailadmin zh-tw 使用LDAPé è¨­å€¼ +use smtp auth emailadmin zh-tw 使用SMTPèªè­‰ +use tls authentication emailadmin zh-tw 使用TLSèªè­‰ +use tls encryption emailadmin zh-tw 使用TLS加密 +user can edit forwarding address emailadmin zh-tw 使用者å¯ä»¥ç·¨è¼¯è‡ªå‹•è½‰å¯„ä¿¡ç®± +username (standard) emailadmin zh-tw 帳號(標準) +username@domainname (virtual mail manager) emailadmin zh-tw 帳號@網域(虛擬郵件管ç†ï¼‰ +users can define their own emailaccounts emailadmin zh-tw 使用者å¯ä»¥è‡ªè¡Œå®šç¾©éƒµä»¶å¸³è™Ÿ +virtual mail manager emailadmin zh-tw 虛擬郵件管ç†è€… diff --git a/emailadmin/lang/egw_zh.lang b/emailadmin/lang/egw_zh.lang new file mode 100644 index 0000000000..bf5190394c --- /dev/null +++ b/emailadmin/lang/egw_zh.lang @@ -0,0 +1,123 @@ +account '%1' not found !!! emailadmin zh å¸æˆ· '%1' 未å‘çŽ°ï¼ +add new email address: emailadmin zh 添加新邮箱地å€ï¼š +add profile emailadmin zh 添加 profile +admin dn emailadmin zh ç®¡ç† DN +admin password emailadmin zh 管ç†å¯†ç  +admin username emailadmin zh 管ç†å¸æˆ· +advanced options emailadmin zh 高级选项 +alternate email address emailadmin zh å€™é€‰é‚®ç®±åœ°å€ +any application emailadmin zh ä»»ä½•ç”¨ç”¨ç¨‹åº +any group emailadmin zh 任何组 +bad login name or password. emailadmin zh 错误登录å和密ç ã€‚ +bad or malformed request. server responded: %s emailadmin zh ä¸æ­£ç¡®çš„请求。æœåŠ¡å™¨æˆ–应:%s +bad request: %s emailadmin zh 错误请求:%s +can be used by application emailadmin zh å¯ç”¨äºŽåº”ç”¨ç¨‹åº +can be used by group emailadmin zh å¯ç”¨äºŽç¾¤ç»„ +connection dropped by imap server. emailadmin zh 连接被 IMAP æœåŠ¡å™¨ä¸­æ–­ã€‚ +could not complete request. reason given: %s emailadmin zh 无法完æˆè¯·æ±‚。原因是:%s +could not open secure connection to the imap server. %s : %s. emailadmin zh 无法打开到 IMAP æœåŠ¡å™¨çš„安全连接。%s:%s。 +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin zh CRAM-MD5 或 DIGEST-MD5 需è¦å®‰è£… auth_sasl 包。 +cyrus imap server emailadmin zh Cyrus IMAP æœåŠ¡å™¨ +cyrus imap server administration emailadmin zh Cyrus IMAP æœåŠ¡å™¨ç®¡ç† +default emailadmin zh 默认 +deliver extern emailadmin zh ä¼ é€å¤–部 +do not validate certificate emailadmin zh ä¸ç¡®è®¤è¯ä¹¦ +do you really want to delete this profile emailadmin zh 您确定è¦åˆ é™¤è¿™ä¸ª profile 文件 +domainname emailadmin zh 域å +edit email settings emailadmin zh 编辑邮箱设置 +email account active emailadmin zh 邮箱å¸æˆ·æ¿€æ´» +email address emailadmin zh é‚®ç®±åœ°å€ +email settings common zh 邮箱设置 +emailadmin emailadmin zh é‚®ç®±ç®¡ç† +enable cyrus imap server administration emailadmin zh å¯ç”¨ Cyrus IMAP æœåŠ¡å™¨ç®¡ç† +enable sieve emailadmin zh å¯ç”¨è¿‡æ»¤ +encrypted connection emailadmin zh 加密连接 +encryption settings emailadmin zh 加密设置 +enter your default mail domain (from: user@domain) emailadmin zh 输入您的默认邮箱域 (比如:user@domain,å–@之åŽçš„所有è¯æˆ–å­—æ¯) +error connecting to imap server. %s : %s. emailadmin zh 连接到 IMAP æœåŠ¡å™¨é”™è¯¯ã€‚%s : %s。 +error connecting to imap server: [%s] %s. emailadmin zh 连接到 IMAP æœåŠ¡å™¨é”™è¯¯ï¼š[%s] %s。 +forward also to emailadmin zh åŒæ—¶è½¬å‘到 +forward email's to emailadmin zh 转å‘邮件到 +forward only emailadmin zh è½¬å‘ +global options emailadmin zh 全局选项 +if using ssl or tls, you must have the php openssl extension loaded. emailadmin zh 如果使用 SSL 或 TLS,您必须加载 PHP openssl 扩展。 +imap admin password admin zh IMAP 管ç†è€…å¯†ç  +imap admin user admin zh IMAP 管ç†è€…å¸æˆ· +imap c-client version < 2001 emailadmin zh IMAP C-Clien ç‰ˆæœ¬å° < 2001 +imap server closed the connection. emailadmin zh IMAP æœåŠ¡å™¨å…³é—­è¿žæŽ¥ã€‚ +imap server closed the connection. server responded: %s emailadmin zh IMAP æœåŠ¡å™¨å…³é—­è¿žæŽ¥ã€‚æœåŠ¡å™¨å›žåº”:%s +imap server hostname or ip address emailadmin zh IMAP æœåŠ¡å™¨çš„主机å或 IP åœ°å€ +imap server logintyp emailadmin zh IMAP æœåŠ¡å™¨ç™»å½•ç±»åž‹ +imap server name emailadmin zh IMAP æœåŠ¡å™¨å +imap server port emailadmin zh IMAP æœåŠ¡å™¨ç«¯å£å· +imap/pop3 server name emailadmin zh IMAP / POP3 æœåŠ¡å™¨å +in mbyte emailadmin zh 以 MB 表示 +ldap basedn emailadmin zh LDAP basedn +ldap server emailadmin zh LDAP æœåŠ¡å™¨ +ldap server accounts dn emailadmin zh LDAP æœåŠ¡å™¨å¸æˆ· DN +ldap server admin dn emailadmin zh LDAP æœåŠ¡å™¨ç®¡ç†å‘˜ DN +ldap server admin password emailadmin zh LDAP æœåŠ¡å™¨ç®¡ç®¡ç†å‘˜å¯†ç  +ldap server hostname or ip address emailadmin zh LDAP æœåŠ¡å™¨ä¸»æœºå或 IP åœ°å€ +ldap settings emailadmin zh LDAP 设置 +leave empty for no quota emailadmin zh 留空表示无é™é¢ +mail settings admin zh 邮箱设置 +name of organisation emailadmin zh 组织å称 +no alternate email address emailadmin zh æ— å¤‡ç”¨é‚®ç®±åœ°å€ +no encryption emailadmin zh 未加密 +no forwarding email address emailadmin zh 没有转å‘é‚®ä»¶åœ°å€ +no message returned. emailadmin zh 无返回消æ¯ã€‚ +no supported imap authentication method could be found. emailadmin zh æ— æ”¯æŒ IMAP 认è¯çš„方法å¯ä»¥æ‰¾åˆ°ã€‚ +order emailadmin zh æŽ’åº +organisation emailadmin zh 组织 +plesk can't rename users --> request ignored emailadmin zh Plesk ä¸èƒ½é‡å‘½å用户 --> 请求忽略 +plesk imap server (courier) emailadmin zh Plesk IMAP æœåŠ¡å™¨ (Courier) +plesk mail script '%1' not found !!! emailadmin zh Plesk 邮件脚本 '%1' æœªæ‰¾åˆ°ï¼ +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin zh Plesk 需è¦è‡³å°‘5个字符密ç å¹¶ä¸”ä¸åŒ…å«å¸æˆ·å --> 密ç æœªè®¾ç½®ï¼ +plesk smtp-server (qmail) emailadmin zh Plesk SMTP-Server (Qmail) +pop3 server hostname or ip address emailadmin zh POP3 æœåŠ¡å™¨ä¸»æœºå或 IP åœ°å€ +pop3 server port emailadmin zh POP3 æœåŠ¡å™¨ç«¯å£å· +postfix with ldap emailadmin zh LDAP 用于 Postfix +profile access rights emailadmin zh profile 访问æƒé™ +profile list emailadmin zh profile 列表 +profile name emailadmin zh profile å +qmaildotmode emailadmin zh qmaildotmode +qouta size in mbyte emailadmin zh é…é¢å¤§å°åœ¨ (MByte) +quota settings emailadmin zh é…é¢è®¾ç½® +remove emailadmin zh 移除 +select type of imap server emailadmin zh 选择 IMAP æœåŠ¡å™¨ç±»åž‹ +select type of imap/pop3 server emailadmin zh 选择 IMAP / POP3 æœåŠ¡å™¨ç±»åž‹ +select type of smtp server emailadmin zh 选择 SMAP æœåŠ¡å™¨ç±»åž‹ +server settings emailadmin zh æœåŠ¡å™¨è®¾ç½® +sieve server hostname or ip address emailadmin zh Sieve æœåŠ¡å™¨ä¸»æœºå或 IP åœ°å€ +sieve server port emailadmin zh Sieve æœåŠ¡å™¨ç«¯å£å· +sieve settings emailadmin zh Sieve 设置 +smtp authentication emailadmin zh SMTP è®¤è¯ +smtp options emailadmin zh SMTP 选项 +smtp server name emailadmin zh SMTP æœåŠ¡å™¨å +smtp settings emailadmin zh SMTP 设置 +smtp-server hostname or ip address emailadmin zh SMTP æœåŠ¡å™¨ä¸»æœºå或 IP åœ°å€ +smtp-server port emailadmin zh SMTP æœåŠ¡å™¨ç«¯å£å· +standard emailadmin zh 标准 +standard imap server emailadmin zh 标准 IMAP æœåŠ¡å™¨ +standard pop3 server emailadmin zh 标准 POP3 æœåŠ¡å™¨ +standard smtp-server emailadmin zh 标准 SMTP æœåŠ¡å™¨ +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin zh IMAP æœåŠ¡å™¨ä¼¼ä¹Žä¸æ”¯æŒæ‰€é€‰æ‹©çš„认è¯æ–¹æ³•ã€‚请è”系系统管ç†å‘˜ã€‚ +this php has no imap support compiled in!! emailadmin zh PHP 没有 IMAP 支æŒçš„ç¼–è¯‘ï¼ +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin zh 未使用一个 TLS 连接,您必须è¿è¡Œ PHP 5.1.0 或更高版本。 +unexpected response from server to authenticate command. emailadmin zh æœåŠ¡å™¨ä¸º AUTHENTICATE 指令返回ä¸å½“以外回应。 +unexpected response from server to digest-md5 response. emailadmin zh æœåŠ¡å™¨ä¸º Digest-MD5 返回æ„外的ä¸å½“的回应。 +unexpected response from server to login command. emailadmin zh æœåŠ¡å™¨ä¸º LOGIN 指令返回æ„外的ä¸å½“回应。 +unknown imap response from the server. server responded: %s emailadmin zh INAP æœåŠ¡å™¨è¿”回未知回应。æœåŠ¡å™¨å›žåº”:%s +unsupported action '%1' !!! emailadmin zh ä¸æ”¯æŒ '%1' çš„æ“ä½œï¼ +update current email address: emailadmin zh 更新当å‰é‚®ä»¶åœ°å€ï¼š +use ldap defaults emailadmin zh 使用 LDAP 默认值 +use smtp auth emailadmin zh 使用 SMTP è®¤è¯ +use tls authentication emailadmin zh 使用TLS è®¤è¯ +use tls encryption emailadmin zh 使用TLS 加密 +user can edit forwarding address emailadmin zh 用户å¯ä»¥ç¼–辑转å‘åœ°å€ +username (standard) emailadmin zh 用户å(标准) +username@domainname (virtual mail manager) emailadmin zh 用户å@域 (虚拟邮箱管ç†) +users can define their own emailaccounts emailadmin zh 用户å¯ä»¥è‡ªå®šä¹‰é‚®ç®±è´¦æˆ· +users can define their own signatures emailadmin zh 用户å¯ä»¥å®šä¹‰ä»–们自己的签å +vaction messages with start- and end-date require an admin account to be set! emailadmin zh 需è¦ä¸€ä¸ª admin å¸æˆ·æ¥è®¾ç½® Vaction 消æ¯ä¸Žå¼€å§‹å’Œç»“æŸæ—¥æœŸ! +virtual mail manager emailadmin zh è™šæ‹Ÿé‚®ç®±ç®¡ç† diff --git a/emailadmin/setup/etemplates.inc.php b/emailadmin/setup/etemplates.inc.php new file mode 100644 index 0000000000..cfb0c8255b --- /dev/null +++ b/emailadmin/setup/etemplates.inc.php @@ -0,0 +1,32 @@ + 'emailadmin.edit','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:2:{s:2:"h1";s:6:",!@msg";s:1:"A";s:4:"100%";}i:1;a:1:{s:1:"A";a:4:{s:4:"type";s:5:"label";s:5:"align";s:6:"center";s:4:"name";s:3:"msg";s:4:"span";s:10:",redItalic";}}i:2;a:1:{s:1:"A";a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:3:{s:1:"C";s:3:"50%";s:1:"B";s:3:"40%";s:1:"D";s:2:"5%";}i:1;a:4:{s:1:"A";a:4:{s:4:"type";s:4:"text";s:5:"label";s:2:"ID";s:4:"name";s:13:"ea_profile_id";s:8:"readonly";s:1:"1";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:5:"label";s:12:"Profile Name";}s:1:"C";a:3:{s:4:"type";s:4:"text";s:4:"name";s:14:"ea_description";s:5:"align";s:5:"right";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:5:"align";s:5:"right";}}}s:4:"rows";i:1;s:4:"cols";i:4;s:4:"size";s:3:"98%";s:7:"options";a:1:{i:0;s:3:"98%";}}}i:3;a:1:{s:1:"A";a:3:{s:4:"type";s:3:"tab";s:5:"label";s:45:"Global|SMTP|IMAP|Signature|Stationery|History";s:4:"name";s:50:"tabs=global|SMTP|IMAP|signature|stationery|history";}}i:4;a:1:{s:1:"A";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";i:1;a:3:{s:4:"type";s:6:"button";s:4:"name";s:4:"save";s:5:"label";s:4:"Save";}i:2;a:3:{s:4:"type";s:6:"button";s:5:"label";s:5:"Apply";s:4:"name";s:5:"apply";}i:3;a:3:{s:4:"type";s:6:"button";s:5:"label";s:6:"Cancel";s:4:"name";s:6:"cancel";}}i:2;a:5:{s:4:"type";s:6:"button";s:4:"name";s:6:"delete";s:5:"label";s:6:"Delete";s:5:"align";s:5:"right";s:7:"onclick";s:60:"return confirm(\'Do you really want to delete this Profile\');";}}}}s:4:"rows";i:4;s:4:"cols";i:1;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '.redItalic { color: red; font-style: italics; }','modified' => '1255612671',); + +$templ_data[] = array('name' => 'emailadmin.edit.global','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:4:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:5:"label";s:12:"Organisation";s:4:"size";s:1:"1";i:1;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:50:"enter your default mail domain (from: user@domain)";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:17:"ea_default_domain";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:20:"name of organisation";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:20:"ea_organisation_name";}}}s:4:"rows";i:2;s:4:"cols";i:2;s:7:"options";a:0:{}}}}i:2;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:21:"profile access rights";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:4:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:26:"can be used by application";}s:1:"B";a:3:{s:4:"type";s:6:"select";s:4:"name";s:10:"ea_appname";s:4:"size";s:15:"any application";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:20:"can be used by group";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:4:"size";s:16:"any group,groups";s:4:"name";s:8:"ea_group";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:19:"can be used by user";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:4:"size";s:17:"any user,accounts";s:4:"name";s:7:"ea_user";}}}s:4:"rows";i:3;s:4:"cols";i:2;}}}i:3;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:14:"global options";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:5:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:17:"profile is active";}s:1:"B";a:2:{s:4:"type";s:8:"checkbox";s:4:"name";s:9:"ea_active";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:37:"users can define their own identities";}s:1:"B";a:3:{s:4:"type";s:8:"checkbox";s:4:"name";s:26:"ea_user_defined_identities";s:4:"size";s:6:"yes,no";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:40:"users can define their own emailaccounts";}s:1:"B";a:3:{s:4:"type";s:8:"checkbox";s:4:"name";s:24:"ea_user_defined_accounts";s:4:"size";s:6:"yes,no";}}i:4;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"order";}s:1:"B";a:2:{s:4:"type";s:3:"int";s:4:"name";s:8:"ea_order";}}}s:4:"rows";i:4;s:4:"cols";i:2;}}}}s:4:"rows";i:3;s:4:"cols";i:1;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1255426691',); + +$templ_data[] = array('name' => 'emailadmin.edit.history','template' => '','lang' => '','group' => '0','version' => '1.9.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:2:{s:4:"type";s:10:"historylog";s:4:"name";s:7:"history";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:17:"100%,400,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"400";i:6;s:4:"auto";}}}','size' => '100%,400,,,,,auto','style' => '','modified' => '1283865538',); + +$templ_data[] = array('name' => 'emailadmin.edit.IMAP','template' => '','lang' => '','group' => '0','version' => '1.9.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:3:{s:2:"h3";s:27:",!@ea_imap_login_type=admin";s:2:"h5";s:27:",!@imapcapabilities=/sieve/";s:2:"h6";s:27:",!@imapcapabilities=/admin/";}i:1;a:1:{s:1:"A";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:26:"select type of IMAP server";}i:2;a:4:{s:4:"type";s:6:"select";s:4:"name";s:12:"ea_imap_type";s:5:"align";s:5:"right";s:8:"onchange";i:1;}}}i:2;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:15:"server settings";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:4:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:34:"IMAP server hostname or ip address";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:14:"ea_imap_server";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:16:"IMAP server port";}s:1:"B";a:2:{s:4:"type";s:3:"int";s:4:"name";s:12:"ea_imap_port";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:20:"imap server logintyp";}s:1:"B";a:3:{s:4:"type";s:6:"select";s:4:"name";s:18:"ea_imap_login_type";s:8:"onchange";i:1;}}}s:4:"rows";i:3;s:4:"cols";i:2;}}}i:3;a:1:{s:1:"A";a:3:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:4:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:1:"2";s:5:"label";s:42:"Use predefined username and password below";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:8:"username";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:21:"ea_imap_auth_username";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:8:"password";}s:1:"B";a:2:{s:4:"type";s:6:"passwd";s:4:"name";s:21:"ea_imap_auth_password";}}}s:4:"rows";i:3;s:4:"cols";i:2;}}}i:4;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:19:"encryption settings";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:3:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:20:"encrypted connection";}s:1:"B";a:6:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"4";i:1;a:4:{s:4:"type";s:5:"radio";s:4:"size";s:1:"1";s:5:"label";s:8:"STARTTLS";s:4:"name";s:22:"ea_imap_tsl_encryption";}i:2;a:4:{s:4:"type";s:5:"radio";s:4:"name";s:22:"ea_imap_tsl_encryption";s:4:"size";s:1:"2";s:5:"label";s:3:"TLS";}i:3;a:4:{s:4:"type";s:5:"radio";s:4:"name";s:22:"ea_imap_tsl_encryption";s:4:"size";s:1:"3";s:5:"label";s:3:"SSL";}i:4;a:4:{s:4:"type";s:5:"radio";s:4:"name";s:22:"ea_imap_tsl_encryption";s:4:"size";s:1:"0";s:5:"label";s:13:"no encryption";}}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:27:"do not validate certificate";}s:1:"B";a:3:{s:4:"type";s:8:"checkbox";s:4:"name";s:16:"ea_imap_tsl_auth";s:4:"size";s:6:"yes,no";}}}s:4:"rows";i:2;s:4:"cols";i:2;}}}i:5;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:14:"sieve settings";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:5:{i:0;a:2:{s:2:"h2";s:27:",!@ea_imap_enable_sieve=yes";s:2:"h3";s:27:",!@ea_imap_enable_sieve=yes";}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:12:"enable Sieve";}s:1:"B";a:4:{s:4:"type";s:8:"checkbox";s:4:"name";s:20:"ea_imap_enable_sieve";s:4:"size";s:6:"yes,no";s:8:"onchange";i:1;}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:26:"Sieve server or ip address";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:20:"ea_imap_sieve_server";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:17:"Sieve server port";}s:1:"B";a:2:{s:4:"type";s:3:"int";s:4:"name";s:18:"ea_imap_sieve_port";}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:1:"2";s:5:"label";s:78:"Vacation messages with start- and end-date require an admin account to be set";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:4;s:4:"cols";i:2;}}}i:6;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:32:"Cyrus IMAP server administration";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:4:{i:0;a:2:{s:2:"h2";s:27:",!@ea_imap_enable_cyrus=yes";s:2:"h3";s:27:",!@ea_imap_enable_cyrus=yes";}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:39:"enable Cyrus IMAP server administration";}s:1:"B";a:4:{s:4:"type";s:8:"checkbox";s:4:"size";s:6:"yes,no";s:4:"name";s:20:"ea_imap_enable_cyrus";s:8:"onchange";i:1;}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:14:"admin username";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:18:"ea_imap_admin_user";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:14:"admin password";}s:1:"B";a:2:{s:4:"type";s:6:"passwd";s:4:"name";s:16:"ea_imap_admin_pw";}}}s:4:"rows";i:3;s:4:"cols";i:2;}}}}s:4:"rows";i:6;s:4:"cols";i:1;s:4:"size";s:17:"100%,400,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"400";i:6;s:4:"auto";}}}','size' => '100%,400,,,,,auto','style' => '','modified' => '1300350962',); + +$templ_data[] = array('name' => 'emailadmin.edit.signature','template' => '','lang' => '','group' => '0','version' => '1.7.004','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:3:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:3:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:37:"users can define their own signatures";}s:1:"B";a:3:{s:4:"type";s:8:"checkbox";s:4:"name";s:26:"ea_user_defined_signatures";s:4:"size";s:6:"yes,no";}}i:2;a:2:{s:1:"A";a:4:{s:4:"type";s:8:"htmlarea";s:4:"span";s:1:"2";s:4:"name";s:20:"ea_default_signature";s:4:"size";s:17:"advanced,,700,180";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:2;s:4:"cols";i:2;}}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:17:"100%,400,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"400";i:6;s:4:"auto";}}}','size' => '100%,400,,,,,auto','style' => '','modified' => '1270799878',); + +$templ_data[] = array('name' => 'emailadmin.edit.SMTP','template' => '','lang' => '','group' => '0','version' => '1.7.004','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:1:{s:2:"h4";s:29:",!@smtpcapabilities=/forward/";}i:1;a:1:{s:1:"A";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:26:"Select type of SMTP Server";}i:2;a:4:{s:4:"type";s:6:"select";s:4:"name";s:12:"ea_smtp_type";s:5:"align";s:5:"right";s:8:"onchange";i:1;}}}i:2;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:13:"SMTP settings";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:3:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:34:"SMTP-Server hostname or IP address";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:14:"ea_smtp_server";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:16:"SMTP-Server Port";}s:1:"B";a:2:{s:4:"type";s:3:"int";s:4:"name";s:12:"ea_smtp_port";}}}s:4:"rows";i:2;s:4:"cols";i:2;}}}i:3;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:19:"smtp authentication";i:1;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:13:"Use SMTP auth";}s:1:"B";a:3:{s:4:"type";s:8:"checkbox";s:4:"name";s:12:"ea_smtp_auth";s:4:"size";s:6:"yes,no";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:29:"send using this eMail-Address";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:18:"smtp_senders_email";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:8:"username";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:21:"ea_smtp_auth_username";}}i:4;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:8:"password";}s:1:"B";a:2:{s:4:"type";s:6:"passwd";s:4:"name";s:21:"ea_smtp_auth_password";}}}s:4:"rows";i:4;s:4:"cols";i:2;s:7:"options";a:0:{}}}}i:4;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:12:"smtp options";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:2:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:32:"user can edit forwarding address";}s:1:"B";a:3:{s:4:"type";s:8:"checkbox";s:4:"name";s:24:"ea_editforwardingaddress";s:4:"size";s:6:"yes,no";}}}s:4:"rows";i:1;s:4:"cols";i:2;}}}}s:4:"rows";i:4;s:4:"cols";i:1;s:4:"size";s:17:"100%,400,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"400";i:6;s:4:"auto";}}}','size' => '100%,400,,,,,auto','style' => '','modified' => '1274772869',); + +$templ_data[] = array('name' => 'emailadmin.edit.stationery','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:16:"active templates";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:3:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:44:"users can utilize these stationery templates";}s:1:"B";a:4:{s:4:"type";s:6:"select";s:4:"name";s:30:"ea_stationery_active_templates";i:1;a:3:{s:4:"type";s:3:"box";s:4:"name";s:30:"ea_stationery_active_templates";s:4:"size";s:3:",10";}s:4:"size";s:1:"5";}}i:2;a:2:{s:1:"A";a:6:{s:4:"type";s:4:"html";s:4:"span";s:1:"2";s:8:"readonly";s:1:"1";s:4:"help";s:27:"manage stationery templates";s:4:"name";s:27:"manage_stationery_templates";s:5:"align";s:5:"right";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:2;s:4:"cols";i:2;}}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:17:"100%,400,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"400";i:6;s:4:"auto";}}}','size' => '100%,400,,,,,auto','style' => '','modified' => '1255600503',); + +$templ_data[] = array('name' => 'emailadmin.index','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}s:4:"data";a:6:{i:0;a:2:{s:2:"h2";s:6:",!@msg";s:2:"h1";s:11:",!@subtitle";}i:1;a:1:{s:1:"A";a:6:{s:4:"type";s:4:"hbox";s:8:"readonly";s:1:"1";s:5:"align";s:6:"center";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:4:"html";s:4:"name";s:8:"subtitle";s:8:"readonly";s:1:"1";s:5:"align";s:6:"center";}i:2;a:3:{s:4:"type";s:4:"html";s:4:"name";s:13:"addJavaScript";s:8:"readonly";s:1:"1";}}}i:2;a:1:{s:1:"A";a:4:{s:4:"type";s:5:"label";s:4:"span";s:10:",redItalic";s:4:"name";s:3:"msg";s:5:"align";s:6:"center";}}i:3;a:1:{s:1:"A";a:5:{s:4:"type";s:6:"button";s:4:"name";s:10:"AddProfile";s:5:"label";s:3:"Add";s:5:"align";s:5:"right";s:7:"onclick";s:165:"window.open(egw::link(\'/index.php\',\'menuaction=emailadmin.emailadmin_ui.add\'),\'_blank\',\'dependent=yes,width=850,height=540,scrollbars=yes,status=yes\'); return false;";}}i:4;a:1:{s:1:"A";a:4:{s:4:"type";s:9:"nextmatch";s:4:"size";s:21:"emailadmin.index.rows";s:4:"span";s:3:"all";s:4:"name";s:2:"nm";}}i:5;a:1:{s:1:"A";a:6:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";s:5:"align";s:5:"right";i:1;a:5:{s:4:"type";s:6:"button";s:4:"name";s:6:"delete";s:4:"size";s:6:"delete";s:5:"label";s:6:"Delete";s:7:"onclick";s:34:"return confirm(\'Delete Profiles\');";}i:2;a:4:{s:4:"type";s:10:"buttononly";s:4:"span";s:15:",selectAllArrow";s:7:"onclick";s:71:"toggle_all(this.form,form::name(\'nm[rows][selected][]\')); return false;";s:4:"size";s:9:"arrow_ltr";}i:3;a:1:{s:4:"type";s:5:"label";}}}}s:4:"rows";i:5;s:4:"cols";i:1;}}','size' => '100%','style' => '.redItalic { color: red; font-style: italics; }','modified' => '1255529643',); + +$templ_data[] = array('name' => 'emailadmin.index.rows','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:7:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:3:{s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";s:1:"P";s:2:"1%";}i:1;a:16:{s:1:"A";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:2:"ID";s:4:"name";s:13:"ea_profile_id";}s:1:"B";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:11:"Description";s:4:"name";s:14:"ea_description";}s:1:"C";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:10:"domainname";s:4:"name";s:17:"ea_default_domain";}s:1:"D";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:16:"SMTP Server Name";s:4:"name";s:14:"ea_smtp_server";}s:1:"E";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:16:"SMTP Server Type";s:4:"name";s:12:"ea_smtp_type";}s:1:"F";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:16:"SMTP Server Port";s:4:"name";s:12:"ea_smtp_port";}s:1:"G";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:16:"IMAP Server Name";s:4:"name";s:14:"ea_imap_server";}s:1:"H";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:16:"IMAP Server Type";s:4:"name";s:12:"ea_imap_type";}s:1:"I";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:16:"IMAP Server Port";s:4:"name";s:12:"ea_imap_port";}s:1:"J";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:22:"IMAP Server Login Type";s:4:"name";s:18:"ea_imap_login_type";}s:1:"K";a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:10:"ea_appname";s:5:"label";s:11:"Application";}s:1:"L";a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:8:"ea_group";s:5:"label";s:5:"Group";}s:1:"M";a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:7:"ea_user";s:5:"label";s:4:"User";}s:1:"N";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:5:"order";s:4:"name";s:8:"ea_order";}s:1:"O";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:6:"Active";s:4:"name";s:9:"ea_active";}s:1:"P";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:6:"Action";}i:2;a:4:{s:4:"type";s:10:"buttononly";s:4:"size";s:5:"check";s:5:"label";s:10:"Select All";s:7:"onclick";s:61:"toggle_all(this.form,form::name(\'selected[]\')); return false;";}}}i:2;a:16:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:4:"name";s:21:"${row}[ea_profile_id]";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:4:"name";s:22:"${row}[ea_description]";}s:1:"C";a:2:{s:4:"type";s:5:"label";s:4:"name";s:25:"${row}[ea_default_domain]";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:4:"name";s:22:"${row}[ea_smtp_server]";}s:1:"E";a:3:{s:4:"type";s:6:"select";s:4:"name";s:20:"${row}[ea_smtp_type]";s:8:"readonly";s:1:"1";}s:1:"F";a:2:{s:4:"type";s:5:"label";s:4:"name";s:20:"${row}[ea_smtp_port]";}s:1:"G";a:2:{s:4:"type";s:5:"label";s:4:"name";s:22:"${row}[ea_imap_server]";}s:1:"H";a:3:{s:4:"type";s:6:"select";s:4:"name";s:20:"${row}[ea_imap_type]";s:8:"readonly";s:1:"1";}s:1:"I";a:2:{s:4:"type";s:5:"label";s:4:"name";s:20:"${row}[ea_imap_port]";}s:1:"J";a:2:{s:4:"type";s:5:"label";s:4:"name";s:26:"${row}[ea_imap_login_type]";}s:1:"K";a:3:{s:4:"type";s:6:"select";s:4:"name";s:18:"${row}[ea_appname]";s:8:"readonly";s:1:"1";}s:1:"L";a:4:{s:4:"type";s:14:"select-account";s:4:"name";s:16:"${row}[ea_group]";s:8:"readonly";s:1:"1";s:4:"size";s:7:",groups";}s:1:"M";a:4:{s:4:"type";s:14:"select-account";s:4:"name";s:15:"${row}[ea_user]";s:8:"readonly";s:1:"1";s:4:"size";s:9:",accounts";}s:1:"N";a:3:{s:4:"type";s:5:"label";s:4:"name";s:16:"${row}[ea_order]";s:7:"no_lang";s:1:"1";}s:1:"O";a:2:{s:4:"type";s:5:"label";s:4:"name";s:17:"${row}[ea_active]";}s:1:"P";a:6:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"4";i:1;a:6:{s:4:"type";s:6:"button";s:4:"size";s:4:"edit";s:5:"label";s:4:"Edit";s:4:"help";s:17:"Edit this Profile";s:4:"name";s:30:"edit[$row_cont[ea_profile_id]]";s:7:"onclick";s:205:"window.open(egw::link(\'/index.php\',\'menuaction=emailadmin.emailadmin_ui.edit&profileid=$row_cont[ea_profile_id]\'),\'ea_profile\',\'dependent=yes,width=850,height=540,scrollbars=yes,status=yes\'); return false;";}i:2;a:6:{s:4:"type";s:6:"button";s:4:"size";s:6:"delete";s:5:"label";s:6:"Delete";s:4:"name";s:32:"delete[$row_cont[ea_profile_id]]";s:7:"onclick";s:60:"return confirm(\'Do you really want to delete this Profile\');";s:4:"help";s:19:"Delete this Profile";}i:3;a:3:{s:4:"type";s:8:"checkbox";s:4:"size";s:24:"$row_cont[ea_profile_id]";s:4:"name";s:10:"selected[]";}i:4;a:1:{s:4:"type";s:5:"label";}}}}s:4:"rows";i:2;s:4:"cols";i:16;s:4:"size";s:4:"100%";s:5:"align";s:6:"center";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1255607501',); + diff --git a/emailadmin/setup/setup.inc.php b/emailadmin/setup/setup.inc.php new file mode 100644 index 0000000000..e0ccdcf193 --- /dev/null +++ b/emailadmin/setup/setup.inc.php @@ -0,0 +1,69 @@ + + * @package emailadmin + * @subpackage setup + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +$setup_info['emailadmin']['name'] = 'emailadmin'; +$setup_info['emailadmin']['title'] = 'EMailAdmin'; +$setup_info['emailadmin']['version'] = '1.9.003'; +$setup_info['emailadmin']['app_order'] = 10; +$setup_info['emailadmin']['enable'] = 2; +$setup_info['emailadmin']['index'] = 'emailadmin.emailadmin_ui.listProfiles'; + +$setup_info['emailadmin']['author'] = 'Klaus Leithoff'; +$setup_info['emailadmin']['license'] = 'GPL'; +$setup_info['emailadmin']['description'] = + 'A central Mailserver management application for EGroupWare. Completely rewritten by K.Leithoff in 10-2009'; +$setup_info['emailadmin']['note'] = + ''; +$setup_info['emailadmin']['maintainer'] = array( + 'name' => 'Leithoff, Klaus', + 'email' => 'kl@stylite.de' +); + +$setup_info['emailadmin']['tables'][] = 'egw_emailadmin'; + +/* The hooks this app includes, needed for hooks registration */ +#$setup_info['emailadmin']['hooks'][] = 'preferences'; +$setup_info['emailadmin']['hooks']['admin'] = 'emailadmin_hooks::admin'; +$setup_info['emailadmin']['hooks']['edit_user'] = 'emailadmin_hooks::edit_user'; +$setup_info['emailadmin']['hooks']['view_user'] = 'emailadmin_hooks::edit_user'; +$setup_info['emailadmin']['hooks']['edit_group'] = 'emailadmin_hooks::edit_group'; +$setup_info['emailadmin']['hooks']['group_manager'] = 'emailadmin_hooks::edit_group'; +$setup_info['emailadmin']['hooks']['deleteaccount'] = 'emailadmin_hooks::deleteaccount'; +$setup_info['emailadmin']['hooks']['deletegroup'] = 'emailadmin_hooks::deletegroup'; +/* Dependencies for this app to work */ +$setup_info['emailadmin']['depends'][] = array( + 'appname' => 'phpgwapi', + 'versions' => Array('1.7','1.8','1.9') +); +$setup_info['emailadmin']['depends'][] = array( + 'appname' => 'egw-pear', + 'versions' => Array('1.8','1.9') +); +// installation checks for felamimail +$setup_info['emailadmin']['check_install'] = array( + '' => array( + 'func' => 'pear_check', + 'from' => 'EMailAdmin', + ), + 'Auth_SASL' => array( + 'func' => 'pear_check', + 'from' => 'EMailAdmin', + ), + 'Net_IMAP' => array( + 'func' => 'pear_check', + 'from' => 'EMailAdmin', + ), + 'imap' => array( + 'func' => 'extension_check', + 'from' => 'EMailAdmin', + ), +); diff --git a/emailadmin/setup/tables_current.inc.php b/emailadmin/setup/tables_current.inc.php new file mode 100644 index 0000000000..f774b507b7 --- /dev/null +++ b/emailadmin/setup/tables_current.inc.php @@ -0,0 +1,63 @@ + + * @package emailadmin + * @subpackage setup + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +$phpgw_baseline = array( + 'egw_emailadmin' => array( + 'fd' => array( + 'ea_profile_id' => array('type' => 'auto','nullable' => False), + 'ea_smtp_server' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_type' => array('type' => 'varchar','precision' => '56'), + 'ea_smtp_port' => array('type' => 'int','precision' => '4'), + 'ea_smtp_auth' => array('type' => 'varchar','precision' => '3'), + 'ea_editforwardingaddress' => array('type' => 'varchar','precision' => '3'), + 'ea_smtp_ldap_server' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_ldap_basedn' => array('type' => 'varchar','precision' => '200'), + 'ea_smtp_ldap_admindn' => array('type' => 'varchar','precision' => '200'), + 'ea_smtp_ldap_adminpw' => array('type' => 'varchar','precision' => '30'), + 'ea_smtp_ldap_use_default' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_server' => array('type' => 'varchar','precision' => '80'), + 'ea_imap_type' => array('type' => 'varchar','precision' => '56'), + 'ea_imap_port' => array('type' => 'int','precision' => '4'), + 'ea_imap_login_type' => array('type' => 'varchar','precision' => '20'), + 'ea_imap_tsl_auth' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_tsl_encryption' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_enable_cyrus' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_admin_user' => array('type' => 'varchar','precision' => '40'), + 'ea_imap_admin_pw' => array('type' => 'varchar','precision' => '40'), + 'ea_imap_enable_sieve' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_sieve_server' => array('type' => 'varchar','precision' => '80'), + 'ea_imap_sieve_port' => array('type' => 'int','precision' => '4'), + 'ea_description' => array('type' => 'varchar','precision' => '200'), + 'ea_default_domain' => array('type' => 'varchar','precision' => '100'), + 'ea_organisation_name' => array('type' => 'varchar','precision' => '100'), + 'ea_user_defined_identities' => array('type' => 'varchar','precision' => '3'), + 'ea_user_defined_accounts' => array('type' => 'varchar','precision' => '3'), + 'ea_order' => array('type' => 'int','precision' => '4'), + 'ea_appname' => array('type' => 'varchar','precision' => '80'), + 'ea_group' => array('type' => 'varchar','precision' => '80'), + 'ea_user' => array('type' => 'varchar','precision' => '80'), + 'ea_active' => array('type' => 'int','precision' => '4'), + 'ea_smtp_auth_username' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_auth_password' => array('type' => 'varchar','precision' => '80'), + 'ea_user_defined_signatures' => array('type' => 'varchar','precision' => '3'), + 'ea_default_signature' => array('type' => 'text'), + 'ea_imap_auth_username' => array('type' => 'varchar','precision' => '80'), + 'ea_imap_auth_password' => array('type' => 'varchar','precision' => '80'), + 'ea_stationery_active_templates' => array('type' => 'text') + ), + 'pk' => array('ea_profile_id'), + 'fk' => array(), + 'ix' => array('ea_appname','ea_group'), + 'uc' => array() + ) +); diff --git a/emailadmin/setup/tables_update.inc.php b/emailadmin/setup/tables_update.inc.php new file mode 100644 index 0000000000..ed37c80a8f --- /dev/null +++ b/emailadmin/setup/tables_update.inc.php @@ -0,0 +1,385 @@ + + * @package emailadmin + * @subpackage setup + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +function emailadmin_upgrade0_0_3() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','smtpType', array('type' => 'int', 'precision' => 4)); + + return $setup_info['emailadmin']['currentver'] = '0.0.4'; +} + + +function emailadmin_upgrade0_0_4() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','defaultDomain', array('type' => 'varchar', 'precision' => 100)); + + return $setup_info['emailadmin']['currentver'] = '0.0.5'; +} + + +function emailadmin_upgrade0_0_5() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','organisationName', array('type' => 'varchar', 'precision' => 100)); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','userDefinedAccounts', array('type' => 'varchar', 'precision' => 3)); + + return $setup_info['emailadmin']['currentver'] = '0.0.6'; +} + + +function emailadmin_upgrade0_0_6() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','oldimapcclient',array( + 'type' => 'varchar', + 'precision' => '3' + )); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '0.0.007'; +} + + +function emailadmin_upgrade0_0_007() +{ + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_emailadmin','oldimapcclient','imapoldcclient'); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '0.0.008'; +} + + +function emailadmin_upgrade0_0_008() +{ + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.0.0'; +} + + +function emailadmin_upgrade1_0_0() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','editforwardingaddress',array( + 'type' => 'varchar', + 'precision' => '3' + )); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.0.1'; +} + + +function emailadmin_upgrade1_0_1() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','ea_order', array('type' => 'int', 'precision' => 4)); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.0.2'; +} + + +function emailadmin_upgrade1_0_2() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','ea_appname', array('type' => 'varchar','precision' => '80')); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','ea_group', array('type' => 'varchar','precision' => '80')); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.0.3'; +} + + +function emailadmin_upgrade1_0_3() +{ + $GLOBALS['egw_setup']->oProc->RenameTable('phpgw_emailadmin','egw_emailadmin'); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.2'; +} + + +function emailadmin_upgrade1_2() +{ + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','profileID','ea_profile_id'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpServer','ea_smtp_server'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpType','ea_smtp_type'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpPort','ea_smtp_port'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpAuth','ea_smtp_auth'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','editforwardingaddress','ea_editforwardingaddress'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpLDAPServer','ea_smtp_ldap_server'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpLDAPBaseDN','ea_smtp_ldap_basedn'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpLDAPAdminDN','ea_smtp_ldap_admindn'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpLDAPAdminPW','ea_smtp_ldap_adminpw'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpLDAPUseDefault','ea_smtp_ldap_use_default'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapServer','ea_imap_server'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapType','ea_imap_type'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapPort','ea_imap_port'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapLoginType','ea_imap_login_type'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapTLSAuthentication','ea_imap_tsl_auth'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapTLSEncryption','ea_imap_tsl_encryption'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapEnableCyrusAdmin','ea_imap_enable_cyrus'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapAdminUsername','ea_imap_admin_user'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapAdminPW','ea_imap_admin_pw'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapEnableSieve','ea_imap_enable_sieve'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapSieveServer','ea_imap_sieve_server'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapSievePort','ea_imap_sieve_port'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','description','ea_description'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','defaultDomain','ea_default_domain'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','organisationName','ea_organisation_name'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','userDefinedAccounts','ea_user_defined_accounts'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapoldcclient','ea_imapoldcclient'); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.2.001'; +} + + +function emailadmin_upgrade1_2_001() +{ + /* done by RefreshTable() anyway + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_smtp_auth_username',array( + 'type' => 'varchar', + 'precision' => '80' + ));*/ + /* done by RefreshTable() anyway + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_smtp_auth_password',array( + 'type' => 'varchar', + 'precision' => '80' + ));*/ + $GLOBALS['egw_setup']->oProc->RefreshTable('egw_emailadmin',array( + 'fd' => array( + 'ea_profile_id' => array('type' => 'auto','nullable' => False), + 'ea_smtp_server' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_type' => array('type' => 'int','precision' => '4'), + 'ea_smtp_port' => array('type' => 'int','precision' => '4'), + 'ea_smtp_auth' => array('type' => 'varchar','precision' => '3'), + 'ea_editforwardingaddress' => array('type' => 'varchar','precision' => '3'), + 'ea_smtp_ldap_server' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_ldap_basedn' => array('type' => 'varchar','precision' => '200'), + 'ea_smtp_ldap_admindn' => array('type' => 'varchar','precision' => '200'), + 'ea_smtp_ldap_adminpw' => array('type' => 'varchar','precision' => '30'), + 'ea_smtp_ldap_use_default' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_server' => array('type' => 'varchar','precision' => '80'), + 'ea_imap_type' => array('type' => 'int','precision' => '4'), + 'ea_imap_port' => array('type' => 'int','precision' => '4'), + 'ea_imap_login_type' => array('type' => 'varchar','precision' => '20'), + 'ea_imap_tsl_auth' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_tsl_encryption' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_enable_cyrus' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_admin_user' => array('type' => 'varchar','precision' => '40'), + 'ea_imap_admin_pw' => array('type' => 'varchar','precision' => '40'), + 'ea_imap_enable_sieve' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_sieve_server' => array('type' => 'varchar','precision' => '80'), + 'ea_imap_sieve_port' => array('type' => 'int','precision' => '4'), + 'ea_description' => array('type' => 'varchar','precision' => '200'), + 'ea_default_domain' => array('type' => 'varchar','precision' => '100'), + 'ea_organisation_name' => array('type' => 'varchar','precision' => '100'), + 'ea_user_defined_accounts' => array('type' => 'varchar','precision' => '3'), + 'ea_imapoldcclient' => array('type' => 'varchar','precision' => '3'), + 'ea_order' => array('type' => 'int','precision' => '4'), + 'ea_appname' => array('type' => 'varchar','precision' => '80'), + 'ea_group' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_auth_username' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_auth_password' => array('type' => 'varchar','precision' => '80') + ), + 'pk' => array('ea_profile_id'), + 'fk' => array(), + 'ix' => array('ea_appname','ea_group'), + 'uc' => array() + )); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.2.002'; +} + + +function emailadmin_upgrade1_2_002() +{ + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.4'; +} + + +function emailadmin_upgrade1_4() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_user_defined_signatures',array( + 'type' => 'varchar', + 'precision' => '3' + )); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_default_signature',array( + 'type' => 'varchar', + 'precision' => '255' + )); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.4.001'; +} + + +function emailadmin_upgrade1_4_001() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_user_defined_identities',array( + 'type' => 'varchar', + 'precision' => '3' + )); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.5.001'; +} + + +function emailadmin_upgrade1_5_001() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_user',array( + 'type' => 'varchar', + 'precision' => '80' + )); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_active',array( + 'type' => 'int', + 'precision' => '4' + )); + $GLOBALS['phpgw_setup']->oProc->query("UPDATE egw_emailadmin set ea_user='0', ea_active=1",__LINE__,__FILE__); + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.5.002'; +} + + +function emailadmin_upgrade1_5_002() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_imap_auth_username',array( + 'type' => 'varchar', + 'precision' => '80' + )); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_imap_auth_password',array( + 'type' => 'varchar', + 'precision' => '80' + )); + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.5.003'; +} + + +function emailadmin_upgrade1_5_003() +{ + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.5.004'; +} + + +function emailadmin_upgrade1_5_004() +{ + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.6'; +} + + +function emailadmin_upgrade1_6() +{ + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_emailadmin','ea_default_signature',array( + 'type' => 'text' + )); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.6.001'; +} + +function emailadmin_upgrade1_6_001() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_stationery_active_templates',array( + 'type' => 'text' + )); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.8'; // was '1.7.003'; +} + +function emailadmin_upgrade1_7_003() +{ + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_emailadmin','ea_imap_type',array( + 'type' => 'varchar', + 'precision' => 56, + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_emailadmin','ea_smtp_type',array( + 'type' => 'varchar', + 'precision' => 56, + )); + foreach (array('1'=>'defaultsmtp', '2'=>'postfixldap', '3'=>'postfixinetorgperson', '4'=>'smtpplesk', '5' =>'postfixdbmailuser') as $id => $newtype) + { + $GLOBALS['egw_setup']->oProc->query('update egw_emailadmin set ea_smtp_type=\''.$newtype.'\' where ea_smtp_type=\''.$id.'\'',__LINE__,__FILE__); + } + foreach (array('2'=>'defaultimap', '3'=>'cyrusimap', '4'=>'dbmailqmailuser', '5'=>'pleskimap', '6' =>'dbmaildbmailuser') as $id => $newtype) + { + $GLOBALS['egw_setup']->oProc->query('update egw_emailadmin set ea_imap_type=\''.$newtype.'\' where ea_imap_type=\''.$id.'\'',__LINE__,__FILE__); + } + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.9.001'; // was '1.7.004'; +} + +function emailadmin_upgrade1_8() +{ + emailadmin_upgrade1_7_003(); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.9.001'; +} + +function emailadmin_upgrade1_7_004() +{ + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.9.001'; +} + +function emailadmin_upgrade1_9_001() +{ + $GLOBALS['egw_setup']->oProc->RefreshTable('egw_emailadmin',array( + 'fd' => array( + 'ea_profile_id' => array('type' => 'auto','nullable' => False), + 'ea_smtp_server' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_type' => array('type' => 'varchar','precision' => '56'), + 'ea_smtp_port' => array('type' => 'int','precision' => '4'), + 'ea_smtp_auth' => array('type' => 'varchar','precision' => '3'), + 'ea_editforwardingaddress' => array('type' => 'varchar','precision' => '3'), + 'ea_smtp_ldap_server' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_ldap_basedn' => array('type' => 'varchar','precision' => '200'), + 'ea_smtp_ldap_admindn' => array('type' => 'varchar','precision' => '200'), + 'ea_smtp_ldap_adminpw' => array('type' => 'varchar','precision' => '30'), + 'ea_smtp_ldap_use_default' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_server' => array('type' => 'varchar','precision' => '80'), + 'ea_imap_type' => array('type' => 'varchar','precision' => '56'), + 'ea_imap_port' => array('type' => 'int','precision' => '4'), + 'ea_imap_login_type' => array('type' => 'varchar','precision' => '20'), + 'ea_imap_tsl_auth' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_tsl_encryption' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_enable_cyrus' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_admin_user' => array('type' => 'varchar','precision' => '40'), + 'ea_imap_admin_pw' => array('type' => 'varchar','precision' => '40'), + 'ea_imap_enable_sieve' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_sieve_server' => array('type' => 'varchar','precision' => '80'), + 'ea_imap_sieve_port' => array('type' => 'int','precision' => '4'), + 'ea_description' => array('type' => 'varchar','precision' => '200'), + 'ea_default_domain' => array('type' => 'varchar','precision' => '100'), + 'ea_organisation_name' => array('type' => 'varchar','precision' => '100'), + 'ea_user_defined_identities' => array('type' => 'varchar','precision' => '3'), + 'ea_user_defined_accounts' => array('type' => 'varchar','precision' => '3'), + 'ea_order' => array('type' => 'int','precision' => '4'), + 'ea_appname' => array('type' => 'varchar','precision' => '80'), + 'ea_group' => array('type' => 'varchar','precision' => '80'), + 'ea_user' => array('type' => 'varchar','precision' => '80'), + 'ea_active' => array('type' => 'int','precision' => '4'), + 'ea_smtp_auth_username' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_auth_password' => array('type' => 'varchar','precision' => '80'), + 'ea_user_defined_signatures' => array('type' => 'varchar','precision' => '3'), + 'ea_default_signature' => array('type' => 'text'), + 'ea_imap_auth_username' => array('type' => 'varchar','precision' => '80'), + 'ea_imap_auth_password' => array('type' => 'varchar','precision' => '80'), + 'ea_stationery_active_templates' => array('type' => 'text') + ), + 'pk' => array('ea_profile_id'), + 'fk' => array(), + 'ix' => array('ea_appname','ea_group'), + 'uc' => array() + )); + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.9.002'; +} + +function emailadmin_upgrade1_9_002() +{ + // convert serialized stationery templates setting to eTemplate store style + foreach($GLOBALS['egw_setup']->db->query('SELECT ea_profile_id,ea_stationery_active_templates FROM egw_emailadmin + WHERE ea_stationery_active_templates IS NOT NULL',__LINE__,__FILE__) as $row) + { + if(is_array(($templates=unserialize($row['ea_stationery_active_templates'])))) + { + $GLOBALS['egw_setup']->db->query('UPDATE egw_emailadmin SET ea_stationery_active_templates="'.implode(',',$templates).'"' + .' WHERE ea_profile_id='.(int)$row['ea_profile_id'],__LINE__,__FILE__); + } + unset($templates); + } + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.9.003'; +} diff --git a/emailadmin/smartsieve-NOTICE b/emailadmin/smartsieve-NOTICE new file mode 100644 index 0000000000..c5ec127049 --- /dev/null +++ b/emailadmin/smartsieve-NOTICE @@ -0,0 +1,19 @@ +SMARTSIEVE - SIEVE SCRIPT MANAGER +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Copyright 2002 Stephen Grier + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + diff --git a/emailadmin/templates/default/config.tpl b/emailadmin/templates/default/config.tpl new file mode 100644 index 0000000000..10b25fdd98 --- /dev/null +++ b/emailadmin/templates/default/config.tpl @@ -0,0 +1,42 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 {title}
 
 {lang_Mail_settings}
{lang_IMAP_admin_user}:
{lang_IMAP_admin_password}:
+  +
+ + +
+
+ diff --git a/emailadmin/templates/default/defaultpage.tpl b/emailadmin/templates/default/defaultpage.tpl new file mode 100644 index 0000000000..6d284a2d07 --- /dev/null +++ b/emailadmin/templates/default/defaultpage.tpl @@ -0,0 +1,64 @@ + +
+ + + + + +
+ + {menu_rows} + + + + {activation_rows} + + + +
+   +
+ {lang_done} +
+
+
+ + + + +
+ Data +
+
+
+
+ + + + + + {menu_description} + + + + + + + + {menu_description} + + + + + + + + {lang_activate} + + + + +   + + + diff --git a/emailadmin/templates/default/domainnames.tpl b/emailadmin/templates/default/domainnames.tpl new file mode 100644 index 0000000000..527440e63d --- /dev/null +++ b/emailadmin/templates/default/domainnames.tpl @@ -0,0 +1,136 @@ + +
+ + + + + +
+ + {menu_rows} + + + + {activation_rows} + + + +
+   +
+ {lang_done} +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Domains we receive email for +
+ {rcpt_selectbox} + + + +
+   +
+ +
+ {lang_add_to_local} +
+ + +
+   +
+ Domains which email we handle local +
+ {locals_selectbox} + + + +
+   +
+ +
+ + +
+
+ +
+ + + + + +
{menu_description} + + + + + + + + {menu_description} + + + + + + + + {lang_activate} + + + + +   + + + diff --git a/emailadmin/templates/default/edituserdata.tpl b/emailadmin/templates/default/edituserdata.tpl new file mode 100644 index 0000000000..15e409690f --- /dev/null +++ b/emailadmin/templates/default/edituserdata.tpl @@ -0,0 +1,111 @@ + + +
+
+ + + + + +
+ {rows} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {lang_email_config} + + {lang_emailaccount_active} + +
{lang_emailAddress} + +
{lang_mailAlternateAddress} + {selectbox_mailAlternateAddress} + +
+
+ +
{lang_mailRoutingAddress} + {selectbox_mailRoutingAddress} + +
+
+ +
+ {lang_forward_only} + + +
+   +
+ {lang_quota_settings} +
{lang_qoutainmbyte} + ({lang_0forunlimited}) +
+   +
+ + + + +
+ +
+
+
+
+ + + + +   {row_text} + + diff --git a/emailadmin/templates/default/images/navbar.png b/emailadmin/templates/default/images/navbar.png new file mode 100644 index 0000000000..2c21835635 Binary files /dev/null and b/emailadmin/templates/default/images/navbar.png differ diff --git a/emailadmin/templates/default/ldapsettings.tpl b/emailadmin/templates/default/ldapsettings.tpl new file mode 100644 index 0000000000..3e432cbd87 --- /dev/null +++ b/emailadmin/templates/default/ldapsettings.tpl @@ -0,0 +1,87 @@ + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {lang_server_name} + + +
+ {lang_server_description} + + +
+ {lang_ldap_server} + + +
+ {lang_ldap_basedn} + + +
+ {lang_ldap_server_admin} + + +
+ {lang_ldap_server_password} + + +
+ {lang_back} + + + +
+
+
+
+ + + + + +
{menu_description} + + + + + + + + {menu_description} + + + diff --git a/emailadmin/templates/default/listservers.tpl b/emailadmin/templates/default/listservers.tpl new file mode 100755 index 0000000000..d09b3e8c2b --- /dev/null +++ b/emailadmin/templates/default/listservers.tpl @@ -0,0 +1,25 @@ + +
+ + + + + + + + + + +
+   + +{lang_server_list} + + {lang_add_server} +
+ {server_next_match} +
+
+
+ + diff --git a/emailadmin/templates/default/nextMatch.tpl b/emailadmin/templates/default/nextMatch.tpl new file mode 100644 index 0000000000..0bd2bfaee3 --- /dev/null +++ b/emailadmin/templates/default/nextMatch.tpl @@ -0,0 +1,25 @@ + + + + {left_next_matchs} + + {right_next_matchs} + +
{description}
+ + + + + + {header_row_data} + + + + + + + {row_data} + + + +
\ No newline at end of file diff --git a/emailadmin/templates/default/options.tpl b/emailadmin/templates/default/options.tpl new file mode 100644 index 0000000000..c979d5d1a9 --- /dev/null +++ b/emailadmin/templates/default/options.tpl @@ -0,0 +1,138 @@ + +
+ + + + + +
+ + {menu_rows} + + + + {activation_rows} + + + +
+   +
+ {lang_done} +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ ldaplocaldelivery +
+ {desc_ldaplocaldelivery} +
+ +
+   +
+ ldapdefaultdotmode +
+ {desc_ldapdefaultdotmode} +
+ +
+   +
+ ldapbasedn +
+ {desc_ldapbasedn} +
+ +
+   +
+ dirmaker +
+ ldapcluster +
+
+
+
+ + + + + +
{menu_description} + + + + + + + + {menu_description} + + + + + + + + {lang_activate} + + + + +   + + + diff --git a/emailadmin/templates/default/smtprouting.tpl b/emailadmin/templates/default/smtprouting.tpl new file mode 100644 index 0000000000..a2c56ac857 --- /dev/null +++ b/emailadmin/templates/default/smtprouting.tpl @@ -0,0 +1,112 @@ + +
+ + + + + +
+ + {menu_rows} + + + + {activation_rows} + + + +
+   +
+ {lang_done} +
+
+ + + + +
+
+ + + + + + + + {smtproute_rows} + + + + + + +
+ {lang_domain_name} + + {lang_remote_server} + + {lang_remote_port} + + {lang_delete} +
+ + + + + + + + +
+
+
+
+
+ + + + + +
{menu_description} + + + + + + + + {menu_description} + + + + + + + + {lang_activate} + + + + +   + + + + + + + + {domain_name} + + + {remote_server} + + + {remote_port} + + + {lang_delete} + + + diff --git a/emailadmin/templates/jerryr/images/navbar-over.png b/emailadmin/templates/jerryr/images/navbar-over.png new file mode 100644 index 0000000000..2c21835635 Binary files /dev/null and b/emailadmin/templates/jerryr/images/navbar-over.png differ diff --git a/emailadmin/templates/jerryr/images/navbar.png b/emailadmin/templates/jerryr/images/navbar.png new file mode 100644 index 0000000000..ed3f908018 Binary files /dev/null and b/emailadmin/templates/jerryr/images/navbar.png differ diff --git a/felamimail/COPYING b/felamimail/COPYING new file mode 100644 index 0000000000..c7aea1896f --- /dev/null +++ b/felamimail/COPYING @@ -0,0 +1,280 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 675 Mass Ave, Cambridge, MA 02139, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/felamimail/Changelog b/felamimail/Changelog new file mode 100644 index 0000000000..e788b15b2e --- /dev/null +++ b/felamimail/Changelog @@ -0,0 +1,229 @@ +2007-06-19 Lars Kneschke + * added support for signatures managed by admin aka forced signatures + +2007-03-05 Lars Kneschke + * fixed not working disabling of STARTTLS + * fixed borken FeLaMiMail preferences translations + * fixed full stop on Sieve connection error + * made INBOX counter on homepage working again (based on patch from Pavel Å orejs) + * display 0 instead of   on empty folders (based on patch from Pavel Å orejs) + * removed some not longer needed files + +2007-02-28 Lars Kneschke + * rewrote logic to encode header, to handle wrongly encoded header + +2007-02-26 Lars Kneschke + * added support for messages containing only attachments (application/..., audio/...) + +2007-02-16 Lars Kneschke + * fix for loosing formating of centering, right-justification, text coloring and italics when composing from draft + * fixed my emailaddress in changelog file + +2007-02-15 Lars Kneschke + * enabled sieve support for custom email account settings + +2007-02-14 Lars Kneschke + * improved foldermanagement for server not supporting acl + * extended imap test script + +2007-02-13 Lars Kneschke + * updated imap server test script + +2007-02-12 Lars Kneschke + * added a script to test imap servers + +2007-01-24 Lars Kneschke + * removed some old code, which got not used anymore, but created problems (the blind gut of FeLaMiMail :-)) + +2007-01-13 Lars Kneschke + * finally added support the in-reply-to header + +2007-01-11 Lars Kneschke + * added support for serverside sort + * you make one signature the default one + * added support for searching content of message body + +2007-01-05 Lars Kneschke + * fetch quota from imap server only, if imap server supports quota + * improved autocreation of folders + +2006-12-31 Lars Kneschke + * major rewrite of the imap backend. php-imap is mostly gone. all imap code + is now based on the PEAR class Net_IMAP + * drafts keep their formating + * saving a message is working now + * improved folder handling + * signatures can now be managed from IE too + * make FeLaMiMail dependent on egw-pear + +2006-11-20 Lars Kneschke + * passwords are now hidden, when editing account settings + +2006-11-08 Lars Kneschke + * edit signature is now using fckeditor too + * improved generating multipart messages again + +2006-11-07 Lars Kneschke + * switched to fckeditor for writing html emails + * fixed login problem, when using userdefined accounts(loginname was not sent) + * improved generating multipart messages + +20061027 +- fixed printing when email conatains a cc +- signature description was always "undefined" when using internet explorer +- reorganized compose dialog a little bit. The folder select button as now + directly beside the select box for from, to, cc, reply to and folder +- fixed a JS error, when selecting the folder from the folder tree + +20061026 +- added some more logic, to also import the organisation, when importing addresses by + clicking at the icon behind the emailaddresses + +20061025 +- made printing working again +- fixed some IE only Javascript problems + +20061004 +- completly finnished rewrite of signature handling +- fixed display of messages. You get not the same font also used everwhere in eGW + +20060928 +- finished signature handling rewrite mostly. You can now define multiple signatures + and select them while writing a email. + +20060914 +- removed (temporarly) the dbcache. FeLaMiMail now works completly against the imapserver. + This requires a server with search and sort functionality. Big folders + should be displayed now very fast. +- you can sort by message status now +- updating trash folder counter and quota display when deleting messages + +20060821 +- added support for composing html emails +- fixed some minor internet explorer only display problems +- messages gets now displayed in a separate iframe. This allows to display html emails, whitout breaking css styles of the main display window. Also only the iframe gets a scrollbar now. That stops the "jumping buttons". In the past they were jumping to the left, when the email was to long and a scrollbar got displayed on the right. + +20060802 +- fixed bug [ 1487161 ] felamimail <> UTF-8 <> Postgres trouble +- fixed bug [ 1451287 ] Database error when accessing some folders + +20060801 +- added support for saving drafts +- removed debug code from the javascript code +- current inputfield is blinking now, when livesearch starts +- removed unneeded admin section + +20051128 +- fixed compose link in sidebox menu +- added action to cancel button on edit forwarding page +- removed admin section, any configuration is now done in emailadmin + +20051121 +- fixed the display of messages. messages now always open in new windows +- fixed navbar and replaced text with icons + +20051120 +- removed dependency on email + +20051018 +- fixed Bug where nodisplayable characters got displayed and broke caching + in the database + +20051013 +- added feature to let Postfix LDAP users edit there own email forwarding settings + feature can be enabled/disabled by settings in emailadmin + +20051012 +- fixed a bug, which triggered when compressing the folder + +20051011 +- fixed handling of "empty trash" and "compress folder" + the links got moved to the sidebox and are using ajax too +- fixed the header of the address row in the main view + the sent folder displays "to" all other folders are diplaying "from" + +Version 1.0 +- updated FeLaMiMail to use AJAX +- reworked the way the UI works. Most UI actions now don't need any reload +anymore. + +Version 0.9.6 + +- displaying of subfolders with hyphen was broken Bug #1195101 +- patch from Regis Regis Leroy to display counters on folders and improve + folder handling +- improved folder management. You can create now subfolders in the top + level. This should also improve support for UW IMAP +- fixed charset bug in folder management pages +- added support for javascript based folder tree + +Version 0.9.5 + +- ported Smartsieve to FeLaMiMail +- added highlighting for quotes (copied from horde) +- fixed sorting + - added all needed options to preferences + - can now be sorted by size too +- forwarding messages now as message/rfc822 +- improved mainview + - javascript selectbutton to select all messages + - fixed layout + - support colors from selected layout +- added support for emailadmin +- updated PHPMailer to version 0.7.1 +- added support for localized smtp error messages +- improved mime type handling +- also forward attachments +- support for �... in folder names +- support html emails(most evil tags get removed) +- code cleanup +- added Sidebox for Idots +- added user defined EMail accounts again, can be deactivated by admin + +Version 0.9.3/0.9.4 + +- added usefull error messsages, if login to imap server fails +- imaps support(encryption only and encryption with authentication) +- added smtp auth support +- print function; displays the page without the phpgw navbar, so will + print only the email +- removed old Squirrelmail code again +- the code to display emails is rewriten too, it's all based + on phpGW now +- rewrote folder management +- removed images, they where not always helpfull + +- filter dialog improved again + - you can store multiple filters now + - added quicksearch + +- integration of sieve-php + - you can manage sieve scripts on a sieve enables imap server + +- internal code cleanup +- modified linux-at-work.de template +- updated preferences dialog to do it the phpgroupware way +- you can define a refresh time for the mailbox message list +- fixed a nasty bug, when replying to emails which contain " or , in the + to,cc or bcc fields +- fixed quoted printable en/decoding in the + headers/subject(it was time to read the rfc's :) ) +- highlithing of web and email urls +- enabled vmailmgr login again +- don't halt smtp error messages anymore, but display the error + and go back to the compose window +- display the organization when showing the mail +- fixed download/save of attachment under IE and SSL + +Version 0.9.2 + +- improved filter dialog + - added a easy way to enable/disable the filter + - you can search for from, to, subject + +- updated the linux-at-work temmplate + +- fixed some bugs, where the mainview where broken, because of missing templates + +- the user preferences where not working correctly + diff --git a/felamimail/README b/felamimail/README new file mode 100644 index 0000000000..4f7dd82ee4 --- /dev/null +++ b/felamimail/README @@ -0,0 +1,20 @@ +FeLaMiMail +http://www.egroupware.org + +Author: +------- +Lars Kneschke l.kneschke@metaways.de + +Thanks to everyone who contributed to FeLaMiMail in the past. + +For example(ordered alphabetical): +- Christian Binder +- Randy Houlahan +- Sebastian Ebling + +If you think you belong here too, please feel free to contact me. + +Licensing: +---------- +This product is distributed under the GPL. Please read through the file +COPYING for more information about our license. \ No newline at end of file diff --git a/felamimail/TODO b/felamimail/TODO new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/felamimail/TODO @@ -0,0 +1 @@ + diff --git a/felamimail/inc/class.ajax_contacts.inc.php b/felamimail/inc/class.ajax_contacts.inc.php new file mode 100644 index 0000000000..a9d37171fa --- /dev/null +++ b/felamimail/inc/class.ajax_contacts.inc.php @@ -0,0 +1,103 @@ +session->commit_session(); + $this->charset = $GLOBALS['egw']->translation->charset(); + } + + function searchAddress($_searchString) { + if ($GLOBALS['egw_info']['user']['apps']['addressbook']) { + if (method_exists($GLOBALS['egw']->contacts,'search')) { + // 1.3+ + $showAccounts = true; + if ($GLOBALS['egw_info']['user']['preferences']['addressbook']['hide_accounts']) $showAccounts=false; + $contacts = $GLOBALS['egw']->contacts->search(array( + 'n_fn' => $_searchString, + 'email' => $_searchString, + 'email_home' => $_searchString, + ),array('n_fn','email','email_home'),'n_fn','','%',false,'OR',array(0,100),($showAccounts?array():array('account_id' => null))); + // additionally search the accounts, if the contact storage is not the account storage + if ($showAccounts && + $GLOBALS['egw_info']['server']['account_repository'] == 'ldap' && + $GLOBALS['egw_info']['server']['contact_repository'] == 'sql') + { + $accounts = $GLOBALS['egw']->contacts->search(array( + 'n_fn' => $_searchString, + 'email' => $_searchString, + 'email_home' => $_searchString, + ),array('n_fn','email','email_home'),'n_fn','','%',false,'OR',array(0,100),array('owner' => 0)); + + if ($contacts && $accounts) + { + $contacts = array_merge($contacts,$accounts); + usort($contacts,create_function('$a,$b','return strcasecmp($a["n_fn"],$b["n_fn"]);')); + } + elseif($accounts) + { + $contacts =& $accounts; + } + unset($accounts); + } + } else { + // < 1.3 + $contacts = $GLOBALS['egw']->contacts->read(0,20,array( + 'fn' => 1, + 'email' => 1, + 'email_home' => 1, + ), $_searchString, 'tid=n', '', 'fn'); + } + } + $response = new xajaxResponse(); + + if(is_array($contacts)) { + $innerHTML = ''; + $jsArray = array(); + $i = 0; + + foreach($contacts as $contact) { + foreach(array($contact['email'],$contact['email_home']) as $email) { + // avoid wrong addresses, if an rfc822 encoded address is in addressbook + $email = preg_replace("/(^.*<)([a-zA-Z0-9_\-]+@[a-zA-Z0-9_\-\.]+)(.*)/",'$2',$email); + $contact['n_fn'] = str_replace(array(',','@'),' ',$contact['n_fn']); + $completeMailString = addslashes(trim($contact['n_fn'] ? $contact['n_fn'] : $contact['fn']) .' <'. trim($email) .'>'); + if(!empty($email) && in_array($completeMailString ,$jsArray) === false) { + $i++; + $str = $GLOBALS['egw']->translation->convert(trim($contact['n_fn'] ? $contact['n_fn'] : $contact['fn']) .' <'. trim($email) .'>', $this->charset, 'utf-8'); + #$innerHTML .= '
'. + $innerHTML .= '
'. + htmlentities($str, ENT_QUOTES, 'utf-8') .'
'; + $jsArray[$i] = $completeMailString; + } + if ($i > 10) break; // we check for # of results here, as we might have empty email addresses + } + } + + if($jsArray) { + $response->addAssign('resultBox', 'innerHTML', $innerHTML); + $response->addScript('results = new Array("'.implode('","',$jsArray).'");'); + $response->addScript('displayResultBox();'); + } + //$response->addScript("getResults();"); + //$response->addScript("selectSuggestion(-1);"); + } else { + $response->addAssign('resultBox', 'className', 'resultBoxHidden'); + } + + return $response->getXML(); + } + } diff --git a/felamimail/inc/class.ajaxfelamimail.inc.php b/felamimail/inc/class.ajaxfelamimail.inc.php new file mode 100644 index 0000000000..e1b4ab9df1 --- /dev/null +++ b/felamimail/inc/class.ajaxfelamimail.inc.php @@ -0,0 +1,1465 @@ + + * @copyright (c) 2009-10 by Klaus Leithoff + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * a class containing / implementing the xajax actions triggered by javascript + */ +class ajaxfelamimail +{ + // which profile to use(currently only 0 is supported) + var $imapServerID=0; + + // the object storing the data about the incoming imap server + var $icServer; + + var $charset; + + var $_debug = false; + + // boolean if openConnection was successfull or not + var $_connectionStatus; + + /** + * Reference to felamimail_bo object + * + * @var felamimail_bo + */ + var $bofelamimail; + /** + * Instance of uiwidgets + * + * @var uiwidgets + */ + var $uiwidgets; + + function ajaxfelamimail() + { + if($this->_debug) error_log("ajaxfelamimail::ajaxfelamimail"); + if (isset($GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID'])) + $this->imapServerID = (int)$GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID']; + + $this->charset = translation::charset(); + $this->bofelamimail = felamimail_bo::getInstance(true,$this->imapServerID); + $this->uiwidgets = CreateObject('felamimail.uiwidgets'); + $this->icServer = $this->bofelamimail->mailPreferences->getIncomingServer($this->imapServerID); + $this->_connectionStatus = $this->bofelamimail->openConnection($this->imapServerID); + + $this->sessionDataAjax =& $GLOBALS['egw']->session->appsession('ajax_session_data','felamimail'); + $this->sessionData =& $GLOBALS['egw']->session->appsession('session_data','felamimail'); + if (!is_array($this->sessionDataAjax)) $this->sessionDataAjax = array(); + if(!isset($this->sessionDataAjax['folderName'])) { + $this->sessionDataAjax['folderName'] = 'INBOX'; + } + + } + + function addACL($_accountName, $_aclData, $_recursive=false) + { + if($this->_debug) error_log("ajaxfelamimail::addACL for ".$_accountName."->".array2string($_aclData)); + $response = new xajaxResponse(); + //$_recursive=false; + if(!empty($_accountName)) { + $acl = implode('',(array)$_aclData['acl']); + $data = $this->bofelamimail->setACL($this->sessionDataAjax['folderName'], $_accountName, $acl, $_recursive); + } + + return $response->getXML(); + } + + /** + * create a new folder + * + * @param string _parentFolder the name of the parent folder + * @param string _newSubFolder the name of the new subfolder + * @return xajax response + */ + function addFolder($_parentFolder, $_newSubFolder) + { + $parentFolder = $this->_decodeEntityFolderName($_parentFolder); + $parentFolder = ($parentFolder == '--topfolder--' ? '' : $parentFolder); + + $newSubFolder = translation::convert($_newSubFolder, $this->charset, 'UTF7-IMAP'); + + if($this->_debug) error_log("ajaxfelamimail::addFolder($parentFolder, $newSubFolder)"); + + $response = new xajaxResponse(); + + if($folderName = $this->bofelamimail->createFolder($parentFolder, $newSubFolder, true)) { + $parentFolder = $this->_encodeFolderName($parentFolder); + $folderName = $this->_encodeFolderName($folderName); + $newSubFolder = $this->_encodeDisplayFolderName($newSubFolder); + $response->addScript("tree.insertNewItem('$parentFolder','$folderName','$newSubFolder',onNodeSelect,'folderClosed.gif',0,0,'CHILD,CHECKED');"); + } + + $response->addAssign("newSubFolder", "value", ''); + + return $response->getXML(); + } + + function changeSorting($_sortBy) + { + if($this->_debug) error_log("ajaxfelamimail::changeSorting:".$_sortBy.'#'); + $this->sessionData['startMessage'] = 1; + + $oldSort = $this->sessionData['sort']; + + switch($_sortBy) { + case 'date': + $this->sessionData['sort'] = SORTDATE; + break; + case 'from': + $this->sessionData['sort'] = SORTFROM; + break; + case 'to': + $this->sessionData['sort'] = SORTTO; + break; + case 'size': + $this->sessionData['sort'] = SORTSIZE; + break; + case 'subject': + $this->sessionData['sort'] = SORTSUBJECT; + break; + } + + if($this->sessionData['sort'] == $oldSort) { + $this->sessionData['sortReverse'] = !$this->sessionData['sortReverse']; + } else { + $this->sessionData['sortReverse'] = false; + } + + $this->saveSessionData(); + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + /** + * removes any messages marked as delete from current folder + * + * @return xajax response + */ + function compressFolder() + { + if($this->_debug) error_log("ajaxfelamimail::compressFolder"); + $this->bofelamimail->restoreSessionData(); + $this->bofelamimail->compressFolder($this->sessionData['mailbox']); + + $bofilter = new felamimail_bofilter(); + + $sortResult = $this->bofelamimail->getSortedList( + $this->sessionData['mailbox'], + $this->sessionData['sort'], + $this->sessionData['sortReverse'], + $bofilter->getFilter($this->sessionData['activeFilter']) + ); + + if(!is_array($sortResult) || empty($sortResult)) { + $messageCounter = 0; + } else { + $messageCounter = count($sortResult); + } + + // $lastPage is the first message ID of the last page + $maxMessages = $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]; + if (isset($this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior']) && (int)$this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior'] > 0) + $maxMessages = (int)$this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior']; + + if($messageCounter > $maxMessages) { + $lastPage = $messageCounter - ($messageCounter % $maxMessages) + 1; + if($lastPage > $messageCounter) + $lastPage -= $maxMessages; + if($this->sessionData['startMessage'] > $lastPage) + $this->sessionData['startMessage'] = $lastPage; + } else { + $this->sessionData['startMessage'] = 1; + } + + $this->saveSessionData(); + $GLOBALS['egw']->session->commit_session(); + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + /** + * createACLTable + * creates the ACL table + * + * @param array $_acl array containing acl data + * + * @return string html output for ACL table + */ + function createACLTable($_acl) + { + $aclList = array('l','r','s','w','i','p','c','d','a'); + $aclShortCuts = array( 'custom' => 'custom', + 'lrs' => 'readable', + 'lrsp' => 'post', + 'lrsip' => 'append', + 'lrswipcd' => 'write', + 'lrswipcda' => 'all' + ); + + ksort($_acl); + + foreach($_acl as $accountAcl) { + $accountName = $accountAcl['USER']; + $row .= ''; + + $row .= ""; + + $row .= "$accountName"; + + foreach($aclList as $acl) { + $row .= ""; + } + + $selectFrom = html::select('identity', $accountAcl['RIGHTS'], $aclShortCuts, false, "id=\"predefinedFor_$accountName\" style='width: 100px;' onChange=\"xajax_doXMLHTTP('felamimail.ajaxfelamimail.updateACL','$accountName',this.value)\""); + + $row .= "$selectFrom"; + + $row .= ""; + } + + return "$row
 NameLRSWIPCDA 
"; + } + + function deleteACL($_aclData,$_recursive=false) + { + if($this->_debug) error_log("ajaxfelamimail::deleteACL".array2string($_aclData).' Recursively:'.array2string($_recursive)); + $response = new xajaxResponse(); + if(is_array($_aclData)) { + foreach($_aclData['accountName'] as $accountName) { + $data = $this->bofelamimail->deleteACL($this->sessionDataAjax['folderName'], $accountName, $_recursive); + } + + if ($folderACL = $this->bofelamimail->getIMAPACL($this->sessionDataAjax['folderName'])) { + $response->addAssign("aclTable", "innerHTML", $this->createACLTable($folderACL)); + } + } + return $response->getXML(); + } + + function deleteAttachment($_composeID, $_attachmentID) + { + if($this->_debug) error_log("ajaxfelamimail::deleteAttachment"); + $bocompose = CreateObject('felamimail.bocompose', $_composeID); + $bocompose->removeAttachment($_attachmentID); + + $response = new xajaxResponse(); + return $response->getXML(); + } + + function toggleEditor($_composeID, $_content ,$_mode) + { + $_content = utf8_decode($_content); + + if($this->_debug) error_log("ajaxfelamimail::toggleEditor->".$_mode.'->'.$_content); + $bocompose = CreateObject('felamimail.bocompose', $_composeID); + if($_mode == 'simple') { + if($this->_debug) error_log(__METHOD__.$_content); + #if (isset($GLOBALS['egw_info']['server']['enabled_spellcheck'])) $_mode = 'egw_simple_spellcheck'; + $this->sessionData['mimeType'] = 'html'; + // convert emailadresses presentet in angle brackets to emailadress only + $_content = str_replace(array("\r\n","\n","\r","
"),array("
","
","
","\r\n"),$_content); + $bocompose->replaceEmailAdresses($_content); + } else { + $this->sessionData['mimeType'] = 'text'; + if (stripos($_content,'
')!==false)
+				{
+					$contentArr = html::splithtmlByPRE($_content);
+					foreach ($contentArr as $k =>&$elem)
+					{
+						if (stripos($elem,'
')!==false) $elem = str_replace(array("\r\n","\n","\r"),array("
","
","
"),$elem); + } + $_content = implode('',$contentArr); + } + $_content = $bocompose->_getCleanHTML($_content); + //$_content = $bocompose->convertHTMLToText($_content); + $_content = translation::convertHTMLToText($_content,'ISO-8859-1',$stripcrl=false,$stripalltags=true); + } + if($this->_debug) error_log(__METHOD__.__LINE__.$_content); + $this->saveSessionData(); + + $response = new xajaxResponse(); + + $escaped = utf8_encode(str_replace(array("'", "\r", "\n"), array("\\'", "\\r", "\\n"), $_content)); + if ($_mode == 'simple') + $response->addScript("showHTMLEditor('$escaped');"); + else + $response->addScript("showPlainEditor('$escaped');"); + + return $response->getXML(); + } + + + /* + * delete a existing folder + * + * @param string _folderName the name of the folder to be deleted + * + * @return xajax response + */ + function deleteFolder($_folderName) + { + $folderName = $this->_decodeEntityFolderName($_folderName); + if($this->_debug) error_log("ajaxfelamimail::deleteFolder($_folderName)"); + $response = new xajaxResponse(); + + // don't delete this folders + if($folderName == 'INBOX' || $folderName == '--topfolder--') { + return $response->getXML(); + } + + if($this->bofelamimail->deleteFolder($folderName)) { + $folderName = $this->_encodeFolderName($folderName); + $response->addScript("tree.deleteItem('$folderName',1);"); + } + + return $response->getXML(); + } + + /* + * delete messages + * + * @param array _messageList list of UID's + * + * @return xajax response + */ + function deleteMessages($_messageList) + { + if($this->_debug) error_log(__METHOD__." called with Messages ".print_r($_messageList,true)); + $messageCount = 0; + if(is_array($_messageList) && count($_messageList['msg']) > 0) $messageCount = count($_messageList['msg']); + try + { + $this->bofelamimail->deleteMessages(($_messageList == 'all'? 'all':$_messageList['msg'])); + } + catch (egw_exception $e) + { + $error = str_replace('"',"'",$e->getMessage()); + $response = new xajaxResponse(); + $response->addScript('resetMessageSelect();'); + $response->addScript('tellUser("'.$error.'");'); + $response->addScript('onNodeSelect("'.$this->sessionData['mailbox'].'");'); + return $response->getXML(); + } + + + return $this->generateMessageList($this->sessionData['mailbox'],($_messageList=='all'?0:(-1*$messageCount))); + } + + function deleteSignatures($_signatures) + { + if($this->_debug) error_log("ajaxfelamimail::deleteSignatures"); + $signatures = explode(",",$_signatures); + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.felamimail_bosignatures.inc.php'); + $boSignatures = new felamimail_bosignatures(); + + $boSignatures->deleteSignatures($signatures); + unset($signatures); + $signatures = $boSignatures->getListOfSignatures(); + + $response = new xajaxResponse(); + $response->addAssign('signatureTable', 'innerHTML', $this->uiwidgets->createSignatureTable($signatures)); + return $response->getXML(); + } + + function changeActiveAccount($accountData) + { + if($this->_debug) error_log("ajaxfelamimail::changeActiveAccount"); + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.bopreferences.inc.php'); + $boPreferences = CreateObject('felamimail.bopreferences'); + $boPreferences->setProfileActive(false); + if ($accountData) $boPreferences->setProfileActive(true,$accountData); + + $response = new xajaxResponse(); + $response->addScript('refreshView();'); + return $response->getXML(); + } + + function deleteAccountData($accountIDs) + { + if($this->_debug) error_log("ajaxfelamimail::deleteAccountData"); + $accountData = explode(",",$accountIDs); + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.bopreferences.inc.php'); + $boPreferences = CreateObject('felamimail.bopreferences'); + $boPreferences->deleteAccountData($accountData); + $preferences =& $boPreferences->getPreferences(); + $allAccountData = $boPreferences->getAllAccountData($preferences); + foreach ((array)$allAccountData as $tmpkey => $accountData) + { + $identity =& $accountData['identity']; + foreach($identity as $key => $value) { + if(is_object($value) || is_array($value)) { + continue; + } + switch($key) { + default: + $tempvar[$key] = $value; + } + } + $accountArray[]=$tempvar; + } + $response = new xajaxResponse(); + $response->addAssign('userDefinedAccountTable', 'innerHTML', $this->uiwidgets->createAccountDataTable($accountArray)); + return $response->getXML(); + } + + /* + * empty trash folder + * + * @return xajax response + */ + function emptyTrash() + { + if($this->_debug) error_log("ajaxfelamimail::emptyTrash Folder:".$this->bofelamimail->mailPreferences->preferences['trashFolder']); + if(!empty($this->bofelamimail->mailPreferences->preferences['trashFolder'])) { + $this->bofelamimail->compressFolder($this->bofelamimail->mailPreferences->preferences['trashFolder']); + } + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + function extendedSearch($_filterID) + { + // start displaying at message 1 + $this->sessionData['startMessage'] = 1; + $this->sessionData['activeFilter'] = (int)$_filterID; + $this->saveSessionData(); + $GLOBALS['egw']->session->commit_session(); + + // generate the new messageview + return $this->generateMessageList($this->sessionData['mailbox']); + } + + /* + * flag messages as read, unread, flagged, ... + * + * @param string _flag name of the flag + * @param array _messageList list of UID's + * + * @return xajax response + */ + function flagMessages($_flag, $_messageList) + { + if($this->_debug) error_log(__METHOD__."->".$_flag.':'.print_r($_messageList,true)); + if ($_messageList=='all' || !empty($_messageList['msg'])) + { + $this->bofelamimail->flagMessages($_flag, ($_messageList=='all' ? 'all':$_messageList['msg'])); + } + else + { + if($this->_debug) error_log(__METHOD__."-> No messages selected."); + } + + // unset preview, as refresh would mark message again read + if ($_flag == 'unread' && in_array($this->sessionData['previewMessage'], $_messageList['msg'])) + { + unset($this->sessionData['previewMessage']); + $this->saveSessionData(); + } + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + function sendNotify ($_uid, $_ret) + { + if($this->_debug) error_log(__METHOD__." with $_uid,$_ret"); + $response = new xajaxResponse(); + if ($_ret==='true' || $_ret===1 || $_ret == "1,") { + if ( $this->bofelamimail->sendMDN($_uid) ) + $this->bofelamimail->flagMessages("mdnsent",array($_uid)); + } else { + $this->bofelamimail->flagMessages("mdnnotsent",array($_uid)); + } + return $response; + + } + + + function generateMessageList($_folderName,$modifyoffset=0) + { + if($this->_debug) error_log("ajaxfelamimail::generateMessageList with $_folderName,$modifyoffset".function_backtrace()); + $response = new xajaxResponse(); + $response->addScript("mail_cleanup()"); + $response->addScript("activeServerID=".$this->imapServerID.";"); + $response->addScript("activeFolder = \"".$_folderName."\";"); + $response->addScript("activeFolderB64 = \"".base64_encode($_folderName)."\";"); + $draftFolder = $this->bofelamimail->getDraftFolder(false); + $response->addScript("draftFolder = \"".($draftFolder?$draftFolder:'')."\";"); + $response->addScript("draftFolderB64 = \"".($draftFolder?base64_encode($draftFolder):'')."\";"); + $templateFolder = $this->bofelamimail->getTemplateFolder(false); + $response->addScript("templateFolder = \"".($templateFolder?$templateFolder:'')."\";"); + $response->addScript("templateFolderB64 = \"".($templateFolder?base64_encode($templateFolder):'')."\";"); + if($this->_connectionStatus === false) { + return $response->getXML(); + } + + $listMode = 0; + + $this->bofelamimail->restoreSessionData(); + //error_log($this->sessionData['previewMessage']); + if($this->bofelamimail->isSentFolder($_folderName) || + false !== in_array($_folderName,explode(',',$GLOBALS['egw_info']['user']['preferences']['felamimail']['messages_showassent_0']))) + { + $listMode = 1; + } elseif($this->bofelamimail->isDraftFolder($_folderName)) { + $listMode = 2; + } elseif($this->bofelamimail->isTemplateFolder($_folderName)) { + $listMode = 3; + } + + $maxMessages = $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]; + if (isset($this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior']) && (int)$this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior'] <> 0) + $maxMessages = (int)$this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior']; + //if ($this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior']==NULL) error_log(__METHOD__.__LINE__.' MailPreferences:'.array2string($this->bofelamimail->mailPreferences)); + $offset = $this->sessionData['startMessage']; + if($this->_debug) error_log("ajaxfelamimail::generateMessageList with $offset,$modifyoffset"); + if ($modifyoffset != 0 && ($offset+$modifyoffset)>0) $offset = $offset+$modifyoffset; + if($this->_debug) error_log("ajaxfelamimail::generateMessageList with offset: $offset PreviewMessage:".array2string($this->sessionData['previewMessage'])); + $headers = array(); + $headers['info']['total'] = 0; + $headers['info']['first'] = $offset; + $headers['info']['last'] = 0; + if($this->sessionData['previewMessage']) + { + $headers = $this->bofelamimail->getHeaders( + $_folderName, + $offset, + ($maxMessages>0?$maxMessages:1), + $this->sessionData['sort'], + $this->sessionData['sortReverse'], + (array)$this->sessionData['messageFilter'], + $this->sessionData['previewMessage'] + ); + if($this->_debug) error_log(__METHOD__.__LINE__." headers fetched:".array2string($headers)); + } + $rowsFetched = array(); + if($this->_debug) error_log(__METHOD__.__LINE__.' MaxMessages:'.$maxMessages.' Offset:'.$offset.' Filter:'.array2string($this->sessionData['messageFilter'])); + //error_log(__METHOD__.__LINE__.' Data:'.array2string($headers)); + $headerJs = $this->uiwidgets->get_grid_js($listMode,$_folderName,$rowsFetched,$offset,false,($maxMessages>=0?false:true)); + $headerTable = $this->uiwidgets->messageTable( + $headers, + $listMode, + $_folderName, + $GLOBALS['egw_info']['user']['preferences']['felamimail']['message_newwindow'], + $GLOBALS['egw_info']['user']['preferences']['felamimail']['rowOrderStyle'], + $this->sessionData['previewMessage'] + ); + if ($rowsFetched['messages']>0 && empty($headers['info']['total'])) + { + if($this->_debug) error_log(__METHOD__.__LINE__.' Rows fetched:'.array2string($rowsFetched).' Headers Info:'.array2string($headers['info'])); + $headers['info']['total'] = $rowsFetched['messages']; + //error_log(__METHOD__.__LINE__.' Cached FolderInfo:'.array2string($this->sessionData['folderStatus'][$this->imapServerID][$_folderName])); + if (empty($headers['info']['total'])) $headers['info']['total'] = $this->sessionData['folderStatus'][$this->imapServerID][$_folderName]['messages']; + if (empty($headers['info']['total'])) + { + $foldestatus = $this->bofelamimail->getMailBoxCounters($_folderName); + $headers['info']['total'] = $foldestatus->messages; + } + $headers['info']['first'] = $offset; + $headers['info']['last'] = $offset+$rowsFetched['rowsFetched']-1; + } + if($this->_debug) error_log(__METHOD__.__LINE__.' Rows fetched:'.array2string($rowsFetched)); + //error_log(__METHOD__.__LINE__.' HeaderJS:'.$headerJs); + //error_log(__METHOD__.__LINE__.' HeaderTable:'.$headerTable); + $firstMessage = (int)$headers['info']['first']; + $lastMessage = (int)$headers['info']['last']; + $totalMessage = (int)$headers['info']['total']; + if ((int)$maxMessages<0) $totalMessage = $rowsFetched['messages']; + $shortName = ''; + if($folderStatus = $this->bofelamimail->getFolderStatus($_folderName)) { + $shortName =$folderStatus['shortDisplayName']; + } + if($totalMessage == 0) { + $response->addAssign("messageCounter", "innerHTML", ''.$shortName.': '.lang('no messages found...')); + } else { + $response->addAssign("messageCounter", "innerHTML", ''.$shortName.': '.lang('Viewing messages').($maxMessages>0?" $firstMessage - $lastMessage":"")." ($totalMessage ".lang("total").')'); + } + + $response->addAssign("divMessageList", "innerHTML", $headerJs.$headerTable); + $response->addAssign("skriptGridOnFirstLoad","innerHTML",""); + + if($quota = $this->bofelamimail->getQuotaRoot()) { + if (isset($quota['usage']) && $quota['limit'] != 'NOT SET') + { + $quotaDisplay = $this->uiwidgets->quotaDisplay($quota['usage'], $quota['limit']); + $response->addAssign('quotaDisplay', 'innerHTML', $quotaDisplay); + } + } + + if($folderStatus = $this->bofelamimail->getFolderStatus($_folderName)) { + if($folderStatus['unseen'] > 0) { + $response->addScript("egw_topWindow().tree.setItemText('$_folderName', '". $folderStatus['shortDisplayName'] ." (". $folderStatus['unseen'] .")');"); + } else { + $response->addScript("egw_topWindow().tree.setItemText('$_folderName', '". $folderStatus['shortDisplayName'] ."');"); + } + } + + if(!empty($GLOBALS['egw_info']['user']['preferences']['felamimail']['trashFolder']) && + $GLOBALS['egw_info']['user']['preferences']['felamimail']['trashFolder'] != 'none' ) { + $folderStatus = $this->bofelamimail->getFolderStatus($GLOBALS['egw_info']['user']['preferences']['felamimail']['trashFolder']); + if($folderStatus['unseen'] > 0) { + $response->addScript("egw_topWindow().tree.setItemText('". $GLOBALS['egw_info']['user']['preferences']['felamimail']['trashFolder'] ."', '". $folderStatus['shortDisplayName'] ." (". $folderStatus['unseen'] .")');"); + } else { + $response->addScript("egw_topWindow().tree.setItemText('". $GLOBALS['egw_info']['user']['preferences']['felamimail']['trashFolder'] ."', '". $folderStatus['shortDisplayName'] ."');"); + } + } + + $response->addScript("egw_topWindow().tree.selectItem('".$_folderName. "',false);"); + + if($this->_debug) error_log('generateMessageList done'); + if ($this->sessionData['previewMessage']>0) + { + $response->addScript('mail_focusGridElement('.$this->sessionData['previewMessage'].');'); + } + else + { + $response->addScript('mail_focusGridElement();'); + } + $response->addScript('if (typeof handleResize != "undefined") handleResize();'); + + return $response->getXML(); + } + + function getFolderInfo($_folderName) + { + if($this->_debug) error_log("ajaxfelamimail::getFolderInfo($_folderName)"); + $folderName = html_entity_decode($_folderName, ENT_QUOTES, $this->charset); + + if($folderName != '--topfolder--' && $folderStatus = $this->bofelamimail->getFolderStatus($folderName)) { + $response = new xajaxResponse(); + + if($this->sessionDataAjax['oldFolderName'] == '--topfolder--') { + $this->sessionDataAjax['oldFolderName'] = ''; + } + // only folders with LATT_NOSELECT not set, can have subfolders + // seem to work only for uwimap + #if($folderStatus['attributes'] & LATT_NOSELECT) { + $response->addScript("document.getElementById('newSubFolder').disabled = false;"); + #} else { + # $response->addScript("document.getElementById('newSubFolder').disabled = true;"); + #} + + $this->sessionDataAjax['folderName'] = $folderName; + $this->saveSessionData(); + $hasChildren=false; + if ($folderStatus['attributes'][0]=="\\HasChildren") $hasChildren=true; + if(strtoupper($folderName) != 'INBOX') { + $response->addAssign("newMailboxName", "value", htmlspecialchars($folderStatus['shortDisplayName'], ENT_QUOTES, $this->charset)); + $response->addAssign("newMailboxMoveName", "value", htmlspecialchars($folderStatus['displayName'], ENT_QUOTES, $this->charset)); + $response->addScript("document.getElementById('mailboxRenameButton').disabled = false;"); + $response->addScript("document.getElementById('newMailboxName').disabled = false;"); + $response->addScript("document.getElementById('divDeleteButton').style.visibility = 'visible';"); + $response->addScript("document.getElementById('divRenameButton').style.visibility = 'visible';"); + // if the folder has children, we dont want to move it, since we dont handle the subscribing to subfolders after moving the folder + $response->addScript("document.getElementById('divMoveButton').style.visibility = ".($hasChildren ? "'hidden'" : "'visible'").";"); + $response->addScript("document.getElementById('newMailboxMoveName').disabled = ".($hasChildren ? "true" : "false").";"); + $response->addScript("document.getElementById('aMoveSelectFolder').style.visibility = ".($hasChildren ? "'hidden'" : "'visible'").";"); + } else { + $response->addAssign("newMailboxName", "value", ''); + $response->addAssign("newMailboxMoveName", "value", ''); + $response->addScript("document.getElementById('mailboxRenameButton').disabled = true;"); + $response->addScript("document.getElementById('newMailboxName').disabled = true;"); + $response->addScript("document.getElementById('divDeleteButton').style.visibility = 'hidden';"); + $response->addScript("document.getElementById('divRenameButton').style.visibility = 'hidden';"); + $response->addScript("document.getElementById('divMoveButton').style.visibility = 'hidden';"); + $response->addScript("document.getElementById('newMailboxMoveName').disabled = true;"); + $response->addScript("document.getElementById('aMoveSelectFolder').style.visibility = 'hidden';"); + } + $response->addAssign("folderName", "innerHTML", htmlspecialchars($folderStatus['displayName'], ENT_QUOTES, $this->charset)); + if($folderACL = $this->bofelamimail->getIMAPACL($folderName)) { + $response->addAssign("aclTable", "innerHTML", $this->createACLTable($folderACL)); + } + + return $response->getXML(); + } else { + $this->sessionDataAjax['oldFolderName'] = $folderName; + $this->saveSessionData(); + + $response = new xajaxResponse(); + $response->addAssign("newMailboxName", "value", ''); + $response->addAssign("folderName", "innerHTML", ''); + $response->addScript("document.getElementById('newMailboxName').disabled = true;"); + $response->addScript("document.getElementById('mailboxRenameButton').disabled = true;"); + $response->addScript("document.getElementById('divDeleteButton').style.visibility = 'hidden';"); + $response->addScript("document.getElementById('divRenameButton').style.visibility = 'hidden';"); + $response->addAssign("aclTable", "innerHTML", ''); + return $response->getXML(); + } + } + + function gotoStart() + { + if($this->_debug) error_log("ajaxfelamimail::gotoStart"); + $this->sessionData['startMessage'] = 1; + $this->saveSessionData(); + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + function jumpEnd() + { + if($this->_debug) error_log("ajaxfelamimail::jumpEnd"); + $sortedList = $this->bofelamimail->getSortedList( + $this->sessionData['mailbox'], + $this->sessionData['sort'], + $this->sessionData['sortReverse'], + (array)$this->sessionData['messageFilter'] + ); + $messageCounter = count($sortedList); + + $maxMessages = $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]; + if (isset($this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior']) && (int)$this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior'] > 0) + $maxMessages = (int)$this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior']; + + $lastPage = $messageCounter - ($messageCounter % $maxMessages) + 1; + if($lastPage > $messageCounter) + $lastPage -= $maxMessages; + + $this->sessionData['startMessage'] = $lastPage; + + $this->saveSessionData(); + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + function jumpStart() + { + if($this->_debug) error_log("ajaxfelamimail::jumpStart"); + $this->sessionData['startMessage'] = 1; + $this->saveSessionData(); + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + /* + * move messages to another folder + * + * @param string _folder name of the target folder + * @param array _selectedMessages UID's of the messages to move + * + * @return xajax response + */ + function moveMessages($_folderName, $_selectedMessages) + { + if($this->_debug) error_log(__METHOD__." move to $_folderName called with Messages ".print_r($_selectedMessages,true)); + $messageCount = 0; + if(is_array($_selectedMessages) && count($_selectedMessages['msg']) > 0) $messageCount = count($_selectedMessages['msg']); + $folderName = $this->_decodeEntityFolderName($_folderName); + if ($_selectedMessages == 'all' || !empty( $_selectedMessages['msg']) && !empty($folderName)) { + if ($this->sessionData['mailbox'] != $folderName) { + try + { + $this->bofelamimail->moveMessages($folderName, ($_selectedMessages == 'all'? null:$_selectedMessages['msg'])); + } + catch (egw_exception $e) + { + $error = str_replace('"',"'",$e->getMessage()); + $response = new xajaxResponse(); + $response->addScript('resetMessageSelect();'); + $response->addScript('tellUser("'.$error.' '.lang('Folder').':'.'","'.$_folderName.'");'); + $response->addScript('onNodeSelect("'.$this->sessionData['mailbox'].'");'); + return $response->getXML(); + } + } else { + if($this->_debug) error_log("ajaxfelamimail::moveMessages-> same folder than current selected"); + } + if($this->_debug) error_log(__METHOD__." Rebuild MessageList for Folder:".$this->sessionData['mailbox']); + return $this->generateMessageList($this->sessionData['mailbox'],($_selectedMessages == 'all'?0:(-1*$messageCount))); + } else { + $response = new xajaxResponse(); + $response->addScript('resetMessageSelect();'); + $response->addScript('tellUser("'.lang('No messages selected, or lost selection. Changing to folder ').'","'.$_folderName.'");'); + $response->addScript('onNodeSelect("'.$_folderName.'");'); + return $response->getXML(); + + } + } + + /* + * copy messages to another folder + * + * @param string _folder name of the target folder + * @param array _selectedMessages UID's of the messages to copy + * + * @return xajax response + */ + function copyMessages($_folderName, $_selectedMessages) + { + if($this->_debug) error_log(__METHOD__." called with Messages ".print_r($_selectedMessages,true)); + $messageCount = 0; + $error = false; + if(is_array($_selectedMessages) && count($_selectedMessages['msg']) > 0) $messageCount = count($_selectedMessages['msg']); + $folderName = $this->_decodeEntityFolderName($_folderName); + if ($_selectedMessages == 'all' || !empty( $_selectedMessages['msg']) && !empty($folderName)) { + if ($this->sessionData['mailbox'] != $folderName) + { + $deleteAfterMove = false; + try + { + $this->bofelamimail->moveMessages($folderName, ($_selectedMessages == 'all'? null:$_selectedMessages['msg']),$deleteAfterMove); + } + catch (egw_exception $e) + { + $error = str_replace('"',"'",$e->getMessage()); + $response = new xajaxResponse(); + $response->addScript('resetMessageSelect();'); + $response->addScript('tellUser("'.$error.' '.lang('Folder').':'.'","'.$_folderName.'");'); + $response->addScript('onNodeSelect("'.$this->sessionData['mailbox'].'");'); + return $response->getXML(); + } + } + else + { + if($this->_debug) error_log("ajaxfelamimail::copyMessages-> same folder than current selected"); + } + + return $this->generateMessageList($this->sessionData['mailbox'],($_selectedMessages == 'all'?0:(-1*$messageCount))); + } else { + $response = new xajaxResponse(); + $response->addScript('resetMessageSelect();'); + $response->addScript('tellUser("'.lang('No messages selected, or lost selection. Changing to folder ').'","'.$_folderName.'");'); + $response->addScript('onNodeSelect("'.$_folderName.'");'); + return $response->getXML(); + + } + } + + function quickSearch($_searchType, $_searchString, $_status) + { + // save the filter + $bofilter = new felamimail_bofilter(); + + $filter['filterName'] = lang('Quicksearch'); + $filter['type'] = $_searchType; + $filter['string'] = str_replace('"','\"', str_replace('\\','\\\\',$_searchString)); + $filter['status'] = $_status; + + $this->sessionData['messageFilter'] = $filter; + + $this->sessionData['startMessage'] = 1; + + $this->saveSessionData(); + + // generate the new messageview + return $this->generateMessageList($this->sessionData['mailbox']); + } + + function refreshMessagePreview($_messageID,$_folderType) + { + if ($this->_debug) error_log(__METHOD__.__LINE__.' MessageId:'.$_messageID.', FolderType:'.$_folderType); + $this->bofelamimail->restoreSessionData(); + $headerData = $this->bofelamimail->getHeaders( + $this->sessionData['mailbox'], + 0, + 0, + '', + '', + '', + $_messageID + ); + $headerData = $headerData['header'][0]; + //error_log(__METHOD__.__LINE__.print_r($headerData,true)); + foreach ($headerData as $key => $val) + { + if (is_array($val)) + { + foreach($val as $ik => $ival) + { + //error_log(__METHOD__.__LINE__.print_r($ival,true)); + if (is_array($ival)) + { + foreach($ival as $jk => $jval) + { + $headerData[$key][$ik][$jk] = felamimail_bo::htmlentities($jval); + } + } + else + { + $headerData[$key][$ik] = felamimail_bo::htmlentities($ival); + } + } + } + else + { + $headerData[$key] = felamimail_bo::htmlentities($val); + } + } + $headerData['subject'] = $this->bofelamimail->decode_subject($headerData['subject'],false); + $this->sessionData['previewMessage'] = $headerData['uid']; + $this->saveSessionData(); + //error_log(__METHOD__.__LINE__.print_r($headerData,true)); + $response = new xajaxResponse(); + $response->addScript("document.getElementById('messageCounter').innerHTML =MessageBuffer;"); + //$response->addScript("document.getElementById('messageCounter').innerHTML ='';"); + $response->addScript("fm_previewMessageID=".$headerData['uid'].";"); + $response->addAssign('spanMessagePreview', 'innerHTML', $this->uiwidgets->updateMessagePreview($headerData,$_folderType, $this->sessionData['mailbox'],$this->imapServerID)); + $response->addScript('if (typeof handleResize != "undefined") handleResize();'); + + // Also refresh the folder status + $this->refreshFolder($response); + + return $response->getXML(); + } + + function refreshMessageList() + { + return $this->generateMessageList($this->sessionData['mailbox']); + } + + function refreshFolder($injectIntoResponse = false) + { + if ($this->_debug) error_log("ajaxfelamimail::refreshFolder"); + $GLOBALS['egw']->session->commit_session(); + + if (!$injectIntoResponse) + { + $response = new xajaxResponse(); + } + else + { + $response = $injectIntoResponse; + } + + if ($this->_connectionStatus === true) { + $folderName = $this->sessionData['mailbox']; + //error_log(array2string($this->bofelamimail->getFolderStatus($folderName))); + if ($folderStatus = $this->bofelamimail->getFolderStatus($folderName)) { + if ($folderStatus['unseen'] > 0) { + $response->addScript("egw_topWindow().tree.setItemText('$folderName', '". $folderStatus['shortDisplayName'] ." (". $folderStatus['unseen'] .")');"); + } else { + $response->addScript("egw_topWindow().tree.setItemText('$folderName', '". $folderStatus['shortDisplayName'] ."');"); + } + } + } + + if (!$injectIntoResponse) + { + return $response->getXML(); + } + } + + function refreshFolderList($activeFolderList ='') + { + if ($this->_debug) error_log("ajaxfelamimail::refreshFolderList with folders:".$activeFolderList); + if ($activeFolderList != '') $activeFolders = explode('#,#',$activeFolderList); + $GLOBALS['egw']->session->commit_session(); + + $response = new xajaxResponse(); + if(!($this->_connectionStatus === true)) $this->_connectionStatus = $this->bofelamimail->openConnection($this->imapServerID); + if($this->_connectionStatus === true) { + //error_log("connected"); + if (is_array($activeFolders)) { + foreach ($activeFolders as $key => $name) { + //error_log($key."=>".$name); + switch($name) { + case "0": break; + case "--topfolder--": break; + default: + $folders[html_entity_decode($name,ENT_COMPAT)] = $name; + //error_log("check folder $name"); + } + } + if (!(is_array($folders) && count($folders)>0)) $folders = $this->bofelamimail->getFolderObjects(true); + } else { + //error_log("check/get all folders"); + $folders = $this->bofelamimail->getFolderObjects(true); + } + foreach($folders as $folderName => $folderData) { + //error_log(__METHOD__.__LINE__."checking $folderName -> ".array2string($this->bofelamimail->getFolderStatus($folderName))); + if($folderStatus = $this->bofelamimail->getFolderStatus($folderName)) { + if($folderStatus['unseen'] > 0) { + $response->addScript("egw_topWindow().tree.setItemText('".@htmlspecialchars($folderName,ENT_QUOTES, felamimail_bo::$displayCharset,false)."', '". $folderStatus['shortDisplayName'] ." (". $folderStatus['unseen'] .")');"); + } else { + $response->addScript("egw_topWindow().tree.setItemText('".@htmlspecialchars($folderName,ENT_QUOTES, felamimail_bo::$displayCharset,false)."', '". $folderStatus['shortDisplayName'] ."');"); + } + } + } + } + + return $response->getXML(); + + } + + function refreshSignatureTable() + { + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.felamimail_bosignatures.inc.php'); + $boSignatures = new felamimail_bosignatures(); + $signatures = $boSignatures->getListOfSignatures(); + + $response = new xajaxResponse(); + $response->addAssign('signatureTable', 'innerHTML', $this->uiwidgets->createSignatureTable($signatures)); + return $response->getXML(); + } + + function refreshAccountDataTable() + { + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.bopreferences.inc.php'); + $boPreferences = CreateObject('felamimail.bopreferences'); + $preferences =& $boPreferences->getPreferences(); + $allAccountData = $boPreferences->getAllAccountData($preferences); + foreach ($allAccountData as $tmpkey => $accountData) + { + $identity =& $accountData['identity']; + foreach($identity as $key => $value) { + if(is_object($value) || is_array($value)) { + continue; + } + switch($key) { + default: + $tempvar[$key] = $value; + } + } + $accountArray[]=$tempvar; + } + $response = new xajaxResponse(); + $response->addAssign('userDefinedAccountTable', 'innerHTML', $this->uiwidgets->createAccountDataTable($accountArray)); + return $response->getXML(); + } + + function reloadImportMail($_importID) + { + //error_log(__METHOD__.__LINE__.'called'); + $bocompose = CreateObject('felamimail.bocompose', $_importID); + foreach((array)$bocompose->sessionData['attachments'] as $id => $attachment) { + switch(strtoupper($attachment['type'])) { + case 'MESSAGE/RFC822': + //error_log(__METHOD__.__LINE__.array2string($attachment)); + break; + } + } + + $response = new xajaxResponse(); + $response->addAssign('addFileName', 'value', $attachment['name']); + $response->addScript("document.fileUploadForm.submit();"); + return $response->getXML(); + } + + function reloadAttachments($_composeID) + { + $bocompose = CreateObject('felamimail.bocompose', $_composeID); + $tableRows = array(); + $table = ''; + $imgClearLeft = $GLOBALS['egw']->common->image('felamimail','clear_left'); + + foreach((array)$bocompose->sessionData['attachments'] as $id => $attachment) { + switch(strtoupper($attachment['type'])) { + case 'MESSAGE/RFC822': + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.display', + 'uid' => $attachment['uid'], + 'part' => $attachment['partID'] + ); + $windowName = 'displayMessage_'; + $att_link = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',700,egw_getWindowOuterHeight()); return false;"; + + break; + + case 'IMAGE/JPEG': + case 'IMAGE/PNG': + case 'IMAGE/GIF': + default: + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.getAttachment', + 'attID' => $id, + '_composeID' => $_composeID, + ); + $windowName = 'displayAttachment_'; + $att_link = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',800,600);"; + + break; + } + $tempArray = array ( + '1' => ''. $attachment['name'] .'', '.1' => 'width="40%"', + '2' => mime_magic::mime2label($attachment['type']), + '3' => egw_vfs::hsize($attachment['size']), '.3' => "style='text-align:right;'", + '4' => ' ', '.4' => 'width="10%"', + '5' => "" + ); + $tableRows[] = $tempArray; + } + + if(count($tableRows) > 0) { + $table = html::table($tableRows, "style='width:100%'"); + } + + $response = new xajaxResponse(); + $response->addAssign('divAttachments', 'innerHTML', $table); + return $response->getXML(); + } + + /* + * rename a folder + * + * @param string _folder name of the target folder + * @param array _selectedMessages UID's of the messages to move + * + * @return xajax response + */ + function renameFolder($_oldFolderName, $_parentFolder, $_folderName) + { + if($this->_debug) error_log("ajaxfelamimail::renameFolder called as ($_oldFolderName, $_parentFolder, $_folderName)"); + $oldFolderName = $this->_decodeEntityFolderName($_oldFolderName); + $folderName = translation::convert($this->_decodeEntityFolderName($_folderName), $this->charset, 'UTF7-IMAP'); + $parentFolder = $this->_decodeEntityFolderName($_parentFolder); + $parentFolder = ($_parentFolder == '--topfolder--' ? '' : $parentFolder); + if($this->_debug) error_log("ajaxfelamimail::renameFolder work with ($oldFolderName, $parentFolder, $folderName)"); + + $response = new xajaxResponse(); + if(strtoupper($_oldFolderName) != 'INBOX' ) { + if($newFolderName = $this->bofelamimail->renameFolder($oldFolderName, $parentFolder, $folderName)) { + //enforce the subscription to the newly named server, as it seems to fail for names with umlauts + $rv = $this->bofelamimail->subscribe($newFolderName, true); + $newFolderName = $this->_encodeFolderName($newFolderName); + $folderName = $this->_encodeDisplayFolderName($folderName); + if ($parentFolder == '') { + #$folderStatus = $this->bofelamimail->getFolderStatus($newFolderName); + $HierarchyDelimiter = $this->bofelamimail->getHierarchyDelimiter(); + #if($this->_debug) error_log("ajaxfelamimail::renameFolder Status of new Folder:".print_r($folderStatus,true)); + if($this->_debug) error_log("ajaxfelamimail::rename/move Folder($newFolderName, $folderName)"); + $buffarray = explode($HierarchyDelimiter, $newFolderName); + $folderName = $this->_encodeDisplayFolderName( $this->_decodeEntityFolderName(array_pop($buffarray))); + $_parentFolder = $parentFolder = implode($HierarchyDelimiter,$buffarray); + if($this->_debug) error_log("ajaxfelamimail::renameFolder insert new ITEM $folderName at $_parentFolder"); + #$hasChildren = false; + #if ($folderStatus['attributes'][0]=="\\HasChildren") $hasChildren=true; + } + $response->addScript("window.tree.deleteItem('$_oldFolderName',0);"); + $response->addScript("window.tree.insertNewItem('$_parentFolder','$newFolderName','$folderName',onNodeSelect,'MailFolderPlain.png',0,0,'CHILD,CHECKED,SELECT,CALL');"); + } + } + return $response->getXML(); + } + + function saveSessionData() + { + $GLOBALS['egw']->session->appsession('ajax_session_data','felamimail',$this->sessionDataAjax); + $GLOBALS['egw']->session->appsession('session_data','felamimail',$this->sessionData); + } + + function saveSignature($_mode, $_id, $_description, $_signature, $_isDefaultSignature) + { + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.felamimail_bosignatures.inc.php'); + + $boSignatures = new felamimail_bosignatures(); + + $isDefaultSignature = ($_isDefaultSignature == 'true' ? true : false); + + $signatureID = $boSignatures->saveSignature($_id, $_description, $_signature, $isDefaultSignature); + + $response = new xajaxResponse(); + + if($_mode == 'save') { + #$response->addAssign('signatureID', 'value', $signatureID); + $response->addScript("opener.fm_refreshSignatureTable()"); + $response->addScript("document.getElementById('signatureDesc').focus();window.close();"); + } else { + $response->addScript("opener.fm_refreshSignatureTable()"); + $response->addAssign('signatureID', 'value', $signatureID); + } + + return $response->getXML(); + } + + function setComposeSignature($identity) + { + $boPreferences = CreateObject('felamimail.bopreferences'); + $preferences =& $boPreferences->getPreferences(); + $Identities = $preferences->getIdentity($identity); + //error_log(print_r($Identities->signature,true)); + + $response = new xajaxResponse(); + $response->addScript('setSignature('.$Identities->signature.');'); + + return $response->getXML(); + } + + function changeComposeSignature($_composeID,$_oldSig,$_signatureID,$_currentMode,$_content) + { + // we need a lot of encoding/decoding transforming here to get at least some acceptable result + // the changing does not work with all sigs, as the old Signature may not match the Signaturepart in Content + + if($this->_debug) error_log(__METHOD__.$_oldSig.','.$_signatureID.'#'); + $bocompose = CreateObject('felamimail.bocompose', $_composeID); + // prepare signatures, the selected sig may be used on top of the body + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.felamimail_bosignatures.inc.php'); + $boSignatures = new felamimail_bosignatures(); + $oldSignature = $boSignatures->getSignature($_oldSig); + $oldSigText = $oldSignature->fm_signature; + $signature = $boSignatures->getSignature($_signatureID); + $sigText = $signature->fm_signature; + + if ($_currentMode == 'plain') + { + $oldSigText = $bocompose->convertHTMLToText($oldSigText); + $sigText = $bocompose->convertHTMLToText($sigText); + $_content = utf8_decode($_content); + if($this->_debug) error_log(__METHOD__." Old signature:".$oldSigText); + } + + $oldSigText = felamimail_bo::merge($oldSigText,array($GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id'))); + $sigText = felamimail_bo::merge($sigText,array($GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id'))); + $oldSigText = str_replace(array("\r","\t","
\n",": "),array("","","
",":"),($_currentMode == 'html'?html::purify($oldSigText):$oldSigText)); + $_content = str_replace(array("\r","\t","
\n",": "),array("","","
",":"),($_currentMode == 'html'?html::purify($_content):$_content)); + $found = strpos($_content,trim($oldSigText)); + if ($found !== false && $_oldSig != -2 && !(empty($oldSigText) || trim($bocompose->convertHTMLToText($oldSigText)) =='')) + { + $_content = substr_replace($_content,$sigText,$found,mb_strlen($oldSigText)); + } + if ($_oldSig == -2 && (empty($oldSigText) || trim($bocompose->convertHTMLToText($oldSigText)) =='')) + { + // if there is no sig selected, there is no way to replace a signature + } + if ($found === false) + { + if($this->_debug) error_log(__METHOD__." Old Signature failed to match:".$oldSigText); + if($this->_debug) error_log(__METHOD__." Compare content:".$_content); + } + $response = new xajaxResponse(); + if ($_currentMode == 'html') $_content = utf8_decode($_content); + $escaped = utf8_encode(str_replace(array("'", "\r", "\n"), array("\\'", "\\r", "\\n"), $_content)); + //error_log(__METHOD__.$escaped); + if ($_currentMode == 'html') + $response->addScript("showHTMLEditor('$escaped');"); + else + $response->addScript("showPlainEditor('$escaped');"); + /* + if ($found===false) + { + $warning = lang("Switching of Signatures failed"); + $response->addScript('alert('.$warning.');'); + } + */ + return $response->getXML(); + } + + function searchAddress($_searchString) + { + $contacts = $GLOBALS['egw']->contacts->search(array( + 'n_fn' => $_searchString, + 'email' => $_searchString, + 'email_home' => $_searchString, + ),array('n_fn','email','email_home'),'n_fn','','%',false,'OR',array(0,20)); + + $response = new xajaxResponse(); + + if(is_array($contacts)) { + $innerHTML = ''; + $jsArray = array(); + $i = 0; + + foreach($contacts as $contact) { + foreach(array($contact['email'],$contact['email_home']) as $email) { + if(!empty($email) && !isset($jsArray[$email])) { + $i++; + $str = translation::convert(trim($contact['n_fn'] ? $contact['n_fn'] : $contact['fn']).' <'.trim($email).'>',$this->charset,'utf-8'); + $innerHTML .= '
'. + htmlentities($str, ENT_QUOTES, 'utf-8').'
'; + $jsArray[$email] = addslashes($str); + } + if ($i > 10) break; // we check for # of results here, as we might have empty email addresses + } + } + + if($jsArray) { + $response->addAssign('resultBox', 'innerHTML', $innerHTML); + $response->addScript('results = new Array("'.implode('","',$jsArray).'");'); + $response->addScript('displayResultBox();'); + } + //$response->addScript("getResults();"); + //$response->addScript("selectSuggestion(-1);"); + } else { + $response->addAssign('resultBox', 'className', 'resultBoxHidden'); + } + return $response->getXML(); + } + + function skipForward() + { + $sortedList = $this->bofelamimail->getSortedList( + $this->sessionData['mailbox'], + $this->sessionData['sort'], + $this->sessionData['sortReverse'], + (array)$this->sessionData['messageFilter'] + ); + $messageCounter = count($sortedList); + // $lastPage is the first message ID of the last page + $maxMessages = $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]; + if (isset($this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior']) && (int)$this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior'] > 0) + $maxMessages = (int)$this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior']; + + if($messageCounter > $maxMessages) { + $lastPage = $messageCounter - ($messageCounter % $maxMessages) + 1; + if($lastPage > $messageCounter) { + $lastPage -= $maxMessages; + } + $this->sessionData['startMessage'] += $maxMessages; + if($this->sessionData['startMessage'] > $lastPage) { + $this->sessionData['startMessage'] = $lastPage; + } + } else { + $this->sessionData['startMessage'] = 1; + } + + $this->saveSessionData(); + + $response = $this->generateMessageList($this->sessionData['mailbox']); + + return $response; + } + + function skipPrevious() + { + + $maxMessages = $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]; + if (isset($this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior']) && (int)$this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior'] > 0) + $maxMessages = (int)$this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior']; + + $this->sessionData['startMessage'] -= $maxMessages; + if($this->sessionData['startMessage'] < 1) { + $this->sessionData['startMessage'] = 1; + } + $this->saveSessionData(); + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + + /** + * updateACL + * updates all ACLs for a single user and returns the updated the acl table + * it will do nothing on $_acl == 'custom' + * + * @param string $_user user to modify acl entries + * @param string $_acl new acl list + * + * @return string ajax xml response + */ + function updateACL($_user, $_acl) + { + //error_log(__METHOD__.__LINE__." called with: $_user, $_acl"); + // not sure this one is used / called anymore + if ($_acl == 'custom') { + $response = new xajaxResponse(); + return $response->getXML(); + } + $_recursive=false; + $_folderName = $this->sessionDataAjax['folderName']; + $result = $this->bofelamimail->setACL($_folderName, $_user, $_acl, $_recursive); + if ($result && $folderACL = $this->bofelamimail->getIMAPACL($_folderName)) { + return $this->updateACLView(); + } + + $response = new xajaxResponse(); + // add error message + // $response->add??? + return $response->getXML(); + } + + + /** + * updateACLView + * updates the ACL view table + * + * @return string ajax xml response containing new ACL table + */ + function updateACLView() + { + $response = new xajaxResponse(); + if($folderACL = $this->bofelamimail->getIMAPACL($this->sessionDataAjax['folderName'])) { + $response->addAssign("aclTable", "innerHTML", $this->createACLTable($folderACL)); + } + return $response->getXML(); + } + + /** + * subscribe/unsubribe from/to a folder + */ + function updateFolderStatus($_folderName, $_status) + { + $folderName = $this->_decodeEntityFolderName($_folderName); + $status = (bool)$_status; + + $this->bofelamimail->subscribe($folderName, $status); + + $response = new xajaxResponse(); + return $response->getXML(); + } + + // remove html entities + function _decodeEntityFolderName($_folderName) + { + return html_entity_decode($_folderName, ENT_QUOTES, $this->charset); + } + + function updateMessageView($_folderName) + { + $folderName = $this->_decodeEntityFolderName($_folderName); + if($this->_debug) error_log("ajaxfelamimail::updateMessageView $folderName $this->charset"); + + $this->sessionData['mailbox'] = $folderName; + $this->sessionData['startMessage'] = 1; + $this->saveSessionData(); + + $messageList = $this->generateMessageList($folderName); + + $this->bofelamimail->closeConnection(); + + return $messageList; + } + + function updateSingleACL($_accountName, $_aclType, $_aclStatus, $_recursive=false) + { + $response = new xajaxResponse(); + //$_recursive=false; + $data = $this->bofelamimail->updateSingleACL($this->sessionDataAjax['folderName'], $_accountName, $_aclType, $_aclStatus, $_recursive); + return $response->getXML(); + } + + function xajaxFolderInfo($_formValues) + { + $response = new xajaxResponse(); + + $response->addAssign("field1", "value", $_formValues['num1']); + $response->addAssign("field2", "value", $_formValues['num2']); + $response->addAssign("field3", "value", $_formValues['num1'] * $_formValues['num2']); + + return $response->getXML(); + } + + function _encodeFolderName($_folderName) + { + $folderName = htmlspecialchars($_folderName, ENT_QUOTES, $this->charset); + + $search = array('\\'); + $replace = array('\\\\'); + + return str_replace($search, $replace, $folderName); + } + + function _encodeDisplayFolderName($_folderName) + { + $folderName = translation::convert($_folderName, 'UTF7-IMAP', $this->charset); + $folderName = htmlspecialchars($folderName, ENT_QUOTES, $this->charset); + + $search = array('\\'); + $replace = array('\\\\'); + + return str_replace($search, $replace, $folderName); + } + +} +?> diff --git a/felamimail/inc/class.bocompose.inc.php b/felamimail/inc/class.bocompose.inc.php new file mode 100644 index 0000000000..472aa5bf2d --- /dev/null +++ b/felamimail/inc/class.bocompose.inc.php @@ -0,0 +1,1202 @@ + True, + 'action' => True + ); + + var $attachments; // Array of attachments + var $preferences; // the prefenrences(emailserver, username, ...) + var $preferencesArray; + var $bofelamimail; + var $bopreferences; + var $bosignatures; + var $displayCharset; + + function bocompose($_composeID = '', $_charSet = 'iso-8859-1') + { + $profileID = 0; + if (isset($GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID'])) + $profileID = (int)$GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID']; + $this->displayCharset = strtolower($_charSet); + $this->bosignatures = new felamimail_bosignatures(); + $this->bofelamimail = felamimail_bo::getInstance(true,$profileID); + $this->bopreferences =& $this->bofelamimail->bopreferences; + $this->preferences =& $this->bofelamimail->mailPreferences; // $this->bopreferences->getPreferences(); + // we should get away from this $this->preferences->preferences should hold the same info + $this->preferencesArray =& $this->preferences->preferences; //$GLOBALS['egw_info']['user']['preferences']['felamimail']; + //force the default for the forwarding -> asmail + if (is_array($this->preferencesArray)) { + if (!array_key_exists('message_forwarding',$this->preferencesArray) + || !isset($this->preferencesArray['message_forwarding']) + || empty($this->preferencesArray['message_forwarding'])) $this->preferencesArray['message_forwarding'] = 'asmail'; + } else { + $this->preferencesArray['message_forwarding'] = 'asmail'; + } + // check if there is a composeid set, and restore the session, if so + if (!empty($_composeID)) + { + $this->composeID = $_composeID; + $this->restoreSessionData(); + } + else // new email + { + $this->setDefaults(); + } + } + + /** + * adds uploaded files or files in eGW's temp directory as attachments + * + * It also stores the given data in the session + * + * @param array $_formData fields of the compose form (to,cc,bcc,reply_to,subject,body,priority,signature), plus data of the file (name,file,size,type) + */ + function addAttachment($_formData) + { + $attachfailed = false; + // to gard against exploits the file must be either uploaded or be in the temp_dir + // check if formdata meets basic restrictions (in tmp dir, or vfs, mimetype, etc.) + try + { + $tmpFileName = felamimail_bo::checkFileBasics($_formData,$this->composeID,false); + } + catch (egw_exception_wrong_userinput $e) + { + $attachfailed = true; + $alert_msg = $e->getMessage(); + } + + if ($attachfailed === false) + { + $buffer = array( + 'name' => $_formData['name'], + 'type' => $_formData['type'], + 'file' => $tmpFileName, + 'size' => $_formData['size'] + ); + // trying diiferent ID-ing Method, as getRandomString seems to produce non Random String on certain systems. + $attachmentID = md5(time().serialize($buffer)); + //error_log(__METHOD__." add Attachment with ID:".$attachmentID." (md5 of serialized array)"); + $this->sessionData['attachments'][$attachmentID] = $buffer; + unset($buffer); + } + else + { + error_log(__METHOD__.__LINE__.array2string($alert_msg)); + } + + $this->saveSessionData(); + //print"
";
+			//error_log(__METHOD__.__LINE__.print_r($this->sessionData,true));
+			//print"
";exit; + } + + function addMessageAttachment($_uid, $_partID, $_folder, $_name, $_type, $_size) + { + $this->sessionData['attachments'][]=array ( + 'uid' => $_uid, + 'partID' => $_partID, + 'name' => $_name, + 'type' => $_type, + 'size' => $_size, + 'folder' => $_folder + ); + $this->saveSessionData(); + } + + /** + * replace emailaddresses eclosed in <> (eg.: ) with the emailaddress only (e.g: me@you.de) + * always returns 1 + */ + static function replaceEmailAdresses(&$text) + { + // replace emailaddresses eclosed in <> (eg.: ) with the emailaddress only (e.g: me@you.de) + felamimail_bo::replaceEmailAdresses($text); + return 1; + } + + function convertHTMLToText(&$_html,$sourceishtml = true) + { + $stripalltags = true; + // third param is stripalltags, we may not need that, if the source is already in ascii + if (!$sourceishtml) $stripalltags=false; + return felamimail_bo::convertHTMLToText($_html,false,$stripalltags); + } + + function convertHTMLToTextTiny($_html) + { + print "
"; print htmlspecialchars($_html); print "
"; + // remove these tags and any spaces behind the tags + $search = array('/ */', '/<.?strong>/', '/<.?em>/', '/<.?u>/', '/<.?ul> */', '/<.?ol> */', '/<.?font.*?> */', '/<.?blockquote> */'); + $replace = ''; + $text = preg_replace($search, $replace, $_html); + + // convert these tags and any spaces behind the tags to line breaks + $search = array('/<\/li> */', '/
*/'); + $replace = "\r\n"; + $text = preg_replace($search, $replace, $text); + + // convert these tags and any spaces behind the tags to double line breaks + $search = array('/ <\/p> */', '/<\/p> */'); + $replace = "\r\n\r\n"; + $text = preg_replace($search, $replace, $text); + + // special replacements + $search = array('/
  • /'); + $replace = array(' * '); + + $text = preg_replace($search, $replace, $text); + + $text = html_entity_decode($text, ENT_COMPAT, $this->displayCharset); + + print "
    "; print htmlspecialchars($text); print "
    "; exit; + + return $text; + } + + function generateRFC822Address($_addressObject) + { + if(!empty($_addressObject->personal) && !empty($_addressObject->mailbox) && !empty($_addressObject->host)) { + return sprintf('"%s" <%s@%s>', $this->bofelamimail->decode_header($_addressObject->personal), $_addressObject->mailbox, $_addressObject->host); + } elseif(!empty($_addressObject->mailbox) && !empty($_addressObject->host)) { + return sprintf("%s@%s", $_addressObject->mailbox, $_addressObject->host); + } else { + return $_addressObject->mailbox; + } + } + + // create a hopefully unique id, to keep track of different compose windows + // if you do this, you are creating a new email + function getComposeID() + { + $this->composeID = $this->getRandomString(); + + $this->setDefaults(); + + return $this->composeID; + } + + // $_mode can be: + // single: for a reply to one address + // all: for a reply to all + function getDraftData($_icServer, $_folder, $_uid, $_partID=NULL) + { + $this->sessionData['to'] = array(); + + $bofelamimail = $this->bofelamimail; + $bofelamimail->openConnection(); + $bofelamimail->reopen($_folder); + + // the array $userEMailAddresses was used for filtering out emailaddresses that are owned by the user, for draft data we should not do this + //$userEMailAddresses = $this->preferences->getUserEMailAddresses(); + //error_log(__METHOD__.__LINE__.array2string($userEMailAddresses)); + + // get message headers for specified message + #$headers = $bofelamimail->getMessageHeader($_folder, $_uid); + $headers = $bofelamimail->getMessageEnvelope($_uid, $_partID); + $addHeadInfo = $bofelamimail->getMessageHeader($_uid, $_partID); + //error_log(__METHOD__.__LINE__.array2string($headers)); + if (!empty($addHeadInfo['X-MAILFOLDER'])) { + foreach ( explode('|',$addHeadInfo['X-MAILFOLDER']) as $val ) { + $this->sessionData['folder'][] = $val; + } + } + if (!empty($addHeadInfo['X-SIGNATURE'])) { + $this->sessionData['signatureID'] = $addHeadInfo['X-SIGNATURE']; + } + if (!empty($addHeadInfo['X-STATIONERY'])) { + $this->sessionData['stationeryID'] = $addHeadInfo['X-STATIONERY']; + } + if (!empty($addHeadInfo['X-IDENTITY'])) { + $this->sessionData['identity'] = $addHeadInfo['X-IDENTITY']; + } + $this->sessionData['uid'] = $_uid; + $this->sessionData['messageFolder'] = $_folder; + $this->sessionData['isDraft'] = true; + foreach((array)$headers['CC'] as $val) { + if($val['MAILBOX_NAME'] == 'undisclosed-recipients' || (empty($val['MAILBOX_NAME']) && empty($val['HOST_NAME'])) ) { + continue; + } + + //if($userEMailAddresses[$val['EMAIL']]) { + // continue; + //} + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $this->sessionData['cc'][] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + + foreach((array)$headers['TO'] as $val) { + if($val['MAILBOX_NAME'] == 'undisclosed-recipients' || (empty($val['MAILBOX_NAME']) && empty($val['HOST_NAME'])) ) { + continue; + } + + //if($userEMailAddresses[$val['EMAIL']]) { + // continue; + //} + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $this->sessionData['to'][] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + + foreach((array)$headers['REPLY_TO'] as $val) { + if($val['MAILBOX_NAME'] == 'undisclosed-recipients' || (empty($val['MAILBOX_NAME']) && empty($val['HOST_NAME'])) ) { + continue; + } + + //if($userEMailAddresses[$val['EMAIL']]) { + // continue; + //} + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $this->sessionData['replyto'][] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + + foreach((array)$headers['BCC'] as $val) { + if($val['MAILBOX_NAME'] == 'undisclosed-recipients' || (empty($val['MAILBOX_NAME']) && empty($val['HOST_NAME'])) ) { + continue; + } + + //if($userEMailAddresses[$val['EMAIL']]) { + // continue; + //} + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $this->sessionData['bcc'][] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + + $this->sessionData['subject'] = $bofelamimail->decode_header($headers['SUBJECT']); + // remove a printview tag if composing + $searchfor = '/^\['.lang('printview').':\]/'; + $this->sessionData['subject'] = preg_replace($searchfor,'',$this->sessionData['subject']); + $bodyParts = $bofelamimail->getMessageBody($_uid, $this->preferencesArray['always_display'], $_partID); + //_debug_array($bodyParts); + #$fromAddress = ($headers['FROM'][0]['PERSONAL_NAME'] != 'NIL') ? $headers['FROM'][0]['RFC822_EMAIL'] : $headers['FROM'][0]['EMAIL']; + if($bodyParts['0']['mimeType'] == 'text/html') { + $this->sessionData['mimeType'] = 'html'; + + for($i=0; $i0) { + $this->sessionData['body'] .= '
    '; + } + if($bodyParts[$i]['mimeType'] == 'text/plain') { + #$bodyParts[$i]['body'] = nl2br($bodyParts[$i]['body']); + $bodyParts[$i]['body'] = "
    ".$bodyParts[$i]['body']."
    "; + } + if ($bodyParts[$i]['charSet']===false) $bodyParts[$i]['charSet'] = felamimail_bo::detect_encoding($bodyParts[$i]['body']); + $bodyParts[$i]['body'] = $GLOBALS['egw']->translation->convert($bodyParts[$i]['body'], $bodyParts[$i]['charSet']); + #error_log( "GetDraftData (HTML) CharSet:".mb_detect_encoding($bodyParts[$i]['body'] . 'a' , strtoupper($bodyParts[$i]['charSet']).','.strtoupper($this->displayCharset).',UTF-8, ISO-8859-1')); + $this->sessionData['body'] .= "
    ". $bodyParts[$i]['body'] ; + } + + } else { + $this->sessionData['mimeType'] = 'plain'; + + for($i=0; $i0) { + $this->sessionData['body'] .= "
    "; + } + if ($bodyParts[$i]['charSet']===false) $bodyParts[$i]['charSet'] = felamimail_bo::detect_encoding($bodyParts[$i]['body']); + $bodyParts[$i]['body'] = $GLOBALS['egw']->translation->convert($bodyParts[$i]['body'], $bodyParts[$i]['charSet']); + #error_log( "GetDraftData (Plain) CharSet".mb_detect_encoding($bodyParts[$i]['body'] . 'a' , strtoupper($bodyParts[$i]['charSet']).','.strtoupper($this->displayCharset).',UTF-8, ISO-8859-1')); + $this->sessionData['body'] .= "\r\n". $bodyParts[$i]['body'] ; + } + } + + if($attachments = $bofelamimail->getMessageAttachments($_uid,$_partID)) { + foreach($attachments as $attachment) { + $this->addMessageAttachment($_uid, $attachment['partID'], + $_folder, + $attachment['name'], + $attachment['mimeType'], + $attachment['size']); + } + } + $bofelamimail->closeConnection(); + + $this->saveSessionData(); + } + + function getErrorInfo() + { + if(isset($this->errorInfo)) { + $errorInfo = $this->errorInfo; + unset($this->errorInfo); + return $errorInfo; + } + return false; + } + + function getForwardData($_icServer, $_folder, $_uid, $_partID) + { + if ($this->preferencesArray['message_forwarding'] == 'inline') { + $this->getReplyData('forward', $_icServer, $_folder, $_uid, $_partID); + } + $bofelamimail = $this->bofelamimail; + $bofelamimail->openConnection(); + $bofelamimail->reopen($_folder); + + // get message headers for specified message + $headers = $bofelamimail->getMessageEnvelope($_uid, $_partID); + + #_debug_array($headers); exit; + // check for Re: in subject header + $this->sessionData['subject'] = "[FWD] " . $bofelamimail->decode_header($headers['SUBJECT']); + $this->sessionData['sourceFolder']=$_folder; + $this->sessionData['forwardFlag']='forwarded'; + $this->sessionData['forwardedUID']=$_uid; + if ($this->preferencesArray['message_forwarding'] == 'asmail') { + $this->sessionData['mimeType'] = $this->preferencesArray['composeOptions']; + if($headers['SIZE']) + $size = $headers['SIZE']; + else + $size = lang('unknown'); + + $this->addMessageAttachment($_uid, $_partID, $_folder, + $bofelamimail->decode_header($headers['SUBJECT']), + 'MESSAGE/RFC822', $size); + } + else + { + unset($this->sessionData['in-reply-to']); + unset($this->sessionData['to']); + unset($this->sessionData['cc']); + if($attachments = $bofelamimail->getMessageAttachments($_uid,$_partID)) { + foreach($attachments as $attachment) { + $this->addMessageAttachment($_uid, $attachment['partID'], + $_folder, + $attachment['name'], + $attachment['mimeType'], + $attachment['size']); + } + } + } + $bofelamimail->closeConnection(); + + $this->saveSessionData(); + } + + /** + * getRandomString - function to be used to fetch a random string and md5 encode that one + * @param none + * @return string - a random number which is md5 encoded + */ + function getRandomString() { + return felamimail_bo::getRandomString(); + } + + /** + * getReplyData - function to gather the replyData and save it with the session, to be used then. + * @param $_mode can be: + * single: for a reply to one address + * all: for a reply to all + * forward: inlineforwarding of a message with its attachments + * @param $_icServer number (0 as it is the active Profile) + * @param $_folder string + * @param $_uid number + * @param $_partID number + */ + function getReplyData($_mode, $_icServer, $_folder, $_uid, $_partID) + { + $foundAddresses = array(); + + $bofelamimail = $this->bofelamimail; + $bofelamimail->openConnection(); + $bofelamimail->reopen($_folder); + + $userEMailAddresses = $this->preferences->getUserEMailAddresses(); + + // get message headers for specified message + #print "AAAA: $_folder, $_uid, $_partID
    "; + $headers = $bofelamimail->getMessageEnvelope($_uid, $_partID); + #$headers = $bofelamimail->getMessageHeader($_uid, $_partID); + $this->sessionData['uid'] = $_uid; + $this->sessionData['messageFolder'] = $_folder; + $this->sessionData['in-reply-to'] = $headers['MESSAGE_ID']; + + // check for Reply-To: header and use if available + if(!empty($headers['REPLY_TO']) && ($headers['REPLY_TO'] != $headers['FROM'])) { + foreach($headers['REPLY_TO'] as $val) { + if($val['EMAIL'] == 'NIL') { + continue; + } + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $oldTo[] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + $oldToAddress = $headers['REPLY_TO'][0]['EMAIL']; + } else { + foreach($headers['FROM'] as $val) { + if($val['EMAIL'] == 'NIL') { + continue; + } + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $oldTo[] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + $oldToAddress = $headers['REPLY_TO'][0]['EMAIL']; + } + + if($_mode != 'all' || ($_mode == 'all' && !$userEMailAddresses[$oldToAddress]) ) { + $this->sessionData['to'] = $oldTo; + } + + if($_mode == 'all') { + // reply to any address which is cc, but not to my self + #if($headers->cc) { + foreach($headers['CC'] as $val) { + if($val['MAILBOX_NAME'] == 'undisclosed-recipients' || (empty($val['MAILBOX_NAME']) && empty($val['HOST_NAME'])) ) { + continue; + } + + if($userEMailAddresses[$val['EMAIL']]) { + continue; + } + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $this->sessionData['cc'][] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + #} + + // reply to any address which is to, but not to my self + #if($headers->to) { + foreach($headers['TO'] as $val) { + if($val['MAILBOX_NAME'] == 'undisclosed-recipients' || (empty($val['MAILBOX_NAME']) && empty($val['HOST_NAME'])) ) { + continue; + } + + if($userEMailAddresses[$val['EMAIL']]) { + continue; + } + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $this->sessionData['to'][] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + #} + + #if($headers->from) { + foreach($headers['FROM'] as $val) { + if($val['MAILBOX_NAME'] == 'undisclosed-recipients' || (empty($val['MAILBOX_NAME']) && empty($val['HOST_NAME'])) ) { + continue; + } + + if($userEMailAddresses[$val['EMAIL']]) { + continue; + } + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $this->sessionData['to'][] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + #} + } + + // check for Re: in subject header + if(strtolower(substr(trim($bofelamimail->decode_header($headers['SUBJECT'])), 0, 3)) == "re:") { + $this->sessionData['subject'] = $bofelamimail->decode_header($headers['SUBJECT']); + } else { + $this->sessionData['subject'] = "Re: " . $bofelamimail->decode_header($headers['SUBJECT']); + } + + //_debug_array($headers); + $bodyParts = $bofelamimail->getMessageBody($_uid, $this->preferencesArray['always_display'], $_partID); + //_debug_array($bodyParts); + + $fromAddress = felamimail_bo::htmlspecialchars($bofelamimail->decode_header(($headers['FROM'][0]['PERSONAL_NAME'] != 'NIL') ? $headers['FROM'][0]['RFC822_EMAIL'] : $headers['FROM'][0]['EMAIL'])); + + $toAddressA = array(); + $toAddress = ''; + foreach ($headers['TO'] as $mailheader) { + $toAddressA[] = ($mailheader['PERSONAL_NAME'] != 'NIL') ? $mailheader['RFC822_EMAIL'] : $mailheader['EMAIL']; + } + if (count($toAddressA)>0) + { + $toAddress = felamimail_bo::htmlspecialchars($bofelamimail->decode_header(implode(', ', $toAddressA))); + $toAddress = @htmlspecialchars(lang("to")).": ".$toAddress.($bodyParts['0']['mimeType'] == 'text/html'?"\r\n
    ":"\r\n");; + } + $ccAddressA = array(); + $ccAddress = ''; + foreach ($headers['CC'] as $mailheader) { + $ccAddressA[] = ($mailheader['PERSONAL_NAME'] != 'NIL') ? $mailheader['RFC822_EMAIL'] : $mailheader['EMAIL']; + } + if (count($ccAddressA)>0) + { + $ccAddress = felamimail_bo::htmlspecialchars($bofelamimail->decode_header(implode(', ', $ccAddressA))); + $ccAddress = @htmlspecialchars(lang("cc")).": ".$ccAddress.($bodyParts['0']['mimeType'] == 'text/html'?"\r\n
    ":"\r\n"); + } + if($bodyParts['0']['mimeType'] == 'text/html') { + $this->sessionData['body'] = "
     \r\n

    ".'----------------'.lang("original message").'-----------------'."\r\n".'
    '. + @htmlspecialchars(lang("from")).": ".$fromAddress."\r\n
    ". + $toAddress.$ccAddress. + @htmlspecialchars(lang("date").": ".$headers['DATE'],ENT_QUOTES | ENT_IGNORE,felamimail_bo::$displayCharset, false)."\r\n
    ". + '----------------------------------------------------------'."\r\n

    "; + $this->sessionData['mimeType'] = 'html'; + $this->sessionData['body'] .= '
    '; + + for($i=0; $i0) { + $this->sessionData['body'] .= '
    '; + } + if($bodyParts[$i]['mimeType'] == 'text/plain') { + #$bodyParts[$i]['body'] = nl2br($bodyParts[$i]['body'])."
    "; + $bodyParts[$i]['body'] = "
    ".$bodyParts[$i]['body']."
    "; + } + if ($bodyParts[$i]['charSet']===false) $bodyParts[$i]['charSet'] = felamimail_bo::detect_encoding($bodyParts[$i]['body']); + $this->sessionData['body'] .= "
    ".self::_getCleanHTML($GLOBALS['egw']->translation->convert($bodyParts[$i]['body'], $bodyParts[$i]['charSet'])); + #error_log( "GetReplyData (HTML) CharSet:".mb_detect_encoding($bodyParts[$i]['body'] . 'a' , strtoupper($bodyParts[$i]['charSet']).','.strtoupper($this->displayCharset).',UTF-8, ISO-8859-1')); + + } + + $this->sessionData['body'] .= '

    '; + } else { + #$this->sessionData['body'] = @htmlspecialchars(lang("on")." ".$headers['DATE']." ".$bofelamimail->decode_header($fromAddress), ENT_QUOTES) . " ".lang("wrote").":\r\n"; + $this->sessionData['body'] = " \r\n \r\n".'----------------'.lang("original message").'-----------------'."\r\n". + @htmlspecialchars(lang("from")).": ".$fromAddress."\r\n". + $toAddress.$ccAddress. + @htmlspecialchars(lang("date").": ".$headers['DATE'], ENT_QUOTES | ENT_IGNORE,felamimail_bo::$displayCharset, false)."\r\n". + '-------------------------------------------------'."\r\n \r\n "; + + $this->sessionData['mimeType'] = 'plain'; + + for($i=0; $i0) { + $this->sessionData['body'] .= "
    "; + } + + // add line breaks to $bodyParts + if ($bodyParts[$i]['charSet']===false) $bodyParts[$i]['charSet'] = felamimail_bo::detect_encoding($bodyParts[$i]['body']); + $newBody = $GLOBALS['egw']->translation->convert($bodyParts[$i]['body'], $bodyParts[$i]['charSet']); + #error_log( "GetReplyData (Plain) CharSet:".mb_detect_encoding($bodyParts[$i]['body'] . 'a' , strtoupper($bodyParts[$i]['charSet']).','.strtoupper($this->displayCharset).',UTF-8, ISO-8859-1')); + + $newBody = explode("\n",$newBody); + $this->sessionData['body'] .= "\r\n"; + // create body new, with good line breaks and indention + foreach($newBody as $value) { + // the explode is removing the character + if (trim($value) != '') { + #if ($value != "\r") $value .= "\n"; + } + $numberOfChars = strspn(trim($value), ">"); + $appendString = str_repeat('>', $numberOfChars + 1); + + $bodyAppend = $this->bofelamimail->wordwrap($value, 76-strlen("\r\n$appendString "), "\r\n$appendString ",'>'); + + if($bodyAppend[0] == '>') { + $bodyAppend = '>'. $bodyAppend; + } else { + $bodyAppend = '> '. $bodyAppend; + } + + $this->sessionData['body'] .= $bodyAppend; + } + } + } + + $bofelamimail->closeConnection(); + + $this->saveSessionData(); + } + + static function _getCleanHTML($_body) + { + static $nonDisplayAbleCharacters = array('[\016]','[\017]', + '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]', + '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]'); + felamimail_bo::getCleanHTML($_body); + $_body = preg_replace($nonDisplayAbleCharacters, '', $_body); + + return $_body; + } + + function getSessionData() + { + return $this->sessionData; + } + + // get the user name, will will use for the FROM field + function getUserName() + { + $retData = sprintf("%s <%s>",$this->preferences['realname'],$this->preferences['emailAddress']); + return $retData; + } + + function removeAttachment($_attachmentID) { + if (parse_url($this->sessionData['attachments'][$_attachmentID]['file'],PHP_URL_SCHEME) != 'vfs') { + unlink($this->sessionData['attachments'][$_attachmentID]['file']); + } + unset($this->sessionData['attachments'][$_attachmentID]); + $this->saveSessionData(); + } + + function restoreSessionData() + { + $this->sessionData = $GLOBALS['egw']->session->appsession('compose_session_data_'.$this->composeID, 'felamimail'); + } + + function saveSessionData() + { + $GLOBALS['egw']->session->appsession('compose_session_data_'.$this->composeID,'felamimail',$this->sessionData); + } + + function createMessage(&$_mailObject, $_formData, $_identity, $_signature = false) + { + $bofelamimail = $this->bofelamimail; + $_mailObject->PluginDir = EGW_SERVER_ROOT."/phpgwapi/inc/"; + $activeMailProfile = $this->preferences->getIdentity($this->bofelamimail->profileID); + $_mailObject->IsSMTP(); + $_mailObject->CharSet = $this->displayCharset; + // you need to set the sender, if you work with different identities, since most smtp servers, dont allow + // sending in the name of someone else + $_mailObject->Sender = $activeMailProfile->emailAddress; + $_mailObject->From = $_identity->emailAddress; + $_mailObject->FromName = $_mailObject->EncodeHeader($_identity->realName); + $_mailObject->Priority = $_formData['priority']; + $_mailObject->Encoding = 'quoted-printable'; + $_mailObject->AddCustomHeader('X-Mailer: FeLaMiMail'); + if(isset($this->sessionData['in-reply-to'])) { + $_mailObject->AddCustomHeader('In-Reply-To: '. $this->sessionData['in-reply-to']); + } + if($_formData['disposition']) { + $_mailObject->AddCustomHeader('Disposition-Notification-To: '. $_identity->emailAddress); + } + if(!empty($_identity->organization)) { + #$_mailObject->AddCustomHeader('Organization: '. $bofelamimail->encodeHeader($_identity->organization, 'q')); + $_mailObject->AddCustomHeader('Organization: '. $_identity->organization); + } + + foreach((array)$_formData['to'] as $address) { + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($address):$address), ''); + foreach((array)$address_array as $addressObject) { + if ($addressObject->host == '.SYNTAX-ERROR.') continue; + $emailAddress = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''); + #$emailName = $bofelamimail->encodeHeader($addressObject->personal, 'q'); + #$_mailObject->AddAddress($emailAddress, $emailName); + $_mailObject->AddAddress($emailAddress, str_replace(array('@'),' ',$addressObject->personal)); + } + } + + foreach((array)$_formData['cc'] as $address) { + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($address):$address),''); + foreach((array)$address_array as $addressObject) { + if ($addressObject->host == '.SYNTAX-ERROR.') continue; + $emailAddress = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''); + #$emailName = $bofelamimail->encodeHeader($addressObject->personal, 'q'); + #$_mailObject->AddCC($emailAddress, $emailName); + $_mailObject->AddCC($emailAddress, str_replace(array('@'),' ',$addressObject->personal)); + } + } + + foreach((array)$_formData['bcc'] as $address) { + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($address):$address),''); + foreach((array)$address_array as $addressObject) { + if ($addressObject->host == '.SYNTAX-ERROR.') continue; + $emailAddress = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''); + #$emailName = $bofelamimail->encodeHeader($addressObject->personal, 'q'); + #$_mailObject->AddBCC($emailAddress, $emailName); + $_mailObject->AddBCC($emailAddress, str_replace(array('@'),' ',$addressObject->personal)); + } + } + + foreach((array)$_formData['replyto'] as $address) { + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($address):$address),''); + foreach((array)$address_array as $addressObject) { + if ($addressObject->host == '.SYNTAX-ERROR.') continue; + $emailAddress = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''); + #$emailName = $bofelamimail->encodeHeader($addressObject->personal, 'q'); + #$_mailObject->AddBCC($emailAddress, $emailName); + $_mailObject->AddReplyto($emailAddress, str_replace(array('@'),' ',$addressObject->personal)); + } + } + + //$_mailObject->WordWrap = 76; // as we break lines ourself, we will not need/use the buildin WordWrap + #$_mailObject->Subject = $bofelamimail->encodeHeader($_formData['subject'], 'q'); + $_mailObject->Subject = $_formData['subject']; + #$realCharset = mb_detect_encoding($_formData['body'] . 'a' , strtoupper($this->displayCharset).',UTF-8, ISO-8859-1'); + #error_log("bocompose::createMessage:".$realCharset); + // this should never happen since we come from the edit dialog + if (felamimail_bo::detect_qp($_formData['body'])) { + error_log("Error: bocompose::createMessage found QUOTED-PRINTABLE while Composing Message. Charset:$realCharset Message:".print_r($_formData['body'],true)); + $_formData['body'] = preg_replace('/=\r\n/', '', $_formData['body']); + $_formData['body'] = quoted_printable_decode($_formData['body']); + } + $disableRuler = false; + #if ($realCharset != $this->displayCharset) error_log("Error: bocompose::createMessage found Charset ($realCharset) differs from DisplayCharset (".$this->displayCharset.")"); + $signature = $_signature->fm_signature; + + if ((isset($this->preferencesArray['insertSignatureAtTopOfMessage']) && $this->preferencesArray['insertSignatureAtTopOfMessage'])) + { + // note: if you use stationery ' s the insert signatures at the top does not apply here anymore, as the signature + // is already part of the body, so the signature part of the template will not be applied. + $signature = null; // note: no signature, no ruler!!!! + } + if ((isset($this->preferencesArray['disableRulerForSignatureSeparation']) && + $this->preferencesArray['disableRulerForSignatureSeparation']) || + empty($signature) || trim($this->convertHTMLToText($signature)) =='') + { + $disableRuler = true; + } + $signature = felamimail_bo::merge($signature,array($GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id'))); + if($_formData['mimeType'] =='html') { + $_mailObject->IsHTML(true); + if(!empty($signature)) { + #$_mailObject->Body = array($_formData['body'], $_signature['signature']); + if($this->sessionData['stationeryID']) { + $bostationery = new felamimail_bostationery(); + $_mailObject->Body = $bostationery->render($this->sessionData['stationeryID'],$_formData['body'],$signature); + } else { + $_mailObject->Body = $_formData['body'] . + ($disableRuler ?'
    ':'
    '). + $signature; + } + $_mailObject->AltBody = $this->convertHTMLToText($_formData['body']). + ($disableRuler ?"\r\n":"\r\n-- \r\n"). + $this->convertHTMLToText($signature); + #print "
    $_mailObject->AltBody
    "; + #print htmlentities($_signature['signature']); + } else { + if($this->sessionData['stationeryID']) { + $bostationery = new felamimail_bostationery(); + $_mailObject->Body = $bostationery->render($this->sessionData['stationeryID'],$_formData['body']); + } else { + $_mailObject->Body = $_formData['body']; + } + $_mailObject->AltBody = $this->convertHTMLToText($_formData['body']); + } + } else { + $_mailObject->IsHTML(false); + $_mailObject->Body = $this->convertHTMLToText($_formData['body'],false); + #$_mailObject->Body = $_formData['body']; + if(!empty($signature)) { + $_mailObject->Body .= ($disableRuler ?"\r\n":"\r\n-- \r\n"). + $this->convertHTMLToText($signature); + } + } + + // add the attachments + $bofelamimail->openConnection(); + foreach((array)$this->sessionData['attachments'] as $attachment) { + if(!empty($attachment['uid']) && !empty($attachment['folder'])) { + $bofelamimail->reopen($attachment['folder']); + switch($attachment['type']) { + case 'MESSAGE/RFC822': + $rawHeader=''; + if (isset($attachment['partID'])) { + $rawHeader = $bofelamimail->getMessageRawHeader($attachment['uid'], $attachment['partID']); + } + $rawBody = $bofelamimail->getMessageRawBody($attachment['uid'], $attachment['partID']); + $_mailObject->AddStringAttachment($rawHeader.$rawBody, $_mailObject->EncodeHeader($attachment['name']), '7bit', 'message/rfc822'); + break; + default: + $attachmentData = $bofelamimail->getAttachment($attachment['uid'], $attachment['partID']); + + $_mailObject->AddStringAttachment($attachmentData['attachment'], $_mailObject->EncodeHeader($attachment['name']), 'base64', $attachment['type']); + break; + + } + } else { + if (parse_url($attachment['file'],PHP_URL_SCHEME) == 'vfs') + { + egw_vfs::load_wrapper('vfs'); + } + $_mailObject->AddAttachment ( + $attachment['file'], + $_mailObject->EncodeHeader($attachment['name']), + 'base64', + $attachment['type'] + ); + } + } + $bofelamimail->closeConnection(); + } + + function saveAsDraft($_formData) + { + $bofelamimail = $this->bofelamimail; + $mail = new egw_mailer(); + $identity = $this->preferences->getIdentity((int)$this->sessionData['identity']); + $flags = '\\Seen \\Draft'; + $BCCmail = ''; + + $this->createMessage($mail, $_formData, $identity); + // preserve the bcc and if possible the save to folder information + $this->sessionData['folder'] = $_formData['folder']; + $this->sessionData['bcc'] = $_formData['bcc']; + $this->sessionData['signatureID'] = $_formData['signatureID']; + $this->sessionData['stationeryID'] = $_formData['stationeryID']; + $this->sessionData['identity'] = $_formData['identity']; + foreach((array)$this->sessionData['bcc'] as $address) { + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($address):$address),''); + foreach((array)$address_array as $addressObject) { + $emailAddress = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''); + $mailAddr[] = array($emailAddress, $addressObject->personal); + } + } + // folder list as Customheader + if (!empty($this->sessionData['folder'])) + { + $folders = implode('|',array_unique($this->sessionData['folder'])); + $mail->AddCustomHeader("X-Mailfolder: $folders"); + } + $mail->AddCustomHeader('X-Signature: '.$this->sessionData['signatureID']); + $mail->AddCustomHeader('X-Stationery: '.$this->sessionData['stationeryID']); + $mail->AddCustomHeader('X-Identity: '.(int)$this->sessionData['identity']); + // decide where to save the message (default to draft folder, if we find nothing else) + // if the current folder is in draft or template folder save it there + // if it is called from printview then save it with the draft folder + //error_log(__METHOD__.__LINE__.array2string($this->preferences->ic_server)); + $savingDestination = ($this->preferences->ic_server[$bofelamimail->profileID]->draftfolder ? $this->preferences->ic_server[$bofelamimail->profileID]->draftfolder : $this->preferencesArray['draftFolder']); + if (empty($this->sessionData['messageFolder']) && !empty($this->sessionData['mailbox'])) $this->sessionData['messageFolder'] = $this->sessionData['mailbox']; + if ($bofelamimail->isDraftFolder($this->sessionData['messageFolder']) + || $bofelamimail->isTemplateFolder($this->sessionData['messageFolder'])) + { + $savingDestination = $this->sessionData['messageFolder']; + } + if ( !empty($_formData['printit']) && $_formData['printit'] == 0 ) $savingDestination = ($this->preferences->ic_server[$bofelamimail->profileID]->draftfolder ? $this->preferences->ic_server[$bofelamimail->profileID]->draftfolder : $this->preferencesArray['draftFolder']); + + if (count($mailAddr)>0) $BCCmail = $mail->AddrAppend("Bcc",$mailAddr); + //error_log(__METHOD__.__LINE__.$BCCmail.$mail->getMessageHeader().$mail->getMessageBody()); + $bofelamimail->openConnection(); + if ($bofelamimail->folderExists($savingDestination,true)) { + try + { + $messageUid = $bofelamimail->appendMessage($savingDestination, + $BCCmail.$mail->getMessageHeader(), + $mail->getMessageBody(), + $flags); + } + catch (egw_exception_wrong_userinput $e) + { + error_log(__METHOD__.__LINE__.lang("Save of message %1 failed. Could not save message to folder %2 due to: %3",__METHOD__,$savingDestination,$e->getMessage())); + return false; + } + + } else { + error_log("felamimail_bo::saveAsDraft->".lang("folder")." ". $savingDestination." ".lang("does not exist on IMAP Server.")); + return false; + } + $bofelamimail->closeConnection(); + return $messageUid; + } + + function send($_formData) + { + $bofelamimail = $this->bofelamimail; + $mail = new egw_mailer(); + $messageIsDraft = false; + + $this->sessionData['identity'] = $_formData['identity']; + $this->sessionData['to'] = $_formData['to']; + $this->sessionData['cc'] = $_formData['cc']; + $this->sessionData['bcc'] = $_formData['bcc']; + $this->sessionData['folder'] = $_formData['folder']; + $this->sessionData['replyto'] = $_formData['replyto']; + $this->sessionData['subject'] = trim($_formData['subject']); + $this->sessionData['body'] = $_formData['body']; + $this->sessionData['priority'] = $_formData['priority']; + $this->sessionData['signatureID'] = $_formData['signatureID']; + $this->sessionData['stationeryID'] = $_formData['stationeryID']; + $this->sessionData['disposition'] = $_formData['disposition']; + $this->sessionData['mimeType'] = $_formData['mimeType']; + $this->sessionData['to_infolog'] = $_formData['to_infolog']; + $this->sessionData['to_tracker'] = $_formData['to_tracker']; + // if the body is empty, maybe someone pasted something with scripts, into the message body + // this should not happen anymore, unless you call send directly, since the check was introduced with the action command + if(empty($this->sessionData['body'])) + { + // this is to be found with the egw_unset_vars array for the _POST['body'] array + $name='_POST'; + $key='body'; + #error_log($GLOBALS['egw_unset_vars'][$name.'['.$key.']']); + if (isset($GLOBALS['egw_unset_vars'][$name.'['.$key.']'])) + { + $this->sessionData['body'] = self::_getCleanHTML( $GLOBALS['egw_unset_vars'][$name.'['.$key.']']); + $_formData['body']=$this->sessionData['body']; + } + #error_log($this->sessionData['body']); + } + if(empty($this->sessionData['to']) && empty($this->sessionData['cc']) && + empty($this->sessionData['bcc']) && empty($this->sessionData['folder'])) { + $messageIsDraft = true; + } + #error_log(print_r($this->preferences,true)); + $identity = $this->preferences->getIdentity((int)$this->sessionData['identity']); + $signature = $this->bosignatures->getSignature((int)$this->sessionData['signatureID']); + #error_log($this->sessionData['identity']); + #error_log(print_r($identity,true)); + // create the messages + $this->createMessage($mail, $_formData, $identity, $signature); + // remember the identity + if ($_formData['to_infolog'] == 'on' || $_formData['to_tracker'] == 'on') $fromAddress = $mail->FromName.($mail->FromName?' <':'').$mail->From.($mail->FromName?'>':''); + #print "
    ". $mail->getMessageHeader() ."


    "; + #print "
    ". $mail->getMessageBody() ."


    "; + #exit; + + $ogServer = $this->preferences->getOutgoingServer($this->bofelamimail->profileID); + #_debug_array($ogServer); + $mail->Host = $ogServer->host; + $mail->Port = $ogServer->port; + // SMTP Auth?? + if($ogServer->smtpAuth) { + $mail->SMTPAuth = true; + // check if username contains a ; -> then a sender is specified (and probably needed) + list($username,$senderadress) = explode(';', $ogServer->username,2); + if (isset($senderadress) && !empty($senderadress)) $mail->Sender = $senderadress; + $mail->Username = $username; + $mail->Password = $ogServer->password; + } + + // set a higher timeout for big messages + @set_time_limit(120); + //$mail->SMTPDebug = 10; + //error_log("Folder:".count(array($this->sessionData['folder']))."To:".count((array)$this->sessionData['to'])."CC:". count((array)$this->sessionData['cc']) ."bcc:".count((array)$this->sessionData['bcc'])); + if(count((array)$this->sessionData['to']) > 0 || count((array)$this->sessionData['cc']) > 0 || count((array)$this->sessionData['bcc']) > 0) { + try { + $mail->Send(); + } + catch(phpmailerException $e) { + $this->errorInfo = $e->getMessage(); + if ($mail->ErrorInfo) // use the complete mailer ErrorInfo, for full Information + { + if (stripos($mail->ErrorInfo, $this->errorInfo)===false) + { + $this->errorInfo = $mail->ErrorInfo.'
    '.$this->errorInfo; + } + else + { + $this->errorInfo = $mail->ErrorInfo; + } + } + error_log(__METHOD__.__LINE__.array2string($this->errorInfo)); + return false; + } + } else { + if (count(array($this->sessionData['folder']))>0 && !empty($this->sessionData['folder'])) { + #error_log("Folders:".print_r($this->sessionData['folder'],true)); + } else { + $this->errorInfo = lang("Error: ").lang("No Address TO/CC/BCC supplied, and no folder to save message to provided."); + #error_log($this->errorInfo); + return false; + } + } + #error_log("Mail Sent.!"); + $folder = (array)$this->sessionData['folder']; + if(isset($this->preferences->preferences['sentFolder']) && + $this->preferences->preferences['sentFolder'] != 'none' && + $this->preferences->preferences['sendOptions'] != 'send_only' && + $messageIsDraft == false) { + $folder[] = $this->preferences->preferences['sentFolder']; + } + if($messageIsDraft == true) { + if(!empty($this->preferences->preferences['draftFolder'])) { + $folder[] = $this->sessionData['folder'] = array($this->preferences->preferences['draftFolder']); + } + } + $folder = array_unique($folder); + #error_log("Number of Folders to move copy the message to:".count($folder)); + if ((count($folder) > 0) || (isset($this->sessionData['uid']) && isset($this->sessionData['messageFolder'])) + || (isset($this->sessionData['forwardFlag']) && isset($this->sessionData['sourceFolder']))) { + $bofelamimail = $this->bofelamimail; + $bofelamimail->openConnection(); + //$bofelamimail->reopen($this->sessionData['messageFolder']); + #error_log("(re)opened Connection"); + } + if (count($folder) > 0) { + + foreach((array)$this->sessionData['bcc'] as $address) { + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($address):$address),''); + foreach((array)$address_array as $addressObject) { + $emailAddress = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''); + $mailAddr[] = array($emailAddress, $addressObject->personal); + } + } + $BCCmail=''; + if (count($mailAddr)>0) $BCCmail = $mail->AddrAppend("Bcc",$mailAddr); + foreach($folder as $folderName) { + if($bofelamimail->isSentFolder($folderName)) { + $flags = '\\Seen'; + } elseif($bofelamimail->isDraftFolder($folderName)) { + $flags = '\\Draft'; + } else { + $flags = ''; + } + #$mailHeader=explode('From:',$mail->getMessageHeader()); + #$mailHeader[0].$mail->AddrAppend("Bcc",$mailAddr).'From:'.$mailHeader[1], + if ($bofelamimail->folderExists($folderName,true)) { + try + { + $bofelamimail->appendMessage($folderName, + $BCCmail.$mail->getMessageHeader(), + $mail->getMessageBody(), + $flags); + } + catch (egw_exception_wrong_userinput $e) + { + error_log(__METHOD__.__LINE__.'->'.lang("Import of message %1 failed. Could not save message to folder %2 due to: %3",$this->sessionData['subject'],$folderName,$e->getMessage())); + } + } + else + { + error_log(__METHOD__.__LINE__.'->'.lang("Import of message %1 failed. Destination Folder %2 does not exist.",$this->sessionData['subject'],$folderName)); + } + } + //$bofelamimail->closeConnection(); + } + #error_log("handling draft messages, flagging and such"); + if((isset($this->sessionData['uid']) && isset($this->sessionData['messageFolder'])) + || (isset($this->sessionData['forwardFlag']) && isset($this->sessionData['sourceFolder']))) { + // mark message as answered + $bofelamimail->openConnection(); + $bofelamimail->reopen($this->sessionData['messageFolder']); + // if the draft folder is a starting part of the messages folder, the draft message will be deleted after the send + // unless your templatefolder is a subfolder of your draftfolder, and the message is in there + if ($bofelamimail->isDraftFolder($this->sessionData['messageFolder']) && !$bofelamimail->isTemplateFolder($this->sessionData['messageFolder'])) + { + $bofelamimail->deleteMessages(array($this->sessionData['uid'])); + } else { + $bofelamimail->flagMessages("answered", array($this->sessionData['uid'])); + if (array_key_exists('forwardFlag',$this->sessionData) && $this->sessionData['forwardFlag']=='forwarded') + { + $bofelamimail->flagMessages("forwarded", array($this->sessionData['forwardedUID'])); + } + } + //$bofelamimail->closeConnection(); + } + if ($bofelamimail) $bofelamimail->closeConnection(); + //error_log("performing Infolog Stuff"); + //error_log(print_r($this->sessionData['to'],true)); + //error_log(print_r($this->sessionData['cc'],true)); + //error_log(print_r($this->sessionData['bcc'],true)); + if (is_array($this->sessionData['to'])) + { + $mailaddresses['to'] = $this->sessionData['to']; + } + else + { + $mailaddresses = array(); + } + if (is_array($this->sessionData['cc'])) $mailaddresses['cc'] = $this->sessionData['cc']; + if (is_array($this->sessionData['bcc'])) $mailaddresses['bcc'] = $this->sessionData['bcc']; + if (!empty($mailaddresses)) $mailaddresses['from'] = $GLOBALS['egw']->translation->decodeMailHeader($fromAddress); + // attention: we dont return from infolog/tracker. You cannot check both. cleanups will be done there. + if ($_formData['to_infolog'] == 'on') { + $uiinfolog =& CreateObject('infolog.infolog_ui'); + $uiinfolog->import_mail( + $mailaddresses, + $this->sessionData['subject'], + $this->convertHTMLToText($this->sessionData['body']), + $this->sessionData['attachments'] + ); + } + if ($_formData['to_tracker'] == 'on') { + $uitracker =& CreateObject('tracker.tracker_ui'); + $uitracker->import_mail( + $mailaddresses, + $this->sessionData['subject'], + $this->convertHTMLToText($this->sessionData['body']), + $this->sessionData['attachments'] + ); + } + + + if(is_array($this->sessionData['attachments'])) { + reset($this->sessionData['attachments']); + while(list($key,$value) = @each($this->sessionData['attachments'])) { + #print "$key: ".$value['file']."
    "; + if (!empty($value['file']) && parse_url($value['file'],PHP_URL_SCHEME) != 'vfs') { // happens when forwarding mails + unlink($value['file']); + } + } + } + + $this->sessionData = ''; + $this->saveSessionData(); + + return true; + } + + function setDefaults() + { + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.felamimail_bosignatures.inc.php'); + $boSignatures = new felamimail_bosignatures(); + + if($signatureData = $boSignatures->getDefaultSignature()) { + if (is_array($signatureData)) { + $this->sessionData['signatureID'] = $signatureData['signatureid']; + } else { + $this->sessionData['signatureID'] = $signatureData; + } + } else { + $this->sessionData['signatureID'] = -1; + } + // retrieve the signature accociated with the identity + $accountData = $this->bopreferences->getAccountData($this->preferences,'active'); + if ($accountData['identity']->signature) $this->sessionData['signatureID'] = $accountData['identity']->signature; + // apply the current mailbox to the compose session data of the/a new email + $appsessionData = $GLOBALS['egw']->session->appsession('session_data'); + $this->sessionData['mailbox'] = $appsessionData['mailbox']; + + $this->sessionData['mimeType'] = 'html'; + if (!empty($this->preferencesArray['composeOptions']) && $this->preferencesArray['composeOptions']=="text") $this->sessionData['mimeType'] = 'text/plain'; + + $this->saveSessionData(); + } + + function stripSlashes($_string) + { + if (get_magic_quotes_gpc()) { + return stripslashes($_string); + } else { + return $_string; + } + } +} diff --git a/felamimail/inc/class.bopreferences.inc.php b/felamimail/inc/class.bopreferences.inc.php new file mode 100644 index 0000000000..3885ffc27f --- /dev/null +++ b/felamimail/inc/class.bopreferences.inc.php @@ -0,0 +1,419 @@ + True, + ); + + // stores the users profile + var $profileData; + var $sessionData; + var $boemailadmin; + + function bopreferences($_restoreSession = true) + { + //error_log(__METHOD__." called ".print_r($_restoreSession,true).function_backtrace()); + parent::sopreferences(); + $this->boemailadmin = new emailadmin_bo(false,$_restoreSession); // does read all profiles, no profile? + if ($_restoreSession && !(is_array($this->sessionData) && (count($this->sessionData)>0)) ) $this->restoreSessionData(); + if ($_restoreSession===false && (is_array($this->sessionData) && (count($this->sessionData)>0)) ) + { + //error_log(__METHOD__." Unset Session ".function_backtrace()); + //make sure session data will be reset + $this->sessionData = array(); + $this->profileData = array(); + self::saveSessionData(); + } + //error_log(__METHOD__.print_r($this->sessionData,true)); + if (isset($this->sessionData['profileData']) && is_a($this->sessionData['profileData'],'ea_preferences')) + { + //error_log(__METHOD__." Restore Session ".function_backtrace()); + $this->profileData = $this->sessionData['profileData']; + } + } + + function restoreSessionData() + { + //error_log(__METHOD__." Session restore ".function_backtrace()); + // set an own autoload function, search emailadmin for missing classes + $GLOBALS['egw_info']['flags']['autoload'] = array(__CLASS__,'autoload'); + + $this->sessionData = (array) unserialize($GLOBALS['egw']->session->appsession('fm_preferences','felamimail')); + } + + /** + * Autoload classes from emailadmin, 'til they get autoloading conform names + * + * @param string $class + */ + static function autoload($class) + { + if (file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php')) + { + include_once($file); + //error_log(__METHOD__."($class) included $file"); + } + elseif (file_exists($file=EGW_INCLUDE_ROOT.'/felamimail/inc/class.'.$class.'.inc.php')) + { + include_once($file); + } + else + { + #error_log(__METHOD__."($class) failed!"); + } + } + + function saveSessionData() + { + $GLOBALS['egw']->session->appsession('fm_preferences','felamimail',serialize($this->sessionData)); + } + + // get the first active user defined account + function getAccountData(&$_profileData, $_accountID=NULL) + { + #echo "

    backtrace: ".function_backtrace()."

    \n"; + if(!is_a($_profileData, 'ea_preferences')) + die(__FILE__.': '.__LINE__); + $accountData = parent::getAccountData($GLOBALS['egw_info']['user']['account_id'],$_accountID); + + // currently we use only the first profile available + $accountData = array_shift($accountData); + #_debug_array($accountData); + + $icServer = CreateObject('emailadmin.defaultimap'); + $icServer->ImapServerId = $accountData['id']; + $icServer->encryption = isset($accountData['ic_encryption']) ? $accountData['ic_encryption'] : 1; + $icServer->host = $accountData['ic_hostname']; + $icServer->port = isset($accountData['ic_port']) ? $accountData['ic_port'] : 143; + $icServer->validatecert = isset($accountData['ic_validatecertificate']) ? (bool)$accountData['ic_validatecertificate'] : 1; + $icServer->username = $accountData['ic_username']; + $icServer->loginName = $accountData['ic_username']; + $icServer->password = $accountData['ic_password']; + $icServer->enableSieve = isset($accountData['ic_enable_sieve']) ? (bool)$accountData['ic_enable_sieve'] : 1; + $icServer->sieveHost = $accountData['ic_sieve_server']; + $icServer->sievePort = isset($accountData['ic_sieve_port']) ? $accountData['ic_sieve_port'] : 2000; + if ($accountData['ic_folderstoshowinhome']) $icServer->folderstoshowinhome = $accountData['ic_folderstoshowinhome']; + if ($accountData['ic_trashfolder']) $icServer->trashfolder = $accountData['ic_trashfolder']; + if ($accountData['ic_sentfolder']) $icServer->sentfolder = $accountData['ic_sentfolder']; + if ($accountData['ic_draftfolder']) $icServer->draftfolder = $accountData['ic_draftfolder']; + if ($accountData['ic_templatefolder']) $icServer->templatefolder = $accountData['ic_templatefolder']; + + $ogServer = CreateObject('emailadmin.defaultsmtp'); + $ogServer->SmtpServerId = $accountData['id']; + $ogServer->host = $accountData['og_hostname']; + $ogServer->port = isset($accountData['og_port']) ? $accountData['og_port'] : 25; + $ogServer->smtpAuth = (bool)$accountData['og_smtpauth']; + if($ogServer->smtpAuth) { + $ogServer->username = $accountData['og_username']; + $ogServer->password = $accountData['og_password']; + } + + $identity = CreateObject('emailadmin.ea_identity'); + $identity->emailAddress = $accountData['emailaddress']; + $identity->realName = $accountData['realname']; + //$identity->default = true; + $identity->default = (bool)$accountData['active']; + $identity->organization = $accountData['organization']; + $identity->signature = $accountData['signatureid']; + $identity->id = $accountData['id']; + + $isActive = (bool)$accountData['active']; + + return array('icServer' => $icServer, 'ogServer' => $ogServer, 'identity' => $identity, 'active' => $isActive); + } + + function getAllAccountData(&$_profileData) + { + if(!is_a($_profileData, 'ea_preferences')) + die(__FILE__.': '.__LINE__); + $AllAccountData = parent::getAccountData($GLOBALS['egw_info']['user']['account_id'],'all'); + #_debug_array($accountData); + foreach ($AllAccountData as $key => $accountData) + { + $icServer = CreateObject('emailadmin.defaultimap'); + $icServer->ImapServerId = $accountData['id']; + $icServer->encryption = isset($accountData['ic_encryption']) ? $accountData['ic_encryption'] : 1; + $icServer->host = $accountData['ic_hostname']; + $icServer->port = isset($accountData['ic_port']) ? $accountData['ic_port'] : 143; + $icServer->validatecert = isset($accountData['ic_validatecertificate']) ? (bool)$accountData['ic_validatecertificate'] : 1; + $icServer->username = $accountData['ic_username']; + $icServer->loginName = $accountData['ic_username']; + $icServer->password = $accountData['ic_password']; + $icServer->enableSieve = isset($accountData['ic_enable_sieve']) ? (bool)$accountData['ic_enable_sieve'] : 1; + $icServer->sieveHost = $accountData['ic_sieve_server']; + $icServer->sievePort = isset($accountData['ic_sieve_port']) ? $accountData['ic_sieve_port'] : 2000; + if ($accountData['ic_folderstoshowinhome']) $icServer->folderstoshowinhome = $accountData['ic_folderstoshowinhome']; + if ($accountData['ic_trashfolder']) $icServer->trashfolder = $accountData['ic_trashfolder']; + if ($accountData['ic_sentfolder']) $icServer->sentfolder = $accountData['ic_sentfolder']; + if ($accountData['ic_draftfolder']) $icServer->draftfolder = $accountData['ic_draftfolder']; + if ($accountData['ic_templatefolder']) $icServer->templatefolder = $accountData['ic_templatefolder']; + + $ogServer = CreateObject('emailadmin.defaultsmtp'); + $ogServer->SmtpServerId = $accountData['id']; + $ogServer->host = $accountData['og_hostname']; + $ogServer->port = isset($accountData['og_port']) ? $accountData['og_port'] : 25; + $ogServer->smtpAuth = (bool)$accountData['og_smtpauth']; + if($ogServer->smtpAuth) { + $ogServer->username = $accountData['og_username']; + $ogServer->password = $accountData['og_password']; + } + + $identity = CreateObject('emailadmin.ea_identity'); + $identity->emailAddress = $accountData['emailaddress']; + $identity->realName = $accountData['realname']; + //$identity->default = true; + $identity->default = (bool)$accountData['active']; + $identity->organization = $accountData['organization']; + $identity->signature = $accountData['signatureid']; + $identity->id = $accountData['id']; + $isActive = (bool)$accountData['active']; + $out[$accountData['id']] = array('icServer' => $icServer, 'ogServer' => $ogServer, 'identity' => $identity, 'active' => $isActive); + } + return $out; + } + + function getUserDefinedIdentities() + { + $profileData = $this->boemailadmin->getUserProfile('felamimail'); + if(!is_a($profileData, 'ea_preferences') || !is_a($profileData->ic_server[0], 'defaultimap')) { + return false; + } + if($profileData->userDefinedAccounts || $profileData->userDefinedIdentities) + { + // get user defined accounts + $allAccountData = $this->getAllAccountData($profileData); + if ($allAccountData) + { + foreach ($allAccountData as $tmpkey => $accountData) + { + $accountArray[] = $accountData['identity']; + } + return $accountArray; + } + } + return array(); + } + /** + * getPreferences - fetches the active profile for a user + * + * @param boolean $getUserDefinedProfiles + * @param int $_profileID - use this profile to be set its prefs as active profile (0) + * @return object ea_preferences object with the active emailprofile set to ID = 0 + */ + function getPreferences($getUserDefinedProfiles=true,$_profileID=0) + { + if (isset($this->sessionData['profileData']) && is_a($this->sessionData['profileData'],'ea_preferences')) + { + $this->profileData = $this->sessionData['profileData']; + } + if(!is_a($this->profileData,'ea_preferences')) + { + $GLOBALS['egw']->preferences->read_repository(); + $userPreferences = $GLOBALS['egw_info']['user']['preferences']['felamimail']; + + $imapServerTypes = $this->boemailadmin->getIMAPServerTypes(); + $profileData = $this->boemailadmin->getUserProfile('felamimail'); // by now we assume only one profile to be returned + $icServerKeys = array_keys((array)$profileData->ic_server); + $icProfileID = array_shift($icServerKeys); + $ogServerKeys = array_keys((array)$profileData->og_server); + $ogProfileID = array_shift($ogServerKeys); + + //error_log(__METHOD__.__LINE__.array2string($profileData)); + if(!is_a($profileData, 'ea_preferences') || !is_a($profileData->ic_server[$icProfileID], 'defaultimap')) + { + return false; + } + // set the emailadminprofile as profile 0; it will be assumed the active one (if no other profiles are active) + $profileData->setIncomingServer($profileData->ic_server[$icProfileID],0); + $profileID = $icProfileID; + $profileData->setOutgoingServer($profileData->og_server[$ogProfileID],0); + $profileData->setIdentity($profileData->identities[$icProfileID],0); + $userPrefs = $this->mergeUserAndProfilePrefs($userPreferences,$profileData,$icProfileID); + //$profileData->setPreferences($userPrefs,0); + if($profileData->userDefinedAccounts && $GLOBALS['egw_info']['user']['apps']['felamimail'] && $getUserDefinedProfiles) + { + // get user defined accounts (only fetch the active one(s), as we call it without second parameter) + // we assume only one account may be active at once + $allAccountData = $this->getAllAccountData($profileData); + foreach ((array)$allAccountData as $k => $accountData) + { + // set defined IMAP server + if(is_a($accountData['icServer'],'defaultimap')) + { + $profileData->setIncomingServer($accountData['icServer'],$k); + $userPrefs = $this->mergeUserAndProfilePrefs($userPreferences,$profileData,$k); + //$profileData->setPreferences($userPrefs,$k); + } + // set defined SMTP Server + if(is_a($accountData['ogServer'],'defaultsmtp')) + $profileData->setOutgoingServer($accountData['ogServer'],$k); + + if(is_a($accountData['identity'],'ea_identity')) + $profileData->setIdentity($profileData->identities[$icProfileID],$k); + if (empty($_profileID)) + { + $setAsActive = $accountData['active']; + //if($setAsActive) error_log(__METHOD__.__LINE__." Setting Profile with ID=$k (using Active Info) for ActiveProfile"); + } + else + { + $setAsActive = ($_profileID==$k); + //if($setAsActive) error_log(__METHOD__.__LINE__." Setting Profile with ID=$_profileID for ActiveProfile"); + } + if($setAsActive) + { + // replace the global defined IMAP Server + if(is_a($accountData['icServer'],'defaultimap')) + { + $profileID = $k; + $profileData->setIncomingServer($accountData['icServer'],0); + $userPrefs = $this->mergeUserAndProfilePrefs($userPreferences,$profileData,$k); + //$profileData->setPreferences($userPrefs,0); + } + + // replace the global defined SMTP Server + if(is_a($accountData['ogServer'],'defaultsmtp')) + $profileData->setOutgoingServer($accountData['ogServer'],0); + + // replace the global defined identity + if(is_a($accountData['identity'],'ea_identity')) { + //_debug_array($profileData); + $rememberIdentities = $profileData->identities; + $profileData->setIdentity($accountData['identity'],0); + $rememberID = $accountData['identity']->id; + } + } + } + } + if($profileData->userDefinedIdentities && $GLOBALS['egw_info']['user']['apps']['felamimail']) + { + $allUserIdentities = $this->getUserDefinedIdentities(); + if (is_array($allUserIdentities)) + { + $i=count($allUserIdentities); + $y=-1; + foreach ($allUserIdentities as $tmpkey => $id) + { + if ($id->id != $rememberID) + { + $profileData->setIdentity($id,$i); + $i++; + } + else + { + foreach ($rememberIdentities as $adkey => $ident) + { + $profileData->setIdentity($ident,$i); + $profileData->identities[$i]->default = false; + $profileData->identities[$i]->id = $y; + $i++; + $y--; + } + } + } + } + } + $userPrefs = $this->mergeUserAndProfilePrefs($userPreferences,$profileData,$profileID); + $profileData->setPreferences($userPrefs); + + //_debug_array($profileData);#exit; + $this->sessionData['profileData'] = $this->profileData = $profileData; + $this->saveSessionData(); + //_debug_array($this->profileData); + } + return $this->profileData; + } + + function mergeUserAndProfilePrefs($userPrefs, &$profileData, $profileID) + { + // echo "

    backtrace: ".function_backtrace()."

    \n"; + if (is_array($profileData->ic_server[$profileID]->folderstoshowinhome) && !empty($profileData->ic_server[$profileID]->folderstoshowinhome[0])) + { + $userPrefs['mainscreen_showfolders'] = implode(',',$profileData->ic_server[$profileID]->folderstoshowinhome); + } + if (!empty($profileData->ic_server[$profileID]->sentfolder)) $userPrefs['sentFolder'] = $profileData->ic_server[$profileID]->sentfolder; + if (!empty($profileData->ic_server[$profileID]->trashfolder)) $userPrefs['trashFolder'] = $profileData->ic_server[$profileID]->trashfolder; + if (!empty($profileData->ic_server[$profileID]->draftfolder)) $userPrefs['draftFolder'] = $profileData->ic_server[$profileID]->draftfolder; + if (!empty($profileData->ic_server[$profileID]->templatefolder)) $userPrefs['templateFolder'] = $profileData->ic_server[$profileID]->templatefolder; + if(empty($userPrefs['deleteOptions'])) + $userPrefs['deleteOptions'] = 'mark_as_deleted'; + + if (!empty($userPrefs['trash_folder'])) + $userPrefs['move_to_trash'] = True; + if (!empty($userPrefs['sent_folder'])) + { + if (!isset($userPrefs['sendOptions']) || empty($userPrefs['sendOptions'])) $userPrefs['sendOptions'] = 'move_to_sent'; + } + + $userPrefs['signature'] = $userPrefs['email_sig']; + + unset($userPrefs['email_sig']); + return $userPrefs; + } + + function saveAccountData($_icServer, $_ogServer, $_identity) + { + if(is_object($_icServer) && !isset($_icServer->validatecert)) { + $_icServer->validatecert = true; + } + if(isset($_icServer->host)) { + $_icServer->sieveHost = $_icServer->host; + } + $this->sessionData = array(); + $this->saveSessionData(); + return parent::saveAccountData($GLOBALS['egw_info']['user']['account_id'], $_icServer, $_ogServer, $_identity); + } + + function deleteAccountData($_identity) + { + if (is_array($_identity)) { + foreach ($_identity as $tmpkey => $id) + { + if ($id->id) { + $identity[] = $id->id; + } else { + $identity[] = $id; + } + } + } else { + $identity = $_identity; + } + $this->sessionData = array(); + $this->saveSessionData(); + parent::deleteAccountData($GLOBALS['egw_info']['user']['account_id'], $identity); + } + + function setProfileActive($_status, $_identity=NULL) + { + $this->sessionData = array(); + $this->saveSessionData(); + if (!empty($_identity)) + { + //error_log(__METHOD__.__LINE__.' change status of '.$_identity.' to '.$_status); + // globals preferences add appname varname value + $GLOBALS['egw']->preferences->add('felamimail','ActiveProfileID',$_identity,'user'); + // save prefs + $GLOBALS['egw']->preferences->save_repository(true); + egw_cache::setSession('felamimail','activeProfileID',$_identity); + } + parent::setProfileActive($GLOBALS['egw_info']['user']['account_id'], $_status, $_identity); + } + } +?> diff --git a/felamimail/inc/class.bosieve.inc.php b/felamimail/inc/class.bosieve.inc.php new file mode 100644 index 0000000000..7cfcf670c4 --- /dev/null +++ b/felamimail/inc/class.bosieve.inc.php @@ -0,0 +1,41 @@ + + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * Class containing callback to set/reset vacation notice in future (timed vacation) + * + * Rest of class is moved to emailadmin_sieve and accessible via incomming server object (IMAP). + */ +class bosieve +{ + /** + * Callback for the async job to enable/disable the vacation message + * + * @param array $_vacation + */ + function async_vacation($_vacation) + { + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.'('.print_r($_vacation,true).')'); + // unset the fm_preferences session object, to force the reload/rebuild + $GLOBALS['egw']->session->appsession('fm_preferences','felamimail',serialize(array())); + $GLOBALS['egw']->session->appsession('session_data','emailadmin',serialize(array())); + + $_restoreSession = false; // as in async, each call may be for a different user + $bopreferences = CreateObject('felamimail.bopreferences',$_restoreSession); + $mailPreferences = $bopreferences->getPreferences(); + $icServer = $mailPreferences->getIncomingServer(0); + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.'->LoginName:'.$icServer->loginName); + //error_log(__METHOD__.__LINE__.array2string($_vacation)); + $ret = $icServer->setVacationUser($icServer->loginName,$_vacation['scriptName'],$_vacation); + if ($ret) $icServer->setAsyncJob($_vacation); + } + +} diff --git a/felamimail/inc/class.felamimail_activesync.inc.php b/felamimail/inc/class.felamimail_activesync.inc.php new file mode 100644 index 0000000000..bfcfd801a4 --- /dev/null +++ b/felamimail/inc/class.felamimail_activesync.inc.php @@ -0,0 +1,1766 @@ + + * @author Klaus Leithoff + * @author Philip Herbert + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * FMail eSync plugin + * + * Plugin creates a device specific file to map alphanumeric folder names to nummeric id's. + */ +class felamimail_activesync implements activesync_plugin_write, activesync_plugin_sendmail, activesync_plugin_meeting_response +{ + /** + * var BackendEGW + */ + private $backend; + + /** + * Instance of felamimail_bo + * + * @var felamimail_bo + */ + private $mail; + + /** + * Instance of uidisplay + * needed to use various bodyprocessing functions + * + * @var uidisplay + */ + //private $ui; // may not be needed after all + + /** + * Integer id of trash folder + * + * @var mixed + */ + private $_wasteID = false; + + /** + * Integer id of sent folder + * + * @var mixed + */ + private $_sentID = false; + + /** + * Integer id of current mail account / connection + * + * @var int + */ + private $account; + + private $folders; + + private $messages; + + static $profileID; + + /** + * debugLevel - enables more debug + * + * @var int + */ + private $debugLevel = 0; + + /** + * Constructor + * + * @param BackendEGW $backend + */ + public function __construct(BackendEGW $backend) + { + //$this->debugLevel=2; + $this->backend = $backend; + if (!isset($GLOBALS['egw_info']['user']['preferences']['activesync']['felamimail-ActiveSyncProfileID'])) + { + if ($this->debugLevel>1) error_log(__METHOD__.__LINE__.' Noprefs set: using 0 as default'); + // globals preferences add appname varname value + $GLOBALS['egw']->preferences->add('activesync','felamimail-ActiveSyncProfileID',0,'user'); + // save prefs + $GLOBALS['egw']->preferences->save_repository(true); + } + if ($this->debugLevel>1) error_log(__METHOD__.__LINE__.' ActiveProfileID:'.array2string(self::$profileID)); + + if (is_null(self::$profileID)) + { + if ($this->debugLevel>1) error_log(__METHOD__.__LINE__.' self::ProfileID isNUll:'.array2string(self::$profileID)); + self::$profileID =& egw_cache::getSession('felamimail','activeSyncProfileID'); + if ($this->debugLevel>1) error_log(__METHOD__.__LINE__.' ActiveProfileID (after reading Cache):'.array2string(self::$profileID)); + } + if (isset($GLOBALS['egw_info']['user']['preferences']['activesync']['felamimail-ActiveSyncProfileID'])) + { + if ($this->debugLevel>1) error_log(__METHOD__.__LINE__.' Pref for ProfileID:'.array2string($GLOBALS['egw_info']['user']['preferences']['activesync']['felamimail-ActiveSyncProfileID'])); + if ($GLOBALS['egw_info']['user']['preferences']['activesync']['felamimail-ActiveSyncProfileID'] == 'G') + { + self::$profileID = 'G'; // this should trigger the fetch of the first negative profile (or if no negative profile is available the firstb there is) + } + else + { + self::$profileID = (int)$GLOBALS['egw_info']['user']['preferences']['activesync']['felamimail-ActiveSyncProfileID']; + } + } + if ($this->debugLevel>1) error_log(__METHOD__.__LINE__.' Profile Selected (after reading Prefs):'.array2string(self::$profileID)); + $params =null; + if (isset($GLOBALS['egw_setup'])) $params['setup']=true; + $identities = $this->getAvailableProfiles($params); + //error_log(__METHOD__.__LINE__.array2string($identities)); + if (array_key_exists(self::$profileID,$identities)) + { + // everything seems to be in order self::$profileID REMAINS UNCHANGED + } + else + { + foreach (array_keys((array)$identities) as $k => $ident) if ($ident <0) self::$profileID = $ident; + if ($this->debugLevel>1) error_log(__METHOD__.__LINE__.' Profile Selected (after trying to fetch DefaultProfile):'.array2string(self::$profileID)); + if (!array_key_exists(self::$profileID,$identities)) + { + // everything failed, try first profile found + $keys = array_keys((array)$identities); + if (count($keys)>0) self::$profileID = array_shift($keys); + else self::$profileID = 0; + } + } + if ($this->debugLevel>0) error_log(__METHOD__.'::'.__LINE__.' ProfileSelected:'.self::$profileID.' -> '.$identities[self::$profileID]); + //$this->debugLevel=0; + } + + /** + * fetches available Profiles + * + * @return array + */ + function getAvailableProfiles($params = null) + { + $identities = array(); + if (!isset($params['setup'])) + { + if (!$this->mail) $this->mail = felamimail_bo::getInstance(true,(self::$profileID=='G'?0:self::$profileID)); + $selectedID = $this->mail->getIdentitiesWithAccounts($identities); + $activeIdentity =& $this->mail->mailPreferences->getIdentity((self::$profileID=='G'?0:self::$profileID)); + // if you use user defined accounts you may want to access the profile defined with the emailadmin available to the user + if ($activeIdentity->id || self::$profileID == 'G') { + $boemailadmin = new emailadmin_bo(); + $defaultProfile = $boemailadmin->getUserProfile() ; + //error_log(__METHOD__.__LINE__.array2string($defaultProfile)); + $identitys =& $defaultProfile->identities; + $icServers =& $defaultProfile->ic_server; + foreach ($identitys as $tmpkey => $identity) + { + if (empty($icServers[$tmpkey]->host)) continue; + $identities[$identity->id] = $identity->realName.' '.$identity->organization.' <'.$identity->emailAddress.'>'; + } + //$identities[0] = $defaultIdentity->realName.' '.$defaultIdentity->organization.' <'.$defaultIdentity->emailAddress.'>'; + } + } + return $identities; + } + + /** + * Populates $settings for the preferences + * + * @param array|string $hook_data + * @return array + */ + function settings($hook_data) + { + $identities = array(); + if (!isset($hook_data['setup'])) + { + $identities = $this->getAvailableProfiles($hook_data); + } + $identities += array( + 'G' => lang('Primary emailadmin Profile'), + ); + + $settings['felamimail-ActiveSyncProfileID'] = array( + 'type' => 'select', + 'label' => 'eMail Account to sync', + 'name' => 'felamimail-ActiveSyncProfileID', + 'help' => 'eMail Account to sync ', + 'values' => $identities, + 'xmlrpc' => True, + 'admin' => False, + ); + return $settings; + } + + + /** + * Open IMAP connection + * + * @param int $account integer id of account to use + * @todo support different accounts + */ + private function _connect($account=0) + { + if ($this->mail && $this->account != $account) $this->_disconnect(); + + $this->_wasteID = false; + $this->_sentID = false; + if (!$this->mail) + { + $this->account = $account; + // todo: tell fmail which account to use + $this->mail = felamimail_bo::getInstance(false,self::$profileID); + //error_log(__METHOD__.__LINE__.' create object with ProfileID:'.array2string(self::$profileID)); + if (!$this->mail->openConnection(self::$profileID,false)) + { + throw new egw_exception_not_found(__METHOD__."($account) can not open connection!"); + } + } + else + { + //error_log(__METHOD__.__LINE__." connect with profileID: ".self::$profileID); + if (!$this->mail->icServer->_connected) $this->mail->openConnection(self::$profileID,false); + } + $this->_wasteID = $this->mail->getTrashFolder(false); + //error_log(__METHOD__.__LINE__.' TrashFolder:'.$this->_wasteID); + $this->_sentID = $this->mail->getSentFolder(false); + //error_log(__METHOD__.__LINE__.' SentFolder:'.$this->_sentID); + //error_log(__METHOD__.__LINE__.' Connection Status for ProfileID:'.self::$profileID.'->'.$this->mail->icServer->_connected); + } + + /** + * Close IMAP connection + */ + private function _disconnect() + { + debugLog(__METHOD__); + if ($this->mail) $this->mail->closeConnection(); + + unset($this->mail); + unset($this->account); + unset($this->folders); + } + + /** + * This function is analogous to GetMessageList. + * + * @ToDo loop over available email accounts + */ + public function GetFolderList() + { + $folderlist = array(); + debugLog(__METHOD__.__LINE__); + /*foreach($available_accounts as $account)*/ $account = 0; + { + $this->_connect($account); + if (!isset($this->folders)) $this->folders = $this->mail->getFolderObjects(true,false); + + foreach ($this->folders as $folder => $folderObj) { + $folderlist[] = $f = array( + 'id' => $this->createID($account,$folder), + 'mod' => $folderObj->shortDisplayName, + 'parent' => $this->getParentID($account,$folder), + ); + if ($this->debugLevel>0) debugLog(__METHOD__."() returning ".array2string($f)); + } + } + //debugLog(__METHOD__."() returning ".array2string($folderlist)); + + return $folderlist; + } + + /** + * Sends a message which is passed as rfc822. You basically can do two things + * 1) Send the message to an SMTP server as-is + * 2) Parse the message yourself, and send it some other way + * It is up to you whether you want to put the message in the sent items folder. If you + * want it in 'sent items', then the next sync on the 'sent items' folder should return + * the new message as any other new message in a folder. + * + * @param string $rfc822 mail + * @param array $smartdata=array() values for keys: + * 'task': 'forward', 'new', 'reply' + * 'itemid': id of message if it's an reply or forward + * 'folderid': folder + * 'replacemime': false = send as is, false = decode and recode for whatever reason ??? + * 'saveinsentitems': 1 or absent? + * @param boolean|double $protocolversion=false + * @return boolean true on success, false on error + * + * @see eg. BackendIMAP::SendMail() + * @todo implement either here or in fmail backend + * (maybe sending here and storing to sent folder in plugin, as sending is supposed to always work in EGroupware) + */ + public function SendMail($rfc822, $smartdata=array(), $protocolversion = false) + { + //$this->debugLevel=3; + if ($protocolversion < 14.0) + debugLog("IMAP-SendMail: " . (isset($rfc822) ? $rfc822 : ""). "task: ".(isset($smartdata['task']) ? $smartdata['task'] : "")." itemid: ".(isset($smartdata['itemid']) ? $smartdata['itemid'] : "")." folder: ".(isset($smartdata['folderid']) ? $smartdata['folderid'] : "")); + if ($this->debugLevel>0) debugLog("IMAP-Sendmail: Smartdata = ".array2string($smartdata)); + // if we cannot decode the mail in question, fail + if (class_exists('Mail_mimeDecode',false)==false && (@include_once 'Mail/mimeDecode.php') === false) + { + debugLog("IMAP-SendMail: Could not find Mail_mimeDecode."); + return false; + } + // initialize our felamimail_bo + if (!isset($this->mail)) $this->mail = felamimail_bo::getInstance(false,self::$profileID); + $activeMailProfile = $this->mail->mailPreferences->getIdentity(self::$profileID); + if ($this->debugLevel>2) debugLog(__METHOD__.__LINE__.' ProfileID:'.self::$profileID.' ActiveMailProfile:'.array2string($activeMailProfile)); + + // initialize the new egw_mailer object for sending + $mailObject = new egw_mailer(); + $mailObject->CharSet = 'utf-8'; // set charset always to utf-8 + // default, should this be forced? + $mailObject->IsSMTP(); + $mailObject->Sender = $activeMailProfile->emailAddress; + $mailObject->From = $activeMailProfile->emailAddress; + $mailObject->FromName = $mailObject->EncodeHeader($activeMailProfile->realName); + $mailObject->AddCustomHeader('X-Mailer: FeLaMiMail-Activesync'); + + $mimeParams = array('decode_headers' => true, + 'decode_bodies' => false, + 'include_bodies' => true, + 'input' => $rfc822, + 'crlf' => "\r\n", + 'charset' => 'utf-8'); + $mobj = new Mail_mimeDecode($mimeParams['input'], $mimeParams['crlf']); + $message = $mobj->decode($mimeParams, $mimeParams['crlf']); + //error_log(__METHOD__.__LINE__.array2string($message)); + $mailObject->Priority = $message->headers['priority']; + $mailObject->Encoding = 'quoted-printable'; // we use this by default + + if (isset($message->headers['date'])) $mailObject->RFCDateToSet = $message->headers['date']; + if (isset($message->headers['return-path'])) $mailObject->Sender = $message->headers['return-path']; + $mailObject->Subject = $message->headers['subject']; + $mailObject->MessageID = $message->headers['message-id']; + /* the client send garbage sometimes (blackberry->domain\username) + // from + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($message->headers['from']):$message->headers['from']),''); + foreach((array)$address_array as $addressObject) { + if ($addressObject->host == '.SYNTAX-ERROR.') continue; + if ($this->debugLevel>0) debugLog("Header Sentmail From: ".array2string($addressObject).' vs. '.array2string($message->headers['from'])); + $mailObject->From = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''); + $mailObject->FromName = $addressObject->personal; + } + */ + // to + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($message->headers["to"]):$message->headers["to"]),''); + foreach((array)$address_array as $addressObject) { + if ($addressObject->host == '.SYNTAX-ERROR.') continue; + if ($this->debugLevel>0) debugLog("Header Sentmail To: ".array2string($addressObject) ); + $mailObject->AddAddress($addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''),$addressObject->personal); + } + // CC + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($message->headers["cc"]):$message->headers["cc"]),''); + foreach((array)$address_array as $addressObject) { + if ($addressObject->host == '.SYNTAX-ERROR.') continue; + if ($this->debugLevel>0) debugLog("Header Sentmail CC: ".array2string($addressObject) ); + $mailObject->AddCC($addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''),$addressObject->personal); + } + // BCC + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($message->headers["bcc"]):$message->headers["bcc"]),''); + foreach((array)$address_array as $addressObject) { + if ($addressObject->host == '.SYNTAX-ERROR.') continue; + if ($this->debugLevel>0) debugLog("Header Sentmail BCC: ".array2string($addressObject) ); + $mailObject->AddBCC($addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''),$addressObject->personal); + $bccMailAddr = imap_rfc822_write_address($addressObject->mailbox, $addressObject->host, $addressObject->personal); + } + /* + // AddReplyTo + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($message->headers['reply-to']):$message->headers['reply-to']),''); + foreach((array)$address_array as $addressObject) { + if ($addressObject->host == '.SYNTAX-ERROR.') continue; + if ($this->debugLevel>0) debugLog("Header Sentmail REPLY-TO: ".array2string($addressObject) ); + $mailObject->AddReplyTo($addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''),$addressObject->personal); + } + */ + $addedfullname = false; + // save some headers when forwarding mails (content type & transfer-encoding) + $headers = ""; + + $use_orgbody = false; + + // clean up the transmitted headers + // remove default headers because we are using our own mailer + //$returnPathSet = false; + //$body_base64 = false; + $org_charset = ""; + foreach($message->headers as $k => $v) { + if ($k == "subject" || + $k == "to" || $k == "cc" || $k == "bcc" || $k == "sender" || $k == "reply-to" || $k == 'from' || $k == 'return_path' || + $k == "message-id" || $k == 'date') + continue; // already set + + if ($this->debugLevel>0) debugLog("Header Sentmail original Header (filtered): " . $k. " = ".trim($v)); + if ($k == "content-type") { + // if the message is a multipart message, then we should use the sent body + if (preg_match("/multipart/i", $v)) { + $use_orgbody = true; + $org_boundary = $message->ctype_parameters["boundary"]; + } + + // save the original content-type header for the body part when forwarding + if ($smartdata['task'] == 'forward' && $smartdata['itemid'] && !$use_orgbody) { + continue; // ignore + } + + $org_charset = $v; + $v = preg_replace("/charset=([A-Za-z0-9-\"']+)/", "charset=\"utf-8\"", $v); + } + + if ($k == "content-transfer-encoding") { +/* we do not use this, as we determine that by ourself by forcing Encoding=base64 on smartreply/forward + // if the content was base64 encoded, encode the body again when sending + if (trim($v) == "base64") $body_base64 = true; + + // save the original encoding header for the body part when forwarding + if ($smartdata['task'] == 'forward' && $smartdata['itemid']) { + continue; // ignore + } +*/ + } + + // if the message is a multipart message, then we should use the sent body + if (($smartdata['task'] == 'new' || $smartdata['task'] == 'reply' || $smartdata['task'] == 'forward') && + ((isset($smartdata['replacemime']) && $smartdata['replacemime'] == true) || + $k == "content-type" && preg_match("/multipart/i", $v))) { + $use_orgbody = true; + } + + // all other headers stay, we probably dont use them, but we may add them with AddHeader/AddCustomHeader + //if ($headers) $headers .= "\n"; + //$headers .= ucfirst($k) . ": ". trim($v); + } + // if this is a simple message, no structure at all + if ($message->ctype_primary=='text' && $message->body) + { + $mailObject->IsHTML($message->ctype_secondary=='html'?true:false); + // we decode the body ourself + $message->body = $this->mail->decodeMimePart($message->body,($message->headers['content-transfer-encoding']?$message->headers['content-transfer-encoding']:'base64')); + $mailObject->Body = $body = $message->body; + $simpleBodyType = ($message->ctype_secondary=='html'?'text/html':'text/plain'); + if ($this->debugLevel>0) debugLog("IMAP-Sendmail: fetched simple body as ".($message->ctype_secondary=='html'?'html':'text')); + } + //error_log(__METHOD__.__LINE__.array2string($mailObject)); + // if this is a multipart message with a boundary, we must use the original body + $this->mail->createBodyFromStructure($mailObject, $message,NULL,$decode=true); + if ($this->debugLevel>2) debugLog(__METHOD__.__LINE__.' mailObject after Inital Parse:'.array2string($mailObject)); + if ($use_orgbody) { + if ($this->debugLevel>0) debugLog("IMAP-Sendmail: use_orgbody = true"); + $repl_body = $body = $mailObject->Body; + } + else { + if ($this->debugLevel>0) debugLog("IMAP-Sendmail: use_orgbody = false"); + $body = $mailObject->Body; + } + if ($this->debugLevel>2) debugLog(__METHOD__.__LINE__.' MailAttachments:'.array2string($mailObject->GetAttachments())); + // as we use our mailer (phpmailer) it is detecting / setting the mimetype by itself while creating the mail + if (isset($smartdata['replacemime']) && $smartdata['replacemime'] == true && + isset($message->ctype_primary)) { + //if ($headers) $headers .= "\n"; + //$headers .= "Content-Type: ". $message->ctype_primary . "/" . $message->ctype_secondary . + // (isset($message->ctype_parameters['boundary']) ? ";\n\tboundary=".$message->ctype_parameters['boundary'] : ""); + } + if ($this->debugLevel>2) debugLog(__METHOD__.__LINE__.' retrieved Body:'.$body); + $body = str_replace("\r",($mailObject->ContentType=='text/html'?'
    ':""),$body); // what is this for? + if ($this->debugLevel>2) debugLog(__METHOD__.__LINE__.' retrieved Body (modified):'.$body); + // reply --------------------------------------------------------------------------- + if ($smartdata['task'] == 'reply' && isset($smartdata['itemid']) && + isset($smartdata['folderid']) && $smartdata['itemid'] && $smartdata['folderid'] && + (!isset($smartdata['replacemime']) || + (isset($smartdata['replacemime']) && $smartdata['replacemime'] == false))) + { + $uid = $smartdata['itemid']; + if ($this->debugLevel>0) debugLog("IMAP Smartreply is called with FolderID:".$smartdata['folderid'].' and ItemID:'.$smartdata['itemid']); + $this->splitID($smartdata['folderid'], $account, $folder); + + $this->mail->reopen($folder); + // not needed, as the original header is always transmitted + /* + $headers = $this->mail->getMessageEnvelope($uid, $_partID, true); + if ($this->debugLevel>0) debugLog(__METHOD__.__LINE__." Headers of Message with UID:$uid ->".array2string($headers)); + $body .= $this->mail->createHeaderInfoSection($headers,lang("original message")); + */ + $bodyStruct = $this->mail->getMessageBody($uid, 'html_only'); + + $bodyBUFF = $this->mail->getdisplayableBody($this->mail,$bodyStruct,true); + if ($this->debugLevel>3) debugLog(__METHOD__.__LINE__.' html_only:'.$bodyBUFF); + if ($bodyBUFF != "" && (is_array($bodyStruct) && $bodyStruct[0]['mimeType']=='text/html')) { + // may be html + if ($this->debugLevel>0) debugLog("MIME Body".' Type:html (fetched with html_only):'.$bodyBUFF); + $mailObject->IsHTML(true); + } else { + // plain text Message + if ($this->debugLevel>0) debugLog("MIME Body".' Type:plain, fetch text:'); + $mailObject->IsHTML(false); + $bodyStruct = $this->mail->getMessageBody($uid,'never_display');//'never_display'); + $bodyBUFF = $this->mail->getdisplayableBody($this->mail,$bodyStruct);//$this->ui->getdisplayableBody($bodyStruct,false); + + if ($this->debugLevel>0) debugLog("MIME Body ContentType ".$mailObject->ContentType); + $bodyBUFF = ($mailObject->ContentType=='text/html'?'
    ':'').$bodyBUFF.($mailObject->ContentType=='text/html'?'
    ':''); + } + + if ($this->debugLevel>0) debugLog(__METHOD__.__LINE__.' Body -> '.$bodyBUFF); + if (isset($simpleBodyType) && $simpleBodyType == 'text/plain' && $mailObject->ContentType == 'text/html') $body=nl2br($body); + // receive only body + $body .= $bodyBUFF; + $mailObject->Encoding = 'base64'; + } + + // how to forward and other prefs + $preferencesArray =& $GLOBALS['egw_info']['user']['preferences']['felamimail']; + + // forward ------------------------------------------------------------------------- + if ($smartdata['task'] == 'forward' && isset($smartdata['itemid']) && + isset($smartdata['folderid']) && $smartdata['itemid'] && $smartdata['folderid'] && + (!isset($smartdata['replacemime']) || + (isset($smartdata['replacemime']) && $smartdata['replacemime'] == false))) + { + //force the default for the forwarding -> asmail + if (is_array($preferencesArray)) { + if (!array_key_exists('message_forwarding',$preferencesArray) + || !isset($preferencesArray['message_forwarding']) + || empty($preferencesArray['message_forwarding'])) $preferencesArray['message_forwarding'] = 'asmail'; + } else { + $preferencesArray['message_forwarding'] = 'asmail'; + } + // construct the uid of the message out of the itemid - seems to be the uid, no construction needed + $uid = $smartdata['itemid']; + if ($this->debugLevel>0) debugLog("IMAP Smartfordward is called with FolderID:".$smartdata['folderid'].' and ItemID:'.$smartdata['itemid']); + $this->splitID($smartdata['folderid'], $account, $folder); + + $this->mail->reopen($folder); + // receive entire mail (header + body) + // get message headers for specified message + $headers = $this->mail->getMessageEnvelope($uid, $_partID, true); + + // build a new mime message, forward entire old mail as file + if ($preferencesArray['message_forwarding'] == 'asmail') + { + $rawHeader=''; + $rawHeader = $this->mail->getMessageRawHeader($smartdata['itemid'], $_partID); + $rawBody = $this->mail->getMessageRawBody($smartdata['itemid'], $_partID); + $mailObject->AddStringAttachment($rawHeader.$rawBody, $mailObject->EncodeHeader($headers['SUBJECT']), '7bit', 'message/rfc822'); + } + else + { +/* ToDo - as it may double text + // This is for forwarding and using the original body as Client may only include parts of the original mail + if (!$use_orgbody) + $nbody = $body; + else + $nbody = $repl_body; +*/ + //$body .= $this->mail->createHeaderInfoSection($headers,lang("original message")); + $bodyStruct = $this->mail->getMessageBody($uid, 'html_only'); + $bodyBUFF = $this->mail->getdisplayableBody($this->mail,$bodyStruct,true); + if ($this->debugLevel>3) debugLog(__METHOD__.__LINE__.' html_only:'.$body); + if ($bodyBUFF != "" && (is_array($bodyStruct) && $bodyStruct[0]['mimeType']=='text/html')) { + // may be html + if ($this->debugLevel>0) debugLog("MIME Body".' Type:html (fetched with html_only)'); + $mailObject->IsHTML(true); + } else { + // plain text Message + if ($this->debugLevel>0) debugLog("MIME Body".' Type:plain, fetch text:'); + $mailObject->IsHTML(false); + $bodyStruct = $this->mail->getMessageBody($uid,'never_display');//'never_display'); + $bodyBUFF = $this->mail->getdisplayableBody($this->mail,$bodyStruct);//$this->ui->getdisplayableBody($bodyStruct,false); + + if ($this->debugLevel>0) debugLog("MIME Body ContentType ".$mailObject->ContentType); + $bodyBUFF = ($mailObject->ContentType=='text/html'?'
    ':'').$bodyBUFF.($mailObject->ContentType=='text/html'?'
    ':''); + } + if ($this->debugLevel>0) debugLog(__METHOD__.__LINE__.' Body -> '.$bodyBUFF); + // receive only body + $body .= $bodyBUFF; + // get all the attachments and add them too. + // start handle Attachments + $attachments = $this->mail->getMessageAttachments($uid); + $attachmentNames = false; + if (is_array($attachments) && count($attachments)>0) + { + if ($this->debugLevel>0) debugLog(__METHOD__.__LINE__.' gather Attachments for BodyCreation of/for MessageID:'.$uid.' found:'.count($attachments)); + foreach((array)$attachments as $key => $attachment) + { + if ($this->debugLevel>0) debugLog(__METHOD__.__LINE__.' Key:'.$key.'->'.array2string($attachment)); + $attachmentNames .= $attachment['name']."\n"; + switch($attachment['type']) + { + case 'MESSAGE/RFC822': + $rawHeader = $rawBody = ''; + $rawHeader = $this->mail->getMessageRawHeader($uid, $attachment['partID']); + $rawBody = $this->mail->getMessageRawBody($uid, $attachment['partID']); + $mailObject->AddStringAttachment($rawHeader.$rawBody, $mailObject->EncodeHeader($attachment['name']), '7bit', 'message/rfc822'); + break; + default: + $attachmentData = ''; + $attachmentData = $this->mail->getAttachment($uid, $attachment['partID']); + $mailObject->AddStringAttachment($attachmentData['attachment'], $mailObject->EncodeHeader($attachment['name']), 'base64', $attachment['mimeType']); + break; + } + } + } + } + if (isset($simpleBodyType) && $simpleBodyType == 'text/plain' && $mailObject->ContentType == 'text/html') $body=nl2br($body); + $mailObject->Encoding = 'base64'; + } // end forward + + // add signature!! ----------------------------------------------------------------- + if ($this->debugLevel>2) debugLog(__METHOD__.__LINE__.' ActiveMailProfile:'.array2string($activeMailProfile)); + $presetSig = (!empty($activeMailProfile->signature) ? $activeMailProfile->signature : -1); // thats the default + $disableRuler = false; + + $bosignatures = CreateObject('felamimail.felamimail_bosignatures'); + $_signature = $bosignatures->getSignature($presetSig); + $signature = $_signature->fm_signature; + if ((isset($preferencesArray['disableRulerForSignatureSeparation']) && + $preferencesArray['disableRulerForSignatureSeparation']) || + empty($signature) || trim($this->mail->convertHTMLToText($signature)) =='') + { + $disableRuler = true; + } + $before = ""; + if ($disableRuler==false) + { + if($mailObject->ContentType=='text/html') { + $before = ($disableRuler ?' 
    ':' 

    '); + } else { + $before = ($disableRuler ?"\r\n\r\n":"\r\n\r\n-- \r\n"); + } + } + $sigText = $this->mail->merge($signature,array($GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id'))); + if ($this->debugLevel>0) debugLog(__METHOD__.__LINE__.' Signature to use:'.$sigText); + $body .= $before.($mailObject->ContentType=='text/html'?$sigText:$this->mail->convertHTMLToText($sigText)); + //debugLog(__METHOD__.__LINE__.' -> '.$body); + // remove carriage-returns from body, set the body of the mailObject + if (trim($body) =='' && trim($mailObject->Body)==''/* && $attachmentNames*/) $body .= ($attachmentNames?$attachmentNames:lang('no text body supplied, check attachments for message text')); // to avoid failure on empty messages with attachments + //debugLog(__METHOD__.__LINE__.' -> '.$body); + $mailObject->Body = $body ;//= str_replace("\r\n", "\n", $body); // if there is a
     this needs \r\n so DO NOT replace them
    +		if ($mailObject->ContentType=='text/html') $mailObject->AltBody = $this->mail->convertHTMLToText($body);
    +
    +        //advanced debugging
    +		if (strtolower($mailObject->CharSet) != 'utf-8')
    +		{
    +			debugLog(__METHOD__.__LINE__.' POSSIBLE PROBLEM: CharSet was changed during processing of the Body from:'.$mailObject->CharSet.'. Force back to UTF-8 now.');
    +			$mailObject->CharSet = 'utf-8';
    +		}
    +        //debugLog("IMAP-SendMail: parsed message: ". print_r($message,1));
    +		#_debug_array($ogServer);
    +		$mailObject->Host 	= $this->mail->ogServer->host;
    +		$mailObject->Port	= $this->mail->ogServer->port;
    +		// SMTP Auth??
    +		if($this->mail->ogServer->smtpAuth) {
    +			$mailObject->SMTPAuth	= true;
    +			// check if username contains a ; -> then a sender is specified (and probably needed)
    +			list($username,$senderadress) = explode(';', $this->mail->ogServer->username,2);
    +			if (isset($senderadress) && !empty($senderadress)) $mailObject->Sender = $senderadress;
    +			$mailObject->Username = $username;
    +			$mailObject->Password	= $this->mail->ogServer->password;
    +		}
    +		if ($this->debugLevel>2) debugLog("IMAP-SendMail: MailObject:".array2string($mailObject));
    +		if ($this->debugLevel>0 && $this->debugLevel<=2)
    +		{
    +			debugLog("IMAP-SendMail: MailObject (short):".array2string(array('host'=>$mailObject->Host,
    +				'port'=>$mailObject->Port,
    +				'username'=>$mailObject->Username,
    +				'subject'=>$mailObject->Subject,
    +				'CharSet'=>$mailObject->CharSet,
    +				'Priority'=>$mailObject->Priority,
    +				'Encoding'=>$mailObject->Encoding,
    +				'ContentType'=>$mailObject->ContentType,
    +			)));
    +		}
    +   	    if ($this->debugLevel>2) debugLog(__METHOD__.__LINE__.' MailAttachments:'.array2string($mailObject->GetAttachments()));
    +
    +		// set a higher timeout for big messages
    +		@set_time_limit(120);
    +
    +		// send
    +		$send = true;
    +		try {
    +			$mailObject->Send();
    +		}
    +		catch(phpmailerException $e) {
    +            debugLog("The email could not be sent. Last-SMTP-error: ". $e->getMessage());
    +			$send = false;
    +		}
    +		$asf = ($send ? true:false); // initalize accordingly
    +		if (($smartdata['saveinsentitems']==1 || !isset($smartdata['saveinsentitems'])) && $send==true && $this->mail->mailPreferences->preferences['sendOptions'] != 'send_only')
    +		{
    +		    $asf = false;
    +		    if ($this->_sentID) {
    +		        $folderArray[] = $this->_sentID;
    +		    }
    +			else if(isset($this->mail->mailPreferences->preferences['sentFolder']) &&
    +				$this->mail->mailPreferences->preferences['sentFolder'] != 'none')
    +			{
    +		        $folderArray[] = $this->mail->mailPreferences->preferences['sentFolder'];
    +		    }
    +		    // No Sent folder set, try defaults
    +			else
    +			{
    +		        debugLog("IMAP-SendMail: No Sent mailbox set");
    +				// we dont try guessing
    +				$asf = true;
    +		    }
    +			if (count($folderArray) > 0) {
    +
    +				foreach((array)$bccMailAddr as $address) {
    +					$address_array  = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($address):$address),'');
    +					foreach((array)$address_array as $addressObject) {
    +						$emailAddress = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : '');
    +						$mailAddr[] = array($emailAddress, $addressObject->personal);
    +					}
    +				}
    +				$BCCmail='';
    +				if (count($mailAddr)>0) $BCCmail = $mailObject->AddrAppend("Bcc",$mailAddr);
    +				foreach($folderArray as $folderName) {
    +					if($this->mail->isSentFolder($folderName)) {
    +						$flags = '\\Seen';
    +					} elseif($this->mail->isDraftFolder($folderName)) {
    +						$flags = '\\Draft';
    +					} else {
    +						$flags = '';
    +					}
    +					$asf = true;
    +					//debugLog(__METHOD__.__LINE__.'->'.array2string($this->mail->icServer));
    +					if (!$this->mail->icServer->_connected) $this->mail->openConnection(self::$profileID,false);
    +					if ($this->mail->folderExists($folderName)) {
    +						try
    +						{
    +							$this->mail->appendMessage($folderName,
    +									$BCCmail.$mailObject->getMessageHeader(),
    +									$mailObject->getMessageBody(),
    +									$flags);
    +						}
    +						catch (egw_exception_wrong_userinput $e)
    +						{
    +							$asf = false;
    +							debugLog(__METHOD__.__LINE__.'->'.lang("Import of message %1 failed. Could not save message to folder %2 due to: %3",$mailObject->Subject,$folderName,$e->getMessage()));
    +						}
    +					}
    +					else
    +					{
    +						$asf = false;
    +						debugLog(__METHOD__.__LINE__.'->'.lang("Import of message %1 failed. Destination Folder %2 does not exist.",$mailObject->Subject,$folderName));
    +					}
    +			        debugLog("IMAP-SendMail: Outgoing mail saved in configured 'Sent' folder '".$folderName."': ". (($asf)?"success":"failed"));
    +				}
    +				//$this->mail->closeConnection();
    +			}
    +		}
    +        	// unset mimedecoder - free memory
    +		unset($message);
    +        unset($mobj);
    +
    +		//$this->debugLevel=0;
    +
    +		if ($send && $asf)
    +		{
    +			return true;
    +		}
    +		else
    +		{
    +			debugLog(__METHOD__." returning 120 (MailSubmissionFailed)");
    +			return 120;   //MAIL Submission failed, see MS-ASCMD
    +		}
    +
    +	}
    +
    +	/**
    +	 *
    +	 * For meeting requests (iCal attachments with method='request') we call calendar plugin with iCal to get SyncMeetingRequest object,
    +	 * and do NOT return the attachment itself!
    +	 *
    +	 * @see activesync_plugin_read::GetMessage()
    +	 */
    +	public function GetMessage($folderid, $id, $truncsize, $bodypreference=false, $optionbodypreference=false, $mimesupport = 0)
    +	{
    +		//$this->debugLevel=4;
    +		debugLog (__METHOD__.__LINE__.' FolderID:'.$folderid.' ID:'.$id.' TruncSize:'.$truncsize.' Bodypreference: '.array2string($bodypreference));
    +		$stat = $this->StatMessage($folderid, $id);
    +		if ($this->debugLevel>3) debugLog(__METHOD__.__LINE__.array2string($stat));
    +		// StatMessage should reopen the folder in question, so we dont need folderids in the following statements.
    +		if ($stat)
    +		{
    +			debugLog(__METHOD__.__LINE__." Message $id with stat ");
    +			// initialize the object
    +			$output = new SyncMail();
    +			$headers = $this->mail->getMessageHeader($id,'',true);
    +			//$rawHeaders = $this->mail->getMessageRawHeader($id);
    +			// simple style
    +			// start AS12 Stuff (bodypreference === false) case = old behaviour
    +			if ($this->debugLevel>0) debugLog(__METHOD__.__LINE__. ' for message with ID:'.$id.' with headers:'.array2string($headers));
    +			if ($bodypreference === false) {
    +				$bodyStruct = $this->mail->getMessageBody($id, 'only_if_no_text', '', '', true);
    +				$body = $this->mail->getdisplayableBody($this->mail,$bodyStruct);
    +				$body = html_entity_decode($body,ENT_QUOTES,$this->mail->detect_encoding($body));
    +				$body = preg_replace("//is", "", $body); // in case there is only a html part
    +				// remove all other html
    +				$body = strip_tags($body);
    +				if(strlen($body) > $truncsize) {
    +					$body = utf8_truncate($body, $truncsize);
    +					$output->bodytruncated = 1;
    +				}
    +				else
    +				{
    +					$output->bodytruncated = 0;
    +				}
    +				$output->bodysize = strlen($body);
    +				$output->body = $body;
    +			}
    +			else // style with bodypreferences
    +			{
    +				if (isset($bodypreference[1]) && !isset($bodypreference[1]["TruncationSize"]))
    +					$bodypreference[1]["TruncationSize"] = 1024*1024;
    +				if (isset($bodypreference[2]) && !isset($bodypreference[2]["TruncationSize"]))
    +					$bodypreference[2]["TruncationSize"] = 1024*1024;
    +				if (isset($bodypreference[3]) && !isset($bodypreference[3]["TruncationSize"]))
    +					$bodypreference[3]["TruncationSize"] = 1024*1024;
    +				if (isset($bodypreference[4]) && !isset($bodypreference[4]["TruncationSize"]))
    +					$bodypreference[4]["TruncationSize"] = 1024*1024;
    +				// set the protocoll class
    +				$output->airsyncbasebody = new SyncAirSyncBaseBody();
    +				if ($this->debugLevel>0) debugLog("airsyncbasebody!");
    +				// fetch the body (try to gather data only once)
    +				$css ='';
    +				$bodyStruct = $this->mail->getMessageBody($id, 'html_only', '', '', true);
    +				if ($this->debugLevel>2) debugLog(__METHOD__.__LINE__.' html_only Struct:'.array2string($bodyStruct));
    +				$body = $this->mail->getdisplayableBody($this->mail,$bodyStruct,true);//$this->ui->getdisplayableBody($bodyStruct,false);
    +				if ($this->debugLevel>3) debugLog(__METHOD__.__LINE__.' html_only:'.$body);
    +			    if ($body != "" && (is_array($bodyStruct) && $bodyStruct[0]['mimeType']=='text/html')) {
    +					// may be html
    +					if ($this->debugLevel>0) debugLog("MIME Body".' Type:html (fetched with html_only)');
    +					$css = $this->mail->getStyles($bodyStruct);
    +					$output->airsyncbasenativebodytype=2;
    +				} else {
    +					// plain text Message
    +					if ($this->debugLevel>0) debugLog("MIME Body".' Type:plain, fetch text (HTML, if no text available)');
    +					$output->airsyncbasenativebodytype=1;
    +					$bodyStruct = $this->mail->getMessageBody($id,'never_display', '', '', true); //'only_if_no_text');
    +					if ($this->debugLevel>3) debugLog(__METHOD__.__LINE__.' plain text Struct:'.array2string($bodyStruct));
    +					$body = $this->mail->getdisplayableBody($this->mail,$bodyStruct);//$this->ui->getdisplayableBody($bodyStruct,false);
    +					if ($this->debugLevel>3) debugLog(__METHOD__.__LINE__.' never display html(plain text only):'.$body);
    +				}
    +				// whatever format decode (using the correct encoding)
    +				if ($this->debugLevel>3) debugLog(__METHOD__.__LINE__."MIME Body".' Type:'.($output->airsyncbasenativebodytype==2?' html ':' plain ').$body);
    +				$body = html_entity_decode($body,ENT_QUOTES,$this->mail->detect_encoding($body));
    +				// prepare plaintextbody
    +				if ($output->airsyncbasenativebodytype == 2) $plainBody = $this->mail->convertHTMLToText($body,true); // always display with preserved HTML
    +				//if ($this->debugLevel>0) debugLog("MIME Body".$body);
    +				$plainBody = preg_replace("//is", "", (strlen($plainBody)?$plainBody:$body));
    +				// remove all other html
    +				$plainBody = preg_replace("//is","\r\n",$plainBody);
    +				$plainBody = strip_tags($plainBody);
    +				if ($this->debugLevel>3 && $output->airsyncbasenativebodytype==1) debugLog(__METHOD__.__LINE__.' Plain Text:'.$plainBody);
    +				//$body = str_replace("\n","\r\n", str_replace("\r","",$body)); // do we need that?
    +				if (isset($bodypreference[4]))
    +				{
    +					debugLog(__METHOD__.__LINE__." bodypreference 4 requested");
    +					$output->airsyncbasebody->type = 4;
    +					//$rawBody = $this->mail->getMessageRawBody($id);
    +					$mailObject = new egw_mailer();
    +					// this try catch block is probably of no use anymore, as it was intended to catch exceptions thrown by parseRawMessageIntoMailObject
    +					try
    +					{
    +						// we create a complete new rfc822 message here to pass a clean one to the client.
    +						// this strips a lot of information, but ...
    +						$Header = $Body = '';
    +						if ($this->debugLevel>0) debugLog(__METHOD__.__LINE__." Creation of Mailobject.");
    +						//if ($this->debugLevel>3) debugLog(__METHOD__.__LINE__." Using data from ".$rawHeaders.$rawBody);
    +						//$this->mail->parseRawMessageIntoMailObject($mailObject,$rawHeaders.$rawBody,$Header,$Body);
    +						//debugLog(__METHOD__.__LINE__.array2string($headers));
    +						// now force UTF-8
    +						$mailObject->IsSMTP(); // needed to ensure the to part of the Header is Created too, when CreatingHeader
    +						$mailObject->CharSet = 'utf-8';
    +						$mailObject->Priority = $headers['PRIORITY'];
    +						$mailObject->Encoding = 'quoted-printable'; // we use this by default
    +
    +						$mailObject->RFCDateToSet = $headers['DATE'];
    +						$mailObject->Sender = $headers['RETURN-PATH'];
    +						$mailObject->Subject = $headers['SUBJECT'];
    +						$mailObject->MessageID = $headers['MESSAGE-ID'];
    +						// from
    +						$address_array  = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($headers['FROM']):$headers['FROM']),'');
    +						foreach((array)$address_array as $addressObject) {
    +							//debugLog(__METHOD__.__LINE__.'Address to add (FROM):'.array2string($addressObject));
    +							if ($addressObject->host == '.SYNTAX-ERROR.') continue;
    +							$mailObject->From = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : '');
    +							$mailObject->FromName = $addressObject->personal;
    +						}
    +						// to
    +						$address_array  = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($headers['TO']):$headers['TO']),'');
    +						foreach((array)$address_array as $addressObject) {
    +							//debugLog(__METHOD__.__LINE__.'Address to add (TO):'.array2string($addressObject));
    +							if ($addressObject->host == '.SYNTAX-ERROR.') continue;
    +							$mailObject->AddAddress($addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''),$addressObject->personal);
    +						}
    +						// CC
    +						$address_array  = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($headers['CC']):$headers['CC']),'');
    +						foreach((array)$address_array as $addressObject) {
    +							//debugLog(__METHOD__.__LINE__.'Address to add (CC):'.array2string($addressObject));
    +							if ($addressObject->host == '.SYNTAX-ERROR.') continue;
    +							$mailObject->AddCC($addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''),$addressObject->personal);
    +						}
    +						//	AddReplyTo
    +						$address_array  = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($headers['REPLY-TO']):$headers['REPLY-TO']),'');
    +						foreach((array)$address_array as $addressObject) {
    +							//debugLog(__METHOD__.__LINE__.'Address to add (ReplyTO):'.array2string($addressObject));
    +							if ($addressObject->host == '.SYNTAX-ERROR.') continue;
    +							$mailObject->AddReplyTo($addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''),$addressObject->personal);
    +						}
    +						$Header = $Body = ''; // we do not use Header and Body we use the MailObject
    +						if ($this->debugLevel>0) debugLog(__METHOD__.__LINE__." Creation of Mailobject succeeded.");
    +					}
    +					catch (egw_exception_assertion_failed $e)
    +					{
    +						debugLog(__METHOD__.__LINE__." Creation of Mail failed.".$e->getMessage());
    +						$Header = $Body = '';
    +					}
    +
    +					if ($this->debugLevel>0) debugLog("MIME Body -> ".$body); // body is retrieved up
    +					if ($output->airsyncbasenativebodytype==2) { //html
    +						if ($this->debugLevel>0) debugLog("HTML Body with requested pref 4");
    +						$mailObject->IsHTML(true);
    +						$html = ''.
    +	    					    ''.
    +						        ''.
    +						        ''.
    +								$css.
    +							    ''.
    +							    ''.
    +						        str_replace("\n","
    ",str_replace("\r","", str_replace("\r\n","
    ",$body))). + ''. + ''; + $mailObject->Body = str_replace("\n","\r\n", str_replace("\r","",$html)); + if ($this->debugLevel>2) debugLog(__METHOD__.__LINE__." MIME Body (constructed)-> ".$mailObject->Body); + $mailObject->AltBody = empty($plainBody)?strip_tags($body):$plainBody; + } + if ($output->airsyncbasenativebodytype==1) { //plain + if ($this->debugLevel>0) debugLog("Plain Body with requested pref 4"); + $mailObject->IsHTML(false); + $mailObject->Body = $plainBody; + $mailObject->AltBody = ''; + } + // we still need the attachments to be added ( if there are any ) + // start handle Attachments + $attachments = $this->mail->getMessageAttachments($id); + if (is_array($attachments) && count($attachments)>0) + { + debugLog(__METHOD__.__LINE__.' gather Attachments for BodyCreation of/for MessageID:'.$id.' found:'.count($attachments)); + foreach((array)$attachments as $key => $attachment) + { + if ($this->debugLevel>0) debugLog(__METHOD__.__LINE__.' Key:'.$key.'->'.array2string($attachment)); + switch($attachment['type']) + { + case 'MESSAGE/RFC822': + $rawHeader = $rawBody = ''; + if (isset($attachment['partID'])) + { + $rawHeader = $this->mail->getMessageRawHeader($id, $attachment['partID']); + } + $rawBody = $this->mail->getMessageRawBody($id, $attachment['partID']); + $mailObject->AddStringAttachment($rawHeader.$rawBody, $mailObject->EncodeHeader($attachment['name']), '7bit', 'message/rfc822'); + break; + default: + $attachmentData = ''; + $attachmentData = $this->mail->getAttachment($id, $attachment['partID']); + $mailObject->AddStringAttachment($attachmentData['attachment'], $mailObject->EncodeHeader($attachment['name']), 'base64', $attachment['mimeType']); + break; + } + } + } + + $mailObject->SetMessageType(); + $Header = $mailObject->CreateHeader(); + //debugLog(__METHOD__.__LINE__.' MailObject-Header:'.array2string($Header)); + $Body = trim($mailObject->CreateBody()); // philip thinks this is needed, so lets try if it does any good/harm + if ($this->debugLevel>3) debugLog(__METHOD__.__LINE__.' MailObject:'.array2string($mailObject)); + if ($this->debugLevel>2) debugLog(__METHOD__.__LINE__." Setting Mailobjectcontent to output:".$Header.$mailObject->LE.$mailObject->LE.$Body); + $output->airsyncbasebody->data = $Header.$mailObject->LE.$mailObject->LE.$Body; + } + else if (isset($bodypreference[2])) + { + if ($this->debugLevel>0) debugLog("HTML Body with requested pref 2"); + // Send HTML if requested and native type was html + $output->airsyncbasebody->type = 2; + $htmlbody = ''. + ''. + ''. + ''. + $css. + ''. + ''; + if ($output->airsyncbasenativebodytype==2) + { + // as we fetch html, and body is HTML, we may not need to handle this + $htmlbody .= $body; + } + else + { + // html requested but got only plaintext, so fake html + $htmlbody .= str_replace("\n","
    ",str_replace("\r","
    ", str_replace("\r\n","
    ",$plainBody))); + } + $htmlbody .= ''. + ''; + + if(isset($bodypreference[2]["TruncationSize"]) && strlen($html) > $bodypreference[2]["TruncationSize"]) + { + $htmlbody = utf8_truncate($htmlbody,$bodypreference[2]["TruncationSize"]); + $output->airsyncbasebody->truncated = 1; + } + $output->airsyncbasebody->data = $htmlbody; + } + else + { + // Send Plaintext as Fallback or if original body is plainttext + if ($this->debugLevel>0) debugLog("Plaintext Body:".$plainBody); + /* we use plainBody (set above) instead + $bodyStruct = $this->mail->getMessageBody($id,'only_if_no_text'); //'never_display'); + $plain = $this->mail->getdisplayableBody($this->mail,$bodyStruct);//$this->ui->getdisplayableBody($bodyStruct,false); + $plain = html_entity_decode($plain,ENT_QUOTES,$this->mail->detect_encoding($plain)); + $plain = strip_tags($plain); + //$plain = str_replace("\n","\r\n",str_replace("\r","",$plain)); + */ + $output->airsyncbasebody->type = 1; + if(isset($bodypreference[1]["TruncationSize"]) && + strlen($plainBody) > $bodypreference[1]["TruncationSize"]) + { + $plainBody = utf8_truncate($plainBody, $bodypreference[1]["TruncationSize"]); + $output->airsyncbasebody->truncated = 1; + } + $output->airsyncbasebody->data = $plainBody; + } + // In case we have nothing for the body, send at least a blank... + // dw2412 but only in case the body is not rtf! + if ($output->airsyncbasebody->type != 3 && (!isset($output->airsyncbasebody->data) || strlen($output->airsyncbasebody->data) == 0)) + { + $output->airsyncbasebody->data = " "; + } + // determine estimated datasize for all the above cases ... + $output->airsyncbasebody->estimateddatasize = strlen($output->airsyncbasebody->data); + } + // end AS12 Stuff + debugLog(__METHOD__.__LINE__.' gather Header info:'.$headers['SUBJECT'].' from:'.$headers['DATE']); + $output->read = $stat["flags"]; + $output->subject = $this->messages[$id]['subject']; + $output->importance = ($this->messages[$id]['priority'] ? $this->messages[$id]['priority']:1) ; + $output->datereceived = $this->mail->_strtotime($headers['DATE'],'ts',true); + $output->displayto = ($headers['TO'] ? $headers['TO']:null); //$stat['FETCHED_HEADER']['to_name'] + // $output->to = $this->messages[$id]['to_address']; //$stat['FETCHED_HEADER']['to_name'] + // $output->from = $this->messages[$id]['sender_address']; //$stat['FETCHED_HEADER']['sender_name'] + $output->to = $headers['TO']; + $output->from = $headers['FROM']; + $output->cc = ($headers['CC'] ? $headers['CC']:null); + $output->reply_to = ($headers['REPLY_TO']?$headers['REPLY_TO']:null); + $output->messageclass = "IPM.Note"; + if (stripos($this->messages[$id]['mimetype'],'multipart')!== false && + stripos($this->messages[$id]['mimetype'],'signed')!== false) + { + $output->messageclass = "IPM.Note.SMIME.MultipartSigned"; + } + // start AS12 Stuff + //$output->poommailflag = new SyncPoommailFlag(); + + if ($this->messages[$id]['flagged'] == 1) + { + $output->poommailflag = new SyncPoommailFlag(); + $output->poommailflag->flagstatus = 2; + $output->poommailflag->flagtype = "Flag for Follow up"; + } + + $output->internetcpid = 65001; + $output->contentclass="urn:content-classes:message"; + // end AS12 Stuff + + // start handle Attachments (include text/calendar multiplar alternative) + $attachments = $this->mail->getMessageAttachments($id, $_partID='', $_structure='', $fetchEmbeddedImages=true, $fetchTextCalendar=true); + if (is_array($attachments) && count($attachments)>0) + { + debugLog(__METHOD__.__LINE__.' gather Attachments for MessageID:'.$id.' found:'.count($attachments)); + foreach ($attachments as $key => $attach) + { + if ($this->debugLevel>0) debugLog(__METHOD__.__LINE__.' Key:'.$key.'->'.array2string($attach)); + + // pass meeting requests to calendar plugin + if (strtolower($attach['mimeType']) == 'text/calendar' && strtolower($attach['method']) == 'request' && + isset($GLOBALS['egw_info']['user']['apps']['calendar']) && + ($attachment = $this->mail->getAttachment($id, $attach['partID'])) && + ($output->meetingrequest = calendar_activesync::meetingRequest($attachment['attachment']))) + { + $output->messageclass = "IPM.Schedule.Meeting.Request"; + continue; // do NOT add attachment as attachment + } + if(isset($output->_mapping['POOMMAIL:Attachments'])) { + $attachment = new SyncAttachment(); + } else if(isset($output->_mapping['AirSyncBase:Attachments'])) { + $attachment = new SyncAirSyncBaseAttachment(); + } + $attachment->attsize = $attach['size']; + $attachment->displayname = $attach['name']; + $attachment->attname = $folderid . ":" . $id . ":" . $attach['partID'];//$key; + //error_log(__METHOD__.__LINE__.'->'.$folderid . ":" . $id . ":" . $attach['partID']); + $attachment->attmethod = 1; + $attachment->attoid = "";//isset($part->headers['content-id']) ? trim($part->headers['content-id']) : ""; + if (!empty($attach['cid']) && $attach['cid'] <> 'NIL' ) + { + $attachment->isinline=true; + $attachment->attmethod=6; + $attachment->contentid= $attach['cid']; + // debugLog("'".$part->headers['content-id']."' ".$attachment->contentid); + $attachment->contenttype = trim($attach['mimeType']); + // debugLog("'".$part->headers['content-type']."' ".$attachment->contentid); + } else { + $attachment->attmethod=1; + } + + if (isset($output->_mapping['POOMMAIL:Attachments'])) { + array_push($output->attachments, $attachment); + } else if(isset($output->_mapping['AirSyncBase:Attachments'])) { + array_push($output->airsyncbaseattachments, $attachment); + } + } + } + //$this->debugLevel=0; + // end handle Attachments + if ($this->debugLevel>3) debugLog(__METHOD__.__LINE__.array2string($output)); + return $output; + } + return false; + } + + /** + * Process response to meeting request + * + * fmail plugin only extracts the iCal attachment and let's calendar plugin deal with adding it + * + * @see BackendDiff::MeetingResponse() + * @param int|string $requestid uid of mail with meeting request, or < 0 for cal_id or string with iCal + * @param string $folderid folder of meeting request mail + * @param int $response 1=accepted, 2=tentative, 3=decline + * @return int|boolean id of calendar item, false on error + */ + function MeetingResponse($requestid, $folderid, $response) + { + if (!($requestid > 0)) return null; // let calendar plugin handle it's own meeting requests + + if (!class_exists('calendar_activesync')) + { + debugLog(__METHOD__."(...) no EGroupware calendar installed!"); + return null; + } + if (!($requestid > 0) || !($stat = $this->StatMessage($folderid, $requestid))) + { + debugLog(__METHOD__."($requestid, '$folderid', $response) returning FALSE (can NOT stat message)"); + return false; + } + $ret = false; + foreach($this->mail->getMessageAttachments($requestid, $_partID='', $_structure='', $fetchEmbeddedImages=true, $fetchTextCalendar=true) as $key => $attach) + { + if (strtolower($attach['mimeType']) == 'text/calendar' && strtolower($attach['method']) == 'request' && + ($attachment = $this->mail->getAttachment($requestid, $attach['partID']))) + { + debugLog(__METHOD__."($requestid, '$folderid', $response) iCal found, calling now backend->MeetingResponse('$attachment[attachment]')"); + + // calling backend again with iCal attachment, to let calendar add the event + if (($ret = $this->backend->MeetingResponse($attachment['attachment'], $folderid, $response, $calendarid))) + { + $ret = $calendarid; + } + break; + } + } + debugLog(__METHOD__."($requestid, '$folderid', $response) returning ".array2string($ret)); + return $ret; + } + + /** + * GetAttachmentData + * Should return attachment data for the specified attachment. The passed attachment identifier is + * the exact string that is returned in the 'AttName' property of an SyncAttachment. So, you should + * encode any information you need to find the attachment in that 'attname' property. + * + * @param string $fid - id + * @param string $attname - should contain (folder)id + * @return true, prints the content of the attachment + */ + function GetAttachmentData($fid,$attname) { + debugLog("getAttachmentData: (attname: '$attname')"); + + list($folderid, $id, $part) = explode(":", $attname); + + $this->splitID($folderid, $account, $folder); + + if (!isset($this->mail)) $this->mail = felamimail_bo::getInstance(false,self::$profileID); + + $this->mail->reopen($folder); + $attachment = $this->mail->getAttachment($id,$part); + print $attachment['attachment']; + unset($attachment); + return true; + } + + /** + * ItemOperationsGetAttachmentData + * Should return attachment data for the specified attachment. The passed attachment identifier is + * the exact string that is returned in the 'AttName' property of an SyncAttachment. So, you should + * encode any information you need to find the attachment in that 'attname' property. + * + * @param string $fid - id + * @param string $attname - should contain (folder)id + * @return SyncAirSyncBaseFileAttachment-object + */ + function ItemOperationsGetAttachmentData($fid,$attname) { + debugLog("ItemOperationsGetAttachmentData: (attname: '$attname')"); + + list($folderid, $id, $part) = explode(":", $attname); + + $this->splitID($folderid, $account, $folder); + + if (!isset($this->mail)) $this->mail = felamimail_bo::getInstance(false, self::$profileID); + + $this->mail->reopen($folder); + $att = $this->mail->getAttachment($id,$part); + $attachment = new SyncAirSyncBaseFileAttachment(); + /* + debugLog(__METHOD__.__LINE__.array2string($att)); + if ($arr['filename']=='error.txt' && stripos($arr['attachment'], 'felamimail_bo::getAttachment failed') !== false) + { + return $attachment; + } + */ + if (is_array($att)) { + $attachment->_data = $att['attachment']; + $attachment->contenttype = trim($att['type']); + } + unset($att); + return $attachment; + } + + /** + * StatMessage should return message stats, analogous to the folder stats (StatFolder). Entries are: + * 'id' => Server unique identifier for the message. Again, try to keep this short (under 20 chars) + * 'flags' => simply '0' for unread, '1' for read + * 'mod' => modification signature. As soon as this signature changes, the item is assumed to be completely + * changed, and will be sent to the PDA as a whole. Normally you can use something like the modification + * time for this field, which will change as soon as the contents have changed. + * + * @param string $folderid + * @param int|array $id event id or array or cal_id:recur_date for virtual exception + * @return array + */ + public function StatMessage($folderid, $id) + { + $messages = $this->fetchMessages($folderid, NULL, (array)$id); + $stat = array_shift($messages); + //debugLog (__METHOD__."('$folderid','$id') returning ".array2string($stat)); + return $stat; + } + + /** + * This function is called when a message has been changed on the PDA. You should parse the new + * message here and save the changes to disk. The return value must be whatever would be returned + * from StatMessage() after the message has been saved. This means that both the 'flags' and the 'mod' + * properties of the StatMessage() item may change via ChangeMessage(). + * Note that this function will never be called on E-mail items as you can't change e-mail items, you + * can only set them as 'read'. + */ + function ChangeMessage($folderid, $id, $message) + { + return false; + } + + /** + * This function is called when the user moves an item on the PDA. You should do whatever is needed + * to move the message on disk. After this call, StatMessage() and GetMessageList() should show the items + * to have a new parent. This means that it will disappear from GetMessageList() will not return the item + * at all on the source folder, and the destination folder will show the new message + * + */ + function MoveMessage($folderid, $id, $newfolderid) { + debugLog("IMAP-MoveMessage: (sfid: '$folderid' id: '$id' dfid: '$newfolderid' )"); + $this->splitID($folderid, $account, $srcFolder); + $this->splitID($newfolderid, $account, $destFolder); + debugLog("IMAP-MoveMessage: (SourceFolder: '$srcFolder' id: '$id' DestFolder: '$destFolder' )"); + if (!isset($this->mail)) $this->mail = felamimail_bo::getInstance(false,self::$profileID); + $this->mail->reopen($destFolder); + $status = $this->mail->getFolderStatus($destFolder); + $uidNext = $status['uidnext']; + $this->mail->reopen($srcFolder); + + // move message + $rv = $this->mail->moveMessages($destFolder,(array)$id,true,$srcFolder,true); + debugLog(__METHOD__.__LINE__.array2string($rv)); // this may be true, so try using the nextUID value by examine + // return the new id "as string"" + return ($rv===true ? $uidNext : $rv[$id]) . ""; + } + + /** + * This function is analogous to GetMessageList. + * + * @ToDo loop over available email accounts + */ + public function GetMessageList($folderid, $cutoffdate=NULL) + { + static $cutdate; + if (!empty($cutoffdate) && $cutoffdate >0 && (empty($cutdate) || $cutoffdate != $cutdate)) $cutdate = $cutoffdate; + debugLog (__METHOD__.' for Folder:'.$folderid.' SINCE:'.$cutdate); + + return $this->fetchMessages($folderid, $cutdate); + } + + private function fetchMessages($folderid, $cutoffdate=NULL, $_id=NULL) + { + if ($this->debugLevel>1) $starttime = microtime (true); + //debugLog(__METHOD__.__LINE__); + $this->_connect($this->account); + $messagelist = array(); + if (!empty($cutoffdate)) $_filter = array('type'=>"SINCE",'string'=> date("d-M-Y", $cutoffdate)); + $rv = $this->splitID($folderid,$account,$_folderName,$id); + if ($this->debugLevel>1) debugLog (__METHOD__.' for Folder:'.$_folderName.' Filter:'.array2string($_filter).' Ids:'.array2string($_id)); + $rv_messages = $this->mail->getHeaders($_folderName, $_startMessage=1, $_numberOfMessages=9999999, $_sort=0, $_reverse=false, $_filter, $_id); + if ($_id == NULL && $this->debugLevel>1) error_log(__METHOD__." found :". count($rv_messages['header'])); + //debugLog(__METHOD__.__LINE__.array2string($rv_messages)); + foreach ((array)$rv_messages['header'] as $k => $vars) + { + if ($this->debugLevel>3) debugLog(__METHOD__.__LINE__.' ID to process:'.$vars['uid'].' Subject:'.$vars['subject']); + $this->messages[$vars['uid']] = $vars; + if ($this->debugLevel>3) debugLog(__METHOD__.__LINE__.' MailID:'.$k.'->'.array2string($vars)); + if (!empty($vars['deleted'])) continue; // cut of deleted messages + if ($cutoffdate && $vars['date'] < $cutoffdate) continue; // message is out of range for cutoffdate, ignore it + if ($this->debugLevel>0) debugLog(__METHOD__.__LINE__.' ID to report:'.$vars['uid'].' Subject:'.$vars['subject']); + $mess["mod"] = $vars['date']; + $mess["id"] = $vars['uid']; + // 'seen' aka 'read' is the only flag we want to know about + $mess["flags"] = 0; + // outlook supports additional flags, set them to 0 + $mess["olflags"] = 0; + if($vars["seen"]) $mess["flags"] = 1; + if($vars["flagged"]) $mess["olflags"] = 2; + if ($this->debugLevel>3) debugLog(__METHOD__.__LINE__.array2string($mess)); + $messagelist[$vars['uid']] = $mess; + unset($mess); + } + if ($this->debugLevel>1) + { + $endtime = microtime(true) - $starttime; + error_log(__METHOD__. " time used : ".$endtime); + } + return $messagelist; + } + + + + /** + * Get ID of parent Folder or '0' for folders in root + * + * @param int $account + * @param string $folder + * @return string + */ + private function getParentID($account,$folder) + { + $this->_connect($account); + if (!isset($this->folders)) $this->folders = $this->mail->getFolderObjects(true,false); + + $fmailFolder = $this->folders[$folder]; + if (!isset($fmailFolder)) return false; + + $parent = explode($fmailFolder->delimiter,$folder); + array_pop($parent); + $parent = implode($fmailFolder->delimiter,$parent); + + $id = $parent ? $this->createID($account, $parent) : '0'; + if ($this->debugLevel>1) debugLog(__METHOD__."('$folder') --> parent=$parent --> $id"); + return $id; + } + + /** + * Get Information about a folder + * + * @param string $id + * @return SyncFolder|boolean false on error + */ + public function GetFolder($id) + { + static $last_id; + static $folderObj; + if (isset($last_id) && $last_id === $id) return $folderObj; + + try { + $this->splitID($id, $account, $folder); + } + catch(Exception $e) { + return $folderObj=false; + } + $this->_connect($account); + if (!isset($this->folders)) $this->folders = $this->mail->getFolderObjects(true,false); + + $fmailFolder = $this->folders[$folder]; + if (!isset($fmailFolder)) return $folderObj=false; + + $folderObj = new SyncFolder(); + $folderObj->serverid = $id; + $folderObj->parentid = $this->getParentID($account,$folder); + $folderObj->displayname = $fmailFolder->shortDisplayName; + if ($this->debugLevel>1) debugLog(__METHOD__.__LINE__." ID: $id, Account:$account, Folder:$folder"); + // get folder-type + foreach($this->folders as $inbox => $fmailFolder) break; + if ($folder == $inbox) + { + $folderObj->type = SYNC_FOLDER_TYPE_INBOX; + } + elseif($this->mail->isDraftFolder($folder, false)) + { + //debugLog(__METHOD__.' isDraft'); + $folderObj->type = SYNC_FOLDER_TYPE_DRAFTS; + $folderObj->parentid = 0; // required by devices + } + elseif($this->mail->isTrashFolder($folder, false)) + { + $folderObj->type = SYNC_FOLDER_TYPE_WASTEBASKET; + $this->_wasteID = $folder; + //error_log(__METHOD__.__LINE__.' TrashFolder:'.$this->_wasteID); + $folderObj->parentid = 0; // required by devices + } + elseif($this->mail->isSentFolder($folder, false)) + { + $folderObj->type = SYNC_FOLDER_TYPE_SENTMAIL; + $folderObj->parentid = 0; // required by devices + $this->_sentID = $folder; + //error_log(__METHOD__.__LINE__.' SentFolder:'.$this->_sentID); + } + elseif($this->mail->isOutbox($folder, false)) + { + //debugLog(__METHOD__.' isOutbox'); + $folderObj->type = SYNC_FOLDER_TYPE_OUTBOX; + $folderObj->parentid = 0; // required by devices + } + else + { + //debugLog(__METHOD__.' isOther Folder'.$folder); + $folderObj->type = SYNC_FOLDER_TYPE_USER_MAIL; + } + + if ($this->debugLevel>1) debugLog(__METHOD__."($id) --> $folder --> type=$folderObj->type, parentID=$folderObj->parentid, displayname=$folderObj->displayname"); + return $folderObj; + } + + /** + * Return folder stats. This means you must return an associative array with the + * following properties: + * + * "id" => The server ID that will be used to identify the folder. It must be unique, and not too long + * How long exactly is not known, but try keeping it under 20 chars or so. It must be a string. + * "parent" => The server ID of the parent of the folder. Same restrictions as 'id' apply. + * "mod" => This is the modification signature. It is any arbitrary string which is constant as long as + * the folder has not changed. In practice this means that 'mod' can be equal to the folder name + * as this is the only thing that ever changes in folders. (the type is normally constant) + * + * @return array with values for keys 'id', 'mod' and 'parent' + */ + public function StatFolder($id) + { + $folder = $this->GetFolder($id); + + $stat = array( + 'id' => $id, + 'mod' => $folder->displayname, + 'parent' => $folder->parentid, + ); + + return $stat; + } + + + /** + * Return a changes array + * + * if changes occurr default diff engine computes the actual changes + * + * @param string $folderid + * @param string &$syncstate on call old syncstate, on return new syncstate + * @return array|boolean false if $folderid not found, array() if no changes or array(array("type" => "fakeChange")) + */ + function AlterPingChanges($folderid, &$syncstate) + { + debugLog(__METHOD__.' called with '.$folderid); + $this->splitID($folderid, $account, $folder); + if (is_numeric($account)) $type = 'felamimail'; + if ($type != 'felamimail') return false; + + if (!isset($this->mail)) $this->mail = felamimail_bo::getInstance(false,self::$profileID); + + $changes = array(); + debugLog("AlterPingChanges on $folderid ($folder) stat: ". $syncstate); + $this->mail->reopen($folder); + + $status = $this->mail->getFolderStatus($folder); + if (!$status) { + debugLog("AlterPingChanges: could not stat folder $folder "); + return false; + } else { + $newstate = "M:". $status['messages'] ."-R:". $status['recent'] ."-U:". $status['unseen']."-NUID:".$status['uidnext']."-UIDV:".$status['uidvalidity']; + + // message number is different - change occured + if ($syncstate != $newstate) { + $syncstate = $newstate; + debugLog("AlterPingChanges: Change FOUND!"); + // build a dummy change + $changes = array(array("type" => "fakeChange")); + } + } + //error_log(__METHOD__."('$folderid','$syncstate_was') syncstate='$syncstate' returning ".array2string($changes)); + return $changes; + } + + /** + * Should return a wastebasket folder if there is one. This is used when deleting + * items; if this function returns a valid folder ID, then all deletes are handled + * as moves and are sent to your backend as a move. If it returns FALSE, then deletes + * are always handled as real deletes and will be sent to your importer as a DELETE + */ + function GetWasteBasket() + { + debugLog(__METHOD__.__LINE__.' called.'); + $this->_connect($this->account); + return $this->_wasteID; + } + + /** + * This function is called when the user has requested to delete (really delete) a message. Usually + * this means just unlinking the file its in or somesuch. After this call has succeeded, a call to + * GetMessageList() should no longer list the message. If it does, the message will be re-sent to the PDA + * as it will be seen as a 'new' item. This means that if you don't implement this function, you will + * be able to delete messages on the PDA, but as soon as you sync, you'll get the item back + */ + function DeleteMessage($folderid, $id) + { + debugLog("IMAP-DeleteMessage: (fid: '$folderid' id: '$id' )"); + /* + $this->imap_reopenFolder($folderid); + $s1 = @imap_delete ($this->_mbox, $id, FT_UID); + $s11 = @imap_setflag_full($this->_mbox, $id, "\\Deleted", FT_UID); + $s2 = @imap_expunge($this->_mbox); + */ + // we may have to split folderid + $this->splitID($folderid, $account, $folder); + debugLog(__METHOD__.__LINE__.' '.$folderid.'->'.$folder); + $_messageUID = (array)$id; + + $this->_connect($this->account); + $rv = $this->mail->deleteMessages($_messageUID, $folder); + // this may be a bit rude, it may be sufficient that GetMessageList does not list messages flagged as deleted + if ($this->mail->mailPreferences->preferences['deleteOptions'] == 'mark_as_deleted') + { + // ignore mark as deleted -> Expunge! + //$this->mail->icServer->expunge(); // do not expunge as GetMessageList does not List messages flagged as deleted + } + debugLog("IMAP-DeleteMessage: $rv"); + + return $rv; + } + + /** + * This should change the 'read' flag of a message on disk. The $flags + * parameter can only be '1' (read) or '0' (unread). After a call to + * SetReadFlag(), GetMessageList() should return the message with the + * new 'flags' but should not modify the 'mod' parameter. If you do + * change 'mod', simply setting the message to 'read' on the PDA will trigger + * a full resync of the item from the server + */ + function SetReadFlag($folderid, $id, $flags) + { + // debugLog("IMAP-SetReadFlag: (fid: '$folderid' id: '$id' flags: '$flags' )"); + $_messageUID = (array)$id; + $this->_connect($this->account); + $rv = $this->mail->flagMessages((($flags) ? "read" : "unread"), $_messageUID,$_folderid); + debugLog("IMAP-SetReadFlag -> set as " . (($flags) ? "read" : "unread") . "-->". $rv); + + return $rv; + } + + /** + * Creates or modifies a folder + * + * @param string $id of the parent folder + * @param string $oldid => if empty -> new folder created, else folder is to be renamed + * @param string $displayname => new folder name (to be created, or to be renamed to) + * @param string $type folder type, ignored in IMAP + * + * @return array|boolean stat array or false on error + */ + public function ChangeFolder($id, $oldid, $displayname, $type) + { + debugLog(__METHOD__."('$id', '$oldid', '$displayname', $type) NOT supported!"); + return false; + } + + /** + * Deletes (really delete) a Folder + * + * @param string $parentid of the folder to delete + * @param string $id of the folder to delete + * + * @return + * @TODO check what is to be returned + */ + public function DeleteFolder($parentid, $id) + { + debugLog(__METHOD__."('$parentid', '$id') NOT supported!"); + return false; + } + + /** + * modify olflags (outlook style) flag of a message + * + * @param $folderid + * @param $id + * @param $flags + * + * + * @DESC The $flags parameter must contains the poommailflag Object + */ + function ChangeMessageFlag($folderid, $id, $flags) + { + $_messageUID = (array)$id; + $this->_connect($this->account); + $rv = $this->mail->flagMessages((($flags->flagstatus == 2) ? "flagged" : "unflagged"), $_messageUID,$_folderid); + debugLog("IMAP-SetFlaggedFlag -> set as " . (($flags->flagstatus == 2) ? "flagged" : "unflagged") . "-->". $rv); + + return $rv; + } + + /** + * Create a max. 32 hex letter ID, current 20 chars are used + * + * @param int $account mail account id + * @param string $folder + * @param int $id=0 + * @return string + * @throws egw_exception_wrong_parameter + */ + private function createID($account,$folder,$id=0) + { + if (!is_numeric($folder)) + { + // convert string $folder in numeric id + $folder = $this->folder2hash($account,$f=$folder); + } + + $str = $this->backend->createID($account, $folder, $id); + + if ($this->debugLevel>1) debugLog(__METHOD__."($account,'$f',$id) type=$account, folder=$folder --> '$str'"); + + return $str; + } + + /** + * Split an ID string into $app, $folder and $id + * + * @param string $str + * @param int &$account mail account id + * @param string &$folder + * @param int &$id=null + * @throws egw_exception_wrong_parameter + */ + private function splitID($str,&$account,&$folder,&$id=null) + { + $this->backend->splitID($str, $account, $folder, $id=null); + + // convert numeric folder-id back to folder name + $folder = $this->hash2folder($account,$f=$folder); + + if ($this->debugLevel>1) debugLog(__METHOD__."('$str','$account','$folder',$id)"); + } + + /** + * Methods to convert (hierarchical) folder names to nummerical id's + * + * This is currently done by storing a serialized array in the device specific + * state directory. + */ + + /** + * Convert folder string to nummeric hash + * + * @param int $account + * @param string $folder + * @return int + */ + private function folder2hash($account,$folder) + { + if(!isset($this->folderHashes)) $this->readFolderHashes(); + + if (($index = array_search($folder, (array)$this->folderHashes[$account])) === false) + { + // new hash + $this->folderHashes[$account][] = $folder; + $index = array_search($folder, (array)$this->folderHashes[$account]); + + // maybe later storing in on class destruction only + $this->storeFolderHashes(); + } + return $index; + } + + /** + * Convert numeric hash to folder string + * + * @param int $account + * @param int $index + * @return string NULL if not used so far + */ + private function hash2folder($account,$index) + { + if(!isset($this->folderHashes)) $this->readFolderHashes(); + + return $this->folderHashes[$account][$index]; + } + + private $folderHashes; + + /** + * Read hashfile from state dir + */ + private function readFolderHashes() + { + if (file_exists($file = $this->hashFile()) && + ($hashes = file_get_contents($file))) + { + $this->folderHashes = unserialize($hashes); + } + else + { + $this->folderHashes = array(); + } + } + + /** + * Store hashfile in state dir + * + * return int|boolean false on error + */ + private function storeFolderHashes() + { + return file_put_contents($this->hashFile(), serialize($this->folderHashes)); + } + + /** + * Get name of hashfile in state dir + * + * @throws egw_exception_assertion_failed + */ + private function hashFile() + { + if (!isset($this->backend->_devid)) + { + throw new egw_exception_assertion_failed(__METHOD__."() called without this->_devid set!"); + } + return STATE_DIR.'/'.strtolower($this->backend->_devid).'/'.$this->backend->_devid.'.hashes'; + } + +} diff --git a/felamimail/inc/class.felamimail_bo.inc.php b/felamimail/inc/class.felamimail_bo.inc.php new file mode 100644 index 0000000000..8992182326 --- /dev/null +++ b/felamimail/inc/class.felamimail_bo.inc.php @@ -0,0 +1,4595 @@ + + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * FeLaMiMail worker class + * -provides backend functionality for all classes in FeLaMiMail + * -provides classes that may be used by other apps too + */ +class felamimail_bo +{ + var $public_functions = array + ( + 'flagMessages' => True, + ); + + static $debug = false; //true; // sometimes debuging is quite handy, to see things. check with the error log to see results + // define some constants + // message types + var $type = array("text", "multipart", "message", "application", "audio", "image", "video", "other"); + + // message encodings + var $encoding = array("7bit", "8bit", "binary", "base64", "quoted-printable", "other"); + static $displayCharset; + /** + * Instance of bopreference + * + * @var bopreferences + */ + var $bopreferences; + /** + * Active preferences + * + * @var array + */ + var $mailPreferences; + // set to true, if php is compiled with multi byte string support + var $mbAvailable = FALSE; + + // what type of mimeTypes do we want from the body(text/html, text/plain) + var $htmlOptions; + + var $sessionData; + + // the current selected user profile + var $profileID = 0; + + /** + * Folders that get automatic created AND get translated to the users language + * their creation is also controlled by users mailpreferences. if set to none / dont use folder + * the folder will not be automatically created. This is controlled in bofelamimail->getFolderObjects + * so changing names here, must include a change of keywords there as well. Since these + * foldernames are subject to translation, keep that in mind too, if you change names here. + * ActiveSync: + * Outbox is needed by Nokia Clients to be able to send Mails + * @var array + */ + static $autoFolders = array('Drafts', 'Templates', 'Sent', 'Trash', 'Junk', 'Outbox'); + + /** + * Autoload classes from emailadmin, 'til they get autoloading conform names + * + * @param string $class + */ + static function autoload($class) + { + if (file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php')) + { + include_once($file); + //error_log(__METHOD__."($class) included $file"); + } + elseif (file_exists($file=EGW_INCLUDE_ROOT.'/felamimail/inc/class.'.$class.'.inc.php')) + { + include_once($file); + } + else + { + #error_log(__METHOD__."($class) failed!"); + } + } + + /** + * Hold instances by profileID for getInstances() singleton + * + * @var array + */ + private static $instances = array(); + + /** + * Singleton for felamimail_bo + * + * @param boolean $_restoreSession=true + * @param int $_profileID=0 + */ + public static function getInstance($_restoreSession=true, $_profileID=0) + { + //error_log(__METHOD__.__LINE__.' RestoreSession:'.$_restoreSession.' ProfileId:'.$_profileID.' called from:'.function_backtrace()); + if (!isset(self::$instances[$_profileID])) + { + self::$instances[$_profileID] = new felamimail_bo('utf-8',$_restoreSession,$_profileID); + } + else + { + // make sure the prefs are up to date for the profile to load + self::$instances[$_profileID]->mailPreferences = self::$instances[$_profileID]->bopreferences->getPreferences(true,$_profileID); + //error_log(__METHOD__.__LINE__." ReRead the Prefs for ProfileID ".$_profileID.' called from:'.function_backtrace()); + if (self::$instances[$_profileID]->mailPreferences) { + self::$instances[$_profileID]->icServer = self::$instances[$_profileID]->mailPreferences->getIncomingServer($_profileID); + if ($_profileID != 0) self::$instances[$_profileID]->mailPreferences->setIncomingServer(self::$instances[$_profileID]->icServer,0); + self::$instances[$_profileID]->ogServer = self::$instances[$_profileID]->mailPreferences->getOutgoingServer($_profileID); + if ($_profileID != 0) self::$instances[$_profileID]->mailPreferences->setOutgoingServer(self::$instances[$_profileID]->ogServer,0); + self::$instances[$_profileID]->htmlOptions = self::$instances[$_profileID]->mailPreferences->preferences['htmlOptions']; + } + } + self::$instances[$_profileID]->profileID = $_profileID; + //error_log(__METHOD__.__LINE__.' RestoreSession:'.$_restoreSession.' ProfileId:'.$_profileID); + return self::$instances[$_profileID]; + } + + /** + * Private constructor, use felamimail_bo::getInstance() instead + * + * @param string $_displayCharset='utf-8' + * @param boolean $_restoreSession=true + * @param int $_profileID=0 + */ + private function __construct($_displayCharset='utf-8',$_restoreSession=true, $_profileID=0) + { + $this->profileID = $_profileID; + if ($_restoreSession) + { + //error_log(__METHOD__." Session restore ".function_backtrace()); + $this->restoreSessionData(); + $lv_mailbox = $this->sessionData['mailbox']; + $firstMessage = $this->sessionData['previewMessage']; + } + else + { + $this->restoreSessionData(); + $lv_mailbox = $this->sessionData['mailbox']; + $firstMessage = $this->sessionData['previewMessage']; + $this->sessionData = array(); + $this->forcePrefReload(); + } + //error_log(array2string(array($firstMessage,$lv_mailbox))); + // FIXME: this->foldername seems to be unused + //$this->foldername = $this->sessionData['mailbox']; + $this->accountid = $GLOBALS['egw_info']['user']['account_id']; + + $this->bopreferences = CreateObject('felamimail.bopreferences',$_restoreSession); + + $this->mailPreferences = $this->bopreferences->getPreferences(true,$this->profileID); + //error_log(__METHOD__.__LINE__." ProfileID ".$this->profileID.' called from:'.function_backtrace()); + if ($this->mailPreferences) { + $this->icServer = $this->mailPreferences->getIncomingServer($this->profileID); + if ($this->profileID != 0) $this->mailPreferences->setIncomingServer($this->icServer,0); + $this->ogServer = $this->mailPreferences->getOutgoingServer($this->profileID); + if ($this->profileID != 0) $this->mailPreferences->setOutgoingServer($this->ogServer,0); + $this->htmlOptions = $this->mailPreferences->preferences['htmlOptions']; + } + //_debug_array($this->mailPreferences->preferences); + $this->imapBaseDir = ''; + + self::$displayCharset = $_displayCharset; + if(function_exists(mb_decode_mimeheader)) { + mb_internal_encoding(self::$displayCharset); + } + + // set some defaults + if(empty($this->sessionData)) + { + // this should be under user preferences + // sessionData empty + // store active profileID + $this->sessionData['profileID'] = $_profileID; + // no filter active + $this->sessionData['activeFilter'] = "-1"; + // default mailbox INBOX + $this->sessionData['mailbox'] = (($lv_mailbox && self::folderExists($lv_mailbox,true)) ? $lv_mailbox : "INBOX"); + $this->sessionData['previewMessage'] = ($firstMessage >0 ? $firstMessage : 0); + // default start message + $this->sessionData['startMessage'] = 1; + // default mailbox for preferences pages + $this->sessionData['preferences']['mailbox'] = "INBOX"; + + $this->sessionData['messageFilter'] = array( + 'string' => '', + 'type' => 'quick', + 'status' => 'any', + ); + + // default sorting + switch($GLOBALS['egw_info']['user']['preferences']['felamimail']['sortOrder']) { + case 1: + $this->sessionData['sort'] = SORTDATE; + $this->sessionData['sortReverse'] = false; + break; + case 2: + $this->sessionData['sort'] = SORTFROM; + $this->sessionData['sortReverse'] = true; + break; + case 3: + $this->sessionData['sort'] = SORTFROM; + $this->sessionData['sortReverse'] = false; + break; + case 4: + $this->sessionData['sort'] = SORTSUBJECT; + $this->sessionData['sortReverse'] = true; + break; + case 5: + $this->sessionData['sort'] = SORTSUBJECT; + $this->sessionData['sortReverse'] = false; + break; + case 6: + $this->sessionData['sort'] = SORTSIZE; + $this->sessionData['sortReverse'] = true; + break; + case 7: + $this->sessionData['sort'] = SORTSIZE; + $this->sessionData['sortReverse'] = false; + break; + default: + $this->sessionData['sort'] = SORTDATE; + $this->sessionData['sortReverse'] = true; + break; + } + $this->saveSessionData(); + } + + if (function_exists('mb_convert_encoding')) { + $this->mbAvailable = TRUE; + } + + } + + public static function forcePrefReload() + { + // unset the fm_preferences session object, to force the reload/rebuild + $GLOBALS['egw']->session->appsession('fm_preferences','felamimail',serialize(array())); + $GLOBALS['egw']->session->appsession('session_data','emailadmin',serialize(array())); + } + + function getFolderPrefixFromNamespace($nameSpace, $folderName) + { + foreach($nameSpace as $type => $singleNameSpace) + { + if($type == 'personal' && substr($singleNameSpace[2]['name'],0,strlen($folderName))==$folderName && ($singleNameSpace[2]['name'] == '#mh/' || count($nameSpace) == 1) && $this->icServer->mailboxExist('Mail')) { + // uw-imap server with mailbox prefix or dovecot maybe + return 'Mail'; + } elseif($type == 'personal' && substr($singleNameSpace[2]['name'],0,strlen($folderName))==$folderName && ($singleNameSpace[2]['name'] == '#mh/' || count($nameSpace) == 1) && $this->icServer->mailboxExist('mail')) { + // uw-imap server with mailbox prefix or dovecot maybe + return 'mail'; + } else { + return (substr($singleNameSpace[0]['name'],0,strlen($folderName))==$folderName ? $singleNameSpace[0]['name'] : ''); + } + } + } + + function setACL($_folderName, $_accountName, $_acl, $_recursive=false) + { + //$_recursive=true; + //error_log(__METHOD__.__LINE__.'-> called with:'."$_folderName, $_accountName, $_acl, $_recursive"); + if ( PEAR::isError($this->icServer->setACL($_folderName, $_accountName, $_acl)) ) { + return false; + } + if ($_recursive) + { + $delimiter = $this->getHierarchyDelimiter(); + $nameSpace = $this->icServer->getNameSpaces(); + $prefix = $this->getFolderPrefixFromNamespace($nameSpace, $_folderName); + //error_log(__METHOD__.__LINE__.'->'."$_folderName, $delimiter, $prefix"); + + $subFolders = $this->getMailBoxesRecursive($_folderName, $delimiter, $prefix); + //error_log(__METHOD__.__LINE__.' Fetched Subfolders->'.array2string($subFolders)); + foreach ($subFolders as $k => $folder) + { + // we do not monitor failure or success on subfolders + if ($folder <> $_folderName) $this->icServer->setACL($folder, $_accountName, $_acl); + } + } + return TRUE; + } + + function deleteACL($_folderName, $_accountName, $_recursive=false) + { + //$_recursive=true; + //error_log(__METHOD__.__LINE__." calledv with: $_folderName, $_accountName, $_recursive"); + if ( PEAR::isError($this->icServer->deleteACL($_folderName, $_accountName)) ) { + return false; + } + if ($_recursive) + { + $delimiter = $this->getHierarchyDelimiter(); + $nameSpace = $this->icServer->getNameSpaces(); + $prefix = $this->getFolderPrefixFromNamespace($nameSpace, $_folderName); + //error_log(__METHOD__.__LINE__.'->'."$_folderName, $delimiter, $prefix"); + + $subFolders = $this->getMailBoxesRecursive($_folderName, $delimiter, $prefix); + //error_log(__METHOD__.__LINE__.' Fetched Subfolders->'.array2string($subFolders)); + foreach ($subFolders as $k => $folder) + { + // we do not monitor failure or success on subfolders + if ($folder <> $_folderName) $this->icServer->deleteACL($folder, $_accountName); + } + } + return TRUE; + } + + /** + * hook to add account + * + * this function is a wrapper function for emailadmin + * + * @param _hookValues contains the hook values as array + * @return nothing + */ + function addAccount($_hookValues) + { + if ($this->mailPreferences) { + $icServer = $this->mailPreferences->getIncomingServer($this->profileID); + if(is_a($icServer,'defaultimap')) { + // if not connected, try opening an admin connection + if (!$icServer->_connected) $this->openConnection($this->profileID,true); + $icServer->addAccount($_hookValues); + if ($icServer->_connected) $this->closeConnection(); // close connection afterwards + } + + $ogServer = $this->mailPreferences->getOutgoingServer($this->profileID); + if(is_a($ogServer,'defaultsmtp')) { + $ogServer->addAccount($_hookValues); + } + } + } + + /** + * save a message in folder + * throws exception on failure + * @todo set flags again + * + * @param string _folderName the foldername + * @param string _header the header of the message + * @param string _body the body of the message + * @param string _flags the imap flags to set for the saved message + * + * @return the id of the message appended or exception + */ + function appendMessage($_folderName, $_header, $_body, $_flags) + { + $header = ltrim(str_replace("\n","\r\n",$_header)); + $body = str_replace("\n","\r\n",$_body); + $messageid = $this->icServer->appendMessage("$header"."$body", $_folderName, $_flags); + if ( PEAR::isError($messageid)) { + if (self::$debug) error_log("Could not append Message:".print_r($messageid->message,true)); + throw new egw_exception_wrong_userinput(lang("Could not append Message:".array2string($messageid->message))); + //return false; + } + if ($messageid === true) // try to figure out the message uid + { + $list = $this->getHeaders($_folderName, $_startMessage=1, $_numberOfMessages=1, $_sort=0, $_reverse=true, $_filter=array()); + if ($list) + { + if (self::$debug) error_log(__METHOD__.__LINE__.' MessageUid:'.$messageid.' but found:'.array2string($list)); + $messageid = $list['header'][0]['uid']; + } + } + return $messageid; + } + + function closeConnection() { + if ($icServer->_connected) $this->icServer->disconnect(); + } + + /** + * remove any messages which are marked as deleted or + * remove any messages from the trashfolder + * + * @param string _folderName the foldername + * @return nothing + */ + function compressFolder($_folderName = false) + { + $folderName = ($_folderName ? $_folderName : $this->sessionData['mailbox']); + $deleteOptions = $GLOBALS['egw_info']['user']['preferences']['felamimail']['deleteOptions']; + $trashFolder = $this->mailPreferences->preferences['trashFolder']; //$GLOBALS['egw_info']['user']['preferences']['felamimail']['trashFolder']; + + $this->icServer->selectMailbox($folderName); + + if($folderName == $trashFolder && $deleteOptions == "move_to_trash") { + $this->icServer->deleteMessages('1:*'); + $this->icServer->expunge(); + } else { + $this->icServer->expunge(); + } + } + + /** + * create a new folder under given parent folder + * + * @param string _parent the parent foldername + * @param string _folderName the new foldername + * @param bool _subscribe subscribe to the new folder + * + * @return mixed name of the newly created folder or false on error + */ + function createFolder($_parent, $_folderName, $_subscribe=false) + { + $parent = $this->_encodeFolderName($_parent); + $folderName = $this->_encodeFolderName($_folderName); + + if(empty($parent)) { + $newFolderName = $folderName; + } else { + $HierarchyDelimiter = $this->getHierarchyDelimiter(); + $newFolderName = $parent . $HierarchyDelimiter . $folderName; + } + if (self::folderExists($newFolderName)) + { + error_log(__METHOD__.__LINE__." Folder $newFolderName already exists."); + return $newFolderName; + } + if ( PEAR::isError($this->icServer->createMailbox($newFolderName) ) ) { + return false; + } + + if ( PEAR::isError($this->icServer->subscribeMailbox($newFolderName) ) ) { + return false; + } + + return $newFolderName; + + } + + function createIMAPFilter($_folder, $_criterias) + { + //_debug_array($_criterias); + if(!is_array($_criterias)) { + return 'ALL'; + } + #error_log(print_r($_criterias, true)); + $imapFilter = ''; + + #foreach($_criterias as $criteria => $parameter) { + if(!empty($_criterias['string'])) { + $criteria = strtoupper($_criterias['type']); + switch ($criteria) { + case 'QUICK': + if($this->isSentFolder($_folder)) { + $imapFilter .= 'OR SUBJECT "'. $_criterias['string'] .'" TO "'. $_criterias['string'] .'" '; + } else { + $imapFilter .= 'OR SUBJECT "'. $_criterias['string'] .'" FROM "'. $_criterias['string'] .'" '; + } + break; + case 'BCC': + case 'BODY': + case 'CC': + case 'FROM': + case 'KEYWORD': + case 'SUBJECT': + case 'TEXT': + case 'TO': + $imapFilter .= $criteria .' "'. $_criterias['string'] .'" '; + break; + case 'SINCE': + case 'BEFORE': + case 'ON': + $imapFilter .= $criteria .' '. $_criterias['string'].' '; + break; + } + } + + #foreach($_criterias as $criteria => $parameter) { + $criteria = strtoupper($_criterias['status']); + switch ($criteria) { + case 'ANSWERED': + case 'DELETED': + case 'FLAGGED': + case 'NEW': + case 'OLD': + case 'RECENT': + case 'SEEN': + case 'UNANSWERED': + case 'UNDELETED': + case 'UNFLAGGED': + case 'UNSEEN': + $imapFilter .= $criteria .' '; + break; + } + #} + if (isset($_criterias['range']) && !empty($_criterias['range'])) + { + $imapFilter .= $_criterias['range'].' '; + } + //error_log("Filter: $imapFilter"); + if($imapFilter == '') { + return 'ALL'; + } else { + return trim($imapFilter); + #return 'CHARSET '. strtoupper(self::$displayCharset) .' '. trim($imapFilter); + } + } + + /** + * convert a mailboxname from displaycharset to urf7-imap + * + * @param string _folderName the foldername + * + * @return string the converted foldername + */ + function decodeFolderName($_folderName) + { + return translation::convert($_folderName, self::$displayCharset, 'UTF7-IMAP'); + } + + function decodeMimePart($_mimeMessage, $_encoding, $_charset = '') + { + // decode the part + if (self::$debug) error_log(__METHOD__."() with $_encoding and $_charset:".print_r($_mimeMessage,true)); + switch (strtoupper($_encoding)) + { + case 'BASE64': + // use imap_base64 to decode, not any longer, as it is strict, and fails if it encounters invalid chars + return base64_decode($_mimeMessage); //imap_base64($_mimeMessage); + break; + case 'QUOTED-PRINTABLE': + // use imap_qprint to decode + return quoted_printable_decode($_mimeMessage); + break; + default: + // it is either not encoded or we don't know about it + return $_mimeMessage; + break; + } + } + + /** + * decode header (or envelope information) + * if array given, note that only values will be converted + * @param mixed $_string input to be converted, if array call decode_header recursively on each value + * @return mixed - based on the input type + */ + static function decode_header($_string) + { + if (is_array($_string)) + { + foreach($_string as $k=>$v) + { + $_string[$k] = self::decode_header($v); + } + return $_string; + } + else + { + return translation::decodeMailHeader($_string,self::$displayCharset); + } + } + + function decode_subject($_string,$decode=true) + { + #$string = $_string; + if($_string=='NIL') + { + return 'No Subject'; + } + if ($decode) $_string = self::decode_header($_string); + return $_string; + + } + + /** + * decodes winmail.dat attachments + * + * @param int $_uid + * @param string $_partID + * @param int $_filenumber + * @return array + */ + function decode_winmail( $_uid, $_partID, $_filenumber=0 ) + { + $attachment = $this->getAttachment( $_uid, $_partID ); + $dirname = $this->accountid.'_'.$this->profileID.'_'.$this->sessionData['mailbox'].'_'.$_uid.'_'.$_partID; + if (self::$debug) error_log(__METHOD__.__LINE__.' Dirname:'.$dirname); + $dirname = md5($dirname); + $dir = $GLOBALS['egw_info']['server']['temp_dir']."/fmail_winmail/$dirname"; + if (self::$debug) error_log(__METHOD__.__LINE__.' Dir to save winmail.dat to:'.$dir); + $mime = CreateObject('phpgwapi.mime_magic'); + if ( $attachment['type'] == 'APPLICATION/MS-TNEF' && $attachment['filename'] == 'winmail.dat' ) + { + // decode winmail.dat + if ( !file_exists( "$dir/winmail.dat" ) ) + { + @mkdir( $dir, 0700, true ); + file_put_contents( "$dir/winmail.dat", $attachment['attachment'] ); + + } + //if (self::$debug) unset($attachment['attachment']); + if (self::$debug) error_log(__METHOD__.__LINE__." Saving Attachment to $dir. ->".array2string($attachment)); + if (file_exists('/usr/bin/tnef')) + { + exec( "cd $dir && /usr/bin/tnef --save-body --overwrite -C $dir -f ./winmail.dat" ); + } + elseif (exec("which tnef")) // use tnef if exsting, as it gives better results.. + { + exec( "cd $dir && tnef --save-body --overwrite -C $dir -f ./winmail.dat" ); + } + elseif (exec("which ytnef")) + { + exec( "cd $dir && ytnef -f . winmail.dat" ); + } + // list contents + $files = scandir( $dir ); + foreach ( $files as $num => $file ) + { + if ( filetype( "$dir/$file" ) != 'file' || $file == 'winmail.dat' ) continue; + if ( $_filenumber > 0 && $_filenumber != $num ) continue; + $type = $mime->filename2mime($file); + $attachments[] = array( + 'is_winmail' => $num, + 'name' => self::decode_header($file), + 'size' => filesize( "$dir/$file"), + 'partID' => $_partID, + 'mimeType' => $type, + 'type' => $type, + 'attachment' => $_filenumber > 0 ? file_get_contents("$dir/$file") : '', + ); + unlink($dir."/".$file); + } + if (file_exists($dir."/winmail.dat")) unlink($dir."/winmail.dat"); + if (file_exists($dir)) @rmdir($dir); + return $_filenumber > 0 ? $attachments[0] : $attachments; + } + return false; + } + + function deleteAccount($_hookValues) + { + if ($this->mailPreferences) { + $icServer = $this->mailPreferences->getIncomingServer($this->profileID); + if(is_a($icServer,'defaultimap')) { + //try to connect with admin rights, when not connected + if (!$icServer->_connected) $this->openConnection($this->profileID,true); + $icServer->deleteAccount($_hookValues); + if ($icServer->_connected) $this->closeConnection(); // close connection + } + + $ogServer = $this->mailPreferences->getOutgoingServer($this->profileID); + if(is_a($ogServer,'defaultsmtp')) { + $ogServer->deleteAccount($_hookValues); + } + } + } + + /** + * delete a existing folder + * + * @param string _folderName the name of the folder to be deleted + * + * @return bool true on success, false on failure + */ + function deleteFolder($_folderName) + { + $folderName = $this->_encodeFolderName($_folderName); + + $this->icServer->unsubscribeMailbox($folderName); + if ( PEAR::isError($this->icServer->deleteMailbox($folderName)) ) { + return false; + } + + return true; + } + + function deleteMessages($_messageUID, $_folder=NULL) + { + $msglist = ''; + $oldMailbox = ''; + if (is_null($_folder) || empty($_folder)) $_folder = $this->sessionData['mailbox']; + if(!is_array($_messageUID) || count($_messageUID) === 0) + { + if ($_messageUID=='all') + { + $_messageUID= null; + } + else + { + if (self::$debug) error_log(__METHOD__." no messages Message(s): ".implode(',',$_messageUID)); + return false; + } + } + + $deleteOptions = $this->mailPreferences->preferences['deleteOptions']; + $trashFolder = $this->mailPreferences->preferences['trashFolder']; + $draftFolder = $this->mailPreferences->preferences['draftFolder']; //$GLOBALS['egw_info']['user']['preferences']['felamimail']['draftFolder']; + $templateFolder = $this->mailPreferences->preferences['templateFolder']; //$GLOBALS['egw_info']['user']['preferences']['felamimail']['templateFolder']; + + if(($this->sessionData['mailbox'] == $trashFolder && $deleteOptions == "move_to_trash") || + ($this->sessionData['mailbox'] == $draftFolder)) { + $deleteOptions = "remove_immediately"; + } + if($this->icServer->getCurrentMailbox() != $_folder) { + $oldMailbox = $this->icServer->getCurrentMailbox(); + $this->icServer->selectMailbox($_folder); + } + + switch($deleteOptions) { + case "move_to_trash": + if(!empty($trashFolder)) { + if (self::$debug) error_log(implode(' : ', $_messageUID)); + if (self::$debug) error_log("$trashFolder <= ". $this->sessionData['mailbox']); + // copy messages + $retValue = $this->icServer->copyMessages($trashFolder, $_messageUID, $_folder, true); + if ( PEAR::isError($retValue) ) { + if (self::$debug) error_log(__METHOD__." failed to copy Message(s) to $trashFolder: ".implode(',',$_messageUID)); + throw new egw_exception("failed to copy Message(s) to $trashFolder: ".implode(',',$_messageUID).' due to:'.array2string($retValue->message)); + return false; + } + // mark messages as deleted + $retValue = $this->icServer->deleteMessages($_messageUID, true); + if ( PEAR::isError($retValue)) { + if (self::$debug) error_log(__METHOD__." failed to delete Message(s): ".implode(',',$_messageUID).' due to:'.$retValue->message); + throw new egw_exception("failed to delete Message(s): ".implode(',',$_messageUID).' due to:'.array2string($retValue->message)); + return false; + } + // delete the messages finaly + $this->icServer->expunge(); + } + break; + + case "mark_as_deleted": + // mark messages as deleted + foreach((array)$_messageUID as $key =>$uid) + { + $flags = $this->getFlags($uid); + if (strpos( array2string($flags),'Deleted')!==false) $undelete[] = $uid; + unset($flags); + } + $retValue = PEAR::isError($this->icServer->deleteMessages($_messageUID, true)); + foreach((array)$undelete as $key =>$uid) + { + $this->flagMessages('undelete', $uid, $oldMailbox); + } + if ( PEAR::isError($retValue)) { + if (self::$debug) error_log(__METHOD__." failed to mark as deleted for Message(s): ".implode(',',$_messageUID)); + throw new egw_exception("failed to mark as deleted for Message(s): ".implode(',',$_messageUID).' due to:'.array2string($retValue->message)); + return false; + } + break; + + case "remove_immediately": + // mark messages as deleted + $retValue = $this->icServer->deleteMessages($_messageUID, true); + if ( PEAR::isError($retValue)) { + if (self::$debug) error_log(__METHOD__." failed to remove immediately Message(s): ".implode(',',$_messageUID)); + throw new egw_exception("failed to remove immediately Message(s): ".implode(',',$_messageUID).' due to:'.array2string($retValue->message)); + return false; + } + // delete the messages finaly + $this->icServer->expunge(); + break; + } + + if($oldMailbox != '') { + $this->icServer->selectMailbox($oldMailbox); + } + + return true; + } + + /** + * convert a mailboxname from utf7-imap to displaycharset + * + * @param string _folderName the foldername + * + * @return string the converted string + */ + function encodeFolderName($_folderName) + { + return translation::convert($_folderName, 'UTF7-IMAP', self::$displayCharset); + } + +# function encodeHeader($_string, $_encoding='q') +# { +# switch($_encoding) { +# case "q": +# if(!preg_match("/[\x80-\xFF]/",$_string)) { +# // nothing to quote, only 7 bit ascii +# return $_string; +# } +# +# $string = imap_8bit($_string); +# $stringParts = explode("=\r\n",$string); +# while(list($key,$value) = each($stringParts)) { +# if(!empty($retString)) $retString .= " "; +# $value = str_replace(" ","_",$value); +# // imap_8bit does not convert "?" +# // it does not need, but it should +# $value = str_replace("?","=3F",$value); +# $retString .= "=?".strtoupper(self::$displayCharset). "?Q?". $value. "?="; +# } +# #exit; +# return $retString; +# break; +# default: +# return $_string; +# } +# } + function getFlags ($_messageUID) { + $flags = $this->icServer->getFlags($_messageUID, true); + if (PEAR::isError($flags)) { + return null; + } + return $flags; + } + + function getNotifyFlags ($_messageUID) { + $flags = $this->icServer->getFlags($_messageUID, true); + if (self::$debug) error_log(__METHOD__.$_messageUID.array2string($flags)); + if (PEAR::isError($flags)) { + return null; + } + if ( in_array('MDNSent',$flags[0]) ) + return true; + + if ( in_array('MDNnotSent',$flags[0]) ) + return false; + + return null; + } + + /** + * flag a Message + * + * @param string _flag (readable name) + * @param mixed array/string _messageUID array of ids to flag, or 'all' + * @param string _folder foldername + * + * @todo handle handle icserver->setFlags returnValue + * + * @return bool true, as we do not handle icserver->setFlags returnValue + */ + function flagMessages($_flag, $_messageUID,$_folder=NULL) + { + //error_log(__METHOD__.__LINE__.'->' .$_flag."$_messageUID,$_folder"); + if(!is_array($_messageUID)) { + #return false; + if ($_messageUID=='all') + { + //all is an allowed value to be passed + } + else + { + $_messageUID=array($_messageUID); + } + } + + $this->icServer->selectMailbox(($_folder?$_folder:$this->sessionData['mailbox'])); + + switch($_flag) { + case "undelete": + $this->icServer->setFlags($_messageUID, '\\Deleted', 'remove', true); + break; + case "flagged": + $this->icServer->setFlags($_messageUID, '\\Flagged', 'add', true); + break; + case "read": + $this->icServer->setFlags($_messageUID, '\\Seen', 'add', true); + break; + case "forwarded": + $this->icServer->setFlags($_messageUID, '$Forwarded', 'add', true); + case "answered": + $this->icServer->setFlags($_messageUID, '\\Answered', 'add', true); + break; + case "unflagged": + $this->icServer->setFlags($_messageUID, '\\Flagged', 'remove', true); + break; + case "unread": + $this->icServer->setFlags($_messageUID, '\\Seen', 'remove', true); + $this->icServer->setFlags($_messageUID, '\\Answered', 'remove', true); + $this->icServer->setFlags($_messageUID, '$Forwarded', 'remove', true); + break; + case "mdnsent": + $this->icServer->setFlags($_messageUID, 'MDNSent', 'add', true); + break; + case "mdnnotsent": + $this->icServer->setFlags($_messageUID, 'MDNnotSent', 'add', true); + break; + } + + $this->sessionData['folderStatus'][$this->profileID][$this->sessionData['mailbox']]['uidValidity'] = 0; + $this->saveSessionData(); + return true; // as we do not catch/examine setFlags returnValue + } + + function _getSubStructure($_structure, $_partID) + { + $tempID = ''; + $structure = $_structure; + if (empty($_partID)) $_partID=1; + $imapPartIDs = explode('.',$_partID); + #error_log(print_r($structure,true)); + #error_log(print_r($_partID,true)); + + if($_partID != 1) { + foreach($imapPartIDs as $imapPartID) { + if(!empty($tempID)) { + $tempID .= '.'; + } + $tempID .= $imapPartID; + #error_log(print_r( "TEMPID: $tempID
    ",true)); + //_debug_array($structure); + if($structure->subParts[$tempID]->type == 'MESSAGE' && $structure->subParts[$tempID]->subType == 'RFC822' && + count($structure->subParts[$tempID]->subParts) == 1 && + $structure->subParts[$tempID]->subParts[$tempID]->type == 'MULTIPART' && + ($structure->subParts[$tempID]->subParts[$tempID]->subType == 'MIXED' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'ALTERNATIVE' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'RELATED' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'REPORT')) + { + $structure = $structure->subParts[$tempID]->subParts[$tempID]; + } else { + $structure = $structure->subParts[$tempID]; + } + } + } + + if($structure->partID != $_partID) { + foreach($imapPartIDs as $imapPartID) { + if(!empty($tempID)) { + $tempID .= '.'; + } + $tempID .= $imapPartID; + //print "TEMPID: $tempID
    "; + //_debug_array($structure); + if($structure->subParts[$tempID]->type == 'MESSAGE' && $structure->subParts[$tempID]->subType == 'RFC822' && + count($structure->subParts[$tempID]->subParts) == 1 && + $structure->subParts[$tempID]->subParts[$tempID]->type == 'MULTIPART' && + ($structure->subParts[$tempID]->subParts[$tempID]->subType == 'MIXED' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'ALTERNATIVE' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'RELATED' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'REPORT')) { + $structure = $structure->subParts[$tempID]->subParts[$tempID]; + } else { + $structure = $structure->subParts[$tempID]; + } + } + if($structure->partID != $_partID) { + error_log(__METHOD__."(". __LINE__ .") partID's don't match"); + return false; + } + } + + return $structure; + } + + /* + * strip tags out of the message completely with their content + * param $_body is the text to be processed + * param $tag is the tagname which is to be removed. Note, that only the name of the tag is to be passed to the function + * without the enclosing brackets + * param $endtag can be different from tag but should be used only, if begin and endtag are known to be different e.g.: + */ + static function replaceTagsCompletley(&$_body,$tag,$endtag='',$addbracesforendtag=true) + { + translation::replaceTagsCompletley($_body,$tag,$endtag,$addbracesforendtag); + } + + static function getCleanHTML(&$_html, $usepurify = false) + { + // remove CRLF and TAB as it is of no use in HTML. + // but they matter in
    , so we rather don't
    +			//$_html = str_replace("\r\n",' ',$_html);
    +			//$_html = str_replace("\t",' ',$_html);
    +			//error_log($_html);
    +			//repair doubleencoded ampersands
    +			$_html = str_replace('&amp;','&',$_html);
    +			self::replaceTagsCompletley($_html,'style'); // clean out empty or pagewide style definitions / left over tags
    +			self::replaceTagsCompletley($_html,'head'); // Strip out stuff in head
    +			self::replaceTagsCompletley($_html,'!\[if','',false); // Strip out stuff in ifs
    +			self::replaceTagsCompletley($_html,'!--\[if','',false); // Strip out stuff in ifs
    +			//error_log($_html);
    +			// force the use of kses, as it is still have the edge over purifier with some stuff
    +			$usepurify = false;
    +			if ($usepurify)
    +			{
    +				// we may need a customized config, as we may allow external images, $GLOBALS['egw_info']['user']['preferences']['felamimail']['allowExternalIMGs']
    +
    +				$config = html::purifyCreateDefaultConfig();
    +
    +				$config->set('Core.Encoding', (self::$displayCharset?self::$displayCharset:'UTF-8'));
    +				// maybe the two following lines are useful for caching???
    +				$config->set('HTML.DefinitionID', 'felamimail');
    +				$config->set('HTML.DefinitionRev', 1);
    +				// doctype and tidylevel
    +	 			$config->set('HTML.Doctype', 'XHTML 1.0 Transitional');
    +				$config->set('HTML.TidyLevel', 'light');
    +				// EnableID is needed for anchor tags
    +				$config->set('Attr.EnableID',true);
    +				// actual allowed tags and attributes
    +				$config->set('URI.AllowedSchemes', array('http'=>true, 'https'=>true, 'ftp'=>true, 'file'=>true, 'mailto' => true, 'cid'=>true));
    +				$config->set('AutoFormat.RemoveEmpty', true);
    +				$config->set('HTML.Allowed', 'br,p[class|align],b,i,u,s,em,pre,tt,strong,strike,center,div[class|align],hr[class|style],'.
    +							'font[size|color],'.
    +							'ul[class|type],ol[class|type|start],li,'.
    +							'h1,h2,h3,'.
    +							'span[class|style],'.
    +							'table[class|border|cellpadding|cellspacing|width|style|align|bgcolor|align],'.
    +							'tbody,thead,tfoot,colgroup,'.
    +							'col[width|span],'.
    +							'blockquote[class|cite|dir],'.
    +							'tr[class|style|align|bgcolor|align|valign],'.
    +							'td[class|colspan|rowspan|width|style|align|bgcolor|align|valign|nowrap],'.
    +							'th[class|colspan|rowspan|width|style|align|bgcolor|align|valign|nowrap],'.
    +							'a[class|href|target|name|title],'.
    +							'img[class|src|alt|title]');
    +				$DisableExternalResources = true;
    +				if ($GLOBALS['egw_info']['user']['preferences']['felamimail']['allowExternalIMGs']) $DisableExternalResources = false;
    +				$config->set('URI.DisableExternalResources',$DisableExternalResources);
    +				$config->set('Core.RemoveInvalidImg', false);
    +				//$config->set('Attr.DefaultInvalidImage', 'Image removed by htmlpurify');
    +				$config->set('Core.HiddenElements', array('script','style','head')); // strips script, style, head copletely
    +
    +				$config->set('Cache.SerializerPath', ($GLOBALS['egw_info']['server']['temp_dir']?$GLOBALS['egw_info']['server']['temp_dir']:sys_get_temp_dir()));
    +				//$config->set('HTML.MaxImgLength',null);
    +				$config->set('Cache.DefinitionImpl', null); // remove this later!
    +				//$purifier = new HTMLPurifier($config);
    +				//$_html = $purifier->purify( $_html );
    +				if (get_magic_quotes_gpc() === 1) $_html = stripslashes($_html);
    +				$_html = html::purify($_html,$config);
    +	            // no scripts allowed
    +	            // clean out comments , should not be needed as purify should do the job.
    +				$search = array(
    +					'@url\(http:\/\/[^\)].*?\)@si',  // url calls e.g. in style definitions
    +					'@@',         // Strip multi-line comments including CDATA
    +	            );
    +	            //$_html = preg_replace($search,"",$_html);
    +	            // remove non printable chars
    +	            $_html = preg_replace('/([\000-\012])/','',$_html);
    +				//error_log($_html);
    +			}
    +			else
    +			{
    +				//echo $_html;exit;
    +				$kses = new kses();
    +				$kses->AddProtocol('cid');
    +				// since check protocoll is called for every value associated to an attribute we have to add color and background-color to the valid protocolls
    +				$kses->AddProtocol('color');
    +				$kses->AddProtocol('font-size');
    +				$kses->AddProtocol('background-color');
    +				#$kses->AddHTML('html', array(
    +				#		'xmlns' => array(),
    +				#		'lang' => array(),
    +				#	)
    +				#);
    +				#$kses->AddHTML('head');
    +				#$kses->AddHTML('body', array(
    +				#		'class' => array(),
    +				#		'id' => array(),
    +				#	)
    +				#);
    +				#$kses->AddHTML('meta', array(
    +				#		'http-equiv' => array(),
    +				#		'content' => array(),
    +				#	)
    +				#);
    +				#$kses->AddHTML('link',array(
    +				#		'rel' => array(), // ="stylesheet"
    +				#		'type' => array(), //="text/css"
    +				#		'href' => array(),
    +				#		'media' => array(),
    +				#	)
    +				#);
    +				$kses->AddHTML(
    +					'p', array(
    +						"class"		=> array('maxlen' => 20),
    +						'align'	=> array('minlen' =>   1, 'maxlen' =>  10)
    +					)
    +				);
    +				$kses->AddHTML("tbody");
    +				$kses->AddHTML("thead");
    +				$kses->AddHTML("tt");
    +				$kses->AddHTML("br");
    +				$kses->AddHTML("b");
    +				$kses->AddHTML("u");
    +				$kses->AddHTML("s");
    +				$kses->AddHTML("i");
    +				$kses->AddHTML('em');
    +				$kses->AddHTML("strong");
    +				$kses->AddHTML("strike");
    +				$kses->AddHTML("center");
    +				$kses->AddHTML(
    +					"font",array(
    +						"class" => array('maxlen' => 20),
    +						"color"	=> array('maxlen' => 20),
    +						"size"=>array('maxlen'=>2)
    +					)
    +				);
    +				$kses->AddHTML(
    +					"hr",array(
    +						"class"		=> array('maxlen' => 20),
    +						"style"		=> array('minlen' => 1),
    +					)
    +				);
    +				$kses->AddHTML(
    +					"div",array(
    +						"class"		=> array('maxlen' => 20),
    +						'align' => array('maxlen' => 10)
    +					)
    +				);
    +				$kses->AddHTML("ul");
    +				$kses->AddHTML(
    +					"ol",array(
    +						"class"		=> array('maxlen' => 20),
    +						"type"	=> array('maxlen' => 20)
    +					)
    +				);
    +				$kses->AddHTML("li");
    +				$kses->AddHTML("h1");
    +				$kses->AddHTML("h2");
    +				$kses->AddHTML("h3");
    +				$kses->AddHTML(
    +					"style",array(
    +						"type"	=> array('maxlen' => 20),
    +						"color"	=> array('maxlen' => 20),
    +						"background-color" => array('maxlen' => 20),
    +						"background" => array('maxlen' => 5),
    +					)
    +				);
    +
    +				$kses->AddHTML("select");
    +				$kses->AddHTML(
    +					"option",array(
    +						"class"		=> array('maxlen' => 20),
    +						"value" => array('maxlen' => 45),
    +						"selected" => array()
    +					)
    +				);
    +
    +				$kses->AddHTML(
    +					"a", array(
    +						"class"		=> array('maxlen' => 20),
    +						"href" 		=> array('maxlen' => 348, 'minlen' => 10),
    +						"name" 		=> array('minlen' => 2),
    +						'target'	=> array('maxlen' => 10)
    +					)
    +				);
    +
    +				$kses->AddHTML(
    +					"pre", array(
    +						"class"		=> array('maxlen' => 20),
    +						"wrap" => array('maxlen' => 10)
    +					)
    +				);
    +
    +				//      Allows 'td' tag with colspan|rowspan|class|style|width|nowrap attributes,
    +				//              colspan has minval of   2       and maxval of 5
    +				//              rowspan has minval of   3       and maxval of 6
    +				//              class   has minlen of   1 char  and maxlen of   10 chars
    +				//              style   has minlen of  10 chars and maxlen of 100 chars
    +				//              width   has maxval of 100
    +				//              nowrap  is valueless
    +				$kses->AddHTML(
    +					"table",array(
    +						"class"   => array("minlen" =>   1, 'maxlen' =>  20),
    +						"border"   => array("minlen" =>   1, 'maxlen' =>  10),
    +						"cellpadding"   => array("minlen" =>   0, 'maxlen' =>  10),
    +						"cellspacing"   => array("minlen" =>   0, 'maxlen' =>  10),
    +						"width"   => array("maxlen" => 5),
    +						"style"   => array('minlen' =>  10, 'maxlen' => 100),
    +						"bgcolor"   => array('maxlen' =>  10),
    +						"align"   => array('maxlen' =>  10),
    +						"valign"   => array('maxlen' =>  10),
    +						"bordercolor"   => array('maxlen' =>  10)
    +					)
    +				);
    +				$kses->AddHTML(
    +					"tr",array(
    +						"colspan"	=> array('minval' =>   2, 'maxval' =>   5),
    +						"rowspan"	=> array('minval' =>   3, 'maxval' =>   6),
    +						"class"		=> array("minlen" =>   1, 'maxlen' =>  20),
    +						"width"		=> array("maxlen" => 5),
    +						"style"		=> array('minlen' =>  10, 'maxlen' => 100),
    +						"align"		=> array('maxlen' =>  10),
    +						'bgcolor'	=> array('maxlen' => 10),
    +						"valign"	=> array('maxlen' =>  10),
    +						"nowrap"	=> array('valueless' => 'y')
    +					)
    +				);
    +				$kses->AddHTML(
    +					"td",array(
    +						"colspan" => array('minval' =>   2, 'maxval' =>   5),
    +						"rowspan" => array('minval' =>   3, 'maxval' =>   6),
    +						"class"   => array("minlen" =>   1, 'maxlen' =>  20),
    +						"width"   => array("maxlen" => 5),
    +						"style"   => array('minlen' =>  10, 'maxlen' => 100),
    +						"align"   => array('maxlen' =>  10),
    +						'bgcolor' => array('maxlen' => 10),
    +						"valign"   => array('maxlen' =>  10),
    +						"nowrap"  => array('valueless' => 'y')
    +					)
    +				);
    +				$kses->AddHTML(
    +					"th",array(
    +						"colspan" => array('minval' =>   2, 'maxval' =>   5),
    +						"rowspan" => array('minval' =>   3, 'maxval' =>   6),
    +						"class"   => array("minlen" =>   1, 'maxlen' =>  20),
    +						"width"   => array("maxlen" => 5),
    +						"style"   => array('minlen' =>  10, 'maxlen' => 100),
    +						"align"   => array('maxlen' =>  10),
    +						"valign"   => array('maxlen' =>  10),
    +						"nowrap"  => array('valueless' => 'y')
    +					)
    +				);
    +				$kses->AddHTML(
    +					"span",array(
    +						"class"   => array("minlen" =>   1, 'maxlen' =>  20),
    +						"style"	  => array('minlen' =>  5, 'maxlen' => 100)
    +					)
    +				);
    +				$kses->AddHTML(
    +					"blockquote",array(
    +						"class"	=> array("minlen" =>   1, 'maxlen' =>  20),
    +						"style"	=> array("minlen" =>   1),
    +						"cite"	=> array('maxlen' => 30),
    +						"type"	=> array('maxlen' => 10),
    +						"dir"	=> array("minlen" =>   1, 'maxlen' =>  10)
    +					)
    +				);
    +				$kses->AddHTML(
    +					'img',array(
    +						"class" 	=> array('maxlen' => 20),
    +						"src"		=> array("minlen" =>   4, 'maxlen' =>  384, $GLOBALS['egw_info']['user']['preferences']['felamimail']['allowExternalIMGs'] ? '' : 'match' => '/^cid:.*/'),
    +						"align"		=> array("minlen" =>   1),
    +						"border"	=> array('maxlen' => 30),
    +						"width"		=> array("minlen" =>   1, 'maxlen' =>  3),
    +						"height"	=> array("minlen" =>   1, 'maxlen' =>  3),
    +					)
    +				);
    +
    +				// no scripts allowed
    +				// clean out comments
    +				$search = array(
    +					'@@',         // Strip multi-line comments including CDATA
    +					'@url\(http:\/\/[^\)].*?\)@si',  // url calls e.g. in style definitions
    +				);
    +				//error_log(__METHOD__.$_html);
    +				$_html = preg_replace($search,"",$_html);
    +				// do the kses clean out first, to avoid general problems with content later on
    +				$_html = $kses->Parse($_html);
    +				// remove non printable chars
    +				$_html = preg_replace('/([\000-\012])/','',$_html);
    +				//error_log($_html);
    +			}
    +		}
    +
    +		/**
    +		* replace emailaddresses enclosed in <> (eg.: ) with the emailaddress only (e.g: me@you.de)
    +		* always returns 1
    +		*/
    +		static function replaceEmailAdresses(&$text)
    +		{
    +			return translation::replaceEmailAdresses($text);
    +		}
    +
    +		static function convertHTMLToText($_html,$stripcrl=false,$stripalltags=true)
    +		{
    +			return translation::convertHTMLToText($_html,self::$displayCharset,$stripcrl,$stripalltags);
    +		}
    +
    +		/**
    +		 * retrieve a attachment
    +		 *
    +		 * @param int _uid the uid of the message
    +		 * @param string _partID the id of the part, which holds the attachment
    +		 * @param int _winmail_nr winmail.dat attachment nr.
    +		 *
    +		 * @return array
    +		 */
    +		function getAttachment($_uid, $_partID, $_winmail_nr=0)
    +		{
    +			// parse message structure
    +			$structure = $this->icServer->getStructure($_uid, true);
    +			if($_partID != '') {
    +				$structure = $this->_getSubStructure($structure, $_partID);
    +			}
    +			$filename = $this->getFileNameFromStructure($structure, $_uid, $structure->partID);
    +			$attachment = $this->icServer->getBodyPart($_uid, $_partID, true, true);
    +			if (PEAR::isError($attachment))
    +			{
    +				error_log(__METHOD__.__LINE__.' failed:'.$attachment->message);
    +				return array('type' => 'text/plain',
    +							 'filename' => 'error.txt',
    +							 'attachment' =>__METHOD__.' failed:'.$attachment->message
    +						);
    +			}
    +
    +			if (PEAR::isError($attachment))
    +			{
    +				error_log(__METHOD__.__LINE__.' failed:'.$attachment->message);
    +				return array('type' => 'text/plain',
    +							 'filename' => 'error.txt',
    +							 'attachment' =>__METHOD__.' failed:'.$attachment->message
    +						);
    +			}
    +
    +			switch ($structure->encoding) {
    +				case 'BASE64':
    +					// use imap_base64 to decode
    +					$attachment = imap_base64($attachment);
    +					break;
    +				case 'QUOTED-PRINTABLE':
    +					// use imap_qprint to decode
    +					#$attachment = imap_qprint($attachment);
    +					$attachment = quoted_printable_decode($attachment);
    +					break;
    +				default:
    +					// it is either not encoded or we don't know about it
    +			}
    +
    +			$attachmentData = array(
    +				'type'		=> $structure->type .'/'. $structure->subType,
    +				'filename'	=> $filename,
    +				'attachment'	=> $attachment
    +				);
    +			// try guessing the mimetype, if we get the application/octet-stream
    +			if (strtolower($attachmentData['type']) == 'application/octet-stream') $attachmentData['type'] = mime_magic::filename2mime($attachmentData['filename']);
    +			# if the attachment holds a winmail number and is a winmail.dat then we have to handle that.
    +			if ( $filename == 'winmail.dat' && $_winmail_nr > 0 &&
    +				( $wmattach = $this->decode_winmail( $_uid, $_partID, $_winmail_nr ) ) )
    +			{
    +				$attachmentData = array(
    +					'type'       => $wmattach['type'],
    +					'filename'   => $wmattach['name'],
    +					'attachment' => $wmattach['attachment'],
    + 				);
    +			}
    +			return $attachmentData;
    +		}
    +
    +		/**
    +		 * Fetch a specific attachment from a message by it's cid
    +		 *
    +		 * this function is based on a on "Building A PHP-Based Mail Client"
    +		 * http://www.devshed.com
    +		 *
    +		 * @param string|int $_uid
    +		 * @param string $_cid
    +		 * @param string $_part
    +		 * @return array with values for keys 'type', 'filename' and 'attachment'
    +		 */
    +		function getAttachmentByCID($_uid, $_cid, $_part)
    +		{
    +			// some static variables to avoid fetching the same mail multible times
    +			static $uid,$part,$attachments,$structure;
    +			//error_log("getAttachmentByCID:$_uid, $_cid, $_part");
    +
    +			if(empty($_cid)) return false;
    +
    +			if ($_uid != $uid || $_part != $part)
    +			{
    +				$attachments = $this->getMessageAttachments($uid=$_uid, $part=$_part);
    +				$structure = null;
    +			}
    +			$partID = false;
    +			foreach($attachments as $attachment)
    +			{
    +				//error_log(print_r($attachment,true));
    +				if(isset($attachment['cid']) && (strpos($attachment['cid'], $_cid) !== false || strpos($_cid, $attachment['cid']) !== false))
    +				{
    +					$partID = $attachment['partID'];
    +					break;
    +				}
    +			}
    +			if ($partID == false)
    +			{
    +				foreach($attachments as $attachment)
    +				{
    +					// if the former did not match try matching the cid to the name of the attachment
    +					if(isset($attachment['cid']) && isset($attachment['name']) && (strpos($attachment['name'], $_cid) !== false || strpos($_cid, $attachment['name']) !== false))
    +					{
    +						$partID = $attachment['partID'];
    +						break;
    +					}
    +				}
    +			}
    +			if ($partID == false)
    +			{
    +				foreach($attachments as $attachment)
    +				{
    +					// if the former did not match try matching the cid to the name of the attachment, AND there is no mathing attachment with cid
    +					if(isset($attachment['name']) && (strpos($attachment['name'], $_cid) !== false || strpos($_cid, $attachment['name']) !== false))
    +					{
    +						$partID = $attachment['partID'];
    +						break;
    +					}
    +				}
    +			}
    +			//error_log( "Cid:$_cid PARTID:$partID
    "); #exit; + + if($partID == false) { + return false; + } + + // parse message structure + if (is_null($structure)) + { + $structure = $this->icServer->getStructure($_uid, true); + } + $part_structure = $this->_getSubStructure($structure, $partID); + $filename = $this->getFileNameFromStructure($part_structure, $_uid, $_uid, $part_structure->partID); + $attachment = $this->icServer->getBodyPart($_uid, $partID, true); + if (PEAR::isError($attachment)) + { + error_log(__METHOD__.__LINE__.' failed:'.$attachment->message); + return array('type' => 'text/plain', + 'filename' => 'error.txt', + 'attachment' =>__METHOD__.' failed:'.$attachment->message + ); + } + + if (PEAR::isError($attachment)) + { + error_log(__METHOD__.__LINE__.' failed:'.$attachment->message); + return array('type' => 'text/plain', + 'filename' => 'error.txt', + 'attachment' =>__METHOD__.' failed:'.$attachment->message + ); + } + + switch ($part_structure->encoding) { + case 'BASE64': + // use imap_base64 to decode + $attachment = imap_base64($attachment); + break; + case 'QUOTED-PRINTABLE': + // use imap_qprint to decode + #$attachment = imap_qprint($attachment); + $attachment = quoted_printable_decode($attachment); + break; + default: + // it is either not encoded or we don't know about it + } + + $attachmentData = array( + 'type' => $part_structure->type .'/'. $part_structure->subType, + 'filename' => $filename, + 'attachment' => $attachment + ); + // try guessing the mimetype, if we get the application/octet-stream + if (strtolower($attachmentData['type']) == 'application/octet-stream') $attachmentData['type'] = mime_magic::filename2mime($attachmentData['filename']); + + return $attachmentData; + } + + /** + * getIdentitiesWithAccounts + * + * @param array reference to pass all identities back + * @return the default Identity (active) or 0 + */ + function getIdentitiesWithAccounts(&$identities) + { + // account select box + $selectedID = $this->profileID; + if($this->mailPreferences->userDefinedAccounts) $allAccountData = $this->bopreferences->getAllAccountData($this->mailPreferences); + + if ($allAccountData) { + foreach ($allAccountData as $tmpkey => $accountData) + { + $identity =& $accountData['identity']; + $icServer =& $accountData['icServer']; + //_debug_array($identity); + //_debug_array($icServer); + if (empty($icServer->host)) continue; + $identities[$identity->id]=$identity->realName.' '.$identity->organization.' <'.$identity->emailAddress.'>'; + if (!empty($identity->default)) $selectedID = $identity->id; + } + } + + return $selectedID; + } + + function getEMailProfile() + { + $config = CreateObject('phpgwapi.config','felamimail'); + $config->read_repository(); + $felamimailConfig = $config->config_data; + + #_debug_array($felamimailConfig); + + if(!isset($felamimailConfig['profileID'])){ + return -1; + } else { + return intval($felamimailConfig['profileID']); + } + } + + function getErrorMessage() + { + return $this->icServer->_connectionErrorObject->message; + } + + /** + * get IMAP folder status + * + * returns an array information about the imap folder + * + * @param _folderName string the foldername + * + * @return array + */ + function getFolderStatus($_folderName) + { + if (self::$debug) error_log(__METHOD__." called with:".$_folderName); + $retValue = array(); + $retValue['subscribed'] = false; + if(!$icServer = $this->mailPreferences->getIncomingServer($this->profileID)) { + if (self::$debug) error_log(__METHOD__." no Server found for Folder:".$_folderName); + return false; + } + + // does the folder exist??? + $folderInfo = $this->icServer->getMailboxes('', $_folderName, true); + if(is_a($folderInfo, 'PEAR_Error') || !is_array($folderInfo[0])) { + if (self::$debug) error_log(__METHOD__." returned Info for folder $_folderName:".print_r($folderInfo->message,true)); + return false; + } + #if(!is_array($folderInfo[0])) { + # return false; + #} + + $subscribedFolders = $this->icServer->listsubscribedMailboxes('', $_folderName); + if(is_array($subscribedFolders) && count($subscribedFolders) == 1) { + $retValue['subscribed'] = true; + } + + $retValue['delimiter'] = $folderInfo[0]['HIERACHY_DELIMITER']; + $retValue['attributes'] = $folderInfo[0]['ATTRIBUTES']; + $shortNameParts = explode($retValue['delimiter'], $_folderName); + $retValue['shortName'] = array_pop($shortNameParts); + $retValue['displayName'] = $this->encodeFolderName($_folderName); + $retValue['shortDisplayName'] = $this->encodeFolderName($retValue['shortName']); + if(strtoupper($retValue['shortName']) == 'INBOX') { + $retValue['displayName'] = lang('INBOX'); + $retValue['shortDisplayName'] = lang('INBOX'); + } + // translate the automatic Folders (Sent, Drafts, ...) like the INBOX + elseif (in_array($retValue['shortName'],self::$autoFolders)) + { + $retValue['displayName'] = $retValue['shortDisplayName'] = lang($retValue['shortName']); + } + + if ( PEAR::isError($folderStatus = $this->icServer->getStatus($_folderName)) ) { + /*if ($folderStatus = $this->bofelamimail->getMailBoxCounters($_folderName)) { + $retValue['messages'] = $folderStatus->messages; + $retValue['recent'] = $folderStatus->recent; + $retValue['uidnext'] = $folderStatus->uidnext; + $retValue['unseen'] = $folderStatus->unseen; + $retValue['uidvalidity']= $folderStatus->uidvalidity; + */ + //_debug_array($folderStatus); + if (self::$debug) error_log(__METHOD__." returned folderStatus for Folder $_folderName:".print_r($folderStatus->message,true)); + } else { + $retValue['messages'] = $folderStatus['MESSAGES']; + $retValue['recent'] = $folderStatus['RECENT']; + $retValue['uidnext'] = $folderStatus['UIDNEXT']; + $retValue['uidvalidity'] = $folderStatus['UIDVALIDITY']; + $retValue['unseen'] = $folderStatus['UNSEEN']; + if ($retValue['unseen']==0 && + isset($this->mailPreferences->preferences['trustServersUnseenInfo']) && // some servers dont serve the UNSEEN information + $this->mailPreferences->preferences['trustServersUnseenInfo']==false) + { + $sortResult = $this->getSortedList($_folderName, $_sort=0, $_reverse=1, $_filter=array('status'=>'UNSEEN'),$byUid=true,false); + $retValue['unseen'] = count($sortResult); + } + } + + return $retValue; + } + + /** + * get IMAP folder objects + * + * returns an array of IMAP folder objects. Put INBOX folder in first + * position. Preserves the folder seperator for later use. The returned + * array is indexed using the foldername. + * + * @param _subscribedOnly boolean get subscribed or all folders + * @param _getCounters boolean get get messages counters + * + * @return array with folder objects. eg.: INBOX => {inbox object} + */ + function getFolderObjects($_subscribedOnly=false, $_getCounters=false) + { + $isUWIMAP = false; + + $delimiter = $this->getHierarchyDelimiter(); + + $inboxData = new stdClass; + $inboxData->name = 'INBOX'; + $inboxData->folderName = 'INBOX'; + $inboxData->displayName = lang('INBOX'); + $inboxData->delimiter = $delimiter; + $inboxData->shortFolderName = 'INBOX'; + $inboxData->shortDisplayName = lang('INBOX'); + $inboxData->subscribed = true; + if($_getCounters == true) { + /* + $folderStatus = $this->icServer->getStatus('INBOX'); + + $status = new stdClass; + $status->messages = $folderStatus['MESSAGES']; + $status->unseen = $folderStatus['UNSEEN']; + $status->recent = $folderStatus['RECENT']; + + $inboxData->counter = $status; + */ + $inboxData->counter = self::getMailBoxCounters('INBOX'); + } + // force unsubscribed by preference showAllFoldersInFolderPane + if ($_subscribedOnly == true && + isset($this->mailPreferences->preferences['showAllFoldersInFolderPane']) && + $this->mailPreferences->preferences['showAllFoldersInFolderPane']==1) + { + $_subscribedOnly = false; + } + #$inboxData->attributes = 64; + $inboxFolderObject = array('INBOX' => $inboxData); + #_debug_array($folders); + + $nameSpace = $this->icServer->getNameSpaces(); + #_debug_array($nameSpace); + #_debug_array($delimiter); + if(isset($nameSpace['#mh/'])) { + // removed the uwimap code + // but we need to reintroduce him later + // uw imap does not return the attribute of a folder, when requesting subscribed folders only + // dovecot has the same problem too + } else { + if (is_array($nameSpace)) { + foreach($nameSpace as $type => $singleNameSpace) { + if($type == 'personal' && ($singleNameSpace[2]['name'] == '#mh/' || count($nameSpace) == 1) && $this->icServer->mailboxExist('Mail')) { + // uw-imap server with mailbox prefix or dovecot maybe + $foldersNameSpace[$type]['prefix'] = 'Mail'; + } elseif($type == 'personal' && ($singleNameSpace[2]['name'] == '#mh/' || count($nameSpace) == 1) && $this->icServer->mailboxExist('mail')) { + // uw-imap server with mailbox prefix or dovecot maybe + $foldersNameSpace[$type]['prefix'] = 'mail'; + } else { + $foldersNameSpace[$type]['prefix'] = $singleNameSpace[0]['name']; + } + #echo "############## ".print_r($singleNameSpace,true)." ###################
    "; + $foldersNameSpace[$type]['delimiter'] = $delimiter; + + if(is_array($singleNameSpace[0])) { + // fetch and sort the subscribed folders + $subscribedMailboxes = $this->icServer->listsubscribedMailboxes($foldersNameSpace[$type]['prefix']); + if (empty($subscribedMailboxes) && $type == 'shared') $subscribedMailboxes = $this->icServer->listsubscribedMailboxes('',0); + + #echo "subscribedMailboxes";_debug_array($subscribedMailboxes); + if( PEAR::isError($subscribedMailboxes) ) { + continue; + } + $foldersNameSpace[$type]['subscribed'] = $subscribedMailboxes; + if (is_array($foldersNameSpace[$type]['subscribed'])) sort($foldersNameSpace[$type]['subscribed']); + #_debug_array($foldersNameSpace); + if ($_subscribedOnly == true) { + $foldersNameSpace[$type]['all'] = (is_array($foldersNameSpace[$type]['subscribed']) ? $foldersNameSpace[$type]['subscribed'] :array()); + continue; + } + // only check for Folder in FolderMaintenance for Performance Reasons + if(!$_subscribedOnly) { + foreach ((array)$foldersNameSpace[$type]['subscribed'] as $folderName) + { + //echo __METHOD__."Checking $folderName for existence
    "; + if (!self::folderExists($folderName)) { + echo("eMail Folder $folderName failed to exist; should be unsubscribed; Trying ..."); + error_log(__METHOD__."-> $folderName failed to be here; should be unsubscribed"); + if (self::subscribe($folderName, false)) + { + echo " success."."
    " ; + } else { + echo " failed."."
    "; + } + } + } + } + + // fetch and sort all folders + #echo $type.'->'.$foldersNameSpace[$type]['prefix'].'->'.($type=='shared'?0:2)."
    "; + $allMailboxesExt = $this->icServer->getMailboxes($foldersNameSpace[$type]['prefix'],2,true); + if (empty($allMailboxesExt) && $type == 'shared') $allMailboxesExt = $this->icServer->getMailboxes('',0,true); + if( PEAR::isError($allMailboxesExt) ) { + #echo __METHOD__;_debug_array($allMailboxesExt); + continue; + } + foreach ($allMailboxesExt as $mbx) { + #echo __METHOD__;_debug_array($mbx); + $allMailBoxesExtSorted[$mbx['MAILBOX']] = $mbx; + } + if (is_array($allMailBoxesExtSorted)) ksort($allMailBoxesExtSorted); + #_debug_array($allMailBoxesExtSorted); + $allMailboxes = array(); + foreach ((array)$allMailBoxesExtSorted as $mbx) { + #echo $mbx['MAILBOX']."
    "; + if (in_array('\HasChildren',$mbx["ATTRIBUTES"]) || in_array('\Haschildren',$mbx["ATTRIBUTES"])) { + unset($buff); + //$buff = $this->icServer->getMailboxes($mbx['MAILBOX'].$delimiter,0,false); + if (!in_array($mbx['MAILBOX'],$allMailboxes)) $buff = self::getMailBoxesRecursive($mbx['MAILBOX'],$delimiter,$foldersNameSpace[$type]['prefix'],1); + if( PEAR::isError($buff) ) { + continue; + } + #_debug_array($buff); + if (is_array($buff)) $allMailboxes = array_merge($allMailboxes,$buff); + } + if (!in_array($mbx['MAILBOX'],$allMailboxes)) $allMailboxes[] = $mbx['MAILBOX']; + #echo "Result:";_debug_array($allMailboxes); + } + $foldersNameSpace[$type]['all'] = $allMailboxes; + if (is_array($foldersNameSpace[$type]['all'])) sort($foldersNameSpace[$type]['all']); + } + } + } + // check for autocreated folders + if(isset($foldersNameSpace['personal']['prefix'])) { + $personalPrefix = $foldersNameSpace['personal']['prefix']; + $personalDelimiter = $foldersNameSpace['personal']['delimiter']; + if(!empty($personalPrefix)) { + if(substr($personalPrefix, -1) != $personalDelimiter) { + $folderPrefix = $personalPrefix . $personalDelimiter; + } else { + $folderPrefix = $personalPrefix; + } + } + if ($this->mailPreferences->preferences['notavailableautofolders'] && !empty($this->mailPreferences->preferences['notavailableautofolders'])) + { + $foldersToCheck = array_diff(self::$autoFolders,explode(',',$this->mailPreferences->preferences['notavailableautofolders'])); + } else { + $foldersToCheck = self::$autoFolders; + } + //error_log(__METHOD__.__LINE__." foldersToCheck:".array2string($foldersToCheck)); + //error_log(__METHOD__.__LINE__." foldersToCheck:".array2string( $this->mailPreferences->preferences['sentFolder'])); + foreach($foldersToCheck as $personalFolderName) { + $folderName = (!empty($personalPrefix)) ? $folderPrefix.$personalFolderName : $personalFolderName; + if(!is_array($foldersNameSpace['personal']['all']) || !in_array($folderName, $foldersNameSpace['personal']['all'])) { + $createfolder = true; + switch($folderName) + { + case 'Drafts': // => Entwürfe + if ($this->mailPreferences->preferences['draftFolder'] && $this->mailPreferences->preferences['draftFolder']=='none') + $createfolder=false; + break; + case 'Junk': //] => Spammails + if ($this->mailPreferences->preferences['junkFolder'] && $this->mailPreferences->preferences['junkFolder']=='none') + $createfolder=false; + break; + case 'Sent': //] => Gesendet + // ToDo: we may need more sophistcated checking here + if ($this->mailPreferences->preferences['sentFolder'] && $this->mailPreferences->preferences['sentFolder']=='none') + $createfolder=false; + break; + case 'Trash': //] => Papierkorb + if ($this->mailPreferences->preferences['trashFolder'] && $this->mailPreferences->preferences['trashFolder']=='none') + $createfolder=false; + break; + case 'Templates': //] => Vorlagen + if ($this->mailPreferences->preferences['templateFolder'] && $this->mailPreferences->preferences['templateFolder']=='none') + $createfolder=false; + break; + case 'Outbox': // Nokia Outbox for activesync + //if ($this->mailPreferences->preferences['outboxFolder'] && $this->mailPreferences->preferences['outboxFolder']=='none') + $createfolder=false; + if ($GLOBALS['egw_info']['user']['apps']['activesync']) $createfolder = true; + break; + } + if ($createfolder && self::folderExists($folderName)) $createfolder = false; + if($createfolder === true && $this->createFolder('', $folderName, true)) { + $foldersNameSpace['personal']['all'][] = $folderName; + $foldersNameSpace['personal']['subscribed'][] = $folderName; + } else { + #print "FOLDERNAME failed: $folderName
    "; + } + } + } + } + } + #echo "
    FolderNameSpace To Process:";_debug_array($foldersNameSpace); + foreach( array('personal', 'others', 'shared') as $type) { + if(isset($foldersNameSpace[$type])) { + if($_subscribedOnly) { + if( !PEAR::isError($foldersNameSpace[$type]['subscribed']) ) $listOfFolders = $foldersNameSpace[$type]['subscribed']; + } else { + if( !PEAR::isError($foldersNameSpace[$type]['all'])) $listOfFolders = $foldersNameSpace[$type]['all']; + } + foreach((array)$listOfFolders as $folderName) { + //echo "
    FolderToCheck:$folderName
    "; + if($_subscribedOnly && !in_array($folderName, $foldersNameSpace[$type]['all'])) { + #echo "$folderName failed to be here
    "; + continue; + } + $folderParts = explode($delimiter, $folderName); + $shortName = array_pop($folderParts); + + $folderObject = new stdClass; + $folderObject->delimiter = $delimiter; + $folderObject->folderName = $folderName; + $folderObject->shortFolderName = $shortName; + if(!$_subscribedOnly) { + #echo $folderName."->".$type."
    "; + #_debug_array($foldersNameSpace[$type]['subscribed']); + $folderObject->subscribed = in_array($folderName, $foldersNameSpace[$type]['subscribed']); + } + + if($_getCounters == true) { + /* + $folderStatus = $this->icServer->getStatus($folderName); + #echo "
    FolderStatus:";_debug_array($folderStatus); + if(is_array($folderStatus)) { + $status = new stdClass; + $status->messages = $folderStatus['MESSAGES']; + $status->unseen = $folderStatus['UNSEEN']; + $status->recent = $folderStatus['RECENT']; + + $folderObject->counter = $status; + } + */ + $folderObject->counter = $this->bofelamimail->getMailBoxCounters($folderName); + } + + if(strtoupper($folderName) == 'INBOX') { + $folderName = 'INBOX'; + $folderObject->folderName = 'INBOX'; + $folderObject->shortFolderName = 'INBOX'; + $folderObject->displayName = lang('INBOX'); + $folderObject->shortDisplayName = lang('INBOX'); + $folderObject->subscribed = true; + // translate the automatic Folders (Sent, Drafts, ...) like the INBOX + } elseif (in_array($shortName,self::$autoFolders)) { + $tmpfolderparts = explode($delimiter,$folderObject->folderName); + array_pop($tmpfolderparts); + $folderObject->displayName = implode($delimiter,$tmpfolderparts).$delimiter.lang($shortName); + $folderObject->shortDisplayName = lang($shortName); + unset($tmpfolderparts); + } else { + $folderObject->displayName = $this->encodeFolderName($folderObject->folderName); + $folderObject->shortDisplayName = $this->encodeFolderName($shortName); + } + $folderName = $folderName; + if (in_array($shortName,self::$autoFolders)) { + $autoFolderObjects[$folderName] = $folderObject; + } else { + $folders[$folderName] = $folderObject; + } + } + } + } + if (is_array($autoFolderObjects)) { + uasort($autoFolderObjects,array($this,"sortByAutoFolderPos")); + } + if (is_array($folders)) uasort($folders,array($this,"sortByDisplayName")); + //$folders2return = array_merge($autoFolderObjects,$folders); + //_debug_array($folders2return); #exit; + return array_merge($inboxFolderObject,(array)$autoFolderObjects,(array)$folders); + } + + function sortByDisplayName($a,$b) + { + // 0, 1 und -1 + return strcasecmp($a->displayName,$b->displayName); + } + + function sortByAutoFolderPos($a,$b) + { + // 0, 1 und -1 + $pos1 = array_search($a->shortFolderName,self::$autoFolders); + $pos2 = array_search($b->shortFolderName,self::$autoFolders); + if ($pos1 == $pos2) return 0; + return ($pos1 < $pos2) ? -1 : 1; + } + + function getMailBoxCounters($folderName) + { + $folderStatus = $this->icServer->getStatus($folderName); + #echo "
    FolderStatus:";_debug_array($folderStatus); + if ( PEAR::isError($folderStatus)) { + if (self::$debug) error_log(__METHOD__." returned FolderStatus for Folder $folderName:".print_r($folderStatus->message,true)); + return false; + } + if(is_array($folderStatus)) { + $status = new stdClass; + $status->messages = $folderStatus['MESSAGES']; + $status->unseen = $folderStatus['UNSEEN']; + $status->recent = $folderStatus['RECENT']; + $status->uidnext = $folderStatus['UIDNEXT']; + $status->uidvalidity = $folderStatus['UIDVALIDITY']; + + return $status; + } + return false; + } + + function getMailBoxesRecursive($_mailbox, $delimiter, $prefix, $reclevel=0) + { + #echo __METHOD__." retrieve SubFolders for $_mailbox$delimiter
    "; + $maxreclevel=25; + if ($reclevel > $maxreclevel) { + error_log( __METHOD__." Recursion Level Exeeded ($reclevel) while looking up $_mailbox$delimiter "); + return array(); + } + $reclevel++; + // clean up double delimiters + $_mailbox = preg_replace('~'.($delimiter == '.' ? "\\".$delimiter:$delimiter).'+~s',$delimiter,$_mailbox); + //get that mailbox in question + $mbx = $this->icServer->getMailboxes($_mailbox,1,true); + #_debug_array($mbx); + if (is_array($mbx[0]["ATTRIBUTES"]) && (in_array('\HasChildren',$mbx[0]["ATTRIBUTES"]) || in_array('\Haschildren',$mbx[0]["ATTRIBUTES"]))) { + // if there are children fetch them + #echo $mbx[0]['MAILBOX']."
    "; + unset($buff); + $buff = $this->icServer->getMailboxes($mbx[0]['MAILBOX'].($mbx[0]['MAILBOX'] == $prefix ? '':$delimiter),2,false); + //$buff = $this->icServer->getMailboxes($mbx[0]['MAILBOX'],2,false); + #_debug_array($buff); + if( PEAR::isError($buff) ) { + if (self::$debug) error_log(__METHOD__." Error while retrieving Mailboxes for:".$mbx[0]['MAILBOX'].$delimiter."."); + return array(); + } else { + $allMailboxes = array(); + foreach ($buff as $mbxname) { + $mbxname = preg_replace('~'.($delimiter == '.' ? "\\".$delimiter:$delimiter).'+~s',$delimiter,$mbxname); + #echo "About to recur in level $reclevel:".$mbxname."
    "; + if ( $mbxname != $mbx[0]['MAILBOX'] && $mbxname != $prefix) $allMailboxes = array_merge($allMailboxes, self::getMailBoxesRecursive($mbxname, $delimiter, $prefix, $reclevel)); + } + if (!(in_array('\NoSelect',$mbx[0]["ATTRIBUTES"]) || in_array('\Noselect',$mbx[0]["ATTRIBUTES"]))) $allMailboxes[] = $mbx[0]['MAILBOX']; + return $allMailboxes; + } + } else { + return array($_mailbox); + } + } + + /** + * getMimePartCharset - fetches the charset mimepart if it exists + * @param $_mimePartObject structure object + * @return mixed mimepart or false if no CHARSET is found, the missing charset has to be handled somewhere else, + * as we cannot safely assume any charset as we did earlier + */ + function getMimePartCharset($_mimePartObject) + { + //$charSet = 'iso-8859-1';//self::$displayCharset; //'iso-8859-1'; // self::displayCharset seems to be asmarter fallback than iso-8859-1 + $CharsetFound=false; + //echo "#".$_mimePartObject->encoding.'#
    '; + if(is_array($_mimePartObject->parameters)) { + if(isset($_mimePartObject->parameters['CHARSET'])) { + $charSet = $_mimePartObject->parameters['CHARSET']; + $CharsetFound=true; + } + } + // this one is dirty, but until I find something that does the trick of detecting the encoding, .... + //if ($CharsetFound == false && $_mimePartObject->encoding == "QUOTED-PRINTABLE") $charSet = 'iso-8859-1'; //assume quoted-printable to be ISO + //if ($CharsetFound == false && $_mimePartObject->encoding == "BASE64") $charSet = 'utf-8'; // assume BASE64 to be UTF8 + return ($CharsetFound ? $charSet : $CharsetFound); + } + + function getMultipartAlternative($_uid, $_structure, $_htmlMode, $_preserveSeen = false) + { + // a multipart/alternative has exactly 2 parts (text and html OR text and something else) + // sometimes there are 3 parts, when there is an ics/ical attached/included-> we want to show that + // as attachment AND as abstracted ical information (we use our notification style here). + $partText = false; + $partHTML = false; + if (self::$debug) _debug_array(array("METHOD"=>__METHOD__,"LINE"=>__LINE__,"STRUCTURE"=>$_structure)); + foreach($_structure as $mimePart) { + if($mimePart->type == 'TEXT' && ($mimePart->subType == 'PLAIN' || $mimePart->subType == 'CALENDAR') && $mimePart->bytes > 0) { + if ($mimePart->subType == 'CALENDAR' && $partText === false) $partText = $mimePart; // only if there is no partText set already + if ($mimePart->subType == 'PLAIN') $partText = $mimePart; + } elseif($mimePart->type == 'TEXT' && $mimePart->subType == 'HTML' && $mimePart->bytes > 0) { + $partHTML = $mimePart; + } elseif ($mimePart->type == 'MULTIPART' && $mimePart->subType == 'RELATED' && is_array($mimePart->subParts)) { + // in a multipart alternative we treat the multipart/related as html part + #$partHTML = array($mimePart); + error_log(__METHOD__." process MULTIPART/RELATED with array as subparts"); + $partHTML = $mimePart; + } elseif ($mimePart->type == 'MULTIPART' && $mimePart->subType == 'ALTERNATIVE' && is_array($mimePart->subParts)) { + //cascading multipartAlternative structure, assuming only the first one is to be used + return $this->getMultipartAlternative($_uid,$mimePart->subParts,$_htmlMode, $_preserveSeen); + } + } + //error_log(__METHOD__.__LINE__.$_htmlMode); + switch($_htmlMode) { + case 'html_only': + case 'always_display': + if(is_object($partHTML)) { + if($partHTML->subType == 'RELATED') { + return $this->getMultipartRelated($_uid, $partHTML, $_htmlMode, $_preserveSeen); + } else { + return $this->getTextPart($_uid, $partHTML, $_htmlMode, $_preserveSeen); + } + } elseif(is_object($partText) && $_htmlMode=='always_display') { + return $this->getTextPart($_uid, $partText, $_htmlMode, $_preserveSeen); + } + + break; + case 'only_if_no_text': + if(is_object($partText)) { + return $this->getTextPart($_uid, $partText, $_htmlMode, $_preserveSeen); + } elseif(is_object($partHTML)) { + if($partHTML->type) { + return $this->getMultipartRelated($_uid, $partHTML, $_htmlMode, $_preserveSeen); + } else { + return $this->getTextPart($_uid, $partHTML, 'always_display', $_preserveSeen); + } + } + + break; + + default: + if(is_object($partText)) { + return $this->getTextPart($_uid, $partText, $_htmlMode, $_preserveSeen); + } else { + $bodyPart = array( + 'body' => lang("no plain text part found"), + 'mimeType' => 'text/plain', + 'charSet' => self::$displayCharset, + ); + } + + break; + } + + return $bodyPart; + } + + function getMultipartMixed($_uid, $_structure, $_htmlMode, $_preserveSeen = false) + { + if (self::$debug) echo __METHOD__."$_uid, $_htmlMode
    "; + $bodyPart = array(); + if (self::$debug) _debug_array($_structure); + if (!is_array($_structure)) $_structure = array($_structure); + foreach($_structure as $part) { + if (self::$debug) echo $part->type."/".$part->subType."
    "; + switch($part->type) { + case 'MULTIPART': + switch($part->subType) { + case 'ALTERNATIVE': + $bodyPart[] = $this->getMultipartAlternative($_uid, $part->subParts, $_htmlMode, $_preserveSeen); + break; + + case 'MIXED': + case 'SIGNED': + $bodyPart = array_merge($bodyPart, $this->getMultipartMixed($_uid, $part->subParts, $_htmlMode, $_preserveSeen)); + break; + + case 'RELATED': + $bodyPart = array_merge($bodyPart, $this->getMultipartRelated($_uid, $part->subParts, $_htmlMode, $_preserveSeen)); + break; + } + break; + + case 'TEXT': + switch($part->subType) { + case 'PLAIN': + case 'HTML': + case 'CALENDAR': // inline ics/ical files + if($part->disposition != 'ATTACHMENT') { + $bodyPart[] = $this->getTextPart($_uid, $part, $_htmlMode, $_preserveSeen); + } + break; + } + break; + + case 'MESSAGE': + if($part->subType == 'delivery-status') { + $bodyPart[] = $this->getTextPart($_uid, $part, $_htmlMode, $_preserveSeen); + } + break; + + default: + // do nothing + // the part is a attachment + #$bodyPart[] = $this->getMessageBody($_uid, $_htmlMode, $part->partID, $part); + #if (!($part->type == 'TEXT' && ($part->subType == 'PLAIN' || $part->subType == 'HTML'))) { + # $bodyPart[] = $this->getMessageAttachments($_uid, $part->partID, $part); + #} + } + } + + return $bodyPart; + } + + function getMultipartRelated($_uid, $_structure, $_htmlMode, $_preserveSeen = false) + { + return $this->getMultipartMixed($_uid, $_structure, $_htmlMode, $_preserveSeen); + } + + function getTextPart($_uid, $_structure, $_htmlMode = '', $_preserveSeen = false) + { + $bodyPart = array(); + if (self::$debug) _debug_array(array($_structure,function_backtrace())); + $partID = $_structure->partID; + $mimePartBody = $this->icServer->getBodyPart($_uid, $partID, true, $_preserveSeen); + if (PEAR::isError($mimePartBody)) + { + error_log(__METHOD__.__LINE__.' failed:'.$mimePartBody->message); + return false; + } + //_debug_array($mimePartBody); + //error_log(__METHOD__.__LINE__.' UID:'.$_uid.' PartID:'.$partID.' HTMLMode:'.$_htmlMode.' ->'.array2string($_structure).array2string($mimePartBody)); + if (empty($mimePartBody)) return array( + 'body' => '', + 'mimeType' => ($_structure->type == 'TEXT' && $_structure->subType == 'HTML') ? 'text/html' : 'text/plain', + 'charSet' => self::$displayCharset, + ); + //_debug_array(preg_replace('/PropertyFile___$/','',$this->decodeMimePart($mimePartBody, $_structure->encoding))); + if($_structure->subType == 'HTML' && $_htmlMode!= 'html_only' && $_htmlMode != 'always_display' && $_htmlMode != 'only_if_no_text') { + $bodyPart = array( + 'error' => 1, + 'body' => lang("displaying html messages is disabled"), + 'mimeType' => 'text/html', + 'charSet' => self::$displayCharset, + ); + } elseif ($_structure->subType == 'PLAIN' && $_htmlMode == 'html_only') { + $bodyPart = array( + 'error' => 1, + 'body' => lang("displaying plain messages is disabled"), + 'mimeType' => 'text/plain', // make sure we do not return mimeType text/html + 'charSet' => self::$displayCharset, + ); + } else { + // some Servers append PropertyFile___ ; strip that here for display + $bodyPart = array( + 'body' => preg_replace('/PropertyFile___$/','',$this->decodeMimePart($mimePartBody, $_structure->encoding, $this->getMimePartCharset($_structure))), + 'mimeType' => ($_structure->type == 'TEXT' && $_structure->subType == 'HTML') ? 'text/html' : 'text/plain', + 'charSet' => $this->getMimePartCharset($_structure), + ); + if ($_structure->subType == 'CALENDAR') + { + // we get an inline CALENDAR ical/ics, we display it using the calendar notification style + $calobj = new calendar_ical; + $calboupdate = new calendar_boupdate; + // timezone stuff + $tz_diff = $GLOBALS['egw_info']['user']['preferences']['common']['tz_offset'] - $this->common_prefs['tz_offset']; + // form an event out of ical + $event = $calobj->icaltoegw($bodyPart['body']); + $event= $event[0]; + // preset the olddate + $olddate = $calboupdate->format_date($event['start']+$tz_diff); + // search egw, if we can find it + $eventid = $calobj->find_event(array('uid'=>$event['uid'])); + if ((int)$eventid[0]>0) + { + // we found an event, we use the first one + $oldevent = $calobj->read($eventid); + // we set the olddate, to comply with the possible merge params for the notification message + if($oldevent != False && $oldevent[$eventid[0]]['start']!=$event[$eventid[0]]['start']) { + $olddate = $calboupdate->format_date($oldevent[$eventid[0]]['start']+$tz_diff); + } + // we merge the changes and the original event + $event = array_merge($oldevent[$eventid[0]],$event); + // for some strange reason, the title of the old event is not replaced with the new title + // if you klick on the ics and import it into egw, so we dont show the title here. + // so if it is a mere reply, we dont use the new title (more detailed info/work needed here) + if ($_structure->parameters['METHOD']=='REPLY') $event['title'] = $oldevent[$eventid[0]]['title']; + } + // we prepare the message + $details = $calboupdate->_get_event_details($event,$action,$event_arr); + $details['olddate']=$olddate; + //_debug_array($_structure); + list($subject,$info) = $calboupdate->get_update_message($event,($_structure->parameters['METHOD']=='REPLY'?false:true)); + $info = $GLOBALS['egw']->preferences->parse_notify($info,$details); + // we set the bodyPart, we only show the event, we dont actually do anything, as we expect the user to + // click on the attached ics to update his own eventstore + $bodyPart['body'] = $subject; + $bodyPart['body'] .= "\n".$info; + $bodyPart['body'] .= "\n\n".lang('Event Details follow').":\n"; + foreach($event_arr as $key => $val) + { + if(strlen($details[$key])) { + switch($key){ + case 'access': + case 'priority': + case 'link': + break; + default: + $bodyPart['body'] .= sprintf("%-20s %s\n",$val['field'].':',$details[$key]); + break; + } + } + } + } + } + //_debug_array($bodyPart); + return $bodyPart; + } + + function getNameSpace($_icServer) + { + $this->icServer->getNameSpaces(); + } + + function getHierarchyDelimiter() + { + $HierarchyDelimiter = '/'; + if(is_a($this->icServer,'defaultimap')) + { + $HierarchyDelimiter = $this->icServer->getHierarchyDelimiter(); + if (PEAR::isError($HierarchyDelimiter)) $HierarchyDelimiter = '/'; + } + return $HierarchyDelimiter; + } + + /** + * fetches a sorted list of messages from the imap server + * private function + * + * @todo implement sort based on Net_IMAP + * @param string $_folderName the name of the folder in which the messages get searched + * @param integer $_sort the primary sort key + * @param bool $_reverse sort the messages ascending or descending + * @param array $_filter the search filter + * @return bool + */ + function getSortedList($_folderName, $_sort, &$_reverse, $_filter, &$resultByUid=true, $setSession=true) + { + //ToDo: FilterSpecific Cache + if(PEAR::isError($folderStatus = $this->icServer->examineMailbox($_folderName))) { + return false; + } + if(is_array($this->sessionData['folderStatus'][$this->profileID][$_folderName]) && + $this->sessionData['folderStatus'][$this->profileID][$_folderName]['uidValidity'] === $folderStatus['UIDVALIDITY'] && + $this->sessionData['folderStatus'][$this->profileID][$_folderName]['messages'] === $folderStatus['EXISTS'] && + $this->sessionData['folderStatus'][$this->profileID][$_folderName]['uidnext'] === $folderStatus['UIDNEXT'] && + $this->sessionData['folderStatus'][$this->profileID][$_folderName]['filter'] === $_filter && + $this->sessionData['folderStatus'][$this->profileID][$_folderName]['sort'] === $_sort && + //$this->sessionData['folderStatus'][0][$_folderName]['reverse'] === $_reverse && + !empty($this->sessionData['folderStatus'][$this->profileID][$_folderName]['sortResult']) + ) { + if (self::$debug) error_log(__METHOD__." USE CACHE for Profile:". $this->profileID." Folder:".$_folderName); + $sortResult = $this->sessionData['folderStatus'][$this->profileID][$_folderName]['sortResult']; + + } else { + if (self::$debug) error_log(__METHOD__." USE NO CACHE for Profile:". $this->profileID." Folder:".$_folderName." Filter:".array2string($_filter).function_backtrace()); + $filter = $this->createIMAPFilter($_folderName, $_filter); + //_debug_array($filter); + + if($this->icServer->hasCapability('SORT')) { + if (self::$debug) error_log(__METHOD__." Mailserver has SORT Capability, SortBy: $_sort Reverse: $_reverse"); + $sortOrder = $this->_getSortString($_sort, $_reverse); + if ($_reverse && strpos($sortOrder,'REVERSE')!==false) $_reverse=false; // as we reversed the result already + if (self::$debug) error_log(__METHOD__." Mailserver runs SORT: SortBy: $sortOrder Filter: $filter"); + if (!empty(self::$displayCharset)) { + $sortResult = $this->icServer->sort($sortOrder, strtoupper( self::$displayCharset ), $filter, $resultByUid); + } + if (PEAR::isError($sortResult) || empty(self::$displayCharset)) { + $sortResult = $this->icServer->sort($sortOrder, 'US-ASCII', $filter, $resultByUid); + // if there is an PEAR Error, we assume that the server is not capable of sorting + if (PEAR::isError($sortResult)) { + $advFilter = 'CHARSET '. strtoupper(self::$displayCharset) .' '.$filter; + if (PEAR::isError($sortResult)) + { + $resultByUid = false; + $sortResult = $this->icServer->search($filter, $resultByUid); + if (PEAR::isError($sortResult)) + { + $sortResult = $this->sessionData['folderStatus'][$this->profileID][$_folderName]['sortResult']; + } + } + } + } + if (self::$debug) error_log(__METHOD__.print_r($sortResult,true)); + } else { + if (self::$debug) error_log(__METHOD__." Mailserver has NO SORT Capability"); + $advFilter = 'CHARSET '. strtoupper(self::$displayCharset) .' '.$filter; + $sortResult = $this->icServer->search($advFilter, $resultByUid); + if (PEAR::isError($sortResult)) + { + $sortResult = $this->icServer->search($filter, $resultByUid); + if (PEAR::isError($sortResult)) + { + // some servers are not replying on a search for uids, so try this one + $resultByUid = false; + $sortResult = $this->icServer->search('*', $resultByUid); + if (PEAR::isError($sortResult)) + { + error_log(__METHOD__.__LINE__.' PEAR_Error:'.array2string($sortResult->message)); + $sortResult = null; + } + } + } + if(is_array($sortResult)) { + sort($sortResult, SORT_NUMERIC); + } + if (self::$debug) error_log(__METHOD__." using Filter:".print_r($filter,true)." ->".print_r($sortResult,true)); + } + if ($setSession) + { + $this->sessionData['folderStatus'][$this->profileID][$_folderName]['uidValidity'] = $folderStatus['UIDVALIDITY']; + $this->sessionData['folderStatus'][$this->profileID][$_folderName]['messages'] = $folderStatus['EXISTS']; + $this->sessionData['folderStatus'][$this->profileID][$_folderName]['uidnext'] = $folderStatus['UIDNEXT']; + $this->sessionData['folderStatus'][$this->profileID][$_folderName]['filter'] = $_filter; + $this->sessionData['folderStatus'][$this->profileID][$_folderName]['sortResult'] = $sortResult; + $this->sessionData['folderStatus'][$this->profileID][$_folderName]['sort'] = $_sort; + } + } + if ($setSession) + { + $this->sessionData['folderStatus'][$this->profileID][$_folderName]['reverse'] = $_reverse; + $this->saveSessionData(); + } + + return $sortResult; + } + + function getMessageEnvelope($_uid, $_partID = '',$decode=false) + { + if($_partID == '') { + if( PEAR::isError($envelope = $this->icServer->getEnvelope('', $_uid, true)) ) { + return false; + } + //if ($decode) _debug_array($envelope[0]); + return ($decode ? self::decode_header($envelope[0]): $envelope[0]); + } else { + if( PEAR::isError($headers = $this->icServer->getParsedHeaders($_uid, true, $_partID, true)) ) { + return false; + } + + #_debug_array($headers); + $newData = array( + 'DATE' => $headers['DATE'], + 'SUBJECT' => ($decode ? self::decode_header($headers['SUBJECT']):$headers['SUBJECT']), + 'MESSAGE_ID' => $headers['MESSAGE-ID'] + ); + + $recepientList = array('FROM', 'TO', 'CC', 'BCC', 'SENDER', 'REPLY_TO'); + foreach($recepientList as $recepientType) { + if(isset($headers[$recepientType])) { + if ($decode) $headers[$recepientType] = self::decode_header($headers[$recepientType]); + $addresses = imap_rfc822_parse_adrlist($headers[$recepientType], ''); + foreach($addresses as $singleAddress) { + $addressData = array( + 'PERSONAL_NAME' => $singleAddress->personal ? $singleAddress->personal : 'NIL', + 'AT_DOMAIN_LIST' => $singleAddress->adl ? $singleAddress->adl : 'NIL', + 'MAILBOX_NAME' => $singleAddress->mailbox ? $singleAddress->mailbox : 'NIL', + 'HOST_NAME' => $singleAddress->host ? $singleAddress->host : 'NIL', + 'EMAIL' => $singleAddress->host ? $singleAddress->mailbox.'@'.$singleAddress->host : $singleAddress->mailbox, + ); + if($addressData['PERSONAL_NAME'] != 'NIL') { + $addressData['RFC822_EMAIL'] = imap_rfc822_write_address($singleAddress->mailbox, $singleAddress->host, $singleAddress->personal); + } else { + $addressData['RFC822_EMAIL'] = 'NIL'; + } + $newData[$recepientType][] = $addressData; + } + } else { + if($recepientType == 'SENDER' || $recepientType == 'REPLY_TO') { + $newData[$recepientType] = $newData['FROM']; + } else { + $newData[$recepientType] = array(); + } + } + } + //if ($decode) _debug_array($newData); + + return $newData; + } + } + + function getHeaders($_folderName, $_startMessage, $_numberOfMessages, $_sort, $_reverse, $_filter, $_thisUIDOnly=null, $_cacheResult=true) + { + //self::$debug=true; + if (self::$debug) error_log(__METHOD__.__LINE__.function_backtrace()); + if (self::$debug) error_log(__METHOD__.__LINE__."$_folderName,$_startMessage, $_numberOfMessages, $_sort, $reverse, ".array2string($_filter).", $_thisUIDOnly"); + $reverse = (bool)$_reverse; + // get the list of messages to fetch + $this->reopen($_folderName); + //$this->icServer->selectMailbox($_folderName); + $rByUid = true; // try searching by uid. this var will be passed by reference to getSortedList, and may be set to false, if UID retrieval fails + #print "
    ";
    +			#$this->icServer->setDebug(true);
    +			if ($_thisUIDOnly === null)
    +			{
    +				if (($_startMessage || $_numberOfMessages) && !isset($_filter['range']))
    +				{
    +					// this will not work we must calculate the range we want to retieve as e.g.: 0:20 retirieves the first 20 mails and sorts them
    +					// if sort capability is applied to the range fetched, not sort first and fetch the range afterwards
    +					$start = $_startMessage-1;
    +					$end = $_startMessage-1+$_numberOfMessages;
    +					//$_filter['range'] ="$start:$end";
    +					//$_filter['range'] ="$_startMessage:*";
    +				}
    +				if (self::$debug) error_log(__METHOD__.__LINE__."$_folderName, $_sort, $reverse, ".array2string($_filter).", $rByUid");
    +
    +				$sortResult = $this->getSortedList($_folderName, $_sort, $reverse, $_filter, $rByUid, $_cacheResult);
    +				if (self::$debug) error_log(__METHOD__.__LINE__.array2string($sortResult));
    +				#$this->icServer->setDebug(false);
    +				#print "
    "; + // nothing found + if(!is_array($sortResult) || empty($sortResult)) { + $retValue = array(); + $retValue['info']['total'] = 0; + $retValue['info']['first'] = 0; + $retValue['info']['last'] = 0; + return $retValue; + } + + $total = count($sortResult); + #_debug_array($sortResult); + #_debug_array(array_slice($sortResult, -5, -2)); + //error_log("REVERSE: $reverse"); + if($reverse === true) { + $startMessage = $_startMessage-1; + if($startMessage > 0) { + $sortResult = array_slice($sortResult, -($_numberOfMessages+$startMessage), -$startMessage); + } else { + $sortResult = array_slice($sortResult, -($_numberOfMessages+($_startMessage-1))); + } + $sortResult = array_reverse($sortResult); + } else { + $sortResult = array_slice($sortResult, $_startMessage-1, $_numberOfMessages); + } + } + else + { + $sortResult = (is_array($_thisUIDOnly) ? $_thisUIDOnly:(array)$_thisUIDOnly); + } + + $queryString = implode(',', $sortResult); + // fetch the data for the selected messages + $headersNew = $this->icServer->getSummary($queryString, $rByUid); + if ($headersNew == null) + { + if (self::$debug) error_log(__METHOD__.__LINE__."Uid->$queryString, ByUID? $rByUid"); + // message retrieval via uid failed try one by one via message number + $rByUid = false; + foreach($sortResult as $k => $v) + { + if (self::$debug) error_log(__METHOD__.__LINE__.' Query:'.$v.':*'); + $rv = $this->icServer->getSummary($v.':*', $rByUid); + $headersNew[] = $rv[0]; + } + } + if (self::$debug) error_log(__METHOD__.__LINE__.' Query:'.$queryString.' Result:'.array2string($headersNew)); + + $count = 0; + + foreach((array)$sortResult as $uid) { + $sortOrder[$uid] = $count++; + } + + $count = 0; + if (is_array($headersNew)) { + foreach((array)$headersNew as $headerObject) { + //if($count == 0) error_log(__METHOD__.array2string($headerObject)); + if (empty($headerObject['UID'])) continue; + $uid = ($rByUid ? $headerObject['UID'] : $headerObject['MSG_NUM']); + // make dates like "Mon, 23 Apr 2007 10:11:06 UT" working with strtotime + if(substr($headerObject['DATE'],-2) === 'UT') { + $headerObject['DATE'] .= 'C'; + } + if(substr($headerObject['INTERNALDATE'],-2) === 'UT') { + $headerObject['INTERNALDATE'] .= 'C'; + } + //error_log(__METHOD__.__LINE__.' '.$this->decode_subject($headerObject['SUBJECT']).'->'.$headerObject['DATE']); + $retValue['header'][$sortOrder[$uid]]['subject'] = $this->decode_subject($headerObject['SUBJECT']); + $retValue['header'][$sortOrder[$uid]]['size'] = $headerObject['SIZE']; + //$retValue['header'][$sortOrder[$uid]]['date'] = self::_strtotime($headerObject['DATE'],'ts',true); + $retValue['header'][$sortOrder[$uid]]['date'] = self::_strtotime($headerObject['INTERNALDATE'],'ts',true); + $retValue['header'][$sortOrder[$uid]]['mimetype'] = $headerObject['MIMETYPE']; + $retValue['header'][$sortOrder[$uid]]['id'] = $headerObject['MSG_NUM']; + $retValue['header'][$sortOrder[$uid]]['uid'] = $headerObject['UID']; + $retValue['header'][$sortOrder[$uid]]['priority'] = ($headerObject['PRIORITY']?$headerObject['PRIORITY']:3); + if (is_array($headerObject['FLAGS'])) { + $retValue['header'][$sortOrder[$uid]]['recent'] = in_array('\\Recent', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['flagged'] = in_array('\\Flagged', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['answered'] = in_array('\\Answered', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['forwarded'] = in_array('$Forwarded', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['deleted'] = in_array('\\Deleted', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['seen'] = in_array('\\Seen', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['draft'] = in_array('\\Draft', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['mdnsent'] = in_array('MDNSent', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['mdnnotsent'] = in_array('MDNnotSent', $headerObject['FLAGS']); + } + if(is_array($headerObject['FROM']) && is_array($headerObject['FROM'][0])) { + if($headerObject['FROM'][0]['HOST_NAME'] != 'NIL') { + $retValue['header'][$sortOrder[$uid]]['sender_address'] = self::decode_header($headerObject['FROM'][0]['EMAIL']); + } else { + $retValue['header'][$sortOrder[$uid]]['sender_address'] = self::decode_header($headerObject['FROM'][0]['MAILBOX_NAME']); + } + if($headerObject['FROM'][0]['PERSONAL_NAME'] != 'NIL') { + $retValue['header'][$sortOrder[$uid]]['sender_name'] = self::decode_header($headerObject['FROM'][0]['PERSONAL_NAME']); + } + + } + + if(is_array($headerObject['TO']) && is_array($headerObject['TO'][0])) { + if($headerObject['TO'][0]['HOST_NAME'] != 'NIL') { + $retValue['header'][$sortOrder[$uid]]['to_address'] = self::decode_header($headerObject['TO'][0]['EMAIL']); + } else { + $retValue['header'][$sortOrder[$uid]]['to_address'] = self::decode_header($headerObject['TO'][0]['MAILBOX_NAME']); + } + if($headerObject['TO'][0]['PERSONAL_NAME'] != 'NIL') { + $retValue['header'][$sortOrder[$uid]]['to_name'] = self::decode_header($headerObject['TO'][0]['PERSONAL_NAME']); + } + if (count($headerObject['TO'])>1) + { + $ki=0; + foreach($headerObject['TO'] as $k => $add) + { + if ($k==0) continue; + //error_log(__METHOD__.__LINE__."-> $k:".array2string($add)); + if($add['HOST_NAME'] != 'NIL') + { + $retValue['header'][$sortOrder[$uid]]['additional_to_addresses'][$ki]['address'] = self::decode_header($add['EMAIL']); + } + else + { + $retValue['header'][$sortOrder[$uid]]['additional_to_addresses'][$ki]['address'] = self::decode_header($add['MAILBOX_NAME']); + } + if($headerObject['TO'][$k]['PERSONAL_NAME'] != 'NIL') + { + $retValue['header'][$sortOrder[$uid]]['additional_to_addresses'][$ki]['name'] = self::decode_header($add['PERSONAL_NAME']); + } + //error_log(__METHOD__.__LINE__.array2string($retValue['header'][$sortOrder[$uid]]['additional_to_addresses'][$ki])); + $ki++; + } + } + } + + $count++; + } + //self::$debug=false; + // sort the messages to the requested displayorder + if(is_array($retValue['header'])) { + $countMessages = false; + if (isset($_filter['range'])) $countMessages = $this->sessionData['folderStatus'][$this->profileID][$_folderName]['messages']; + ksort($retValue['header']); + $retValue['info']['total'] = $countMessages ? $countMessages : $total; + $retValue['info']['first'] = $_startMessage; + $retValue['info']['last'] = $_startMessage + $count - 1 ; + return $retValue; + } else { + $retValue = array(); + $retValue['info']['total'] = 0; + $retValue['info']['first'] = 0; + $retValue['info']['last'] = 0; + return $retValue; + } + } else { + error_log(__METHOD__." -> retrieval of Message Details failed: ".print_r($headersNew,TRUE)); + $retValue = array(); + $retValue['info']['total'] = 0; + $retValue['info']['first'] = 0; + $retValue['info']['last'] = 0; + return $retValue; + } + } + + function getNextMessage($_foldername, $_id) + { + #_debug_array($this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult']); + #_debug_array($this->sessionData['folderStatus'][$this->profileID]); + #print "ID: $_id
    "; + $position=false; + if (is_array($this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'])) { + $position = array_search($_id, $this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult']); + } + #print "POS: $position
    "; + + if($position !== false) { + $retValue = array(); + + if($this->sessionData['folderStatus'][$this->profileID][$_foldername]['reverse'] == true) { + #print "is reverse
    "; + if(isset($this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position-1])) { + $retValue['next'] = $this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position-1]; + } + if(isset($this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position+1])) { + $retValue['previous'] = $this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position+1]; + } + } else { + #print "is not reverse"; + if(isset($this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position-1])) { + $retValue['previous'] = $this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position-1]; + } + if(isset($this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position+1])) { + $retValue['next'] = $this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position+1]; + } + } + + return $retValue; + } + + return false; + } + + function getIMAPACL($_folderName, $user='') + { + if(($this->hasCapability('ACL'))) { + if ( PEAR::isError($acl = $this->icServer->getACL($_folderName)) ) { + return false; + } + + if ($user=='') { + return $acl; + } + + foreach ($acl as $i => $userACL) { + if ($userACL['USER'] == $user) { + return $userACL['RIGHTS']; + } + } + + return ''; + } + + return false; + } + + /** + * checks if the imap server supports a given capability + * + * @param string $_capability the name of the capability to check for + * @return bool + */ + function hasCapability($_capability) + { + return $this->icServer->hasCapability(strtoupper($_capability)); + } + + function getMailPreferences() + { + return $this->mailPreferences; + } + + function getMessageAttachments($_uid, $_partID='', $_structure='', $fetchEmbeddedImages=true, $fetchTextCalendar=false, $resolveTNEF=true) + { + if (self::$debug) echo __METHOD__."$_uid, $_partID
    "; + + if(is_object($_structure)) { + $structure = $_structure; + } else { + $structure = $this->icServer->getStructure($_uid, true); + + if($_partID != '' && $_partID !=0) { + $structure = $this->_getSubStructure($structure, $_partID); + } + } + if (self::$debug) _debug_array($structure); + $attachments = array(); + // this kind of messages contain only the attachment and no body + if($structure->type == 'APPLICATION' || $structure->type == 'AUDIO' || $structure->type == 'VIDEO' || $structure->type == 'IMAGE') + { + $newAttachment = array(); + $newAttachment['name'] = $this->getFileNameFromStructure($structure,$_uid,$structure->partID); + $newAttachment['size'] = $structure->bytes; + $newAttachment['mimeType'] = $structure->type .'/'. $structure->subType; + $newAttachment['partID'] = $structure->partID; + $newAttachment['encoding'] = $structure->encoding; + // try guessing the mimetype, if we get the application/octet-stream + if (strtolower($newAttachment['mimeType']) == 'application/octet-stream') $newAttachment['mimeType'] = mime_magic::filename2mime($newAttachment['name']); + + if(isset($structure->cid)) { + $newAttachment['cid'] = $structure->cid; + } + # if the new attachment is a winmail.dat, we have to decode that first + if ( $resolveTNEF && $newAttachment['name'] == 'winmail.dat' && + ( $wmattachments = $this->decode_winmail( $_uid, $newAttachment['partID'] ) ) ) + { + $attachments = array_merge( $attachments, $wmattachments ); + } + elseif ( $resolveTNEF===false && $newAttachment['name'] == 'winmail.dat' ) + { + $attachments[] = $newAttachment; + } else { + if ( ($fetchEmbeddedImages && isset($newAttachment['cid']) && strlen($newAttachment['cid'])>0) || + !isset($newAttachment['cid']) || + empty($newAttachment['cid'])) $attachments[] = $newAttachment; + } + //$attachments[] = $newAttachment; + + #return $attachments; + } + // outlook sometimes sends a TEXT/CALENDAR;REQUEST as plain ics, nothing more. + if ($structure->type == 'TEXT' && $structure->subType == 'CALENDAR' && + isset($structure->parameters['METHOD'] ) && $structure->parameters['METHOD'] == 'REQUEST') + { + $newAttachment = array(); + $newAttachment['name'] = 'event.ics'; + $newAttachment['size'] = $structure->bytes; + $newAttachment['mimeType'] = $structure->type .'/'. $structure->subType.';'.$structure->parameters['METHOD']; + $newAttachment['partID'] = $structure->partID; + $newAttachment['encoding'] = $structure->encoding; + $newAttachment['method'] = $structure->parameters['METHOD']; + $newAttachment['charset'] = $structure->parameters['CHARSET']; + $attachments[] = $newAttachment; + } + // this kind of message can have no attachments + if(($structure->type == 'TEXT' && !($structure->disposition == 'INLINE' && $structure->dparameters['FILENAME'])) || + ($structure->type == 'MULTIPART' && $structure->subType == 'ALTERNATIVE' && !is_array($structure->subParts)) || + !is_array($structure->subParts)) + { + if (count($attachments) == 0) return array(); + } + + #$attachments = array(); + + foreach((array)$structure->subParts as $subPart) { + // skip all non attachment parts + if(($subPart->type == 'TEXT' && ($subPart->subType == 'PLAIN' || $subPart->subType == 'HTML') && ($subPart->disposition != 'ATTACHMENT' && + !($subPart->disposition == 'INLINE' && $subPart->dparameters['FILENAME']))) || + ($subPart->type == 'MULTIPART' && $subPart->subType == 'ALTERNATIVE') || + ($subPart->type == 'MULTIPART' && $subPart->subType == 'APPLEFILE') || + ($subPart->type == 'MESSAGE' && $subPart->subType == 'delivery-status')) + { + if ($subPart->type == 'MULTIPART' && $subPart->subType == 'ALTERNATIVE') + { + $attachments = array_merge($this->getMessageAttachments($_uid, '', $subPart, $fetchEmbeddedImages, $fetchTextCalendar, $resolveTNEF), $attachments); + } + if (!($subPart->type=='TEXT' && $subPart->disposition =='INLINE' && $subPart->filename)) continue; + } + + // fetch the subparts for this part + if($subPart->type == 'MULTIPART' && + ($subPart->subType == 'RELATED' || + $subPart->subType == 'MIXED' || + $subPart->subType == 'SIGNED' || + $subPart->subType == 'APPLEDOUBLE')) + { + $attachments = array_merge($this->getMessageAttachments($_uid, '', $subPart, $fetchEmbeddedImages,$fetchTextCalendar, $resolveTNEF), $attachments); + } else { + if (!$fetchTextCalendar && $subPart->type == 'TEXT' && + $subPart->subType == 'CALENDAR' && + $subPart->parameters['METHOD'] && + $subPart->disposition !='ATTACHMENT') continue; + $newAttachment = array(); + $newAttachment['name'] = $this->getFileNameFromStructure($subPart,$_uid,$subPart->partID); + $newAttachment['size'] = $subPart->bytes; + $newAttachment['mimeType'] = $subPart->type .'/'. $subPart->subType; + $newAttachment['partID'] = $subPart->partID; + $newAttachment['encoding'] = $subPart->encoding; + $newAttachment['method'] = $subPart->parameters['METHOD']; + $newAttachment['charset'] = $subPart->parameters['CHARSET']; + // try guessing the mimetype, if we get the application/octet-stream + if (strtolower($newAttachment['mimeType']) == 'application/octet-stream') $newAttachment['mimeType'] = mime_magic::filename2mime($newAttachment['name']); + + if(isset($subPart->cid)) { + $newAttachment['cid'] = $subPart->cid; + } + + # if the new attachment is a winmail.dat, we have to decode that first + if ( $resolveTNEF && $newAttachment['name'] == 'winmail.dat' && + ( $wmattachments = $this->decode_winmail( $_uid, $newAttachment['partID'] ) ) ) + { + $attachments = array_merge( $attachments, $wmattachments ); + } + elseif ( $resolveTNEF===false && $newAttachment['name'] == 'winmail.dat' ) + { + $attachments[] = $newAttachment; + } else { + if ( ($fetchEmbeddedImages && isset($newAttachment['cid']) && strlen($newAttachment['cid'])>0) || + !isset($newAttachment['cid']) || + empty($newAttachment['cid']) || $newAttachment['cid'] == 'NIL') $attachments[] = $newAttachment; + } + //$attachments[] = $newAttachment; + } + } + + //_debug_array($attachments); exit; + return $attachments; + + } + + function getFileNameFromStructure(&$structure, $_uid = false, $partID = false) + { + static $namecounter; + if (is_null($namecounter)) $namecounter = 0; + + //if ( $_uid && $partID) error_log(__METHOD__.__LINE__.array2string($structure).' Uid:'.$_uid.' PartID:'.$partID.' -> '.array2string($this->icServer->getParsedHeaders($_uid, true, $partID, true))); + if(isset($structure->parameters['NAME'])) { + return rawurldecode(self::decode_header($structure->parameters['NAME'])); + } elseif(isset($structure->dparameters['FILENAME'])) { + return rawurldecode(self::decode_header($structure->dparameters['FILENAME'])); + } elseif(isset($structure->dparameters['FILENAME*'])) { + return rawurldecode(self::decode_header($structure->dparameters['FILENAME*'])); + } elseif ( isset($structure->filename) && !empty($structure->filename) && $structure->filename != 'NIL') { + return rawurldecode(self::decode_header($structure->filename)); + } else { + if ( $_uid && $partID) + { + $headers = $this->icServer->getParsedHeaders($_uid, true, $partID, true); + if ($headers) + { + if (!PEAR::isError($headers)) + { + // simple parsing of the headers array for a usable name + //error_log( __METHOD__.__LINE__.array2string($headers)); + foreach(array('CONTENT-TYPE','CONTENT-DISPOSITION') as $k => $v) + { + foreach(array('filename','name') as $sk => $n) + { + if (stripos($headers[$v],$n)!== false) + { + $buff = explode($n,$headers[$v]); + //error_log(__METHOD__.__LINE__.array2string($buff)); + $namepart = array_pop($buff); + //error_log(__METHOD__.__LINE__.$namepart); + $fp = strpos($namepart,'"'); + //error_log(__METHOD__.__LINE__.' Start:'.$fp); + if ($fp !== false) + { + $np = strpos($namepart,'"', $fp+1); + //error_log(__METHOD__.__LINE__.' End:'.$np); + if ($np !== false) + { + $name = trim(substr($namepart,$fp+1,$np-$fp-1)); + if (!empty($name)) return $name; + } + } + } + } + } + } + } + } + $namecounter++; + return lang("unknown").$namecounter.($structure->subType ? ".".$structure->subType : ""); + } + } + + function getMessageBody($_uid, $_htmlOptions='', $_partID='', $_structure = '', $_preserveSeen = false) + { + if (self::$debug) echo __METHOD__."$_uid, $_htmlOptions, $_partID
    "; + if($_htmlOptions != '') { + $this->htmlOptions = $_htmlOptions; + } + if(is_object($_structure)) { + $structure = $_structure; + } else { + $structure = $this->icServer->getStructure($_uid, true); + if($_partID != '') { + $structure = $this->_getSubStructure($structure, $_partID); + } + } + if (self::$debug) _debug_array($structure); + switch($structure->type) { + case 'APPLICATION': + return array( + array( + 'body' => '', + 'mimeType' => 'text/plain', + 'charSet' => 'iso-8859-1', + ) + ); + break; + case 'MULTIPART': + switch($structure->subType) { + case 'ALTERNATIVE': + $bodyParts = array($this->getMultipartAlternative($_uid, $structure->subParts, $this->htmlOptions, $_preserveSeen)); + + break; + + case 'MIXED': + case 'REPORT': + case 'SIGNED': + $bodyParts = $this->getMultipartMixed($_uid, $structure->subParts, $this->htmlOptions, $_preserveSeen); + break; + + case 'RELATED': + $bodyParts = $this->getMultipartRelated($_uid, $structure->subParts, $this->htmlOptions, $_preserveSeen); + break; + } + return self::normalizeBodyParts($bodyParts); + break; + case 'VIDEO': + case 'AUDIO': // some servers send audiofiles and imagesfiles directly, without any stuff surround it + case 'IMAGE': // they are displayed as Attachment NOT INLINE + return array( + array( + 'body' => '', + 'mimeType' => $structure->subType, + ), + ); + break; + case 'TEXT': + $bodyPart = array(); + if ( $structure->disposition != 'ATTACHMENT') { + switch($structure->subType) { + case 'CALENDAR': + // this is handeled in getTextPart + case 'HTML': + case 'PLAIN': + default: + $bodyPart = array($this->getTextPart($_uid, $structure, $this->htmlOptions, $_preserveSeen)); + } + } else { + // what if the structure->disposition is attachment ,... + } + return self::normalizeBodyParts($bodyPart); + break; + case 'ATTACHMENT': + case 'MESSAGE': + switch($structure->subType) { + case 'RFC822': + $newStructure = array_shift($structure->subParts); + if (self::$debug) {echo __METHOD__." Message -> RFC -> NewStructure:"; _debug_array($newStructure);} + return self::normalizeBodyParts($this->getMessageBody($_uid, $_htmlOptions, $newStructure->partID, $newStructure)); + break; + } + break; + default: + if (self::$debug) _debug_array($structure); + return array( + array( + 'body' => lang('The mimeparser can not parse this message.'), + 'mimeType' => 'text/plain', + 'charSet' => 'iso-8859-1', + ) + ); + break; + } + } + + /** + * normalizeBodyParts - function to gather and normalize all body Information + * @param _bodyParts - Body Array + * @return array - a normalized Bodyarray + */ + static function normalizeBodyParts($_bodyParts) + { + if (is_array($_bodyParts)) + { + foreach($_bodyParts as $singleBodyPart) + { + if (!isset($singleBodyPart['body'])) { + $buff = self::normalizeBodyParts($singleBodyPart); + foreach ((array)$buff as $val) $body2return[] = $val; + continue; + } + $body2return[] = $singleBodyPart; + } + } + else + { + $body2return = $_bodyParts; + } + return $body2return; + } + + function getMessageHeader($_uid, $_partID = '',$decode=false) + { + $retValue = $this->icServer->getParsedHeaders($_uid, true, $_partID, true); + if (PEAR::isError($retValue)) + { + error_log(__METHOD__.__LINE__.array2string($retValue->message)); + $retValue = null; + } + return ($decode ? self::decode_header($retValue):$retValue); + } + + function getMessageRawBody($_uid, $_partID = '') + { + if($_partID != '') { + $body = $this->icServer->getBody($_uid, true); + } else { + $body = $this->icServer->getBodyPart($_uid, $_partID, true); + } + if (PEAR::isError($body)) + { + error_log(__METHOD__.__LINE__.' failed:'.$body->message); + return false; + } + + return $body; + } + + function getMessageRawHeader($_uid, $_partID = '') + { + $retValue = $this->icServer->getRawHeaders($_uid, $_partID, true); + if (PEAR::isError($retValue)) + { + error_log(__METHOD__.__LINE__.array2string($retValue->message)); + $retValue = "Could not retrieve RawHeaders in ".__METHOD__.__LINE__." PEAR::Error:".array2string($retValue->message); + } + return $retValue; + } + + // return the qouta of the users INBOX + function getQuotaRoot() + { + //if (!$this->icServer->_connected) $this->openConnection($this->profileID); + + if(!$this->icServer->hasCapability('QUOTA')) { + return false; + } + $quota = $this->icServer->getStorageQuotaRoot('INBOX'); + //error_log(__METHOD__.__LINE__.array2string($quota)); + if(is_array($quota)) { + return array( + 'usage' => $quota['USED'], + 'limit' => $quota['QMAX'], + ); + } else { + return false; + } + } + + function getDraftFolder($_checkexistance=TRUE) + { + if(empty($this->mailPreferences->preferences['draftFolder'])) { + return false; + } + $_folderName = $this->mailPreferences->preferences['draftFolder']; + // does the folder exist??? + if ($_checkexistance && !self::folderExists($_folderName)) { + return false; + } + return $_folderName; + } + + function getTemplateFolder($_checkexistance=TRUE) + { + if(empty($this->mailPreferences->preferences['templateFolder'])) { + return false; + } + $_folderName = $this->mailPreferences->preferences['templateFolder']; + // does the folder exist??? + if ($_checkexistance && !self::folderExists($_folderName)) { + return false; + } + return $_folderName; + } + + function getTrashFolder($_checkexistance=TRUE) + { + if(empty($this->mailPreferences->preferences['trashFolder'])) { + return false; + } + $_folderName = $this->mailPreferences->preferences['trashFolder']; + // does the folder exist??? + if ($_checkexistance && !self::folderExists($_folderName)) { + return false; + } + return $_folderName; + } + + function getSentFolder($_checkexistance=TRUE) + { + if(empty($this->mailPreferences->preferences['sentFolder'])) { + return false; + } + $_folderName = $this->mailPreferences->preferences['sentFolder']; + // does the folder exist??? + if ($_checkexistance && !self::folderExists($_folderName)) { + return false; + } + return $_folderName; + } + + function isSentFolder($_folderName, $_checkexistance=TRUE) + { + if(empty($this->mailPreferences->preferences['sentFolder'])) { + return false; + } + // does the folder exist??? + if ($_checkexistance && !self::folderExists($_folderName)) { + return false; + } + + if(false !== stripos($_folderName, $this->mailPreferences->preferences['sentFolder'])) { + return true; + } else { + return false; + } + } + + /** + * checks if the Outbox folder exists and is port of the foldername to be checked + */ + function isOutbox($_folderName, $_checkexistance=TRUE) + { + if (stripos($_folderName, 'Outbox')===false) { + return false; + } + // does the folder exist??? + if ($_checkexistance && !self::folderExists($_folderName)) { + return false; + } + return true; + } + + function isDraftFolder($_folderName, $_checkexistance=TRUE) + { + if(empty($this->mailPreferences->preferences['draftFolder'])) { + return false; + } + // does the folder exist??? + if ($_checkexistance && !self::folderExists($_folderName)) { + return false; + } + + if(false !== stripos($_folderName, $this->mailPreferences->preferences['draftFolder'])) { + return true; + } else { + return false; + } + } + + function isTrashFolder($_folderName, $_checkexistance=TRUE) + { + if(empty($this->mailPreferences->preferences['trashFolder'])) { + return false; + } + // does the folder exist??? + if ($_checkexistance && !self::folderExists($_folderName)) { + return false; + } + + if(false !== stripos($_folderName, $this->mailPreferences->preferences['trashFolder'])) { + return true; + } else { + return false; + } + } + + function isTemplateFolder($_folderName, $_checkexistance=TRUE) + { + if(empty($this->mailPreferences->preferences['templateFolder'])) { + return false; + } + // does the folder exist??? + if ($_checkexistance && !self::folderExists($_folderName)) { + return false; + } + + if(false !== stripos($_folderName, $this->mailPreferences->preferences['templateFolder'])) { + return true; + } else { + return false; + } + } + + function folderExists($_folder, $forceCheck=false) + { + static $folderInfo; + if (empty($_folder)) + { + error_log(__METHOD__.__LINE__.' Called with empty Folder:'.$_folder.function_backtrace()); + return false; + } + // reduce traffic within on request + //error_log(__METHOD__.__LINE__.' Called with Folder:'.$_folder.function_backtrace()); + if (isset($folderInfo[$_folder])) return $folderInfo[$_folder]; + + // does the folder exist??? + //error_log(__METHOD__."->Connected?".$this->icServer->_connected.", ".$_folder.", ".($forceCheck?' forceCheck activated':'dont check on server')); + if ((!($this->icServer->_connected == 1)) && $forceCheck) { + //error_log(__METHOD__."->NotConnected and forceCheck with profile:".$this->profileID); + //return false; + //try to connect + if (!$this->icServer->_connected) $this->openConnection($this->profileID,false); + } + if(is_a($this->icServer,'defaultimap')) $folderInfo[$_folder] = $this->icServer->mailboxExist($_folder); + //error_log(__METHOD__.__LINE__.' Folder Exists:'.$folderInfo[$_folder].function_backtrace()); + + if(is_a($folderInfo[$_folder], 'PEAR_Error') || $folderInfo[$_folder] !== true) + { + return false; + } else { + return true; + } + } + + /** + * getFolderType - checks and returns the foldertype for a given nfolder + * @param string $mailbox + * @return int the folder Type 0 for Standard, 1 for Sent, 2 for draft, 3 for template + */ + function getFolderType($mailbox) + { + $sentFolderFlag =$this->isSentFolder($mailbox); + $folderType = 0; + if($sentFolderFlag || + false !== in_array($mailbox,explode(',',$GLOBALS['egw_info']['user']['preferences']['felamimail']['messages_showassent_0']))) + { + $folderType = 1; + $sentFolderFlag=1; + } elseif($this->isDraftFolder($mailbox)) { + $folderType = 2; + } elseif($this->isTemplateFolder($mailbox)) { + $folderType = 3; + } + return $folderType; + } + + function moveMessages($_foldername, $_messageUID, $deleteAfterMove=true, $currentFolder = Null, $returnUIDs = false) + { + $msglist = ''; + + $deleteOptions = $GLOBALS['egw_info']["user"]["preferences"]["felamimail"]["deleteOptions"]; + $retUid = $this->icServer->copyMessages($_foldername, $_messageUID, (!empty($currentFolder)?$currentFolder: $this->sessionData['mailbox']), true, $returnUIDs); + if ( PEAR::isError($retUid) ) { + error_log(__METHOD__.__LINE__."Copying to Folder $_foldername failed! PEAR::Error:".array2string($retUid->message)); + throw new egw_exception("Copying to Folder $_foldername failed! PEAR::Error:".array2string($retUid->message)); + return false; + } + if ($deleteAfterMove === true) + { + $retValue = $this->icServer->deleteMessages($_messageUID, true); + if ( PEAR::isError($retValue)) + { + error_log(__METHOD__.__LINE__."Delete After Move PEAR::Error:".array2string($retValue->message)); + throw new egw_exception("Delete After Move PEAR::Error:".array2string($retValue->message)); + return false; + } + + if($deleteOptions != "mark_as_deleted") + { + // delete the messages finaly + $this->icServer->expunge(); + } + } + //error_log(__METHOD__.__LINE__.array2string($retUid)); + return ($returnUIDs ? $retUid : true); + } + + function openConnection($_icServerID=0, $_adminConnection=false) + { + //error_log(__METHOD__.__LINE__.'->'.$_icServerID); + if (!is_object($this->mailPreferences)) + { + error_log(__METHOD__." No Object for MailPreferences found.". function_backtrace()); + $this->errorMessage .= lang('No valid data to create MailProfile!!'); + return false; + } + if(!$this->icServer = $this->mailPreferences->getIncomingServer((int)$_icServerID)) { + $this->errorMessage .= lang('No active IMAP server found!!'); + return false; + } + //error_log(__METHOD__.__LINE__.'->'.array2string($this->icServer->ImapServerId)); + if ($this->icServer && empty($this->icServer->host)) { + $errormessage = lang('No IMAP server host configured!!'); + if ($GLOBALS['egw_info']['user']['apps']['emailadmin']) { + $errormessage .= "
    ".lang("Configure a valid IMAP Server in emailadmin for the profile you are using."); + } else { + $errormessage .= "
    ".lang('Please ask the administrator to correct the emailadmin IMAP Server Settings for you.'); + } + $this->icServer->_connectionErrorObject->message .= $this->errorMessage .= $errormessage; + return false; + } + //error_log( "---------------------------open connection ".function_backtrace()); + //error_log(print_r($this->icServer,true)); + if ($this->icServer->_connected == 1) { + $tretval = $this->icServer->selectMailbox($this->icServer->currentMailbox); + //error_log(__METHOD__." using existing Connection ProfileID:".$_icServerID.' Status:'.print_r($this->icServer->_connected,true)); + } else { + $tretval = $this->icServer->openConnection($_adminConnection); + //error_log(__METHOD__." open new Connection ProfileID:".$_icServerID.' Status:'.print_r($this->icServer->_connected,true)); + } + //error_log(print_r($this->icServer->_connected,true)); + return $tretval; + } + + /** + * rename a folder + * + * @param string _oldFolderName the old foldername + * @param string _parent the parent foldername + * @param string _folderName the new foldername + * + * @return mixed name of the newly created folder or false on error + */ + function renameFolder($_oldFolderName, $_parent, $_folderName) + { + $oldFolderName = $this->_encodeFolderName($_oldFolderName); + $parent = $this->_encodeFolderName($_parent); + $folderName = $this->_encodeFolderName($_folderName); + + if(empty($parent)) { + $newFolderName = $folderName; + } else { + $HierarchyDelimiter = $this->getHierarchyDelimiter(); + $newFolderName = $parent . $HierarchyDelimiter . $folderName; + } + if (self::$debug) error_log("create folder: $newFolderName"); + $rv = $this->icServer->renameMailbox($oldFolderName, $newFolderName); + if ( PEAR::isError($rv) ) { + if (self::$debug) error_log(__METHOD__." failed for $oldFolderName, $newFolderName with error: ".print_r($rv->message,true)); + return false; + } + + return $newFolderName; + + } + + function reopen($_foldername) + { + //error_log( "------------------------reopen-
    "); + //error_log(print_r($this->icServer->_connected,true)); + if ($this->icServer->_connected == 1) { + $tretval = $this->icServer->selectMailbox($_foldername); + } else { + $tretval = $this->icServer->openConnection(false); + $tretval = $this->icServer->selectMailbox($_foldername); + } + } + + function restoreSessionData() + { + $GLOBALS['egw_info']['flags']['autoload'] = array(__CLASS__,'autoload'); + + $this->sessionData = $GLOBALS['egw']->session->appsession('session_data','felamimail'); + } + + function saveFilter($_formData) + { + if(!empty($_formData['from'])) + $data['from'] = $_formData['from']; + if(!empty($_formData['to'])) + $data['to'] = $_formData['to']; + if(!empty($_formData['subject'])) + $data['subject']= $_formData['subject']; + if($_formData['filterActive'] == "true") + { + $data['filterActive']= "true"; + } + + $this->sessionData['filter'] = $data; + $this->saveSessionData(); + } + + function saveSessionData() + { + $GLOBALS['egw']->session->appsession('session_data','felamimail',$this->sessionData); + } + + function setEMailProfile($_profileID) + { + $config = CreateObject('phpgwapi.config','felamimail'); + $config->read_repository(); + $config->value('profileID',$_profileID); + $config->save_repository(); + } + + function subscribe($_folderName, $_status) + { + if (self::$debug) error_log("felamimail_bo::".($_status?"":"un")."subscribe:".$_folderName); + if($_status === true) { + if ( PEAR::isError($this->icServer->subscribeMailbox($_folderName))) { + error_log("felamimail_bo::".($_status?"":"un")."subscribe:".$_folderName." failed"); + return false; + } + } else { + if ( PEAR::isError($this->icServer->unsubscribeMailbox($_folderName))) { + error_log("felamimail_bo::".($_status?"":"un")."subscribe:".$_folderName." failed"); + return false; + } + } + + return true; + } + + function toggleFilter() + { + if($this->sessionData['filter']['filterActive'] == 'true') { + $this->sessionData['filter']['filterActive'] = 'false'; + } else { + $this->sessionData['filter']['filterActive'] = 'true'; + } + $this->saveSessionData(); + } + + function updateAccount($_hookValues) + { + if (is_object($this->mailPreferences)) $icServer = $this->mailPreferences->getIncomingServer(0); + if(is_a($icServer,'defaultimap')) { + $icServer->updateAccount($_hookValues); + } + + if (is_object($this->mailPreferences)) $ogServer = $this->mailPreferences->getOutgoingServer(0); + if(is_a($ogServer,'defaultsmtp')) { + $ogServer->updateAccount($_hookValues); + } + } + + function updateSingleACL($_folderName, $_accountName, $_aclType, $_aclStatus,$_recursive=false) + { + //error_log(__METHOD__.__LINE__." $_folderName, $_accountName, $_aclType, $_aclStatus,$_recursive"); + $userACL = $this->getIMAPACL($_folderName, $_accountName); + + if($_aclStatus == 'true' || $_aclStatus == 1) { + if(strpos($userACL, $_aclType) === false) { + $userACL .= $_aclType; + $this->setACL($_folderName, $_accountName, $userACL, $_recursive); + } + } elseif($_aclStatus == 'false' || empty($_aclStatus)) { + if(strpos($userACL, $_aclType) !== false) { + $userACL = str_replace($_aclType,'',$userACL); + $this->setACL($_folderName, $_accountName, $userACL, $_recursive); + } + } + + return $userACL; + } + + static function wordwrap($str, $cols, $cut, $dontbreaklinesstartingwith=false) + { + $lines = explode("\n", $str); + $newStr = ''; + foreach($lines as $line) + { + // replace tabs by 8 space chars, or any tab only counts one char + //$line = str_replace("\t"," ",$line); + //$newStr .= wordwrap($line, $cols, $cut); + $allowedLength = $cols-strlen($cut); + if (strlen($line) > $allowedLength && + ($dontbreaklinesstartingwith==false || + ($dontbreaklinesstartingwith && + strlen($dontbreaklinesstartingwith)>=1 && + substr($line,0,strlen($dontbreaklinesstartingwith)) != $dontbreaklinesstartingwith + ) + ) + ) + { + $s=explode(" ", $line); + $line = ""; + $linecnt = 0; + foreach ($s as $k=>$v) { + $cnt = strlen($v); + // only break long words within the wordboundaries, + // but it may destroy links, so we check for href and dont do it if we find one + if($cnt > $allowedLength && stripos($v,'href=')===false && stripos($v,'onclick=')===false) + { + $v=wordwrap($v, $allowedLength, $cut, true); + } + // the rest should be broken at the start of the new word that exceeds the limit + if ($linecnt+$cnt > $allowedLength) { + $v=$cut.$v; + #$linecnt = 0; + $linecnt =strlen($v)-strlen($cut); + } else { + $linecnt += $cnt; + } + if (strlen($v)) $line .= (strlen($line) ? " " : "").$v; + } + } + $newStr .= $line . "\n"; + } + return $newStr; + } + + /** + * convert the foldername from display charset to UTF-7 + * + * @param string _parent the parent foldername + * @return ISO-8859-1 / UTF7-IMAP encoded string + */ + function _encodeFolderName($_folderName) { + return translation::convert($_folderName, self::$displayCharset, 'ISO-8859-1'); + #return translation::convert($_folderName, self::$displayCharset, 'UTF7-IMAP'); + } + + /** + * convert the foldername from UTF-7 to display charset + * + * @param string _parent the parent foldername + * @return ISO-8859-1 / self::$displayCharset encoded string + */ + function _decodeFolderName($_folderName) { + return translation::convert($_folderName, self::$displayCharset, 'ISO-8859-1'); + #return translation::convert($_folderName, 'UTF7-IMAP', self::$displayCharset); + } + + /** + * convert the sort value from the gui(integer) into a string + * + * @param int _sort the integer sort order + * @return the ascii sort string + */ + function _getSortString($_sort, $_reverse=false) + { + $_reverse=false; + switch($_sort) { + case 2: + $retValue = 'FROM'; + break; + case 4: + $retValue = 'TO'; + break; + case 3: + $retValue = 'SUBJECT'; + break; + case 6: + $retValue = 'SIZE'; + break; + case 0: + default: + //$retValue = 'DATE'; + $retValue = 'ARRIVAL'; + break; + } + + return ($_reverse?'REVERSE ':'').$retValue; + } + + function sendMDN($uid) { + $identities = $this->mailPreferences->getIdentity(); + $headers = $this->getMessageHeader($uid); + $send = CreateObject('phpgwapi.send'); + $send->ClearAddresses(); + $send->ClearAttachments(); + $send->IsHTML(False); + $send->IsSMTP(); + + $array_to = explode(",",$headers['TO']); + foreach($identities as $identity) { + if ( preg_match('/\b'.$identity->emailAddress.'\b/',$headers['TO']) ) { + $send->From = $identity->emailAddress; + $send->FromName = $identity->realName; + error_log(__METHOD__.__LINE__.' using identity for send from:'.$send->From.' to match header information:'.$headers['TO']); + break; + } + if($identity->default) { + $send->From = $identity->emailAddress; + $send->FromName = $identity->realName; + } + } + + if (isset($headers['DISPOSITION-NOTIFICATION-TO'])) { + $toAddr = $headers['DISPOSITION-NOTIFICATION-TO']; + } else if ( isset($headers['RETURN-RECEIPT-TO']) ) { + $toAddr = $headers['RETURN-RECEIPT-TO']; + } else if ( isset($headers['X-CONFIRM-READING-TO']) ) { + $toAddr = $headers['X-CONFIRM-READING-TO']; + } else return false; + $singleAddress = imap_rfc822_parse_adrlist($toAddr,''); + if (self::$debug) error_log(__METHOD__.__LINE__.' To Address:'.$singleAddress[0]->mailbox."@".$singleAddress[0]->host.", ".$singleAddress[0]->personal); + $send->AddAddress($singleAddress[0]->mailbox."@".$singleAddress[0]->host, $singleAddress[0]->personal); + $send->AddCustomHeader('References: '.$headers['MESSAGE-ID']); + $send->Subject = $send->encode_subject( lang('Read')." : ".$headers['SUBJECT'] ); + + $sep = "-----------mdn".$uniq_id = md5(uniqid(time())); + + $body = "--".$sep."\r\n". + "Content-Type: text/plain; charset=ISO-8859-1\r\n". + "Content-Transfer-Encoding: 7bit\r\n\r\n". + $send->EncodeString(lang("Your message to %1 was displayed." ,$send->From),"7bit"). + "\r\n"; + + $body .= "--".$sep."\r\n". + "Content-Type: message/disposition-notification; name=\"MDNPart2.txt\"\r\n" . + "Content-Disposition: inline\r\n". + "Content-Transfer-Encoding: 7bit\r\n\r\n"; + $body.= $send->EncodeString("Reporting-UA: eGroupWare\r\n" . + "Final-Recipient: rfc822;".$send->From."\r\n" . + "Original-Message-ID: ".$headers['MESSAGE-ID']."\r\n". + "Disposition: manual-action/MDN-sent-manually; displayed",'7bit')."\r\n"; + + $body .= "--".$sep."\r\n". + "Content-Type: text/rfc822-headers; name=\"MDNPart3.txt\"\r\n" . + "Content-Transfer-Encoding: 7bit\r\n" . + "Content-Disposition: inline\r\n\r\n"; + $body .= $send->EncodeString($this->getMessageRawHeader($uid),'7bit')."\r\n"; + $body .= "--".$sep."--"; + + + $header = rtrim($send->CreateHeader())."\r\n"."Content-Type: multipart/report; report-type=disposition-notification;\r\n". + "\tboundary=\"".$sep."\"\r\n\r\n"; + //error_log(__METHOD__.array2string($send)); + $rv = $send->SmtpSend($header,$body); + //error_log(__METHOD__.'#'.array2string($rv).'#'); + return $rv; + } + + /** + * Merges a given content with contact data + * + * @param string $content + * @param array $ids array with contact id(s) + * @param string &$err error-message on error + * @return string/boolean merged content or false on error + */ + function merge($content,$ids,$mimetype='') + { + $contacts = new addressbook_bo(); + $mergeobj = new addressbook_merge(); + + if (empty($mimetype)) $mimetype = (strlen(strip_tags($content)) == strlen($content) ?'text/plain':'text/html'); + return $mergeobj->merge_string($content,$ids,$err,$mimetype); + } + + /** + * Tests if string contains 8bit symbols. + * + * If charset is not set, function defaults to default_charset. + * $default_charset global must be set correctly if $charset is + * not used. + * @param string $string tested string + * @param string $charset charset used in a string + * @return bool true if 8bit symbols are detected + */ + static function is8bit(&$string,$charset='') { + + if ($charset=='') $charset= self::$displayCharset; + + /** + * Don't use \240 in ranges. Sometimes RH 7.2 doesn't like it. + * Don't use \200-\237 for iso-8859-x charsets. This ranges + * stores control symbols in those charsets. + * Use preg_match instead of ereg in order to avoid problems + * with mbstring overloading + */ + if (preg_match("/^iso-8859/i",$charset)) { + $needle='/\240|[\241-\377]/'; + } else { + $needle='/[\200-\237]|\240|[\241-\377]/'; + } + return preg_match("$needle",$string); + } + + /** + * htmlspecialchars + * helperfunction to cope with wrong encoding in strings + * @param string $_string input to be converted + * @param mixed $charset false or string -> Target charset, if false bofelamimail displayCharset will be used + * @return string + */ + static function htmlspecialchars($_string, $_charset=false) + { + //setting the charset (if not given) + if ($_charset===false) $_charset = self::$displayCharset; + $_stringORG = $_string; + $_string = @htmlspecialchars($_string,ENT_QUOTES,$_charset, false); + if (empty($_string) && !empty($_stringORG)) $_string = @htmlspecialchars(translation::convert($_stringORG,self::detect_encoding($_stringORG),$_charset),ENT_QUOTES | ENT_IGNORE,$_charset, false); + return $_string; + } + + /** + * htmlentities + * helperfunction to cope with wrong encoding in strings + * @param string $_string input to be converted + * @param mixed $charset false or string -> Target charset, if false bofelamimail displayCharset will be used + * @return string + */ + static function htmlentities($_string, $_charset=false) + { + //setting the charset (if not given) + if ($_charset===false) $_charset = self::$displayCharset; + $_stringORG = $_string; + $_string = @htmlentities($_string,ENT_QUOTES,$_charset, false); + if (empty($_string) && !empty($_stringORG)) $_string = @htmlentities(translation::convert($_stringORG,self::detect_encoding($_stringORG),$_charset),ENT_QUOTES | ENT_IGNORE,$_charset, false); + return $_string; + } + + /** + * detect_encoding - try to detect the encoding + * only to be used if the string in question has no structure that determines his encoding + * @param string - to be evaluated + * @return mixed string/boolean (encoding or false + */ + static function detect_encoding($string) { + static $list = array('utf-8', 'iso-8859-1', 'windows-1251'); // list may be extended + if (function_exists('iconv')) + { + foreach ($list as $item) { + $sample = iconv($item, $item, $string); + if (md5($sample) == md5($string)) + return $item; + } + } + return false; // we may choose to return iso-8859-1 as default at some point + } + + static function detect_qp(&$sting) { + $needle = '/(=[0-9][A-F])|(=[A-F][0-9])|(=[A-F][A-F])|(=[0-9][0-9])/'; + return preg_match("$needle",$string); + } + /** + * Helper function to handle wrong or unrecognized timezones + * returns the date as it is parseable by strtotime, or current timestamp if everything failes + * @param string date to be parsed/formatted + * @param string format string, if none is passed, use the users common dateformat supplemented by the time hour:minute:second + * @return string returns the date as it is parseable by strtotime, or current timestamp if everything failes + */ + static function _strtotime($date='',$format=NULL,$convert2usertime=false) + { + if ($format==NULL) $format = $GLOBALS['egw_info']['user']['preferences']['common']['dateformat'].' '.($GLOBALS['egw_info']['user']['preferences']['common']['timeformat']==12?'h:i:s a':'H:i:s'); + $date2return = ($convert2usertime ? egw_time::server2user($date,$format) : egw_time::to($date,$format)); + if ($date2return==null) + { + $dtarr = explode(' ',$date); + $test = null; + while ($test===null && count($dtarr)>=1) + { + array_pop($dtarr); + $test= ($convert2usertime ? egw_time::server2user(implode(' ',$dtarr),$format): egw_time::to(implode(' ',$dtarr),$format)); + if ($test) $date2return = $test; + } + if ($test===null) $date2return = egw_time::to('now',$format); + } + return $date2return; + } + + /** + * checkFileBasics + * check if formdata meets basic restrictions (in tmp dir, or vfs, mimetype, etc.) + * + * @param array $_formData passed by reference Array with information of name, type, file and size, mimetype may be adapted + * @param string $IDtoAddToFileName id to enrich the returned tmpfilename + * @param string $reqMimeType /(default message/rfc822, if set to false, mimetype check will not be performed + * @return mixed $fullPathtoFile or exception + */ + static function checkFileBasics(&$_formData, $IDtoAddToFileName='', $reqMimeType='message/rfc822') + { + //error_log(__METHOD__.__FILE__.array2string($_formData).' Id:'.$IDtoAddToFileName.' ReqMimeType:'.$reqMimeType); + $importfailed = $tmpFileName = false; + if ($_formData['size'] != 0 && (is_uploaded_file($_formData['file']) || + realpath(dirname($_formData['file'])) == realpath($GLOBALS['egw_info']['server']['temp_dir']) || + parse_url($_formData['file'],PHP_URL_SCHEME) == 'vfs')) + { + // ensure existance of eGW temp dir + // note: this is different from apache temp dir, + // and different from any other temp file location set in php.ini + if (!file_exists($GLOBALS['egw_info']['server']['temp_dir'])) + { + @mkdir($GLOBALS['egw_info']['server']['temp_dir'],0700); + } + + // if we were NOT able to create this temp directory, then make an ERROR report + if (!file_exists($GLOBALS['egw_info']['server']['temp_dir'])) + { + $alert_msg .= 'Error:'.'
    ' + .'Server is unable to access phpgw tmp directory'.'
    ' + .$GLOBALS['egw_info']['server']['temp_dir'].'
    ' + .'Please check your configuration'.'
    ' + .'
    '; + } + + // sometimes PHP is very clue-less about MIME types, and gives NO file_type + // rfc default for unknown MIME type is: + if ($reqMimeType == 'message/rfc822') + { + $mime_type_default = 'message/rfc'; + } + else + { + $mime_type_default = $reqMimeType; + } + if (trim($_formData['type']) == '') + { + $_formData['type'] = 'application/octet-stream'; + } + // if reqMimeType is set to false do not test for that + if ($reqMimeType) + { + // so if PHP did not pass any file_type info, then substitute the rfc default value + if (substr(strtolower(trim($_formData['type'])),0,strlen($mime_type_default)) != $mime_type_default) + { + // maybe its application/octet-stream -> this may mean that we could not determine the type + // so we check for the suffix too + $buff = explode('.',$_formData['name']); + $suffix = ''; + if (is_array($buff)) $suffix = array_pop($buff); // take the last extension to check with ext2mime + if (!(strtolower(trim($_formData['type'])) == "application/octet-stream" && mime_magic::ext2mime($suffix)== $reqMimeType)) + { + //error_log("Message rejected, no message/rfc. Is:".$_formData['type']); + $importfailed = true; + $alert_msg .= lang("File rejected, no %2. Is:%1",$_formData['type'],$reqMimeType); + } + if ((strtolower(trim($_formData['type'])) != $reqMimeType && mime_magic::ext2mime($suffix)== $reqMimeType)) + { + $_formData['type'] = mime_magic::ext2mime($suffix); + } + } + } + // as FreeBSD seems to have problems with the generated temp names we append some more random stuff + $randomString = chr(rand(65,90)).chr(rand(48,57)).chr(rand(65,90)).chr(rand(48,57)).chr(rand(65,90)); + $tmpFileName = $GLOBALS['egw_info']['server']['temp_dir']. + SEP. + $GLOBALS['egw_info']['user']['account_id']. + trim($IDtoAddToFileName).basename($_formData['file']).'_'.$randomString; + + if (parse_url($_formData['file'],PHP_URL_SCHEME) == 'vfs') + { + $tmpFileName = $_formData['file']; // no need to store it somewhere + } + elseif (is_uploaded_file($_formData['file'])) + { + move_uploaded_file($_formData['file'],$tmpFileName); // requirement for safe_mode! + } + else + { + rename($_formData['file'],$tmpFileName); + } + } else { + //error_log("Import of message ".$_formData['file']." failes to meet basic restrictions"); + $importfailed = true; + $alert_msg .= lang("Processing of file %1 failed. Failed to meet basic restrictions.",$_formData['name']); + } + if ($importfailed == true) + { + throw new egw_exception_wrong_userinput($alert_msg); + } + else + { + if (parse_url($tmpFileName,PHP_URL_SCHEME) == 'vfs') + { + egw_vfs::load_wrapper('vfs'); + } + return $tmpFileName; + } + } + + /** + * getRandomString - function to be used to fetch a random string and md5 encode that one + * @param none + * @return string - a random number which is md5 encoded + */ + static function getRandomString() { + mt_srand((float) microtime() * 1000000); + return md5(mt_rand (100000, 999999)); + } + + /** + * functions to allow access to mails through other apps to fetch content + * used in infolog, tracker + */ + + /** + * get_mailcontent - fetches the actual mailcontent, and returns it as well defined array + * @param object bofelamimail the bofelamimailobject to be used + * @param uid the uid of the email to be processed + * @param partid the partid of the email + * @param mailbox the mailbox, that holds the message + * @return array with 'mailaddress'=>$mailaddress, + * 'subject'=>$subject, + * 'message'=>$message, + * 'attachments'=>$attachments, + * 'headers'=>$headers, + */ + static function get_mailcontent(&$bofelamimail,$uid,$partid='',$mailbox='') + { + //echo __METHOD__." called for $uid,$partid
    "; + $headers = $bofelamimail->getMessageHeader($uid,$partid,true); + // dont force retrieval of the textpart, let felamimail preferences decide + $bodyParts = $bofelamimail->getMessageBody($uid,'',$partid); + $attachments = $bofelamimail->getMessageAttachments($uid,$partid); + + if ($bofelamimail->isSentFolder($mailbox)) $mailaddress = $headers['TO']; + elseif (isset($headers['FROM'])) $mailaddress = $headers['FROM']; + elseif (isset($headers['SENDER'])) $mailaddress = $headers['SENDER']; + if (isset($headers['CC'])) $mailaddress .= ','.$headers['CC']; + //_debug_array($headers); + $subject = $headers['SUBJECT']; + + $message = self::getdisplayableBody($bofelamimail, $bodyParts); + $headdata = self::createHeaderInfoSection($headers); + $message = $headdata.$message; + //echo __METHOD__.'
    '; + //_debug_array($attachments); + if (is_array($attachments)) + { + foreach ($attachments as $num => $attachment) + { + if ($attachment['mimeType'] == 'MESSAGE/RFC822') + { + //_debug_array($bofelamimail->getMessageHeader($uid, $attachment['partID'])); + //_debug_array($bofelamimail->getMessageBody($uid,'', $attachment['partID'])); + //_debug_array($bofelamimail->getMessageAttachments($uid, $attachment['partID'])); + $mailcontent = self::get_mailcontent($bofelamimail,$uid,$attachment['partID']); + $headdata =''; + if ($mailcontent['headers']) + { + $headdata = self::createHeaderInfoSection($mailcontent['headers']); + } + if ($mailcontent['message']) + { + $tempname =tempnam($GLOBALS['egw_info']['server']['temp_dir'],$GLOBALS['egw_info']['flags']['currentapp']."_"); + $attachedMessages[] = array( + 'type' => 'TEXT/PLAIN', + 'name' => $mailcontent['subject'].'.txt', + 'tmp_name' => $tempname, + ); + $tmpfile = fopen($tempname,'w'); + fwrite($tmpfile,$headdata.$mailcontent['message']); + fclose($tmpfile); + } + foreach($mailcontent['attachments'] as $tmpattach => $tmpval) + { + $attachedMessages[] = $tmpval; + } + unset($attachments[$num]); + } + else + { + $attachments[$num] = array_merge($attachments[$num],$bofelamimail->getAttachment($uid, $attachment['partID'])); + if (isset($attachments[$num]['charset'])) { + if ($attachments[$num]['charset']===false) $attachments[$num]['charset'] = self::detect_encoding($attachments[$num]['attachment']); + translation::convert($attachments[$num]['attachment'],$attachments[$num]['charset']); + } + $attachments[$num]['type'] = $attachments[$num]['mimeType']; + $attachments[$num]['tmp_name'] = tempnam($GLOBALS['egw_info']['server']['temp_dir'],$GLOBALS['egw_info']['flags']['currentapp']."_"); + $tmpfile = fopen($attachments[$num]['tmp_name'],'w'); + fwrite($tmpfile,$attachments[$num]['attachment']); + fclose($tmpfile); + unset($attachments[$num]['attachment']); + } + } + if (is_array($attachedMessages)) $attachments = array_merge($attachments,$attachedMessages); + } + return array( + 'mailaddress'=>$mailaddress, + 'subject'=>$subject, + 'message'=>$message, + 'attachments'=>$attachments, + 'headers'=>$headers, + ); + } + + /** + * createHeaderInfoSection - creates a textual headersection from headerobject + * @param array header headerarray may contain SUBJECT,FROM,SENDER,TO,CC,BCC,DATE,PRIORITY,IMPORTANCE + * @return string a preformatted string with the information of the header worked into it + */ + static function createHeaderInfoSection($header,$headline='') + { + $headdata = null; + if ($header['SUBJECT']) $headdata = lang('subject').': '.$header['SUBJECT']."\n"; + if ($header['FROM']) $headdata .= lang('from').': '.self::convertAddressArrayToString($header['FROM'])."\n"; + if ($header['SENDER']) $headdata .= lang('sender').': '.self::convertAddressArrayToString($header['SENDER'])."\n"; + if ($header['TO']) $headdata .= lang('to').': '.self::convertAddressArrayToString($header['TO'])."\n"; + if ($header['CC']) $headdata .= lang('cc').': '.self::convertAddressArrayToString($header['CC'])."\n"; + if ($header['BCC']) $headdata .= lang('bcc').': '.self::convertAddressArrayToString($header['BCC'])."\n"; + if ($header['DATE']) $headdata .= lang('date').': '.$header['DATE']."\n"; + if ($header['PRIORITY'] && $header['PRIORITY'] != 'normal') $headdata .= lang('priority').': '.$header['PRIORITY']."\n"; + if ($header['IMPORTANCE'] && $header['IMPORTANCE'] !='normal') $headdata .= lang('importance').': '.$header['IMPORTANCE']."\n"; + //if ($mailcontent['headers']['ORGANIZATION']) $headdata .= lang('organization').': '.$mailcontent['headers']['ORGANIZATION']."\ + if (!empty($headdata)) + { + if (!empty($headline)) $headdata = "---------------------------- $headline ----------------------------\n".$headdata; + if (empty($headline)) $headdata = "--------------------------------------------------------\n".$headdata; + $headdata .= "--------------------------------------------------------\n"; + } + else + { + $headdata = "--------------------------------------------------------\n"; + } + return $headdata; + } + + /** + * convertAddressArrayToString - converts an felamimail envelope Address Array To String + * @param array $rfcAddressArray an addressarray as provided by felamimail retieved via egw_pear.... + * @return string a comma separated string with the mailaddress(es) converted to text + */ + static function convertAddressArrayToString($rfcAddressArray) + { + //error_log(__METHOD__.__LINE__.array2string($rfcAddressArray)); + $returnAddr =''; + if (is_array($rfcAddressArray)) + { + foreach((array)$rfcAddressArray as $addressData) { + //error_log(__METHOD__.__LINE__.array2string($addressData)); + if($addressData['MAILBOX_NAME'] == 'NIL') { + continue; + } + if(strtolower($addressData['MAILBOX_NAME']) == 'undisclosed-recipients') { + continue; + } + if ($addressData['RFC822_EMAIL']) + { + $addressObjectA = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($addressData['RFC822_EMAIL']):$addressData['RFC822_EMAIL']),''); + } + else + { + $emailaddress = ($addressData['PERSONAL_NAME']?$addressData['PERSONAL_NAME'].' <'.$addressData['EMAIL'].'>':$addressData['EMAIL']); + $addressObjectA = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($emailaddress):$emailaddress),''); + } + $addressObject = $addressObjectA[0]; + //error_log(__METHOD__.__LINE__.array2string($addressObject)); + if ($addressObject->host == '.SYNTAX-ERROR.') continue; + //$mb =(string)$addressObject->mailbox; + //$h = (string)$addressObject->host; + //$p = (string)$addressObject->personal; + $returnAddr .= (strlen($returnAddr)>0?',':''); + //error_log(__METHOD__.__LINE__.$p.' <'.$mb.'@'.$h.'>'); + $returnAddr .= imap_rfc822_write_address($addressObject->mailbox, $addressObject->host, $addressObject->personal); + //error_log(__METHOD__.__LINE__.' Address: '.$returnAddr); + } + } + else + { + // do not mess with strings, return them untouched /* ToDo: validate string as Address */ + if (is_string($rfcAddressArray)) return $rfcAddressArray; + } + return $returnAddr; + } + + /** + * getStyles - extracts the styles from the given bodyparts + * @param array $bodyParts with the bodyparts + * @return string a preformatted string with the mails converted to text + */ + static function &getStyles($_bodyParts) + { + $style = ''; + if (empty($_bodyParts)) return ""; + foreach((array)$_bodyParts as $singleBodyPart) { + if (!isset($singleBodyPart['body'])) { + $singleBodyPart['body'] = self::getStyles($singleBodyPart); + $style .= $singleBodyPart['body']; + continue; + } + if ($singleBodyPart['charSet']===false) $singleBodyPart['charSet'] = felamimail_bo::detect_encoding($singleBodyPart['body']); + $singleBodyPart['body'] = $GLOBALS['egw']->translation->convert( + $singleBodyPart['body'], + strtolower($singleBodyPart['charSet']) + ); + $ct = preg_match_all('#(.+)#isU', $singleBodyPart['body'], $newStyle); + if ($ct>0) + { + //error_log(__METHOD__.__LINE__.array2string($newStyle[0])); + $style2buffer = implode('',$newStyle[0]); + } + if (strtoupper(self::$displayCharset) == 'UTF-8') + { + $test = json_encode($style2buffer); + //error_log(__METHOD__.__LINE__.'#'.$test.'# ->'.strlen($style2buffer).' Error:'.json_last_error()); + //if (json_last_error() != JSON_ERROR_NONE && strlen($style2buffer)>0) + if ($test=="null" && strlen($style2buffer)>0) + { + // this should not be needed, unless something fails with charset detection/ wrong charset passed + error_log(__METHOD__.__LINE__.' Found Invalid sequence for utf-8 in CSS:'.$style2buffer.' Charset Reported:'.$singleBodyPart['charSet'].' Carset Detected:'.felamimail_bo::detect_encoding($style2buffer)); + $style2buffer = utf8_encode($style2buffer); + } + } + $style .= $style2buffer; + } + // CSS Security + // http://code.google.com/p/browsersec/wiki/Part1#Cascading_stylesheets + $css = preg_replace('/(javascript|expession|-moz-binding)/i','',$style); + felamimail_bo::replaceTagsCompletley($css,'script'); // Strip out script that may be included + // we need this, as styledefinitions are enclosed with curly brackets; and template stuuff tries to replace everything between curly brackets that is having no horizontal whitespace + $css = str_replace(':',': ',$css); + //error_log(__METHOD__.__LINE__.$css); + // TODO: we may have to strip urls and maybe comments and ifs + return $css; + } + + /** + * getdisplayableBody - creates the bodypart of the email as textual representation + * @param object $bofelamimail the bofelamimailobject to be used + * @param array $bodyParts with the bodyparts + * @return string a preformatted string with the mails converted to text + */ + static function &getdisplayableBody(&$bofelamimail, $bodyParts, $preserveHTML = false) + { + for($i=0; $i'.$bodyParts[$i]['body']); + $newBody = translation::convert($bodyParts[$i]['body'], $bodyParts[$i]['charSet']); + //error_log(__METHOD__.__LINE__.' MimeType:'.$bodyParts[$i]['mimeType'].'->'.$newBody); + /* + // in a way, this tests if we are having real utf-8 (the displayCharset) by now; we should if charsets reported (or detected) are correct + if (strtoupper(self::$displayCharset) == 'UTF-8') + { + $test = json_encode($newBody); + //error_log(__METHOD__.__LINE__.'#'.$test.'# ->'.strlen($newBody).' Error:'.json_last_error()); + if (json_last_error() != JSON_ERROR_NONE && strlen($newBody)>0) + { + // this should not be needed, unless something fails with charset detection/ wrong charset passed + error_log(__METHOD__.__LINE__.' Charset Reported:'.$bodyParts[$i]['charSet'].' Carset Detected:'.felamimail_bo::detect_encoding($bodyParts[$i]['body'])); + $newBody = utf8_encode($newBody); + } + } + */ + if ($bodyParts[$i]['mimeType'] == 'text/html') { + // as translation::convert reduces \r\n to \n and purifier eats \n -> peplace it with a single space + $newBody = str_replace("\n"," ",$newBody); + // convert HTML to text, as we dont want HTML in infologs + $newBody = html::purify($newBody); + //error_log(__METHOD__.__LINE__.' after purify:'.$newBody); + if ($preserveHTML==false) $newBody = $bofelamimail->convertHTMLToText($newBody,true); + $bofelamimail->getCleanHTML($newBody); // new Body passed by reference + //error_log(__METHOD__.__LINE__.' after getClean:'.$newBody); + $message .= $newBody; + continue; + } + $newBody =self::htmlspecialchars($newBody); + //error_log(__METHOD__.__LINE__.' Body(after specialchars):'.$newBody); + $newBody = strip_tags($newBody); //we need to fix broken tags (or just stuff like "<800 USD/p" ) + //error_log(__METHOD__.__LINE__.' Body(after strip tags):'.$newBody); + $newBody = htmlspecialchars_decode($newBody,ENT_QUOTES); + //error_log(__METHOD__.__LINE__.' Body (after hmlspc_decode):'.$newBody); + $message .= $newBody; + //continue; + } + return $message; + } + + /** + * importMessageToMergeAndSend + * + * @param object &bo_merge bo_merge object + * @param string $document the full filename + * @param array $SendAndMergeTocontacts array of contact ids + * @param string $_folder (passed by reference) will set the folder used. must be set with a folder, but will hold modifications if + * folder is modified + * @param string $importID ID for the imported message, used by attachments to identify them unambiguously + * @return mixed array of messages with success and failed messages or exception + */ + function importMessageToMergeAndSend(&$bo_merge, $document, $SendAndMergeTocontacts, &$_folder, $importID='') + { + $importfailed = false; + $processStats = array('success'=>array(),'failed'=>array()); + if (empty($SendAndMergeTocontacts)) + { + $importfailed = true; + $alert_msg .= lang("Import of message %1 failed. No Contacts to merge and send to specified.",$_formData['name']); + } + + // check if formdata meets basic restrictions (in tmp dir, or vfs, mimetype, etc.) + /* as the file is provided by bo_merge, we do not check + try + { + $tmpFileName = felamimail_bo::checkFileBasics($_formData,$importID); + } + catch (egw_exception_wrong_userinput $e) + { + $importfailed = true; + $alert_msg .= $e->getMessage(); + } + */ + $tmpFileName = $document; + // ----------------------------------------------------------------------- + if ($importfailed === false) + { + $mailObject = new egw_mailer(); + try + { + $this->parseFileIntoMailObject($mailObject,$tmpFileName,$Header,$Body); + } + catch (egw_exception_assertion_failed $e) + { + $importfailed = true; + $alert_msg .= $e->getMessage(); + } + + //_debug_array($Body); + $this->openConnection(); + if (empty($_folder)) + { + $_folder = $this->getSentFolder(); + } + $delimiter = $this->getHierarchyDelimiter(); + if($_folder=='INBOX'.$delimiter) $_folder='INBOX'; + if ($importfailed === false) + { + $Subject = $mailObject->Subject; + //error_log(__METHOD__.__LINE__.' Subject:'.$Subject); + $Body = $mailObject->Body; + //error_log(__METHOD__.__LINE__.' Body:'.$Body); + $AltBody = $mailObject->AltBody; + //error_log(__METHOD__.__LINE__.' AltBody:'.$AltBody); + foreach ($SendAndMergeTocontacts as $k => $val) + { + $sendOK = $openAsDraft = false; + //error_log(__METHOD__.__LINE__.' Id To Merge:'.$val); + if ($GLOBALS['egw_info']['flags']['currentapp'] == 'addressbook' && + count($SendAndMergeTocontacts) > 1 && + is_numeric($val) || $GLOBALS['egw']->accounts->name2id($val)) // do the merge + { + + //error_log(__METHOD__.__LINE__.array2string($mailObject)); + $contact = $bo_merge->contacts->read($val); + //error_log(__METHOD__.__LINE__.' ID:'.$val.' Data:'.array2string($contact)); + $email = ($contact['email'] ? $contact['email'] : $contact['email_home']); + $nfn = ($contact['n_fn'] ? $contact['n_fn'] : $contact['n_given'].' '.$contact['n_family']); + $activeMailProfile = $this->mailPreferences->getIdentity($this->profileID); + //error_log(__METHOD__.__LINE__.array2string($activeMailProfile)); + $mailObject->From = $activeMailProfile->emailAddress; + //$mailObject->From = $_identity->emailAddress; + $mailObject->FromName = $mailObject->EncodeHeader($activeMailProfile->realName); + + $mailObject->MessageID = ''; + $mailObject->ClearAllRecipients(); + $mailObject->ClearCustomHeaders(); + $mailObject->AddAddress($email,$mailObject->EncodeHeader($nfn)); + $mailObject->Subject = $bo_merge->merge_string($Subject, $val, $e, 'text/plain'); + if (!empty($AltBody)) $mailObject->IsHTML(true); + else $mailObject->IsHTML(false); + //error_log(__METHOD__.__LINE__.' ContentType:'.$mailObject->BodyContentType); + if (!empty($Body)) $mailObject->Body = $bo_merge->merge_string($Body, $val, $e, $mailObject->BodyContentType); + //error_log(__METHOD__.__LINE__.' Result:'.$mailObject->Body.' error:'.array2string($e)); + if (!empty($AltBody)) $mailObject->AltBody = $bo_merge->merge_string($AltBody, $val, $e, $mailObject->AltBodyContentType); + + $ogServer = $this->mailPreferences->getOutgoingServer($this->profileID); + #_debug_array($ogServer); + $mailObject->Host = $ogServer->host; + $mailObject->Port = $ogServer->port; + // SMTP Auth?? + if($ogServer->smtpAuth) { + $mailObject->SMTPAuth = true; + // check if username contains a ; -> then a sender is specified (and probably needed) + list($username,$senderadress) = explode(';', $ogServer->username,2); + if (isset($senderadress) && !empty($senderadress)) $mailObject->Sender = $senderadress; + $mailObject->Username = $username; + $mailObject->Password = $ogServer->password; + } + //error_log(__METHOD__.__LINE__.array2string($mailObject)); + // set a higher timeout for big messages + @set_time_limit(120); + $sendOK = true; + try { + $mailObject->Send(); + } + catch(phpmailerException $e) { + $sendOK = false; + $errorInfo = $e->getMessage(); + if ($mailObject->ErrorInfo) // use the complete mailer ErrorInfo, for full Information + { + if (stripos($mailObject->ErrorInfo, $errorInfo)===false) + { + $errorInfo = 'Send Failed for '.$mailObject->Subject.' to '.$nfn.'<'.$email.'> Error:'.$mailObject->ErrorInfo.'
    '.$errorInfo; + } + else + { + $errorInfo = $mailObject->ErrorInfo; + } + } + error_log(__METHOD__.__LINE__.array2string($errorInfo)); + } + } + elseif (!$k) // 1. entry, further entries will fail for apps other then addressbook + { + $openAsDraft = true; + $mailObject->MessageID = ''; + $mailObject->ClearAllRecipients(); + $mailObject->ClearCustomHeaders(); + if ($GLOBALS['egw_info']['flags']['currentapp'] == 'addressbook' && + is_numeric($val) || $GLOBALS['egw']->accounts->name2id($val)) // do the merge + { + $contact = $bo_merge->contacts->read($val); + //error_log(__METHOD__.__LINE__.array2string($contact)); + $email = ($contact['email'] ? $contact['email'] : $contact['email_home']); + $nfn = ($contact['n_fn'] ? $contact['n_fn'] : $contact['n_given'].' '.$contact['n_family']); + $mailObject->AddAddress($email,$mailObject->EncodeHeader($nfn)); + } + $mailObject->Subject = $bo_merge->merge_string($Subject, $val, $e, 'text/plain'); + if (!empty($AltBody)) $mailObject->IsHTML(true); + else $mailObject->IsHTML(false); + //error_log(__METHOD__.__LINE__.' ContentType:'.$mailObject->BodyContentType); + if (!empty($Body)) $mailObject->Body = $bo_merge->merge_string($Body, $val, $e, $mailObject->BodyContentType); + //error_log(__METHOD__.__LINE__.' Result:'.$mailObject->Body.' error:'.array2string($e)); + if (!empty($AltBody)) $mailObject->AltBody = $bo_merge->merge_string($AltBody, $val, $e, $mailObject->AltBodyContentType); + $_folder = $this->getDraftFolder(); + } + if ($sendOK || $openAsDraft) + { + $BCCmail = ''; + if ($this->folderExists($_folder,true)) + { + if($this->isSentFolder($_folder)) + { + $flags = '\\Seen'; + } elseif($this->isDraftFolder($_folder)) { + $flags = '\\Draft'; + } else { + $flags = ''; + } + unset($mailObject->sentHeader); + unset($mailObject->sentBody); + $savefailed = false; + try + { + $messageUid =$this->appendMessage($_folder, + $BCCmail.$mailObject->getMessageHeader(), + $mailObject->getMessageBody(), + $flags); + } + catch (egw_exception_wrong_userinput $e) + { + $savefailed = true; + $alert_msg .= lang("Save of message %1 failed. Could not save message to folder %2 due to: %3",$Subject,$_folder,$e->getMessage()); + } + // no send, save successful, and message_uid present + if ($savefailed===false && $messageUid && $sendOK===false) + { + list($fm_width,$fm_height) = explode('x',egw_link::get_registry('felamimail','view_popup')); + $linkData = array + ( + 'menuaction' => 'felamimail.uicompose.composeFromDraft', + 'uid' => $messageUid, + 'folder' => base64_encode($_folder), + 'icServer' => $this->profileID, + ); + $composeUrl = $GLOBALS['egw']->link('/index.php',$linkData); + //error_log(__METHOD__.__LINE__.' ComposeURL:'.$composeUrl); + $GLOBALS['egw_info']['flags']['java_script_thirst'] .= '"; + $processStats['success'][] = lang("Saving of message %1 succeeded. Check Folder %2.",$Subject,$_folder); + } + } + else + { + $savefailed = true; + $alert_msg .= lang("Saving of message %1 failed. Destination Folder %2 does not exist.",$Subject,$_folder); + } + if ($sendOK) + { + $processStats['success'][] = 'Send succeeded to '.$nfn.'<'.$email.'>'.($savefailed?' but failed to store to Folder:'.$_folder:''); + } + else + { + $processStats['failed'][] = 'Send failed to '.$nfn.'<'.$email.'> See error_log for details'; + } + } + } + } + unset($mailObject); + } + // set the url to open when refreshing + if ($importfailed == true) + { + throw new egw_exception_wrong_userinput($alert_msg); + } + else + { + return $processStats; + } + } + + /** + * functions to allow the parsing of message/rfc files + * used in felamimail to import mails, or parsev a message from file enrich it with addressdata (merge) and send it right away. + */ + + /** + * parseFileIntoMailObject - parses a message/rfc mail from file to the mailobject and returns the header and body via reference + * throws egw_exception_assertion_failed when the required Pear Class is not found/loadable + * @param object $mailObject instance of the SMTP Mailer Object + * @param string $tmpFileName string that points/leads to the file to be imported + * @param string &$Header reference used to return the imported Mailheader + * @param string &$Body reference to return the imported Body + * @return void Mailheader and body is returned via Reference in $Header $Body + */ + function parseFileIntoMailObject($mailObject,$tmpFileName,&$Header,&$Body) + { + $message = file_get_contents($tmpFileName); + try + { + return $this->parseRawMessageIntoMailObject($mailObject,$message,$Header,$Body); + } + catch (egw_exception_assertion_failed $e) + { // not sure that this is needed to pass on exeptions + throw new egw_exception_assertion_failed($e->getMessage()); + } + } + + /** + * parseRawMessageIntoMailObject - parses a message/rfc mail from file to the mailobject and returns the header and body via reference + * throws egw_exception_assertion_failed when the required Pear Class is not found/loadable + * @param object $mailObject instance of the SMTP Mailer Object + * @param string $message string containing the RawMessage + * @param string &$Header reference used to return the imported Mailheader + * @param string &$Body reference to return the imported Body + * @return void Mailheader and body is returned via Reference in $Header $Body + */ + function parseRawMessageIntoMailObject($mailObject,$message,&$Header,&$Body) + { + /** + * pear/Mail_mimeDecode requires package "pear/Mail_Mime" (version >= 1.4.0, excluded versions: 1.4.0) + * ./pear upgrade Mail_Mime + * ./pear install Mail_mimeDecode + */ + //echo '
    '.$message.'
    '; + //error_log(__METHOD__.__LINE__.$message); + if (class_exists('Mail_mimeDecode',false)==false && (@include_once 'Mail/mimeDecode.php') === false) throw new egw_exception_assertion_failed(lang('Required PEAR class Mail/mimeDecode.php not found.')); + $mailDecode = new Mail_mimeDecode($message); + $structure = $mailDecode->decode(array('include_bodies'=>true,'decode_bodies'=>true,'decode_headers'=>true)); + //error_log(__METHOD__.__LINE__.array2string($structure)); + //_debug_array($structure); + //exit; + // now create a message to view, save it in Drafts and open it + $mailObject->PluginDir = EGW_SERVER_ROOT."/phpgwapi/inc/"; + $mailObject->IsSMTP(); + $mailObject->CharSet = self::$displayCharset; // some default, may be altered by BodyImport + if (isset($structure->ctype_parameters['charset'])) $mailObject->CharSet = trim($structure->ctype_parameters['charset']); + $mailObject->Encoding = 'quoted-printable'; // some default, may be altered by BodyImport +/* + $mailObject->AddAddress($emailAddress, $addressObject->personal); + $mailObject->AddCC($emailAddress, $addressObject->personal); + $mailObject->AddBCC($emailAddress, $addressObject->personal); + $mailObject->AddReplyto($emailAddress, $addressObject->personal); +*/ + $result =''; + foreach((array)$structure->headers as $key => $val) + { + //error_log(__METHOD__.__LINE__.$key); + foreach((array)$val as $i => $v) + { +// if ($key!='content-type' && $key !='content-transfer-encoding') // the omitted values to that will be set at the end + if ($key!='content-type' && $key !='content-transfer-encoding' && + $key != 'message-id' && + $key != 'x-priority') // the omitted values to that will be set at the end + { + $Header .= $mailObject->HeaderLine($key, trim($v)); + } + } + switch ($key) + { + case 'x-priority': + $mailObject->Priority = $val; + break; + case 'message-id': + $mailObject->MessageID = $val; // ToDo: maybe we want to regenerate the message id all the time + break; + case 'sender': + $mailObject->Sender = $val; + break; + case 'from': + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($val):$val),''); + foreach((array)$address_array as $addressObject) { + $mailObject->From = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''); + $mailObject->FromName = $addressObject->personal; + } + break; + case 'content-transfer-encoding': + $mailObject->Encoding = $val; + break; + case 'subject': + $mailObject->Subject = $val; + break; + default: + // stuff like X- ... + //$mailObject->AddCustomHeader('X-Mailer: FeLaMiMail'); + if (!strtolower(substr($key,0,2))=='x-') break; + //case 'priority': // priority is a cusom header field + // $mailObject->Priority = $val; + // break; + case 'disposition-notification-To': + case 'organization': + foreach((array)$val as $i => $v) $mailObject->AddCustomHeader($key.': '. $v); + break; + } + } + if ($structure->ctype_primary=='text' && $structure->body) + { + $mailObject->IsHTML($structure->ctype_secondary=='html'?true:false); + $mailObject->Body = $structure->body; + } + $this->createBodyFromStructure($mailObject, $structure, $parenttype=null); + $mailObject->SetMessageType(); + $mailObject->CreateHeader(); // this sets the boundary stufff + //echo "Boundary:".$mailObject->FetchBoundary(1).'
    '; + //$boundary =''; + //if (isset($structure->ctype_parameters['boundary'])) $boundary = ' boundary="'.$mailObject->FetchBoundary(1).'";'; + //if (isset($structure->headers['content-type'])) $Header .= $mailObject->HeaderLine('Content-type', $structure->ctype_primary.'/'.$structure->ctype_secondary.';'.$boundary); + $Header .= $mailObject->GetMailMIME(); + $Body = $mailObject->getMessageBody(); // this is a method of the egw_mailer/phpmailer class + //_debug_array($Header); + //_debug_array($Body); + //_debug_array($mailObject); + //exit; + } + + /** + * createBodyFromStructure - fetches/creates the bodypart of the email as textual representation + * is called recursively to be able to fetch the stuctureparts of the mail parsed from Mail/mimeDecode + * @param object $mailObject instance of the SMTP Mailer Object + * @param array $structure array that represents structure and content of a mail parsed from Mail/mimeDecode + * @param string $parenttype type of the parent node + * @return void Parsed Information is passed to the mailObject to be processed there + */ + function createBodyFromStructure($mailObject, $structure, $parenttype=null, $decode=false) + { + static $attachmentnumber; + static $isHTML; + static $alternatebodyneeded; + if (is_null($isHTML)) $isHTML = $structure->ctype_secondary=='html'?true:false; + if (is_null($attachmentnumber)) $attachmentnumber = 0; + if ($structure->parts && $structure->ctype_primary=='multipart') + { + if (is_null($alternatebodyneeded)) $alternatebodyneeded = false; + foreach($structure->parts as $part) + { + //error_log(__METHOD__.__LINE__.' Structure Content Type:'.$structure->ctype_primary.'/'.$structure->ctype_secondary.' Decoding:'.($decode?'on':'off')); + //error_log(__METHOD__.__LINE__.' '.$structure->ctype_primary.'/'.$structure->ctype_secondary.' => '.$part->ctype_primary.'/'.$part->ctype_secondary); + //error_log(__METHOD__.__LINE__.' Part:'.array2string($part)); + $partFetched = false; + //echo __METHOD__.__LINE__.$structure->ctype_primary.'/'.$structure->ctype_secondary.'
    '; + if ($part->headers['content-transfer-encoding']) $mailObject->Encoding = $part->headers['content-transfer-encoding']; + $mailObject->IsHTML($part->ctype_secondary=='html'?true:false); + if (isset($part->ctype_parameters['charset'])) $mailObject->CharSet = trim($part->ctype_parameters['charset']); + if (($structure->ctype_secondary=='alternative'|| + $structure->ctype_secondary=='mixed' || + $structure->ctype_secondary=='signed') && $part->ctype_primary=='text' && $part->ctype_secondary=='plain' && $part->body) + { + //echo __METHOD__.__LINE__.$part->ctype_primary.'/'.$part->ctype_secondary.'
    '; + //error_log(__METHOD__.__LINE__.$part->ctype_primary.'/'.$part->ctype_secondary.' already fetched Content is HTML='.$isHTML.' Body:'.$part->body); + $bodyPart = $part->body; + if ($decode) $bodyPart = $this->decodeMimePart($part->body,($part->headers['content-transfer-encoding']?$part->headers['content-transfer-encoding']:'base64')); + $mailObject->Body = ($isHTML==false?$mailObject->Body:'').$bodyPart; + $mailObject->AltBody .= $bodyPart; + $partFetched = true; + } + if (($structure->ctype_secondary=='alternative'|| + $structure->ctype_secondary=='mixed' || + $structure->ctype_secondary=='signed' ) && + $part->ctype_primary=='text' && $part->ctype_secondary=='html' && $part->body) + { + //echo __METHOD__.__LINE__.$part->ctype_primary.'/'.$part->ctype_secondary.'
    '; + //error_log(__METHOD__.__LINE__.$part->ctype_primary.'/'.$part->ctype_secondary.' already fetched Content is HTML='.$isHTML.' Body:'.$part->body); + $bodyPart = $part->body; + if ($decode) $bodyPart = $this->decodeMimePart($part->body,($part->headers['content-transfer-encoding']?$part->headers['content-transfer-encoding']:'base64')); + //$mailObject->IsHTML(true); // do we need/want that here? + $mailObject->Body = ($isHTML?$mailObject->Body:'').$bodyPart; + $alternatebodyneeded = true; + $isHTML=true; + $partFetched = true; + } + if (($structure->ctype_secondary=='alternative'|| + $structure->ctype_secondary=='mixed' || + $structure->ctype_secondary=='signed' ) && + $part->ctype_primary=='text' && $part->ctype_secondary=='calendar' && $part->body) + { + //error_log(__METHOD__.__LINE__.$part->ctype_primary.'/'.$part->ctype_secondary.' BodyPart:'.array2string($part)); + $bodyPart = $part->body; + if ($decode) $bodyPart = $this->decodeMimePart($part->body,($part->headers['content-transfer-encoding']?$part->headers['content-transfer-encoding']:'base64')); + $mailObject->AltExtended = $bodyPart; + // "text/calendar; charset=utf-8; name=meeting.ics; method=REQUEST" + // [ctype_parameters] => Array([charset] => utf-8[name] => meeting.ics[method] => REQUEST) + $mailObject->AltExtendedContentType = $part->ctype_primary.'/'.$part->ctype_secondary.';'. + ($part->ctype_parameters['name']?' name='.$part->ctype_parameters['name'].';':''). + ($part->ctype_parameters['method']?' method='.$part->ctype_parameters['method'].'':''); + $partFetched = true; + } + if (($structure->ctype_secondary=='mixed' || + $structure->ctype_secondary=='alternative' || + $structure->ctype_secondary=='signed') && $part->ctype_primary=='multipart') + { + //error_log( __METHOD__.__LINE__." Recursion to fetch subparts:".$part->ctype_primary.'/'.$part->ctype_secondary); + $this->createBodyFromStructure($mailObject, $part, $parenttype=null, $decode); + } + //error_log(__METHOD__.__LINE__.$structure->ctype_primary.'/'.$structure->ctype_secondary.' => '.$part->ctype_primary.'/'.$part->ctype_secondary.' Part:'.array2string($part)); + if ($part->body && (($structure->ctype_secondary=='mixed' && $part->ctype_primary!='multipart') || + trim($part->disposition) == 'attachment' || + trim($part->disposition) == 'inline')) + { + //error_log(__METHOD__.__LINE__.$structure->ctype_secondary.'=>'.$part->ctype_primary.'/'.$part->ctype_secondary.'->'.array2string($part)); + $attachmentnumber++; + $filename = trim(($part->ctype_parameters['name']?$part->ctype_parameters['name']:$part->d_parameters['filename'])); + if (strlen($filename)==0) $filename = 'noname_'.$attachmentnumber; + //echo $part->headers['content-transfer-encoding'].'#
    '; + if ($decode) $part->body = $this->decodeMimePart($part->body,($part->headers['content-transfer-encoding']?$part->headers['content-transfer-encoding']:'base64')); + if ((trim($part->disposition)=='attachment' || trim($part->disposition) == 'inline') && $partFetched==false) + { + //error_log(__METHOD__.__LINE__.' Add String '.($part->disposition=='attachment'?'Attachment':'Part').' of type:'.$part->ctype_primary.'/'.$part->ctype_secondary); + $mailObject->AddStringAttachment($part->body, //($part->headers['content-transfer-encoding']?base64_decode($part->body):$part->body), + $filename, + ($part->headers['content-transfer-encoding']?$part->headers['content-transfer-encoding']:'base64'), + $part->ctype_primary.'/'.$part->ctype_secondary + ); + } + if (!(trim($part->disposition)=='attachment' || trim($part->disposition) == 'inline') && $partFetched==false) + { + //error_log(__METHOD__.__LINE__.' Add String '.($part->disposition=='attachment'?'Attachment':'Part').' of type:'.$part->ctype_primary.'/'.$part->ctype_secondary.' Body:'.$part->body); + $mailObject->AddStringPart($part->body, //($part->headers['content-transfer-encoding']?base64_decode($part->body):$part->body), + $filename, + ($part->headers['content-transfer-encoding']?$part->headers['content-transfer-encoding']:'base64'), + $part->ctype_primary.'/'.$part->ctype_secondary + ); + } + } + } + if ($alternatebodyneeded == false) $mailObject->AltBody = ''; + } + } +} diff --git a/felamimail/inc/class.felamimail_bofilter.inc.php b/felamimail/inc/class.felamimail_bofilter.inc.php new file mode 100644 index 0000000000..7442ff13b1 --- /dev/null +++ b/felamimail/inc/class.felamimail_bofilter.inc.php @@ -0,0 +1,168 @@ + True, + 'flagMessages' => True + ); + + function __construct($_restoreSession=true) + { + $this->accountid = $GLOBALS['egw_info']['user']['account_id']; + + $this->sofilter = new felamimail_sofilter(); + + $this->sessionData['activeFilter'] = "-1"; + + if ($_restoreSession) $this->restoreSessionData(); + + if(!is_array($this->sessionData['filter'])) { + $this->sessionData['filter'][0]['filterName'] = lang('Quicksearch'); + $this->saveSessionData(); + } + if(!isset($this->sessionData['activeFilter'])) { + $this->sessionData['activeFilter'] = "-1"; + } + } + + function deleteFilter($_filterID) + { + unset($this->sessionData['filter'][$_filterID]); + $this->saveSessionData(); + $this->sofilter->saveFilter($this->sessionData['filter']); + } + + function getActiveFilter() + { + return $this->sessionData['activeFilter']; + } + + function getFilter($_filterID) + { + return $this->sessionData['filter'][$_filterID]; + } + + function getFilterList() + { + return $this->sessionData['filter']; + } + + function restoreSessionData() + { + $arrayFunctions =& CreateObject('phpgwapi.arrayfunctions'); + + $this->sessionData = $GLOBALS['egw']->session->appsession('filter_session_data'); + + // sort the filter list + $unsortedFilter = $this->sofilter->restoreFilter(); + + // save the quicksearchfilter + // must always have id=0 + if(is_array($unsortedFilter[0])) + { + $quickSearchFilter[0] = $unsortedFilter[0]; + unset($unsortedFilter[0]); + } + // or create the array + else + { + $quickSearchFilter[0] = array('filterName' => lang('quicksearch')); + } + + // _debug_array($this->sessionData['filter']); + // the first one is always the quicksearch filter + if(count($unsortedFilter) > 0) + { + $sortedFilter = $arrayFunctions->arfsort($unsortedFilter, array('filterName')); + $sortedFilter = array_merge($quickSearchFilter, $sortedFilter); + } + else + { + $sortedFilter = $quickSearchFilter; + } + #_debug_array($sortedFilter); + + $this->sessionData['filter'] = $sortedFilter; + } + + function saveFilter($_formData, $_filterID='') + { + if(!empty($_formData['filterName'])) + $data['filterName'] = $_formData['filterName']; + if(!empty($_formData['from'])) + $data['from'] = $_formData['from']; + if(!empty($_formData['to'])) + $data['to'] = $_formData['to']; + if(!empty($_formData['subject'])) + $data['subject']= $_formData['subject']; + + if($_filterID === '') + { + $this->sessionData['filter'][] = $data; + } + else + { + $this->sessionData['filter'][$_filterID] = $data; + } + + $this->saveSessionData(); + + $this->sofilter->saveFilter($this->sessionData['filter']); + } + + function saveSessionData() + { + $GLOBALS['egw']->session->appsession('filter_session_data','',$this->sessionData); + } + + function setActiveFilter($_filter) + { + $this->sessionData['activeFilter'] = "$_filter"; + $this->saveSessionData(); + } + + function updateFilter($_data) + { + $filter = $this->getFilterList(); + $activeFilter = $this->getActiveFilter(); + + // check for new quickfilter + if($activeFilter == $_data['filter'] && isset($_data['quickSearch'])) + { + #print " new Quickfilter $_quickSearch
    "; + if($_data['quickSearch'] == '') + { + $this->setActiveFilter("-1"); + } + else + { + $this->setActiveFilter("0"); + $data['filterName'] = lang('Quicksearch'); + $data['subject'] = $_data['quickSearch']; + $data['from'] = $_data['quickSearch']; + $this->saveFilter($data, '0'); + } + } + else + { + $this->setActiveFilter($_data['filter']); + } + } + } + +?> diff --git a/felamimail/inc/class.felamimail_bosignatures.inc.php b/felamimail/inc/class.felamimail_bosignatures.inc.php new file mode 100644 index 0000000000..e4ff06d613 --- /dev/null +++ b/felamimail/inc/class.felamimail_bosignatures.inc.php @@ -0,0 +1,148 @@ +profileData = $boemailadmin->getUserProfile('felamimail'); + } + + function getListOfSignatures() { + $boemailadmin = new emailadmin_bo(); + $fmSignatures = new felamimail_signatures(); + + #$profileData = $boemailadmin->getUserProfile('felamimail'); + + $systemSignatures = array(); + if(!empty($this->profileData->ea_default_signature)) { + $systemSignatures[-1] = array( + 'fm_signatureid' => -1, + 'fm_description' => lang('system signature'), + 'fm_defaultsignature' => FALSE, + ); + + if($this->profileData->ea_user_defined_signatures != true) { + $systemSignatures[-1]['fm_defaultsignature'] = TRUE; + } + } + // return only systemsignature, if no user defined signatures are enabled + if($this->profileData->ea_user_defined_signatures != true) { + return $systemSignatures; + } + + $signatures = $fmSignatures->search(); + + if(count($signatures) == 0 && + !isset($GLOBALS['egw_info']['user']['preferences']['felamimail']['email_sig_copied']) && + !empty($GLOBALS['egw_info']['user']['preferences']['felamimail']['email_sig'])) { + + $GLOBALS['egw']->preferences->read_repository(); + $newSignature = new felamimail_signatures(); + $newSignature->fm_description = lang('default signature'); + $newSignature->fm_signature = nl2br($GLOBALS['egw_info']['user']['preferences']['felamimail']['email_sig']); + $newSignature->fm_defaultsignature = true; + $newSignature->save(); + $GLOBALS['egw']->preferences->add('felamimail', 'email_sig_copied', true); + $GLOBALS['egw']->preferences->save_repository(); + + $signatures = $fmSignatures->search(); + } + + // make systemsignature the default, if no other signature is defined as default signature + if($fmSignatures->getDefaultSignature() === false) { + $systemSignatures[-1]['fm_defaultsignature'] = TRUE; + } + + $signatures = array_merge($systemSignatures, $signatures); + #_debug_array($signatures); + return $signatures; + } + + function getSignature($_signatureID, $_unparsed = false) + { + if($_signatureID == -1) { + + $systemSignatureIsDefaultSignature = $this->getDefaultSignature(); + + $signature = new felamimail_signatures(); + $signature->fm_signatureid = -1; + $signature->fm_description = 'eGroupWare '. lang('default signature'); + $signature->fm_signature = ($_unparsed === true ? $this->profileData->ea_default_signature : $GLOBALS['egw']->preferences->parse_notify($this->profileData->ea_default_signature)); + $signature->fm_defaultsignature = $systemSignatureIsDefaultSignature; + + return $signature; + + } else { + require_once('class.felamimail_signatures.inc.php'); + $signature = new felamimail_signatures($_signatureID); + if($_unparsed === false) { + $signature->fm_signature = ($_unparsed === true ? $this->profileData->ea_default_signature : $GLOBALS['egw']->preferences->parse_notify($signature->fm_signature)); + } + return $signature; + } + } + + function getDefaultSignature($accountID = NULL) + { + $signature = new felamimail_signatures(); + return $signature->getDefaultSignature(); + #return parent::getDefaultSignature($GLOBALS['egw_info']['user']['account_id']); + } + + function deleteSignatures($_signatureID) + { + if(!is_array($_signatureID)) { + return false; + } + $signature = new felamimail_signatures(); + foreach($_signatureID as $signatureID) { + #error_log("$signatureID"); + $signature->delete($signatureID); + } + #return parent::deleteSignatures($GLOBALS['egw_info']['user']['account_id'], $_signatureID); + } + + function saveSignature($_signatureID, $_description, $_signature, $_isDefaultSignature) + { + if($_signatureID == -1) { + // the systemwide profile + // can only be made the default profile + + return -1; + } else { + if($this->profileData->ea_user_defined_signatures == false) { + return false; + } + + $signature = new felamimail_signatures(); + + $signature->fm_description = $_description; + $signature->fm_signature = $_signature; + $signature->fm_defaultsignature = (bool)$_isDefaultSignature; + if((int)$_signatureID > 0) { + $signature->fm_signatureid = (int)$_signatureID; + } + + $signature->save(); + + return $signature->fm_signatureid; + } + } + + } +?> diff --git a/felamimail/inc/class.felamimail_bostationery.inc.php b/felamimail/inc/class.felamimail_bostationery.inc.php new file mode 100644 index 0000000000..2a998b718c --- /dev/null +++ b/felamimail/inc/class.felamimail_bostationery.inc.php @@ -0,0 +1,125 @@ + + * @copyright (c) 2009 by christian@jaytraxx.de + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id: class.felamimail_bostationery.inc.php 27660 2009-08-17 14:45:42Z jaytraxx $ + */ + +class felamimail_bostationery +{ + /** + * application stationery is working for + * + */ + const _appname = 'felamimail'; + + /** + * prefix for the etemplate stationery templates + * + */ + const _stationery_prefix = 'felamimail.stationery'; + + /** + * etemplate object + * @var object + */ + private $etemplate; + + /** + * constructor of bostationery + * + */ + public function __construct() + { + $this->etemplate = new etemplate(); + } + + /* + * returns all active templates set in emailadmin profile + * + * @return array $index => $id pairs or empty array if no active templates found + */ + private function get_active_templates() + { + $boemailadmin = new emailadmin_bo(); + $profile_data = $boemailadmin->getUserProfile(self::_appname); + $active_templates = $profile_data->ea_stationery_active_templates; + + return $active_templates; + } + + /* + * returns all stored etemplate templates + * + * @return array $id => $description pairs or empty array if no stored templates found + */ + public function get_stored_templates() + { + // ensure that templates are actually loaded into the database + $this->etemplate->test_import(self::_appname); + + $templates = $this->etemplate->search(self::_stationery_prefix); + $stored_templates = array(); + + if(is_array($templates) && count($templates) > 0) + { + foreach($templates as $template) + { + list(,,$template_description) = explode('.',$template['name']); + $stored_templates[$template['name']] = $template_description; + } + } + + return $stored_templates; + } + + /* + * returns all valid templates + * a valid template is a template that is set active in emailadmin + * AND exists (is stored) in etemplate + * + * @return array $id => $description pairs or empty array if no valid templates found + */ + public function get_valid_templates() + { + $active_templates = $this->get_active_templates(); + $stored_templates = $this->get_stored_templates(); + + $valid_templates = array(); + foreach((array)$active_templates as $index => $id) + { + if(isset($stored_templates[$id])) + { + $valid_templates[$id] = $stored_templates[$id]; + } + } + + return $valid_templates; + } + + /* + * renders the mail body with a given stationery template + * + * @param string $_id the stationery id to render + * @param string $_message the mail message + * @param string $_signature='' the mail signature + * + * @return string complete html rendered mail body + */ + function render($_id,$_message,$_signature='') + { + $content = array(); + $content['message'] = $_message; + $content['signature'] = $_signature; + + $this->etemplate->read($_id); + $mail_body = $this->etemplate->exec(false, $content, false, false, false, 3); + + return $mail_body; + } +} diff --git a/felamimail/inc/class.felamimail_hooks.inc.php b/felamimail/inc/class.felamimail_hooks.inc.php new file mode 100644 index 0000000000..18c579b571 --- /dev/null +++ b/felamimail/inc/class.felamimail_hooks.inc.php @@ -0,0 +1,876 @@ +addAccount($hookData); + break; + case 'deleteaccount': + $bofelamimail->deleteAccount($hookData); + break; + case 'editaccount': + $bofelamimail->updateAccount($hookData); + break; + } + } + + /** + * Menu for Admin >> Edit accounts + */ + static public function adminMenu() + { + if ($GLOBALS['egw_info']['server']['account_repository'] == "ldap") + { + $data = Array + ( + 'description' => 'email settings', + 'url' => '/index.php', + 'extradata' => 'menuaction=emailadmin.uiuserdata.editUserData' + ); + + //Do not modify below this line + global $menuData; + + $menuData[] = $data; + } + } + + /** + * Hook called by link-class to include calendar in the appregistry of the linkage + * + * @param array/string $location location and other parameters (not used) + * @return array with method-names + */ + static function search_link($location) + { + return array( + 'view' => array( + 'menuaction' => 'felamimail.uidisplay.display', + ), + 'view_popup' => '850xegw_getWindowOuterHeight()', + 'add' => array( + 'menuaction' => 'felamimail.uicompose.compose', + ), + 'add_popup' => '850xegw_getWindowOuterHeight()', + ); + } + + /** + * Settings hook + * + * @param array|string $hook_data + */ + static function settings($hook_data) + { + unset($GLOBALS['egw_info']['user']['preferences']['common']['auto_hide_sidebox']); + if (!$hook_data['setup']) // does not work on setup time + { + $folderList = array(); + + $profileID = 0; + if (isset($GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID'])) + $profileID = (int)$GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID']; + + $bofelamimail = felamimail_bo::getInstance($profileID); + if($bofelamimail->openConnection($profileID)) { + $folderObjects = $bofelamimail->getFolderObjects(true, false); + foreach($folderObjects as $folderName => $folderInfo) { + #_debug_array($folderData); + $folderList[$folderName] = $folderInfo->displayName; + } + $bofelamimail->closeConnection(); + } + + $availableAutoFolders['none'] = lang('none, create all'); + foreach(felamimail_bo::$autoFolders as $aname) { + $availableAutoFolders[$aname] = lang($aname); + } + + $felamimailConfig = config::read('felamimail'); + } + $refreshTime = array( + '0' => lang('disabled'), + '1' => '1', + '2' => '2', + '3' => '3', + '4' => '4', + '5' => '5', + '6' => '6', + '7' => '7', + '8' => '8', + '9' => '9', + '10' => '10', + '15' => '15', + '20' => '20', + '30' => '30' + ); + + $no_yes = array( + '0' => lang('no'), + '1' => lang('yes') + ); + $no_yes_copy = array_merge($no_yes,array('2'=>lang('yes, offer copy option'))); + + $prefAllowManageFolders = $no_yes; + + $forwardOptions = array( + 'asmail' => lang('forward as attachment'), + 'inline' => lang('forward inline'), + ); + $gridViewBehavior = array( + '0' => lang('use common preferences max. messages'), + '5' => 5, + '10'=> 10, + '15'=> 15, + '20'=> 20, + '25'=> 25, + '50'=> 50, + '75'=> 75, + '100'=> 100, + '200'=> 200, + '250'=> 250, + '500'=> 500, + '999'=> 999, + '-1' => lang('show all messages'), + ); + $sortOrder = array( + '0' => lang('date(newest first)'), + '1' => lang('date(oldest first)'), + '3' => lang('from(A->Z)'), + '2' => lang('from(Z->A)'), + '5' => lang('subject(A->Z)'), + '4' => lang('subject(Z->A)'), + '7' => lang('size(0->...)'), + '6' => lang('size(...->0)') + ); + + $selectOptions = array_merge( + $no_yes, + array('2' => lang('yes') . ' - ' . lang('small view')) + ); + $newWindowOptions = array( + '1' => lang('only one window'), + '2' => lang('allways a new window'), + ); + + $deleteOptions = array( + 'move_to_trash' => lang('move to trash'), + 'mark_as_deleted' => lang('mark as deleted'), + 'remove_immediately' => lang('remove immediately') + ); + + $sendOptions = array( + 'move_to_sent' => lang('send message and move to send folder (if configured)'), + 'send_only' => lang('only send message, do not copy a version of the message to the configured sent folder') + ); + + $composeOptions = array( + 'html' => lang('html'), + 'text' => lang('text/plain'), + ); + + $htmlOptions = array( + 'never_display' => lang('never display html emails'), + 'only_if_no_text' => lang('display only when no plain text is available'), + 'always_display' => lang('always show html emails'), + ); + + $rowOrderStyle = array( + 'felamimail' => lang('FeLaMiMail'), + 'outlook' => 'Outlook', + ); + + // otherwise we get warnings during setup + if (!is_array($folderList)) $folderList = array(); + + $trashOptions = array_merge( + array( + 'none' => lang("Don't use Trash") + ), + $folderList + ); + + $sentOptions = array_merge( + array( + 'none' => lang("Don't use Sent") + ), + $folderList + ); + + $draftOptions = array_merge( + array( + 'none' => lang("Don't use draft folder") + ), + $folderList + ); + + $templateOptions = array_merge( + array( + 'none' => lang("Don't use template folder") + ), + $folderList + ); + + // modify folderlist, add a none entry, to be able to force the regarding settings, if no folders apply + $folderList['none'] = lang('no folders'); + + /* Settings array for this app */ + return array( + 'refreshTime' => array( + 'type' => 'select', + 'label' => 'Refresh time in minutes', + 'name' => 'refreshTime', + 'values' => $refreshTime, + 'xmlrpc' => True, + 'admin' => False, + 'forced'=> 5, + ), + 'prefaskformove' => array( + 'type' => 'select', + 'label' => 'Do you want to be asked for confirmation before moving selected messages to another folder?', + 'name' => 'prefaskformove', + 'values' => $no_yes_copy, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '1', + ), + 'prefaskformultipleforward' => array( + 'type' => 'select', + 'label' => 'Do you want to be asked for confirmation before attaching selected messages to new mail?', + 'name' => 'prefaskformultipleforward', + 'values' => $no_yes, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '1', + ), + 'prefpreventmanagefolders' => array( + 'type' => 'select', + 'label' => 'Do you want to prevent the managing of folders (creation, accessrights AND subscribtion)?', + 'name' => 'prefpreventmanagefolders', + 'values' => $prefAllowManageFolders, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '0', + ), + 'prefpreventforwarding' => array( + 'type' => 'select', + 'label' => 'Do you want to prevent the editing/setup for forwarding of mails via settings (, even if SIEVE is enabled)?', + 'name' => 'prefpreventforwarding', + 'values' => $no_yes, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '0', + ), + 'prefpreventnotificationformailviaemail' => array( + 'type' => 'select', + 'label' => 'Do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if SIEVE is enabled)?', + 'name' => 'prefpreventnotificationformailviaemail', + 'values' => $no_yes, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '1', + ), + 'prefpreventeditfilterrules' => array( + 'type' => 'select', + 'label' => 'Do you want to prevent the editing/setup of filter rules (, even if SIEVE is enabled)?', + 'name' => 'prefpreventeditfilterrules', + 'values' => $no_yes, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '0', + ), + 'prefpreventabsentnotice' => array( + 'type' => 'select', + 'label' => 'Do you want to prevent the editing/setup of the absent/vacation notice (, even if SIEVE is enabled)?', + 'name' => 'prefpreventabsentnotice', + 'values' => $no_yes, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '0', + ), + 'notavailableautofolders' => array( + 'type' => 'multiselect', + 'label' => 'which folders - in general - should NOT be automatically created, if not existing', + 'name' => 'notavailableautofolders', + 'values' => $availableAutoFolders, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => 'none', + ), + 'sortOrder' => array( + 'type' => 'select', + 'label' => 'Default sorting order', + 'name' => 'sortOrder', + 'values' => $sortOrder, + 'xmlrpc' => True, + 'admin' => False, + 'default'=> '0', // newest first + ), + 'rowOrderStyle' => array( + 'type' => 'select', + 'label' => 'row order style', + 'name' => 'rowOrderStyle', + 'values' => $rowOrderStyle, + 'xmlrpc' => True, + 'admin' => False, + 'default'=> 'felamimail', + ), + 'prefMailGridBehavior' => array( + 'type' => 'select', + 'label' => 'Mail Grid Behavior: how many messages should the mailgrid load? If you select all messages there will be no pagination for mail message list. (Beware, as some actions on all selected messages may be problematic depending on the amount of selected messages.)', + 'name' => 'prefMailGridBehavior', + 'values' => $gridViewBehavior, + 'xmlrpc' => True, + 'admin' => False, + 'default'=> 50, + ), + 'PreViewFrameHeight' => array( + 'type' => 'input', + 'label' => '3PaneView: If you want to see a preview of a mail by single clicking onto the subject, set the height for the message-list and the preview area here (300 seems to be a good working value). The preview will be displayed at the end of the message list on demand (click).', + 'name' => 'PreViewFrameHeight', + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '300', + ), + 'message_forwarding' => array( + 'type' => 'select', + 'label' => 'how to forward messages', + 'name' => 'message_forwarding', + 'values' => $forwardOptions, + 'xmlrpc' => True, + 'admin' => False, + 'default'=> 'asmail', + ), + 'mainscreen_showmail' => array( + 'type' => 'select', + 'label' => 'show new messages on main screen', + 'name' => 'mainscreen_showmail', + 'values' => $selectOptions, + 'xmlrpc' => True, + 'admin' => False, + ), + 'mainscreen_showfolders' => array( + 'type' => 'multiselect', + 'label' => 'if shown, which folders should appear on main screen', + 'name' => 'mainscreen_showfolders', + 'values' => $folderList, + 'xmlrpc' => True, + 'admin' => False, + ), + 'messages_showassent_0' => array( + 'type' => 'multiselect', + 'label' => 'which folders (additional to the Sent Folder) should be displayed using the Sent Folder View Schema', + 'name' => 'messages_showassent_0', + 'values' => $folderList, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => 'none', + ), + 'notify_folders' => array( + 'type' => 'multiselect', + 'label' => 'notify when new mails arrive on these folders', + 'name' => 'notify_folders', + 'values' => $folderList, + 'xmlrpc' => True, + 'admin' => False, + ), + 'message_newwindow' => array( + 'type' => 'select', + 'label' => 'display messages in multiple windows', + 'name' => 'message_newwindow', + 'values' => $newWindowOptions, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '1', + ), + 'deleteOptions' => array( + 'type' => 'select', + 'label' => 'when deleting messages', + 'name' => 'deleteOptions', + 'values' => $deleteOptions, + 'xmlrpc' => True, + 'admin' => False, + 'default'=> 'move_to_trash', + ), + 'sendOptions' => array( + 'type' => 'select', + 'label' => 'when sending messages', + 'name' => 'sendOptions', + 'values' => $sendOptions, + 'xmlrpc' => True, + 'admin' => False, + 'default'=> 'move_to_sent', + ), + 'composeOptions' => array( + 'type' => 'select', + 'label' => 'start new messages with mime type plain/text or html?', + 'name' => 'composeOptions', + 'values' => $composeOptions, + 'xmlrpc' => True, + 'admin' => False, + 'default'=> 'html', + ), + 'htmlOptions' => array( + 'type' => 'select', + 'label' => 'display of html emails', + 'name' => 'htmlOptions', + 'values' => $htmlOptions, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => 'only_if_no_text', + ), + 'allowExternalIMGs' => array( + 'type' => 'check', + 'label' => 'allow images from external sources in html emails', + 'name' => 'allowExternalIMGs', + 'xmlrpc' => True, + 'admin' => True, + 'forced' => true, + ), + 'trashFolder' => array( + 'type' => 'select', + 'label' => 'trash folder', + 'name' => 'trashFolder', + 'values' => $trashOptions, + 'xmlrpc' => True, + 'admin' => False, + ), + 'sentFolder' => array( + 'type' => 'select', + 'label' => 'sent folder', + 'name' => 'sentFolder', + 'values' => $sentOptions, + 'xmlrpc' => True, + 'admin' => False, + ), + 'draftFolder' => array( + 'type' => 'select', + 'label' => 'draft folder', + 'name' => 'draftFolder', + 'values' => $draftOptions, + 'xmlrpc' => True, + 'admin' => False, + ), + 'templateFolder' => array( + 'type' => 'select', + 'label' => 'template folder', + 'name' => 'templateFolder', + 'values' => $templateOptions, + 'xmlrpc' => True, + 'admin' => False, + ), + 'trustServersUnseenInfo' => array( + 'type' => 'select', + 'label' => 'trust servers SEEN / UNSEEN info when retrieving the folder status. (if you select no, we will search for the UNSEEN messages and count them ourselves)', + 'name' => 'trustServersUnseenInfo', + 'values' => $no_yes, + 'xmlrpc' => True, + 'default'=> 1, + 'admin' => False, + ), + 'showAllFoldersInFolderPane' => array( + 'type' => 'select', + 'label' => 'show all Folders (subscribed AND unsubscribed) in Main Screen Folder Pane', + 'name' => 'showAllFoldersInFolderPane', + 'values' => $no_yes, + 'xmlrpc' => True, + 'default'=> 0, + 'admin' => False, + ), + 'disableRulerForSignatureSeparation' => array( + 'type' => 'select', + 'label' => 'disable Ruler for separation of mailbody and signature when adding signature to composed message (this is not according to RFC).
    If you use templates, this option is only applied to the text part of the message.', + 'name' => 'disableRulerForSignatureSeparation', + 'values' => $no_yes, + 'xmlrpc' => True, + 'default'=> 0, + 'admin' => False, + ), + 'insertSignatureAtTopOfMessage' => array( + 'type' => 'select', + 'label' => 'insert the signature at top of the new (or reply) message when opening compose dialog (you may not be able to switch signatures)', + 'name' => 'insertSignatureAtTopOfMessage', + 'values' => $no_yes, + 'xmlrpc' => True, + 'default'=> 0, + 'admin' => False, + ), + 'sieveScriptName' => array( + 'type' => 'input', + 'label' => 'sieve script name', + 'name' => 'sieveScriptName', + 'xmlrpc' => True, + 'admin' => False, + 'forced' => 'felamimail', + ), + ); + } + + /** + * Preferences hook + * + * @param array|string $hook_data + */ + static function preferences($hook_data) + { + unset($GLOBALS['egw_info']['user']['preferences']['common']['auto_hide_sidebox']); + // Only Modify the $file and $title variables..... + $title = $appname = 'felamimail'; + $profileID = 0; + if (isset($GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID'])) + $profileID = (int)$GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID']; + + $bofelamimail = felamimail_bo::getInstance($profileID); + $mailPreferences =& $bofelamimail->mailPreferences; + + $file['Preferences'] = egw::link('/index.php','menuaction=preferences.uisettings.index&appname=' . $appname); + + if($mailPreferences->userDefinedAccounts) { + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.listAccountData', + ); + $file['Manage eMail Accounts and Identities'] = egw::link('/index.php',$linkData); + } + if(empty($mailPreferences->preferences['prefpreventmanagefolders']) || $mailPreferences->preferences['prefpreventmanagefolders'] == 0) { + $file['Manage Folders'] = egw::link('/index.php','menuaction=felamimail.uipreferences.listFolder'); + } + if (is_object($mailPreferences)) + { + $icServer = $mailPreferences->getIncomingServer($profileID); + + if($icServer->enableSieve) { + if(empty($mailPreferences->preferences['prefpreventeditfilterrules']) || $mailPreferences->preferences['prefpreventeditfilterrules'] == 0) + $file['filter rules'] = egw::link('/index.php', 'menuaction=felamimail.uisieve.listRules'); + if(empty($mailPreferences->preferences['prefpreventabsentnotice']) || $mailPreferences->preferences['prefpreventabsentnotice'] == 0) + $file['vacation notice'] = egw::link('/index.php','menuaction=felamimail.uisieve.editVacation'); + } + } + //Do not modify below this line + display_section($appname,$title,$file); + } + + /** + * Sidebox menu hook + * + * @param array|string $hook_data + */ + static function sidebox_menu($hook_data) + { + //error_log(__METHOD__); + // always show the side bar + unset($GLOBALS['egw_info']['user']['preferences']['common']['auto_hide_sidebox']); + $appname = 'felamimail'; + $menu_title = $GLOBALS['egw_info']['apps'][$appname]['title'] . ' '. lang('Menu'); + $file = array(); + $profileID = 0; + if (isset($GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID'])) + $profileID = (int)$GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID']; + + $bofelamimail = felamimail_bo::getInstance(true,$profileID); + $preferences =& $bofelamimail->mailPreferences; + $showMainScreenStuff = false; + if(($_GET['menuaction'] == 'felamimail.uifelamimail.viewMainScreen' || + $_GET['menuaction'] == 'felamimail.uifelamimail.changeFolder' || + stripos($_GET['menuaction'],'ajax_sidebox') !== false) && + $_GET['menuaction'] != 'felamimail.uipreferences.editAccountData' && + $_GET['menuaction'] != 'felamimail.uifelamimail.redirectToPreferences' && + $_GET['menuaction'] != 'felamimail.uifelamimail.redirectToEmailadmin') { + if (isset($_GET["mailbox"])) + { + $bofelamimail->sessionData['mailbox'] = urldecode($_GET["mailbox"]); + $bofelamimail->sessionData['startMessage']= 1; + $bofelamimail->sessionData['sort'] = $preferences->preferences['sortOrder']; + $bofelamimail->sessionData['activeFilter']= -1; + $bofelamimail->saveSessionData(); + } + $uiwidgets = CreateObject('felamimail.uiwidgets'); + $showMainScreenStuff = true; + } + if (!$showMainScreenStuff) + { + // action links that are mostly static and dont need any connection and additional classes ... + $file += array( + 'felamimail' => egw::link('/index.php','menuaction=felamimail.uifelamimail.viewMainScreen&ajax=true'), + ); + + // standard compose link + $linkData = array( + 'menuaction' => 'felamimail.uicompose.compose' + ); + $file += array( + 'Compose' => "javascript:egw_openWindowCentered2('".egw::link('/index.php', $linkData,false)."','compose',700,750,'no','$appname');", + ); + } + // select account box, treeview, we use a whileloop as we may want to break out + while($showMainScreenStuff) { + $bofelamimail->restoreSessionData(); + $mailbox = $bofelamimail->sessionData['mailbox']; + //_debug_array($mailbox); + + $icServerID = (int)$bofelamimail->profileID; + if (is_object($preferences)) + { + // gather profile data + $imapServer =& $bofelamimail->icServer; + //error_log(__METHOD__.__LINE__.array2string($imapServer)); + // account select box + $selectedID = $bofelamimail->getIdentitiesWithAccounts($identities); + + if (empty($selectedID) && isset($imapServer->ImapServerId)) $selectedID = $imapServer->ImapServerId; + //error_log(__METHOD__.__LINE__.' SelectedID:'.$selectedID.' IcServerID:'.$imapServer->ImapServerId); + // if nothing valid is found return to user defined account definition + if (empty($imapServer->host) && count($identities)==0 && $preferences->userDefinedAccounts) + { + $showMainScreenStuff= false; + break; + } + //error_log(__METHOD__.__LINE__.array2string($preferences->identities)); + $activeIdentity =& $preferences->getIdentity($icServerID); + //error_log(__METHOD__.__LINE__.' ActiveIdentity for profileID'.$icServerID.'->'.array2string($activeIdentity)); + if ($imapServer->_connected != 1) $connectionStatus = $bofelamimail->openConnection($icServerID); + $folderObjects = $bofelamimail->getFolderObjects(true, false); + $folderStatus = $bofelamimail->getFolderStatus($mailbox); + + // the data needed here are collected at the start of this function + if (!isset($activeIdentity->id) && $selectedID == $icServerID) { + $identities[$icServerID] = $activeIdentity->realName.' '.$activeIdentity->organization.' <'.$activeIdentity->emailAddress.'>'; + } + // if you use user defined accounts you may want to access the profile defined with the emailadmin available to the user + if ($activeIdentity->id) { + $boemailadmin = new emailadmin_bo(); + $defaultProfile = $boemailadmin->getUserProfile() ; + //error_log(__METHOD__.__LINE__.array2string($defaultProfile)); + $identitys =& $defaultProfile->identities; + $icServers =& $defaultProfile->ic_server; + foreach ($identitys as $tmpkey => $identity) + { + if (empty($icServers[$tmpkey]->host)) continue; + $identities[$identity->id] = $identity->realName.' '.$identity->organization.' <'.$identity->emailAddress.'>'; + } + //$identities[0] = $defaultIdentity->realName.' '.$defaultIdentity->organization.' <'.$defaultIdentity->emailAddress.'>'; + } + + $selectAccount = html::select('accountSelect', $selectedID, $identities, true, 'style="width:100%;" onchange="var appWindow=egw_appWindow(\''.$appname.'\');appWindow.changeActiveAccount(this);"'); + //error_log(__METHOD__.__LINE__.$selectAccount); + $file[] = array( + 'text' => "
    ".$selectAccount."
    ", + 'no_lang' => True, + 'link' => False, + 'icon' => False, + ); + // show foldertree + //_debug_array($folderObjects); + $folderTree = $uiwidgets->createHTMLFolder + ( + $folderObjects, + $mailbox, + $folderStatus['unseen'], + lang('IMAP Server'), + $imapServer->username.'@'.$imapServer->host, + 'divFolderTree', + FALSE + ); + //$bofelamimail->closeConnection(); + $file[] = array( + 'text' => "
    + $folderTree +
    + ", + 'no_lang' => True, + 'link' => False, + 'icon' => False, + ); + } + break; // kill the while loop as we need only one go + } + // buttons + if($showMainScreenStuff) { + + // some buttons + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.compose' + ); + $urlCompose = "egw_appWindow('".$appname."').openComposeWindow('".egw::link('/index.php',$linkData,false)."');"; + + $navbarImages = array( + 'new' => array( + 'action' => $urlCompose, + 'tooltip' => lang('compose'), + ), + 'read_small' => array( + 'action' => "egw_appWindow('".$appname."').mail_flagMessages('read')", + 'tooltip' => lang('mark selected as read'), + ), + 'unread_small' => array( + 'action' => "egw_appWindow('".$appname."').mail_flagMessages('unread')", + 'tooltip' => lang('mark selected as unread'), + ), + 'unread_flagged_small' => array( + 'action' => "egw_appWindow('".$appname."').mail_flagMessages('flagged')", + 'tooltip' => lang('mark selected as flagged'), + ), + 'read_flagged_small' => array( + 'action' => "egw_appWindow('".$appname."').mail_flagMessages('unflagged')", + 'tooltip' => lang('mark selected as unflagged'), + ), + 'delete' => array( + 'action' => "egw_appWindow('".$appname."').mail_deleteMessages(egw_appWindow('".$appname."').mailGridGetSelected())", + 'tooltip' => lang('mark as deleted'), + ), + ); + + foreach($navbarImages as $buttonName => $buttonInfo) { + $navbarButtons .= $uiwidgets->navbarButton($buttonName, $buttonInfo['action'], $buttonInfo['tooltip']); + } + /*$file[] = array( + 'text' => " + + + +
    ".$navbarButtons."
    ", + 'no_lang' => True, + 'link' => False, + 'icon' => False, + );*/ + } + + // empty trash (if available -> move to trash ) + if($preferences->preferences['deleteOptions'] == 'move_to_trash') + { + $file += Array( + '_NewLine_' => '', // give a newline + 'empty trash' => "javascript:egw_appWindow('".$appname."').emptyTrash();", + ); + } + if($preferences->preferences['deleteOptions'] == 'mark_as_deleted') + { + $file += Array( + '_NewLine_' => '', // give a newline + 'compress folder' => "javascript:egw_appWindow('".$appname."').compressFolder();", + ); + } + // import Message link - only when the required library is available + if ((@include_once 'Mail/mimeDecode.php') !== false) + { + $linkData = array( + 'menuaction' => 'felamimail.uifelamimail.importMessage', + ); + + $file += array( + 'import message' => "javascript:egw_openWindowCentered2('".egw::link('/index.php', $linkData,false)."','import',700,125,'no','$appname');", + ); + + } + // display them all + display_sidebox($appname,$menu_title,$file); + + if ($GLOBALS['egw_info']['user']['apps']['preferences']) + { + #$mailPreferences = ExecMethod('felamimail.bopreferences.getPreferences'); + $menu_title = lang('Preferences'); + $file = array( + //'Preferences' => egw::link('/index.php','menuaction=preferences.uisettings.index&appname=felamimail'), + 'Preferences' => egw::link('/index.php','menuaction=felamimail.uifelamimail.redirectToPreferences&appname=felamimail'), + ); + + if($preferences->userDefinedAccounts || $preferences->userDefinedIdentities) { + $linkData = array ( + 'menuaction' => 'felamimail.uipreferences.listAccountData', + ); + $file['Manage eMail Accounts and Identities'] = egw::link('/index.php',$linkData); + + } + + if($preferences->ea_user_defined_signatures) { + $linkData = array ( + 'menuaction' => 'felamimail.uipreferences.listSignatures', + ); + $file['Manage Signatures'] = egw::link('/index.php',$linkData); + } + + if(empty($preferences->preferences['prefpreventmanagefolders']) || $preferences->preferences['prefpreventmanagefolders'] == 0) { + $file['Manage Folders'] = egw::link('/index.php',array('menuaction'=>'felamimail.uipreferences.listFolder')); + } + + if (is_object($preferences)) $icServer = $preferences->getIncomingServer($profileID); + if(is_a($icServer, 'defaultimap')) { + if($icServer->enableSieve) + { + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.listRules', + ); + if(empty($preferences->preferences['prefpreventeditfilterrules']) || $preferences->preferences['prefpreventeditfilterrules'] == 0) + $file['filter rules'] = egw::link('/index.php',$linkData); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.editVacation', + ); + if(empty($preferences->preferences['prefpreventabsentnotice']) || $preferences->preferences['prefpreventabsentnotice'] == 0) + { + $file['vacation notice'] = egw::link('/index.php',$linkData); + } + if((empty($preferences->preferences['prefpreventnotificationformailviaemail']) || + $preferences->preferences['prefpreventnotificationformailviaemail'] == 0) && + (empty($preferences->preferences['prefpreventforwarding']) || + $preferences->preferences['prefpreventforwarding'] == 0) ) + { + $file['email notification'] = egw::link('/index.php','menuaction=felamimail.uisieve.editEmailNotification'); //Added email notifications + } + } + } + + if (is_object($preferences)) $ogServer = $preferences->getOutgoingServer(0); + if(is_a($ogServer, 'defaultsmtp')) { + if($ogServer->editForwardingAddress) + { + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.editForwardingAddress', + ); + if(empty($preferences->preferences['prefpreventforwarding']) || $preferences->preferences['prefpreventforwarding'] == 0) + $file['Forwarding'] = egw::link('/index.php',$linkData); + } + } + display_sidebox($appname,$menu_title,$file); + } + if ($GLOBALS['egw_info']['user']['apps']['admin']) + { + $file = Array( + //'Site Configuration' => egw::link('/index.php','menuaction=emailadmin.emailadmin_ui.index'), + 'Site Configuration' => egw::link('/index.php','menuaction=felamimail.uifelamimail.redirectToEmailadmin'), + ); + display_sidebox($appname,lang('Admin'),$file); + } + } +} diff --git a/felamimail/inc/class.felamimail_signatures.inc.php b/felamimail/inc/class.felamimail_signatures.inc.php new file mode 100644 index 0000000000..4bbccf93db --- /dev/null +++ b/felamimail/inc/class.felamimail_signatures.inc.php @@ -0,0 +1,169 @@ +accountID = $GLOBALS['egw_info']['user']['account_id']; + + if($_signatureID !== NULL) { + $this->read($_signatureID); + } + } + + function getDefaultSignature() { + $db = clone($GLOBALS['egw']->db); + $db->set_app('felamimail'); + + $where = array( + 'fm_accountid' => $this->accountID, + 'fm_defaultsignature' => true + ); + + $db->select($this->tableName,'fm_signatureid,fm_description,fm_signature,fm_defaultsignature', + $where, __LINE__, __FILE__); + + if(($row = $db->row(true))) { + return $row['fm_signatureid']; + } + + return false; + } + + function read($_signatureID) { + $db = clone($GLOBALS['egw']->db); + $db->set_app('felamimail'); + + $where = array( + 'fm_accountid' => $this->accountID, + 'fm_signatureid' => $_signatureID + ); + + $db->select($this->tableName,'fm_signatureid,fm_description,fm_signature,fm_defaultsignature', + $where, __LINE__, __FILE__); + + if(($data = $db->row(true))) { + $this->fm_signatureid = $data['fm_signatureid']; + $this->fm_description = $data['fm_description']; + $this->fm_signature = $data['fm_signature']; + $this->fm_defaultsignature = (bool)$data['fm_defaultsignature']; + + return TRUE; + } + + return FALSE; + } + + function delete($_signatureID = FALSE) { + $db = clone($GLOBALS['egw']->db); + $db->set_app('felamimail'); + + if($_signatureID !== FALSE) { + $signatureID = (int)$_signatureID; + } else { + $signatureID = (int)$this->fm_signatureid; + } + + $where = array( + 'fm_accountid' => $this->accountID, + 'fm_signatureid' => $signatureID + ); + + $db->delete($this->tableName, $where, __LINE__, __FILE__); + + if ($db->affected_rows() === 0) { + return false; + } + + return true; + } + + function save() { + $db = clone($GLOBALS['egw']->db); + $db->set_app('felamimail'); + + // reset fm_defaultsignature in all other rows to false + if($this->fm_defaultsignature === true) { + $where = array( + 'fm_accountid' => $this->accountID, + ); + $data = array( + 'fm_defaultsignature' => false, + ); + + $db->update($this->tableName, $data, $where, __LINE__, __FILE__); + } + + $data = array( + 'fm_accountid' => $this->accountID, + 'fm_signature' => $this->fm_signature, + 'fm_description' => $this->fm_description, + 'fm_defaultsignature' => $this->fm_defaultsignature, + ); + + + if($this->fm_signatureid === NULL) { + $db->insert($this->tableName, $data, '', __LINE__, __FILE__); + + $this->fm_signatureid = $db->get_last_insert_id($this->tableName,'fm_signatureid'); + + return TRUE; + } else { + $where = array( + 'fm_accountid' => $this->accountID, + 'fm_signatureid' => $this->fm_signatureid, + ); + $db->update($this->tableName, $data, $where, __LINE__, __FILE__); + + return TRUE; + } + } + + function search() { + $signatures = array(); + + $db = clone($GLOBALS['egw']->db); + $db->set_app('felamimail'); + + $where = array( + 'fm_accountid' => $this->accountID + ); + + $db->select($this->tableName,'fm_signatureid,fm_description,fm_signature,fm_defaultsignature', + $where, __LINE__, __FILE__); + + while ($data = $db->row(true)) { + $signatureData = array( + 'fm_signatureid' => $data['fm_signatureid'], + 'fm_description' => $data['fm_description'], + 'fm_signature' => $data['fm_signature'], + 'fm_defaultsignature' => (bool)$data['fm_defaultsignature'], + ); + $signatures[$data['fm_signatureid']] = $signatureData; + } + + return $signatures; + } + } +?> diff --git a/felamimail/inc/class.felamimail_sofilter.inc.php b/felamimail/inc/class.felamimail_sofilter.inc.php new file mode 100644 index 0000000000..7fe7ea6a16 --- /dev/null +++ b/felamimail/inc/class.felamimail_sofilter.inc.php @@ -0,0 +1,51 @@ +accountid = $GLOBALS['egw_info']['user']['account_id']; + $this->db = clone($GLOBALS['egw']->db); + } + + function saveFilter($_filterArray) + { + $this->db->insert($this->filter_table,array( + 'fmail_filter_data' => serialize($_filterArray) + ),array( + 'fmail_filter_accountid' => $this->accountid + ),__LINE__,__FILE__,'felamimail'); + + unset($this->sessionData['filter'][$_filterID]); + } + + function restoreFilter() + { + $this->db->select($this->filter_table,'fmail_filter_data',array( + 'fmail_filter_accountid' => $this->accountid + ),__LINE__,__FILE__,False,False,'felamimail'); + + + if ($this->db->next_record()) + { + $filter = unserialize($this->db->f('fmail_filter_data')); + return $filter; + } + } + } +?> diff --git a/felamimail/inc/class.sopreferences.inc.php b/felamimail/inc/class.sopreferences.inc.php new file mode 100644 index 0000000000..ad4d834295 --- /dev/null +++ b/felamimail/inc/class.sopreferences.inc.php @@ -0,0 +1,145 @@ +db = clone($GLOBALS['egw']->db); + $this->db->set_app('felamimail'); + } + + // allowed keywords for _identity are either the fm_id, all or active + // an fm_id retrieves the account with the specified fm_id of the given user + // all retrieves ALL Accounts of a given user + // active retrieves all active accounts of a given user + function getAccountData($_accountID, $_identity = NULL) + { + // no valid accountID + if(($accountID = (int)$_accountID) < 1) + return array(); + + $retValue = array(); + $where = array('fm_owner' => $accountID); + if (!empty($_identity) && $_identity != 'active' && $_identity != 'all') $where['fm_id'] = $_identity; + if ($_identity == 'active' || empty($_identity)) $where['fm_active'] = true; + $this->db->select($this->accounts_table,'fm_id,fm_active,fm_realname,fm_organization,fm_emailaddress,fm_signatureid,'. + 'fm_ic_hostname,fm_ic_port,fm_ic_username,fm_ic_password,fm_ic_encryption,fm_ic_validatecertificate,'. + 'fm_ic_enable_sieve,fm_ic_sieve_server,fm_ic_sieve_port,'. + 'fm_ic_folderstoshowinhome, fm_ic_trashfolder, fm_ic_sentfolder, fm_ic_draftfolder, fm_ic_templatefolder,'. + 'fm_og_hostname,fm_og_port,fm_og_smtpauth,fm_og_username,fm_og_password', + $where,__LINE__,__FILE__); + + while(($row = $this->db->row(true,'fm_'))) { + foreach(array('active','ic_validatecertificate','ic_enable_sieve','og_smtpauth','ic_folderstoshowinhome') as $name) + { + if ($name == 'ic_folderstoshowinhome') { + $row[$name] = unserialize($row[$name]); + } else { + $row[$name] = $this->db->from_bool($row[$name]); + } + } + $retValue[$row['id']] = $row; + } + return $retValue; + } + + function saveAccountData($_accountID, $_icServer, $_ogServer, $_identity) + { + + $data = array( + 'fm_active' => false, + 'fm_owner' => $_accountID, + 'fm_realname' => $_identity->realName, + 'fm_organization' => $_identity->organization, + 'fm_emailaddress' => $_identity->emailAddress, + 'fm_signatureid' => $_identity->signature, + ); + if (is_object($_icServer)) { + $data = array_merge($data,array( + 'fm_ic_hostname' => $_icServer->host, + 'fm_ic_port' => $_icServer->port, + 'fm_ic_username' => $_icServer->username, + 'fm_ic_password' => $_icServer->password, + 'fm_ic_encryption' => $_icServer->encryption, + 'fm_ic_validatecertificate' => (bool)$_icServer->validatecert, + 'fm_ic_enable_sieve' => (bool)$_icServer->enableSieve, + 'fm_ic_sieve_server' => $_icServer->sieveHost, + 'fm_ic_sieve_port' => $_icServer->sievePort, + 'fm_ic_folderstoshowinhome' => serialize($_icServer->folderstoshowinhome), + 'fm_ic_trashfolder' => $_icServer->trashfolder, + 'fm_ic_sentfolder' => $_icServer->sentfolder, + 'fm_ic_draftfolder' => $_icServer->draftfolder, + 'fm_ic_templatefolder' => $_icServer->templatefolder, + )); + } + if (is_object($_ogServer)) { + $data = array_merge($data,array( + 'fm_og_hostname' => $_ogServer->host, + 'fm_og_port' => $_ogServer->port, + 'fm_og_smtpauth' => (bool)$_ogServer->smtpAuth, + 'fm_og_username' => $_ogServer->username, + 'fm_og_password' => $_ogServer->password, + )); + } + $where = array( + 'fm_owner' => $_accountID, + ); + #_debug_array($data); + if (!empty($_identity->id)) $where['fm_id'] = $_identity->id; + if ($_identity->id == 'new') + { + $this->db->insert($this->accounts_table, $data, NULL,__LINE__,__FILE__); + return $this->db->get_last_insert_id($this->accounts_table, 'fm_id'); + } else { + $this->db->update($this->accounts_table, $data, $where,__LINE__,__FILE__); + return $_identity->id; + } + } + + function deleteAccountData($_accountID, $_identity) + { + $where = array( + 'fm_owner' => $_accountID, + ); + if (is_array($_identity) && count($_identity)>1) $where[] = "fm_id in (".implode(',',$_identity).")"; + if (is_array($_identity) && count($_identity)==1) $where['fm_id'] = $_identity[0]; + if (!empty($_identity->id) && !is_array($_identity)) $where['fm_id'] = $_identity->id; + $this->db->delete($this->accounts_table, $where ,__LINE__,__FILE__); + } + + function setProfileActive($_accountID, $_status, $_identity) + { + $where = array( + 'fm_owner' => $_accountID, + ); + if (!empty($_identity)) + { + $where['fm_id'] = $_identity; + } + $this->db->update($this->accounts_table,array( + 'fm_active' => (bool)$_status, + ), $where,__LINE__,__FILE__); + } + } +?> diff --git a/felamimail/inc/class.uicompose.inc.php b/felamimail/inc/class.uicompose.inc.php new file mode 100644 index 0000000000..24e0634b5f --- /dev/null +++ b/felamimail/inc/class.uicompose.inc.php @@ -0,0 +1,868 @@ + True, + 'compose' => True, + 'composeFromDraft' => True, + 'getAttachment' => True, + 'fileSelector' => True, + 'forward' => True, + 'composeAsNew' => True, + 'composeAsForward'=> True, + 'reply' => True, + 'replyAll' => True, + 'selectFolder' => True, + ); + + var $destinations = array( + 'to' => 'to', + 'cc' => 'cc', + 'bcc' => 'bcc', + 'replyto' => 'replyto', + 'folder' => 'folder' + ); + /** + * Instance of bofelamimail + * + * @var bofelamimail + */ + var $bofelamimail; + /** + * Instance of bocompose + * + * @var bocompose + */ + var $bocompose; + /** + * Active preferences, reference to $this->bofelamimail->mailPreferences + * + * @var array + */ + var $mailPreferences; + /** + * Instance of Template class + * + * @var Template + */ + var $t; + + function uicompose() + { + $this->displayCharset = $GLOBALS['egw']->translation->charset(); + if (!isset($_POST['composeid']) && !isset($_GET['composeid'])) + { + // create new compose session + $this->bocompose = CreateObject('felamimail.bocompose','',$this->displayCharset); + $this->composeID = $this->bocompose->getComposeID(); + } + else + { + // reuse existing compose session + if (isset($_POST['composeid'])) + $this->composeID = $_POST['composeid']; + else + $this->composeID = $_GET['composeid']; + $this->bocompose = CreateObject('felamimail.bocompose',$this->composeID,$this->displayCharset); + } + $this->t = CreateObject('phpgwapi.Template',EGW_APP_TPL); + + $this->bofelamimail =& $this->bocompose->bofelamimail; + $this->mailPreferences =& $this->bofelamimail->mailPreferences; + $this->t->set_unknowns('remove'); + + $this->rowColor[0] = $GLOBALS['egw_info']["theme"]["bg01"]; + $this->rowColor[1] = $GLOBALS['egw_info']["theme"]["bg02"]; + } + + function unhtmlentities ($string) + { + $trans_tbl = get_html_translation_table (HTML_ENTITIES); + $trans_tbl = array_flip ($trans_tbl); + return strtr ($string, $trans_tbl); + } + + function action() + { + $formData['identity'] = (int)$_POST['identity']; + + foreach($_POST['destination'] as $key => $destination) { + if(!empty($_POST['address'][$key])) { + if($destination == 'folder') { + $formData[$destination][] = $GLOBALS['egw']->translation->convert($_POST['address'][$key], $this->charset, 'UTF7-IMAP'); + } else { + $formData[$destination][] = $_POST['address'][$key]; + } + } + } + + $formData['subject'] = $this->bocompose->stripSlashes($_POST['subject']); + $formData['body'] = $this->bocompose->stripSlashes($_POST['body']); + // if the body is empty, maybe someone pasted something with scripts, into the message body + if(empty($formData['body'])) + { + // this is to be found with the egw_unset_vars array for the _POST['body'] array + $name='_POST'; + $key='body'; + #error_log($GLOBALS['egw_unset_vars'][$name.'['.$key.']']); + if (isset($GLOBALS['egw_unset_vars'][$name.'['.$key.']'])) + { + $formData['body'] = bocompose::_getCleanHTML( $GLOBALS['egw_unset_vars'][$name.'['.$key.']']); + } + } + $formData['priority'] = $this->bocompose->stripSlashes($_POST['priority']); + $formData['signatureID'] = (int)$_POST['signatureID']; + $formData['stationeryID'] = $_POST['stationeryID']; + $formData['mimeType'] = $this->bocompose->stripSlashes($_POST['mimeType']); + $formData['disposition'] = (bool)$_POST['disposition']; + $formData['to_infolog'] = $_POST['to_infolog']; + $formData['to_tracker'] = $_POST['to_tracker']; + //$formData['mailbox'] = $_GET['mailbox']; + if((bool)$_POST['printit'] == true) { + $formData['printit'] = 1; + $formData['isDraft'] = 1; + // pint the composed message. therefore save it as draft and reopen it as plain printwindow + $formData['subject'] = "[".lang('printview').":]".$formData['subject']; + $messageUid = $this->bocompose->saveAsDraft($formData); + if (!$messageUid) { + print ""; + return; + } + $uidisplay = CreateObject('felamimail.uidisplay'); + $uidisplay->printMessage($messageUid, $formData['printit']); + //egw::link('/index.php',array('menuaction' => 'felamimail.uidisplay.printMessage','uid'=>$messageUid)); + return; + } + if((bool)$_POST['saveAsDraft'] == true) { + $formData['isDraft'] = 1; + // save as draft + $folder = ($this->mailPreferences->ic_server[$this->bofelamimail->profileID]->draftfolder ? $this->mailPreferences->ic_server[$this->bofelamimail->profileID]->draftfolder : $this->mailPreferences->preferences['draftFolder']); + $this->bofelamimail->reopen($folder); + $status = $this->bofelamimail->getFolderStatus($folder); + //error_log(__METHOD__.__LINE__.array2string($status)); + $uidNext = $status['uidnext']; // we may need that, if the server does not return messageUIDs of saved/appended messages + $messageUid = $this->bocompose->saveAsDraft($formData); + if (!$messageUid) { + print ""; + //try to reopen the mail from session data + $this->compose('to',true); + return; + } + // saving as draft, does not mean closing the message + unset($_POST['composeid']); + unset($_GET['composeid']); + $uicompose = CreateObject('felamimail.uicompose'); + $messageUid = ($messageUid===true ? $uidNext : $messageUid); + if ($this->bofelamimail->getMessageHeader($messageUid)) + { + //error_log(__METHOD__.__LINE__.' (re)open drafted message with new UID: '.$messageUid.' in folder:'.$folder); + $uicompose->bocompose->getDraftData($uicompose->bofelamimail->icServer, $folder, $messageUid); + $uicompose->compose('to',true); + return; + } + } else { + if(!$this->bocompose->send($formData)) { +// print ""; + $this->compose(); + return; + } + } + + #common::egw_exit(); + print ""; + } + + function composeAsForward($_focusElement='to') + { + if (isset($_GET['forwardmails'])) + { + unset($_GET['forwardmails']); + $replyID = $_GET['reply_id']; + $replyIds = explode(',',$replyID); + $icServer = $this->bofelamimail->profileID; + $folder = base64_decode($_GET['folder']); + //_debug_array(array('reply_id'=>$replyIds,'folder'=>$folder)); + if (!empty($folder) && !empty($replyID) ) { + // this fill the session data with the values from the original email + $buff = $this->bocompose->preferencesArray['message_forwarding']; + $this->bocompose->preferencesArray['message_forwarding'] = 'asmail'; + foreach($replyIds as $key => $id) + { + $this->bocompose->getForwardData($icServer, $folder, $id,NULL); + } + $this->bocompose->preferencesArray['message_forwarding'] = $buff; + } + } + $this->compose($_focusElement); + } + + function compose($_focusElement='to',$suppressSigOnTop=false) + { + // read the data from session + // all values are empty for a new compose window + $sessionData = $this->bocompose->getSessionData(); + if (is_array($_REQUEST['preset'])) + { + //_debug_array($_REQUEST); + if ($_REQUEST['preset']['mailto']) { + // handle mailto strings such as + // mailto:larry,dan?cc=mike&bcc=sue&subject=test&body=type+your&body=message+here + // the above string may be htmlentyty encoded, then multiple body tags are supported + // first, strip the mailto: string out of the mailto URL + $tmp_send_to = trim(substr(html_entity_decode($_REQUEST['preset']['mailto']),7)); + // check if there is more than the to address + $mailtoArray = explode('?',$tmp_send_to,2); + if ($mailtoArray[1]) { + // check if there are more than one requests + $addRequests = explode('&',$mailtoArray[1]); + foreach ($addRequests as $key => $reqval) { + // the additional requests should have a =, to separate key from value. + $keyValuePair = explode('=',$reqval,2); + $sessionData[$keyValuePair[0]] .= (strlen($sessionData[$keyValuePair[0]])>0 ? ' ':'') . $keyValuePair[1]; + } + } + $sessionData['to']=$mailtoArray[0]; + // if the mailto string is not htmlentity decoded the arguments are passed as simple requests + foreach(array('cc','bcc','subject','body') as $name) { + if ($_REQUEST[$name]) $sessionData[$name] .= (strlen($sessionData[$name])>0 ? ( $name == 'cc' || $name == 'bcc' ? ',' : ' ') : '') . $_REQUEST[$name]; + } + } + if (isset($_REQUEST['preset']['file'])) + { + $names = (array)$_REQUEST['preset']['name']; + $types = (array)$_REQUEST['preset']['type']; + foreach((array)$_REQUEST['preset']['file'] as $k => $path) + { + if (parse_url($path,PHP_URL_SCHEME == 'vfs')) + { + $formData = array( + 'name' => urldecode(egw_vfs::basename($path)), + 'type' => egw_vfs::mime_content_type($path), + 'file' => $path, + 'size' => filesize($path), + ); + if ($formData['type'] == egw_vfs::DIR_MIME_TYPE) continue; // ignore directories + } + elseif(is_readable($path)) + { + $formData = array( + 'name' => isset($names[$k]) ? $names[$k] : basename($path), + 'type' => isset($types[$k]) ? $types[$k] : (function_exists('mime_content_type') ? mime_content_type($path) : mime_magic::filename2mime($path)), + 'file' => $path, + 'size' => filesize($path), + ); + } + else + { + continue; + } + $this->bocompose->addAttachment($formData); + } + $sessionData = $this->bocompose->getSessionData(); + } + foreach(array('to','cc','bcc','subject','body') as $name) + { + if ($_REQUEST['preset'][$name]) $sessionData[$name] = $_REQUEST['preset'][$name]; + } + } + // is the to address set already? + if (!empty($_REQUEST['send_to'])) + { + $sessionData['to'] = base64_decode($_REQUEST['send_to']); + } + + //is the MimeType set/requested + if (!empty($_REQUEST['mimeType'])) + { + $sessionData['mimeType'] = $_REQUEST['mimeType']; + } + // is a certain signature requested? + // only the following values are supported (and make sense) + // no => means -2 + // system => means -1 + // default => fetches the default, which is standard behavior + if (!empty($_REQUEST['signature']) && (strtolower($_REQUEST['signature']) == 'no' || strtolower($_REQUEST['signature']) == 'system')) + { + $presetSig = (strtolower($_REQUEST['signature']) == 'no' ? -2 : -1); + } + if (($suppressSigOnTop || $sessionData['isDraft']) && !empty($sessionData['signatureID'])) $presetSig = (int)$sessionData['signatureID']; + if (($suppressSigOnTop || $sessionData['isDraft']) && !empty($sessionData['stationeryID'])) $presetStationery = $sessionData['stationeryID']; + $presetId = NULL; + if (($suppressSigOnTop || $sessionData['isDraft']) && !empty($sessionData['identity'])) $presetId = (int)$sessionData['identity']; + $this->display_app_header(); + + $this->t->set_file(array("composeForm" => "composeForm.tpl")); + $this->t->set_block('composeForm','header','header'); + $this->t->set_block('composeForm','body_input'); + $this->t->set_block('composeForm','attachment','attachment'); + $this->t->set_block('composeForm','attachment_row','attachment_row'); + $this->t->set_block('composeForm','attachment_row_bold'); + $this->t->set_block('composeForm','destination_row'); + $this->t->set_block('composeForm','simple_text'); + + $this->translate(); + // store the selected Signature + $this->t->set_var("mySigID",($presetSig ? $presetSig : $sessionData['signatureID'])); + + if ($GLOBALS['egw_info']['user']['apps']['addressbook']) { + $this->t->set_var("link_addressbook",egw::link('/index.php',array( + 'menuaction' => 'addressbook.addressbook_ui.emailpopup', + ))); + } else { + $this->t->set_var("link_addressbook",''); + } + $this->t->set_var("focusElement",$_focusElement); + + $linkData = array + ( + 'menuaction' => 'felamimail.uicompose.selectFolder', + ); + $this->t->set_var('folder_select_url',egw::link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uicompose.fileSelector', + 'composeid' => $this->composeID + ); + $this->t->set_var('file_selector_url',egw::link('/index.php',$linkData)); + + $this->t->set_var('vfs_selector_url',egw::link('/index.php',array( + 'menuaction' => 'filemanager.filemanager_select.select', + 'mode' => 'open-multiple', + 'method' => 'felamimail.uicompose.vfsSelector', + 'id' => $this->composeID, + 'label' => lang('Attach'), + ))); + if ($GLOBALS['egw_info']['user']['apps']['filemanager']) + { + $this->t->set_var('vfs_attach_button',' + '); + } + else + { + $this->t->set_var('vfs_attach_button',''); + } + $linkData = array + ( + 'menuaction' => 'felamimail.uicompose.action', + 'composeid' => $this->composeID + ); + $this->t->set_var("link_action",egw::link('/index.php',$linkData)); + $this->t->set_var('folder_name',$this->bofelamimail->sessionData['mailbox']); + $this->t->set_var('compose_id',$this->composeID); + // the editorobject is needed all the time (since we use CKEDITOR3 + //$editorObject = html::initCKEditor('400px','simple'); + $this->t->set_var('ckeditorConfig', egw_ckeditor_config::get_ckeditor_config());//$editorObject->jsEncode($editorObject->config)); + + // check for some error messages from last posting attempt + if($errorInfo = $this->bocompose->getErrorInfo()) + { + $this->t->set_var('errorInfo',"$errorInfo"); + } + else + { + $this->t->set_var('errorInfo',' '); + } + + // header + $allIdentities = $this->mailPreferences->getIdentity(); + //_debug_array($allIdentities); + $defaultIdentity = 0; + $identities = array(); + foreach($allIdentities as $key => $singleIdentity) { + #$identities[$singleIdentity->id] = $singleIdentity->realName.' <'.$singleIdentity->emailAddress.'>'; + if (array_search($singleIdentity->realName.' <'.$singleIdentity->emailAddress.'>',$identities)==false) $identities[$key] = $singleIdentity->realName.' <'.$singleIdentity->emailAddress.'>'; + if(!empty($singleIdentity->default)) + { + #$defaultIdentity = $singleIdentity->id; + $defaultIdentity = $key; + $sessionData['signatureID'] = (!empty($singleIdentity->signature) ? $singleIdentity->signature : $sessionData['signatureID']); + } + } + $selectFrom = html::select('identity', ($presetId ? $presetId : $defaultIdentity), $identities, true, "style='width:100%;' onchange='changeIdentity(this);'"); + $this->t->set_var('select_from', $selectFrom); + //error_log(__METHOD__.__LINE__.' DefaultIdentity:'.array2string($identities[($presetId ? $presetId : $defaultIdentity)])); + // navbar(, kind of) + $this->t->set_var('img_clear_left', common::image('felamimail','clear_left')); + $this->t->set_var('img_fileopen', common::image('phpgwapi','fileopen')); + $this->t->set_var('img_mail_send', common::image('felamimail','mail_send')); + $this->t->set_var('img_attach_file', common::image('felamimail','attach')); + $this->t->set_var('ajax-loader', common::image('felamimail','ajax-loader')); + $this->t->set_var('img_fileexport', common::image('felamimail','fileexport')); + // prepare print url/button + $this->t->set_var('img_print_it', common::image('felamimail','print')); + $this->t->set_var('lang_print_it', lang('print it')); + $this->t->set_var('print_it', $printURL); + // from, to, cc, replyto + $destinationRows = 0; + foreach(array('to','cc','bcc','replyto','folder') as $destination) { + foreach((array)$sessionData[$destination] as $key => $value) { + if ($value=="NIL@NIL") continue; + if ($destination=='replyto' && str_replace('"','',$value) == str_replace('"','',$identities[($presetId ? $presetId : $defaultIdentity)])) continue; + //error_log(__METHOD__.__LINE__.array2string(array('key'=>$key,'value'=>$value))); + $selectDestination = html::select('destination[]', $destination, $this->destinations, false, "style='width: 100%;' onchange='fm_compose_changeInputType(this)'"); + $this->t->set_var('select_destination', $selectDestination); + $value = htmlspecialchars_decode($value,ENT_COMPAT); + $value = str_replace("\"\"",'"',$value); + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($value):$value), ''); + foreach((array)$address_array as $addressObject) { + if ($addressObject->host == '.SYNTAX-ERROR.') continue; + $address = imap_rfc822_write_address($addressObject->mailbox,$addressObject->host,$addressObject->personal); + $address = felamimail_bo::htmlentities($address, $this->displayCharset); + $this->t->set_var('address', $address); + $this->t->parse('destinationRows','destination_row',True); + $destinationRows++; + } + } + } + while($destinationRows < 3) { + // and always add one empty row + $selectDestination = html::select('destination[]', 'to', $this->destinations, false, "style='width: 100%;' onchange='fm_compose_changeInputType(this)'"); + $this->t->set_var('select_destination', $selectDestination); + $this->t->set_var('address', ''); + $this->t->parse('destinationRows','destination_row',True); + $destinationRows++; + } + // and always add one empty row + $selectDestination = html::select('destination[]', 'to', $this->destinations, false, "style='width: 100%;' onchange='fm_compose_changeInputType(this)'"); + $this->t->set_var('select_destination', $selectDestination); + $this->t->set_var('address', ''); + $this->t->parse('destinationRows','destination_row',True); + + // handle subject + $subject = felamimail_bo::htmlentities($sessionData['subject'],$this->displayCharset); + $this->t->set_var("subject",$subject); + + if ($GLOBALS['egw_info']['user']['apps']['addressbook']) { + $this->t->set_var('addressbookButton',''); + } else { + $this->t->set_var('addressbookButton',''); + } + if ($GLOBALS['egw_info']['user']['apps']['infolog']) { + $this->t->set_var('infologImage',html::image('felamimail','to_infolog',lang('Save as infolog'),'width="17px" height="17px" valign="middle"' )); + $this->t->set_var('lang_save_as_infolog',lang('Save as infolog')); + $this->t->set_var('infolog_checkbox',''); + } else { + $this->t->set_var('infologImage',''); + $this->t->set_var('lang_save_as_infolog',''); + $this->t->set_var('infolog_checkbox',''); + } + if ($GLOBALS['egw_info']['user']['apps']['tracker']) + { + $this->t->set_var('trackerImage',html::image('felamimail','to_tracker',lang('Save as tracker'),'width="17px" height="17px" valign="middle"' )); + $this->t->set_var('lang_save_as_infolog',($GLOBALS['egw_info']['user']['apps']['infolog']?lang('Save:'):lang('Save as tracker'))); + $this->t->set_var('tracker_checkbox',''); + } else { + $this->t->set_var('trackerImage',''); + $this->t->set_var('tracker_checkbox',''); + } + $this->t->set_var('lang_no_recipient',lang('No recipient address given!')); + $this->t->set_var('lang_no_subject',lang('No subject given!')); + $this->t->set_var('lang_infolog_tracker_not_both',lang("You can either choose to save as infolog OR tracker, not both.")); + $this->t->pparse("out","header"); + + // prepare signatures, the selected sig may be used on top of the body + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.felamimail_bosignatures.inc.php'); + $boSignatures = new felamimail_bosignatures(); + $signatures = $boSignatures->getListOfSignatures(); + + if (empty($sessionData['signatureID'])) { + if ($signatureData = $boSignatures->getDefaultSignature()) { + if (is_array($signatureData)) { + $sessionData['signatureID'] = $signatureData['signatureid']; + } else { + $sessionData['signatureID'] =$signatureData; + } + } + } + + $selectSignatures = array( + '-2' => lang('no signature') + ); + foreach($signatures as $signature) { + $selectSignatures[$signature['fm_signatureid']] = lang('Signature').': '.$signature['fm_description']; + } + $disableRuler = false; + $signature = $boSignatures->getSignature(($presetSig ? $presetSig : $sessionData['signatureID'])); + if ((isset($this->bocompose->preferencesArray['disableRulerForSignatureSeparation']) && + $this->bocompose->preferencesArray['disableRulerForSignatureSeparation']) || + empty($signature->fm_signature) || trim($this->bocompose->convertHTMLToText($signature->fm_signature)) =='') + { + $disableRuler = true; + } + $insertSigOnTop = false; + //error_log(__METHOD__.__LINE__.array2string($this->bocompose->preferencesArray)); + if (isset($this->bocompose->preferencesArray['insertSignatureAtTopOfMessage']) && + $this->bocompose->preferencesArray['insertSignatureAtTopOfMessage'] && + !(isset($_POST['mySigID']) && !empty($_POST['mySigID']) ) && !$suppressSigOnTop + ) + { + $insertSigOnTop = true; + if($sessionData['mimeType'] == 'html') { + $before = ($disableRuler ?' 
    ':' 

    '); + $inbetween = ' 
    '; + } else { + $before = ($disableRuler ?"\r\n\r\n":"\r\n\r\n-- \r\n"); + $inbetween = "\r\n"; + } + $sigText = felamimail_bo::merge($signature->fm_signature,array($GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id'))); + $sessionData['body'] = $before.($sessionData['mimeType'] == 'html'?$sigText:$this->bocompose->convertHTMLToText($sigText)).$inbetween.$sessionData['body']; + } + // prepare body + if($sessionData['mimeType'] == 'html') { + $mode = 'simple'; + #if (isset($GLOBALS['egw_info']['server']['enabled_spellcheck'])) $mode = 'egw_simple_spellcheck'; + $style="border:0px; width:100%; height:400px;"; + // dont run purify, as we already did that (getCleanHTML). + $this->t->set_var('tinymce', html::fckEditorQuick('body', $mode, $sessionData['body'],'400px','100%',false)); + $this->t->set_var('mimeType', 'html'); + $ishtml=1; + } else { + $style="border:0px; width:100%; height:400px;"; + // initalize the CKEditor Object to enable switching back and force + $editor = html::fckEditorQuick('body', 'ascii', $sessionData['body'],'400px','99%'); + $this->t->set_var('tinymce', $editor); //html::fckEditorQuick('body', 'ascii', $sessionData['body'],'400px','99%')); + $this->t->set_var('mimeType', 'text'); + $ishtml=0; + } + + + $bostationery = new felamimail_bostationery(); + $selectStationeries = array( + '0' => lang('no stationery') + ); + $showStationaries = false; + $validStationaries = $bostationery->get_valid_templates(); + if (is_array($validStationaries) && count($validStationaries)>0) + { + $showStationaries = true; + $selectStationeries += $validStationaries; + } + // if ID of signature Select Box is set, we allow for changing the sig onChange of the signatueSelect + $selectBoxSignature = html::select('signatureID', ($presetSig ? $presetSig : $sessionData['signatureID']), $selectSignatures, true, ($insertSigOnTop?"id='signatureID'":"")." style='width: 35%;' onchange='fm_compose_changeInputType(this)'"); + $selectBoxStationery = html::select('stationeryID', ($presetStationery ? $presetStationery : 0), $selectStationeries, true, "style='width: 35%;'"); + $this->t->set_var("select_signature", $selectBoxSignature); + $this->t->set_var("select_stationery", ($showStationaries ? $selectBoxStationery:'')); + $this->t->set_var("lang_editormode",lang("Editor type")); + $this->t->set_var("toggle_editormode", lang("Editor type").": "); + $this->t->pparse("out","body_input"); + + // attachments + if (is_array($sessionData['attachments']) && count($sessionData['attachments']) > 0) + { + $imgClearLeft = common::image('felamimail','clear_left'); + foreach((array)$sessionData['attachments'] as $id => $attachment) { + $tempArray = array ( + '1' => $attachment['name'], '.1' => 'width="40%"', + '2' => mime_magic::mime2label($attachment['type']), + '3' => egw_vfs::hsize($attachment['size']), '.3' => "style='text-align:right;'", + '4' => ' ', '.4' => 'width="10%"', + '5' => "composeID."','$id')\">", + ); + $tableRows[] = $tempArray; + } + + if(count($tableRows) > 0) { + $table = html::table($tableRows, "style='width:100%'"); + } + $this->t->set_var('attachment_rows',$table); + } + else + { + $this->t->set_var('attachment_rows',''); + } + + $this->t->pparse("out","attachment"); + } + + function composeFromDraft() { + $icServer = (int)$_GET['icServer']; + $folder = base64_decode($_GET['folder']); + $replyID = $_GET['uid']; + + if (!empty($folder) && !empty($replyID) ) { + // this fill the session data with the values from the original email + $this->bocompose->getDraftData($icServer, $folder, $replyID); + } + $this->compose('body',$suppressSigOnTop=true); + } + + + function display_app_header() + { + egw_framework::validate_file('jscode','composeMessage','felamimail'); + egw_framework::validate_file('ckeditor3','ckeditor','phpgwapi'); + + $GLOBALS['egw']->js->set_onload('javascript:initAll();'); + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + + common::egw_header(); + } + + /** + * Callback for filemanagers select file dialog + * + * @param string $composeid + * @param string|array $files path of file(s) in vfs (no egw_vfs::PREFIX, just the path) + * @return string javascript output by the file select dialog, usually to close it + */ + function vfsSelector($composeid,$files) + { + $this->bocompose = CreateObject('felamimail.bocompose',$this->composeID=$composeid,$this->displayCharset); + + foreach((array) $files as $path) + { + $formData = array( + 'name' => egw_vfs::basename($path), + 'type' => egw_vfs::mime_content_type($path), + 'file' => egw_vfs::PREFIX.$path, + 'size' => filesize(egw_vfs::PREFIX.$path), + ); + $this->bocompose->addAttachment($formData); + } + return 'window.close();'; + } + + function fileSelector() + { + if(is_array($_FILES["addFileName"])) { + #phpinfo(); + //_debug_array($_FILES); + $success=false; + if (is_array($_FILES["addFileName"]['name'])) + { + // multiple uploads supported by newer firefox (>3.6) and chrome (>4) versions, + // upload array information is by key within the attribute (name, type, size, temp_name) + foreach($_FILES["addFileName"]['name'] as $key => $filename) + { + if($_FILES['addFileName']['error'][$key] == $UPLOAD_ERR_OK) { + $formData['name'] = $_FILES['addFileName']['name'][$key]; + $formData['type'] = $_FILES['addFileName']['type'][$key]; + $formData['file'] = $_FILES['addFileName']['tmp_name'][$key]; + $formData['size'] = $_FILES['addFileName']['size'][$key]; + $this->bocompose->addAttachment($formData); + $success = true; + } + } + } + else // should not happen as upload form name is defined as addFileName[] + { + if($_FILES['addFileName']['error'] == $UPLOAD_ERR_OK) { + $formData['name'] = $_FILES['addFileName']['name']; + $formData['type'] = $_FILES['addFileName']['type']; + $formData['file'] = $_FILES['addFileName']['tmp_name']; + $formData['size'] = $_FILES['addFileName']['size']; + $this->bocompose->addAttachment($formData); + $success = true; + } + } + if ($success == true) + { + print ""; + } + else + { + print ""; + } + } + + // this call loads js and css for the treeobject + html::tree(false,false,false,null,'foldertree','','',false,'/',null,false); + egw_framework::validate_file('jscode','composeMessage','felamimail'); + common::egw_header(); + + #$uiwidgets =& CreateObject('felamimail.uiwidgets'); + + $this->t->set_file(array("composeForm" => "composeForm.tpl")); + $this->t->set_block('composeForm','fileSelector','fileSelector'); + + $this->translate(); + + $linkData = array + ( + 'menuaction' => 'felamimail.uicompose.fileSelector', + 'composeid' => $this->composeID + ); + $this->t->set_var('file_selector_url', egw::link('/index.php',$linkData)); + + $maxUploadSize = ini_get('upload_max_filesize'); + $this->t->set_var('max_uploadsize', $maxUploadSize); + + $this->t->set_var('ajax-loader', common::image('felamimail','ajax-loader')); + + $this->t->pparse("out","fileSelector"); + } + + function forward() { + $icServer = (int)$_GET['icServer']; + $folder = base64_decode($_GET['folder']); + $replyID = $_GET['reply_id']; + $partID = $_GET['part_id']; + + if (!empty($replyID)) + { + // this fill the session data with the values from the original email + $this->bocompose->getForwardData($icServer, $folder, $replyID, $partID); + } + $this->compose(); + } + + function getAttachment() + { + $bocompose = CreateObject('felamimail.bocompose', $_GET['_composeID']); + $attachment = $bocompose->sessionData['attachments'][$_GET['attID']] ; + if (!empty($attachment['folder'])) + { + $is_winmail = $_GET['is_winmail'] ? $_GET['is_winmail'] : 0; + $this->mailbox = $attachment['folder']; + $this->bofelamimail->reopen($this->mailbox); + #$attachment = $this->bofelamimail->getAttachment($this->uid,$part); + $attachmentData = $this->bofelamimail->getAttachment($attachment['uid'],$attachment['partID'],$is_winmail); + $this->bofelamimail->closeConnection(); + } + + if (parse_url($attachment['file'],PHP_URL_SCHEME) == 'vfs') + { + egw_vfs::load_wrapper('vfs'); + } + //error_log(print_r($attachmentData,true)); + header ("Content-Type: ".$attachment['type']."; name=\"". $this->bofelamimail->decode_header($attachment['name']) ."\""); + header ("Content-Disposition: inline; filename=\"". $this->bofelamimail->decode_header($attachment['name']) ."\""); + header("Expires: 0"); + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Pragma: public"); + if (!empty($attachment['file'])) + { + $fp = fopen($attachment['file'], 'rb'); + fpassthru($fp); + fclose($fp); + } + else + { + echo $attachmentData['attachment']; + } + common::egw_exit(); + exit; + + } + + + function selectFolder() + { + // this call loads js and css for the treeobject + html::tree(false,false,false,null,'foldertree','','',false,'/',null,false); + + egw_framework::validate_file('jscode','composeMessage','felamimail'); + common::egw_header(); + + $bofelamimail = $this->bofelamimail; + $uiwidgets = CreateObject('felamimail.uiwidgets'); + $connectionStatus = $bofelamimail->openConnection($bofelamimail->profileID); + + $folderObjects = $bofelamimail->getFolderObjects(true,false); + $folderTree = $uiwidgets->createHTMLFolder + ( + $folderObjects, + 'INBOX', + 0, + lang('IMAP Server'), + $mailPreferences['username'].'@'.$mailPreferences['imapServerAddress'], + 'divFolderTree', + false, + true + ); + print '
    '; + print $folderTree; + } + + function composeAsNew() { + $icServer = (int)$_GET['icServer']; + $folder = base64_decode($_GET['folder']); + $replyID = $_GET['reply_id']; + $partID = $_GET['part_id']; + if (!empty($folder) && !empty($replyID) ) { + // this fill the session data with the values from the original email + $this->bocompose->getDraftData($icServer, $folder, $replyID, $partID); + } + $this->compose('body',true); + } + + function reply() { + $icServer = (int)$_GET['icServer']; + $folder = base64_decode($_GET['folder']); + $replyID = $_GET['reply_id']; + $partID = $_GET['part_id']; + if (!empty($folder) && !empty($replyID) ) { + // this fill the session data with the values from the original email + $this->bocompose->getReplyData('single', $icServer, $folder, $replyID, $partID); + } + $this->compose('body'); + } + + function replyAll() { + $icServer = (int)$_GET['icServer']; + $folder = base64_decode($_GET['folder']); + $replyID = $_GET['reply_id']; + $partID = $_GET['part_id']; + if (!empty($folder) && !empty($replyID) ) { + // this fill the session data with the values from the original email + $this->bocompose->getReplyData('all', $icServer, $folder, $replyID, $partID); + } + $this->compose('body'); + } + + function translate() { + $this->t->set_var("lang_message_list",lang('Message List')); + $this->t->set_var("lang_to",lang('to')); + $this->t->set_var("lang_cc",lang('cc')); + $this->t->set_var("lang_bcc",lang('bcc')); + $this->t->set_var("lang_identity",lang('identity')); + $this->t->set_var("lang_reply_to",lang('reply to')); + $this->t->set_var("lang_subject",lang('subject')); + $this->t->set_var("lang_addressbook",lang('addressbook')); + $this->t->set_var("lang_search",lang('search')); + $this->t->set_var("lang_send",lang('send')); + $this->t->set_var('lang_save_as_draft',lang('save as draft')); + $this->t->set_var("lang_back_to_folder",lang('back to folder')); + $this->t->set_var("lang_attachments",lang('attachments')); + $this->t->set_var("lang_add",lang('add')); + $this->t->set_var("lang_remove",lang('remove')); + $this->t->set_var("lang_priority",lang('priority')); + $this->t->set_var("lang_normal",lang('normal')); + $this->t->set_var("lang_high",lang('high')); + $this->t->set_var("lang_low",lang('low')); + $this->t->set_var("lang_signature",lang('signature')); + $this->t->set_var("lang_stationery",lang('stationery')); + $this->t->set_var("lang_select_folder",lang('select folder')); + $this->t->set_var('lang_max_uploadsize',lang('max uploadsize')); + $this->t->set_var('lang_adding_file_please_wait',lang('Adding file to message. Please wait!')); + $this->t->set_var('lang_receive_notification',lang('Receive notification')); + $this->t->set_var('lang_no_address_set',lang('can not send message. no recipient defined!')); + + $this->t->set_var("th_bg",$GLOBALS['egw_info']["theme"]["th_bg"]); + $this->t->set_var("bg01",$GLOBALS['egw_info']["theme"]["bg01"]); + $this->t->set_var("bg02",$GLOBALS['egw_info']["theme"]["bg02"]); + $this->t->set_var("bg03",$GLOBALS['egw_info']["theme"]["bg03"]); + } + +} + +?> diff --git a/felamimail/inc/class.uidisplay.inc.php b/felamimail/inc/class.uidisplay.inc.php new file mode 100644 index 0000000000..81b320a4a2 --- /dev/null +++ b/felamimail/inc/class.uidisplay.inc.php @@ -0,0 +1,1902 @@ + + * + * See the enclosed file COPYING for license information (LGPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html. + * + */ + + /* $Id$ */ + + class uidisplay + { + + var $public_functions = array + ( + 'display' => True, + 'displayBody' => True, + 'displayHeader' => True, + 'displayImage' => True, + 'displayAttachments' => True, + 'printMessage' => True, + 'saveMessage' => True, + 'showHeader' => True, + 'getAttachment' => True, + 'getdisplayableBody' => True, + ); + + var $icServerID=0; + + // the object storing the data about the incoming imap server + var $icServer=0; + + // the non permanent id of the message + var $id; + + // partid of the current mail to be displayed + var $partID; + + // the permanent id of the message + var $uid; + /** + * Reference to felamimail_bo + * + * @var felamimail_bo + */ + var $bofelamimail; + /** + * Reference to bopreference instance of felamimail_bo + * + * @var bopreferences + */ + var $bopreferences; + + function uidisplay() + { + /* Having this defined in just one spot could help when changes need + * to be made to the pattern + * Make sure that the expression is evaluated case insensitively + * + * RFC2822 (and RFC822) defines the left side of an email address as (roughly): + * 1*atext *("." 1*atext) + * where atext is: a-zA-Z0-9!#$%&'*+-/=?^_`{|}~ + * + * Here's pretty sophisticated IP matching: + * $IPMatch = '(2[0-5][0-9]|1?[0-9]{1,2})'; + * $IPMatch = '\[?' . $IPMatch . '(\.' . $IPMatch . '){3}\]?'; + */ + /* Here's enough: */ + global $IP_RegExp_Match, $Host_RegExp_Match, $Email_RegExp_Match; + $IP_RegExp_Match = '\\[?[0-9]{1,3}(\\.[0-9]{1,3}){3}\\]?'; + $Host_RegExp_Match = '('.$IP_RegExp_Match.'|[0-9a-z]([-.]?[0-9a-z])*\\.[a-z][a-z]+)'; + #$atext = '([a-z0-9!#$&%*+/=?^_`{|}~-]|&)'; + $atext = '([a-zA-Z0-9_\-\.])'; + $dot_atom = $atext.'+(\.'.$atext.'+)*'; + $Email_RegExp_Match = '~'.$dot_atom.'(%'.$Host_RegExp_Match.')?@'.$Host_RegExp_Match.'~i'; + + $this->t = CreateObject('phpgwapi.Template',EGW_APP_TPL); + $this->displayCharset = $GLOBALS['egw']->translation->charset(); + if (isset($GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID'])) + $this->icServerID = (int)$GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID']; + + $this->bofelamimail = felamimail_bo::getInstance(true,$this->icServerID); + $this->bopreferences =& $this->bofelamimail->bopreferences; + + $this->mailPreferences =& $this->bofelamimail->mailPreferences;//bopreferences->getPreferences(); + + $this->bofelamimail->openConnection($this->icServerID); + + $this->mailbox = $this->bofelamimail->sessionData['mailbox']; + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + + $this->sort = $this->bofelamimail->sessionData['sort']; + + if(isset($_GET['uid'])) { + $this->uid = (int)$_GET['uid']; + } + + if(isset($_GET['id'])) { + $this->id = (int)$_GET['id']; + } + /* this one (idToUid) does not exist (anymore) + if(isset($this->id) && !isset($this->uid)) { + if($uid = $this->bofelamimail->idToUid($this->mailbox, $this->id)) { + $this->uid = $uid; + } + } + */ + if(isset($_GET['part'])) { + $this->partID = (int)$_GET['part']; + } + + $this->rowColor[0] = $GLOBALS['egw_info']["theme"]["bg01"]; + $this->rowColor[1] = $GLOBALS['egw_info']["theme"]["bg02"]; + } + + /** + * Parses a body and converts all found email addresses to clickable links. + * + * @param string body the body to process, by ref + * @return int the number of unique addresses found + */ + function parseEmail (&$body) { + global $Email_RegExp_Match; + $sbody = $body; + $addresses = array(); + $i = 0; + /* Find all the email addresses in the body */ + // stop cold after 100 adresses, as this is very time consuming + while(preg_match($Email_RegExp_Match, $sbody, $regs) && $i<=100) { + //_debug_array($regs); + $addresses[$regs[0]] = strtr($regs[0], array('&' => '&')); + $start = strpos($sbody, $regs[0]) + strlen($regs[0]); + $sbody = substr($sbody, $start); + $i++; + } + + /* Replace each email address with a compose URL */ + $lmail=''; + if (is_array($addresses)) ksort($addresses); + foreach ($addresses as $text => $email) { + if ($lmail == $email) next($addresses); + //echo __METHOD__.' Text:'.$text."#
    "; + //echo $email."#
    "; + $comp_uri = $this->makeComposeLink($email, $text); + //echo __METHOD__.' Uri:'.$comp_uri.'#
    '; + $body = str_replace($text, $comp_uri, $body); + $lmail=$email; + } + + /* Return number of unique addresses found */ + return count($addresses); + } + function parseHREF (&$body) { + #echo __METHOD__."called
    "; + $webserverURL = $GLOBALS['egw_info']['server']['webserver_url']; + $alnum = 'a-z0-9'; + #$domain = "(http(s?):\/\/)*"; + #$domain .= "([$alnum]([-$alnum]*[$alnum]+)?)"; + #$domain = "^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*[^\.\,\)\(\s]$ "; + $domain = "(http(s?):\/\/)+([[:alpha:]][-[:alnum:]]*[[:alnum:]])(\.[[:alpha:]][-[:alnum:]]*[[:alpha:]])*(\.[[:alpha:]][-[:alnum:]]*[[:alpha:]])+"; + #$dir = "(/[[:alpha:]][-[:alnum:]]*[[:alnum:]])*"; + #$trailingslash = "(\/?)"; + #$page = "(/[[:alpha:]][-[:alnum:]]*\.[[:alpha:]]{3,5})?"; + #$getstring = "(\?([[:alnum:]][-_%[:alnum:]]*=[-_%[:alnum:]]+) + # (&([[:alnum:]][-_%[:alnum:]]*=[-_%[:alnum:]]+))*)?"; + #$pattern = "^".$domain.$dir.$trailingslash.$page.$getstring."$"; + $pattern = "~\ $link) { + if (empty($link)) continue; + if ($llink == $link) next($addresses); + #echo $text."#
    "; + #echo $link."#
    \n"; + $link = str_replace("\n","",$link); + $comp_uri = "
    '); + //error_log( __METHOD__." text:".$text.'#
    '); + // create links for email addresses + $linkData = array + ( + 'menuaction' => 'felamimail.uicompose.compose', + 'send_to' => base64_encode($email) + ); + $link = $GLOBALS['egw']->link('/index.php',$linkData); + //error_log(__METHOD__." link:".$link.'#
    '); + //return "
    ".$text.""; + return "".$text.""; + } + + function highlightQuotes($text, $level = 5) + { + // Use a global var since the class is called statically. + $GLOBALS['_tmp_maxQuoteChars'] = 0; + + // Tack a newline onto the beginning of the string so that we + // correctly highlight when the first character in the string + // is a quote character. + $text = "\n$text"; + + preg_replace_callback("/^\s*((>\s?)+)/m", array(&$this, '_countQuoteChars'), $text); + + // Go through each level of quote block and put the + // appropriate style around it. Important to work downwards so + // blocks with fewer quote chars aren't matched until their + // turn. + for ($i = $GLOBALS['_tmp_maxQuoteChars']; $i > 0; $i--) + { + $text = preg_replace( + // Finds a quote block across multiple newlines. + "/(\n)( *(>\s?)\{$i}(?! ?>).*?)(\n|$)(?! *(> ?)\{$i})/s", + '\1\2\4',$text); + } + + /* Unset the global variable. */ + unset($GLOBALS['_tmp_maxQuoteChars']); + + /* Remove the leading newline we added above. */ + return substr($text, 1); + } + + function _countQuoteChars($matches) + { + $num = count(preg_split('/>\s?/', $matches[1])) - 1; + if ($num > $GLOBALS['_tmp_maxQuoteChars']) + { + $GLOBALS['_tmp_maxQuoteChars'] = $num; + } + } + + function display() + { + $partID = $this->partID = $_GET['part']; + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + + //$transformdate =& CreateObject('felamimail.transformdate'); + //$htmlFilter =& CreateObject('felamimail.htmlfilter'); + $uiWidgets = CreateObject('felamimail.uiwidgets'); + // (regis) seems to be necessary to reopen... + $this->bofelamimail->reopen($this->mailbox); + // retrieve the flags of the message, before touching it. + if (!empty($this->uid)) $flags = $this->bofelamimail->getFlags($this->uid); + + #print "$this->mailbox, $this->uid, $partID
    "; + $headers = $this->bofelamimail->getMessageHeader($this->uid, $partID); + if (PEAR::isError($headers)) { + print lang("ERROR: Message could not be displayed.")."
    "; + print "In Mailbox: $this->mailbox, with ID: $this->uid, and PartID: $partID
    "; + print $headers->message."
    "; + _debug_array($headers->backtrace[0]); + exit; + } + #_debug_array($headers);exit; + $rawheaders = $this->bofelamimail->getMessageRawHeader($this->uid, $partID); + //_debug_array($rawheaders);exit; + $attachments = $this->bofelamimail->getMessageAttachments($this->uid, $partID, '',false); + //_debug_array($attachments); //exit; + $envelope = $this->bofelamimail->getMessageEnvelope($this->uid, $partID,true); + //_debug_array($envelope); exit; + // if not using iFrames, we need to retrieve the messageBody here + // by now this is a fixed value and controls the use/loading of the template and how the vars are set. + // Problem is: the iFrame Layout provides the scrollbars. + #$bodyParts = $this->bofelamimail->getMessageBody($this->uid,'',$partID); + #_debug_array($bodyParts); exit; + #_debug_array($this->uid); + #_debug_array($this->bofelamimail->getFlags($this->uid)); #exit; + // flag the message as read/seen (if not already flagged) + if (!empty($this->uid) && strpos( array2string($flags),'Seen')===false) $this->bofelamimail->flagMessages('read', $this->uid); + + $nextMessage = $this->bofelamimail->getNextMessage($this->mailbox, $this->uid); + $webserverURL = $GLOBALS['egw_info']['server']['webserver_url']; + + $nonDisplayAbleCharacters = array('[\016]','[\017]', + '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]', + '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]'); + + #print "
    ";print_r($rawheaders);print"
    ";exit; + + // add line breaks to $rawheaders + $newRawHeaders = explode("\n",$rawheaders); + reset($newRawHeaders); + + if(isset($headers['ORGANIZATION'])) { + $organization = $this->bofelamimail->decode_header(trim($headers['ORGANIZATION'])); + } + + if ( isset($headers['DISPOSITION-NOTIFICATION-TO']) ) { + $sent_not = $this->bofelamimail->decode_header(trim($headers['DISPOSITION-NOTIFICATION-TO'])); + } else if ( isset($headers['RETURN-RECEIPT-TO']) ) { + $sent_not = $this->bofelamimail->decode_header(trim($headers['RETURN-RECEIPT-TO'])); + } else if ( isset($headers['X-CONFIRM-READING-TO']) ) { + $sent_not = $this->bofelamimail->decode_header(trim($headers['X-CONFIRM-READING-TO'])); + } else $sent_not = ""; + + // reset $rawheaders + $rawheaders = ""; + // create it new, with good line breaks + reset($newRawHeaders); + while(list($key,$value) = @each($newRawHeaders)) { + $rawheaders .= wordwrap($value, 90, "\n "); + } + + $this->display_app_header(); + if(!isset($_GET['printable'])) { + $this->t->set_file(array("displayMsg" => "view_message.tpl")); + } else { + $this->t->set_file(array("displayMsg" => "view_message_printable.tpl")); + $this->t->set_var('charset',$GLOBALS['egw']->translation->charset()); + } + // only notify when requested, notify flag (MDNSent/MDNnotSent) not set, and message not already seen (some servers do not support the MDNSent/MDNnotSent flag) + if ( $sent_not != "" && $this->bofelamimail->getNotifyFlags($this->uid) === null && strpos( array2string($flags),'Seen')===false) { + $this->t->set_var('sentNotify','sendNotify("'.$this->uid.'");'); + $this->t->set_var('lang_sendnotify',lang('The message sender has requested a response to indicate that you have read this message. Would you like to send a receipt?')); + } else { + $this->t->set_var('sentNotify',''); + $this->t->set_var('lang_sendnotify',''); + } + + $this->t->set_block('displayMsg','message_main'); + $this->t->set_block('displayMsg','message_main_attachment'); + $this->t->set_block('displayMsg','message_header'); + $this->t->set_block('displayMsg','message_raw_header'); + $this->t->set_block('displayMsg','message_navbar'); + $this->t->set_block('displayMsg','message_onbehalfof'); + $this->t->set_block('displayMsg','message_cc'); + $this->t->set_block('displayMsg','message_bcc'); + $this->t->set_block('displayMsg','message_attachement_row'); + $this->t->set_block('displayMsg','previous_message_block'); + $this->t->set_block('displayMsg','next_message_block'); + //$this->t->set_block('displayMsg','message_org'); + + $this->t->egroupware_hack = False; + + $this->translate(); + + // navBar buttons + $headerData = array('uid'=>$this->uid); + if($partID != '') { + $headerData['partid'] = $partID; + } + if (strpos( array2string($flags),'Deleted')!==false) + { + $headerData['deleted']=1; + } + $this->t->set_var('navbarButtonsLeft',$uiWidgets->displayMessageActions($headerData, $this->mailbox, $this->icServer)); + + $navbarButtons = ''; + $navbarImages = array(); + #_debug_array($nextMessage); exit; + + if($nextMessage['previous']) { + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.display', + 'showHeader' => 'false', + 'uid' => $nextMessage['previous'], + 'mailbox' => base64_encode($this->mailbox) + ); + $previousURL = $GLOBALS['egw']->link('/index.php',$linkData); + $previousURL = "goToMessage('$previousURL')"; + $navbarImages['up.button'] = array( + 'action' => $previousURL, + 'tooltip' => lang('previous message'), + ); + } else { + $previousURL = '#'; + $navbarImages['up.grey'] = array( + 'action' => $previousURL, + 'tooltip' => lang('previous message'), + ); + } + + if($nextMessage['next']) { + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.display', + 'showHeader' => 'false', + 'uid' => $nextMessage['next'], + 'mailbox' => base64_encode($this->mailbox) + ); + $nextURL = $GLOBALS['egw']->link('/index.php',$linkData); + $nextURL = "goToMessage('$nextURL')"; + $navbarImages['down.button'] = array( + 'action' => $nextURL, + 'tooltip' => lang('next message'), + ); + } else { + $nextURL = '#'; + $navbarImages['down.grey'] = array( + #'action' => $nextURL, + 'tooltip' => lang('next message'), + ); + } + + + foreach($navbarImages as $buttonName => $buttonData) + { + $navbarButtons .= $uiWidgets->navbarButton($buttonName, $buttonData['action'], $buttonData['tooltip'], 'right'); + } + + $this->t->set_var('navbarButtonsRight',$navbarButtons); + + $this->t->parse('navbar','message_navbar',True); + + // navbar end + // header + // sent by a mailinglist?? + // parse the from header + if($envelope['FROM'][0] != $envelope['SENDER'][0]) { + $senderAddress = self::emailAddressToHTML($envelope['SENDER'],'',false,true,false); + $fromAddress = self::emailAddressToHTML($envelope['FROM'], $organization,false,true,false); + $this->t->set_var("from_data",$senderAddress); + $this->t->set_var("onbehalfof_data",$fromAddress); + $this->t->parse('on_behalf_of_part','message_onbehalfof',True); + } else { + $fromAddress = self::emailAddressToHTML($envelope['FROM'], $organization,false,true,false); + $this->t->set_var("from_data", $fromAddress); + $this->t->set_var('on_behalf_of_part',''); + } + + // parse the to header + $toAddress = self::emailAddressToHTML($envelope['TO'],'',false,true,false); + $this->t->set_var("to_data",$toAddress); + + // parse the cc header + if(count($envelope['CC'])) { + $ccAddress = self::emailAddressToHTML($envelope['CC'],'',false,true,false); + $this->t->set_var("cc_data",$ccAddress); + $this->t->parse('cc_data_part','message_cc',True); + } else { + $this->t->set_var("cc_data_part",''); + } + + // parse the bcc header + if(count($envelope['BCC'])) { + $bccAddress = self::emailAddressToHTML($envelope['BCC'],'',false,true,false); + $this->t->set_var("bcc_data",$bccAddress); + $this->t->parse('bcc_data_part','message_bcc',True); + } else { + $this->t->set_var("bcc_data_part",''); + } + $this->t->set_var("date_received", + @htmlspecialchars(felamimail_bo::_strtotime($headers['DATE'],$GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],true).' - '.felamimail_bo::_strtotime($headers['DATE'],($GLOBALS['egw_info']['user']['preferences']['common']['timeformat']==12?'h:i:s a':'H:i:s'),true), + ENT_QUOTES,$this->displayCharset)); + //echo 'Envelope:'.preg_replace($nonDisplayAbleCharacters,'',$envelope['SUBJECT']).'#0
    '; + $subject = felamimail_bo::htmlspecialchars($this->bofelamimail->decode_subject(preg_replace($nonDisplayAbleCharacters,'',$envelope['SUBJECT']),false), + $this->displayCharset); + $this->t->set_var("subject_data",$subject); + + $this->t->parse("header","message_header",True); + + $this->t->set_var("rawheader",@htmlentities(preg_replace($nonDisplayAbleCharacters,'',$rawheaders),ENT_QUOTES,$this->displayCharset)); + + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.displayBody', + 'uid' => $this->uid, + 'part' => $partID, + 'mailbox' => base64_encode($this->mailbox) + ); + $this->t->set_var('url_displayBody', $GLOBALS['egw']->link('/index.php',$linkData)); + + // if browser supports data uri: ie<8 does NOT and ie>=8 does NOT support html as content :-( + // --> use it to send the mail as data uri + if (!isset($_GET['printable'])) + { + $mailData = $this->get_load_email_data($this->uid, $partID); + + $this->t->set_var('url_displayBody', $mailData['src']."\" onload=\"".$mailData['onload']); + $this->t->set_var('mail_dataScript', $mailData['script']); + } + + // attachments + if(is_array($attachments) && count($attachments) > 0 && count($attachments) > 4) { + // this is to account for maxheight minheight of the attachment div + $this->t->set_var('attachment_div_height',' bottom:'.(count($attachments)>4?(count($attachments)*20<=240?count($attachments)*20:240):80).'px'); + } else { + $this->t->set_var('attachment_div_height',''); // app.css bodyDIVAttachment + } + + if (is_array($attachments) && count($attachments) > 0) { + $this->t->set_var('row_color',$this->rowColor[0]); + $this->t->set_var('name',lang('name')); + $this->t->set_var('type',lang('type')); + $this->t->set_var('size',lang('size')); + $this->t->set_var('url_img_save',html::image('felamimail','fileexport', lang('save'))); + $url_img_vfs = html::image('filemanager','navbar', lang('Filemanager'), ' height="16"'); + $url_img_vfs_save_all = html::image('felamimail','save_all', lang('Save all')); + #$this->t->parse('attachment_rows','attachment_row_bold',True); + + $detectedCharSet=$charset2use=$this->displayCharset; + foreach ($attachments as $key => $value) + { + #$detectedCharSet = mb_detect_encoding($value['name'].'a',strtoupper($this->displayCharset).",UTF-8, ISO-8559-1"); + if (function_exists('mb_convert_variables')) mb_convert_variables("UTF-8","ISO-8559-1",$value['name']); # iso 2 UTF8 + //if (mb_convert_variables("ISO-8859-1","UTF-8",$value['name'])){echo "Juhu utf8 2 ISO\n";}; + //echo $value['name']."\n"; + $filename=htmlentities($value['name'], ENT_QUOTES, $detectedCharSet); + + $this->t->set_var('row_color',$this->rowColor[($key+1)%2]); + $this->t->set_var('filename',($value['name'] ? ( $filename ? $filename : $value['name'] ) : lang('(no subject)'))); + $this->t->set_var('mimetype',mime_magic::mime2label($value['mimeType'])); + $this->t->set_var('size',egw_vfs::hsize($value['size'])); + $this->t->set_var('attachment_number',$key); + + switch(strtoupper($value['mimeType'])) + { + case 'MESSAGE/RFC822': + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.display', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'mailbox' => base64_encode($this->mailbox), + 'is_winmail' => $value['is_winmail'] + ); + $windowName = 'displayMessage_'. $this->uid.'_'.$value['partID']; + $linkView = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',700,egw_getWindowOuterHeight());"; + break; + case 'IMAGE/JPEG': + case 'IMAGE/PNG': + case 'IMAGE/GIF': + case 'IMAGE/BMP': + case 'APPLICATION/PDF': + case 'TEXT/PLAIN': + case 'TEXT/HTML': + case 'TEXT/CALENDAR': + case 'TEXT/X-VCARD': + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'is_winmail' => $value['is_winmail'], + 'mailbox' => base64_encode($this->mailbox), + ); + $windowName = 'displayAttachment_'. $this->uid; + $reg = '800x600'; + // handle calendar/vcard + if (strtoupper($value['mimeType'])=='TEXT/CALENDAR') + { + $windowName = 'displayEvent_'. $this->uid; + $reg2 = egw_link::get_registry('calendar','view_popup'); + } + if (strtoupper($value['mimeType'])=='TEXT/X-VCARD') + { + $windowName = 'displayContact_'. $this->uid; + $reg2 = egw_link::get_registry('addressbook','add_popup'); + } + // apply to action + list($width,$height) = explode('x',(!empty($reg2) ? $reg2 : $reg)); + $linkView = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',$width,$height);"; + break; + default: + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'is_winmail' => $value['is_winmail'], + 'mailbox' => base64_encode($this->mailbox), + ); + $linkView = "window.location.href = '".$GLOBALS['egw']->link('/index.php',$linkData)."';"; + break; + } + $this->t->set_var("link_view",$linkView); + $this->t->set_var("target",$target); + + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'mode' => 'save', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'is_winmail' => $value['is_winmail'], + 'mailbox' => base64_encode($this->mailbox), + ); + $this->t->set_var("link_save",$GLOBALS['egw']->link('/index.php',$linkData)); + + if ($GLOBALS['egw_info']['user']['apps']['filemanager']) + { + $link_vfs_save = egw::link('/index.php',array( + 'menuaction' => 'filemanager.filemanager_select.select', + 'mode' => 'saveas', + 'name' => $value['name'], + 'mime' => strtolower($value['mimeType']), + 'method' => 'felamimail.uidisplay.vfsSaveAttachment', + 'id' => $this->mailbox.'::'.$this->uid.'::'.$value['partID'].'::'.$value['is_winmail'], + 'label' => lang('Save'), + )); + $vfs_save = "$url_img_vfs"; + // add save-all icon for first attachment + if (!$key && count($attachments) > 1) + { + foreach ($attachments as $key => $value) + { + $ids["id[$key]"] = $this->mailbox.'::'.$this->uid.'::'.$value['partID'].'::'.$value['is_winmail'].'::'.$value['name']; + } + $link_vfs_save = egw::link('/index.php',array( + 'menuaction' => 'filemanager.filemanager_select.select', + 'mode' => 'select-dir', + 'method' => 'felamimail.uidisplay.vfsSaveAttachment', + 'label' => lang('Save all'), + )+$ids); + $vfs_save .= "\n$url_img_vfs_save_all"; + } + $this->t->set_var('vfs_save',$vfs_save); + } + else + { + $this->t->set_var('vfs_save',''); + } + $this->t->parse('attachment_rows','message_attachement_row',True); + } + } else { + $this->t->set_var('attachment_rows',''); + } + + #$this->t->pparse("out","message_attachment_rows"); + + // print it out + if(is_array($attachments) && count($attachments) > 0) { + $this->t->pparse('out','message_main_attachment'); + } else { + $this->t->pparse('out','message_main'); + } + + } + + function displayBody() + { + $partID = $_GET['part']; + if (empty($this->uid) && !empty($_GET['uid']) ) $this->uid = 9247;//$_GET['uid']; + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + + $this->bofelamimail->reopen($this->mailbox); + $bodyParts = $this->bofelamimail->getMessageBody($this->uid,'',$partID); + $this->bofelamimail->closeConnection(); + + $this->display_app_header(); + $this->showBody($this->getdisplayableBody($bodyParts), true); + } + + function showBody(&$body, $print=true) + { + $BeginBody = ' +
    '; + + $EndBody = '
    '; + $EndBody .= ""; + if ($print) { + print $BeginBody. $body .$EndBody; + } else { + return $BeginBody. $body .$EndBody; + } + } + + function displayHeader() + { + $partID = $_GET['part']; + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + + //$transformdate =& CreateObject('felamimail.transformdate'); + //$htmlFilter =& CreateObject('felamimail.htmlfilter'); + //$uiWidgets =& CreateObject('felamimail.uiwidgets'); + // (regis) seems to be necessary to reopen... + $this->bofelamimail->reopen($this->mailbox); + #$headers = $this->bofelamimail->getMessageHeader($this->mailbox, $this->uid, $partID); + $rawheaders = $this->bofelamimail->getMessageRawHeader($this->uid, $partID); + + $webserverURL = $GLOBALS['egw_info']['server']['webserver_url']; + + #$nonDisplayAbleCharacters = array('[\016]','[\017]', + # '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]', + # '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]'); + + #print "
    ";print_r($rawheaders);print"
    ";exit; + + // add line breaks to $rawheaders + $newRawHeaders = explode("\n",$rawheaders); + reset($newRawHeaders); + + // reset $rawheaders + $rawheaders = ""; + // create it new, with good line breaks + reset($newRawHeaders); + while(list($key,$value) = @each($newRawHeaders)) { + $rawheaders .= wordwrap($value, 90, "\n "); + } + + $this->bofelamimail->closeConnection(); + + header('Content-type: text/html; charset=iso-8859-1'); + print '
    '. htmlspecialchars($rawheaders, ENT_NOQUOTES, 'iso-8859-1') .'
    '; + + } + + function displayAttachments() + { + $partID = $_GET['part']; + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + $nonDisplayAbleCharacters = array('[\016]','[\017]', + '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]', + '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]'); + + //$transformdate =& CreateObject('felamimail.transformdate'); + //$htmlFilter =& CreateObject('felamimail.htmlfilter'); + // (regis) seems to be necessary to reopen... + $this->bofelamimail->reopen($this->mailbox); + $headers = $this->bofelamimail->getMessageHeader($this->uid, $partID); + $envelope = $this->bofelamimail->getMessageEnvelope($this->uid, $partID,true); + if (PEAR::isError($headers)) { + print lang("ERROR: Message could not be displayed.")."
    "; + print "In Mailbox: $this->mailbox, with ID: $this->uid, and PartID: $partID
    "; + print $headers->message."
    "; + _debug_array($headers->backtrace[0]); + exit; + } + $attachments = $this->bofelamimail->getMessageAttachments($this->uid, $partID, '', true); + #_debug_array($attachments); exit; + + $this->display_app_header(); + $this->t->set_file(array("displayMsg" => "view_attachments.tpl")); + $this->t->set_var('charset',$GLOBALS['egw']->translation->charset()); + $this->t->set_block('displayMsg','message_main_attachment'); + $this->t->set_block('displayMsg','message_attachement_row'); + $this->bofelamimail->closeConnection(); + + $this->t->egroupware_hack = False; + + $this->translate(); + $subject = felamimail_bo::htmlspecialchars($this->bofelamimail->decode_subject(preg_replace($nonDisplayAbleCharacters,'',$envelope['SUBJECT']),false), + $this->displayCharset); + $this->t->set_var("subject_data",$subject); + + // attachments + /* + if(is_array($attachments) && count($attachments) > 0) { + $this->t->set_var('attachment_count',count($attachments)); + } else { + $this->t->set_var('attachment_count','0'); + } + */ + if (is_array($attachments) && count($attachments) > 0) { + $this->t->set_var('row_color',$this->rowColor[0]); + $this->t->set_var('name',lang('name')); + $this->t->set_var('type',lang('type')); + $this->t->set_var('size',lang('size')); + $this->t->set_var('url_img_save',html::image('felamimail','fileexport', lang('save'))); + $url_img_vfs = html::image('filemanager','navbar', lang('Filemanager'), ' height="16"'); + $url_img_vfs_save_all = html::image('felamimail','save_all', lang('Save all')); + #$this->t->parse('attachment_rows','attachment_row_bold',True); + + $detectedCharSet=$charset2use=$this->displayCharset; + foreach ($attachments as $key => $value) + { + #$detectedCharSet = mb_detect_encoding($value['name'].'a',strtoupper($this->displayCharset).",UTF-8, ISO-8559-1"); + if (function_exists('mb_convert_variables')) mb_convert_variables("UTF-8","ISO-8559-1",$value['name']); # iso 2 UTF8 + //if (mb_convert_variables("ISO-8859-1","UTF-8",$value['name'])){echo "Juhu utf8 2 ISO\n";}; + //echo $value['name']."\n"; + $filename=htmlentities($value['name'], ENT_QUOTES, $detectedCharSet); + + $this->t->set_var('row_color',$this->rowColor[($key+1)%2]); + $this->t->set_var('filename',($value['name'] ? ( $filename ? $filename : $value['name'] ) : lang('(no subject)'))); + $this->t->set_var('mimetype',mime_magic::mime2label($value['mimeType'])); + $this->t->set_var('size',egw_vfs::hsize($value['size'])); + $this->t->set_var('attachment_number',$key); + + switch(strtoupper($value['mimeType'])) + { + case 'MESSAGE/RFC822': + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.display', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'mailbox' => base64_encode($this->mailbox), + 'is_winmail' => $value['is_winmail'] + ); + $windowName = 'displayMessage_'. $this->uid.'_'.$value['partID']; + $linkView = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',700,screen.availHeight-50);"; + break; + case 'IMAGE/JPEG': + case 'IMAGE/PNG': + case 'IMAGE/GIF': + case 'IMAGE/BMP': + case 'APPLICATION/PDF': + case 'TEXT/PLAIN': + case 'TEXT/HTML': + case 'TEXT/CALENDAR': + case 'TEXT/X-VCALENDAR': + case 'TEXT/X-VCARD': + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'is_winmail' => $value['is_winmail'], + 'mailbox' => base64_encode($this->mailbox), + ); + $windowName = 'displayAttachment_'. $this->uid; + $reg = '800x600'; + // handle calendar/vcard + if (strtoupper($value['mimeType'])=='TEXT/CALENDAR' || strtoupper($value['mimeType'])=='TEXT/X-VCALENDAR') + { + $windowName = 'displayEvent_'. $this->uid; + $reg2 = egw_link::get_registry('calendar','view_popup'); + } + if (strtoupper($value['mimeType'])=='TEXT/X-VCARD') + { + $windowName = 'displayContact_'. $this->uid; + $reg2 = egw_link::get_registry('addressbook','add_popup'); + } + // apply to action + list($width,$height) = explode('x',(!empty($reg2) ? $reg2 : $reg)); + $linkView = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',$width,$height);"; + break; + default: + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'is_winmail' => $value['is_winmail'], + 'mailbox' => base64_encode($this->mailbox), + ); + $linkView = "window.location.href = '".$GLOBALS['egw']->link('/index.php',$linkData)."';"; + break; + } + $this->t->set_var("link_view",$linkView); + $this->t->set_var("target",$target); + + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'mode' => 'save', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'is_winmail' => $value['is_winmail'], + 'mailbox' => base64_encode($this->mailbox), + ); + $this->t->set_var("link_save",$GLOBALS['egw']->link('/index.php',$linkData)); + + if ($GLOBALS['egw_info']['user']['apps']['filemanager']) + { + $link_vfs_save = egw::link('/index.php',array( + 'menuaction' => 'filemanager.filemanager_select.select', + 'mode' => 'saveas', + 'name' => $value['name'], + 'mime' => strtolower($value['mimeType']), + 'method' => 'felamimail.uidisplay.vfsSaveAttachment', + 'id' => $this->mailbox.'::'.$this->uid.'::'.$value['partID'].'::'.$value['is_winmail'], + 'label' => lang('Save'), + )); + $vfs_save = "$url_img_vfs"; + // add save-all icon for first attachment + if (!$key && count($attachments) > 1) + { + foreach ($attachments as $key => $value) + { + $ids["id[$key]"] = $this->mailbox.'::'.$this->uid.'::'.$value['partID'].'::'.$value['is_winmail'].'::'.$value['name']; + } + $link_vfs_save = egw::link('/index.php',array( + 'menuaction' => 'filemanager.filemanager_select.select', + 'mode' => 'select-dir', + 'method' => 'felamimail.uidisplay.vfsSaveAttachment', + 'label' => lang('Save all'), + )+$ids); + $vfs_save .= "\n$url_img_vfs_save_all"; + } + $this->t->set_var('vfs_save',$vfs_save); + } + else + { + $this->t->set_var('vfs_save',''); + } + $this->t->parse('attachment_rows','message_attachement_row',True); + } + } else { + $this->t->set_var('attachment_rows',''); + } + + $this->t->pparse('out','message_main_attachment'); + + } + + function displayImage() + { + $cid = base64_decode($_GET['cid']); + $partID = urldecode($_GET['partID']); + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + + $this->bofelamimail->reopen($this->mailbox); + + $attachment = $this->bofelamimail->getAttachmentByCID($this->uid, $cid, $partID); + + $this->bofelamimail->closeConnection(); + + $GLOBALS['egw']->session->commit_session(); + + if(is_array($attachment)) { + //error_log("Content-Type: ".$attachment['type']."; name=\"". $attachment['filename'] ."\""); + header ("Content-Type: ". strtolower($attachment['type']) ."; name=\"". $attachment['filename'] ."\""); + header ('Content-Disposition: inline; filename="'. $attachment['filename'] .'"'); + header("Expires: 0"); + // the next headers are for IE and SSL + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Pragma: public"); + + echo trim($attachment['attachment']); + exit; + } + + $GLOBALS['egw']->common->egw_exit(); + + exit; + } + + function display_app_header($printing = NULL) + { + if ($_GET['menuaction'] != 'felamimail.uidisplay.printMessage' && + $_GET['menuaction'] != 'felamimail.uidisplay.displayBody' && + $_GET['menuaction'] != 'felamimail.uidisplay.displayAttachments' && + empty($printing)) + { + egw_framework::validate_file('tabs','tabs'); + egw_framework::validate_file('jscode','view_message','felamimail'); + $GLOBALS['egw']->js->set_onload('javascript:initAll();'); + } + + if(($_GET['menuaction'] == 'felamimail.uidisplay.printMessage') || (!empty($printing) && $printing == 1)) { + $GLOBALS['egw']->js->set_onload('javascript:updateTitle();javascript:window.print();'); + } + + if($_GET['menuaction'] == 'felamimail.uidisplay.printMessage' || (!empty($printing) && $printing == 1) || + $_GET['menuaction'] == 'felamimail.uidisplay.displayBody' || + $_GET['menuaction'] == 'felamimail.uidisplay.displayAttachments' ) { + $GLOBALS['egw_info']['flags']['nofooter'] = true; + } + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + common::egw_header(); + } + + static function get_email_header($additionalStyle='') + { + //error_log(__METHOD__.__LINE__.$additionalStyle); + return ' + + + + + '.$additionalStyle.' + + +'; + } + + function get_load_email_data($uid, $partID) + { + // seems to be needed, as if we open a mail from notification popup that is + // located in a different folder, we experience: could not parse message + $this->bofelamimail->reopen($this->mailbox); + + $bodyParts = $this->bofelamimail->getMessageBody($uid, '', $partID); + //error_log(__METHOD__.__LINE__.array2string($bodyParts)); + $meetingRequest = false; + $attachments = $this->bofelamimail->getMessageAttachments($uid, $partID, '',false,true); + foreach ((array)$attachments as $key => $attach) + { + if (strtolower($attach['mimeType']) == 'text/calendar' && strtolower($attach['method']) == 'request' && + isset($GLOBALS['egw_info']['user']['apps']['calendar']) && + ($attachment = $this->bofelamimail->getAttachment($uid, $attach['partID']))) + { + egw_cache::setSession('calendar', 'ical', array( + 'charset' => $attach['charset'] ? $attach['charset'] : 'utf-8', + 'attachment' => $attachment['attachment'], + 'method' => $attach['method'], + )); + return array("src"=>egw::link('/index.php',array( + 'menuaction' => 'calendar.calendar_uiforms.meeting', + 'ical' => 'session', + ))); + } + } + + // Compose the content of the frame + $frameHtml = + $this->get_email_header($this->bofelamimail->getStyles($bodyParts)). + $this->showBody($this->getdisplayableBody($bodyParts), false); + + // Calculate the hash of that E-Mail for function identification + $hash = md5($frameHtml); + + // The JS function name consists of a prefix and the hash suffix + $funcname = "load_email_$hash"; + + // Compose the script code + $script = +""; + + // Compose the code for the onload event + $onload = "if (typeof $funcname != 'undefined'){ $funcname(this); this.onload = function() {return false;}}"; + + // Return all the stuff + return array( + "script" => $script, + "onload" => $onload, + "src" => egw::link("/phpgwapi/js/egw_instant_load.html") + ); + } + + static function emailAddressToHTML($_emailAddress, $_organisation='', $allwaysShowMailAddress=false, $showAddToAdrdessbookLink=true, $decode=true) { + //_debug_array($_emailAddress); + // create some nice formated HTML for senderaddress + #if($_emailAddress['EMAIL'] == 'undisclosed-recipients: ;') + # return $_emailAddress['EMAIL']; + + #$addressData = imap_rfc822_parse_adrlist + # ($this->bofelamimail->decode_header($_emailAddress),''); + if(is_array($_emailAddress)) { + $senderAddress = ''; + foreach($_emailAddress as $addressData) { + #_debug_array($addressData); + if($addressData['MAILBOX_NAME'] == 'NIL') { + continue; + } + + if(!empty($senderAddress)) $senderAddress .= ', '; + + if(strtolower($addressData['MAILBOX_NAME']) == 'undisclosed-recipients') { + $senderAddress .= 'undisclosed-recipients'; + continue; + } + if($addressData['PERSONAL_NAME'] != 'NIL') { + $newSenderAddressORG = $newSenderAddress = $addressData['RFC822_EMAIL'] != 'NIL' ? $addressData['RFC822_EMAIL'] : $addressData['EMAIL']; + $decodedPersonalNameORG = $decodedPersonalName = $addressData['PERSONAL_NAME']; + if ($decode) + { + $newSenderAddress = felamimail_bo::decode_header($newSenderAddressORG); + $decodedPersonalName = felamimail_bo::decode_header($decodedPersonalName); + $addressData['EMAIL'] = felamimail_bo::decode_header($addressData['EMAIL']); + } + $realName = $decodedPersonalName; + // add mailaddress + if ($allwaysShowMailAddress) { + $realName .= ' <'.$addressData['EMAIL'].'>'; + $decodedPersonalNameORG .= ' <'.$addressData['EMAIL'].'>'; + } + // add organization + if(!empty($_organisation)) { + $realName .= ' ('. $_organisation . ')'; + $decodedPersonalNameORG .= ' ('. $_organisation . ')'; + } + + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.compose', + 'send_to' => base64_encode($newSenderAddress) + ); + $link = $GLOBALS['egw']->link('/index.php',$linkData); + + $newSenderAddress = felamimail_bo::htmlentities($newSenderAddress); + $realName = felamimail_bo::htmlentities($realName); + + $senderAddress .= sprintf('%s', + $link, + $newSenderAddress, + $realName); + + $linkData = array ( + 'menuaction' => 'addressbook.addressbook_ui.edit', + 'presets[email]' => $addressData['EMAIL'], + 'presets[org_name]' => $_organisation, + 'referer' => $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'] + ); + + $decodedPersonalName = $realName; + if (!empty($decodedPersonalName)) { + if($spacePos = strrpos($decodedPersonalName, ' ')) { + $linkData['presets[n_family]'] = substr($decodedPersonalName, $spacePos+1); + $linkData['presets[n_given]'] = substr($decodedPersonalName, 0, $spacePos); + } else { + $linkData['presets[n_family]'] = $decodedPersonalName; + } + $linkData['presets[n_fn]'] = $decodedPersonalName; + } + + if ($showAddToAdrdessbookLink && $GLOBALS['egw_info']['user']['apps']['addressbook']) { + $urlAddToAddressbook = $GLOBALS['egw']->link('/index.php',$linkData); + $onClick = "window.open(this,this.target,'dependent=yes,width=850,height=440,location=no,menubar=no,toolbar=no,scrollbars=yes,status=yes'); return false;"; + $image = $GLOBALS['egw']->common->image('felamimail','sm_envelope'); + $senderAddress .= sprintf(' + %s', + $urlAddToAddressbook, + $onClick, + $image, + lang('add to addressbook'), + lang('add to addressbook')); + } + } else { + $addrEMailORG = $addrEMail = $addressData['EMAIL']; + if ($decode) $addrEMail = felamimail_bo::decode_header($addrEMail); + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.compose', + 'send_to' => base64_encode($addressData['EMAIL']) + ); + $link = $GLOBALS['egw']->link('/index.php',$linkData); + $senderEMail = felamimail_bo::htmlentities($addrEMail); + $senderAddress .= sprintf('%s', + $link,$senderEMail); + //TODO: This uses old addressbook code, which should be removed in Version 1.4 + //Please use addressbook.addressbook_ui.edit with proper paramenters + $linkData = array + ( + 'menuaction' => 'addressbook.addressbook_ui.edit', + 'presets[email]' => $senderEMail, //$addressData['EMAIL'], + 'presets[org_name]' => $_organisation, + 'referer' => $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'] + ); + + if ($showAddToAdrdessbookLink && $GLOBALS['egw_info']['user']['apps']['addressbook']) { + $urlAddToAddressbook = $GLOBALS['egw']->link('/index.php',$linkData); + $onClick = "window.open(this,this.target, 'dependent=yes, width=850, height=440, location=no, menubar=no, toolbar=no, scrollbars=yes, status=yes'); return false;"; + $image = $GLOBALS['egw']->common->image('felamimail','sm_envelope'); + $senderAddress .= sprintf(' + %s', + $urlAddToAddressbook, + $onClick, + $image, + lang('add to addressbook'), + lang('add to addressbook')); + } + } + } + return $senderAddress; + } + + // if something goes wrong, just return the original address + return $_emailAddress; + } + + /** + * Save an attachment in the vfs + * + * @param string|array $ids '::' delemited mailbox::uid::part-id::is_winmail::name (::name for multiple id's) + * @param string $path path in vfs (no egw_vfs::PREFIX!), only directory for multiple id's ($ids is an array) + * @return string javascript eg. to close the selector window + */ + function vfsSaveAttachment($ids,$path) + { + //return "alert('".__METHOD__.'("'.array2string($id).'","'.$path."\")'); window.close();"; + + if (is_array($ids) && !egw_vfs::is_writable($path) || !is_array($ids) && !egw_vfs::is_writable(dirname($path))) + { + return 'alert("'.addslashes(lang('%1 is NOT writable by you!',$path)).'"); window.close();'; + } + foreach((array)$ids as $id) + { + list($this->mailbox,$this->uid,$part,$is_winmail,$name) = explode('::',$id,5); + if ($mb != $this->mailbox) $this->bofelamimail->reopen($mb = $this->mailbox); + $attachment = $this->bofelamimail->getAttachment($this->uid,$part,$is_winmail); + + if (!($fp = egw_vfs::fopen($file=$path.($name ? '/'.$name : ''),'wb')) || + !fwrite($fp,$attachment['attachment'])) + { + $err .= 'alert("'.addslashes(lang('Error saving %1!',$file)).'");'; + } + if ($fp) fclose($fp); + } + $this->bofelamimail->closeConnection(); + + return $err.'window.close();'; + } + + function getAttachment() + { + + $part = $_GET['part']; + $is_winmail = $_GET['is_winmail'] ? $_GET['is_winmail'] : 0; + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + + $this->bofelamimail->reopen($this->mailbox); + #$attachment = $this->bofelamimail->getAttachment($this->uid,$part); + $attachment = $this->bofelamimail->getAttachment($this->uid,$part,$is_winmail); + $this->bofelamimail->closeConnection(); + + $GLOBALS['egw']->session->commit_session(); + if ($_GET['mode'] != "save") + { + //error_log(__METHOD__.print_r($attachment,true)); + if (strtoupper($attachment['type']) == 'TEXT/CALENDAR' || strtoupper($attachment['type']) == 'TEXT/X-VCALENDAR') + { + //error_log(__METHOD__."about to call calendar_ical"); + $calendar_ical = new calendar_ical(); + $eventid = $calendar_ical->search($attachment['attachment'],-1); + //error_log(__METHOD__.array2string($eventid)); + if (!$eventid) $eventid = -1; + $event = $calendar_ical->importVCal($attachment['attachment'],(is_array($eventid)?$eventid[0]:$eventid),null,true); + //error_log(__METHOD__.$event); + if ((int)$event > 0) + { + $vars = array( + 'menuaction' => 'calendar.calendar_uiforms.edit', + 'cal_id' => $event, + ); + $GLOBALS['egw']->redirect_link('../index.php',$vars); + } + //Import failed, download content anyway + } + if (strtoupper($attachment['type']) == 'TEXT/X-VCARD') + { + $addressbook_vcal = new addressbook_vcal(); + $vcard = $addressbook_vcal->vcardtoegw($attachment['attachment']); + //error_log(print_r($vcard,true)); + if ($vcard['uid']) $contact = $addressbook_vcal->find_contact($vcard,false); + if (!$contact) $contact = null; + // if there are not enough fields in the vcard (or the parser was unable to correctly parse the vcard (as of VERSION:3.0 created by MSO)) + if ($contact || count($vcard)>2) $contact = $addressbook_vcal->addVCard($attachment['attachment'],$contact,true); + //error_log(__METHOD__.$contact); + if ((int)$contact > 0) + { + $vars = array( + 'menuaction' => 'addressbook.addressbook_ui.edit', + 'contact_id' => $contact, + ); + $GLOBALS['egw']->redirect_link('../index.php',$vars); + } + //Import failed, download content anyway + } + } + header ("Content-Type: ".$attachment['type']."; name=\"". $attachment['filename'] ."\""); + if($_GET['mode'] == "save") { + // ask for download + header ("Content-Disposition: attachment; filename=\"". $attachment['filename'] ."\""); + } else { + // display it + header ("Content-Disposition: inline; filename=\"". $attachment['filename'] ."\""); + } + header("Expires: 0"); + // the next headers are for IE and SSL + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Pragma: public"); + + echo $attachment['attachment']; + + $GLOBALS['egw']->common->egw_exit(); + exit; + } + + function &getdisplayableBody($_bodyParts,$modifyURI=true) + { + $bodyParts = $_bodyParts; + + $webserverURL = $GLOBALS['egw_info']['server']['webserver_url']; + + $nonDisplayAbleCharacters = array('[\016]','[\017]', + '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]', + '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]'); + + $body = ''; + + //error_log(__METHOD__.array2string($bodyParts)); //exit; + if (empty($bodyParts)) return ""; + foreach((array)$bodyParts as $singleBodyPart) { + if (!isset($singleBodyPart['body'])) { + $singleBodyPart['body'] = $this->getdisplayableBody($singleBodyPart,$modifyURI); + $body .= $singleBodyPart['body']; + continue; + } + if(!empty($body)) { + $body .= '
    '; + } + //_debug_array($singleBodyPart['charSet']); + //_debug_array($singleBodyPart['mimeType']); + //error_log($singleBodyPart['body']); + //error_log(__METHOD__.__LINE__.' CharSet:'.$singleBodyPart['charSet'].' mimeType:'.$singleBodyPart['mimeType']); + // some characterreplacements, as they fail to translate + $sar = array( + '@(\x84|\x93|\x94)@', + '@(\x96|\x97)@', + '@(\x82|\x91|\x92)@', + '@(\x85)@', + '@(\x86)@', + '@(\x99)@', + '@(\xae)@', + ); + $rar = array( + '"', + '-', + '\'', + '...', + '&', + '(TM)', + '(R)', + ); + + if(($singleBodyPart['mimeType'] == 'text/html' || $singleBodyPart['mimeType'] == 'text/plain') && + strtoupper($singleBodyPart['charSet']) != 'UTF-8') + { + $singleBodyPart['body'] = preg_replace($sar,$rar,$singleBodyPart['body']); + } + if ($singleBodyPart['charSet']===false) $singleBodyPart['charSet'] = felamimail_bo::detect_encoding($singleBodyPart['body']); + $singleBodyPart['body'] = $GLOBALS['egw']->translation->convert( + $singleBodyPart['body'], + strtolower($singleBodyPart['charSet']) + ); + // in a way, this tests if we are having real utf-8 (the displayCharset) by now; we should if charsets reported (or detected) are correct + if (strtoupper($this->displayCharset) == 'UTF-8') + { + $test = json_encode($singleBodyPart['body']); + //error_log(__METHOD__.__LINE__.'#'.$test.'# ->'.strlen($singleBodyPart['body']).' Error:'.json_last_error()); + //if (json_last_error() != JSON_ERROR_NONE && strlen($singleBodyPart['body'])>0) + if ($test=="null" && strlen($singleBodyPart['body'])>0) + { + // this should not be needed, unless something fails with charset detection/ wrong charset passed + error_log(__METHOD__.__LINE__.' Charset Reported:'.$singleBodyPart['charSet'].' Carset Detected:'.felamimail_bo::detect_encoding($singleBodyPart['body'])); + $singleBodyPart['body'] = utf8_encode($singleBodyPart['body']); + } + } + //error_log($singleBodyPart['body']); + #$CharSetUsed = mb_detect_encoding($singleBodyPart['body'] . 'a' , strtoupper($singleBodyPart['charSet']).','.strtoupper($this->displayCharset).',UTF-8, ISO-8859-1'); + + if($singleBodyPart['mimeType'] == 'text/plain') + { + //$newBody = $singleBodyPart['body']; + + $newBody = @htmlentities($singleBodyPart['body'],ENT_QUOTES, strtoupper($this->displayCharset)); + // if empty and charset is utf8 try sanitizing the string in question + if (empty($newBody) && strtolower($singleBodyPart['charSet'])=='utf-8') $newBody = @htmlentities(iconv('utf-8', 'utf-8', $singleBodyPart['body']),ENT_QUOTES, strtoupper($this->displayCharset)); + // if the conversion to htmlentities fails somehow, try without specifying the charset, which defaults to iso- + if (empty($newBody)) $newBody = htmlentities($singleBodyPart['body'],ENT_QUOTES); + #$newBody = $this->bofelamimail->wordwrap($newBody, 90, "\n"); + + // search http[s] links and make them as links available again + // to understand what's going on here, have a look at + // http://www.php.net/manual/en/function.preg-replace.php + + // create links for websites + if ($modifyURI) $newBody = html::activate_links($newBody); + // redirect links for websites if you use no cookies + #if (!($GLOBALS['egw_info']['server']['usecookies'])) + # $newBody = preg_replace("/href=(\"|\')((http(s?):\/\/)|(www\.))([\w,\-,\/,\?,\=,\.,&,!\n,\%,@,\(,\),\*,#,:,~,\+]+)(\"|\')/ie", + # "'href=\"$webserverURL/redirect.php?go='.@htmlentities(urlencode('http$4://$5$6'),ENT_QUOTES,\"$this->displayCharset\").'\"'", $newBody); + + // create links for email addresses + if ($modifyURI) $this->parseEmail($newBody); + // create links for inline images + if ($modifyURI) + { + $newBody = preg_replace_callback("/\[cid:(.*)\]/iU",array($this,'image_callback_plain'),$newBody); + } + + $newBody = $this->highlightQuotes($newBody); + // to display a mailpart of mimetype plain/text, may be better taged as preformatted + #$newBody = nl2br($newBody); + // since we do not display the message as HTML anymore we may want to insert good linebreaking (for visibility). + //error_log($newBody); + // dont break lines that start with > (> as the text was processed with htmlentities before) + $newBody = "
    ".felamimail_bo::wordwrap($newBody,90,"\n",'>')."
    "; + //$newBody = "
    ".$newBody."
    "; + } + else + { + $newBody = $singleBodyPart['body']; + $newBody = $this->highlightQuotes($newBody); + #error_log(print_r($newBody,true)); + + // do the cleanup, set for the use of purifier + $usepurifier = true; + felamimail_bo::getCleanHTML($newBody,$usepurifier); + // removes stuff between http and ?http + $Protocol = '(http:\/\/|(ftp:\/\/|https:\/\/))'; // only http:// gets removed, other protocolls are shown + $newBody = preg_replace('~'.$Protocol.'[^>]*\?'.$Protocol.'~sim','$1',$newBody); // removes stuff between http:// and ?http:// + // TRANSFORM MAILTO LINKS TO EMAILADDRESS ONLY, WILL BE SUBSTITUTED BY parseEmail TO CLICKABLE LINK + $newBody = preg_replace('/(?parseHREF($newBody); + #} + // create links for inline images + if ($modifyURI) + { + $newBody = preg_replace_callback("/src=(\"|\')cid:(.*)(\"|\')/iU",array($this,'image_callback'),$newBody); + } + + // create links for email addresses + if ($modifyURI) + { + $link = $GLOBALS['egw']->link('/index.php',array('menuaction' => 'felamimail.uicompose.compose')); + $newBody = preg_replace("/href=(\"|\')mailto:([\w,\-,\/,\?,\=,\.,&,!\n,\%,@,\*,#,:,~,\+]+)(\"|\')/ie", + "'href=\"#\"'.' onclick=\"egw_openWindowCentered(\'$link&send_to='.base64_encode('$2').'\', \'compose\', 700, egw_getWindowOuterHeight());\"'", $newBody); +// "'href=\"$link&send_to='.base64_encode('$2').'\"'", $newBody); + //print "
    ".htmlentities($newBody)."

    "; + } + // replace emails within the text with clickable links. + $this->parseEmail($newBody); + } + $body .= $newBody; + #print "
    $body

    "; + } + // create links for windows shares + // \\\\\\\\ == '\\' in real life!! :) + $body = preg_replace("/(\\\\\\\\)([\w,\\\\,-]+)/i", + "$1$2", $body); + + $body = preg_replace($nonDisplayAbleCharacters,'',$body); + + return $body; + } + + /** + * preg_replace callback to replace image cid url's + * + * @param array $matches matches from preg_replace("/src=(\"|\')cid:(.*)(\"|\')/iU",...) + * @return string src attribute to replace + */ + function image_callback($matches) + { + static $cache = array(); // some caching, if mails containing the same image multiple times + + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.displayImage', + 'uid' => $this->uid, + 'mailbox' => base64_encode($this->mailbox), + 'cid' => base64_encode($matches[2]), + 'partID' => $this->partID, + ); + $imageURL = $GLOBALS['egw']->link('/index.php', $linkData); + + // to test without data uris, comment the if close incl. it's body + if (html::$user_agent != 'msie' || html::$ua_version >= 8) + { + if (!isset($cache[$imageURL])) + { + $attachment = $this->bofelamimail->getAttachmentByCID($this->uid, $matches[2], $this->partID); + + // only use data uri for "smaller" images, as otherwise the first display of the mail takes to long + if (bytes($attachment['attachment']) < 8192) // msie=8 allows max 32k data uris + { + $cache[$imageURL] = 'data:'.$attachment['type'].';base64,'.base64_encode($attachment['attachment']); + } + else + { + $cache[$imageURL] = $imageURL; + } + } + $imageURL = $cache[$imageURL]; + } + return 'src="'.$imageURL.'"'; + } + + /** + * preg_replace callback to replace image cid url's + * + * @param array $matches matches from preg_replace("/src=(\"|\')cid:(.*)(\"|\')/iU",...) + * @return string src attribute to replace + */ + function image_callback_plain($matches) + { + static $cache = array(); // some caching, if mails containing the same image multiple times + //error_log(__METHOD__.__LINE__.array2string($matches)); + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.displayImage', + 'uid' => $this->uid, + 'mailbox' => base64_encode($this->mailbox), + 'cid' => base64_encode($matches[1]), + 'partID' => $this->partID, + ); + $imageURL = $GLOBALS['egw']->link('/index.php', $linkData); + + // to test without data uris, comment the if close incl. it's body + if (html::$user_agent != 'msie' || html::$ua_version >= 8) + { + if (!isset($cache[$imageURL])) + { + $attachment = $this->bofelamimail->getAttachmentByCID($this->uid, $matches[1], $this->partID); + + // only use data uri for "smaller" images, as otherwise the first display of the mail takes to long + if (bytes($attachment['attachment']) < 8192) // msie=8 allows max 32k data uris + { + $cache[$imageURL] = 'data:'.$attachment['type'].';base64,'.base64_encode($attachment['attachment']); + } + else + { + $cache[$imageURL] = $imageURL; + } + } + $imageURL = $cache[$imageURL]; + } + return ''; + } + + function printMessage($messageId = NULL, $callfromcompose = NULL) + { + if (!empty($messageId) && empty($this->uid)) $this->uid = $messageId; + $partID = $this->partID = $_GET['part']; + if (!empty($_GET['folder'])) $this->mailbox = base64_decode($_GET['folder']); + + //$transformdate =& CreateObject('felamimail.transformdate'); + //$htmlFilter =& CreateObject('felamimail.htmlfilter'); + //$uiWidgets =& CreateObject('felamimail.uiwidgets'); + // (regis) seems to be necessary to reopen... + $folder = $this->mailbox; + // the folder for callfromcompose is hardcoded, because the message to be printed from the compose window is saved as draft, and can be + // reopened for composing (only) from there + if ($callfromcompose) + { + if (isset($this->mailPreferences->preferences['draftFolder']) && + $this->mailPreferences->preferences['draftFolder'] != 'none') + { + $folder = $this->mailPreferences->preferences['draftFolder']; + } + else + { + $folder = $GLOBALS['egw_info']['user']['preferences']['felamimail']['draftFolder']; + } + } + $this->bofelamimail->reopen($folder); +# print "$this->mailbox, $this->uid, $partID
    "; + $headers = $this->bofelamimail->getMessageHeader($this->uid, $partID); + $envelope = $this->bofelamimail->getMessageEnvelope($this->uid, $partID,true); +# _debug_array($headers);exit; + $rawheaders = $this->bofelamimail->getMessageRawHeader($this->uid, $partID); + $bodyParts = $this->bofelamimail->getMessageBody($this->uid,'',$partID); + $attachments = $this->bofelamimail->getMessageAttachments($this->uid,$partID, '',true); +# _debug_array($nextMessage); exit; + + $webserverURL = $GLOBALS['egw_info']['server']['webserver_url']; + + $nonDisplayAbleCharacters = array('[\016]','[\017]', + '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]', + '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]'); + + #print "
    ";print_r($rawheaders);print"
    ";exit; + + // add line breaks to $rawheaders + $newRawHeaders = explode("\n",$rawheaders); + reset($newRawHeaders); + + // find the Organization header + // the header can also span multiple rows + while(is_array($newRawHeaders) && list($key,$value) = each($newRawHeaders)) { + #print $value."
    "; + if(preg_match("/Organization: (.*)/",$value,$matches)) { + $organization = $this->bofelamimail->decode_header(chop($matches[1])); + continue; + } + if(!empty($organization) && preg_match("/^\s+(.*)/",$value,$matches)) { + $organization .= $this->bofelamimail->decode_header(chop($matches[1])); + break; + } elseif(!empty($organization)) { + break; + } + } + + $this->bofelamimail->closeConnection(); + + $this->display_app_header($callfromcompose); + $this->t->set_file(array("displayMsg" => "view_message_printable.tpl")); + # $this->t->set_var('charset',$GLOBALS['egw']->translation->charset()); + + $this->t->set_block('displayMsg','message_main'); + # $this->t->set_block('displayMsg','message_main_attachment'); + $this->t->set_block('displayMsg','message_header'); + # $this->t->set_block('displayMsg','message_raw_header'); + # $this->t->set_block('displayMsg','message_navbar'); + $this->t->set_block('displayMsg','message_onbehalfof'); + $this->t->set_block('displayMsg','message_cc'); + $this->t->set_block('displayMsg','message_attachement_row'); + # $this->t->set_block('displayMsg','previous_message_block'); + # $this->t->set_block('displayMsg','next_message_block'); + $this->t->set_block('displayMsg','message_org'); + + # $this->t->egroupware_hack = False; + + $this->translate(); + + if($envelope['FROM'][0] != $envelope['SENDER'][0]) { + $senderAddress = self::emailAddressToHTML($envelope['SENDER'], '', true, false,false); + $fromAddress = self::emailAddressToHTML($envelope['FROM'], $organization, true, false,false); + $this->t->set_var("from_data",$senderAddress); + $this->t->set_var("onbehalfof_data",$fromAddress); + $this->t->parse('on_behalf_of_part','message_onbehalfof',True); + } else { + $fromAddress = self::emailAddressToHTML($envelope['FROM'], $organization, true, false,false); + $this->t->set_var("from_data", $fromAddress); + $this->t->set_var('on_behalf_of_part',''); + } + + // parse the to header + $toAddress = self::emailAddressToHTML($envelope['TO'], '', true, false,false); + $this->t->set_var("to_data",$toAddress); + + // parse the cc header + if(count($envelope['CC'])) { + $ccAddress = self::emailAddressToHTML($envelope['CC'], '', true, false,false); + $this->t->set_var("cc_data",$ccAddress); + $this->t->parse('cc_data_part','message_cc',True); + } else { + $this->t->set_var("cc_data_part",''); + } + $this->t->set_var("date_data", + @htmlspecialchars(felamimail_bo::_strtotime($headers['DATE'],$GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],true).' - '.felamimail_bo::_strtotime($headers['DATE'],($GLOBALS['egw_info']['user']['preferences']['common']['timeformat']==12?'h:i:s a':'H:i:s'),true), ENT_QUOTES,$this->displayCharset)); + // link to go back to the message view. the link differs if the print was called from a normal viewing window, or from compose + $subject = felamimail_bo::htmlspecialchars($this->bofelamimail->decode_subject(preg_replace($nonDisplayAbleCharacters, '', $envelope['SUBJECT']),false), $this->displayCharset); + $this->t->set_var("subject_data", $subject); + $this->t->set_var("full_subject_data", $subject); + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.display', + 'showHeader' => 'false', + 'mailbox' => base64_encode($folder), + 'uid' => $this->uid, + 'id' => $this->id, + ); + if ($callfromcompose) { + $linkData['menuaction'] = 'felamimail.uicompose.composeFromDraft'; + $linkData['folder'] = base64_encode($folder); + } + $_readInNewWindow = $this->mailPreferences->preferences['message_newwindow']; + $this->t->set_var('url_read_message', $GLOBALS['egw']->link('/index.php',$linkData)); + + $target = 'displayMessage'; + $windowName = ($_readInNewWindow == 1 ? $target : $target.'_'.$this->uid); + #if ($callfromcompose) $target = 'composeFromDraft'; + if ($callfromcompose) $windowName = '_top'; + $this->t->set_var('read_message_windowName', $windowName); + + //if(isset($organization)) exit; + $this->t->parse("header","message_header",True); + + $this->t->set_var('body', $this->getdisplayableBody($bodyParts)); + + // attachments + /* + if(is_array($attachments)) + $this->t->set_var('attachment_count',count($attachments)); + else + $this->t->set_var('attachment_count','0'); + */ + if (is_array($attachments) && count($attachments) > 0) { + $this->t->set_var('row_color',$this->rowColor[0]); + $this->t->set_var('name',lang('name')); + $this->t->set_var('type',lang('type')); + $this->t->set_var('size',lang('size')); + $this->t->set_var('url_img_save',$GLOBALS['egw']->common->image('felamimail','fileexport')); + #$this->t->parse('attachment_rows','attachment_row_bold',True); + foreach ($attachments as $key => $value) { + $this->t->set_var('row_color',$this->rowColor[($key+1)%2]); + $this->t->set_var('filename',@htmlentities($this->bofelamimail->decode_header($value['name']),ENT_QUOTES,$this->displayCharset)); + $this->t->set_var('mimetype',$value['mimeType']); + $this->t->set_var('size',$value['size']); + $this->t->set_var('attachment_number',$key); + + switch(strtolower($value['mimeType'])) + { + case 'message/rfc822': + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.display', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'mailbox' => base64_encode($folder), + ); + $windowName = 'displayMessage_'.$this->uid; + $linkView = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',700,egw_getWindowOuterHeight());"; + break; + case 'image/jpeg': + case 'image/png': + case 'image/gif': + case 'image/bmp': + #case 'application/pdf': + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'mailbox' => base64_encode($folder), + ); + $windowName = 'displayAttachment_'.$this->uid; + $linkView = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',800,600);"; + break; + default: + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'mailbox' => base64_encode($folder), + ); + $linkView = "window.location.href = '".$GLOBALS['egw']->link('/index.php',$linkData)."';"; + break; + } + $this->t->set_var("link_view",$linkView); + $this->t->set_var("target",$target); + + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'mode' => 'save', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'mailbox' => base64_encode($folder), + ); + $this->t->set_var("link_save",$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->parse('attachment_rows','message_attachement_row',True); + } + } + else + { + $this->t->set_var('attachment_rows',''); + } + + #$this->t->pparse("out","message_attachment_rows"); + + // print it out + # if(is_array($attachments)) { + # $this->t->pparse('out','message_main_attachment'); + # } else { + $this->t->pparse('out','message_main'); + # } + print ""; + + } + + function saveMessage() + { + $partID = $_GET['part']; + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + + // (regis) seems to be necessary to reopen... + $this->bofelamimail->reopen($this->mailbox); + + $message = $this->bofelamimail->getMessageRawBody($this->uid, $partID); + $headers = $this->bofelamimail->getMessageHeader($this->uid, $partID); + + $this->bofelamimail->closeConnection(); + + $GLOBALS['egw']->session->commit_session(); + $subject = str_replace('$$','__',$headers['SUBJECT']); + header ("Content-Type: message/rfc822; name=\"". $subject .".eml\""); + header ("Content-Disposition: attachment; filename=\"". $subject .".eml\""); + header("Expires: 0"); + // the next headers are for IE and SSL + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Pragma: public"); + + echo $message; + + $GLOBALS['egw']->common->egw_exit(); + exit; + } + + function showHeader() + { + if($this->bofelamimail->sessionData['showHeader'] == 'True') + { + $this->bofelamimail->sessionData['showHeader'] = 'False'; + } + else + { + $this->bofelamimail->sessionData['showHeader'] = 'True'; + } + $this->bofelamimail->saveSessionData(); + + $this->display(); + } + + function translate() + { + $this->t->set_var("lang_message_list",lang('Message List')); + $this->t->set_var("lang_to",lang('to')); + $this->t->set_var("lang_cc",lang('cc')); + $this->t->set_var("lang_bcc",lang('bcc')); + $this->t->set_var("lang_from",lang('from')); + $this->t->set_var("lang_reply_to",lang('reply to')); + $this->t->set_var("lang_subject",lang('subject')); + $this->t->set_var("lang_addressbook",lang('addressbook')); + $this->t->set_var("lang_search",lang('search')); + $this->t->set_var("lang_send",lang('send')); + $this->t->set_var("lang_back_to_folder",lang('back to folder')); + $this->t->set_var("lang_attachments",lang('attachments')); + $this->t->set_var("lang_add",lang('add')); + $this->t->set_var("lang_remove",lang('remove')); + $this->t->set_var("lang_priority",lang('priority')); + $this->t->set_var("lang_normal",lang('normal')); + $this->t->set_var("lang_high",lang('high')); + $this->t->set_var("lang_low",lang('low')); + $this->t->set_var("lang_signature",lang('signature')); + $this->t->set_var("lang_compose",lang('compose')); + $this->t->set_var("lang_date",lang('date')); + $this->t->set_var("lang_view",lang('view')); + $this->t->set_var("lang_organization",lang('organization')); + $this->t->set_var("lang_save",lang('save')); + $this->t->set_var("lang_printable",lang('print it')); + $this->t->set_var("lang_reply",lang('reply')); + $this->t->set_var("lang_reply_all",lang('reply all')); + $this->t->set_var("lang_forward",lang('forward')); + $this->t->set_var("lang_delete",lang('delete')); + $this->t->set_var("lang_previous_message",lang('previous message')); + $this->t->set_var("lang_next_message",lang('next message')); + $this->t->set_var("lang_organisation",lang('organisation')); + $this->t->set_var("lang_on_behalf_of",lang('on behalf of')); + $this->t->set_var("lang_Message", lang('Message')); + $this->t->set_var("lang_Attachment", lang('attachments')); + $this->t->set_var("lang_Header_Lines", lang('Header Lines')); + + $this->t->set_var("th_bg",$GLOBALS['egw_info']["theme"]["th_bg"]); + $this->t->set_var("bg01",$GLOBALS['egw_info']["theme"]["bg01"]); + $this->t->set_var("bg02",$GLOBALS['egw_info']["theme"]["bg02"]); + $this->t->set_var("bg03",$GLOBALS['egw_info']["theme"]["bg03"]); + } +} + +?> diff --git a/felamimail/inc/class.uifelamimail.inc.php b/felamimail/inc/class.uifelamimail.inc.php new file mode 100644 index 0000000000..ed16446637 --- /dev/null +++ b/felamimail/inc/class.uifelamimail.inc.php @@ -0,0 +1,1163 @@ + + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * FeLaMiMail user interface class, provides UI functionality for mainview + */ +class uifelamimail +{ + var $public_functions = array + ( + 'addVcard' => True, + 'changeFilter' => True, + 'changeFolder' => True, + 'changeSorting' => True, + 'compressFolder' => True, + 'importMessage' => True, + 'deleteMessage' => True, + 'undeleteMessage' => True, + 'hookAdmin' => True, + 'toggleFilter' => True, + 'viewMainScreen' => True, + 'redirectToPreferences' => True, + 'redirectToEmailadmin' => True, + ); + + var $mailbox; // the current folder in use + var $startMessage; // the first message to show + var $sort; // how to sort the messages + var $moveNeeded; // do we need to move some messages? + + var $timeCounter; + + // the object storing the data about the incoming imap server + static $icServerID; + var $connectionStatus = false; + var $bofelamimail; + var $bofilter; + var $bopreferences; + + function uifelamimail() + { + //error_log(__METHOD__); + // no autohide of the sidebox, as we use it for folderlist now. + unset($GLOBALS['egw_info']['user']['preferences']['common']['auto_hide_sidebox']); + $this->timeCounter = microtime(true); + if (!isset($GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID'])) + { + // globals preferences add appname varname value + $GLOBALS['egw']->preferences->add('felamimail','ActiveProfileID',0,'user'); + // save prefs + $GLOBALS['egw']->preferences->save_repository(true); + } + if (is_null(self::$icServerID)) self::$icServerID =& egw_cache::getSession('felamimail','activeProfileID'); + + $this->displayCharset = translation::charset(); + + if (isset($GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID'])) + self::$icServerID = (int)$GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID']; + + //error_log(__METHOD__.'->'.self::$icServerID); + $this->bofelamimail = felamimail_bo::getInstance(false,self::$icServerID); + + $this->bofilter = new felamimail_bofilter(false); + $this->bopreferences=& $this->bofelamimail->bopreferences; + $this->preferences =& $this->bofelamimail->mailPreferences; + + if (is_object($this->preferences)) + { + // account select box + $selectedID = $this->bofelamimail->getIdentitiesWithAccounts($identities); + // if nothing valid is found return to user defined account definition + if (empty($this->bofelamimail->icServer->host) && count($identities)==0 && $this->preferences->userDefinedAccounts) + { + // redirect to new personal account + egw::redirect_link('/index.php',array('menuaction'=>'felamimail.uipreferences.editAccountData', + 'accountID'=>"new", + 'msg' => lang("There is no IMAP Server configured.")." - ".lang("Please configure access to an existing individual IMAP account."), + )); + } + } + $this->bofelamimail->saveSessionData(); + + $this->mailbox = $this->bofelamimail->sessionData['mailbox']; + $this->startMessage = $this->bofelamimail->sessionData['startMessage']; + $this->sort = $this->bofelamimail->sessionData['sort']; + $this->sortReverse = $this->bofelamimail->sessionData['sortReverse']; + #$this->filter = $this->bofelamimail->sessionData['activeFilter']; + + $this->t = CreateObject('phpgwapi.Template',EGW_APP_TPL); + #$this->grants[$this->account] = EGW_ACL_READ + EGW_ACL_ADD + EGW_ACL_EDIT + EGW_ACL_DELETE; + // this need to fixed + // this does not belong to here + + if($_GET['menuaction'] != 'felamimail.uifelamimail.hookAdmin' && + $_GET['menuaction'] != 'felamimail.uifelamimail.changeFolder') { + $this->connectionStatus = $this->bofelamimail->openConnection(self::$icServerID); + } + + $this->rowColor[0] = $GLOBALS['egw_info']["theme"]["row_on"]; + $this->rowColor[1] = $GLOBALS['egw_info']["theme"]["row_off"]; + + $this->dataRowColor[0] = $GLOBALS['egw_info']["theme"]["bg01"]; + $this->dataRowColor[1] = $GLOBALS['egw_info']["theme"]["bg02"]; + #print __LINE__ . ': ' . (microtime(true) - $this->timeCounter) . '
    '; + } + + function redirectToPreferences () + { + $this->display_app_header(false); + //appname is a $_GET parameter, so the passing as function parameter does not work + ExecMethod('preferences.uisettings.index',array('appname'=>'felamimail')); + exit; + } + + function redirectToEmailadmin () + { + //$GLOBALS['egw_info']['flags']['currentapp'] = 'emailadmin'; + $this->display_app_header(false); + if (!file_exists(EGW_SERVER_ROOT.($et_css_file ='/etemplate/templates/'.$GLOBALS['egw_info']['user']['preferences']['common']['template_set'].'/app.css'))) + { + $et_css_file = '/etemplate/templates/default/app.css'; + } + echo ' +'; + + ExecMethod2('emailadmin.emailadmin_ui.index'); + exit; + } + + function addVcard() + { + error_log(__METHOD__." called from:".function_backtrace()); + $messageID = $_GET['messageID']; + $partID = $_GET['partID']; + $attachment = $this->bofelamimail->getAttachment($messageID,$partID); + + $tmpfname = tempnam ($GLOBALS['egw_info']['server']['temp_dir'], "egw_"); + $fp = fopen($tmpfname, "w"); + fwrite($fp, $attachment['attachment']); + fclose($fp); + + $vcard = CreateObject('phpgwapi.vcard'); + $entry = $vcard->in_file($tmpfname); + $entry['owner'] = $GLOBALS['egw_info']['user']['account_id']; + $entry['access'] = 'private'; + $entry['tid'] = 'n'; + + print quoted_printable_decode($entry['fn'])."
    "; + + unlink($tmpfname); + + $GLOBALS['egw']->common->egw_exit(); + } + + function changeFilter() + { + error_log(__METHOD__." called from:".function_backtrace()); + if(isset($_POST["filter"])) + { + $data['quickSearch'] = $_POST["quickSearch"]; + $data['filter'] = $_POST["filter"]; + $this->bofilter->updateFilter($data); + } + elseif(isset($_GET["filter"])) + { + $data['filter'] = $_GET["filter"]; + $this->bofilter->updateFilter($data); + } + $this->viewMainScreen(); + } + + function changeFolder() + { + // change folder + $this->bofelamimail->sessionData['mailbox'] = urldecode($_GET["mailbox"]); + $this->bofelamimail->sessionData['startMessage']= 1; + $this->bofelamimail->sessionData['sort'] = $this->preferences->preferences['sortOrder']; + $this->bofelamimail->sessionData['activeFilter']= -1; + + $this->bofelamimail->saveSessionData(); + + $this->mailbox = $this->bofelamimail->sessionData['mailbox']; + $this->startMessage = $this->bofelamimail->sessionData['startMessage']; + $this->sort = $this->bofelamimail->sessionData['sort']; + + $this->connectionStatus = $this->bofelamimail->openConnection(); + + $this->viewMainScreen(); + } + + function changeSorting() + { + error_log(__METHOD__." called from:".function_backtrace()); + // change sorting + if(isset($_GET["sort"])) + { + $this->bofelamimail->sessionData['sort'] = $_GET["sort"]; + $this->sort = $_GET["sort"]; + + $this->bofelamimail->saveSessionData(); + } + + $this->viewMainScreen(); + } + + /** + * importMessage + */ + function importMessage() + { + //error_log(array2string($_POST)); + if (empty($importtype)) $importtype = htmlspecialchars($_POST["importtype"]); + if (empty($toggleFS)) $toggleFS = htmlspecialchars($_POST["toggleFS"]); + if (empty($importID)) $importID = htmlspecialchars($_POST["importid"]); + if (empty($addFileName)) $addFileName =html::purify($_POST['addFileName']); + if (empty($importtype)) $importtype = 'file'; + if (empty($toggleFS)) $toggleFS= false; + if (empty($addFileName)) $addFileName = false; + if ($toggleFS == 'vfs' && $importtype=='file') $importtype='vfs'; + if (!$toggleFS && $importtype=='vfs') $importtype='file'; + + // get passed messages + if (!empty($_GET["msg"])) $alert_message[] = html::purify($_GET["msg"]); + if (!empty($_POST["msg"])) $alert_message[] = html::purify($_POST["msg"]); + unset($_GET["msg"]); + unset($_POST["msg"]); + //_debug_array($alert_message); + //error_log(__METHOD__." called from:".function_backtrace()); + $proceed = false; + if(is_array($_FILES["addFileName"])) + { + //phpinfo(); + //error_log(print_r($_FILES,true)); + if($_FILES['addFileName']['error'] == $UPLOAD_ERR_OK) { + $proceed = true; + $formData['name'] = $_FILES['addFileName']['name']; + $formData['type'] = $_FILES['addFileName']['type']; + $formData['file'] = $_FILES['addFileName']['tmp_name']; + $formData['size'] = $_FILES['addFileName']['size']; + } + } + if ($addFileName && $toggleFS == 'vfs' && $importtype == 'vfs' && $importID) + { + $sessionData = $GLOBALS['egw']->session->appsession('compose_session_data_'.$importID, 'felamimail'); + //error_log(__METHOD__.__LINE__.array2string($sessionData)); + foreach((array)$sessionData['attachments'] as $attachment) { + //error_log(__METHOD__.__LINE__.array2string($attachment)); + if ($addFileName == $attachment['name']) + { + $proceed = true; + $formData['name'] = $attachment['name']; + $formData['type'] = $attachment['type']; + $formData['file'] = $attachment['file']; + $formData['size'] = $attachment['size']; + break; + } + } + } + if ($proceed === true) + { + $destination = html::purify($_POST['newMailboxMoveName']?$_POST['newMailboxMoveName']:''); + try + { + $messageUid = $this->importMessageToFolder($formData,$destination,$importID); + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.display', + 'uid' => $messageUid, + 'mailbox' => base64_encode($destination), + ); + } + catch (egw_exception_wrong_userinput $e) + { + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.importMessage', + 'msg' => htmlspecialchars($e->getMessage()), + ); + } + egw::redirect_link('/index.php',$linkData); + exit; + } + + if(!@is_object($GLOBALS['egw']->js)) + { + $GLOBALS['egw']->js = CreateObject('phpgwapi.javascript'); + } + // this call loads js and css for the treeobject + html::tree(false,false,false,null,'foldertree','','',false,'/',null,false); + $GLOBALS['egw']->common->egw_header(); + + #$uiwidgets =& CreateObject('felamimail.uiwidgets'); + + $this->t->set_file(array("importMessage" => "importMessage.tpl")); + + $this->t->set_block('importMessage','fileSelector','fileSelector'); + $importID =felamimail_bo::getRandomString(); + + // prepare saving destination of imported message + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.listSelectFolder', + ); + $this->t->set_var('folder_select_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + // messages that may be passed to the Form + if (isset($alert_message) && !empty($alert_message)) + { + $this->t->set_var('messages', implode('; ',$alert_message)); + } + else + { + $this->t->set_var('messages',''); + } + + // preset for saving destination, we use draftfolder + $savingDestination = ($this->preferences->ic_server[0]->draftfolder ? $this->preferences->ic_server[0]->draftfolder : $GLOBALS['egw_info']['user']['preferences']['felamimail']['draftFolder']); + + $this->t->set_var('mailboxNameShort', $savingDestination); + $this->t->set_var('importtype', $importtype); + $this->t->set_var('importid', $importID); + if ($toggleFS) $this->t->set_var('toggleFS_preset','checked'); else $this->t->set_var('toggleFS_preset',''); + + $this->translate(); + + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.importMessage', + ); + $this->t->set_var('file_selector_url', $GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->set_var('vfs_selector_url', egw::link('/index.php',array( + 'menuaction' => 'filemanager.filemanager_select.select', + 'mode' => 'open-multiple', + 'method' => 'felamimail.uifelamimail.selectFromVFS', + 'id' => $importID, + 'label' => lang('Attach'), + ))); + if ($GLOBALS['egw_info']['user']['apps']['filemanager'] && $importtype == 'vfs') + { + $this->t->set_var('vfs_attach_button',' +        + +     '); + $this->t->set_var('filebox_readonly','readonly="readonly"'); + } + else + { + $this->t->set_var('vfs_attach_button',''); + $this->t->set_var('filebox_readonly',''); + } + + $maxUploadSize = ini_get('upload_max_filesize'); + $this->t->set_var('max_uploadsize', $maxUploadSize); + + $this->t->set_var('ajax-loader', $GLOBALS['egw']->common->image('felamimail','ajax-loader')); + + $this->t->pparse("out","fileSelector"); + } + + /** + * Callback for filemanagers select file dialog + * + * @param string|array $files path of file(s) in vfs (no egw_vfs::PREFIX, just the path) + * @return string javascript output by the file select dialog, usually to close it + */ + function selectFromVFS($importid,$files) + { + //error_log(__METHOD__.__LINE__.'->ImportID:'.$importid); + $bocompose = CreateObject('felamimail.bocompose',$importid,$this->displayCharset); + $path = implode(' ',$files); + + foreach((array) $files as $path) + { + $formData = array( + 'name' => egw_vfs::basename($path), + 'type' => egw_vfs::mime_content_type($path), + 'file' => egw_vfs::PREFIX.$path, + 'size' => filesize(egw_vfs::PREFIX.$path), + ); + $bocompose->addAttachment($formData); + } + + //error_log(__METHOD__.__LINE__.$path); + return 'window.close();'; + } + + /** + * importMessageToFolder + * + * @param array $_formData Array with information of name, type, file and size + * @param string $_folder (passed by reference) will set the folder used. must be set with a folder, but will hold modifications if + * folder is modified + * @param string $importID ID for the imported message, used by attachments to identify them unambiguously + * @return mixed $messageUID or exception + */ + function importMessageToFolder($_formData,&$_folder,$importID='') + { + $importfailed = false; + + // check if formdata meets basic restrictions (in tmp dir, or vfs, mimetype, etc.) + try + { + $tmpFileName = felamimail_bo::checkFileBasics($_formData,$importID); + } + catch (egw_exception_wrong_userinput $e) + { + $importfailed = true; + $alert_msg .= $e->getMessage(); + } + // ----------------------------------------------------------------------- + if ($importfailed === false) + { + $mailObject = new egw_mailer(); + try + { + $this->bofelamimail->parseFileIntoMailObject($mailObject,$tmpFileName,$Header,$Body); + } + catch (egw_exception_assertion_failed $e) + { + $importfailed = true; + $alert_msg .= $e->getMessage(); + } + //_debug_array($Body); + $this->bofelamimail->openConnection(); + if (empty($_folder)) + { + $importfailed = true; + $alert_msg .= lang("Import of message %1 failed. Destination Folder not set.",$_formData['name']); + } + $delimiter = $this->bofelamimail->getHierarchyDelimiter(); + if($_folder=='INBOX'.$delimiter) $_folder='INBOX'; + if ($importfailed === false) + { + if ($this->bofelamimail->folderExists($_folder,true)) { + try + { + $messageUid = $this->bofelamimail->appendMessage($_folder, + $Header.$mailObject->LE.$mailObject->LE, + $Body, + $flags); + } + catch (egw_exception_wrong_userinput $e) + { + $importfailed = true; + $alert_msg .= lang("Import of message %1 failed. Could not save message to folder %2 due to: %3",$_formData['name'],$_folder,$e->getMessage()); + } + } + else + { + $importfailed = true; + $alert_msg .= lang("Import of message %1 failed. Destination Folder %2 does not exist.",$_formData['name'],$_folder); + } + } + } + // set the url to open when refreshing + if ($importfailed == true) + { + throw new egw_exception_wrong_userinput($alert_msg); + } + else + { + return $messageUid; + } + } + + function deleteMessage() + { + //error_log(__METHOD__." called from:".function_backtrace()); + $message[] = $_GET["message"]; + $mailfolder = NULL; + if (!empty($_GET['folder'])) $mailfolder = base64_decode($_GET['folder']); + + $this->bofelamimail->deleteMessages($message,$mailfolder); + + // set the url to open when refreshing + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.viewMainScreen' + ); + $refreshURL = $GLOBALS['egw']->link('/index.php',$linkData); + + print ""; + } + + function undeleteMessage() + { // only for messages marked as deleted + $message[] = $_GET["message"]; + $mailfolder = NULL; + if (!empty($_GET['folder'])) $mailfolder = base64_decode($_GET['folder']); + $this->bofelamimail->flagMessages('undelete',$message,$mailfolder); + // set the url to open when refreshing + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.viewMainScreen' + ); + $refreshURL = $GLOBALS['egw']->link('/index.php',$linkData); + print ""; + } + + function display_app_header($includeFMStuff=true) + { + if ($includeFMStuff) + { + // this call loads js and css for the treeobject + html::tree(false,false,false,null,'foldertree','','',false,'/',null,false); + egw_framework::validate_file('jquery','jquery-ui'); + egw_framework::validate_file('dhtmlxtree','dhtmlxMenu/codebase/dhtmlxcommon'); + egw_framework::validate_file('dhtmlxtree','dhtmlxMenu/codebase/dhtmlxmenu'); + egw_framework::validate_file('egw_action','egw_action'); + egw_framework::validate_file('egw_action','egw_keymanager'); + egw_framework::validate_file('egw_action','egw_action_common'); + egw_framework::validate_file('egw_action','egw_action_popup'); + egw_framework::validate_file('egw_action','egw_action_dragdrop'); + egw_framework::validate_file('egw_action','egw_dragdrop_dhtmlx_tree'); + egw_framework::validate_file('egw_action','egw_menu'); + egw_framework::validate_file('egw_action','egw_menu_dhtmlx'); + egw_framework::validate_file('egw_action','egw_grid'); + egw_framework::validate_file('egw_action','egw_grid_data'); + egw_framework::validate_file('egw_action','egw_grid_view'); + egw_framework::validate_file('egw_action','egw_grid_columns'); + egw_framework::validate_file('egw_action','egw_stylesheet'); + + // The ext stuff has to be loaded at the end + egw_framework::validate_file('dhtmlxtree','dhtmlxMenu/codebase/ext/dhtmlxmenu_ext'); + + egw_framework::validate_file('jscode','viewMainScreen','felamimail'); + egw_framework::includeCSS('/phpgwapi/js/egw_action/test/skins/dhtmlxmenu_egw.css'); + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + } + $GLOBALS['egw']->common->egw_header(); + + echo $GLOBALS['egw']->framework->navbar(); + } + + function hookAdmin() + { + if(!$GLOBALS['egw']->acl->check('run',1,'admin')) + { + $GLOBALS['egw']->common->egw_header(); + echo $GLOBALS['egw']->framework->navbar(); + echo lang('access not permitted'); + $GLOBALS['egw']->log->message('F-Abort, Unauthorized access to felamimail.uifelamimail.hookAdmin'); + $GLOBALS['egw']->log->commit(); + $GLOBALS['egw']->common->egw_exit(); + } + + if(!empty($_POST['profileID']) && is_int(intval($_POST['profileID']))) + { + $profileID = intval($_POST['profileID']); + $this->bofelamimail->setEMailProfile($profileID); + } + + $boemailadmin = new emailadmin_bo(); + + $profileList = $boemailadmin->getProfileList(); + $profileID = $this->bofelamimail->getEMailProfile(); + + $this->display_app_header(); + + $this->t->set_file(array("body" => "selectprofile.tpl")); + $this->t->set_block('body','main'); + $this->t->set_block('body','select_option'); + + $this->t->set_var('lang_select_email_profile',lang('select emailprofile')); + $this->t->set_var('lang_site_configuration',lang('site configuration')); + $this->t->set_var('lang_save',lang('save')); + $this->t->set_var('lang_back',lang('back')); + + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.hookAdmin' + ); + $this->t->set_var('action_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.listProfiles' + ); + $this->t->set_var('lang_go_emailadmin', lang('use EmailAdmin to create profiles', $GLOBALS['egw']->link('/index.php',$linkData))); + + $this->t->set_var('back_url',$GLOBALS['egw']->link('/admin/index.php')); + + if(isset($profileList) && is_array($profileList)) + { + foreach($profileList as $key => $value) + { + #print "$key => $value
    "; + #_debug_array($value); + $this->t->set_var('profileID',$value['profileID']); + $this->t->set_var('description',$value['description']); + if(is_int($profileID) && $profileID == $value['profileID']) + { + $this->t->set_var('selected','selected'); + } + else + { + $this->t->set_var('selected',''); + } + $this->t->parse('select_options','select_option',True); + } + } + + $this->t->parse("out","main"); + print $this->t->get('out','main'); + + } + + function viewMainScreen() + { + // get passed messages + if (!empty($_GET["msg"])) $message[] = html::purify($_GET["msg"]); + if (!empty($_GET["message"])) $message[] = html::purify($_GET["message"]); + unset($_GET["msg"]); + unset($_GET["message"]); + #printf ("this->uifelamimail->viewMainScreen() start: %s
    ",date("H:i:s",mktime())); + $bofilter =& $this->bofilter; + $uiwidgets = CreateObject('felamimail.uiwidgets'); + // fetch the active account with prefs and identities + $preferences =& $this->preferences; + $urlMailbox = urlencode($this->mailbox); + //_debug_array($preferences->preferences); + if (isset($GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID'])) + self::$icServerID = (int)$GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID']; + //_debug_array(self::$icServerID); + if (is_object($preferences)) $imapServer = $preferences->getIncomingServer(self::$icServerID); + //_debug_array($imapServer); + //_debug_array($preferences->preferences); + //error_log(__METHOD__.__LINE__.' ImapServerId:'.$imapServer->ImapServerId.' Prefs:'.array2string($preferences->preferences)); + //error_log(__METHOD__.__LINE__.' ImapServerObject:'.array2string($imapServer)); + if (is_object($preferences)) $activeIdentity =& $preferences->getIdentity(self::$icServerID); + //_debug_array($activeIdentity); + $maxMessages = 50; + if (isset($GLOBALS['egw_info']['user']['preferences']['felamimail']['prefMailGridBehavior']) && (int)$GLOBALS['egw_info']['user']['preferences']['felamimail']['prefMailGridBehavior'] <> 0) + $maxMessages = (int)$GLOBALS['egw_info']['user']['preferences']['felamimail']['prefMailGridBehavior']; + $userPreferences =& $GLOBALS['egw_info']['user']['preferences']['felamimail']; + + // retrieve data for/from user defined accounts + $selectedID = 0; + if($this->preferences->userDefinedAccounts) $allAccountData = $this->bopreferences->getAllAccountData($this->preferences); + if ($allAccountData) { + foreach ($allAccountData as $tmpkey => $accountData) + { + $identity =& $accountData['identity']; + $icServer =& $accountData['icServer']; + //_debug_array($identity); + //_debug_array($icServer); + //error_log(__METHOD__.__LINE__.' Userdefined Profiles ImapServerId:'.$icServer->ImapServerId); + if (empty($icServer->host)) continue; + $identities[$identity->id]=$identity->realName.' '.$identity->organization.' <'.$identity->emailAddress.'>'; + if (!empty($identity->default)) $selectedID = $identity->id; + } + } + + if (empty($imapServer->host) && count($identities)==0 && $this->preferences->userDefinedAccounts) + { + // redirect to new personal account + egw::redirect_link('/index.php',array('menuaction'=>'felamimail.uipreferences.editAccountData', + 'accountID'=>"new", + 'msg' => lang("There is no IMAP Server configured.")." - ".lang("Please configure access to an existing individual IMAP account."), + )); + } + $this->display_app_header(); + + $this->t->set_file(array("body" => 'mainscreen.tpl')); + $this->t->set_block('body','main'); + $this->t->set_block('body','status_row_tpl'); + $this->t->set_block('body','error_message'); + $this->t->set_block('body','quota_block'); + $this->t->set_block('body','subject_same_window'); + $this->t->set_block('body','subject_new_window'); + + $this->translate(); + if (empty($imapServer->host) && count($identities)==0) { + $errormessage = "
    ".lang("There is no IMAP Server configured."); + if ($GLOBALS['egw_info']['user']['apps']['emailadmin']) { + $errormessage .= "
    ".lang("Configure a valid IMAP Server in emailadmin for the profile you are using."); + } else { + $errormessage .= "
    ".lang('Please ask the administrator to correct the emailadmin IMAP Server Settings for you.'); + } + if($this->preferences->userDefinedAccounts) + $errormessage .= "
    ".lang('or configure an valid IMAP Server connection using the Manage Accounts/Identities preference in the Sidebox Menu.'); + + $this->t->set_var('connection_error_message', $errormessage); + $this->t->set_var('message', ' '); + $this->t->parse('header_rows','error_message',True); + + $this->t->parse("out","main"); + print $this->t->get('out','main'); + echo $GLOBALS['egw']->framework->footer(false); + exit; + } + $this->t->set_var('activeServerID',self::$icServerID); + $this->t->set_var('activeFolder',$urlMailbox); + $this->t->set_var('activeFolderB64',base64_encode($this->mailbox)); + $draftFolder = $this->bofelamimail->getDraftFolder(false); + $this->t->set_var('draftFolder',($draftFolder?$draftFolder:'')); + $this->t->set_var('draftFolderB64',($draftFolder?base64_encode($draftFolder):'')); + $templateFolder = $this->bofelamimail->getTemplateFolder(false); + $this->t->set_var('templateFolder',($templateFolder?$templateFolder:'')); + $this->t->set_var('templateFolderB64',($templateFolder?base64_encode($templateFolder):'')); + $this->t->set_var('oldMailbox',$urlMailbox); + $this->t->set_var('image_path',EGW_IMAGES); + #printf ("this->uifelamimail->viewMainScreen() Line 272: %s
    ",date("H:i:s",mktime())); + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.viewMainScreen' + ); + $refreshURL = $GLOBALS['egw']->link('/index.php',$linkData); + $this->t->set_var('reloadView',$refreshURL); + // display a warning if vacation notice is active + if(is_a($imapServer,'defaultimap') && $imapServer->enableSieve) { + $imapServer->retrieveRules($imapServer->scriptName); + $vacation = $imapServer->getVacation($imapServer->scriptName); + //_debug_array($vacation); + // [status] => can be: on, off, by_date + // [end_date] => 1247522400 (timestamp, use showdate for visualisation) + // [start_date] => 1247176800 (timestamp, use showdate for visualisation) + } + if(is_array($vacation) && ($vacation['status'] == 'on' || $vacation['status']=='by_date')) + { + $dtfrmt = $GLOBALS['egw_info']['user']['preferences']['common']['dateformat']; + $this->t->set_var('vacation_warning', + html::image('phpgwapi','dialog_warning',false,'style="vertical-align: middle; width: 16px;"').lang('Vacation notice is active').($vacation['status']=='by_date'? ' '.common::show_date($vacation['start_date'],$dtfrmt,true).'->'.common::show_date($vacation['end_date'],$dtfrmt,true):'')); + } + else + { + $this->t->set_var('vacation_warning',' '); + } + //error_log(__METHOD__.__LINE__.'->'.$this->connectionStatus); + // ui for the quotas + if($this->connectionStatus !== false) { + $quota = $this->bofelamimail->getQuotaRoot(); + } else { + $quota['limit'] = 'NOT SET'; + } + + if($quota !== false && $quota['limit'] != 'NOT SET') { + $quotaDisplay = $uiwidgets->quotaDisplay($quota['usage'], $quota['limit']); + $this->t->set_var('quota_display', $quotaDisplay); + } else { + $this->t->set_var('quota_display',' '); + } + // navigation + if ($maxMessages>0) + { + $navbarImages = array( + 'last' => array( + 'action' => "jumpEnd(); return false;", + 'tooltip' => '', + ), + 'right' => array( + 'action' => "skipForward(); return false;", + 'tooltip' => '', + ), + 'left' => array( + 'action' => "skipPrevious(); return false;", + 'tooltip' => '', + ), + 'first' => array( + 'action' => "jumpStart(); return false;", + 'tooltip' => '', + ), + ); + $navbarButtons = ''; + foreach($navbarImages as $buttonName => $buttonInfo) { + $navbarButtons .= $uiwidgets->navbarButton($buttonName, $buttonInfo['action'], $buttonInfo['tooltip'],'right'); + } + } + else + { + $navbarButtons = ''; + } + $this->t->set_var('navbarButtonsRight',$navbarButtons); + $composeImage = $GLOBALS['egw']->common->image('phpgwapi','new'); + $this->t->set_var('composeBGImage',$composeImage); + + // set the images + $listOfImages = array( + 'read_small', + 'unread_small', + 'unread_flagged_small', + 'read_flagged_small', + 'trash', + 'sm_envelope', + 'write_mail', + 'manage_filter', + 'msg_icon_sm', + 'mail_find', + 'new', + 'start_kde', + 'previous_kde', + 'next_kde', + 'finnish_kde', + 'ajax-loader', + ); + + foreach ($listOfImages as $image) { + $this->t->set_var($image, $GLOBALS['egw']->common->image('felamimail', $image)); + } + $this->t->set_var('img_clear_left', html::image('felamimail', 'clear_left', lang('clear search'), 'style="margin-left:5px; cursor: pointer;" onclick="fm_clearSearch()"')); + // refresh settings + $refreshTime = $userPreferences['refreshTime']; + $this->t->set_var('refreshTime',$refreshTime*60*1000); + // other settings + $prefaskformove = intval($userPreferences['prefaskformove']) ? intval($userPreferences['prefaskformove']) : 0; + $this->t->set_var('prefaskformove',$prefaskformove); + $prefaskformultipleforward = intval($userPreferences['prefaskformultipleforward']) ? intval($userPreferences['prefaskformultipleforward']) : 0; + $this->t->set_var('prefaskformultipleforward',$prefaskformultipleforward); + #// set the url to open when refreshing + #$linkData = array + #( + # 'menuaction' => 'felamimail.uifelamimail.viewMainScreen' + #); + #$this->t->set_var('refresh_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + // define the sort defaults + $dateSort = '0'; + $dateCSS = 'text_small'; + $fromSort = '3'; + $fromCSS = 'text_small'; + $subjectSort = '5'; + $subjectCSS = 'text_small'; + $sizeSort = '6'; + $sizeCSS = 'text_small'; + + // and no overwrite the defaults + switch($this->sort) + { + // sort by date newest first + case '0': + $dateCSS = 'text_small_bold'; + break; + + // sort by from z->a + case '2': + $fromCSS = 'text_small_bold'; + break; + // sort by from a->z + case '3': + $subjectCSS = 'text_small_bold'; + break; + // sort by size z->a + case '6': + $sizeCSS = 'text_small_bold'; + break; + } + + // sort by date + $this->t->set_var('css_class_date', $dateCSS); + + // sort by from + $this->t->set_var('css_class_from', $fromCSS); + + // sort by subject + $this->t->set_var('css_class_subject', $subjectCSS); + + // sort by size + $this->t->set_var('css_class_size', $sizeCSS); + + #_debug_array($this->bofelamimail->sessionData['messageFilter']); + if(!empty($this->bofelamimail->sessionData['messageFilter']['string'])) { + $this->t->set_var('quicksearch', $this->bofelamimail->sessionData['messageFilter']['string']); + } + + $defaultSearchType = (isset($this->bofelamimail->sessionData['messageFilter']['type']) ? $this->bofelamimail->sessionData['messageFilter']['type'] : 'quick'); + $defaultSelectStatus = (isset($this->bofelamimail->sessionData['messageFilter']['status']) ? $this->bofelamimail->sessionData['messageFilter']['status'] : 'any'); + + $searchTypes = array( + 'quick' => 'quicksearch', + 'subject' => 'subject', + 'body' => 'message', + 'from' => 'from', + 'to' => 'to', + 'cc' => 'cc', + ); + $selectSearchType = html::select('searchType', $defaultSearchType, $searchTypes, false, "style='width:100%;' id='searchType' onchange='document.getElementById(\"quickSearch\").focus(); document.getElementById(\"quickSearch\").value=\"\" ;return false;'"); + $this->t->set_var('select_search', $selectSearchType); + + $statusTypes = array( + 'any' => 'any status', + 'flagged' => 'flagged', + 'unseen' => 'unread', + 'answered' => 'replied', + 'seen' => 'read', + 'deleted' => 'deleted', + ); + $selectStatus = html::select('status', $defaultSelectStatus, $statusTypes, false, "style='width:100%;' onchange='javascript:quickSearch();' id='status'"); + $this->t->set_var('select_status', $selectStatus); + + if($this->connectionStatus === false) { + $this->t->set_var('connection_error_message', lang($this->bofelamimail->getErrorMessage())); + $this->t->set_var('message', ' '); + $this->t->parse('header_rows','error_message',True); + } else { + $previewMessageId =($this->bofelamimail->sessionData['previewMessage']?$this->bofelamimail->sessionData['previewMessage']:0); + if ($previewMessageId) + { + $headers = $this->bofelamimail->getHeaders($this->mailbox, $this->startMessage, $maxMessages, $this->sort, $this->sortReverse, $this->bofelamimail->sessionData['messageFilter'],($previewMessageId?$previewMessageId:null)); + } + else + { + $headers = array('header'=>array(),'info'=>array()); + } + $headerCount = count($headers['header']); + $folderStatus = $this->bofelamimail->getFolderStatus($this->mailbox); + $headers['info']['total'] = $folderStatus['messages']; + $headers['info']['first'] = $this->startMessage; + $headers['info']['last'] = ($headers['info']['total']>$maxMessages?$maxMessages:$headers['info']['total']); + + //_debug_array($folderStatus); + // if there aren't any messages left (eg. after delete or move) + // adjust $this->startMessage + if ($maxMessages > 0 && $headerCount==0 && $this->startMessage > $maxMessages) { + $this->startMessage = $this->startMessage - $maxMessages; + } + + $msg_icon_sm = $GLOBALS['egw']->common->image('felamimail','msg_icon_sm'); + // determine how to display the current folder: as sent folder (to address visible) or normal (from address visible) + //$folderType = $this->bofelamimail->getFolderType($this->mailbox); + + //_debug_array($this->bofelamimail->sessionData['previewMessage']); + $messageTable = $uiwidgets->messageTable( + $headers, + $folderType, + $this->mailbox, + $userPreferences['message_newwindow'], + $userPreferences['rowOrderStyle'], + $previewMessageId); + $this->t->set_var('header_rows', $messageTable); + + + $firstMessage = $headers['info']['first']; + $lastMessage = $headers['info']['last']; + $totalMessage = $headers['info']['total']; + $langTotal = lang("total"); + + // set the select all/nothing link + if($_GET["select_all"] == "select_all") { + // link to unselect all messages + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.viewMainScreen' + ); + $selectLink = sprintf("%s", + $GLOBALS['egw']->link('/index.php',$linkData), + lang("Unselect All")); + $this->t->set_var('change_folder_checked',''); + $this->t->set_var('move_message_checked','checked'); + } else { + // link to select all messages + $linkData = array + ( + 'select_all' => 'select_all', + 'menuaction' => 'felamimail.uifelamimail.viewMainScreen' + ); + $selectLink = sprintf("%s", + $GLOBALS['egw']->link('/index.php',$linkData), + lang("Select all")); + $this->t->set_var('change_folder_checked','checked'); + $this->t->set_var('move_message_checked',''); + } + $this->t->set_var('select_all_link',$selectLink); + $shortName=''; + //if ($folderStatus = $this->bofelamimail->getFolderStatus($this->mailbox)) $shortName =$folderStatus['shortDisplayName']; + if ($folderStatus) $shortName =$folderStatus['shortDisplayName']; // already fetched folderStatus earlier. + $addmessage = ''; + if ($message) $addmessage = ' '.implode('; ',$message).' '; + $this->t->set_var('message',''.$shortName.': '.lang("Viewing messages").($maxMessages>0&&$lastMessage>0?" $firstMessage - $lastMessage":"")." ($totalMessage $langTotal)".$addmessage); + if ($maxMessages>0) + { + if($firstMessage > 1) { + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.viewMainScreen', + 'startMessage' => $this->startMessage - $maxMessages + ); + $link = $GLOBALS['egw']->link('/index.php',$linkData); + $this->t->set_var('link_previous',"".lang("previous").""); + } else { + $this->t->set_var('link_previous',lang("previous")); + } + + if($totalMessage > $lastMessage) { + $linkData = array ( + 'menuaction' => 'felamimail.uifelamimail.viewMainScreen', + 'startMessage' => $this->startMessage + $maxMessages + ); + $link = $GLOBALS['egw']->link('/index.php',$linkData); + $this->t->set_var('link_next',"".lang("next").""); + } else { + $this->t->set_var('link_next',lang("next")); + } + $this->t->parse('status_row','status_row_tpl',True); + //print __LINE__ . ': ' . (microtime(true) - $this->timeCounter) . '
    '; + } + else + { + $this->t->set_var('link_previous',lang("previous")); + $this->t->set_var('link_next',lang("next")); + $this->t->parse('status_row','status_row_tpl',True); + } + } + + //print __LINE__ . ': ' . (microtime(true) - $this->timeCounter) . '
    '; + + $this->t->parse("out","main"); + $neededSkript = ""; + if($this->connectionStatus !== false) + { + $neededSkript = "
    ". + $uiwidgets->get_grid_js($folderType, $this->mailbox,$rowsFetched,$this->startMessage,false,($maxMessages>=0?false:true)). + "
    "; + $this->bofelamimail->closeConnection(); + } + print $this->t->get('out','main').$neededSkript; + echo $GLOBALS['egw']->framework->footer(false); + } + + function array_merge_replace( $array, $newValues ) + { + foreach ( $newValues as $key => $value ) + { + if ( is_array( $value ) ) + { + if ( !isset( $array[ $key ] ) ) + { + $array[ $key ] = array(); + } + $array[ $key ] = $this->array_merge_replace( $array[ $key ], $value ); + } + else + { + if ( isset( $array[ $key ] ) && is_array( $array[ $key ] ) ) + { + $array[ $key ][ 0 ] = $value; + } + else + { + if ( isset( $array ) && !is_array( $array ) ) + { + $temp = $array; + $array = array(); + $array[0] = $temp; + } + $array[ $key ] = $value; + } + } + } + return $array; + } + + /* Returns a string showing the size of the message/attachment */ + function show_readable_size($bytes, $_mode='short') + { + $bytes /= 1024; + $type = 'k'; + + if ($bytes / 1024 > 1) + { + $bytes /= 1024; + $type = 'M'; + } + + if ($bytes < 10) + { + $bytes *= 10; + settype($bytes, 'integer'); + $bytes /= 10; + } + else + settype($bytes, 'integer'); + + return $bytes . ' ' . $type ; + } + + function toggleFilter() + { + error_log(__METHOD__." called from:".function_backtrace()); + $this->bofelamimail->toggleFilter(); + $this->viewMainScreen(); + } + + function translate() + { + $this->t->set_var('th_bg',$GLOBALS['egw_info']["theme"]["th_bg"]); + $this->t->set_var('bg_01',$GLOBALS['egw_info']["theme"]["bg01"]); + $this->t->set_var('bg_02',$GLOBALS['egw_info']["theme"]["bg02"]); + + $this->t->set_var('lang_compose',lang('compose')); + $this->t->set_var('lang_edit_filter',lang('edit filter')); + $this->t->set_var('lang_move_selected_to',lang('move selected to')); + $this->t->set_var('lang_doit',lang('do it!')); + $this->t->set_var('lang_change_folder',lang('change folder')); + $this->t->set_var('lang_move_message',lang('move messages')); + $this->t->set_var('desc_read',lang("mark selected as read")); + $this->t->set_var('desc_unread',lang("mark selected as unread")); + $this->t->set_var('desc_important',lang("mark selected as flagged")); + $this->t->set_var('desc_unimportant',lang("mark selected as unflagged")); + $this->t->set_var('desc_deleted',lang("delete selected")); + $this->t->set_var('lang_date',lang("date")); + $this->t->set_var('lang_status',lang('status')); + $this->t->set_var('lang_size',lang("size")); + $this->t->set_var('lang_search',lang("search")); + $this->t->set_var('lang_replied',lang("replied")); + $this->t->set_var('lang_read',lang("read")); + $this->t->set_var("lang_select",lang('select')); + $this->t->set_var('lang_unread',lang("unread")); + $this->t->set_var('lang_deleted',lang("deleted")); + $this->t->set_var('lang_recent',lang("recent")); + $this->t->set_var('lang_flagged',lang("flagged")); + $this->t->set_var('lang_unflagged',lang("unflagged")); + $this->t->set_var('lang_subject',lang("subject")); + $this->t->set_var('lang_add_to_addressbook',lang("add to addressbook")); + $this->t->set_var('lang_no_filter',lang("no filter")); + $this->t->set_var('lang_connection_failed',lang("The connection to the IMAP Server failed!!")); + $this->t->set_var('lang_select_target_folder',lang("Simply click the target-folder")); + $this->t->set_var('lang_updating_message_status',lang("updating message status")); + $this->t->set_var('lang_max_uploadsize',lang('max uploadsize')); + $this->t->set_var('lang_loading',lang('loading')); + $this->t->set_var('lang_deleting_messages',lang('deleting messages')); + $this->t->set_var('lang_open_all',lang("open all")); + $this->t->set_var('lang_close_all',lang("close all")); + $this->t->set_var('lang_moving_messages_to',lang('moving messages to')); + $this->t->set_var('lang_copying_messages_to',lang('copying messages to')); + $this->t->set_var('lang_MoveCopyTitle',($GLOBALS['egw_info']['user']['preferences']['felamimail']['prefaskformove']==2?lang('Copy or Move Messages?'):lang('Move Messages?'))); + $this->t->set_var('lang_askformove',($GLOBALS['egw_info']['user']['preferences']['felamimail']['prefaskformove']==2?lang('Do you really want to move or copy the selected messages to folder:'):lang('Do you really want to move the selected messages to folder:'))); + $this->t->set_var('lang_move',lang("Move")); + $this->t->set_var('lang_multipleforward',lang("Do you really want to attach the selected messages to the new mail?")); + $this->t->set_var('lang_copy',lang("Copy")); + $this->t->set_var('lang_cancel',lang("Cancel")); + $this->t->set_var('lang_mark_all_messages',lang('all messages in folder')); + $this->t->set_var('lang_confirm_all_messages',lang('The action will be applied to all messages of the current folder.\nDo you want to proceed?')); + $this->t->set_var('lang_empty_trash',lang('empty trash')); + $this->t->set_var('lang_compress_folder',lang('compress folder')); + $this->t->set_var('lang_skipping_forward',lang('skipping forward')); + $this->t->set_var('lang_skipping_previous',lang('skipping previous')); + $this->t->set_var('lang_jumping_to_start',lang('jumping to start')); + $this->t->set_var('lang_jumping_to_end',lang('jumping to end')); + $this->t->set_var('lang_updating_view',lang('updating view')); + $this->t->set_var('lang_toggleFS',lang('choose from VFS')); + $this->t->set_var('lang_sendnotify',lang('The message sender has requested a response to indicate that you have read this message. Would you like to send a receipt?')); + } +} +?> diff --git a/felamimail/inc/class.uipreferences.inc.php b/felamimail/inc/class.uipreferences.inc.php new file mode 100644 index 0000000000..844ed52525 --- /dev/null +++ b/felamimail/inc/class.uipreferences.inc.php @@ -0,0 +1,820 @@ + + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * FeLaMiMail preference user interface class, provides UI functionality for preferences/actions like + * managing folders, acls, signatures, rules + */ + + class uipreferences + { + /** + * Reference to felamimail_bo + * + * @var felamimail_bo + */ + var $bofelamimail; + + var $public_functions = array + ( + 'addACL' => 'True', + 'editAccountData' => 'True', + 'editForwardingAddress' => 'True', + 'editSignature' => 'True', + 'listFolder' => 'True', + 'listSignatures' => 'True', + 'listAccountData' => 'True', + 'showHeader' => 'True', + 'getAttachment' => 'True', + 'listSelectFolder' => 'True', + ); + + function uipreferences() + { + $this->t = $GLOBALS['egw']->template; + $this->charset = translation::charset(); + $this->bofelamimail = felamimail_bo::getInstance(); + $this->bopreferences = $this->bofelamimail->bopreferences; + + $this->uiwidgets = CreateObject('felamimail.uiwidgets'); + + if (is_object($this->bofelamimail->mailPreferences)) + { + // account select box + $selectedID = $this->bofelamimail->getIdentitiesWithAccounts($identities); + // if nothing valid is found return to user defined account definition + if (empty($this->bofelamimail->icServer->host) && count($identities)==0 && $this->bofelamimail->mailPreferences->userDefinedAccounts) + { + // redirect to new personal account + $this->editAccountData(lang("There is no IMAP Server configured.")." - ".lang("Please configure access to an existing individual IMAP account."), 'new'); + exit; + } + } + + $this->rowColor[0] = $GLOBALS['egw_info']["theme"]["bg01"]; + $this->rowColor[1] = $GLOBALS['egw_info']["theme"]["bg02"]; + } + + function addACL() + { + $this->display_app_header(FALSE); + + $this->t->set_file(array("body" => "preferences_manage_folder.tpl")); + $this->t->set_block('body','main'); + $this->t->set_block('body','add_acl'); + + $this->translate(); + + $this->t->pparse("out","add_acl"); + + } + + // $_displayNavbar false == don't display navbar + function display_app_header($_displayNavbar) + { + switch($_GET['menuaction']) + { + case 'felamimail.uipreferences.editSignature': + egw_framework::validate_file('jscode','listSignatures','felamimail'); + egw_framework::validate_file('ckeditor3','ckeditor','phpgwapi'); + #$GLOBALS['egw']->js->set_onload('fm_initEditLayout();'); + break; + case 'felamimail.uipreferences.listAccountData': + case 'felamimail.uipreferences.editAccountData': + egw_framework::validate_file('tabs','tabs'); + egw_framework::validate_file('jscode','editAccountData','felamimail'); + $GLOBALS['egw']->js->set_onload('javascript:initEditAccountData();'); + if ($_GET['menuaction'] == 'felamimail.uipreferences.editAccountData') $GLOBALS['egw']->js->set_onload('javascript:initTabs();'); + break; + + case 'felamimail.uipreferences.listSignatures': + egw_framework::validate_file('jscode','listSignatures','felamimail'); + #$GLOBALS['egw']->js->set_onload('javascript:initEditAccountData();'); + break; + + case 'felamimail.uipreferences.listFolder': + case 'felamimail.uipreferences.addACL': + case 'felamimail.uipreferences.listSelectFolder': + egw_framework::validate_file('tabs','tabs'); + // this call loads js and css for the treeobject + html::tree(false,false,false,null,'foldertree','','',false,'/',null,false); + egw_framework::validate_file('jscode','listFolder','felamimail'); + $GLOBALS['egw']->js->set_onload('javascript:initAll();'); + break; + } + + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + + $GLOBALS['egw']->common->egw_header(); + if($_displayNavbar == TRUE) + echo $GLOBALS['egw']->framework->navbar(); + } + + function editForwardingAddress() + { + if (!isset($this->bofelamimail)) $this->bofelamimail = felamimail_bo::getInstance(); + $mailPrefs = $this->bofelamimail->getMailPreferences(); + $ogServer = $mailPrefs->getOutgoingServer(0); + + if(!is_a($ogServer, 'defaultsmtp') || !$ogServer->editForwardingAddress) { + die('You should not be here!'); + } + + if($_POST['save']) { + //_debug_array($_POST);_debug_array($_POST);_debug_array($_POST); + $ogServer->saveSMTPForwarding($GLOBALS['egw_info']['user']['account_id'],$_POST['forwardingAddress'],$_POST['keepLocalCopy']); + } elseif($_POST['cancel']) { + ExecMethod('felamimail.uifelamimail.viewMainScreen'); + return; + } + + $userData = $ogServer->getUserData($GLOBALS['egw_info']['user']['account_id']); + + $this->display_app_header(TRUE); + + $this->t->set_file(array("body" => "edit_forwarding_address.tpl")); + $this->t->set_block('body','main'); + + $this->translate(); + + $linkData = array ( + 'menuaction' => 'felamimail.uipreferences.editForwardingAddress' + ); + $this->t->set_var('form_action',$GLOBALS['egw']->link('/index.php',$linkData)); + $this->t->set_var('forwarding_address',$userData['mailForwardingAddress'][0]); + + #deliveryMode checked_keep_local_copy + if($userData['deliveryMode'] != 'forwardOnly') { + $this->t->set_var('checked_keep_local_copy','checked'); + } + + $this->t->parse("out","main"); + + print $this->t->get('out','main'); + } + + function editSignature() { + if(isset($_GET['signatureID'])) { + $signatureID = (int)$_GET['signatureID']; + + $boSignatures = new felamimail_bosignatures(); + $signatureData = $boSignatures->getSignature($signatureID,true); + } + + $this->display_app_header(false); + + $this->t->set_file(array('body' => 'preferences_edit_signature.tpl')); + $this->t->set_block('body','main'); + + $this->translate(); + + $linkData = array ( + 'menuaction' => 'felamimail.uipreferences.editSignature' + ); + $this->t->set_var('form_action', $GLOBALS['egw']->link('/index.php',$linkData)); + $height = "350px"; + if(isset($_GET['signatureID'])) { + + $this->t->set_var('description', @htmlspecialchars($signatureData->fm_description, ENT_QUOTES, $this->charset)); + + $this->t->set_var('signatureID', $signatureID); + + $this->t->set_var('tinymce',html::fckEditorQuick( + 'signature', 'advanced', + $signatureData->fm_signature, + $height,'100%',false) + ); + + $this->t->set_var('checkbox_isDefaultSignature',html::checkbox( + 'isDefaultSignature', + $signatureData->fm_defaultsignature, + 'true', + 'id="isDefaultSignature"' + ) + ); + } else { + $this->t->set_var('description',''); + $this->t->set_var('tinymce',html::fckEditorQuick('signature', 'advanced', '', $height,'100%',false)); + + $this->t->set_var('checkbox_isDefaultSignature',html::checkbox( + 'isDefaultSignature', false, 'true', 'id="isDefaultSignature"' + )); + + } + + $this->t->pparse("out","main"); + } + + function editAccountData($msg='', $account2retrieve='active') + { + if ($_GET['msg']) $msg = html::purify($_GET['msg']); + if (!isset($this->bofelamimail)) $this->bofelamimail = felamimail_bo::getInstance(); + if (!isset($this->bopreferences)) $this->bopreferences = $this->bofelamimail->bopreferences; + $preferences =& $this->bopreferences->getPreferences(); + $referer = '../index.php?menuaction=felamimail.uipreferences.listAccountData'; + if(!($preferences->userDefinedAccounts || $preferences->userDefinedIdentities)) { + die('you are not allowed to be here'); + } + + if($_POST['save'] || $_POST['apply']) { + // IMAP connection settings + $icServer =& CreateObject('emailadmin.defaultimap'); + if(is_array($_POST['ic']) && (int)$_POST['active']) { + foreach($_POST['ic'] as $key => $value) { + switch($key) { + case 'validatecert': + $icServer->$key = ($value != 'dontvalidate'); + break; + + case 'enableSieve': + $icServer->$key = ($value == 'enableSieve'); + break; + + default: + $icServer->$key = $value; + break; + } + } + } else { + $icServer = NULL; + } + // SMTP connection settings + $ogServer = CreateObject('emailadmin.defaultsmtp'); + if(is_array($_POST['og']) && (int)$_POST['active']) { + foreach($_POST['og'] as $key => $value) { + $ogServer->$key = $value; + } + } else { + $ogServer = NULL; + } + + // identity settings + $identity = CreateObject('emailadmin.ea_identity'); + if(is_array($_POST['identity'])) { + foreach($_POST['identity'] as $key => $value) { + $identity->$key = $value; + } + } + + + $newID = $this->bopreferences->saveAccountData($icServer, $ogServer, $identity); + if ($identity->id == 'new') $identity->id = $newID; + if((int)$_POST['active']) { + #$boPreferences->saveAccountData($icServer, $ogServer, $identity); + $this->bopreferences->setProfileActive(false); + $this->bopreferences->setProfileActive(true,$identity->id); + } else { + $this->bopreferences->setProfileActive(false,$identity->id); + } + + if($_POST['save']) { + //ExecMethod('felamimail.uifelamimail.viewMainScreen'); + $GLOBALS['egw']->redirect_link($referer,array('msg' => lang('Entry saved'))); + return; + } + } elseif($_POST['cancel']) { + //ExecMethod('felamimail.uifelamimail.viewMainScreen'); + $GLOBALS['egw']->redirect_link($referer,array('msg' => lang('aborted'))); + return; + } + + $folderList = array(); + if (!isset($this->bofelamimail) || (int)$_POST['active']) $this->bofelamimail = felamimail_bo::getInstance(); + if($this->bofelamimail->openConnection()) { + $folderObjects = $this->bofelamimail->getFolderObjects(); + foreach($folderObjects as $folderName => $folderInfo) { + //_debug_array($folderInfo); + $folderList[$folderName] = $folderInfo->displayName; + } + $this->bofelamimail->closeConnection(); + } + + $this->display_app_header(TRUE); + + $this->t->set_file(array("body" => "edit_account_data.tpl")); + $this->t->set_block('body','main'); + if ($msg) $this->t->set_var("message", $msg); else $this->t->set_var("message", ''); + $this->translate(); + + // if there is no accountID with the call of the edit method, retrieve an active account + if ((int)$_GET['accountID']) { + $account2retrieve = $_GET['accountID']; + } + if ($_GET['accountID'] == 'new') $account2retrieve = 'new'; + if (!empty($newID) && $newID>0) $account2retrieve = $newID; + if ($account2retrieve != 'new') { + $accountData = $this->bopreferences->getAccountData($preferences, $account2retrieve); + $icServer =& $accountData['icServer']; + //_debug_array($icServer); + $ogServer =& $accountData['ogServer']; + $identity =& $accountData['identity']; + //_debug_array($identity); + } + else + { + $this->t->set_var('identity[realName]',''); + $this->t->set_var('identity[organization]',''); + $this->t->set_var('identity[emailAddress]',''); + $this->t->set_var('identity[signature]',-1); + $this->t->set_var('ic[host]',''); + $this->t->set_var('ic[port]',143); + $this->t->set_var('ic[username]',''); + $this->t->set_var('ic[password]',''); + $this->t->set_var('ic[sievePort]',''); + $this->t->set_var('og[host]',''); + $this->t->set_var('og[port]',25); + $this->t->set_var('og[username]',''); + $this->t->set_var('og[password]',''); + } + + if ($icServer) { + foreach($icServer as $key => $value) { + if(is_object($value) || is_array($value)) { + continue; + } + switch($key) { + case 'encryption': + $this->t->set_var('checked_ic_'. $key .'_'. $value, 'checked'); + break; + + case 'enableSieve': + $this->t->set_var('checked_ic_'.$key,($value ? 'checked' : '')); + break; + + case 'validatecert': + $this->t->set_var('checked_ic_'.$key,($value ? '' : 'checked')); + break; + + default: + $this->t->set_var("ic[$key]", $value); + break; + } + } + } + if ($ogServer) { + foreach($ogServer as $key => $value) { + if(is_object($value) || is_array($value)) { + continue; + } + #print "$key => $value
    "; + switch($key) { + case 'smtpAuth': + $this->t->set_var('checked_og_'.$key,($value ? 'checked' : '')); + default: + $this->t->set_var("og[$key]", $value); + } + } + } + $felamimail_bosignatures = new felamimail_bosignatures(); + $signatures = $felamimail_bosignatures->getListOfSignatures(); + $allSignatures = array( + '-2' => lang('no signature') + ); + $systemsig = false; + foreach ($signatures as $sigkey => $sig) { + //echo "Keys to check: $sigkey with ".$sig['fm_signatureid']."
    "; + if ($sig['fm_signatureid'] == -1) $systemsig = true; + $allSignatures[$sig['fm_signatureid']] = $sig['fm_description']; + } + // if there is a system signature, then use the systemsignature as preset/default + $sigvalue = $defaultsig = ($systemsig ? -1 : -2); + if ($identity) { + foreach($identity as $key => $value) { + if(is_object($value) || is_array($value)) { + continue; + } + switch($key) { + case 'signature': + // if empty, use the default + $sigvalue = (!empty($value)?$value:$defaultsig); + break; + default: + $this->t->set_var("identity[$key]", $value); + } + } + $this->t->set_var('accountID',$identity->id); + $this->t->set_var('checked_active',($accountData['active'] ? ($preferences->userDefinedAccounts ? 'checked' : '') : '')); + } else { + if ($signatureData = $felamimail_bosignatures->getDefaultSignature()) { + if (is_array($signatureData)) { + $sigvalue = $signatureData['signatureid']; + } else { + $sigvalue =$signatureData; + } + } + $this->t->set_var('accountID','new'); + } + + $trashOptions = array_merge(array('' => lang('default').' '.lang("folder settings"), 'none' => lang("Don't use Trash")),($accountData['active'] ? $folderList :array($icServer->trashfolder => $icServer->trashfolder))); + $sentOptions = array_merge(array('' => lang('default').' '.lang("folder settings"), 'none' => lang("Don't use Sent")),($accountData['active'] ? $folderList :array($icServer->sentfolder => $icServer->sentfolder))); + $draftOptions = array_merge(array('' => lang('default').' '.lang("folder settings"), 'none' => lang("Don't use draft folder")),($accountData['active'] ? $folderList :array($icServer->draftfolder => $icServer->draftfolder))); + $templateOptions = array_merge(array('' => lang('default').' '.lang("folder settings"), 'none' => lang("Don't use template folder")),($accountData['active'] ? $folderList :array($icServer->templatefolder => $icServer->templatefolder))); + $tomerge = ($accountData['active'] ? $folderList :$icServer->folderstoshowinhome); + $folderList = array_merge( array('' => lang('default').' '.lang("folder settings")),(is_array($tomerge)?$tomerge:array())); + + $this->t->set_var('allowAccounts',($preferences->userDefinedAccounts ? 1 : 0)); + $this->t->set_var('identity_selectbox', html::select('identity[signature]',$sigvalue,$allSignatures, true, " id=\"identity[signature]\" style='width: 250px;'")); + $this->t->set_var('folder_selectbox', html::select('ic[folderstoshowinhome]',$icServer->folderstoshowinhome,$folderList, true, "id=\"ic[folderstoshowinhome]\" style='width: 250px;'",6)); + $this->t->set_var('trash_selectbox', html::select('ic[trashfolder]',$icServer->trashfolder,$trashOptions, true, "id=\"ic[trashfolder]\" style='width: 250px;'")); + $this->t->set_var('sent_selectbox', html::select('ic[sentfolder]',$icServer->sentfolder,$sentOptions, true, "id=\"ic[sentfolder]\" style='width: 250px;'")); + $this->t->set_var('draft_selectbox', html::select('ic[draftfolder]',$icServer->draftfolder,$draftOptions, true, "id=\"ic[draftfolder]\" style='width: 250px;'")); + $this->t->set_var('template_selectbox', html::select('ic[templatefolder]',$icServer->templatefolder,$templateOptions, true, "id=\"ic[templatefolder]\" style='width: 250px;'")); + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.editAccountData' + ); + $this->t->set_var('form_action',$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->parse("out","main"); + print $this->t->get('out','main'); + } + + function listFolder() + { + if (!isset($this->bofelamimail)) $this->bofelamimail = felamimail_bo::getInstance(); + $this->bofelamimail->openConnection(); + if (!isset($this->bopreferences)) $this->bopreferences = $this->bofelamimail->bopreferences; + $preferences =& $this->bopreferences->getPreferences(); + if(!(empty($preferences->preferences['prefpreventmanagefolders']) || $preferences->preferences['prefpreventmanagefolders'] == 0)) { + die('you are not allowed to be here'); + } + // rename a mailbox + if(isset($_POST['newMailboxName'])) + { + $oldMailboxName = $this->bofelamimail->sessionData['preferences']['mailbox']; + $newMailboxName = $_POST['newMailboxName']; + + if($position = strrpos($oldMailboxName,'.')) + { + $newMailboxName = substr($oldMailboxName,0,$position+1).$newMailboxName; + } + + + if($this->bofelamimail->imap_renamemailbox($oldMailboxName, $newMailboxName)) + { + $this->bofelamimail->sessionData['preferences']['mailbox'] + = $newMailboxName; + $this->bofelamimail->saveSessionData(); + } + } + + // delete a Folder + if(isset($_POST['deleteFolder']) && $this->bofelamimail->sessionData['preferences']['mailbox'] != 'INBOX') + { + if($this->bofelamimail->imap_deletemailbox($this->bofelamimail->sessionData['preferences']['mailbox'])) + { + $this->bofelamimail->sessionData['preferences']['mailbox'] + = "INBOX"; + $this->bofelamimail->saveSessionData(); + } + } + + // create a new Mailbox + if(isset($_POST['newSubFolder'])) + { + $oldMailboxName = $this->bofelamimail->sessionData['preferences']['mailbox'].'.'; + $oldMailboxName = ($oldMailboxName == '--topfolderselected--.') ? '' : $oldMailboxName; + $newMailboxName = $oldMailboxName.$_POST['newSubFolder']; + + $this->bofelamimail->imap_createmailbox($newMailboxName,True); + } + + $folderList = $this->bofelamimail->getFolderObjects(); + // check user input BEGIN + // the name of the new current folder + if(get_var('mailboxName',array('POST')) && $folderList[get_var('mailboxName',array('POST'))] || + get_var('mailboxName',array('POST')) == '--topfolderselected--') + { + $this->bofelamimail->sessionData['preferences']['mailbox'] + = get_var('mailboxName',array('POST')); + $this->bofelamimail->saveSessionData(); + } + + $this->selectedFolder = $this->bofelamimail->sessionData['preferences']['mailbox']; + + // (un)subscribe to a folder?? + if(isset($_POST['folderStatus'])) + { + $this->bofelamimail->subscribe($this->selectedFolder,$_POST['folderStatus']); + } + + $this->selectedFolder = $this->bofelamimail->sessionData['preferences']['mailbox']; + + // check user input END + + if($this->selectedFolder != '--topfolderselected--') + { + $folderStatus = $this->bofelamimail->getFolderStatus($this->selectedFolder); + } + $mailPrefs = $this->bofelamimail->getMailPreferences(); + + $this->display_app_header(TRUE); + + $this->t->set_file(array("body" => "preferences_manage_folder.tpl")); + $this->t->set_block('body','main'); + #$this->t->set_block('body','select_row'); + $this->t->set_block('body','folder_settings'); + $this->t->set_block('body','mainFolder_settings'); + #$this->t->set_block('body','folder_acl'); + + $this->translate(); + + #print "
    ";print_r($folderList);print "
    "; + // set the default values for the sort links (sort by subject) + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.listFolder' + ); + $this->t->set_var('form_action',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.addACL' + ); + $this->t->set_var('url_addACL',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.listSelectFolder', + ); + $this->t->set_var('folder_select_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + // folder select box + $icServer = $mailPrefs->getIncomingServer(0); + $folderTree = $this->uiwidgets->createHTMLFolder + ( + $folderList, + $this->selectedFolder, + 0, + lang('IMAP Server'), + $icServer->username.'@'.$icServer->host, + 'divFolderTree', + TRUE + ); + $this->t->set_var('folder_tree',$folderTree); + + switch($_GET['display']) + { + case 'settings': + default: + // selected folder data + if($folderStatus['subscribed']) + { + $this->t->set_var('subscribed_checked','checked'); + $this->t->set_var('unsubscribed_checked',''); + } + else + { + $this->t->set_var('subscribed_checked',''); + $this->t->set_var('unsubscribed_checked','checked'); + } + + if(is_array($quota)) + { + $this->t->set_var('storage_usage',$quota['STORAGE']['usage']); + $this->t->set_var('storage_limit',$quota['STORAGE']['limit']); + $this->t->set_var('message_usage',$quota['MESSAGE']['usage']); + $this->t->set_var('message_limit',$quota['MESSAGE']['limit']); + } + else + { + $this->t->set_var('storage_usage',lang('unknown')); + $this->t->set_var('storage_limit',lang('unknown')); + $this->t->set_var('message_usage',lang('unknown')); + $this->t->set_var('message_limit',lang('unknown')); + } + + if($this->selectedFolder != '--topfolderselected--') + { + $this->t->parse('settings_view','folder_settings',True); + } + else + { + $this->t->parse('settings_view','mainFolder_settings',True); + } + + break; + } + + $mailBoxTreeName = ''; + $mailBoxName = $this->selectedFolder; + if($position = strrpos($this->selectedFolder,'.')) + { + $mailBoxTreeName = substr($this->selectedFolder,0,$position+1); + $mailBoxName = substr($this->selectedFolder,$position+1); + } + + $this->t->set_var('mailboxTreeName',$mailBoxTreeName); + $this->t->set_var('mailboxNameShort',$mailBoxName); + $this->t->set_var('mailboxName',$mailBoxName); + $this->t->set_var('folderName',$this->selectedFolder); + $this->t->set_var('imap_server',$icServer->host); + + $this->t->pparse("out","main"); + $this->bofelamimail->closeConnection(); + } + + function listSignatures() + { + $this->display_app_header(TRUE); + + $this->t->set_file(array("body" => "preferences_list_signatures.tpl")); + $this->t->set_block('body','main'); + + $this->translate(); + + #print "
    ";print_r($folderList);print "
    "; + // set the default values for the sort links (sort by subject) + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.listFolder' + ); + $this->t->set_var('form_action', $GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.editSignature' + ); + $this->t->set_var('url_addSignature', $GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->set_var('url_image_add',$GLOBALS['egw']->common->image('phpgwapi','new')); + $this->t->set_var('url_image_delete',$GLOBALS['egw']->common->image('phpgwapi','delete')); + + $felamimail_bosignatures = new felamimail_bosignatures(); + $signatures = $felamimail_bosignatures->getListOfSignatures(); + + $this->t->set_var('table', $this->uiwidgets->createSignatureTable($signatures)); + + $this->t->pparse("out","main"); + $this->bofelamimail->closeConnection(); + } + + function listAccountData() + { + $this->display_app_header(TRUE); + if (!isset($this->bopreferences)) $this->bopreferences = CreateObject('felamimail.bopreferences'); + $preferences =& $this->bopreferences->getPreferences(); + $allAccountData = $this->bopreferences->getAllAccountData($preferences); + if ($allAccountData) { + foreach ($allAccountData as $tmpkey => $accountData) + { + $identity =& $accountData['identity']; + + #_debug_array($identity); + + foreach($identity as $key => $value) { + if(is_object($value) || is_array($value)) { + continue; + } + switch($key) { + default: + $tempvar[$key] = $value; + } + } + $accountArray[]=$tempvar; + } + } + $this->t->set_file(array("body" => "preferences_list_accounts.tpl")); + $this->t->set_block('body','main'); + + $this->translate(); + + #print "
    ";print_r($folderList);print "
    "; + // set the default values for the sort links (sort by subject) + #$linkData = array + #( + # 'menuaction' => 'felamimail.uipreferences.listFolder' + #); + #$this->t->set_var('form_action', $GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.editAccountData', + 'accountID' => 'new' + ); + $this->t->set_var('url_addAccount', $GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->set_var('url_image_add',$GLOBALS['egw']->common->image('phpgwapi','new')); + $this->t->set_var('url_image_delete',$GLOBALS['egw']->common->image('phpgwapi','delete')); + + $this->t->set_var('table', $this->uiwidgets->createAccountDataTable($accountArray)); + + $this->t->pparse("out","main"); + $this->bofelamimail->closeConnection(); + } + + function listSelectFolder() + { + $this->display_app_header(False); + if (!isset($this->bofelamimail)) $this->bofelamimail = felamimail_bo::getInstance(); + if (!isset($this->uiwidgets)) $this->uiwidgets = CreateObject('felamimail.uiwidgets'); + $this->bofelamimail->openConnection(); + $mailPrefs = $this->bofelamimail->getMailPreferences(); + $icServer = $mailPrefs->getIncomingServer(0); + $folderObjects = $this->bofelamimail->getFolderObjects(false); + $folderTree = $this->uiwidgets->createHTMLFolder + ( + $folderObjects, + 'INBOX', + 0, + lang('IMAP Server'), + $icServer->username.'@'.$icServer->host, + 'divFolderTree', + false, + true + ); + print ''; + print '
    '; + print $folderTree; + } + + + function translate() + { + $this->t->set_var('lang_signature',lang('Signatur')); + $this->t->set_var("lang_folder_name",lang('folder name')); + $this->t->set_var("lang_folder_list",lang('folderlist')); + $this->t->set_var("lang_select",lang('select')); + $this->t->set_var("lang_folder_status",lang('folder status')); + $this->t->set_var("lang_subscribed",lang('subscribed')); + $this->t->set_var("lang_unsubscribed",lang('unsubscribed')); + $this->t->set_var("lang_subscribe",lang('subscribe')); + $this->t->set_var("lang_unsubscribe",lang('unsubscribe')); + $this->t->set_var("lang_update",lang('update')); + $this->t->set_var("lang_rename_folder",lang('rename folder')); + $this->t->set_var("lang_create_subfolder",lang('create subfolder')); + $this->t->set_var("lang_delete_folder",lang('delete folder')); + $this->t->set_var("lang_confirm_delete",addslashes(lang("Do you really want to delete the '%1' folder?",$this->bofelamimail->sessionData['preferences']['mailbox']))); + $this->t->set_var("lang_really_delete_accountsettings",lang("Do you really want to delete the selected Accountsettings and the assosiated Identity.")); + $this->t->set_var("lang_delete",lang('delete')); + $this->t->set_var("lang_imap_server",lang('IMAP Server')); + $this->t->set_var("lang_folder_settings",lang('folder settings')); + $this->t->set_var("lang_folder_acl",lang('folder acl')); + $this->t->set_var("lang_anyone",lang('anyone')); + $this->t->set_var("lang_reading",lang('reading')); + $this->t->set_var("lang_writing",lang('writing')); + $this->t->set_var("lang_posting",lang('posting')); + $this->t->set_var("lang_none",lang('none')); + $this->t->set_var("lang_rename",lang('rename')); + $this->t->set_var("lang_move",lang('move')); + $this->t->set_var("lang_move_folder",lang('move folder')); + $this->t->set_var("lang_create",lang('create')); + $this->t->set_var('lang_open_all',lang("open all")); + $this->t->set_var('lang_close_all',lang("close all")); + $this->t->set_var('lang_add',lang("add")); + $this->t->set_var('lang_delete_selected',lang("delete selected")); + $this->t->set_var('lang_cancel',lang("close")); + $this->t->set_var('lang_ACL',lang('ACL')); + $this->t->set_var('lang_save',lang('save')); + $this->t->set_var('lang_cancel',lang('cancel')); + $this->t->set_var('lang_setrecursively',lANG('apply recursively?')); + $this->t->set_var('lang_Overview',lang('Overview')); + $this->t->set_var('lang_edit_forwarding_address',lang('edit email forwarding address')); + $this->t->set_var('lang_forwarding_address',lang('email forwarding address')); + $this->t->set_var('lang_keep_local_copy',lang('keep local copy of email')); + $this->t->set_var('hostname_address',lang('hostname / address')); + $this->t->set_var('lang_username',lang('username')); + $this->t->set_var('lang_password',lang('password')); + $this->t->set_var('lang_port',lang('port')); + $this->t->set_var('lang_apply',lang('apply')); + $this->t->set_var('lang_use_costum_settings',lang('use custom settings')); + $this->t->set_var('lang_use_custom_ids',lang('use custom identities')); + $this->t->set_var('lang_identity',lang('identity')); + $this->t->set_var('lang_name',lang('name')); + $this->t->set_var('lang_organization',lang('organization')); + $this->t->set_var('lang_emailaddress',lang('emailaddress')); + $this->t->set_var('lang_encrypted_connection',lang('encrypted connection')); + $this->t->set_var('lang_do_not_validate_certificate',lang('do not validate certificate')); + $this->t->set_var("lang_incoming_server",lang('incoming mail server(IMAP)')); + $this->t->set_var("lang_outgoing_server",lang('outgoing mail server(SMTP)')); + $this->t->set_var("auth_required",lang('authentication required')); + $this->t->set_var('lang_add_acl',lang('add acl')); + $this->t->set_var('lang_foldername',lang('foldername')); + $this->t->set_var('lang_description',lang('description')); + $this->t->set_var('lang_really_delete_signatures',lang('Do you really want to delete the selected signatures?')); + $this->t->set_var('lang_no_encryption',lang('no encryption')); + $this->t->set_var('lang_default_signature',lang('default signature')); + $this->t->set_var('lang_server_supports_sieve',lang('server supports mailfilter(sieve)')); + $this->t->set_var('lang_sent_folder', lang('sent folder')); + $this->t->set_var('lang_trash_folder', lang('trash folder')); + $this->t->set_var('lang_draft_folder', lang('draft folder')); + $this->t->set_var('lang_template_folder', lang('template folder')); + $this->t->set_var('lang_folder_to_appear_on_main_screen', lang('if shown, which folders should appear on main screen')); + $this->t->set_var('lang_confirm_delete_folder', lang('Delete this folder irreversible? ')); + $this->t->set_var("th_bg",$GLOBALS['egw_info']["theme"]["th_bg"]); + $this->t->set_var("bg01",$GLOBALS['egw_info']["theme"]["bg01"]); + $this->t->set_var("bg02",$GLOBALS['egw_info']["theme"]["bg02"]); + $this->t->set_var("bg03",$GLOBALS['egw_info']["theme"]["bg03"]); + } + } + diff --git a/felamimail/inc/class.uisieve.inc.php b/felamimail/inc/class.uisieve.inc.php new file mode 100644 index 0000000000..d865bda4a0 --- /dev/null +++ b/felamimail/inc/class.uisieve.inc.php @@ -0,0 +1,1144 @@ + True, + 'addScript' => True, + 'deactivateScript' => True, + 'decreaseFilter' => True, + 'deleteScript' => True, + 'editRule' => True, + 'editScript' => True, + 'editVacation' => True, + 'increaseFilter' => True, + 'listScripts' => True, + 'listRules' => True, + 'updateRules' => True, + 'updateVacation' => True, + 'saveVacation' => True, + 'selectFolder' => True, + 'editEmailNotification' => True, // Added email notifications + ); + + /** + * Flag if we can do a timed vaction message, requires Cyrus Admin User/Pw to enable/disable via async service + * + * @var boolean + */ + var $timed_vacation; + //var $scriptName = 'felamimail'; + + /** + * @var emailadmin_sieve + */ + var $bosieve; + + var $errorStack; + + function uisieve() + { + if(empty($GLOBALS['egw_info']['user']['preferences']['felamimail']['sieveScriptName'])) { + $GLOBALS['egw']->preferences->add('felamimail','sieveScriptName','felamimail', 'forced'); + $GLOBALS['egw']->preferences->save_repository(); + } + $this->scriptName = (!empty($GLOBALS['egw_info']['user']['preferences']['felamimail']['sieveScriptName'])) ? $GLOBALS['egw_info']['user']['preferences']['felamimail']['sieveScriptName'] : 'felamimail' ; + + $this->displayCharset = $GLOBALS['egw']->translation->charset(); + + $this->t =& CreateObject('phpgwapi.Template',EGW_APP_TPL); + $this->botranslation =& $GLOBALS['egw']->translation; + + $this->bofelamimail = felamimail_bo::getInstance(); + if (is_object($this->bofelamimail->mailPreferences)) + { + // account select box + $selectedID = $this->bofelamimail->getIdentitiesWithAccounts($identities); + // if nothing valid is found return to user defined account definition + if (empty($this->bofelamimail->icServer->host) && count($identities)==0 && $this->bofelamimail->mailPreferences->userDefinedAccounts) + { + // redirect to new personal account + egw::redirect_link('/index.php',array('menuaction'=>'felamimail.uipreferences.editAccountData', + 'accountID'=>"new", + 'msg' => lang("There is no IMAP Server configured.")." - ".lang("Please configure access to an existing individual IMAP account."), + )); + } + } + + $this->mailPreferences =& $this->bofelamimail->mailPreferences; + + $this->felamimailConfig = config::read('felamimail'); + + $this->restoreSessionData(); + + $icServer =& $this->bofelamimail->icServer; + + if(is_a($icServer,'defaultimap') && $icServer->enableSieve) { + $this->bosieve =& $icServer; + $this->timed_vacation = is_a($icServer,'cyrusimap') && $icServer->enableCyrusAdmin && + $icServer->adminUsername && $icServer->adminPassword; + } else { + die('Sieve not activated'); + } + + $this->rowColor[0] = $GLOBALS['egw_info']["theme"]["bg01"]; + $this->rowColor[1] = $GLOBALS['egw_info']["theme"]["bg02"]; + } + + function addScript() { + if($scriptName = $_POST['newScriptName']) { + #$script =& CreateObject('felamimail.Script',$scriptName); + #$script->updateScript($this->sieve); + $this->bosieve->installScript($scriptName, ''); + + // always activate and then edit the first script added + #if ($this->sieve->listscripts() && count($this->sieve->scriptlist) == 1) + #{ + # if ($this->sieve->activatescript($scriptName)) + # { + # $GLOBALS['egw']->redirect_link('/index.php',array( + # 'menuaction' => 'felamimail.uisieve.editScript', + # 'scriptname' => $scriptName, + # )); + # } + #} + } + + $this->listScripts(); + } + +# function activateScript() +# { +# $scriptName = $_GET['scriptname']; +# if(!empty($scriptName)) +# { +# if($this->bosieve->setActive($scriptName)) +# { +# #print "Successfully changed active script!
    "; +# } +# else +# { +# #print "Unable to change active script!
    "; +# /* we could display the full output here */ +# } +# } +# +# $this->listScripts(); +# } + + function buildRule($rule) + { + $andor = ' '. lang('and') .' '; + $started = 0; + if ($rule['anyof']) $andor = ' '. lang('or') .' '; + $complete = lang('IF').' '; + if ($rule['unconditional']) $complete = "[Unconditional] "; + + if ($rule['from']) + { + $match = $this->setMatchType($rule['from'],$rule['regexp']); + $complete .= "'From:' " . $match . " '" . $rule['from'] . "'"; + $started = 1; + } + if ($rule['to']) + { + if ($started) $complete .= $andor; + $match = $this->setMatchType($rule['to'],$rule['regexp']); + $complete .= "'To:' " . $match . " '" . $rule['to'] . "'"; + $started = 1; + } + if ($rule['subject']) + { + if ($started) $complete .= $andor; + $match = $this->setMatchType($rule['subject'],$rule['regexp']); + $complete .= "'Subject:' " . $match . " '" . $rule['subject'] . "'"; + $started = 1; + } + if ($rule['field'] && $rule['field_val']) + { + if ($started) $complete .= $andor; + $match = $this->setMatchType($rule['field_val'],$rule['regexp']); + $complete .= "'" . $rule['field'] . "' " . $match . " '" . $rule['field_val'] . "'"; + $started = 1; + } + if ($rule['size']) + { + $xthan = " less than '"; + if ($rule['gthan']) $xthan = " greater than '"; + if ($started) $complete .= $andor; + $complete .= "message " . $xthan . $rule['size'] . "KB'"; + $started = 1; + } + if (!$rule['unconditional']) $complete .= ' '.lang('THEN').' '; + if (preg_match("/folder/i",$rule['action'])) + $complete .= lang('file into')." '" . $rule['action_arg'] . "';"; + if (preg_match("/reject/i",$rule['action'])) + $complete .= lang('reject with')." '" . $rule['action_arg'] . "'."; + if (preg_match("/address/i",$rule['action'])) + $complete .= lang('forward to').' ' . $rule['action_arg'] .'.'; + if (preg_match("/discard/i",$rule['action'])) + $complete .= lang('discard').'.'; + if ($rule['continue']) $complete .= " [Continue]"; + if ($rule['keep']) $complete .= " [Keep a copy]"; + + return $complete; + } + + function buildVacationString($_vacation) + { +# global $script; +# $vacation = $script->vacation; + $vacation_str = ''; + if (!is_array($_vacation)) + { + return @htmlspecialchars($vacation_str, ENT_QUOTES, $GLOBALS['egw']->translation->charset()); + } + + $vacation_str .= lang('Respond'); + if (is_array($_vacation['addresses']) && $_vacation['addresses'][0]) + { + $vacation_str .= ' ' . lang('to mail sent to') . ' '; + $first = true; + foreach ($_vacation['addresses'] as $addr) + { + if (!$first) $vacation_str .= ', '; + $vacation_str .= $addr; + $first = false; + } + } + if (!empty($_vacation['days'])) + { + $vacation_str .= ' ' . lang("every %1 days",$_vacation['days']); + } + $vacation_str .= ' ' . lang('with message "%1"',$_vacation['text']); + return @htmlspecialchars($vacation_str, ENT_QUOTES, $GLOBALS['egw']->translation->charset()); + } + + function checkRule($_vacation) + { + $this->errorStack = array(); + + if (!$_vacation['text']) + { + $this->errorStack['text'] = lang('Please supply the message to send with auto-responses'.'! '); + } + + if (!$_vacation['days']) + { + $this->errorStack['days'] = lang('Please select the number of days to wait between responses'.'!'); + } + + if(is_array($_vacation['addresses'])) + { + $regexp="/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i"; + foreach ($_vacation['addresses'] as $addr) + { + if (!preg_match($regexp,$addr)) + { + $this->errorStack['addresses'] = lang('One address is not valid'.'!'); + } + } + } + else + { + $this->errorStack['addresses'] = lang('Please select a address'.'!'); + } + + if ($_vacation['status'] == 'by_date') + { + if (!$_vacation['start_date'] || !$_vacation['end_date']) + { + $this->errorStack['status'] = lang('Activating by date requires a start- AND end-date!'); + } + elseif($_vacation['start_date'] > $_vacation['end_date']) + { + $this->errorStack['status'] = lang('Vacation start-date must be BEFORE the end-date!'); + } + } + + if ($_vacation['forwards']) + { + foreach(preg_split('/, ?/',$_vacation['forwards']) as $addr) + { + if (!preg_match($regexp,$addr)) + { + $this->errorStack['forwards'] = lang('One address is not valid'.'!'); + } + } + } + + if(count($this->errorStack) == 0) + { + return true; + } + else + { + return false; + } + } + +# // RalfBecker: that does obviously nothing +# function deactivateScript() +# { +# $scriptName = get_var('scriptname',array('GET')); +# if(!empty($scriptName)) +# { +# #if($this->sieve->activatescript($scriptName)) +# #{ +# # #print "Successfully changed active script!
    "; +# #} +# #else +# #{ +# # #print "Unable to change active script!
    "; +# # /* we could display the full output here */ +# #} +# } +# +# $this->listScripts(); +# } + + function decreaseFilter() + { + $this->getRules(); /* ADDED BY GHORTH */ + $ruleID = get_var('ruleID',array('GET')); + if ($this->rules[$ruleID] && $this->rules[$ruleID+1]) + { + $tmp = $this->rules[$ruleID+1]; + $this->rules[$ruleID+1] = $this->rules[$ruleID]; + $this->rules[$ruleID] = $tmp; + } + + $this->updateScript(); + + $this->saveSessionData(); + + $this->listRules(); + } + + function display_app_header() { + if(preg_match('/^(vacation|filter)$/',get_var('editmode',array('GET')))) + $editMode = get_var('editmode',array('GET')); + else + $editMode = 'filter'; + + egw_framework::validate_file('tabs','tabs'); + egw_framework::validate_file('jscode','editProfile','felamimail'); + egw_framework::validate_file('jscode','listSieveRules','felamimail'); + $GLOBALS['egw']->js->set_onload("javascript:initAll('$editMode');"); + if($_GET['menuaction'] == 'felamimail.uisieve.editRule') { + $GLOBALS['egw']->js->set_onunload('opener.fm_sieve_cancelReload();'); + } + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + $GLOBALS['egw']->common->egw_header(); + + switch($_GET['menuaction']) { + case 'felamimail.uisieve.editRule': + break; + default: + echo $GLOBALS['egw']->framework->navbar(); + break; + } + } + + function displayRule($_ruleID, $_ruleData, $msg='') { + $preferences =& $this->mailPreferences; + // display the header + $this->display_app_header(); + $msg = html::purify($msg); + // initialize the template + $this->t->set_file(array("filterForm" => "sieveEditForm.tpl")); + $this->t->set_block('filterForm','main'); + $this->t->set_var('message',$msg); + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.editRule', + 'ruleID' => $_ruleID + ); + $this->t->set_var('action_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.selectFolder', + ); + $this->t->set_var('folder_select_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + if(is_array($_ruleData)) + { + if($_ruleData['continue']) + $this->t->set_var('continue_checked','checked'); + if($_ruleData['keep']) + $this->t->set_var('keep_checked','checked'); + if($_ruleData['regexp']) + $this->t->set_var('regexp_checked','checked'); + if(intval($_ruleData['anyof'])==1) + $_ruleData['anyof'] = 4; // set the anyof to 4 if set at all, as the template var anyof_selected is anyof_selected0 or anyof_selected4 + $this->t->set_var('anyof_selected'.intval($_ruleData['anyof']),'selected'); + $this->t->set_var('value_from',htmlspecialchars($_ruleData['from'], ENT_QUOTES, $GLOBALS['egw']->translation->charset())); + $this->t->set_var('value_to',htmlspecialchars($_ruleData['to'], ENT_QUOTES, $GLOBALS['egw']->translation->charset())); + $this->t->set_var('value_subject',htmlspecialchars($_ruleData['subject'], ENT_QUOTES, $GLOBALS['egw']->translation->charset())); + $this->t->set_var('gthan_selected'.intval($_ruleData['gthan']),'selected'); + $this->t->set_var('value_size',$_ruleData['size']); + $this->t->set_var('value_field',htmlspecialchars($_ruleData['field'], ENT_QUOTES, $GLOBALS['egw']->translation->charset())); + $this->t->set_var('value_field_val',htmlspecialchars($_ruleData['field_val'], ENT_QUOTES, $GLOBALS['egw']->translation->charset())); + $this->t->set_var('checked_action_'.$_ruleData['action'],'checked'); + $this->t->set_var('value_'.$_ruleData['action'],$_ruleData['action_arg']); + if ($_ruleData['action'] == 'folder') + { + $this->t->set_var('folderName',$_ruleData['action_arg']); + } + if (($_ruleData['action'] == 'address') && + (!empty($preferences->preferences['prefpreventforwarding']) && + $preferences->preferences['prefpreventforwarding'] == 1 )) + { + $this->t->set_var('checked_action_address',''); + $this->t->set_var('value_address',lang('not allowed')); + } + } + $this->t->set_var('value_ruleID',$_ruleID); + + // translate most of the parts + $this->translate(); + $this->t->pfp("out","main"); + } + + function editRule() + { + $preferences =& $this->mailPreferences; + $msg = ''; + $error = 0; + $this->getRules(); /* ADDED BY GHORTH */ + + $ruleType = get_var('ruletype',array('GET')); + + if(isset($_POST['anyof'])) { + if(get_var('priority',array('POST')) != 'unset') { + $newRule['priority'] = get_var('priority',array('POST')); + } + $ruleID = get_var('ruleID',array('POST')); + if($ruleID == 'unset') + $ruleID = count($this->rules); + $newRule['priority'] = $ruleID*2+1; + $newRule['status'] = 'ENABLED'; + $newRule['from'] = get_var('from',array('POST')); + $newRule['to'] = get_var('to',array('POST')); + $newRule['subject'] = get_var('subject',array('POST')); + //$newRule['flg'] = get_var('???',array('POST')); + $newRule['field'] = get_var('field',array('POST')); + $newRule['field_val'] = get_var('field_val',array('POST')); + $newRule['size'] = intval(get_var('size',array('POST'))); + $newRule['continue'] = get_var('continue',array('POST')); + $newRule['gthan'] = intval(get_var('gthan',array('POST'))); + $newRule['anyof'] = intval(get_var('anyof',array('POST'))); + $newRule['keep'] = get_var('keep',array('POST')); + $newRule['regexp'] = get_var('regexp',array('POST')); + $newRule['unconditional'] = '0'; // what's this??? + + $newRule['flg'] = 0 ; + if( $newRule['continue'] ) { $newRule['flg'] += 1; } + if( $newRule['gthan'] ) { $newRule['flg'] += 2; } + if( $newRule['anyof'] ) { $newRule['flg'] += 4; } + if( $newRule['keep'] ) { $newRule['flg'] += 8; } + if( $newRule['regexp'] ) { $newRule['flg'] += 128; } + + switch(get_var('action',array('POST'))) + { + case 'reject': + $newRule['action'] = 'reject'; + $newRule['action_arg'] = get_var('reject',array('POST')); + break; + + case 'folder': + $newRule['action'] = 'folder'; + $newRule['action_arg'] = get_var('folder',array('POST')); + #$newRule['action_arg'] = $GLOBALS['egw']->translation->convert($newRule['action_arg'], $this->charset, 'UTF7-IMAP'); + break; + + case 'address': + if (empty($preferences->preferences['prefpreventforwarding']) || + $preferences->preferences['prefpreventforwarding'] == 0 ) + { + $newRule['action'] = 'address'; + $newRule['action_arg'] = get_var('address',array('POST')); + } + else + { + $msg .= lang('Error creating rule while trying to use forward/redirect.'); + $error++; + } + break; + + case 'discard': + $newRule[action] = 'discard'; + break; + } + if($newRule['action']) { + + $this->rules[$ruleID] = $newRule; + + $this->bosieve->setRules($this->scriptName, $this->rules); + + $this->saveSessionData(); + } else { + $msg .= "\n".lang("Error: Could not save rule"); + $error++; + } + // refresh the list + $js = "opener.location.href = '".addslashes(egw::link('/index.php','menuaction=felamimail.uisieve.listRules'))."';"; + if(isset($_POST['save']) && $error == 0) { + echo "\n"; + } else { + $GLOBALS['egw']->js->set_onload($js); + $this->displayRule($ruleID, $newRule, $msg); + } + } + else + { + if(isset($_GET['ruleID'])) + { + $ruleID = get_var('ruleID',Array('GET')); + $ruleData = $this->rules[$ruleID]; + $this->displayRule($ruleID, $ruleData); + } + else + { + $this->displayRule('unset', false); + } + #LK $this->sieve->disconnet(); + } + } + + function editVacation() { + $preferences =& $this->mailPreferences; + if(!(empty($preferences->preferences['prefpreventabsentnotice']) || $preferences->preferences['prefpreventabsentnotice'] == 0)) + { + die('You should not be here!'); + } + $uiwidgets =& CreateObject('felamimail.uiwidgets',EGW_APP_TPL); + $boemailadmin = new emailadmin_bo(); + + if ($this->timed_vacation) + { + include_once(EGW_API_INC.'/class.jscalendar.inc.php'); + $jscal = new jscalendar(); + } + if($this->bosieve->getScript($this->scriptName)) + { + if(PEAR::isError($error = $this->bosieve->retrieveRules($this->scriptName)) ) + { + $rules = array(); + $vacation = array(); + } + else + { + $rules = $this->bosieve->getRules($this->scriptName); + $vacation = $this->bosieve->getVacation($this->scriptName); + } + } + else + { + // something went wrong + } + + if ($GLOBALS['egw_info']['user']['apps']['admin']) + { + // store text as default + if (isset($_POST['set_as_default'])) + { + $config = new config('felamimail'); + $config->save_value('default_vacation_text',$_POST['vacation_text'],'felamimail'); + } + $this->t->set_var('set_as_default',''); + } + if(isset($_POST["vacationStatus"])) + { + $newVacation['text'] = get_var('vacation_text',array('POST')); + $newVacation['text'] = $this->botranslation->convert($newVacation['text'],$this->displayCharset,'UTF-8'); + $newVacation['days'] = get_var('days',array('POST')); + $newVacation['addresses'] = get_var('vacationAddresses',array('POST')); + $newVacation['status'] = get_var('vacationStatus',array('POST')); + if (empty($preferences->preferences['prefpreventforwarding']) || + $preferences->preferences['prefpreventforwarding'] == 0 ) # || + #is_a($ogServer, 'defaultsmtp') || $ogServer->editForwardingAddress) + { + $newVacation['forwards'] = get_var('vacation_forwards',array('POST')); + } + if (!in_array($newVacation['status'],array('on','off','by_date'))) $newVacation['status'] = 'off'; + if ($this->timed_vacation) + { + $date = $jscal->input2date($_POST['start_date']); + if ($date['raw']) $newVacation['start_date'] = $date['raw']-12*3600; + $date = $jscal->input2date($_POST['end_date']); + if ($date['raw']) $newVacation['end_date'] = $date['raw']-12*3600; + } + if(isset($_POST['save']) || isset($_POST['apply'])) + { + if($this->checkRule($newVacation)) + { + if (!$this->bosieve->setVacation($this->scriptName, $newVacation)) + { + print "vacation update failed
    "; + #print $script->errstr."
    "; + } + else + { + //error_log(__METHOD__.__LINE__.array2string($newVacation)); + $this->bosieve->setAsyncJob($newVacation); + } + } + else + { + $this->t->set_var('validation_errors',implode('
    ',$this->errorStack)); + } + } + $vacation = $newVacation; + + if(isset($_POST['save']) || isset($_POST['cancel'])) + { + $GLOBALS['egw']->redirect_link('/felamimail/index.php'); + } + } + + $this->saveSessionData(); + + // display the header + $this->display_app_header(); + + // initialize the template + $this->t->set_file(array("filterForm" => "sieveForm.tpl")); + $this->t->set_block('filterForm','vacation'); + + // translate most of the parts + $this->translate(); + + // vacation status + if($vacation['status'] == 'on') + { + $this->t->set_var('checked_active', 'checked'); + } + elseif($vacation['status'] == 'off') + { + $this->t->set_var('checked_disabled', 'checked'); + } + + // vacation text + if (empty($vacation['text'])) { + $config = new config('felamimail'); + $config = $config->read_repository(); + $vacation['text'] = $config['default_vacation_text']; + } + $this->t->set_var('vacation_text',$this->botranslation->convert($vacation['text'],'UTF-8')); + + //vacation days + if(empty($vacation)) { + $this->t->set_var('selected_7', 'selected="selected"'); + // ToDO set default + + } else { + $this->t->set_var('selected_'.$vacation['days'], 'selected="selected"'); + } + if (empty($preferences->preferences['prefpreventforwarding']) || + $preferences->preferences['prefpreventforwarding'] == 0 ) + { + $this->t->set_var('vacation_forwards',''); + } + else + { + $this->t->set_var('vacation_forwards',lang('not allowed')); + unset($vacation['forwards']); + } + + // vacation addresses + if(is_array($vacation['addresses'])) { + foreach($vacation['addresses'] as $address) { + $selectedAddresses[$address] = $address; + } + asort($selectedAddresses); + } + + + $allIdentities = $preferences->getIdentity(); + foreach($allIdentities as $key => $singleIdentity) { + if(empty($vacation) && $singleIdentity->default === true) { + $selectedAddresses[$singleIdentity->emailAddress] = $singleIdentity->emailAddress; + } + $predefinedAddresses[$singleIdentity->emailAddress] = $singleIdentity->emailAddress; + } + asort($predefinedAddresses); + + $this->t->set_var('multiSelectBox',$uiwidgets->multiSelectBox( + $selectedAddresses, + $predefinedAddresses, + 'vacationAddresses', + '400px' + ) + ); + + $linkData = array ( + 'menuaction' => 'felamimail.uisieve.editVacation', + ); + + $this->t->set_var('vacation_action_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + if ($this->timed_vacation) + { + $this->t->set_var('by_date',' : '. + $jscal->input('start_date',$vacation['start_date']).' - '.$jscal->input('end_date',$vacation['end_date'])); + $this->t->set_var('lang_help_start_end_replacement','
    '.lang('You can use %1 for the above start-date and %2 for the end-date.','$$start$$','$$end$$')); + } + $this->t->pfp('out','vacation'); + + #LK $this->bosieve->disconnect(); + } + + function editEmailNotification() { + $preferences =& $this->mailPreferences; + if(!(empty($preferences->preferences['prefpreventnotificationformailviaemail']) || $preferences->preferences['prefpreventnotificationformailviaemail'] == 0)) + die('You should not be here!'); + + $uiwidgets =& CreateObject('felamimail.uiwidgets',EGW_APP_TPL); + $boemailadmin = new emailadmin_bo(); + + if($this->bosieve->getScript($this->scriptName)) { + if(PEAR::isError($error = $this->bosieve->retrieveRules($this->scriptName)) ) { + $rules = array(); + $emailNotification = array(); + } else { + $rules = $this->bosieve->getRules($this->scriptName); + $emailNotification = $this->bosieve->getEmailNotification($this->scriptName); + } + } else { + // something went wrong + } + + + // perform actions + if (isset($_POST["emailNotificationStatus"])) { + if (isset($_POST['save']) || isset($_POST['apply'])) { + //$newEmailNotification['text'] = $this->botranslation->convert($newVacation['text'],$this->displayCharset,'UTF-8'); + $newEmailNotification['status'] = get_var('emailNotificationStatus',array('POST')) == 'disabled' ? 'off' : 'on'; + $newEmailNotification['externalEmail'] = get_var('emailNotificationExternalEmail',array('POST')); + $newEmailNotification['displaySubject'] = get_var('emailNotificationDisplaySubject',array('POST')); + if (!$this->bosieve->setEmailNotification($this->scriptName, $newEmailNotification)) { + print lang("email notification update failed")."
    "; + print $script->errstr."
    "; + } + $emailNotification = $newEmailNotification; + } + if (isset($_POST['save']) || isset($_POST['cancel'])) { + $GLOBALS['egw']->redirect_link('/felamimail/index.php'); + } + } + + $this->saveSessionData(); + + // display the header + $this->display_app_header(); + + // initialize the template + $this->t->set_file(array("filterForm" => "sieveForm.tpl")); + $this->t->set_block('filterForm','email_notification'); + + // translate most of the parts + $this->translate(); + $this->t->set_var("lang_yes",lang('yes')); + $this->t->set_var("lang_no",lang('no')); + + // email notification status + if ($emailNotification['status'] == 'on') $this->t->set_var('checked_active', ' checked'); + else $this->t->set_var('checked_disabled', ' checked'); + + // email notification display subject + if ($emailNotification['displaySubject'] == '1') $this->t->set_var('checked_yes', ' checked'); + else $this->t->set_var('checked_no', ' checked'); + + // email notification external email + $this->t->set_var('external_email', $emailNotification['externalEmail']); + + $this->t->set_var('email_notification_action_url',$GLOBALS['egw']->link('/index.php','menuaction=felamimail.uisieve.editEmailNotification')); + $this->t->pfp('out','email_notification'); + } + + function increaseFilter() + { + $this->getRules(); /* ADDED BY GHORTH */ + $ruleID = get_var('ruleID',array('GET')); + if ($this->rules[$ruleID] && $this->rules[$ruleID-1]) + { + $tmp = $this->rules[$ruleID-1]; + $this->rules[$ruleID-1] = $this->rules[$ruleID]; + $this->rules[$ruleID] = $tmp; + } + + $this->updateScript(); + + $this->saveSessionData(); + + $this->listRules(); + } + + function listRules() + { + $preferences =& $this->mailPreferences; + + if(!(empty($preferences->preferences['prefpreventeditfilterrules']) || $preferences->preferences['prefpreventeditfilterrules'] == 0)) + die('You should not be here!'); + + $uiwidgets =& CreateObject('felamimail.uiwidgets', EGW_APP_TPL); + $boemailadmin = new emailadmin_bo(); + + $this->getRules(); /* ADDED BY GHORTH */ + + $this->saveSessionData(); + + // display the header + $this->display_app_header(); + + // initialize the template + $this->t->set_file(array('filterForm' => 'listRules.tpl')); + $this->t->set_block('filterForm','header'); + $this->t->set_block('filterForm','filterrow'); + + // translate most of the parts + $this->translate(); + + #if(!empty($this->scriptToEdit)) + #{ + $listOfImages = array( + 'up', + 'down' + ); + foreach ($listOfImages as $image) + { + $this->t->set_var('url_'.$image,$GLOBALS['egw']->common->image('felamimail',$image)); + } + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.editRule', + 'ruletype' => 'filter' + ); + $this->t->set_var('url_add_rule',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.editRule', + 'ruletype' => 'vacation' + ); + $this->t->set_var('url_add_vacation_rule',$GLOBALS['egw']->link('/index.php',$linkData)); + + foreach ($this->rules as $ruleID => $rule) + { + $this->t->set_var('filter_status',lang($rule[status])); + if($rule[status] == 'ENABLED') + { + $this->t->set_var('ruleCSS','sieveRowActive'); + } + else + { + $this->t->set_var('ruleCSS','sieveRowInActive'); + } + + $this->t->set_var('filter_text',htmlspecialchars($this->buildRule($rule),ENT_QUOTES,$GLOBALS['egw']->translation->charset())); + $this->t->set_var('ruleID',$ruleID); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.editRule', + 'ruleID' => $ruleID, + ); + $this->t->set_var('url_edit_rule',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.increaseFilter', + 'ruleID' => $ruleID, + ); + $this->t->set_var('url_increase',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.decreaseFilter', + 'ruleID' => $ruleID, + ); + $this->t->set_var('url_decrease',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.updateRules', + ); + $this->t->set_var('action_rulelist',$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->parse('filterrows','filterrow',true); + } + + #} + + $linkData = array ( + 'menuaction' => 'felamimail.uisieve.saveScript' + ); + $this->t->set_var('formAction',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array ( + 'menuaction' => 'felamimail.uisieve.listRules' + ); + $this->t->set_var('refreshURL',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.listScripts', + 'scriptname' => $scriptName + ); + $this->t->set_var('url_back',$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->pfp("out","header"); + + #LK $this->bosieve->disconnect(); + } + + function restoreSessionData() + { + $sessionData = $GLOBALS['egw']->session->appsession('sieve_session_data'); + + $this->rules = $sessionData['sieve_rules']; + $this->scriptToEdit = $sessionData['sieve_scriptToEdit']; + } + + function selectFolder() + { + // this call loads js and css for the treeobject + html::tree(false,false,false,null,'foldertree','','',false,'/',null,false); + egw_framework::validate_file('jscode','editSieveRule','felamimail'); + $GLOBALS['egw']->common->egw_header(); + + $bofelamimail =& $this->bofelamimail; + $uiwidgets =& CreateObject('felamimail.uiwidgets'); + $connectionStatus = $bofelamimail->openConnection(); + + $folderObjects = $bofelamimail->getFolderObjects(true,false); + $folderTree = $uiwidgets->createHTMLFolder + ( + $folderObjects, + 'INBOX', + 0, + lang('IMAP Server'), + $mailPreferences['username'].'@'.$mailPreferences['imapServerAddress'], + 'divFolderTree', + false, + true + ); + print '
    '; + print $folderTree; + } + + function setMatchType (&$matchstr, $regex = false) + { + $match = lang('contains'); + if (preg_match("/\s*!/", $matchstr)) + $match = lang('does not contain'); + if (preg_match("/\*|\?/", $matchstr)) + { + $match = lang('matches'); + if (preg_match("/\s*!/", $matchstr)) + $match = lang('does not match'); + } + if ($regex) + { + $match = lang('matches regexp'); + if (preg_match("/\s*!/", $matchstr)) + $match = lang('does not match regexp'); + } + $matchstr = preg_replace("/^\s*!/","",$matchstr); + + return $match; + } + + function saveScript() + { + $scriptName = $_POST['scriptName']; + $scriptContent = $_POST['scriptContent']; + if(isset($scriptName) and isset($scriptContent)) + { + if($this->sieve->sieve_sendscript($scriptName, stripslashes($scriptContent))) + { + #print "Successfully loaded script onto server. (Remember to set it active!)
    "; + } + else + { +/* print "Unable to load script to server. See server response below:
    "; + if(is_array($sieve->error_raw)) + foreach($sieve->error_raw as $error_raw) + print $error_raw."
    "; + else + print $sieve->error_raw."
    "; + print "
    "; + $textarea=stripslashes($script); + $textname=$scriptname; + $titleline="Try editing the script again! Create new script";*/ + } + } + $this->mainScreen(); + } + + function saveSessionData() + { + $sessionData['sieve_rules'] = $this->rules; + $sessionData['sieve_scriptToEdit'] = $this->scriptToEdit; + + $GLOBALS['egw']->session->appsession('sieve_session_data','',$sessionData); + } + + function translate() + { + $this->t->set_var("lang_message_list",lang('Message List')); + $this->t->set_var("lang_from",lang('from')); + $this->t->set_var("lang_to",lang('to')); + $this->t->set_var("lang_save",lang('save')); + $this->t->set_var("lang_apply",lang('apply')); + $this->t->set_var("lang_cancel",lang('cancel')); + $this->t->set_var("lang_active",lang('active')); + $this->t->set_var('lang_disabled',lang('disabled')); + $this->t->set_var('lang_status',lang('status')); + $this->t->set_var("lang_edit",lang('edit')); + $this->t->set_var("lang_delete",lang('delete')); + $this->t->set_var("lang_enable",lang('enable')); + $this->t->set_var("lang_rule",lang('rule')); + $this->t->set_var("lang_disable",lang('disable')); + $this->t->set_var("lang_action",lang('action')); + $this->t->set_var("lang_condition",lang('condition')); + $this->t->set_var("lang_subject",lang('subject')); + $this->t->set_var("lang_filter_active",lang('filter active')); + $this->t->set_var("lang_filter_name",lang('filter name')); + $this->t->set_var("lang_new_filter",lang('new filter')); + $this->t->set_var("lang_no_filter",lang('no filter')); + $this->t->set_var("lang_add_rule",lang('add rule')); + $this->t->set_var("lang_add_script",lang('add script')); + $this->t->set_var("lang_back",lang('back')); + $this->t->set_var("lang_days",lang('days')); + $this->t->set_var("lang_save_changes",lang('save changes')); + $this->t->set_var("lang_extended",lang('extended')); + $this->t->set_var("lang_edit_vacation_settings",lang('edit vacation settings')); + $this->t->set_var("lang_every",lang('every')); + $this->t->set_var('lang_respond_to_mail_sent_to',lang('respond to mail sent to')); + $this->t->set_var('lang_filter_rules',lang('filter rules')); + $this->t->set_var('lang_vacation_notice',lang('vacation notice')); + $this->t->set_var("lang_with_message",lang('with message')); + $this->t->set_var("lang_script_name",lang('script name')); + $this->t->set_var("lang_script_status",lang('script status')); + $this->t->set_var("lang_delete_script",lang('delete script')); + $this->t->set_var("lang_check_message_against_next_rule_also",lang('check message against next rule also')); + $this->t->set_var("lang_keep_a_copy_of_the_message_in_your_inbox",lang('keep a copy of the message in your inbox')); + $this->t->set_var("lang_use_regular_expressions",lang('use regular expressions')); + $this->t->set_var("lang_match",lang('match')); + $this->t->set_var("lang_all_of",lang('all of')); + $this->t->set_var("lang_any_of",lang('any of')); + $this->t->set_var("lang_if_from_contains",lang('if from contains')); + $this->t->set_var("lang_if_to_contains",lang('if to contains')); + $this->t->set_var("lang_if_subject_contains",lang('if subject contains')); + $this->t->set_var("lang_if_message_size",lang('if message size')); + $this->t->set_var("lang_less_than",lang('less than')); + $this->t->set_var("lang_greater_than",lang('greater than')); + $this->t->set_var("lang_kilobytes",lang('kilobytes')); + $this->t->set_var("lang_if_mail_header",lang('if mail header')); + $this->t->set_var("lang_file_into",lang('file into')); + $this->t->set_var("lang_forward_to_address",lang('forward to address')); + $this->t->set_var("lang_send_reject_message",lang('send a reject message')); + $this->t->set_var("lang_discard_message",lang('discard message')); + $this->t->set_var("lang_select_folder",lang('select folder')); + $this->t->set_var("lang_vacation_forwards",lang('Forward messages to').'
    '.lang('(separate multiple addresses by comma)').":"); + + $this->t->set_var("bg01",$GLOBALS['egw_info']["theme"]["bg01"]); + $this->t->set_var("bg02",$GLOBALS['egw_info']["theme"]["bg02"]); + $this->t->set_var("bg03",$GLOBALS['egw_info']["theme"]["bg03"]); + } + + function updateRules() + { + $this->getRules(); /* ADDED BY GHORTH */ + $action = get_var('rulelist_action',array('POST')); + $ruleIDs = get_var('ruleID',array('POST')); + $scriptName = get_var('scriptname',array('GET')); + + switch($action) + { + case 'enable': + if(is_array($ruleIDs)) + { + foreach($ruleIDs as $ruleID) + { + $this->rules[$ruleID][status] = 'ENABLED'; + } + } + break; + + case 'disable': + if(is_array($ruleIDs)) + { + foreach($ruleIDs as $ruleID) + { + $this->rules[$ruleID][status] = 'DISABLED'; + } + } + break; + + case 'delete': + if(is_array($ruleIDs)) + { + foreach($ruleIDs as $ruleID) + { + unset($this->rules[$ruleID]); + } + } + $this->rules = array_values($this->rules); + break; + } + + $this->updateScript(); + + $this->saveSessionData(); + + $this->listRules(); + } + + function updateScript() + { + if (!$this->bosieve->setRules($this->scriptToEdit, $this->rules)) { + print "update failed
    ";exit; + #LK print $script->errstr."
    "; + } + } + + /* ADDED BY GHORTH */ + function getRules() + { + if($script = $this->bosieve->getScript($this->scriptName)) { + $this->scriptToEdit = $this->scriptName; + if(PEAR::isError($error = $this->bosieve->retrieveRules($this->scriptName)) ) { + error_log(__METHOD__.__LINE__.$error->message); + $this->rules = array(); + $this->vacation = array(); + } else { + $this->rules = $this->bosieve->getRules($this->scriptName); + $this->vacation = $this->bosieve->getVacation($this->scriptName); + } + } else { + // something went wrong + error_log(__METHOD__.__LINE__.' failed'); + } + } + } +?> diff --git a/felamimail/inc/class.uiwidgets.inc.php b/felamimail/inc/class.uiwidgets.inc.php new file mode 100644 index 0000000000..8cc9e610e9 --- /dev/null +++ b/felamimail/inc/class.uiwidgets.inc.php @@ -0,0 +1,1865 @@ + + * @copyright (c) 2009-10 by Klaus Leithoff + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * a class containing javascript enhanced html widgets + */ +class uiwidgets +{ + var $charset; + /** + * Reference to felamimail_bo + * + * @var felamimail_bo + */ + var $bofelamimail; + var $_connectionStatus; + var $sessionData; + var $profileID = 0; + /** + * Instance of template class for felamimail + * + * @var Template + */ + var $template; + /** + * Use a preview pane: depends on preference and NOT using a mobile browser + * + * @var boolean + */ + var $use_preview = false; + var $messageListMinHeight = 100; + + /** + * Constructor + */ + function uiwidgets() + { + $this->template = new Template(common::get_tpl_dir('felamimail')); + $this->template->set_file(array("body" => 'uiwidgets.tpl')); + $this->charset = translation::charset(); + if (isset($GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID'])) + $this->profileID = (int)$GLOBALS['egw_info']['user']['preferences']['felamimail']['ActiveProfileID']; + + $this->bofelamimail = felamimail_bo::getInstance(true,$this->profileID); + $this->_connectionStatus = $this->bofelamimail->openConnection($this->profileID); + $this->sessionData =& $GLOBALS['egw']->session->appsession('session_data','felamimail'); + $previewFrameHeight = -1; + if ($GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight'] && + stripos($GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight'],',') !== false) + { + list($previewFrameHeight, $messageListHeight) = explode(',',$GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight']); + $previewFrameHeight = trim($previewFrameHeight); + $messageListHeight = trim($messageListHeight); + if (!empty($messageListHeight) && $messageListHeight>$this->messageListMinHeight) $this->messageListMinHeight = $messageListHeight; + } + $this->use_preview = !html::$ua_mobile && ($GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight'] > 0 || $previewFrameHeight > 0); + } + + function encodeFolderName($_folderName) + { + return translation::convert($_folderName, 'UTF7-IMAP', $this->charset); + } + + /** + * create a folder tree + * + * this function will create a foldertree based on javascript + * on click the sorounding form gets submitted + * + * @param _folders array containing the list of folders + * @param _selected string containing the selected folder + * @param _selectedFolderCount integer contains the count of unread messages in the selected folder + * @param _topFolderName string containing the top folder name + * @param _topFolderDescription string containing the description for the top folder + * @param _formName string name of the sorounding form + * @param _hiddenVar string hidden form value, transports the selected folder + * @param _useDisplayCharset bool use displaycharset for foldernames (used by uisieve only) + * + * @return string the html code, to be added into the template + */ + function createHTMLFolder($_folders, $_selected, $_selectedFolderCount, $_topFolderName, $_topFolderDescription, $_divName, $_displayCheckBox, $_useDisplayCharset = false) { + $preferences = $this->bofelamimail->mailPreferences; + //_debug_array(felamimail_bo::$autoFolders); + $userDefinedFunctionFolders = array(); + if (isset($preferences->preferences['trashFolder']) && + $preferences->preferences['trashFolder'] != 'none') $userDefinedFunctionFolders['Trash'] = $preferences->preferences['trashFolder']; + if (isset($preferences->preferences['sentFolder']) && + $preferences->preferences['sentFolder'] != 'none') $userDefinedFunctionFolders['Sent'] = $preferences->preferences['sentFolder']; + if (isset($preferences->preferences['draftFolder']) && + $preferences->preferences['draftFolder'] != 'none') $userDefinedFunctionFolders['Drafts'] = $preferences->preferences['draftFolder']; + if (isset($preferences->preferences['templateFolder']) && + $preferences->preferences['templateFolder'] != 'none') $userDefinedFunctionFolders['Templates'] = $preferences->preferences['templateFolder']; + // create a list of all folders, also the ones which are not subscribed + foreach($_folders as $key => $obj) { + $folderParts = explode($obj->delimiter,$key); + if(is_array($folderParts)) { + $partCount = count($folderParts); + $string = ''; + for($i = 0; $i < $partCount-1; $i++) { + if(!empty($string)) $string .= $obj->delimiter; + $string .= $folderParts[$i]; + if(!$allFolders[$string]) { + $allFolders[$string] = clone($obj); + $allFolders[$string]->folderName = $string; + $allFolders[$string]->shortFolderName = array_pop(explode($obj->delimiter, $string)); + $allFolders[$string]->displayName = $this->encodeFolderName($allFolders[$string]->folderName); + $allFolders[$string]->shortDisplayName = $this->encodeFolderName($allFolders[$string]->shortFolderName); + } + } + } + $allFolders[$key] = $obj; + } + + $folderImageDir = $GLOBALS['egw_info']['server']['webserver_url'].'/phpgwapi/templates/default/images'; + + // careful! "d = new..." MUST be on a new line!!! + $folder_tree_new .= ""; + + return $folder_tree_new; + } + + function createSignatureTable($_signatureList) + { + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.editSignature' + ); + $urlEditSignature = $GLOBALS['egw']->link('/index.php',$linkData); + + if(is_array($_signatureList) && !empty($_signatureList)) { + foreach($_signatureList as $signature) { + $description = ($signature['fm_defaultsignature'] == true) ? $signature['fm_description'] .' ('. lang('default') .')' : $signature['fm_description']; + $tableRows[] = array( + '1' => $signature['fm_signatureid'] != -1 ? html::checkbox('signatureID', false, $signature['fm_signatureid']) : '', + '.1' => 'style="width:30px"', + '2' => ''. @htmlspecialchars($description, ENT_QUOTES, $this->charset) .'', + ); + } + + return html::table($tableRows, 'style="width:100%;"'); + } + + return ''; + } + + function createAccountDataTable($_identities) + { + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.editAccountData' + ); + $urlEditAccountData = $GLOBALS['egw']->link('/index.php',$linkData); + + if(is_array($_identities) && !empty($_identities)) { + foreach($_identities as $identity) { + $description = $identity['id'].":".$identity['realName']." ".$identity['organization']." <".$identity['emailAddress'].">"; + $description = ($identity['default'] == true) ? $description .' ('. lang('default') .')' : $description; + $tableRows[] = array( + '1' => $identity['id'] != -1 ? html::checkbox('accountID', false, $identity['id']) : '', + '.1' => 'style="width:30px"', + '2' => ''. @htmlspecialchars($description, ENT_QUOTES, $this->charset) .'', + ); + } + + return html::table($tableRows, 'style="width:100%;"'); + } + + return ''; + } + + private function get_actions(array &$action_links=array()) + { + // dublicated from felamimail_hooks + static $deleteOptions = array( + 'move_to_trash' => 'move to trash', + 'mark_as_deleted' => 'mark as deleted', + 'remove_immediately' => 'remove immediately', + ); + // todo: real hierarchical folder list + $folders = array( + 'INBOX' => 'INBOX', + 'Drafts' => 'Drafts', + 'Sent' => 'Sent', + ); + + $actions = array( + 'open' => array( + 'caption' => lang('Open'), + 'group' => ++$group, + 'onExecute' => 'javaScript:mail_open', + 'allowOnMultiple' => false, + 'default' => true, + ), + /* not necessary, as it's now a prominent button + 'compose' => array( + 'caption' => 'Compose', + 'icon' => 'new', + 'group' => $group, + 'onExecute' => 'javaScript:mail_compose', + 'allowOnMultiple' => false, + ),*/ + 'reply' => array( + 'caption' => 'Reply', + 'icon' => 'mail_reply', + 'group' => ++$group, + 'onExecute' => 'javaScript:mail_compose', + 'allowOnMultiple' => false, + ), + 'reply_all' => array( + 'caption' => 'Reply All', + 'icon' => 'mail_replyall', + 'group' => $group, + 'onExecute' => 'javaScript:mail_compose', + 'allowOnMultiple' => false, + ), + 'forward' => array( + 'caption' => 'Forward', + 'icon' => 'mail_forward', + 'group' => $group, + 'onExecute' => 'javaScript:mail_compose', + ), + 'composeasnew' => array( + 'caption' => 'Compose as new', + 'icon' => 'new', + 'group' => $group, + 'onExecute' => 'javaScript:mail_compose', + 'allowOnMultiple' => false, + ), + 'infolog' => array( + 'caption' => 'InfoLog', + 'hint' => 'Save as InfoLog', + 'icon' => 'infolog/navbar', + 'group' => ++$group, + 'onExecute' => 'javaScript:mail_infolog', + 'url' => 'menuaction=infolog.infolog_ui.import_mail', + 'popup' => egw_link::get_registry('infolog', 'add_popup'), + 'allowOnMultiple' => false, + ), + 'tracker' => array( + 'caption' => 'Tracker', + 'hint' => 'Save as ticket', + 'group' => $group, + 'icon' => 'tracker/navbar', + 'onExecute' => 'javaScript:mail_tracker', + 'url' => 'menuaction=tracker.tracker_ui.import_mail', + 'popup' => egw_link::get_registry('tracker', 'add_popup'), + 'allowOnMultiple' => false, + ), + 'print' => array( + 'caption' => 'Print', + 'group' => ++$group, + 'onExecute' => 'javaScript:mail_print', + 'allowOnMultiple' => false, + ), + 'save' => array( + 'caption' => 'Save', + 'hint' => 'Save message to disk', + 'group' => $group, + 'icon' => 'fileexport', + 'onExecute' => 'javaScript:mail_save', + 'allowOnMultiple' => false, + ), + 'header' => array( + 'caption' => 'Header', + 'hint' => 'View header lines', + 'group' => $group, + 'icon' => 'kmmsgread', + 'onExecute' => 'javaScript:mail_header', + 'allowOnMultiple' => false, + ), +/* + 'select_all' => array( + 'caption' => 'Select all', + 'checkbox' => true, + 'hint' => 'All messages in folder', + 'group' => ++$group, + ), +*/ + 'mark' => array( + 'caption' => 'Mark as', + 'icon' => 'read_small', + 'group' => ++$group, + 'children' => array( + 'flagged' => array( + 'caption' => 'Flagged', + 'icon' => 'unread_flagged_small', + 'onExecute' => 'javaScript:mail_flag', + //'disableClass' => 'flagged', + //'enabled' => "javaScript:mail_disabledByClass", + 'shortcut' => egw_keymanager::shortcut(egw_keymanager::F, true, true), + ), + 'unflagged' => array( + 'caption' => 'Unflagged', + 'icon' => 'read_flagged_small', + 'onExecute' => 'javaScript:mail_flag', + //'enableClass' => 'flagged', + //'enabled' => "javaScript:mail_enabledByClass", + 'shortcut' => egw_keymanager::shortcut(egw_keymanager::U, true, true), + ), + 'read' => array( + 'caption' => 'Read', + 'icon' => 'read_small', + 'onExecute' => 'javaScript:mail_flag', + //'enableClass' => 'unseen', + //'enabled' => "javaScript:mail_enabledByClass", + ), + 'unread' => array( + 'caption' => 'Unread', + 'icon' => 'unread_small', + 'onExecute' => 'javaScript:mail_flag', + //'disableClass' => 'unseen', + //'enabled' => "javaScript:mail_disabledByClass", + ), + 'undelete' => array( + 'caption' => 'Undelete', + 'icon' => 'revert', + 'onExecute' => 'javaScript:mail_flag', + 'enableClass' => 'deleted', + 'enabled' => "javaScript:mail_enabledByClass", + ), + ), + ), +/* + 'move' => array( + 'caption' => 'Move to', + 'group' => $group, + 'icon' => 'move', + 'children' => $folders, + 'prefix' => 'move_', + 'onExecute' => 'javaScript:mail_move', + ), + 'copy' => array( + 'caption' => 'Copy to', + 'group' => $group, + 'icon' => 'copy', + 'children' => $folders, + 'prefix' => 'copy_', + 'onExecute' => 'javaScript:mail_copy', + ), +*/ + 'delete' => array( + 'caption' => 'Delete', + 'hint' => $deleteOptions[$this->bofelamimail->mailPreferences->preferences['deleteOptions']], + 'group' => ++$group, + 'onExecute' => 'javaScript:mail_delete', + ), + 'drag_mail' => array( + 'dragType' => 'mail', + 'type' => 'drag', + 'onExecute' => 'javaScript:mail_dragStart', + ), + 'drop_move_mail' => array( + 'type' => 'drop', + 'acceptedTypes' => 'mail', + 'icon' => 'move', + 'caption' => 'Move to', + 'onExecute' => 'javaScript:mail_move' + ), + 'drop_copy_mail' => array( + 'type' => 'drop', + 'acceptedTypes' => 'mail', + 'icon' => 'copy', + 'caption' => 'Copy to', + 'onExecute' => 'javaScript:mail_copy' + ), + 'drop_cancel' => array( + 'caption' => 'Cancel', + 'acceptedTypes' => 'mail', + 'type' => 'drop', + ), + ); + // save as tracker, save as infolog, as this are actions that are either available for all, or not, we do that for all and not via css-class disabling + if (!isset($GLOBALS['egw_info']['user']['apps']['infolog'])) + { + unset($actions['infolog']); + } + if (!isset($GLOBALS['egw_info']['user']['apps']['tracker'])) + { + unset($actions['tracker']); + } + + return nextmatch_widget::egw_actions($actions, 'felamimail', '', $action_links); + } + + function get_grid_js($foldertype,$_folderName,&$rowsFetched,$offset=0,$headers=false,$getAllIds=false) + { + //error_log(__METHOD__.__LINE__.array2string(array('Foldertype'=>$foldertype,'Foldername'=>$_folderName,'Offset'=>$offset,'getAllIds'=>$getAllIds))); + $action_links=array(); + $js = ' '; + //error_log(__METHOD__.__LINE__.' Rows fetched:'.$rowsFetched); + return $js; + } + + /** + * not used, as it fetches all data forv the given mailbox + */ + function get_all_ids($_folderName,$folderType,&$rowsFetched,$headers=false) + { + //error_log(__METHOD__.__LINE__.' Data:'.array2string($_folderName)); + $this->bofelamimail->restoreSessionData(); + $previewMessage = $this->sessionData['previewMessage']; + if ($headers) + { + $sortResult = $headers; + } + else + { + $reverse = (bool)$this->sessionData['sortReverse']; + $sR = $this->bofelamimail->getSortedList( + $_folderName, + $this->sessionData['sort'], + $reverse, + (array)$this->sessionData['messageFilter'], + $rByUid=true + ); + if($reverse === true) $sR = array_reverse((array)$sR); + $sortResult = array(); + if (is_array($sR) && count($sR)>0) + { + // fetch first 50 headers + $sortResultwH = $this->bofelamimail->getHeaders( + $_folderName, + $offset=0, + $maxMessages=50, + $this->sessionData['sort'], + $reverse, + (array)$this->sessionData['messageFilter'], + array_slice($sR,0,50) + ); + } + + foreach ((array)$sR as $key => $v) + { + if (array_key_exists($key,(array)$sortResultwH['header'])==true) + { + $sortResult['header'][] = $sortResultwH['header'][$key]; + } + else + { + $sortResult['header'][] = array('uid'=>$v); + } + } + } + $rowsFetched['rowsFetched'] = count($sortResult['header']); + $rowsFetched['messages'] = count($sR); + //error_log(__METHOD__.__LINE__.' Data:'.array2string($sortResult)); + $cols = array('check','status','attachments','subject','toaddress','fromaddress','date','size'); + if ($GLOBALS['egw_info']['user']['preferences']['common']['select_mode']=='EGW_SELECTMODE_TOGGLE') unset($cols[0]); + return $this->header2gridelements($sortResult['header'],$cols, $_folderName, $uidOnly=false,$folderType,$dataForXMails=50,$previewMessage); + } + + function get_range($_folderName,$folderType,&$rowsFetched,$offset,$uidOnly=false,$headers=false) + { + //error_log(__METHOD__.__LINE__.' Folder:'.array2string($_folderName).' FolderType:'.$folderType.' RowsFetched:'.array2string($rowsFetched)." these Uids:".array2string($uidOnly).' Headers passed:'.array2string($headers)); + $this->bofelamimail->restoreSessionData(); + $maxMessages = 50; // match the hardcoded setting for data retrieval as inital value + if (isset($this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior']) && (int)$this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior'] <> 0) + $maxMessages = (int)$this->bofelamimail->mailPreferences->preferences['prefMailGridBehavior']; + $previewMessage = $this->sessionData['previewMessage']; + if ($headers) + { + $sortResult = $headers; + } + else + { + if ($maxMessages < 0) + { + // we should never end up here, but ... + error_log(__METHOD__.__LINE__.' Data:'.array2string($_folderName)); + return $this->get_all_ids($_folderName,$folderType,$headers=false); + } + else + { + $sRToFetch = null; + $rowsFetched['messages'] = null; + $reverse = (bool)$this->sessionData['sortReverse']; + //error_log(__METHOD__.__LINE__.' maxMessages:'.$maxMessages.' Offset:'.$offset.' Filter:'.array2string($this->sessionData['messageFilter'])); + if ($maxMessages > 75) + { + $sR = $this->bofelamimail->getSortedList( + $_folderName, + $this->sessionData['sort'], + $reverse, + (array)$this->sessionData['messageFilter'], + $rByUid=true + ); + $rowsFetched['messages'] = count($sR); + + if($reverse === true) $sR = array_reverse((array)$sR); + $sR = array_slice($sR,($offset==0?0:$offset-1),$maxMessages); // we need only $maxMessages of uids + $sRToFetch = array_slice($sR,0,50); // we fetch only the headers of a subset of the fetched uids + //error_log(__METHOD__.__LINE__.' Rows fetched (UID only):'.count($sR).' Data:'.array2string($sR)); + $maxMessages = 50; + $sortResultwH['header'] = array(); + if (count($sRToFetch)>0) + { + //error_log(__METHOD__.__LINE__.' Headers to fetch with UIDs:'.count($sRToFetch).' Data:'.array2string($sRToFetch)); + $sortResult = array(); + // fetch headers + $sortResultwH = $this->bofelamimail->getHeaders( + $_folderName, + $offset, + $maxMessages, + $this->sessionData['sort'], + $reverse, + (array)$this->sessionData['messageFilter'], + $sRToFetch + ); + } + } + else + { + $sortResult = array(); + // fetch headers + $sortResultwH = $this->bofelamimail->getHeaders( + $_folderName, + $offset, + $maxMessages, + $this->sessionData['sort'], + $reverse, + (array)$this->sessionData['messageFilter'] + ); + $rowsFetched['messages'] = $sortResultwH['info']['total']; + } + if (is_array($sR) && count($sR)>0) + { + foreach ((array)$sR as $key => $v) + { + if (array_key_exists($key,(array)$sortResultwH['header'])==true) + { + $sortResult['header'][] = $sortResultwH['header'][$key]; + } + else + { + $sortResult['header'][] = array('uid'=>$v); + } + } + } + else + { + $sortResult = $sortResultwH; + } + } + } + $rowsFetched['rowsFetched'] = count($sortResult['header']); + if (empty($rowsFetched['messages'])) $rowsFetched['messages'] = $rowsFetched['rowsFetched']; + + //error_log(__METHOD__.__LINE__.' Rows fetched:'.$rowsFetched.' Data:'.array2string($sortResult)); + $cols = array('check','status','attachments','subject','toaddress','fromaddress','date','size'); + if ($GLOBALS['egw_info']['user']['preferences']['common']['select_mode']=='EGW_SELECTMODE_TOGGLE') unset($cols[0]); + return $this->header2gridelements($sortResult['header'],$cols, $_folderName, $uidOnly,$folderType,$dataForXMails=50,$previewMessage); + } + + private static function get_columns_obj($load_userdata = true, $foldertype=0,$_folderName='') + { + $f_md5=''; + if (!empty($_folderName)) $f_md5=md5($_folderName); + if (empty($_folderName)) error_log(__METHOD__.__LINE__.' Empty FolderName:'.$_folderName.' ->'.$f_md5.' backtrace:'.function_backtrace()); + $obj = new egw_grid_columns('felamimail', 'mainview'.$f_md5); //app- and grid-name + //error_log(__METHOD__.__LINE__.'SelectMode:'.$GLOBALS['egw_info']['user']['preferences']['common']['select_mode']); + switch($GLOBALS['egw_info']['user']['preferences']['felamimail']['rowOrderStyle']) { + case 'outlook': + $default_data = array( + array( + "id" => "check", + "caption" => lang('Selection'), + "type" => EGW_COL_TYPE_CHECKBOX, + //"width" => "20px", + "visibility" => EGW_COL_VISIBILITY_INVISIBLE, + ), + array( + "id" => "status", + "caption" => '', + "width" => "20px", + "visibility" => EGW_COL_VISIBILITY_ALWAYS_NOSELECT, + ), + array( + "id" => "attachments", + "caption" => '', + "width" => "26px", + "visibility" => EGW_COL_VISIBILITY_ALWAYS_NOSELECT, + ), + array( + "id" => "toaddress", // sent or drafts or template folder means foldertype > 0, use to address instead of from + "caption" => ''.lang("to").'', + "width" => "120px", + "visibility" => ($foldertype>0?EGW_COL_VISIBILITY_VISIBLE:EGW_COL_VISIBILITY_INVISIBLE) + ), + array( + "id" => "fromaddress",// sent or drafts or template folder means foldertype > 0, use to address instead of from + "caption" => ''.lang("from").'', + "width" => "120px", + "visibility" => ($foldertype>0?EGW_COL_VISIBILITY_INVISIBLE:EGW_COL_VISIBILITY_VISIBLE) + ), + array( + "id" => "subject", + "caption" => ''.lang("subject").'', + "visibility" => EGW_COL_VISIBILITY_ALWAYS + ), + array( + "id" => "date", + "width" => "95px", + "caption" => ''.lang("date").'', + ), + array( + "id" => "size", + "caption" => ''.lang("size").'', + "width" => "40px", + ), + ); + break; + default: + $default_data = array( + array( + "id" => "check", + "caption" => lang('Selection'), + "type" => EGW_COL_TYPE_CHECKBOX, + //"width" => "20px", + "visibility" => EGW_COL_VISIBILITY_INVISIBLE, + ), + array( + "id" => "status", + "caption" => '', + "width" => "20px", + "visibility" => EGW_COL_VISIBILITY_ALWAYS_NOSELECT, + ), + array( + "id" => "attachments", + "caption" => '', + "width" => "26px", + "visibility" => EGW_COL_VISIBILITY_ALWAYS_NOSELECT, + ), + array( + "id" => "subject", + "caption" => ''.lang("subject").'', + "visibility" => EGW_COL_VISIBILITY_ALWAYS, + ), + array( + "id" => "date", + "width" => "105px", + "caption" => ''.lang("date").'', + ), + array( + "id" => "toaddress",// sent or drafts or template folder means foldertype > 0, use to address instead of from + "caption" => ''.lang("to").'', + "width" => "120px", + "visibility" => ($foldertype>0?EGW_COL_VISIBILITY_VISIBLE:EGW_COL_VISIBILITY_INVISIBLE) + ), + array( + "id" => "fromaddress",// sent or drafts or template folder means foldertype > 0, use to address instead of from + "caption" => ''.lang("from").'', + "width" => "120px", + "visibility" => ($foldertype>0?EGW_COL_VISIBILITY_INVISIBLE:EGW_COL_VISIBILITY_VISIBLE) + ), + array( + "id" => "size", + "caption" => ''.lang("size").'', + "width" => "40px", + ), + ); + break; + } + // unset the check column if not needed for usability e.g.: TOGGLE mode + if ($GLOBALS['egw_info']['user']['preferences']['common']['select_mode']=='EGW_SELECTMODE_TOGGLE') unset($default_data[0]); + // Store the generated data structure inside the object + $obj->load_grid_data($default_data); + + if ($load_userdata) + { + // Load the userdata + $obj->load_userdata(); + } + //error_log(__METHOD__.__LINE__.array2string($obj)); + return $obj; + } + + /** + * AJAX function for storing the column data + */ + public function ajax_store_coldata($data) + { + $this->bofelamimail->restoreSessionData(); + $_folderName = $this->bofelamimail->sessionData['mailbox']; + $folderType = $this->bofelamimail->getFolderType($_folderName); + $obj = self::get_columns_obj(true,$folderType,$_folderName); + $obj->store_userdata($data); + } + + /** + * Interface function for fetching the data requested by the grid view + */ + public function ajax_fetch_data($elements, $columns) + { + $response = egw_json_response::get(); + if (count($elements)>0) + { + //error_log(__METHOD__.__LINE__.' Uids to fetch:'.count($elements).'->'.array2string($elements).' Columns to fetch:'.array2string($columns)); + $this->bofelamimail->restoreSessionData(); + //$maxMessages = $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]; + $maxMessages = count($elements); + //if (empty($maxMessages)) $maxMessages = 50; + $_folderName = $this->bofelamimail->sessionData['mailbox']; + $folderType = $this->bofelamimail->getFolderType($_folderName); + $sortResult = $this->bofelamimail->getHeaders( + $_folderName, + $offset=0, + $maxMessages, + $this->sessionData['sort'], + $this->sessionData['sortReverse'], + (array)$this->sessionData['messageFilter'], + $elements + ); + //error_log(__METHOD__.__LINE__.' Data:'.array2string($rvs)); + $response->data($this->header2gridelements($sortResult['header'],$columns,$_folderName, false, $folderType, false)); + } + else + { + $response->data(array()); + } + } + + public function header2gridelements($_headers, $cols, $_folderName, $uidOnly=false, $_folderType=0, $dataForXMails=false, $previewMessage=0) + { + $timestamp7DaysAgo = + mktime(date("H"), date("i"), date("s"), date("m"), date("d")-7, date("Y")); + $timestampNow = + mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")); + $dateToday = date("Y-m-d"); + $rv = array(); + $i=0; + $firstuid = null; + foreach((array)$_headers as $header) + { + $i++; + + //error_log(__METHOD__.array2string($header)); + $result = array( + "id" => $header['uid'], + "group" => "mail", // activate the action links for mail objects + ); + $message_uid = $header['uid']; + + if ($dataForXMails && $i>$dataForXMails) $uidOnly=true; // only fetch the data for the first X Mails + if ($uidOnly) + { + $rv[] = $result; + continue; + } + $data = array(); + + //_debug_array($header); + #if($i<10) {$i++;continue;} + #if($i>20) {continue;} $i++; + // create the listing of subjects + $maxSubjectLength = 60; + $maxAddressLength = 20; + $maxSubjectLengthBold = 50; + $maxAddressLengthBold = 14; + + $flags = ""; + if(!empty($header['recent'])) $flags .= "R"; + if(!empty($header['flagged'])) $flags .= "F"; + if(!empty($header['answered'])) $flags .= "A"; + if(!empty($header['forwarded'])) $flags .= "W"; + if(!empty($header['deleted'])) $flags .= "D"; + if(!empty($header['seen'])) $flags .= "S"; + + + $data["status"] = ""; + //error_log(__METHOD__.array2string($header).' Flags:'.$flags); + + // the css for this row + $is_recent=false; + $css_styles = array("mail"); + if ($header['deleted']) { + $css_styles[] = 'deleted'; + } + if ($header['recent'] && !($header['deleted'] || $header['seen'] || $header['answered'] || $header['forwarded'])) { + $css_styles[] = 'recent'; + $is_recent=true; + } + if ($header['flagged']) { + $css_styles[] = 'flagged'; + } + if (!$header['seen']) { + $css_styles[] = 'unseen'; // different status image for recent // solved via css !important + } + if ($header['answered']) { + $css_styles[] = 'replied'; + } + if ($header['forwarded']) { + $css_styles[] = 'forwarded'; + } + //error_log(__METHOD__.array2string($css_styles)); + //if (in_array("check", $cols)) + // don't overwrite check with "false" as this forces the grid to + // deselect the row - sending "0" doesn't do that + if (in_array("check", $cols)) $data["check"] = $previewMessage == $header['uid'] ? true : 0;// $row_selected; //TODO:checkbox true or false + //$data["check"] =''; + + if (in_array("subject", $cols)) + { + // filter out undisplayable characters + $search = array('[\016]','[\017]', + '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]', + '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]'); + $replace = ''; + + $header['subject'] = preg_replace($search,$replace,$header['subject']); + $headerSubject = felamimail_bo::htmlentities($header['subject'],$this->charset); + $header['subject'] = $headerSubject; + // curly brackets get messed up by the template! + $header['subject'] = str_replace(array('{','}'),array('{','}'),$header['subject']); + + if (!empty($header['subject'])) { + // make the subject shorter if it is to long + $fullSubject = $header['subject']; + $subject = $header['subject']; + #$this->t->set_var('attachments', $header['attachment']); + } else { + $subject = @htmlspecialchars('('. lang('no subject') .')', ENT_QUOTES, $this->charset); + } + + if($_folderType == 2 || $_folderType == 3) { + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.composeFromDraft', + 'icServer' => 0, + 'folder' => base64_encode($_folderName), + 'uid' => $header['uid'], + 'id' => $header['id'], + ); + $url_read_message = $GLOBALS['egw']->link('/index.php',$linkData); + + $windowName = 'composeFromDraft_'.$header['uid']; + $read_message_windowName = $windowName; + $preview_message_windowName = $windowName; + } else { + # _debug_array($header); + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.display', + 'showHeader' => 'false', + 'mailbox' => base64_encode($_folderName), + 'uid' => $header['uid'], + 'id' => $header['id'], + ); + $url_read_message = $GLOBALS['egw']->link('/index.php',$linkData); + + $windowName = ($_readInNewWindow == 1 ? 'displayMessage' : 'displayMessage_'.$header['uid']); + + if ($this->use_preview) $windowName = 'MessagePreview_'.$header['uid'].'_'.$_folderType; + + $preview_message_windowName = $windowName; + } + + $data["subject"] = /*''.$subject.'';//*/ $subject; // the mailsubject + } + + //_debug_array($header); + if (in_array("attachments", $cols)) + { + if($header['mimetype'] == 'multipart/mixed' || + $header['mimetype'] == 'multipart/signed' || + $header['mimetype'] == 'multipart/related' || + $header['mimetype'] == 'multipart/report' || + $header['mimetype'] == 'text/calendar' || + substr($header['mimetype'],0,11) == 'application' || + substr($header['mimetype'],0,5) == 'audio' || + substr($header['mimetype'],0,5) == 'video') + { + $linkDataAttachments = array ( + 'menuaction' => 'felamimail.uidisplay.displayAttachments', + 'showHeader' => 'false', + 'mailbox' => base64_encode($_folderName), + 'uid' => $header['uid'], + 'id' => $header['id'], + ); + $windowName = 'displayMessage_'.$header['uid']; + + $image = html::image('felamimail','attach'); + if (//$header['mimetype'] != 'multipart/mixed' && + $header['mimetype'] != 'multipart/signed' + ) + { + if ($this->bofelamimail->icServer->_connected != 1) + { + $this->bofelamimail->openConnection($this->profileID); // connect to the current server + $this->bofelamimail->reopen($_folderName); + } + $attachments = $this->bofelamimail->getMessageAttachments($header['uid'],$_partID='', $_structure='', $fetchEmbeddedImages=true, $fetchTextCalendar=false, $resolveTNEF=false); + if (count($attachments)<1) $image = ' '; + } + if (count($attachments)>0) $image = "link('/index.php',$linkDataAttachments)."', '".$windowName."', this); return false;\" + title=\"".$header['subject']."\">".$image.""; + + $attachmentFlag = $image; + } else { + $attachmentFlag =' '; + } + // show priority flag + if ($header['priority'] < 3) { + $image = html::image('felamimail','prio_high'); + } elseif ($header['priority'] > 3) { + $image = html::image('felamimail','prio_low'); + } else { + $image = ''; + } + + $data["attachments"] = $image.$attachmentFlag; // icon for attachments available + } + + // sent or draft or template folder -> to address + if (in_array("toaddress", $cols)) + { + if(!empty($header['to_name'])) { + list($mailbox, $host) = explode('@',$header['to_address']); + $senderAddress = imap_rfc822_write_address($mailbox, + $host, + $header['to_name']); + } else { + $senderAddress = $header['to_address']; + } + $linkData = array + ( + 'menuaction' => 'felamimail.uicompose.compose', + 'send_to' => base64_encode($senderAddress) + ); + $windowName = 'compose_'.$header['uid']; + + // sent or drafts or template folder means foldertype > 0, use to address instead of from + $header2add = felamimail_bo::htmlentities($header['to_address'],$this->charset); + $header['to_address'] = $header2add; + if (!empty($header['to_name'])) { + $header2name = felamimail_bo::htmlentities($header['to_name'],$this->charset); + $header['to_name'] = $header2name; + + $sender_name = $header['to_name']; + $full_address = $header['to_name'].' <'.$header['to_address'].'>'; + } else { + $sender_name = $header['to_address']; + $full_address = $header['to_address']; + } + $data["toaddress"] = "
    link('/index.php',$linkData)."', '".$windowName."', this); return false;\" title=\"".@htmlspecialchars($full_address, ENT_QUOTES | ENT_IGNORE, $this->charset,false)."\">".@htmlspecialchars($sender_name, ENT_QUOTES | ENT_IGNORE, $this->charset,false).""; + } + + //fromaddress + if (in_array("fromaddress", $cols)) + { + $header2add = felamimail_bo::htmlentities($header['sender_address'],$this->charset); + $header['sender_address'] = $header2add; + if (!empty($header['sender_name'])) { + $header2name = felamimail_bo::htmlentities($header['sender_name'],$this->charset); + $header['sender_name'] = $header2name; + + $sender_name = $header['sender_name']; + $full_address = $header['sender_name'].' <'.$header['sender_address'].'>'; + } else { + $sender_name = $header['sender_address']; + $full_address = $header['sender_address']; + } + if(!empty($header['sender_name'])) { + list($mailbox, $host) = explode('@',$header['sender_address']); + $senderAddress = imap_rfc822_write_address($mailbox, + $host, + $header['sender_name']); + } else { + $senderAddress = $header['sender_address']; + } + + $linkData = array + ( + 'menuaction' => 'felamimail.uicompose.compose', + 'send_to' => base64_encode($senderAddress) + ); + $windowName = 'compose_'.$header['uid']; + + $data["fromaddress"] = "link('/index.php',$linkData)."', '".$windowName."', this); return false;\" title=\"".@htmlspecialchars($full_address, ENT_QUOTES | ENT_IGNORE, $this->charset,false)."\">".@htmlspecialchars($sender_name, ENT_QUOTES | ENT_IGNORE, $this->charset,false).""; + } + if (in_array("date", $cols)) + { + if ($dateToday == felamimail_bo::_strtotime($header['date'],'Y-m-d')) { + $dateShort = felamimail_bo::_strtotime($header['date'],($GLOBALS['egw_info']['user']['preferences']['common']['timeformat']==12?'h:i:s a':'H:i:s')); + } else { + $dateShort = felamimail_bo::_strtotime($header['date'],str_replace('Y','y',$GLOBALS['egw_info']['user']['preferences']['common']['dateformat']).' '. + ($GLOBALS['egw_info']['user']['preferences']['common']['timeformat'] == 12 ? 'h:i a' : 'H:i')); + } + $data["date"] = $dateShort;//''.$dateShort.''; + } + + if (in_array("size", $cols)) + $data["size"] = $this->show_readable_size($header['size']); /// size + + + /* + //TODO: url_add_to_addressbook isn't in any of the templates. + //If you want to use it, you need to adopt syntax to the new addressbook (popup) + $this->t->set_var('url_add_to_addressbook',$GLOBALS['egw']->link('/index.php',$linkData)); + */ + //$this->t->set_var('msg_icon_sm',$msg_icon_sm); + + //$this->t->set_var('phpgw_images',EGW_IMAGES); + $result["data"] = $data; + $result["rowClass"] = implode(' ', $css_styles); + $rv[] = $result; + //error_log(__METHOD__.__LINE__.array2string($result)); + } + return $rv; + } + + // $_folderType 0: normal imap folder 1: sent folder 2: draft folder 3: template folder + // $_rowStyle felamimail or outlook + function messageTable($_headers, $_folderType, $_folderName, $_readInNewWindow, $_rowStyle='felamimail',$messageToBePreviewed=0) + { + //error_log(__METHOD__.' preview Message:'.$messageToBePreviewed); + $this->t = CreateObject('phpgwapi.Template',EGW_APP_TPL); + $this->t->set_file(array("body" => 'mainscreen.tpl')); + + $this->t->set_block('body','message_table'); + + $i=0; + $firstuid = null; + foreach((array)$_headers['header'] as $header) + { + //error_log(__METHOD__.__LINE__.array2string($header)); + // preview the message with the requested (messageToBePreviewed) uid + if ($messageToBePreviewed>0 + && $this->use_preview + && $messageToBePreviewed == $header['uid']) + { + //error_log(__METHOD__.$header['uid']); + $selecteduid = $header['uid']; + $firstheader = $header; + } + $this->t->set_var('msg_icon_sm',$msg_icon_sm); + + $this->t->set_var('phpgw_images',EGW_IMAGES); + + + } + + if ($this->use_preview) + { + $this->t->set_var('selected_style'.$selecteduid,'style="background-color:#ddddFF;"'); + } else { + $this->t->set_var('selected_style'.$selecteduid,''); + } + //error_log(__METHOD__.__LINE__.' FolderType:'.$_folderType); + if ($this->use_preview) + { + if ($GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight'] && + stripos($GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight'],',') !== false) + { + list($previewFrameHeight, $messageListHeight) = explode(',',$GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight']); + $previewFrameHeight = trim($previewFrameHeight); + $messageListHeight = trim($messageListHeight); + if (empty($messageListHeight)) $messageListHeight = $this->messageListMinHeight; + } + else + { + $previewFrameHeight = $GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight']; + $messageListHeight = 100; // old default for minimum height + } + } + + if ($firstheader && + $this->use_preview && + ($_folderType==0 || $_folderType==1)) // only if not drafts or template folder + { + $IFRAMEBody = $this->updateMessagePreview($firstheader,$_folderType,$_folderName,$this->profileID); + } + else + { + if ($this->use_preview) + { + $IFRAMEBody = " + + + + + + +
    + ".'
    '. + "
    ".(!($_folderType == 2 || $_folderType == 3)?lang("Select a message to switch on its preview (click on subject)"):lang("Preview disabled for Folder: ").$_folderName)."

    +
    "." +
    +   +
    "; + } + else + { + $IFRAMEBody = ''; + } + } + + $this->t->set_var('IFrameForPreview',$IFRAMEBody); + //$this->t->set_var('messagelist_height',($this->use_preview ? ($messageListHeight).'px':'auto')); + $this->t->set_var('messagelist_height',($this->use_preview ? ($messageListHeight).'px':$this->messageListMinHeight.'px')); + $this->t->set_var('previewiframe_height',($this->use_preview ? ($previewFrameHeight).'px':'0px')); + + $this->t->parse("out","message_table"); + + return $this->t->get('out','message_table'); + } + + function updateMessagePreview($headerData,$_folderType,$_folderName,$_icServer=0) + { + // IFrame for Preview .... + if ($headerData['uid'] && $this->use_preview) + { + //error_log(__METHOD__.__LINE__.array2string($headerData).function_backtrace()); + $jscall =''; + $this->bofelamimail->openConnection($_icServer); + $this->bofelamimail->reopen($_folderName); + $flags = $this->bofelamimail->getFlags($headerData['uid']); + if ($this->bofelamimail->getNotifyFlags($headerData['uid']) === null) + { + $headers = $this->bofelamimail->getMessageHeader($headerData['uid']); + if ( isset($headers['DISPOSITION-NOTIFICATION-TO']) ) { + $sent_not = $this->bofelamimail->decode_header(trim($headers['DISPOSITION-NOTIFICATION-TO'])); + } else if ( isset($headers['RETURN-RECEIPT-TO']) ) { + $sent_not = $this->bofelamimail->decode_header(trim($headers['RETURN-RECEIPT-TO'])); + } else if ( isset($headers['X-CONFIRM-READING-TO']) ) { + $sent_not = $this->bofelamimail->decode_header(trim($headers['X-CONFIRM-READING-TO'])); + } else $sent_not = ""; + if ( $sent_not != "" && strpos( array2string($flags),'Seen')===false) + { + $jscall= "sendNotifyMS(".$headerData['uid']."); "; + } + } + + //if (strpos( array2string($flags),'Seen')===false) $this->bofelamimail->flagMessages('read', $headerData['uid']); + if ($_folderType > 0) { + $addtoaddresses=''; + // sent or drafts or template folder + if (!empty($headerData['to_name'])) { + $sender_names[0] = $headerData['to_name']; + $sender_addresses[0] = $headerData['to_address']; + $full_addresses[0] = $headerData['to_name'].' <'.$headerData['to_address'].'>'; + } else { + $sender_names[0] = $headerData['to_address']; + $sender_addresses[0] = $headerData['to_address']; + $full_addresses[0] = $headerData['to_address']; + } + if (!empty($headerData['additional_to_addresses'])) + { + foreach ($headerData['additional_to_addresses'] as $k => $addset) + { + $sender_names[] = (!empty($headerData['additional_to_addresses'][$k]['name'])?$headerData['additional_to_addresses'][$k]['name']:$headerData['additional_to_addresses'][$k]['address']); + $sender_addresses[] = $headerData['additional_to_addresses'][$k]['address']; + $full_addresses[] = (!empty($headerData['additional_to_addresses'][$k]['name'])?$headerData['additional_to_addresses'][$k]['name'].' <':'').$headerData['additional_to_addresses'][$k]['address'].(!empty($headerData['additional_to_addresses'][$k]['name'])?'>':''); + } + } + } else { + if (!empty($headerData['sender_name'])) { + $sender_names[0] = $headerData['sender_name']; + $sender_addresses[0] = $headerData['sender_address']; + $full_addresses[0] = $headerData['sender_name'].' <'.$headerData['sender_address'].'>'; + } else { + $sender_names[0] = $headerData['sender_address']; + $sender_addresses[0] = $headerData['sender_address']; + $full_addresses[0] = $headerData['sender_address']; + } + } + + //$fromAddress = uidisplay::emailAddressToHTML(array('PERSONAL_NAME'=>$sender_name,'EMAIL'=>$sender_address,'RFC822_EMAIL'=>$full_address),''); + if ($GLOBALS['egw_info']['user']['apps']['addressbook']) { + foreach ($sender_names as $k => $sender_name) + { + //error_log(__METHOD__.__LINE__.' '.$k.'->'.$sender_name); + $sender_address = $sender_addresses[$k]; + $addresslinkData = array ( + 'menuaction' => 'addressbook.addressbook_ui.edit', + 'presets[email]' => $sender_address, + 'referer' => $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'] + ); + $decodedPersonalName = $sender_name; + if (!empty($decodedPersonalName)) { + if($spacePos = strrpos($decodedPersonalName, ' ')) { + $addresslinkData['presets[n_family]'] = substr($decodedPersonalName, $spacePos+1); + $addresslinkData['presets[n_given]'] = substr($decodedPersonalName, 0, $spacePos); + } else { + $addresslinkData['presets[n_family]'] = $decodedPersonalName; + } + $addresslinkData['presets[n_fn]'] = $decodedPersonalName; + } + + $urlAddToAddressbook = $GLOBALS['egw']->link('/index.php',$addresslinkData); + $onClick = "window.open(this,this.target,'dependent=yes,width=850,height=440,location=no,menubar=no,toolbar=no,scrollbars=yes,status=yes'); return false;"; + $image = $GLOBALS['egw']->common->image('felamimail','sm_envelope'); + $fromAddress .= ($k>0?', ':''). $full_addresses[$k].''. sprintf(' + %s', + $urlAddToAddressbook, + $onClick, + $image, + lang('add to addressbook'), + lang('add to addressbook')); + } + } + + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.display', + 'showHeader' => 'false', + 'mailbox' => base64_encode($_folderName), + 'uid' => $headerData['uid'], + 'id' => $headerData['id'], + ); + $linkDataAttachments = array ( + 'menuaction' => 'felamimail.uidisplay.displayAttachments', + 'showHeader' => 'false', + 'mailbox' => base64_encode($_folderName), + 'uid' => $headerData['uid'], + 'id' => $headerData['id'], + ); + $windowName = 'displayMessage_'.$headerData['uid']; + + if($headerData['mimetype'] == 'multipart/mixed' || + $headerData['mimetype'] == 'multipart/signed' || + $headerData['mimetype'] == 'multipart/related' || + $headerData['mimetype'] == 'multipart/report' || + $headerData['mimetype'] == 'text/calendar' || + substr($headerData['mimetype'],0,11) == 'application' || + substr($headerData['mimetype'],0,5) == 'audio' || + substr($headerData['mimetype'],0,5) == 'video') + { + $image = html::image('felamimail','attach'); + + $image = "link('/index.php',$linkDataAttachments)."', '".$windowName."', this); return false;\" + title=\"".$headerData['subject']."\">".$image.""; + if (//$headerData['mimetype'] != 'multipart/mixed' && + $header['mimetype'] != 'multipart/signed' + ) + { + $attachments = $this->bofelamimail->getMessageAttachments($headerData['uid'],$_partID='', $_structure='', $fetchEmbeddedImages=true, $fetchTextCalendar=false, $resolveTNEF=false); + if (count($attachments)<1) $image = ' '; + } + + $windowName = ($_readInNewWindow == 1 ? 'displayMessage' : 'displayMessage_'.$header['uid']); + } else { + $image = ''; + } + $subject = "link('/index.php',$linkData)."', '".$windowName."', this); return false;\" + title=\"".$headerData['subject']."\">".$headerData['subject'].""; + $IFrameHeight = $GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight']; + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.displayBody', + 'uid' => $headerData['uid'], + 'mailbox' => base64_encode($_folderName) + ); + + $iframe_url = $GLOBALS['egw']->link('/index.php',$linkData); + $script = ""; + // if browser supports data uri: ie<8 does NOT and ie>=8 does NOT support html as content :-( + // --> use it to send the mail as data uri + if (!isset($_GET['printable'])) + { + $uidisplay = CreateObject('felamimail.uidisplay'); + $uidisplay->uid = $headerData['uid']; + $uidisplay->mailbox = $_folderName; + $mailData = $uidisplay->get_load_email_data($headerData['uid'], $partID); + //error_log(__METHOD__.__LINE__.array2string($mailData)); + $iframe_url = $mailData['src']; + $jscall .= $mailData['onload']; + $script = $mailData['script']; + unset($uidisplay); + } + //_debug_array($GLOBALS['egw']->link('/index.php',$linkData)); + $IFRAMEBody = " + + + + + + + + +
    + ".($_folderType > 0?lang('to'):lang('from')).':'.''.($fromAddress?$fromAddress:'') .'
    '. + lang('date').':'.felamimail_bo::_strtotime($headerData['date'],$GLOBALS['egw_info']['user']['preferences']['common']['dateformat']). + ' - '.felamimail_bo::_strtotime($headerData['date'],($GLOBALS['egw_info']['user']['preferences']['common']['timeformat']==12?'h:i:s a':'H:i:s'))."
    + ".lang('subject').":".$subject." +
    + $image + + + ".$this->navbarSeparator().$this->displayMessageActions($headerData, $_folderName, $_icServer,true)." + +
    + $script + +
    "; + } + else + { + $IFRAMEBody = " "; + } + return $IFRAMEBody; + } + + function displayMessageActions($_headerData, $_folderName, $_icServer, $_forceNewWindow=false) + { + if ($_forceNewWindow) + { + list($fm_width,$fm_height) = explode('x',egw_link::get_registry('felamimail','view_popup')); + } + // navbar start + // compose as new URL + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.composeAsNew', + 'icServer' => $_icServer, + 'folder' => base64_encode($_folderName), + 'reply_id' => $_headerData['uid'], + ); + if($_headerData['partid'] != '') { + $linkData['part_id'] = $_headerData['partid']; + } + $asnewURL = $GLOBALS['egw']->link('/index.php',$linkData); + + // reply url + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.reply', + 'icServer' => $_icServer, + 'folder' => base64_encode($_folderName), + 'reply_id' => $_headerData['uid'], + ); + if($_headerData['partid'] != '') { + $linkData['part_id'] = $_headerData['partid']; + } + $replyURL = $GLOBALS['egw']->link('/index.php',$linkData); + + // reply all url + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.replyAll', + 'icServer' => $_icServer, + 'folder' => base64_encode($_folderName), + 'reply_id' => $_headerData['uid'], + ); + if($_headerData['partid'] != '') { + $linkData['part_id'] = $_headerData['partid']; + } + $replyAllURL = $GLOBALS['egw']->link('/index.php',$linkData); + + // forward url + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.forward', + 'reply_id' => $_headerData['uid'], + 'folder' => base64_encode($_folderName), + ); + if($_headerData['partid'] != '') { + $linkData['part_id'] = $_headerData['partid']; + } + $forwardURL = $GLOBALS['egw']->link('/index.php',$linkData); + + //delete url + $linkData = array ( + 'menuaction' => 'felamimail.uifelamimail.'.($_headerData['deleted']?'un':'').'deleteMessage', + 'icServer' => $_icServer, + 'folder' => base64_encode($_folderName), + 'message' => $_headerData['uid'], + ); + $deleteURL = $GLOBALS['egw']->link('/index.php',$linkData); + + $navbarImages = array( + 'new' => array( + 'action' => ($_forceNewWindow ? "egw_openWindowCentered('$asnewURL','composeasnew_".$_headerData['uid']."',".$fm_width.",".$fm_height.");": "window.location.href = '$asnewURL'"), + 'tooltip' => lang('compose as new'), + ), + 'mail_reply' => array( + 'action' => ($_forceNewWindow ? "egw_openWindowCentered('$replyURL','reply_".$_headerData['uid']."',".$fm_width.",".$fm_height.");": "window.location.href = '$replyURL'"), + 'tooltip' => lang('reply'), + ), + 'mail_replyall' => array( + 'action' => ($_forceNewWindow ? "egw_openWindowCentered('$replyAllURL','replyAll_".$_headerData['uid']."',".$fm_width.",".$fm_height.");": "window.location.href = '$replyAllURL'"), + 'tooltip' => lang('reply all'), + ), + 'mail_forward' => array( + 'action' => ($_forceNewWindow ? "egw_openWindowCentered('$forwardURL','forward_".$_headerData['uid']."',".$fm_width.",".$fm_height.");": "window.location.href = '$forwardURL'"), + 'tooltip' => lang('forward'), + ), + 'revert' => array( + 'action' => ($_forceNewWindow ? "window.open('$deleteURL','_blank','dependent=yes,width=100,height=100,toolbar=no,scrollbars=no,status=no')": "window.location.href = '$deleteURL'"), + 'tooltip' => ($_headerData['deleted']?lang('undelete'):lang('delete')), + ), + 'delete' => array( + 'action' => ($_forceNewWindow ? "window.open('$deleteURL','_blank','dependent=yes,width=100,height=100,toolbar=no,scrollbars=no,status=no')": "window.location.href = '$deleteURL'"), + 'tooltip' => ($_headerData['deleted']?lang('undelete'):lang('delete')), + ), + ); + // display only the correct icon: revert on deleted messages, delete on all others + if ($_headerData['deleted']) + { + unset($navbarImages['delete']); + } else { + unset($navbarImages['revert']); + } + foreach($navbarImages as $buttonName => $buttonInfo) { + $navbarButtons .= $this->navbarButton($buttonName, $buttonInfo['action'], $buttonInfo['tooltip']); + } + $navbarButtons .= $this->navbarSeparator(); + + // print url + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.printMessage', + 'uid' => $_headerData['uid'], + 'folder' => base64_encode($_folderName), + ); + if($_headerData['partid'] != '') { + $linkData['part'] = $_headerData['partid']; + } + $printURL = $GLOBALS['egw']->link('/index.php',$linkData); + + // infolog URL + $linkData = array( + 'menuaction' => 'infolog.infolog_ui.import_mail', + 'uid' => $_headerData['uid'], + 'mailbox' => base64_encode($_folderName) + ); + if($_headerData['partid'] != '') { + $linkData['part'] = $_headerData['partid']; + } + $to_infologURL = $GLOBALS['egw']->link('/index.php',$linkData); + + $linkData = array( + 'menuaction' => 'tracker.tracker_ui.import_mail', + 'uid' => $_headerData['uid'], + 'mailbox' => base64_encode($_folderName) + ); + if($_headerData['partid'] != '') { + $linkData['part'] = $_headerData['partid']; + } + $to_trackerURL = $GLOBALS['egw']->link('/index.php',$linkData); + + // viewheader url + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.displayHeader', + 'uid' => $_headerData['uid'], + 'mailbox' => base64_encode($_folderName) + ); + if($_headerData['partid'] != '') { + $linkData['part'] = $_headerData['partid']; + } + $viewHeaderURL = $GLOBALS['egw']->link('/index.php',$linkData); + + $navbarImages = array(); + + // save message url + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.saveMessage', + 'uid' => $_headerData['uid'], + 'mailbox' => base64_encode($_folderName) + ); + if($_headerData['partid'] != '') { + $linkData['part'] = $_headerData['partid']; + } + $saveMessageURL = $GLOBALS['egw']->link('/index.php',$linkData); + + $navbarImages = array(); + + //print email + $navbarImages = array( + 'print' => array( + 'action' => ($_forceNewWindow ? "egw_openWindowCentered('$printURL','print_".$_headerData['uid']."',".$fm_width.",".$fm_height.");": "window.location.href = '$printURL'"), + 'tooltip' => lang('print it'), + ), + ); + if ($GLOBALS['egw_info']['user']['apps']['infolog']) + { + list($i_width,$i_height) = explode('x',egw_link::get_registry('infolog','add_popup')); + $navbarImages['to_infolog'] = array( + 'action' => "window.open('$to_infologURL','_blank','dependent=yes,width=".$i_width.",height=".$i_height.",scrollbars=yes,status=yes')", + 'tooltip' => lang('save as infolog')); + } + if ($GLOBALS['egw_info']['user']['apps']['tracker']) + { + list($i_width,$i_height) = explode('x',egw_link::get_registry('tracker','add_popup')); + $navbarImages['to_tracker'] = array( + 'action' => "egw_openWindowCentered('$to_trackerURL','_blank',".$i_width.",".$i_height.")", + 'tooltip' => lang('Save as ticket')); + } + // save email as + $navbarImages['fileexport'] = array( + 'action' => "document.location='$saveMessageURL';",//"($_forceNewWindow ? "window.open('$saveMessageURL','_blank','dependent=yes,width=100,height=100,scrollbars=yes,status=yes')": "window.location.href = '$saveMessageURL'"), + 'tooltip' => lang('Save message to disk'), + ); + + // view header lines + $navbarImages['kmmsgread'] = array( + 'action' => "mail_displayHeaderLines('$viewHeaderURL')", + 'tooltip' => lang('view header lines'), + ); + + foreach($navbarImages as $buttonName => $buttonData) { + $navbarButtons .= $this->navbarButton($buttonName, $buttonData['action'], $buttonData['tooltip']); + } + return $navbarButtons; + } + + /** + * create multiselectbox + * + * this function will create a multiselect box. Hard to describe! :) + * + * @param _selectedValues Array of values for already selected values(the left selectbox) + * @param _predefinedValues Array of values for predefined values(the right selectbox) + * @param _valueName name for the variable containing the selected values + * @param _boxWidth the width of the multiselectbox( example: 100px, 100%) + * + * @returns the html code, to be added into the template + */ + function multiSelectBox($_selectedValues, $_predefinedValues, $_valueName, $_boxWidth="100%") + { + $this->template->set_block('body','multiSelectBox'); + + if(is_array($_selectedValues)) + { + foreach($_selectedValues as $key => $value) + { + $options .= ""; + } + $this->template->set_var('multiSelectBox_selected_options',$options); + } + + $options = ''; + if(is_array($_predefinedValues)) + { + foreach($_predefinedValues as $key => $value) + { + if($key != $_selectedValues["$key"]) + $options .= ""; + } + $this->template->set_var('multiSelectBox_predefinded_options',$options); + } + + $this->template->set_var('multiSelectBox_valueName', $_valueName); + $this->template->set_var('multiSelectBox_boxWidth', $_boxWidth); + + + return $this->template->fp('out','multiSelectBox'); + } + + function navbarButton($_imageName, $_imageAction, $_toolTip='', $_float='left') + { + $image = $GLOBALS['egw']->common->image('felamimail',$_imageName); + $float = $_float == 'right' ? 'right' : 'left'; + $_toolTip = felamimail_bo::htmlentities($_toolTip); + return ""; + } + + function navbarSeparator() + { + return ''; + } + + /* Returns a string showing the size of the message/attachment */ + function show_readable_size($bytes, $_mode='short') + { + $bytes /= 1024; + $type = 'k'; + + if ($bytes / 1024 > 1) + { + $bytes /= 1024; + $type = 'M'; + } + + if ($bytes < 10) + { + $bytes *= 10; + settype($bytes, 'integer'); + $bytes /= 10; + } + else + settype($bytes, 'integer'); + + return $bytes . ' ' . $type ; + } + + function tableView($_headValues, $_tableWidth="100%") + { + $this->template->set_block('body','tableView'); + $this->template->set_block('body','tableViewHead'); + + if(is_array($_headValues)) + { + foreach($_headValues as $head) + { + $this->template->set_var('tableHeadContent',$head); + $this->template->parse('tableView_Head','tableViewHead',True); + } + } + + if(is_array($this->tableViewRows)) + { + foreach($this->tableViewRows as $tableRow) + { + $rowData .= ""; + foreach($tableRow as $tableData) + { + switch($tableData['type']) + { + default: + $rowData .= ''.$tableData['text'].''; + break; + } + } + $rowData .= ""; + } + } + + $this->template->set_var('tableView_width', $_tableWidth); + $this->template->set_var('tableView_Rows', $rowData); + + return $this->template->fp('out','tableView'); + } + + function tableViewAddRow() + { + $this->tableViewRows[] = array(); + end($this->tableViewRows); + return key($this->tableViewRows); + } + + function tableViewAddTextCell($_rowID,$_text) + { + $this->tableViewRows[$_rowID][]= array + ( + 'type' => 'text', + 'text' => $_text + ); + } + + function quotaDisplay($_usage, $_limit) + { + $this->t = CreateObject('phpgwapi.Template',EGW_APP_TPL); + $this->t->set_file(array("body" => 'mainscreen.tpl')); + $this->t->set_block('body','quota_block'); + + if($_limit == 0) { + $quotaPercent=100; + } else { + $quotaPercent=round(($_usage*100)/$_limit); + } + + $quotaLimit=$this->show_readable_size($_limit*1024); + $quotaUsage=$this->show_readable_size($_usage*1024); + + $this->t->set_var('leftWidth',$quotaPercent); + + if($quotaPercent > 90 && $_limit>0) { + $this->t->set_var('quotaBG','red'); + } elseif($quotaPercent > 80 && $_limit>0) { + $this->t->set_var('quotaBG','yellow'); + } else { + $this->t->set_var('quotaBG','#66ff66'); + } + + if($_limit > 0) { + $quotaText = $quotaUsage .'/'.$quotaLimit; + } else { + $quotaText = $quotaUsage; + } + + if($quotaPercent > 50) { + $this->t->set_var('quotaUsage_left', $quotaText); + $this->t->set_var('quotaUsage_right',''); + } else { + $this->t->set_var('quotaUsage_left',''); + $this->t->set_var('quotaUsage_right', $quotaText); + } + + $this->t->parse('out','quota_block'); + return $this->t->get('out','quota_block'); + } +} +?> diff --git a/felamimail/inc/hook_home.inc.php b/felamimail/inc/hook_home.inc.php new file mode 100644 index 0000000000..3098cfff29 --- /dev/null +++ b/felamimail/inc/hook_home.inc.php @@ -0,0 +1,131 @@ + 0) { + $d1 = strtolower(substr(EGW_APP_INC,0,3)); + if($d1 == 'htt' || $d1 == 'ftp' ) { + echo 'Failed attempt to break in via an old Security Hole!
    '."\n"; + $GLOBALS['egw']->common->egw_exit(); + } + unset($d1); + + $tmp_app_inc = $GLOBALS['egw']->common->get_inc_dir('felamimail'); + + $GLOBALS['egw']->translation->add_app('felamimail'); + + $title = lang('felamimail'); + + $portalbox =& CreateObject('phpgwapi.listbox', + Array( + 'title' => $title, + 'primary' => $GLOBALS['egw_info']['theme']['navbar_bg'], + 'secondary' => $GLOBALS['egw_info']['theme']['navbar_bg'], + 'tertiary' => $GLOBALS['egw_info']['theme']['navbar_bg'], + 'width' => '100%', + 'outerborderwidth' => '0', + 'header_background_image' => $GLOBALS['egw']->common->image('phpgwapi/templates/phpgw_website','bg_filler.gif') + ) + ); + + $app_id = $GLOBALS['egw']->applications->name2id('felamimail'); + $var = Array( + 'up' => Array('url' => '/set_box.php', 'app' => $app_id), + 'down' => Array('url' => '/set_box.php', 'app' => $app_id), + 'close' => Array('url' => '/set_box.php', 'app' => $app_id), + 'question' => Array('url' => '/set_box.php', 'app' => $app_id), + 'edit' => Array('url' => '/set_box.php', 'app' => $app_id) + ); + + while(list($key,$value) = each($var)) { + $portalbox->set_controls($key,$value); + } + + $portalbox->data = Array(); + + if($data) { + $portalbox->data = $data; + } + + $this->displayCharset = translation::charset(); + $this->bofelamimail = felamimail_bo::getInstance(); + + if(!$this->bofelamimail->openConnection()) { + $extra_data = lang("can't connect to INBOX!!"); + } else { + // it may be cheaper to fetch the folderstatus per folder which is to be displayed, as for all folders + $folderList = $this->bofelamimail->getFolderObjects(true, false); + #_debug_array($folderList); + $extra_data = ' + + + + + '; + $showFolders = array(); + if (!empty($this->bofelamimail->mailPreferences->preferences['mainscreen_showfolders'])) $showFolders = explode(',',$this->bofelamimail->mailPreferences->preferences['mainscreen_showfolders']); + foreach($folderList as $key => $value) { + #echo count($showFolders).'-'.in_array($key, $showFolders).'#
    '; + #_debug_array($value); + if (count($showFolders) == 0 || (count($showFolders)>0 && in_array($key, $showFolders))) { + unset($messages); + unset($unseen); + unset($recent); + /* + if(is_object($value->counter)) { + $messages = $value->counter->messages; + $unseen = $value->counter->unseen; + $recent = $value->counter->recent; + } + */ + // as usually not all subscribed folders are shown in home, it occurrs to speed up things, to fetch + $folderStatus = $this->bofelamimail->getMailBoxCounters($key); + #echo "
    FolderStatus:";_debug_array($folderStatus); + if($folderStatus !== false) { + $messages = $folderStatus->messages; + $unseen = $folderStatus->unseen; + $recent = $folderStatus->recent; + } + + if($recent > 0) { + $newMessages = "$unseen($recent)"; + } else { + $newMessages = "$unseen"; + } + + + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.changeFolder', + 'mailbox' => urlencode($key) + ); + $folderLink = $GLOBALS['egw']->link('/index.php',$linkData); + + $extra_data .= ""; + } + } + $extra_data .= '
    + '.lang('foldername').' + + '.lang('total').' + + '.lang('unseen').' +
    $value->displayName$messages$newMessages
    '; + } + + // output the portalbox and below it (1) the folders listbox (if applicable) and (2) Compose New mail link + echo "\r\n".''."\r\n" + .$portalbox->draw($extra_data) + .''."\r\n"; + } +?> diff --git a/felamimail/inc/hook_notifywindow.inc.php b/felamimail/inc/hook_notifywindow.inc.php new file mode 100644 index 0000000000..ba60999ecb --- /dev/null +++ b/felamimail/inc/hook_notifywindow.inc.php @@ -0,0 +1,13 @@ + 'preferences')); \ No newline at end of file diff --git a/felamimail/index.php b/felamimail/index.php new file mode 100644 index 0000000000..5984a15b81 --- /dev/null +++ b/felamimail/index.php @@ -0,0 +1,16 @@ += 750) window.resizeBy(0,resizeHeight); + } + //tab.init(); + //alert(document.onkeydown); + var titletext = document.getElementById('fm_compose_subject').value; + if (titletext.length>0) updateTitle(titletext); +} + +function addEmail(to,email) +{ + //alert(to+': '+email); + + var tableBody = document.getElementById('addressRows'); + var tableRows = tableBody.getElementsByTagName('tr'); + + var lastRow = tableRows[tableRows.length-1]; + var inputElements = lastRow.getElementsByTagName('input'); + + // look for empty fields above to fill in + for(rowCounter = tableRows.length-1; rowCounter > 0; rowCounter--) + { + var rowBefore = tableRows[rowCounter-1]; + var inputBefore = rowBefore.getElementsByTagName('input'); + if(inputBefore[0].value == '') + { + lastRow = rowBefore; + inputElements = inputBefore; + } + else + { + continue; + } + + } + + if (inputElements[0].value != '') // last row not empty --> create new + { + addAddressRow(lastRow); + lastRow = tableRows[tableRows.length-1]; + inputElements = lastRow.getElementsByTagName('input'); + } + // fill with email and set selectbox + inputElements[0].value = email; + var selectElements = lastRow.getElementsByTagName('select'); + selectElements[0].selectedIndex = to == 'cc' ? 1 : (to == 'bcc' ? 2 : 0); + + // add a new empty last row if there is no empty one at all + lastRow = tableRows[tableRows.length-1]; + inputElements = lastRow.getElementsByTagName('input'); + if (inputElements[0].value != '') + { + addAddressRow(lastRow); + } +} + +function addAddressRow(_tableRow) +{ + // the table body + var tableBody = _tableRow.parentNode; + + // all table rows + var tableRows = tableBody.getElementsByTagName('tr'); + + + var newTableRow = _tableRow.cloneNode(true); + var inputElements = newTableRow.getElementsByTagName('input'); + var spanElements = newTableRow.getElementsByTagName('span'); + var tdElements = newTableRow.getElementsByTagName('td'); + + //alert(inputElements.length); + inputElements[0].value = ''; + inputElements[0].disabled = false; + inputElements[0].style.width = '99%'; + for(i=0; i 4) { + neededHeight = singleRowHeight*4; + } else { + neededHeight = singleRowHeight*tableRows.length; + } + + document.getElementById('addressDIV').style.height = neededHeight+'px'; + document.getElementById('addressDIV').scrollTop = document.getElementById('addressTable').clientHeight; +} + +function fm_compose_addAttachmentRow(_tableRow) +{ + // the table body + var tableBody = _tableRow.parentNode; + + // all table rows + var tableRows = tableBody.getElementsByTagName('tr'); + + + var newTableRow = _tableRow.cloneNode(true); + var inputElements = newTableRow.getElementsByTagName('input'); + + //alert(inputElements.length); +// inputElements[0].value = ''; + + if(tableRows.length < 5) { + tableBody.appendChild(newTableRow); + } + +// inputElements[0].focus(); + + singleRowHeight = _tableRow.clientHeight; + if (singleRowHeight == 0) singleRowHeight = 20; + if(tableRows.length > 4) { + neededHeight = singleRowHeight*4; + } else { + neededHeight = singleRowHeight*tableRows.length; + } + + //document.getElementById('addressDIV').style.height = neededHeight+'px'; + //document.getElementById('addressDIV').scrollTop = document.getElementById('addressTable').clientHeight; +} + +function deleteTableRow(_imageObject) +{ + // the table body + tableBody = document.getElementById('addressRows'); + + // all table rows + tableRows = tableBody.getElementsByTagName('tr'); + + if(tableRows.length > 4) { + + // the row where the clicked image is located + tableRow = _imageObject.parentNode.parentNode; + + // the table body + tableBody = document.getElementById('addressRows'); + tableBody.removeChild(tableRow); + + singleRowHeight = tableRows[0].clientHeight; + if(tableRows.length > 4) { + neededHeight = singleRowHeight*4; + } else { + neededHeight = singleRowHeight*tableRows.length; + } + + document.getElementById('addressDIV').style.height = neededHeight+'px'; + } else { + // the row where the clicked image is located + tableRow = _imageObject.parentNode.parentNode; + + var inputElements = tableRow.getElementsByTagName('input'); + inputElements[0].value = ''; + + } +} + +function getPosLeft(_node) { + var left=0; + + if(_node.offsetParent) { + while (_node.offsetParent) + { + left += _node.offsetLeft; + _node = _node.offsetParent; + } + } else if (_node.x) { + left += _node.x; + } + + return left; +} + +function getPosTop(_node) { + var top=0; + + if(_node.offsetParent) { + while (_node.offsetParent) { + top += _node.offsetTop; + if(_node.parentNode.scrollTop) { + top -= _node.parentNode.scrollTop + } + _node = _node.offsetParent; + } + } else if (_node.y) { + left += _node.y; + } + + return top; +} + +function hideResultBox() { + var resultBox; + + resultBox = document.getElementById('resultBox'); + resultBox.className = 'resultBoxHidden'; + + //document.title='Search finnished'; + + resultboxVisible=false; +} + +function initResultBox(_inputField) { + //var resultBox; + + currentInputField = _inputField; + //document.title = resultRows.length; + //document.title = "TEST"; + //resultBox = document.getElementById("resultBox"); + + startCapturingEvents(keypressed); +} + +function displayResultBox() { + var top=0; + var left=0; + var width=0; + + var resultBox; + + //document.title='Search finnished'; + selectedSuggestion = -1; + + + resultBox = document.getElementById('resultBox'); + if(searchActive) { + top = getPosTop(currentInputField) + currentInputField.offsetHeight; + left = getPosLeft(currentInputField); + width = currentInputField.clientWidth; + + resultBox.style.top=top + 'px'; + resultBox.style.left=left + 'px'; + resultBox.style.width=width + 'px'; + resultBox.scrollTop=0; + resultBox.style.zIndex=100000; + + resultBox.className = 'resultBoxVisible'; + } + + resultRows = resultBox.getElementsByTagName('div'); + + resultboxVisible=true; +} + +function startCapturingEvents(_callback) { + document.onkeydown = keyDown; + + keyDownCallback=_callback; + // nur fuer NS4 + //if (document.layers) { + // document.captureEvents(Event.KEYPRESS); + //} +} + +function stopCapturingEvents() { + document.onkeydown = null; + delete currentKeyCode; + hideResultBox(); +} + +function keypressed(keycode, keyvalue) { + if(liveSearchTimer) { + window.clearTimeout(liveSearchTimer); + } + + //_pressed = new Date().getTime(); + + switch (keycode) { + // case KEYCODE_LEFT: + case KEYCODE_UP: + if(selectedSuggestion > 0) { + selectSuggestion(selectedSuggestion-1); + } else { + selectSuggestion(resultRows.length-1); + } + break; + + // case KEYCODE_RIGHT: + case KEYCODE_DOWN: + //document.title='down '+selectedSuggestion; + //if(selectedSuggestion) { + if(resultboxVisible) { + //document.title='is selected'; + if(selectedSuggestion < resultRows.length-1) { + selectSuggestion(selectedSuggestion+1); + } else { + selectSuggestion(0); + } + } + break; + + case KEYCODE_ENTER: + if(resultboxVisible) { + currentInputField.value = results[selectedSuggestion]; + hideResultBox(); + } + focusToNextInputField(); + searchActive=false; + break; + + case KEYCODE_ESC: + hideResultBox(); + break; + + case KEYCODE_TAB: + if(resultboxVisible) { + if( selectedSuggestion < resultRows.length-1) { + selectSuggestion(selectedSuggestion+1); + } else { + selectSuggestion(0); + } + } else { + rv = focusToNextInputField(); + if (rv == 'fm_compose_subject') + { + currentKeyCode = 13; + //alert(currentKeyCode); + } + } + break; + + + case KEYCODE_ALT: + case KEYCODE_SHIFT: + break; + + default: + //_setValue(-1); + liveSearchTimer = window.setTimeout('startLiveSearch()', keyboardTimeout); + if(!currentInputField.parentNode.parentNode.nextSibling) { + addAddressRow(currentInputField.parentNode.parentNode); + } + hideResultBox(); + } +} + +function keyDown(e) { + var pressedKeyID = document.all ? window.event.keyCode : e.which; + var pressedKey = String.fromCharCode(pressedKeyID).toLowerCase(); + + currentKeyCode=pressedKeyID; + if(keyDownCallback!=null) { + keyDownCallback(pressedKeyID, pressedKey); + } +} + +function startLiveSearch() { + if(currentInputField.value.length > 2) { + fm_blink_currentInputField(); + searchActive=true; + //document.title='Search started'; + xajax_doXMLHTTP("felamimail.ajax_contacts.searchAddress",currentInputField.value); + } +} + +function selectSuggestion(_selectedSuggestion) { + selectedSuggestion = _selectedSuggestion; + for(i=0; i30) { + _text = _text.substring(0,30) + '...'; + } + + document.title = _text; +} + +function focusToNextInputField() { + var nextRow; + + if(nextRow = currentInputField.parentNode.parentNode.nextSibling) { + if(nextRow.nodeType == 3) { + inputElements = nextRow.nextSibling.getElementsByTagName('input'); + inputElements[0].focus(); + } else { + inputElements = nextRow.getElementsByTagName('input'); + inputElements[0].focus(); + } + return 'addressinput'; + } else { + document.getElementById('fm_compose_subject').focus(); + //document.doit.fm_compose_subject.focus(); + return 'fm_compose_subject'; + } +} + +function focusToPrevInputField() { + var prevRow; + + if(prevRow = currentInputField.parentNode.parentNode.previousSibling) { + if(prevRow.nodeType == 3) { + inputElements = prevRow.previousSibling.getElementsByTagName('input'); + inputElements[0].focus(); + } else { + inputElements = prevRow.getElementsByTagName('input'); + inputElements[0].focus(); + } + } else { + document.getElementById('fm_compose_subject').focus(); + //document.doit.fm_compose_subject.focus(); + } +} + +function keyDownSubject(keycode, keyvalue) { +} + +function startCaptureEventSubjects(_inputField) { + _inputField.onkeydown = keyDown; + + keyDownCallback = keyDownSubject; +} + +function fm_compose_selectFolder() { + egw_openWindowCentered(folderSelectURL,'fm_compose_selectFolder','350','500',window.outerWidth/2,window.outerHeight/2); +} + +function OnLoadingStart(_nodeID) { + return true; +} + +function onNodeSelect(_folderName) { + opener.fm_compose_setFolderSelectValue(_folderName); + self.close(); +} + +function fm_compose_changeInputType(_selectBox) { + var selectBoxRow = _selectBox.parentNode.parentNode; + var inputElements = selectBoxRow.getElementsByTagName('input'); + var spanElements = selectBoxRow.getElementsByTagName('span'); + var tdElements = selectBoxRow.getElementsByTagName('td'); + + if(_selectBox.value == 'folder') { + inputElements[0].value = ''; + for(i=0; i"; + plaineditor.value= ''; + xajax_doXMLHTTP("felamimail.ajaxfelamimail.toggleEditor", composeID, existingAscii, 'simple'); + + htmlFlag.value = "1"; + mimeType.value = "html"; + } + else + { + //Copy the current HTML data and recode it via a XAJAX request + var existingHtml = ckeditor.getData(); + var ckeditor_span = document.getElementById('cke_body'); + ckeditor.setData(''); + //Hide the old editor + ckeditor_span.style.display = "none"; + // we need to destroy the ckeditor, as the/a submit is using the content of the ckeditor instance for content of body + ckeditor.destroy(); + + xajax_doXMLHTTP("felamimail.ajaxfelamimail.toggleEditor", composeID, existingHtml, 'ascii'); + + htmlFlag.value = "0"; + mimeType.value = "text"; + + setupPlainEditor(plaineditor, editorArea.style.height); + } + + showAjaxLoader(editorArea); +} + +function setupPlainEditor(plaineditor, height) +{ + if (plaineditor) + { + //Do some presets on the new editor + plaineditor.style.width = "99%"; + plaineditor.style.borderWidth = 0; + plaineditor.style.height = height; + plaineditor.style.borderWidth = "1px"; + plaineditor.style.borderStyle = "solid"; + plaineditor.style.borderColor = "gray"; + plaineditor.style.margin = "1px"; + plaineditor.value = ''; + } +} + +function showAjaxLoader(elem) +{ + if (elem) + { + elem.style.display = "block"; + elem.style.backgroundImage = "url(phpgwapi/templates/default/images/ajax-loader.gif)"; + elem.style.backgroundRepeat = "no-repeat"; + elem.style.backgroundPosition = "center"; + } +} + +function hideAjaxLoader(elem) +{ + if (elem) + { + elem.style.display = "inline"; + elem.style.backgroundImage = ""; + } +} + +function showPlainEditor(_content) +{ + var plaineditor = document.getElementsByName('body')[0]; + + //Toggle the plain editor visiblity + plaineditor.style.visibility = "visible"; + plaineditor.style.display = "block"; + + plaineditor.value = _content; + + hideAjaxLoader(document.getElementById('editorArea')); +} + +function showHTMLEditor(_content) +{ + var ckeditor = CKEDITOR.instances['body']; + var ckeditor_span = document.getElementById('cke_body'); + + //Set the new content + ckeditor.setData(_content); + + //Toggle the plain editor visiblity + ckeditor_span.style.display = 'block'; + + hideAjaxLoader(document.getElementById('editorArea')); +} + + +function removeFCK(fieldId) +{ +/* var configElement = document.getElementById(fieldId+'___Config'); + var frameElement = document.getElementById(fieldId+'___Frame');*/ + //var textarea = document.forms[this].elements[fieldId]; + var editor = CKEDITOR.instances[fieldId]; + + //if (editor!=null && configElement && frameElement && configElement.parentNode==textarea.parentNode && frameElement.parentNode==textarea.parentNode && document.removeChild) + if (editor!=null/* && configElement && frameElement && document.removeChild*/) + { +/* editor.UpdateLinkedField(); + configElement.parentNode.removeChild(configElement); + frameElement.parentNode.removeChild(frameElement); + //textarea.style.display = ''; + delete FCKeditorAPI.Instances[fieldId]; + delete editor;*/ + editor.destroy(false); +// delete editor; + } + +} + +function changeIdentity(SelectedId) +{ + // we do the old style (just changing the id, (to be inserted after compose before sending)) + // but setSignature may try to initiate a switch of the signature within the email body if conditions match + xajax_doXMLHTTP("felamimail.ajaxfelamimail.setComposeSignature", SelectedId.value); +} +function setSignature(SelectedId) +{ + //alert("IS:"+document.getElementById('mySigID').value); + var sigBox = document.getElementById('mySigID'); + currentSig = sigBox.value; + + for (i = 0; i < document.doit.signatureID.length; ++i) + if (document.doit.signatureID.options[i].value == SelectedId) + { + document.doit.signatureID.options[i].selected = true; + document.getElementById('mySigID').value = SelectedId; + } + //else + // document.doit.signatureID.options[i].selected = false; + + //alert("Now:"+document.getElementById('mySigID').value); + var sigBox = document.getElementById('signatureID'); + //alert(sigBox); + // if we find the id, signature is inserted at the top of the message on compose start. + // so we try toi switch, ... + if (sigBox == null) + { + } + else + { + // we try to change the signature + if (currentSig != SelectedId) fm_compose_changeSignature(currentSig,SelectedId); + } +} diff --git a/felamimail/js/jscode/compose_message.js b/felamimail/js/jscode/compose_message.js new file mode 100644 index 0000000000..a6745d89e5 --- /dev/null +++ b/felamimail/js/jscode/compose_message.js @@ -0,0 +1,10 @@ +var tab = new Tabs(3,'activetab','inactivetab','tab','tabcontent','','','tabpage'); +// var smtp = new Tabs(2,'activetab','inactivetab','smtp','smtpcontent','smtpselector','','smtppage'); +// var imap = new Tabs(3,'activetab','inactivetab','imap','imapcontent','imapselector','','imappage'); + +function initAll() +{ + tab.init(); +// smtp.init(); +// imap.init(); +} diff --git a/felamimail/js/jscode/editAccountData.js b/felamimail/js/jscode/editAccountData.js new file mode 100644 index 0000000000..5657d4fbc8 --- /dev/null +++ b/felamimail/js/jscode/editAccountData.js @@ -0,0 +1,130 @@ +function initEditAccountData() +{ + var activeElement; + + if(activeElement = document.getElementById('active')) { + onchange_active(activeElement); + } +} + +function onchange_active(_checkbox) +{ + identityInputs = document.getElementById('identity').getElementsByTagName('input'); + incomingInputs = document.getElementById('incoming_server').getElementsByTagName('input'); + outgoingInputs = document.getElementById('outgoing_server').getElementsByTagName('input'); + + for(i=0; i 0) { + var accountData = new Array(); + + for(i=0; i 0) { + if(confirm(lang_reallyDeleteAccountSettings)) { + xajax_doXMLHTTP("felamimail.ajaxfelamimail.deleteAccountData", accountData.join(",")); + fm_refreshAccountDataTable(); + } + } + } +} + +function fm_refreshAccountDataTable() { + xajax_doXMLHTTP("felamimail.ajaxfelamimail.refreshAccountDataTable"); +} diff --git a/felamimail/js/jscode/editProfile.js b/felamimail/js/jscode/editProfile.js new file mode 100644 index 0000000000..ca7f0099a5 --- /dev/null +++ b/felamimail/js/jscode/editProfile.js @@ -0,0 +1,13 @@ +var tab = new Tabs(2,'activetab','inactivetab','tab','tabcontent','','','tabpage'); + +function initAll(_editMode) +{ + tab.init(); + + switch(_editMode) + { + case 'vacation': + tab.display(2); + break; + } +} diff --git a/felamimail/js/jscode/editSieveRule.js b/felamimail/js/jscode/editSieveRule.js new file mode 100644 index 0000000000..9c4c7db3ba --- /dev/null +++ b/felamimail/js/jscode/editSieveRule.js @@ -0,0 +1,8 @@ +function OnLoadingStart(_nodeID) { + return true; +} +function onNodeSelect(_folderName) { + opener.document.thisRule.folderName.value = _folderName; + opener.document.thisRule.action_folder.checked = true; + self.close(); +} diff --git a/felamimail/js/jscode/listFolder.js b/felamimail/js/jscode/listFolder.js new file mode 100644 index 0000000000..90bcbaf2b7 --- /dev/null +++ b/felamimail/js/jscode/listFolder.js @@ -0,0 +1,45 @@ +var tab = new Tabs(2,'activetab','inactivetab','tab','tabcontent','','','tabpage'); + +function initAll() +{ + tab.init(); +} + +function onCheckHandler(_nodeID) +{ + xajax_doXMLHTTP('felamimail.ajaxfelamimail.updateFolderStatus',_nodeID,tree.isItemChecked(_nodeID)); +} +function OnLoadingStart(_nodeID) { + return true; +} +function onNodeSelect(_nodeID) +{ + xajax_doXMLHTTP("felamimail.ajaxfelamimail.getFolderInfo",_nodeID); +} + +function resetACLAddView() +{ + window.xajax_doXMLHTTP('felamimail.ajaxfelamimail.addACL', document.getElementById('accountName').value, window.xajax.getFormValues('formAddACL'),document.getElementById('recursive').checked ); + document.getElementById('recursive').checked = false; + document.getElementById('accountName').value = ''; + document.getElementById('acl_l').checked = false; + document.getElementById('acl_r').checked = false; + document.getElementById('acl_s').checked = false; + document.getElementById('acl_w').checked = false; + document.getElementById('acl_i').checked = false; + document.getElementById('acl_p').checked = false; + document.getElementById('acl_c').checked = false; + document.getElementById('acl_d').checked = false; + document.getElementById('acl_a').checked = false; + opener.updateACLView(); +} + +function updateACLView() +{ + xajax_doXMLHTTP('felamimail.ajaxfelamimail.updateACLView'); +} + +function displayACLAdd(_url) +{ + egw_openWindowCentered(_url,'felamiMailACL','400','200',window.outerWidth/2,window.outerHeight/2); +} diff --git a/felamimail/js/jscode/listSieveRules.js b/felamimail/js/jscode/listSieveRules.js new file mode 100644 index 0000000000..92e8a4f55c --- /dev/null +++ b/felamimail/js/jscode/listSieveRules.js @@ -0,0 +1,31 @@ +// variable used by "edit rule" dialog +var ruleEditWindow; +var ruleEditWindowTimer; +var ruleEditWindowTimeout=500; + +//var searchesPending=0; + +function fm_sieve_displayRuleEditWindow(_displayRuleEditWindowURL) { + //ruleEditWindow = egw_openWindowCentered(_displayRuleEditWindowURL,'fm_sieve_ruleEditWindow','730','510',window.outerWidth/2,window.outerHeight/2); + ruleEditWindow = egw_openWindowCentered(_displayRuleEditWindowURL,'fm_sieve_ruleEditWindow','730','510'); + if(ruleEditWindowTimer) { + window.clearTimeout(ruleEditWindowTimer); + } + ruleEditWindowTimer = window.setInterval('fm_sieve_reloadRulesList()', ruleEditWindowTimeout); +} + +function fm_sieve_reloadRulesList() { +// searchesPending++; +// document.title=searchesPending; + if(ruleEditWindow.closed == true) { + window.clearTimeout(ruleEditWindowTimer); + //xajax_doXMLHTTP("felamimail.ajaxfelamimail.reloadAttachments", composeID); + window.location.href=refreshURL; + } +} + +function fm_sieve_cancelReload() { + if(ruleEditWindowTimer) { + window.clearTimeout(ruleEditWindowTimer); + } +} \ No newline at end of file diff --git a/felamimail/js/jscode/listSignatures.js b/felamimail/js/jscode/listSignatures.js new file mode 100644 index 0000000000..f4bb49f147 --- /dev/null +++ b/felamimail/js/jscode/listSignatures.js @@ -0,0 +1,74 @@ +var ruleSignatureWindowTimeout=500; +var signatureEditWindow; +var signatureEditWindowTimer; + +function fm_getEditorContent() +{ + // Get the editor instance that we want to interact with. + var ckeditor = CKEDITOR.instances['signature']; + return ckeditor.getData(); +} + +function fm_addSignature(_url) +{ + signatureEditWindow = egw_openWindowCentered(_url,'editSignature','750',egw_getWindowOuterHeight()/2,window.outerWidth/2,window.outerHeight/2); + if(signatureEditWindowTimer) { + window.clearTimeout(signatureEditWindowTimer); + } + signatureEditWindowTimer = window.setInterval('fm_checkSignatureEditWindow()', ruleSignatureWindowTimeout); +} + +function fm_saveSignature() { + xajax_doXMLHTTP("felamimail.ajaxfelamimail.saveSignature", "save", + document.getElementById('signatureID').value, + document.getElementById('signatureDesc').value, + fm_getEditorContent(), + document.getElementById('isDefaultSignature').checked + ); + //fm_refreshSignatureTable(); + //window.setTimeout("window.close()", 1000); +} + +function fm_applySignature() { + xajax_doXMLHTTP("felamimail.ajaxfelamimail.saveSignature", "apply", + document.getElementById('signatureID').value, + document.getElementById('signatureDesc').value, + fm_getEditorContent(), + document.getElementById('isDefaultSignature').value + ); + fm_refreshSignatureTable(); +} + +function fm_initEditLayout() { + alert(document.body.offsetHeight); +} + +function fm_deleteSignatures() { + if(document.forms["signatureList"].elements.length > 0) { + var signatures = new Array(); + + for(i=0; i 0) { + if(confirm(lang_reallyDeleteSignatures)) { + xajax_doXMLHTTP("felamimail.ajaxfelamimail.deleteSignatures", signatures.join(",")); + fm_refreshSignatureTable(); + } + } + } +} + +function fm_refreshSignatureTable() { + xajax_doXMLHTTP("felamimail.ajaxfelamimail.refreshSignatureTable"); +} + +function fm_checkSignatureEditWindow() { + if(signatureEditWindow.closed == true) { + window.clearTimeout(signatureEditWindowTimer); + fm_refreshSignatureTable(); + } +} diff --git a/felamimail/js/jscode/viewMainScreen.js b/felamimail/js/jscode/viewMainScreen.js new file mode 100644 index 0000000000..32bcd6d509 --- /dev/null +++ b/felamimail/js/jscode/viewMainScreen.js @@ -0,0 +1,1397 @@ +function egw_email_fetchDataProc(_elems, _columns, _callback, _context) +{ + var request = new egw_json_request("felamimail.uiwidgets.ajax_fetch_data", + [_elems, _columns]); + request.sendRequest(true, function(_data) { + _callback.call(_context, _data); + }); +} + +function egw_email_columnChangeProc(_set) +{ + var request = new egw_json_request("felamimail.uiwidgets.ajax_store_coldata", + [_set]); + request.sendRequest(true); +} + +function mailGridGetSelected() +{ + // select messagesv from mailGrid + var allSelected = mailGrid.dataRoot.actionObject.getSelectedObjects(); + var messages = {}; + // allSelected[i].id hält die id + // zurückseten iteration über allSelected (getSelectedObjects) und dann allSelected[i].setSelected(false); + if (allSelected.length>0) messages['msg'] = []; + for (var i=0; i0) messages['msg'][i] = allSelected[i].id; + } + // mailGrid.dataRoot.actionObject.getFocused() + return messages; +} + +function mail_enabledByClass(_action, _senders, _target) +{ +//alert('enableByClass:'+_action.data.enableClass); +//alert($(_target.iface.getDOMNode()).hasClass(_action.data.enableClass)); + return $(_target.iface.getDOMNode()).hasClass(_action.data.enableClass); +} + +function mail_disabledByClass(_action, _senders, _target) +{ +// as there only is an enabled attribute, we must negate the result (we find the class -> we return false to set enabled to false) +//alert('disableByClass:'+_action.data.disableClass); +//alert(!$(_target.iface.getDOMNode()).hasClass(_action.data.disableClass)); + return !$(_target.iface.getDOMNode()).hasClass(_action.data.disableClass); +} + +function mail_parentRefreshListRowStyle(oldID, newID) +{ + // the old implementation is not working anymore, so we use the gridObject for this + var allElements = mailGrid.dataRoot.actionObject.flatList(); + for (var i=0; i0) + { + if (oldID == allElements[i].id) + { + allElements[i].setSelected(false); + allElements[i].setFocused(false); + } + if (newID == allElements[i].id) + { + allElements[i].setSelected(false); + allElements[i].setFocused(true); + } + } + } +} +function setStatusMessage(_message) { + document.getElementById('messageCounter').innerHTML = '
     ' + _message + '
    '; +} + +function sendNotifyMS (uid) { + ret = confirm(egw_appWindow('felamimail').lang_sendnotify); + egw_appWindow('felamimail').xajax_doXMLHTTP("felamimail.ajaxfelamimail.sendNotify",uid,ret); +} + +function mail_changeSorting(_sort, _aNode) { + + mail_resetMessageSelect(); + + document.getElementById('messageCounter').innerHTML = 'Change sorting ...'; + mail_cleanup(); + document.getElementById('divMessageList').innerHTML = ''; +// aTags = document.getElementById('gridHeaderSubject'); +// alert(aTags); + //aTags.style.fontWeight='normal'; + egw_appWindow('felamimail').xajax_doXMLHTTP("felamimail.ajaxfelamimail.changeSorting",_sort); + _aNode.style.fontWeight='bold'; +} + +function compressFolder() { + if (document.getElementById('messageCounter').innerHTML.search(eval('/'+egw_appWindow('felamimail').lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} + egw_appWindow('felamimail').setStatusMessage(''+ egw_appWindow('felamimail').lang_compressingFolder +''); + egw_appWindow('felamimail').xajax_doXMLHTTP("felamimail.ajaxfelamimail.compressFolder"); +} + +/** + * Open a single message + * + * @param _action + * @param _elems _elems[0].id is the row-id + */ +function mail_open(_action, _elems) +{ + //alert('mail_open('+_elems[0].id+')'); + if (activeFolderB64 == draftFolderB64 || activeFolderB64 == templateFolderB64) + { + _action.id='composefromdraft'; + mail_compose(_action,_elems); + } + else + { + var url = window.egw_webserverUrl+'/index.php?'; + url += 'menuaction=felamimail.uidisplay.display'; // todo compose for Draft folder + url += '&mailbox='+egw_appWindow('felamimail').activeFolderB64; + url += '&uid='+_elems[0].id; + + fm_readMessage(url, 'displayMessage_'+_elems[0].id, _elems[0].iface.getDOMNode()); + } +} + +/** + * Compose, reply or forward a message + * + * @param _action _action.id is 'compose', 'composeasnew', 'reply', 'reply_all' or 'forward' (forward can be multiple messages) + * @param _elems _elems[0].id is the row-id + */ +function mail_compose(_action, _elems) +{ + var idsToProcess = ''; + var multipleIds = false; + + if (_elems.length > 1) multipleIds = true; + //for (var i=0; i<_elems.length; i++) + //{ + // if (i>0) idsToProcess += ','; + // idsToProcess += _elems[i].id; + //} + //alert('mail_'+_action.id+'('+idsToProcess+')'); + var url = window.egw_webserverUrl+'/index.php?'; + if (_action.id == 'compose') + { + if (multipleIds == false) + { + if (_elems.length == 1) mail_parentRefreshListRowStyle(_elems[0].id,_elems[0].id); + url += 'menuaction=felamimail.uicompose.compose'; + mail_openComposeWindow(url) + } + else + { + mail_compose('forward',_elems); + } + } + if (_action.id == 'composefromdraft') + { + url += 'menuaction=felamimail.uicompose.composeFromDraft'; + url += '&icServer='+egw_appWindow('felamimail').activeServerID; + url += '&folder='+egw_appWindow('felamimail').activeFolderB64; + url += '&uid='+_elems[0].id; + egw_openWindowCentered(url,'composeasnew_'+_elems[0].id,700,egw_getWindowOuterHeight()); + } + if (_action.id == 'composeasnew') + { + url += 'menuaction=felamimail.uicompose.composeAsNew'; + url += '&icServer='+egw_appWindow('felamimail').activeServerID; + url += '&folder='+egw_appWindow('felamimail').activeFolderB64; + url += '&reply_id='+_elems[0].id; + egw_openWindowCentered(url,'composeasnew_'+_elems[0].id,700,egw_getWindowOuterHeight()); + } + if (_action.id == 'reply') + { + url += 'menuaction=felamimail.uicompose.reply'; + url += '&icServer='+egw_appWindow('felamimail').activeServerID; + url += '&folder='+egw_appWindow('felamimail').activeFolderB64; + url += '&reply_id='+_elems[0].id; + egw_openWindowCentered(url,'reply_'+_elems[0].id,700,egw_getWindowOuterHeight()); + } + if (_action.id == 'reply_all') + { + url += 'menuaction=felamimail.uicompose.replyAll'; + url += '&icServer='+egw_appWindow('felamimail').activeServerID; + url += '&folder='+egw_appWindow('felamimail').activeFolderB64; + url += '&reply_id='+_elems[0].id; + egw_openWindowCentered(url,'replyAll_'+_elems[0].id,700,egw_getWindowOuterHeight()); + } + if (_action.id == 'forward') + { + if (multipleIds) + { + url += 'menuaction=felamimail.uicompose.compose'; + mail_openComposeWindow(url) + } + else + { + url += 'menuaction=felamimail.uicompose.forward'; + url += '&icServer='+egw_appWindow('felamimail').activeServerID; + url += '&folder='+egw_appWindow('felamimail').activeFolderB64; + url += '&reply_id='+_elems[0].id; + egw_openWindowCentered(url,'forward_'+_elems[0].id,700,egw_getWindowOuterHeight()); + } + } +} + +/** + * Print a message + * + * @param _action + * @param _elems _elems[0].id is the row-id + */ +function mail_print(_action, _elems) +{ + var url = window.egw_webserverUrl+'/index.php?'; + url += 'menuaction=felamimail.uidisplay.printMessage'; // todo compose for Draft folder + //url += '&icServer='+egw_appWindow('felamimail').activeServerID; + url += '&mailbox='+egw_appWindow('felamimail').activeFolderB64; + url += '&uid='+_elems[0].id; + egw_openWindowCentered(url,'print_'+_elems[0].id,700,egw_getWindowOuterHeight()); +} + +/** + * Save a message + * + * @param _action + * @param _elems _elems[0].id is the row-id + */ +function mail_save(_action, _elems) +{ + //alert('mail_save('+_elems[0].id+')'); + var url = window.egw_webserverUrl+'/index.php?'; + url += 'menuaction=felamimail.uidisplay.saveMessage'; // todo compose for Draft folder + //url += '&icServer='+egw_appWindow('felamimail').activeServerID; + url += '&mailbox='+egw_appWindow('felamimail').activeFolderB64; + url += '&uid='+_elems[0].id; + //window.open(url,'_blank','dependent=yes,width=100,height=100,scrollbars=yes,status=yes') + document.location = url; +} + +/** + * View header of a message + * + * @param _action + * @param _elems _elems[0].id is the row-id + */ +function mail_header(_action, _elems) +{ + //alert('mail_header('+_elems[0].id+')'); + var url = window.egw_webserverUrl+'/index.php?'; + url += 'menuaction=felamimail.uidisplay.displayHeader'; // todo compose for Draft folder + //url += '&icServer='+egw_appWindow('felamimail').activeServerID; + url += '&mailbox='+egw_appWindow('felamimail').activeFolderB64; + url += '&uid='+_elems[0].id; + mail_displayHeaderLines(url); +} + +/** + * Flag mail as 'read', 'unread', 'flagged' or 'unflagged' + * + * @param _action _action.id is 'read', 'unread', 'flagged' or 'unflagged' + * @param _elems + */ +function mail_flag(_action, _elems) +{ + mail_flagMessages(_action.id); +} + +/** + * Save message as InfoLog + * + * @param _action + * @param _elems _elems[0].id is the row-id + */ +function mail_infolog(_action, _elems) +{ + //alert('mail_infolog('+_elems[0].id+')'); + var url = window.egw_webserverUrl+'/index.php?'; + url += 'menuaction=infolog.infolog_ui.import_mail'; // todo compose for Draft folder + //url += '&icServer='+egw_appWindow('felamimail').activeServerID; + url += '&mailbox='+egw_appWindow('felamimail').activeFolderB64; + url += '&uid='+_elems[0].id; + egw_openWindowCentered(url,'import_mail_'+_elems[0].id,_action.data.width,_action.data.height); +} + +/** + * Save message as ticket + * + * @param _action _action.id is 'read', 'unread', 'flagged' or 'unflagged' + * @param _elems + */ +function mail_tracker(_action, _elems) +{ + //alert('mail_tracker('+_elems[0].id+')'); + var url = window.egw_webserverUrl+'/index.php?'; + url += 'menuaction=tracker.tracker_ui.import_mail'; // todo compose for Draft folder + //url += '&icServer='+egw_appWindow('felamimail').activeServerID; + url += '&mailbox='+egw_appWindow('felamimail').activeFolderB64; + url += '&uid='+_elems[0].id; + egw_openWindowCentered(url,'import_tracker_'+_elems[0].id,_action.data.width,_action.data.height); +} + +/** + * Delete mails + * + * @param _action + * @param _elems + */ +function mail_delete(_action, _elems) +{ + messageList = mailGridGetSelected() + mail_deleteMessages(messageList); +} + +function mail_deleteMessages(_messageList) { + var Check = true; + var cbAllMessages = document.getElementById('selectAllMessagesCheckBox').checked; + + mail_resetMessageSelect(); + + if (cbAllMessages == true) Check = confirm(egw_appWindow('felamimail').lang_confirm_all_messages); + if (cbAllMessages == true && Check == true) + { + _messageList = 'all'; + } + if (Check == true) { + egw_appWindow('felamimail').setStatusMessage('' + egw_appWindow('felamimail').lang_deleting_messages + ''); + mail_cleanup(); + document.getElementById('divMessageList').innerHTML = ''; + egw_appWindow('felamimail').xajax_doXMLHTTP("felamimail.ajaxfelamimail.deleteMessages",_messageList); + } else { + mailGrid.dataRoot.actionObject.setAllSelected(false); + } +} + +function displayMessage(_url,_windowName) { + egw_openWindowCentered(_url, _windowName, 850, egw_getWindowOuterHeight()); +} + +function mail_displayHeaderLines(_url) { + egw_openWindowCentered(_url,'fm_display_headerLines','700','600',window.outerWidth/2,window.outerHeight/2); +} + +function emptyTrash() { + if (document.getElementById('messageCounter').innerHTML.search(eval('/'+egw_appWindow('felamimail').lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} + egw_appWindow('felamimail').setStatusMessage('' + egw_appWindow('felamimail').lang_emptyTrashFolder + ''); + egw_appWindow('felamimail').xajax_doXMLHTTP("felamimail.ajaxfelamimail.emptyTrash"); +} + +function tellUser(message,_nodeID) { + if (_nodeID) { + alert(message+top.tree.getUserData(_nodeID, 'folderName')); + } else { + alert(message); + } +} + +function getTreeNodeOpenItems(_nodeID, mode) { + var z = top.tree.getSubItems(_nodeID).split(","); + var oS; + var PoS; + var rv; + var returnValue = ""+_nodeID; + var modetorun = "none"; + if (mode) { modetorun = mode } + PoS = top.tree.getOpenState(_nodeID) + if (modetorun == "forced") PoS = 1; + if (PoS == 1) { + for(var i=0;i"; + if (prefAskForMove == 2) message = message + " "; + message = message + " "; + type = 'prompt'; + autohide = 0; + showDialog(title,message,type,autohide); + Check = false; + actionPending = true; + } + if (prefAskForMove==99) actionPending = 'copy'; + if (Check == true && document.getElementById('selectAllMessagesCheckBox').checked == true) Check = confirm(egw_appWindow('felamimail').lang_confirm_all_messages); + if (Check == true) + { + if (document.getElementById('messageCounter').innerHTML.search(eval('/'+egw_appWindow('felamimail').lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} + if (document.getElementById('selectAllMessagesCheckBox').checked == true) { + mail_resetMessageSelect(); + formData = 'all'; + } else { + mail_resetMessageSelect(); + formData = egw_appWindow('felamimail').mailGridGetSelected(); + } + if (actionPending == 'copy') + { + egw_appWindow('felamimail').setStatusMessage(egw_appWindow('felamimail').copyingMessages +' '+ top.tree.getUserData(_nodeID, 'folderName') +''); + mail_cleanup(); + document.getElementById('divMessageList').innerHTML = ''; + egw_appWindow('felamimail').xajax_doXMLHTTP("felamimail.ajaxfelamimail.copyMessages", _nodeID, formData); + } + else + { + // default: move messages + egw_appWindow('felamimail').setStatusMessage(egw_appWindow('felamimail').movingMessages +' '+ top.tree.getUserData(_nodeID, 'folderName') +''); + mail_cleanup(); + document.getElementById('divMessageList').innerHTML = ''; + egw_appWindow('felamimail').xajax_doXMLHTTP("felamimail.ajaxfelamimail.moveMessages", _nodeID, formData); + } + } else { + if (actionPending == false) + { + mail_resetMessageSelect(); + mailGrid.dataRoot.actionObject.setAllSelected(false); + } + } + } else { + mail_resetMessageSelect(); + egw_appWindow('felamimail').setStatusMessage('' + egw_appWindow('felamimail').lang_loading + ' ' + top.tree.getUserData(_nodeID, 'folderName') + ''); + mail_cleanup(); + document.getElementById('divMessageList').innerHTML = ''; + egw_appWindow('felamimail').xajax_doXMLHTTP("felamimail.ajaxfelamimail.updateMessageView",_nodeID); + egw_appWindow('felamimail').refreshFolderStatus(_nodeID); + } + } + CopyOrMove = true; +} + +function quickSearch() { + var searchType; + var searchString; + var status; + + mail_resetMessageSelect(); + //disable select allMessages in Folder Checkbox, as it is not implemented for filters + document.getElementById('selectAllMessagesCheckBox').disabled = true; + egw_appWindow('felamimail').setStatusMessage('' + egw_appWindow('felamimail').lang_updating_view + ''); + mail_cleanup(); + document.getElementById('divMessageList').innerHTML = ''; + + document.getElementById('quickSearch').select(); + + searchType = document.getElementById('searchType').value; + searchString = document.getElementById('quickSearch').value; + status = document.getElementById('status').value; + if (searchString+'grrr###'+status == 'grrr###any') document.getElementById('selectAllMessagesCheckBox').disabled = false; + + egw_appWindow('felamimail').xajax_doXMLHTTP('felamimail.ajaxfelamimail.quickSearch', searchType, searchString, status); + +} + +function mail_focusGridElement(_uid) +{ +//alert('mail_focusGridElement'+_uid); + var allElements = mailGrid.dataRoot.actionObject.flatList(); + if (allElements.length>0) + { + allElements[0].setFocused(true); + if (typeof _uid == 'undefined') + { + allElements[0].setFocused(true); + } + else + { + for (var i=0; i0) + { + if (_uid == allElements[i].id) + { + allElements[i].setFocused(true); + i = allElements.length; + } + } + } + } + } +} + +function selectFolderContent(inputBox, _refreshTimeOut) { + maxMessages = 0; + + selectAll(inputBox, _refreshTimeOut); +} + +/** + * fm_previewMessageID is internally used to save the currently used message + * id. The preview function won't be called for a particular message if + * fm_previewMessageID is set to it. + */ +var fm_previewMessageID = null; + +function selectedGridChange(_selectAll) { + // Get the currently focused object + if (mailGrid) + { + var focused = mailGrid.dataRoot.actionObject.getFocusedObject(); + + if (focused) + { + // Get all currently selected object - we don't want to do a preview + // if more than one message is selected. + var allSelected = mailGrid.dataRoot.actionObject.getSelectedObjects(); + + if (allSelected.length > 0 && fm_previewMessageID != focused.id) { + if (allSelected.length == 1) + { + MessageBuffer =''; + + fm_previewMessageFolderType = 0; + if (activeFolderB64 == draftFolderB64) fm_previewMessageFolderType = 2; + if (activeFolderB64 == templateFolderB64) fm_previewMessageFolderType = 3; + + // Call the preview function for this message. Set fm_previewMessageID + // to the id of this item, so that this function won't be called + // again for the same item. + fm_previewMessageID = focused.id; + + fm_readMessage('', 'MessagePreview_'+focused.id+'_'+fm_previewMessageFolderType, + focused.iface.getDOMNode()); + } + } + return; + } + } +} + +function selectAll(inputBox, _refreshTimeOut) { + maxMessages = 0; + mailGrid.dataRoot.actionObject.setAllSelected(inputBox.checked); + var allSelected = mailGrid.dataRoot.actionObject.getSelectedObjects(); + + + folderFunctions = document.getElementById('folderFunction'); + + if(allSelected.length>0) { + checkedCounter = allSelected.length; + while (folderFunctions.hasChildNodes()) { + folderFunctions.removeChild(folderFunctions.lastChild); + } + var textNode = document.createTextNode(egw_appWindow('felamimail').lang_select_target_folder); + folderFunctions.appendChild(textNode); + document.getElementsByName("folderAction")[0].value = "moveMessage"; + fm_startTimerMessageListUpdate(1800000); + } else { + checkedCounter = 0; + while (folderFunctions.hasChildNodes()) { + folderFunctions.removeChild(folderFunctions.lastChild); + } + var textNode = document.createTextNode(''); + folderFunctions.appendChild(textNode); + document.getElementsByName("folderAction")[0].value = "changeFolder"; + fm_startTimerMessageListUpdate(_refreshTimeOut); + } +} + +function toggleFolderRadio(inputBox, _refreshTimeOut) { + //alert('toggleFolderRadio called'); + folderFunctions = document.getElementById("folderFunction"); + checkedCounter += (inputBox.checked) ? 1 : -1; + if (checkedCounter > 0) { + while (folderFunctions.hasChildNodes()) { + folderFunctions.removeChild(folderFunctions.lastChild); + } + var textNode = document.createTextNode('{lang_move_message}'); + //folderFunctions.appendChild(textNode); + document.getElementById("folderFunction").innerHTML=egw_appWindow('felamimail').lang_select_target_folder; + document.getElementsByName("folderAction")[0].value = "moveMessage"; + fm_startTimerMessageListUpdate(1800000); + } else { +// document.getElementById('messageCheckBox').checked = false; + document.getElementById('selectAllMessagesCheckBox').checked = false; + while (folderFunctions.hasChildNodes()) { + folderFunctions.removeChild(folderFunctions.lastChild); + } + //var textNode = document.createTextNode('{egw_appWindow('felamimail').lang_change_folder}'); + //folderFunctions.appendChild(textNode); + document.getElementsByName("folderAction")[0].value = "changeFolder"; + fm_startTimerMessageListUpdate(_refreshTimeOut); + } +} + +function extendedSearch(_selectBox) { + mail_resetMessageSelect(); + //disable select allMessages in Folder Checkbox, as it is not implemented for filters + document.getElementById('selectAllMessagesCheckBox').disabled = true; + egw_appWindow('felamimail').setStatusMessage('Applying filter '+_selectBox.options[_selectBox.selectedIndex].text+''); + mail_cleanup(); + document.getElementById('divMessageList').innerHTML = ''; + + document.getElementById('quickSearch').value = ''; + + egw_appWindow('felamimail').xajax_doXMLHTTP('felamimail.ajaxfelamimail.extendedSearch',_selectBox.options[_selectBox.selectedIndex].value); +} + +function mail_flagMessages(_flag) +{ + var Check=true; + var _messageList; + var cbAllMessages = document.getElementById('selectAllMessagesCheckBox').checked; + mail_resetMessageSelect(); + if (cbAllMessages == true) Check = confirm(egw_appWindow('felamimail').lang_confirm_all_messages); + if (cbAllMessages == true && Check == true) + { + _messageList = 'all'; + } else { + _messageList = egw_appWindow('felamimail').mailGridGetSelected(); + } + + //alert(_messageList); + + if (Check == true) + { + egw_appWindow('felamimail').setStatusMessage('' + egw_appWindow('felamimail').lang_updating_message_status + ''); + egw_appWindow('felamimail').xajax_doXMLHTTP("felamimail.ajaxfelamimail.flagMessages", _flag, _messageList); + mail_cleanup(); + document.getElementById('divMessageList').innerHTML = ''; + fm_startTimerMessageListUpdate(refreshTimeOut); + } else { + mailGrid.dataRoot.actionObject.setAllSelected(false); + } +} + +function mail_resetMessageSelect() +{ + if (document.getElementById('messageCounter') != null && document.getElementById('messageCounter').innerHTML.search(eval('/'+egw_appWindow('felamimail').lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} +// document.getElementById('messageCheckBox').checked = false; + if (document.getElementById('selectAllMessagesCheckBox') != null) document.getElementById('selectAllMessagesCheckBox').checked = false; + checkedCounter = 0; + folderFunctions = document.getElementById('folderFunction'); + if (folderFunctions != null) + { + while (folderFunctions.hasChildNodes()) + folderFunctions.removeChild(folderFunctions.lastChild); + var textNode = document.createTextNode(''); + folderFunctions.appendChild(textNode); + } + if (!(typeof document.getElementsByName("folderAction")[0] == 'undefined')) document.getElementsByName("folderAction")[0].value = "changeFolder"; +} + +function skipForward() +{ + mail_resetMessageSelect(); + + egw_appWindow('felamimail').setStatusMessage(''+ egw_appWindow('felamimail').lang_skipping_forward +''); + mail_cleanup(); + document.getElementById('divMessageList').innerHTML = ''; + + egw_appWindow('felamimail').xajax_doXMLHTTP('felamimail.ajaxfelamimail.skipForward'); +} + +function skipPrevious() { + mail_resetMessageSelect(); + + egw_appWindow('felamimail').setStatusMessage(''+ egw_appWindow('felamimail').lang_skipping_previous +''); + mail_cleanup(); + document.getElementById('divMessageList').innerHTML = ''; + + egw_appWindow('felamimail').xajax_doXMLHTTP('felamimail.ajaxfelamimail.skipPrevious'); +} + +function jumpEnd() { + mail_resetMessageSelect(); + + egw_appWindow('felamimail').setStatusMessage(''+ egw_appWindow('felamimail').lang_jumping_to_end +''); + mail_cleanup(); + document.getElementById('divMessageList').innerHTML = ''; + + egw_appWindow('felamimail').xajax_doXMLHTTP('felamimail.ajaxfelamimail.jumpEnd'); +} + +function jumpStart() { + mail_resetMessageSelect(); + + egw_appWindow('felamimail').setStatusMessage(''+ egw_appWindow('felamimail').lang_jumping_to_start +''); + mail_cleanup(); + document.getElementById('divMessageList').innerHTML = ''; + + egw_appWindow('felamimail').xajax_doXMLHTTP('felamimail.ajaxfelamimail.jumpStart'); +} + +var searchesPending=0; + +function refresh() { + //searchesPending++; + //document.title=searchesPending; + mail_resetMessageSelect(); + egw_appWindow('felamimail').xajax_doXMLHTTP('felamimail.ajaxfelamimail.refreshMessageList'); +} + +function refreshFolderStatus(_nodeID,mode) { + var nodeToRefresh = 0; + var mode2use = "none"; + if (document.getElementById('messageCounter')) { + if (document.getElementById('messageCounter').innerHTML.search(eval('/'+egw_appWindow('felamimail').lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} + } + if (_nodeID) nodeToRefresh = _nodeID; + if (mode) { + if (mode == "forced") {mode2use = mode;} + } + var activeFolders = getTreeNodeOpenItems(nodeToRefresh,mode2use); + queueRefreshFolderList(activeFolders); +} + + +var felamimail_queuedFolders = []; +var felamimail_queuedFoldersIndex = 0; + +/** + * Queues a refreshFolderList request for 1ms. Actually this will just execute the + * code after the calling script has finished. + */ +function queueRefreshFolderList(_folders) +{ + felamimail_queuedFolders.push(_folders); + felamimail_queuedFoldersIndex++; + + // Copy idx onto the anonymous function scope + var idx = felamimail_queuedFoldersIndex; + window.setTimeout(function() { + if (idx == felamimail_queuedFoldersIndex) + { + var folders = felamimail_queuedFolders.join(","); + felamimail_queuedFoldersIndex = 0; + felamimail_queuedFolders = []; + + egw_appWindow('felamimail').xajax_doXMLHTTP('felamimail.ajaxfelamimail.refreshFolderList', folders); + } + }, 1); +} + +function refreshView() { + if (typeof framework == 'undefined') { + if (document.getElementById('messageCounter').innerHTML.search(eval('/'+egw_appWindow('felamimail').lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} + document.mainView.submit(); + document.getElementById('messageCounter').innerHTML = MessageBuffer; + } else { + framework.getApplicationByName('felamimail').browser.reload(); + } +} + +function mail_openComposeWindow(_url,forwardByCompose) { + var Check=true; + var alreadyAsked=false; + var _messageList; + var sMessageList=''; + var cbAllMessages = document.getElementById('selectAllMessagesCheckBox').checked; + var cbAllVisibleMessages = mailGrid.dataRoot.actionObject.getAllSelected(); + if (typeof forwardByCompose == 'undefined') forwardByCompose = true; + if (forwardByCompose == false) + { + cbAllMessages = cbAllVisibleMessages = Check = false; + } + if (typeof prefAskForMultipleForward == 'undefined') prefAskForMultipleForward = egw_appWindow('felamimail').prefAskForMultipleForward; + mail_resetMessageSelect(); + // ask anyway if a whole page is selected + //if (cbAllMessages == true || cbAllVisibleMessages == true) Check = confirm(egw_appWindow('felamimail').lang_confirm_all_messages); // not supported + if (cbAllMessages == true || cbAllVisibleMessages == true) + { + Check = confirm(egw_appWindow('felamimail').lang_multipleforward); + alreadyAsked=true; + } + + if ((cbAllMessages == true || cbAllVisibleMessages == true ) && Check == true) + { + //_messageList = 'all'; // all is not supported by now, only visibly selected messages are chosen + _messageList = egw_appWindow('felamimail').mailGridGetSelected(); + } + else + { + if (Check == true) _messageList = egw_appWindow('felamimail').mailGridGetSelected(); + } + if (typeof _messageList != 'undefined') + { + for (var i in _messageList['msg']) { + //alert('eigenschaft:'+_messageList['msg'][i]); + sMessageList=sMessageList+_messageList['msg'][i]+','; + //sMessageList.concat(','); + } + } + if (prefAskForMultipleForward == 1 && Check == true && alreadyAsked == false && sMessageList.length >0) + { + askme = egw_appWindow('felamimail').lang_multipleforward; + //if (cbAllMessages == true || cbAllVisibleMessages == true) askme = egw_appWindow('felamimail').lang_confirm_all_messages; // not supported + Check = confirm(askme); + } + //alert("Check:"+Check+" MessageList:"+sMessageList+"#"); + if (Check != true) sMessageList=''; // deny the appending off selected messages to new compose -> reset the sMessageList + if (Check == true || sMessageList=='') + { + if (sMessageList.length >0) { + sMessageList= 'AsForward&forwardmails=1&folder='+activeFolderB64+'&reply_id='+sMessageList.substring(0,sMessageList.length-1); + } + //alert(sMessageList); + egw_openWindowCentered(_url+sMessageList,'compose',700,egw_getWindowOuterHeight()); + } + mailGrid.dataRoot.actionObject.setAllSelected(false); +} + +// timer functions +function fm_startTimerFolderStatusUpdate(_refreshTimeOut) { + if(fm_timerFolderStatus) { + window.clearTimeout(fm_timerFolderStatus); + } + if(_refreshTimeOut > 5000) { + fm_timerFolderStatus = window.setInterval("refreshFolderStatus()", _refreshTimeOut); + } +} + +function fm_startTimerMessageListUpdate(_refreshTimeOut) { + if(aktiv) { + window.clearTimeout(aktiv); + } + if(_refreshTimeOut > 5000) { + aktiv = window.setInterval("refresh()", _refreshTimeOut); + } +} + +var felamimail_readMessage = null; +var felamimail_abortView = false; +var felamimail_rm_timeout = 400; +var felamimail_doubleclick_timeout = 300; + +function fm_msg_addClass(_id, _class) { + // Set the opened message read + var dataObject = mailGrid.dataRoot.getElementById(_id); + if (dataObject) + { + dataObject.addClass(_class); + } +} + +function fm_msg_removeClass(_id, _class) { + // Set the opened message read + var dataObject = mailGrid.dataRoot.getElementById(_id); + if (dataObject) + { + dataObject.removeClass(_class); + } +} + +function fm_readMessage(_url, _windowName, _node) { + if (felamimail_abortView) + return; + + var windowArray = _windowName.split('_'); + var msgId = windowArray[1]; + + if (windowArray[0] == 'MessagePreview') + { + // Check whether this mail has not already be queued and the message + // preview is actuall displayed + if (!isNaN(felamimail_iframe_height)) { + + window.felamimail_readMessage = msgId; + + // Wait felamimail_rm_timeout seconds before opening the email in the + // preview iframe + window.setTimeout(function() { + // Abort if another mail should be displayed + if (felamimail_readMessage == msgId && !felamimail_abortView) + { + // Copy the old status message + // TODO. Make this an own function + if (document.getElementById('messageCounter').innerHTML.search( + eval('/'+egw_appWindow('felamimail').lang_updating_view+'/')) < 0 ) + { + MessageBuffer = document.getElementById('messageCounter').innerHTML; + } + + // Set the "updating view" message + egw_appWindow('felamimail').setStatusMessage( + '' + egw_appWindow('felamimail').lang_updating_view + ''); + + fm_previewMessageFolderType = windowArray[2]; + + // refreshMessagePreview now also refreshes the folder state + egw_appWindow('felamimail').xajax_doXMLHTTP( + "felamimail.ajaxfelamimail.refreshMessagePreview", + windowArray[1], windowArray[2]); + + // Mark the message as read + fm_msg_removeClass(windowArray[1], 'unseen'); + } + + }, felamimail_rm_timeout); + } + } else { + window.setTimeout(function() { + + if (!felamimail_abortView) { + // Remove the url which shall be opened as we do not want to open this + // message in the preview window + window.felamimail_readMessage = null; + + egw_openWindowCentered(_url, _windowName, 750, egw_getWindowOuterHeight()); + + // Refresh the folder state (count of unread emails) + egw_appWindow('felamimail').xajax_doXMLHTTP("felamimail.ajaxfelamimail.refreshFolder"); + + fm_msg_removeClass(windowArray[1], 'unseen'); + } + }, 0); + } +} + +/** + * Handles message clicks and distinguishes between double clicks and single clicks + */ +function fm_handleAttachmentClick(_double, _url, _windowName, _node) +{ + var msgId = _windowName.split('_')[1]; + + felamimail_readMessage = msgId; + felamimail_abortView = true; + + // Wait "felamimail_dblclick_speed" milliseconds. Only if the doubleclick + // event doesn't occur in this time, trigger the single click function + window.setTimeout(function () { + if (msgId == felamimail_readMessage) + { + fm_readAttachments(_url, _windowName, _node); + window.setTimeout(function() { + felamimail_abortView = false; + }, 100); + } + }, felamimail_doubleclick_timeout); +} + +function fm_readAttachments(_url, _windowName, _node) { + egw_openWindowCentered(_url, _windowName, 750, 220); + egw_appWindow('felamimail').xajax_doXMLHTTP("felamimail.ajaxfelamimail.refreshFolder"); + mailGrid.dataRoot.actionObject.setAllSelected(false); +} + + +/** + * Handles message clicks and distinguishes between double clicks and single clicks + */ + +function fm_handleComposeClick(_double, _url, _windowName, _node) +{ + var msgId = _windowName.split('_')[1]; + + // Queue the url + felamimail_readMessage = msgId; + felamimail_abortView = true; + + // Wait "felamimail_dblclick_speed" milliseconds. Only if the doubleclick + // event doesn't occur in this time, trigger the single click function + window.setTimeout(function () { + if (felamimail_readMessage == msgId) + { + fm_compose(_url, _windowName, _node); + window.setTimeout(function() { + felamimail_abortView = false; + }, 100); + } + }, felamimail_doubleclick_timeout); +} + +function fm_compose(_url, _windowName, _node) { + egw_openWindowCentered(_url, _windowName, 700, egw_getWindowOuterHeight()); + //egw_appWindow('felamimail').xajax_doXMLHTTP("felamimail.ajaxfelamimail.refreshFolder"); + mailGrid.dataRoot.actionObject.setAllSelected(false); +} + + +function fm_clearSearch() { + var inputQuickSearch = document.getElementById('quickSearch'); + var status = document.getElementById('status').value; + + //enable select allMessages in Folder Checkbox again + if (status == 'any') document.getElementById('selectAllMessagesCheckBox').disabled = false; + + if(inputQuickSearch.value != '') { + inputQuickSearch.value = ''; + quickSearch(); + } + + inputQuickSearch.focus(); +} + +function changeActiveAccount(_accountSelection) +{ + //alert(_accountSelection.value); + egw_appWindow('felamimail').xajax_doXMLHTTP('felamimail.ajaxfelamimail.changeActiveAccount',_accountSelection.value); +} + +function handleResize() +{ + var MIN_TABLE_HEIGHT = typeof felamimail_messagelist_height == "number" ? felamimail_messagelist_height : 100; + if (isNaN(MIN_TABLE_HEIGHT) || MIN_TABLE_HEIGHT<0) MIN_TABLE_HEIGHT = 100; + + var MAX_TABLE_WHITESPACE = 25; + + // Get the default iframe height, as it was set in the template + var IFRAME_HEIGHT = typeof felamimail_iframe_height == "number" ? felamimail_iframe_height : 0; + if (isNaN(IFRAME_HEIGHT) || IFRAME_HEIGHT<0) IFRAME_HEIGHT=0; + + // Calculate how many space is actually there for the whole mail view + var outerContainer = $('#divMessageList'); + var mainViewArea = $('#divMainView'); + + // Exit if the felamimail containers do not exist + // maybe check on $(mainViewArea).offset()== null as well + if (!outerContainer || !mainViewArea || $(mainViewArea).offset()== null) { + return; + } + + var viewportHeight = $(window).height(); + var documentHeight = $("body").height() == 0 ? $(document).height() : $("body").height(); + var containerHeight = $(outerContainer).height(); + + var totalHeight = viewportHeight; + if ($(mainViewArea).offset().top == 0) + { + // if the mainViewArea offset from top is 0 we are in frameview, containerheight may/should be set decently + totalHeight = Math.max(0, viewportHeight - (documentHeight - containerHeight)); + } + else + { + // containerHeight is not set with a decent height when in idots/jerryr, for this reason we use this to calculate the + totalHeight = Math.max(0, Math.min(documentHeight, viewportHeight)-$(mainViewArea).offset().top - 100); + } + var resultIframeHeight = IFRAME_HEIGHT; + var resultGridHeight = 0; + + // Check whether there is enough space for extending any of the objects + var remainingHeight = totalHeight - IFRAME_HEIGHT; + if (totalHeight - IFRAME_HEIGHT > 0) + { + var gridHeight = 0; + if (mailGrid != null) + { + gridHeight = mailGrid.getDataHeight(); + var allElements = mailGrid.dataRoot.actionObject.flatList(); + gridHeight = gridHeight + (allElements.length*3) + 10; + } + // Get the height of the mailGrid content + var contentHeight = Math.max(MIN_TABLE_HEIGHT, gridHeight); + + // Extend the gridHeight as much as possible + resultGridHeight = Math.max(MIN_TABLE_HEIGHT, Math.min(remainingHeight, contentHeight)); + + // Set the iframe height + resultIframeHeight = Math.max(IFRAME_HEIGHT, totalHeight - resultGridHeight); + } + else + { + // Size the grid as small as possible + resultGridHeight = MIN_TABLE_HEIGHT; + } + if (IFRAME_HEIGHT==0) resultGridHeight = resultGridHeight -2; + // Now apply the calculated sizes to the DOM elements + + // Resize the grid + var divMessageTableList = document.getElementById('divMessageTableList'); + if (divMessageTableList) + { + divMessageTableList.style.height = resultGridHeight + 'px'; + if (mailGrid != null) + { + mailGrid.resize($(divMessageTableList).outerWidth(), resultGridHeight); + } + } + + // Remove the border of the gray panel above the mail from the iframe height + resultIframeHeight -= 52; + + // Resize the message table + var iframe = document.getElementById('messageIFRAME'); + if (typeof iframe != 'undefined' && iframe) + { + iframe.height = resultIframeHeight; + } + + var tdiframe = document.getElementById('tdmessageIFRAME'); + if (tdiframe != 'undefined' && tdiframe) + { + tdiframe.height = resultIframeHeight; + } +} + + +// DIALOG BOXES by Michael Leigeber +// global variables // +var TIMER = 5; +var SPEED = 10; +var WRAPPER = 'divPoweredBy'; + +// calculate the current window width // +function pageWidth() { + return window.innerWidth != null ? window.innerWidth : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body != null ? document.body.clientWidth : null; +} + +// calculate the current window height // +function pageHeight() { + return window.innerHeight != null? window.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body != null? document.body.clientHeight : null; +} + +// calculate the current window vertical offset // +function topPosition() { + return typeof window.pageYOffset != 'undefined' ? window.pageYOffset : document.documentElement && document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ? document.body.scrollTop : 0; +} + +// calculate the position starting at the left of the window // +function leftPosition() { + return typeof window.pageXOffset != 'undefined' ? window.pageXOffset : document.documentElement && document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ? document.body.scrollLeft : 0; +} + +// build/show the dialog box, populate the data and call the fadeDialog function // +function showDialog(title,message,type,autohide) { + if(!type) { + type = 'error'; + } + var dialog; + var dialogheader; + var dialogclose; + var dialogtitle; + var dialogcontent; + var dialogmask; + if(!document.getElementById('dialog')) { + dialog = document.createElement('div'); + dialog.id = 'dialog'; + dialogheader = document.createElement('div'); + dialogheader.id = 'dialog-header'; + dialogtitle = document.createElement('div'); + dialogtitle.id = 'dialog-title'; + dialogclose = document.createElement('div'); + dialogclose.id = 'dialog-close' + dialogcontent = document.createElement('div'); + dialogcontent.id = 'dialog-content'; + dialogmask = document.createElement('div'); + dialogmask.id = 'dialog-mask'; + document.body.appendChild(dialogmask); + document.body.appendChild(dialog); + dialog.appendChild(dialogheader); + dialogheader.appendChild(dialogtitle); + dialogheader.appendChild(dialogclose); + dialog.appendChild(dialogcontent);; + dialogclose.setAttribute('onclick','hideDialog()'); + dialogclose.onclick = hideDialog; + } else { + dialog = document.getElementById('dialog'); + dialogheader = document.getElementById('dialog-header'); + dialogtitle = document.getElementById('dialog-title'); + dialogclose = document.getElementById('dialog-close'); + dialogcontent = document.getElementById('dialog-content'); + dialogmask = document.getElementById('dialog-mask'); + dialogmask.style.visibility = "visible"; + dialog.style.visibility = "visible"; + } + dialog.style.opacity = .00; + dialog.style.filter = 'alpha(opacity=0)'; + dialog.alpha = 0; + var width = pageWidth(); + var height = pageHeight(); + var left = leftPosition(); + var top = topPosition(); + var dialogwidth = dialog.offsetWidth; + var dialogheight = dialog.offsetHeight; + var topposition = top + (height / 3) - (dialogheight / 2); + var leftposition = left + (width / 2) - (dialogwidth / 2); + dialog.style.top = topposition + "px"; + dialog.style.left = leftposition + "px"; + dialogheader.className = type + "header"; + dialogtitle.innerHTML = title; + dialogcontent.className = type; + dialogcontent.innerHTML = message; + var content = document.getElementById(WRAPPER); + if (typeof content == 'undefined' || content == null) + { + dialogmask.style.height = '10px'; + } + else + { + dialogmask.style.height = content.offsetHeight + 'px'; + } + dialog.timer = setInterval("fadeDialog(1)", TIMER); + if(autohide) { + dialogclose.style.visibility = "hidden"; + window.setTimeout("hideDialog()", (autohide * 1000)); + } else { + dialogclose.style.visibility = "visible"; + } +} + +// hide the dialog box // +function hideDialog() { + var dialog = document.getElementById('dialog'); + clearInterval(dialog.timer); + dialog.timer = setInterval("fadeDialog(0)", TIMER); +} + +// fade-in the dialog box // +function fadeDialog(flag) { + if(flag == null) { + flag = 1; + } + var dialog = document.getElementById('dialog'); + var value; + if(flag == 1) { + value = dialog.alpha + SPEED; + } else { + value = dialog.alpha - SPEED; + } + dialog.alpha = value; + dialog.style.opacity = (value / 100); + dialog.style.filter = 'alpha(opacity=' + value + ')'; + if(value >= 99) { + clearInterval(dialog.timer); + dialog.timer = null; + } else if(value <= 1) { + dialog.style.visibility = "hidden"; + document.getElementById('dialog-mask').style.visibility = "hidden"; + clearInterval(dialog.timer); + } +} + +function felamimail_transform_foldertree() { + // Get the felamimail object manager, but do not create it! + var objectManager = egw_getObjectManager('felamimail', false); + + if (!objectManager) { + return; + } + + // Get the top level element for the felamimail tree + var treeObj = objectManager.getObjectById("felamimail_folderTree"); + if (treeObj == null) { + // Add a new container to the object manager which will hold the tree + // objects + treeObj = objectManager.addObject("felamimail_folderTree", + null, EGW_AO_FLAG_IS_CONTAINER); + } + + // Delete all old objects + treeObj.clear(); + + // Go over the folder list + if (typeof felamimail_folders != 'undefined' && felamimail_folders.length > 0) + { + for (var i = 0; i < felamimail_folders.length; i++) { + var folderName = felamimail_folders[i]; + + // Add a new action object to the object manager + var obj = treeObj.addObject(folderName, + new dhtmlxtreeItemAOI(tree, folderName)); + obj.updateActionLinks(["drop_move_mail", "drop_copy_mail", "drop_cancel"]); + } + } +} + +function mail_dragStart(_action, _senders) { + //TODO + return $("
    " + _senders.length + " Mails selected
    ") +} + +function mail_getFormData(_actionObjects) { + var messages = {}; + if (_actionObjects.length>0) + { + messages['msg'] = []; + } + + for (var i = 0; i < _actionObjects.length; i++) + { + if (_actionObjects[i].id.length>0) + { + messages['msg'][i] = _actionObjects[i].id; + } + } + + return messages; +} + +/** + * Move (multiple) messages to given folder + * + * @param _action _action.id is 'drop_move_mail' or 'move_'+folder + * @param _senders selected messages + * @param _target drop-target, if _action.id = 'drop_move_mail' + */ +function mail_move(_action, _senders, _target) { + var target = _action.id == 'drop_move_mail' ? _target.id : _action.id.substr(5); + var messages = mail_getFormData(_senders); + //alert('mail_move('+messages.msg.join(',')+' --> '+target+')'); + // TODO: Write move/copy function which cares about doing the same stuff + // as the "onNodeSelect" function! + if (document.getElementById('messageCounter').innerHTML.search(eval('/'+egw_appWindow('felamimail').lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} + egw_appWindow('felamimail').setStatusMessage(egw_appWindow('felamimail').movingMessages +' '+ target +''); + mail_cleanup(); + document.getElementById('divMessageList').innerHTML = ''; + + egw_appWindow('felamimail').xajax_doXMLHTTP( + "felamimail.ajaxfelamimail.moveMessages", target, messages); +} + +/** + * Copy (multiple) messages to given folder + * + * @param _action _action.id is 'drop_copy_mail' or 'copy_'+folder + * @param _senders selected messages + * @param _target drop-target, if _action.id = 'drop_copy_mail' + */ +function mail_copy(_action, _senders, _target) { + var target = _action.id == 'drop_copy_mail' ? _target.id : _action.id.substr(5); + var messages = mail_getFormData(_senders); + //alert('mail_copy('+messages.msg.join(',')+' --> '+target+')'); + // TODO: Write move/copy function which cares about doing the same stuff + // as the "onNodeSelect" function! + if (document.getElementById('messageCounter').innerHTML.search(eval('/'+egw_appWindow('felamimail').lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} + egw_appWindow('felamimail').setStatusMessage(egw_appWindow('felamimail').copyingMessages +' '+ target +''); + mail_cleanup(); + document.getElementById('divMessageList').innerHTML = ''; + egw_appWindow('felamimail').xajax_doXMLHTTP( + "felamimail.ajaxfelamimail.copyMessages", target, messages); +} + +function mail_cleanup() { + var objectManager = egw_getObjectManager("felamimail"); + objectManager.clear(); + mailGrid = null; + $("#divMessageTableList").children().remove(); +} diff --git a/felamimail/js/jscode/view_message.js b/felamimail/js/jscode/view_message.js new file mode 100644 index 0000000000..0c2fdcae98 --- /dev/null +++ b/felamimail/js/jscode/view_message.js @@ -0,0 +1,116 @@ +// var tab = new Tabs(3,'activetab','inactivetab','tab','tabcontent','','','tabpage'); +// var smtp = new Tabs(2,'activetab','inactivetab','smtp','smtpcontent','smtpselector','','smtppage'); +// var imap = new Tabs(3,'activetab','inactivetab','imap','imapcontent','imapselector','','imappage'); + +var headerFullSize=false; + +var headerDIVHeight; + +var bodyDIVTop; + +function getUrlPart(url, name ) +{ + name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); + var regexS = "[\\?&]"+name+"=([^&#]*)"; + var regex = new RegExp( regexS ); + var results = regex.exec( url ); + if( results == null ) + return ""; + else + return results[1]; +} + +function sendNotify (uid) { + ret = confirm(lang_sendnotify); + xajax_doXMLHTTP("felamimail.ajaxfelamimail.sendNotify",uid,ret); +} + +function goToMessage(url) { + //alert(getUrlPart(window.location.href,'uid')); + var oldUid = getUrlPart(window.location.href,'uid'); + var newUid = getUrlPart(url,'uid'); + window.opener.mail_parentRefreshListRowStyle(oldUid, newUid); + window.location.href = url; + //opener.refresh(); +} + +function initAll() +{ + //tab.init(); + if (egw_getWindowOuterHeight()<750) + { + var fm_height = screen.availHeight/100*75; + var resizeHeight = fm_height-egw_getWindowOuterHeight(); + //alert(fm_height+' resize By:0,'+resizeHeight); + if (fm_height >= 750) window.resizeBy(0,resizeHeight); + } + + var headerTable = document.getElementById('headerTable'); + var headerDIV = document.getElementById('headerDIV'); + if (headerTable) { + if (headerTable.clientHeight) { + if(headerTable.clientHeight > headerDIV.clientHeight) { + var moreDIV = document.getElementById('moreDIV'); + moreDIV.style.display = 'block'; + } + } + } + if(is_ie) { + fm_resizeBodyDIV(); + window.onresize = fm_resizeBodyDIV; + } + updateTitle(); +} + +function updateTitle() { + var _text = document.getElementById('subjectDATA').firstChild.nodeValue; + if(_text.length>40) { + _text = _text.substring(0,40) + '...'; + } + + document.title = _text; +} + +function toggleHeaderSize() { + var toogleSPAN = document.getElementById('toogleSPAN'); + + var headerTable = document.getElementById('headerTable'); + var headerDIV = document.getElementById('headerDIV'); + var bodyDIV = document.getElementById('bodyDIV'); + + if(!headerFullSize) { + var navbarDIV = document.getElementById('navbarDIV'); + var subjectDIV = document.getElementById('subjectDIV'); + + headerDIVHeight = headerDIV.clientHeight; + bodyDIVTop = bodyDIV.offsetTop; + headerDIV.style.height = headerTable.clientHeight + 'px'; + + bodyDIV.style.top = 4 + navbarDIV.clientHeight + subjectDIV.clientHeight + headerDIV.clientHeight + 'px'; + + headerFullSize=true; + toogleSPAN.innerHTML = '-'; + } else { + headerFullSize=false; + toogleSPAN.innerHTML = '+'; + + headerDIV.style.height = headerDIVHeight + 'px'; + bodyDIV.style.top = bodyDIVTop + 'px'; + } +} + +function fm_resizeBodyDIV() { + var attachmentDIV; + var bodyDIV = document.getElementById('bodyDIV'); + var attachmentDIV = document.getElementById('attachmentDIV'); + + if(attachmentDIV = document.getElementById('attachmentDIV')) { + bodyDIV.style.height = attachmentDIV.offsetTop - bodyDIV.offsetTop + 'px'; + } else { + bodyDIV.style.height = egw_getWindowInnerHeight() - bodyDIV.offsetTop - 2 + 'px'; + } +} + +function fm_displayHeaderLines(_url) { + egw_openWindowCentered(_url,'fm_display_headerLines','700','600',window.outerWidth/2,window.outerHeight/2); +} diff --git a/felamimail/lang/egw_bg.lang b/felamimail/lang/egw_bg.lang new file mode 100644 index 0000000000..81704f4199 --- /dev/null +++ b/felamimail/lang/egw_bg.lang @@ -0,0 +1,462 @@ +(no subject) felamimail bg (без тема) +(only cc/bcc) felamimail bg (Ñамо копие/Ñкрито копие) +(separate multiple addresses by comma) felamimail bg (разделете нÑколко адреÑа ÑÑŠÑ Ð·Ð°Ð¿ÐµÑ‚Ð°Ñ) +(unknown sender) felamimail bg (неизвеÑтен подател) +activate felamimail bg Ðктивиране +activate script felamimail bg активиране на Ñкрипт +activating by date requires a start- and end-date! felamimail bg Ðктивиране по дата изиÑква начална И крайна дата! +add acl felamimail bg добави ÑпиÑък за контрол на доÑтъпа +add address felamimail bg Добави Ð°Ð´Ñ€ÐµÑ +add rule felamimail bg Добави правило +add script felamimail bg Добави Ñкрипт +add to %1 felamimail bg Добави към %1 +add to address book felamimail bg Добави към ÐдреÑÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ» +add to addressbook felamimail bg добави към ÐдреÑÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ» +adding file to message. please wait! felamimail bg Прилагане на файл към Ñъобщението. МолÑ, почакайте! +additional info felamimail bg Допълнителна Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ +address book felamimail bg ÐдреÑен указател +address book search felamimail bg ТърÑене в ÐдреÑÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÐµÐ» +after message body felamimail bg След Ñ‚Ñлото на Ñъобщението +all address books felamimail bg Ð’Ñички адреÑни указатели +all folders felamimail bg Ð’Ñички папки +all of felamimail bg вÑички +allow images from external sources in html emails felamimail bg Показване на Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñ‚ външни източници в HTML ÑъобщениÑ? +allways a new window felamimail bg винаги в нов прозорец +always show html emails felamimail bg Винаги показва HTML ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +and felamimail bg и +any of felamimail bg нÑкой от +any status felamimail bg без значение +anyone felamimail bg вÑеки +as a subfolder of felamimail bg вÑички подпапки на +attachments felamimail bg ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ +authentication required felamimail bg изиÑква Ñе Ð¾Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ +auto refresh folder list felamimail bg Ðвтоматично опреÑнÑване на ÑпиÑъка Ñ Ð¿Ð°Ð¿ÐºÐ¸ +back to folder felamimail bg Обратно към папка +bad login name or password. felamimail bg Ðевалидно име или парола. +bad or malformed request. server responded: %s felamimail bg Ðекоректна заÑвка. Сървърът отговори: %s +bad request: %s felamimail bg Ðекоректна заÑвка: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail bg СъглаÑно зададен критерий, фонът на входÑщите ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² ÑпиÑъка може да бъде различен. Това помага леÑно да разграничите подателите, оÑобено при пощенÑки ÑпиÑъци. +bcc felamimail bg Скрито копие +before headers felamimail bg Преди заглавната чаÑÑ‚ +between headers and message body felamimail bg Между заглавната чаÑÑ‚ и Ñ‚Ñлото на Ñъобщението +body part felamimail bg чаÑÑ‚ от Ñ‚Ñлото +by date felamimail bg по дата +can not send message. no recipient defined! felamimail bg Ñъобщението не може да бъде изпратено - не е поÑочен получател! +can't connect to inbox!! felamimail bg неуÑпешна връзка Ñ INBOX!! +cc felamimail bg копие +change folder felamimail bg СмÑна на папка +check message against next rule also felamimail bg провери Ñъобщението и ÑъглаÑно Ñледващото правило +clear search felamimail bg изтрий Ñ‚ÑŠÑ€Ñенето +click here to log back in. felamimail bg Кликнете тук за влизане отново. +click here to return to %1 felamimail bg Кликнете тук за връщане към %1 +close all felamimail bg затварÑне на вÑичко +close this page felamimail bg затвори Ñтраницата +close window felamimail bg ЗатварÑне на прозореца +color felamimail bg ЦвÑÑ‚ +compose felamimail bg Ðово Ñъобщение +compose as new felamimail bg Ñъздай като ново +compress folder felamimail bg КомпреÑиране на папката +condition felamimail bg уÑловие +configuration felamimail bg ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ +connection dropped by imap server. felamimail bg Връзката е прекъÑната от IMAP Ñървъра. +contains felamimail bg Ñъдържа +could not complete request. reason given: %s felamimail bg ÐеуÑпешно изпълнение на заÑвката поради: %s +could not import message: felamimail bg ÐеуÑпешен импорт на Ñъобщение: +could not open secure connection to the imap server. %s : %s. felamimail bg ÐеуÑпешно изграждане на криптирана връзка Ñ IMAP Ñървъра. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail bg CRAM-MD5 или DIGEST-MD5 изиÑкват инÑталиране на пакета Auth_SASL. +create felamimail bg Създаване +create folder felamimail bg Създаване на папка +create sent felamimail bg Създаване на "Изпратени" +create subfolder felamimail bg Създаване на подпапка +create trash felamimail bg Създаване на "Кошче" +created folder successfully! felamimail bg Папката е Ñъздадена уÑпешно! +dark blue felamimail bg Тъмно Ñин +dark cyan felamimail bg Тъмно Ñиньозелен +dark gray felamimail bg Тъмно Ñив +dark green felamimail bg Тъмно зелен +dark magenta felamimail bg Тъмно пурпурен +dark yellow felamimail bg Тъмно жълт +date(newest first) felamimail bg По дата (първо най-новите) +date(oldest first) felamimail bg По дата (първо най-Ñтарите) +days felamimail bg дни +deactivate script felamimail bg деактивиране на Ñкрипта +default felamimail bg по подразбиране +default signature felamimail bg Ð¿Ð¾Ð´Ð¿Ð¸Ñ Ð¿Ð¾ подразбиране +default sorting order felamimail bg Подреждане по подразбиране +delete all felamimail bg изтриване на вÑички +delete folder felamimail bg Изтриване на Папка +delete script felamimail bg изтриване на Ñкрипт +delete selected felamimail bg Изтрий избраните +delete selected messages felamimail bg изтрий избраните ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +deleted felamimail bg изтрито +deleted folder successfully! felamimail bg Папката е уÑпешно изтрита! +deleting messages felamimail bg изтриване на ÑъобщениÑта +disable felamimail bg ЗабранÑва +discard felamimail bg изоÑтавÑне +discard message felamimail bg изоÑтавÑне на Ñъобщението +display message in new window felamimail bg Показване на ÑъобщениÑта в нов прозорец +display messages in multiple windows felamimail bg показване на ÑъобщениÑта в отделни прозорци +display of html emails felamimail bg Показване на HTML ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +display only when no plain text is available felamimail bg Показва Ñамо, когато нÑма текÑÑ‚ +display preferences felamimail bg ÐаÑтройки за изобразÑване +displaying html messages is disabled felamimail bg Показването на HTML ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ðµ забранено! +do it! felamimail bg дейÑтвай! +do not use sent felamimail bg Ðе използвай "Изпратени" +do not use trash felamimail bg Ðе използвай "Кошче" +do not validate certificate felamimail bg не проверÑвай Ñертификати +do you really want to delete the '%1' folder? felamimail bg ÐаиÑтина ли желаете да изтриете папка '%1'? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail bg ÐаиÑтина ли желаете да изтриете избраните наÑтройки на акаунт и Ñъответната им ÑамоличноÑÑ‚? +do you really want to delete the selected signatures? felamimail bg ÐаиÑтина ли желаете да изтриете избраните подпиÑи? +do you really want to move the selected messages to folder: felamimail bg ÐаиÑтина ли желаете да премеÑтите избраните ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² папка +do you want to be asked for confirmation before moving selected messages to another folder? felamimail bg Потвърждение преди премеÑтване на избрани ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² друга папка? +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail bg Желаете ли да забраните управлението на папките (Ñъздаване, права на доÑтъп И абонамент)? +does not contain felamimail bg не Ñъдържа +does not exist on imap server. felamimail bg не ÑъщеÑтвува на IMAP Ñървъра. +does not match felamimail bg не Ñъвпада Ñ +does not match regexp felamimail bg не Ñъвпада Ñ Ñ€ÐµÐ³. израз +don't use draft folder felamimail bg Ðе използвай "Чернови" +don't use sent felamimail bg Ðе използвай "Изпратени" +don't use template folder felamimail bg Ðе използвай папка "Шаблони" +don't use trash felamimail bg Ðе използвай "Кошче" +dont strip any tags felamimail bg не премахвай етикети +down felamimail bg надолу +download felamimail bg изтеглÑне +download this as a file felamimail bg Изтеглете го като файл +draft folder felamimail bg папка "Чернови" +drafts felamimail bg Чернови +e-mail felamimail bg E-Mail +e-mail address felamimail bg E-Mail Ð°Ð´Ñ€ÐµÑ +e-mail folders felamimail bg E-Mail папки +edit email forwarding address felamimail bg редактиране на адреÑа за препращане на e-mail-а +edit filter felamimail bg Редактиране на филтър +edit rule felamimail bg редактиране на правило +edit selected felamimail bg Редактиране на избраните +edit vacation settings felamimail bg редактиране на наÑтройките за "ваканциÑ" +editor type felamimail bg Вид на редактора +email address felamimail bg E-Mail Ð°Ð´Ñ€ÐµÑ +email forwarding address felamimail bg E-Mail Ð°Ð´Ñ€ÐµÑ Ð·Ð° препращане +email notification update failed felamimail bg ÐктуализациÑта на e-mail извеÑтието беше неуÑпешна. +email signature felamimail bg ÐŸÐ¾Ð´Ð¿Ð¸Ñ Ð·Ð° E-Mail +emailaddress felamimail bg e-mail Ð°Ð´Ñ€ÐµÑ +empty trash felamimail bg изпразване на кошчето +enable felamimail bg позволÑва +encrypted connection felamimail bg криптирана връзка +enter your default mail domain ( from: user@domain ) admin bg Въведете e-mail домейн по подразбиране (От: user@domain) +enter your imap mail server hostname or ip address admin bg Въведете името или IP адреÑа на IMAP Ñървъра +enter your sieve server hostname or ip address admin bg Въведете името или IP адреÑа на SIEVE Ñървъра +enter your sieve server port admin bg Въведете порта на SIEVE Ñървъра +enter your smtp server hostname or ip address admin bg Въведете името или IP адреÑа на SMTP Ñървъра +enter your smtp server port admin bg Въведете порта на SMTP Ñървъра +error felamimail bg ГРЕШКР+error connecting to imap serv felamimail bg Грешка при връзка Ñ IMAP Ñървъра +error connecting to imap server. %s : %s. felamimail bg Грешка при връзка Ñ IMAP Ñървъра. %s : %s. +error connecting to imap server: [%s] %s. felamimail bg Грешка при връзка Ñ IMAP Ñървъра: [%s] %s. +error opening felamimail bg Грешка при отварÑне на +error: felamimail bg Грешка: +error: could not save message as draft felamimail bg Грешка: неуÑпешно запазване на Ñъобщнието като Чернова +every felamimail bg вÑеки +every %1 days felamimail bg на вÑеки %1 дни +expunge felamimail bg Заличаване +extended felamimail bg разширен +felamimail common bg Електронна поща +file into felamimail bg файл в +files felamimail bg файлове +filter active felamimail bg филтърът е активен +filter name felamimail bg Име на филтъра +filter rules common bg правила на филтриране +first name felamimail bg СобÑтвено име +flagged felamimail bg Ñ Ñ„Ð»Ð°Ð³Ñ‡Ðµ +flags felamimail bg Маркери +folder felamimail bg папка +folder acl felamimail bg ÑпиÑък за доÑтъп до папката +folder name felamimail bg Име на папката +folder path felamimail bg Път до папката +folder preferences felamimail bg ÐаÑтройки на папката +folder settings felamimail bg ÐаÑтройки на папката +folder status felamimail bg СъÑтоÑние на папката +folderlist felamimail bg СпиÑък Ñ Ð¿Ð°Ð¿ÐºÐ¸ +foldername felamimail bg Име на папката +folders felamimail bg Папки +folders created successfully! felamimail bg Папката е Ñъздадена уÑпешно! +follow felamimail bg Ñледва +for mail to be send - not functional yet felamimail bg За изпращане на ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ - вÑе още не функционира +for received mail felamimail bg За получени ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +forward felamimail bg Препращане +forward as attachment felamimail bg препращане като приложение +forward inline felamimail bg препращане в Ñъобщението +forward messages to felamimail bg Препращане на Ñъобщението до +forward to felamimail bg препрати до +forward to address felamimail bg препрати до Ð°Ð´Ñ€ÐµÑ +forwarding felamimail bg Препращане +found felamimail bg Ðамерен(и) +fri felamimail bg Пет +from felamimail bg Подател +from(a->z) felamimail bg Подател (A->Z) +from(z->a) felamimail bg Подател (Z->A) +full name felamimail bg Име +greater than felamimail bg по-голÑмо от +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail bg ПоÑетете www.felamimail.org, за да научите повече за Squirrelmail.
    +header lines felamimail bg Заглавна чаÑÑ‚ +hide header felamimail bg Ñкрий заглавната чаÑÑ‚ +hostname / address felamimail bg име на хоÑÑ‚ / Ð°Ð´Ñ€ÐµÑ +how to forward messages felamimail bg как да Ñе препращат ÑъобщениÑта +html felamimail bg HTML +icons and text felamimail bg Икони и текÑÑ‚ +icons only felamimail bg Само икони +identity felamimail bg ÑамоличноÑÑ‚ +if felamimail bg ÐКО +if from contains felamimail bg ако "От:" Ñъдържа +if mail header felamimail bg ако заглавната чаÑÑ‚ +if message size felamimail bg ако размерът на Ñъобщението +if shown, which folders should appear on main screen felamimail bg Кои папки да Ñе поÑвÑват на Ð³Ð»Ð°Ð²Ð½Ð¸Ñ ÐµÐºÑ€Ð°Ð½? +if subject contains felamimail bg ако Темата Ñъдържа +if to contains felamimail bg ако "До:" Ñъдържа +if using ssl or tls, you must have the php openssl extension loaded. felamimail bg Ðко използвате SSL или TLS, Ñ‚Ñ€Ñбва да заредите OpenSSL разширението на PHP. +illegal folder name. please select a different name. felamimail bg Ðевалидно име на папка. МолÑ, изберете друго име. +imap felamimail bg IMAP +imap server felamimail bg IMAP Ñървър +imap server address felamimail bg ÐÐ´Ñ€ÐµÑ Ð½Ð° IMAP Ñървъра +imap server closed the connection. felamimail bg IMAP Ñървъра прекрати връзката. +imap server closed the connection. server responded: %s felamimail bg IMAP Ñървъра прекрати връзката Ñ Ð¾Ñ‚Ð³Ð¾Ð²Ð¾Ñ€: %s +imap server password felamimail bg парола за IMAP Ñървъра +imap server type felamimail bg тип на IMAP Ñървъра +imap server username felamimail bg име на потребител за IMAP Ñървъра +imaps authentication felamimail bg IMAPS Ð¾Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ +imaps encryption only felamimail bg Ñамо IMAPS кодиране +import felamimail bg импорт +import mail felamimail bg Импорт на поща +in felamimail bg в +inbox felamimail bg ВходÑщи +incoming mail server(imap) felamimail bg Сървър за входÑща поща (IMAP) +index order felamimail bg Подреждане +info felamimail bg Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ +invalid user name or password felamimail bg Грешно име или парола +javascript felamimail bg JavaScript +jumping to end felamimail bg преÑкачане към ÐºÑ€Ð°Ñ +jumping to start felamimail bg преÑкачане към началото +junk felamimail bg Ðежелани +keep a copy of the message in your inbox felamimail bg запазване на копие от Ñъобщението във ВходÑщи +keep local copy of email felamimail bg запазване на локално копие на ÑъобщениÑта +kilobytes felamimail bg килобайта +language felamimail bg Език +last name felamimail bg Ð¤Ð°Ð¼Ð¸Ð»Ð¸Ñ +left felamimail bg ÐалÑво +less felamimail bg по-малко +less than felamimail bg по-малко от +light gray felamimail bg СветлоÑив +list all felamimail bg Покажи вÑички +loading felamimail bg зареждане +location of buttons when composing felamimail bg МеÑтоположение на бутоните при Ñъздаване/пиÑане +mail server login type admin bg Тип на влизане (login) в Mail Ñървъра +mail settings felamimail bg ÐаÑтройки на пощата +mainmessage felamimail bg главно Ñъобщение +manage email accounts and identities common bg Управление на E-Mail акаунти и ÑамоличноÑти +manage emailaccounts common bg Управление на E-Mail акаунтите +manage emailfilter / vacation preferences bg Управление на E-Mail филтър / "ВаканциÑ" +manage folders common bg Управление на папките +manage sieve common bg Управление на Sieve Ñкриптовете +manage signatures felamimail bg Управление на подпиÑите +mark as deleted felamimail bg Маркирай като изтрито +mark messages as felamimail bg Маркирай избраните ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÐ°Ñ‚Ð¾ +mark selected as flagged felamimail bg Маркирай избраните Ñ Ñ„Ð»Ð°Ð³Ñ‡Ðµ +mark selected as read felamimail bg Маркирай избраните като Прочетени +mark selected as unflagged felamimail bg Маркирай избраните без флагче +mark selected as unread felamimail bg Маркирай избраните като Ðепрочетени +match felamimail bg Съвпада +matches felamimail bg Ñъвпада Ñ +matches regexp felamimail bg Ñъвпада Ñ Ñ€ÐµÐ³. израз +max uploadsize felamimail bg макÑимален обем: +message list felamimail bg СпиÑък ÑÑŠÑ ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +messages felamimail bg ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +mon felamimail bg Пон +move felamimail bg премеÑти +move messages felamimail bg премеÑти ÑъобщениÑта +move to felamimail bg премеÑти избраните в +move to trash felamimail bg ПремеÑти в Кошчето +moving messages to felamimail bg премеÑтване на ÑъобщениÑта в +name felamimail bg Име +never display html emails felamimail bg Ðе показва HTML ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +new common bg Ðово +new filter felamimail bg Ðов филтър +next felamimail bg Следващо +next message felamimail bg Ñледващо Ñъобщение +no active imap server found!! felamimail bg Ðе е открит активен IMAP Ñървър! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail bg Ðе е поÑочен Ð°Ð´Ñ€ÐµÑ Ð”Ðž/Копие/Скрито копие и не е зададена папка за запазване на Ñъобщението. +no encryption felamimail bg без криптиране +no filter felamimail bg Без филтър +no folders found felamimail bg Ðе Ñа намерени папки +no folders were found to subscribe to! felamimail bg Ðе Ñа намерени папки, за които да Ñе абонирате! +no folders were found to unsubscribe from! felamimail bg Ðе Ñа намерени папки, за които да отмените абонамент! +no message returned. felamimail bg Ðе Ñа открити ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +no messages found... felamimail bg нÑма открити ÑъобщениÑ... +no messages selected, or lost selection. changing to folder felamimail bg ÐÑма избрани ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ изборът е изгубен. Показване на папка +no messages were selected. felamimail bg ÐÑма избрани ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +no plain text part found felamimail bg липÑва текÑтова чаÑÑ‚ +no previous message felamimail bg нама предишно Ñъобщение +no recipient address given! felamimail bg Ðе е поÑочен Ð°Ð´Ñ€ÐµÑ Ð½Ð° получател! +no signature felamimail bg нÑма Ð¿Ð¾Ð´Ð¿Ð¸Ñ +no subject given! felamimail bg Ðе е поÑочена Тема! +no supported imap authentication method could be found. felamimail bg Ðе Ñе поддържа зададениÑÑ‚ метод за IMAP оторизациÑ. +no valid emailprofile selected!! felamimail bg Ðе е избран валиден E-Mail профил! +none felamimail bg нÑма +on felamimail bg на +only inbox felamimail bg Само ВходÑщи +only one window felamimail bg Ñамо в един прозорец +only unseen felamimail bg Само не отворените +open all felamimail bg отвори вÑички +options felamimail bg Опции +or felamimail bg или +organisation felamimail bg Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ +organization felamimail bg Ð¾Ñ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ +organization name admin bg Име на организациÑта +original message felamimail bg оригинално Ñъобщение +outgoing mail server(smtp) felamimail bg Ñървър за изходÑща поща (SMTP) +participants felamimail bg УчаÑтници +personal information felamimail bg Лична Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ +please select a address felamimail bg МолÑ, изберете Ð°Ð´Ñ€ÐµÑ +please select the number of days to wait between responses felamimail bg МолÑ, изберете брой дни за изчакване между отговорите +please supply the message to send with auto-responses felamimail bg МолÑ, въведете Ñъобщение за изпращане като Ðвтоматичен отговор +port felamimail bg порт +previous felamimail bg Предишно +previous message felamimail bg предишно Ñъобщение +print it felamimail bg отпечатване +print this page felamimail bg отпечатване на Ñтраницата +printview felamimail bg изглед за печат +quicksearch felamimail bg Бързо Ñ‚ÑŠÑ€Ñене +read felamimail bg прочетено +reading felamimail bg четене на +receive notification felamimail bg Обратна разпиÑка +refresh time in minutes felamimail bg Време на опреÑнÑване в минути +reject with felamimail bg откажи Ñ +remove felamimail bg премахване +remove immediately felamimail bg Премахни незабавно +rename felamimail bg Преименуване +rename a folder felamimail bg Преименуване на папка +rename folder felamimail bg Преименуване на папка +renamed successfully! felamimail bg УÑпешно преименувана! +replied felamimail bg изпратен отговор +reply felamimail bg Отговор +reply all felamimail bg Отговор до вÑички +reply to felamimail bg Отговор До +replyto felamimail bg Отговор До +respond felamimail bg Ð’ отговор на +respond to mail sent to felamimail bg Ð’ отговор на Ñъобщение, изпратено до +return felamimail bg Връщане +return to options page felamimail bg Връщане към Ñтраницата Ñ Ð¾Ð¿Ñ†Ð¸Ð¸Ñ‚Ðµ +right felamimail bg ДÑÑно +row order style felamimail bg Стил на изгледа +rule felamimail bg Правило +sat felamimail bg Ñъб +save felamimail bg Ð—Ð°Ð¿Ð¸Ñ +save as draft felamimail bg Ð·Ð°Ð¿Ð¸Ñ ÐºÐ°Ñ‚Ð¾ чернова +save as infolog felamimail bg Ð·Ð°Ð¿Ð¸Ñ Ð² Дневника +save changes felamimail bg Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° промените +save message to disk felamimail bg Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° Ñъобщението на диÑка +script name felamimail bg име на Ñкрипт +script status felamimail bg ÑÑŠÑтоÑние на Ñкрипт +search felamimail bg ТърÑене +search for felamimail bg ТърÑи +select felamimail bg Избор +select all felamimail bg Избери вÑички +select emailprofile felamimail bg Избор на -Mail профил +select folder felamimail bg избери папка +select your mail server type admin bg Изберете тип на Mail Ñървъра +send felamimail bg Изпращане +send a reject message felamimail bg изпращане на Ñъобщение за отказ +sent felamimail bg Изпратени +sent folder felamimail bg Папка "Изпратени" +server supports mailfilter(sieve) felamimail bg Ñървърът поддържа филтър за поща - sieve +set as default felamimail bg По подразбиране +show header felamimail bg покажи заглавната чаÑÑ‚ +show new messages on main screen felamimail bg показване на новите ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° Ð½Ð°Ñ‡Ð°Ð»Ð½Ð¸Ñ ÐµÐºÑ€Ð°Ð½ +sieve script name felamimail bg име на sieve Ñкрипт +sieve settings admin bg ÐаÑтройки на Sieve +signatur felamimail bg ÐŸÐ¾Ð´Ð¿Ð¸Ñ +signature felamimail bg ÐŸÐ¾Ð´Ð¿Ð¸Ñ +simply click the target-folder felamimail bg Кликнете на папката, в коÑто да Ñе копира/премеÑти +size felamimail bg Размер +size of editor window felamimail bg Размер на прозореца на редактора +size(...->0) felamimail bg Размер (...->0) +size(0->...) felamimail bg Размер (0->...) +skipping forward felamimail bg преÑкачане напред +skipping previous felamimail bg преÑкачане назад +small view felamimail bg умален изглед +smtp settings admin bg SMTP наÑтройки +start new messages with mime type plain/text or html? felamimail bg Започва нови ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÐ°Ñ‚Ð¾ чиÑÑ‚ текÑÑ‚ или HTML? +subject felamimail bg Тема +subject(a->z) felamimail bg Тема (A->Z) +subject(z->a) felamimail bg Тема (Z->A) +submit felamimail bg Предаване +subscribe felamimail bg Включи абонамент +subscribed felamimail bg Включен абонамент +subscribed successfully! felamimail bg Ðбонаментът е уÑпешен! +sun felamimail bg Ðед +system signature felamimail bg генериран от ÑиÑтемата +table of contents felamimail bg Съдържание +template folder felamimail bg Папка "Шаблони" +templates felamimail bg Шаблони +text only felamimail bg Само текÑÑ‚ +text/plain felamimail bg текÑÑ‚ +the connection to the imap server failed!! felamimail bg ÐеуÑпешна връзка Ñ IMAP Ñървъра!! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail bg IMAP Ñървъра вероÑтно не поддържа Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´ на оторизациÑ. МолÑ, Ñвържете Ñе Ñ Ð’Ð°ÑˆÐ¸Ñ ÑиÑтемен ÐдминиÑтратор! +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail bg ПодателÑÑ‚ на Ñъобщението е заÑвил обратна разпиÑка. Желаете ли да му Ñ Ð¸Ð·Ð¿Ñ€Ð°Ñ‚Ð¸Ñ‚Ðµ? +then felamimail bg ТОГÐÐ’Ð +this folder is empty felamimail bg Папката е празна +this php has no imap support compiled in!! felamimail bg PHP нÑма включена поддръжка за IMAP!!! +thu felamimail bg Чет +to felamimail bg До +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail bg За да използвате TLS е необходима верÑÐ¸Ñ Ð½Ð° PHP 5.1.0 или по-виÑока. +translation preferences felamimail bg ÐаÑтройки за превод +translation server felamimail bg Сървър за превод +trash felamimail bg Кошче +trash fold felamimail bg Папка "Кошче" +trash folder felamimail bg Папка "Кошче" +tue felamimail bg Ð’Ñ‚ +type felamimail bg тип +unexpected response from server to authenticate command. felamimail bg Ðеочакван отговор от Ñървъра на команда AUTHENTICATE. +unexpected response from server to digest-md5 response. felamimail bg Ðеочакван отговор от Ñървъра на Digest-MD5. +unexpected response from server to login command. felamimail bg Ðеочакван отговор от Ñървъра на команда LOGIN. +unflagged felamimail bg немаркирано +unknown err felamimail bg ÐеуÑтановена грешка +unknown error felamimail bg ÐеуÑтановена грешка +unknown imap response from the server. server responded: %s felamimail bg ÐеизвеÑтен отговор от IMAP Ñървъра: %s +unknown sender felamimail bg ÐеизвеÑтен Подател +unknown user or password incorrect. felamimail bg ÐеÑъщеÑтвуващ потребител или грешна парола. +unread common bg Ðепрочетено +unseen felamimail bg Ðеотворено +unselect all felamimail bg Размаркира вÑички +unsubscribe felamimail bg ПрекъÑва абонамент +unsubscribed felamimail bg ПрекъÑнат абонамент +unsubscribed successfully! felamimail bg Ðбонаментът е прекъÑнат уÑпешно! +up felamimail bg нагоре +updating message status felamimail bg обновÑва ÑÑŠÑтоÑнието на Ñъобщението +updating view felamimail bg обновÑва изгледа +use emailadmin to create profiles felamimail bg използвайте EmailAdmin за Ñъздаване на профили +use a signature felamimail bg Включване на Ð¿Ð¾Ð´Ð¿Ð¸Ñ +use a signature? felamimail bg Включване на подпиÑ? +use addresses felamimail bg Включване на адреÑи +use custom identities felamimail bg ÑамоличноÑÑ‚ по избор +use custom settings felamimail bg ÐаÑтройки по избор +use regular expressions felamimail bg използвай регулÑрни изрази +use smtp auth admin bg използвай SMTP Ð¾Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ +users can define their own emailaccounts admin bg Потребителите могат да дефинират ÑобÑтвени E-Mail акаунти +vacation notice common bg ваканционна бележка +vacation notice is active felamimail bg Ðктивирана е ваканционна бележка +vacation start-date must be before the end-date! felamimail bg Ðачалото на ваканциÑта Ñ‚Ñ€Ñбва да е ПРЕДИ краÑ! +validate certificate felamimail bg валидиране на Ñертификат +view full header felamimail bg Покажи подробни заглавни чаÑти +view header lines felamimail bg Заглавна чаÑÑ‚ (Header) +view message felamimail bg Покажи Ñъобщението +viewing full header felamimail bg Заглавни чаÑти (Header) +viewing message felamimail bg Показване на Ñъобщение +viewing messages felamimail bg Показани ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +wed felamimail bg Ð¡Ñ€Ñ +when deleting messages felamimail bg При изтриване на ÑÑŠÐ¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +which folders - in general - should not be automatically created, if not existing felamimail bg кои папки ÐЕ Ñледва Ñа Ñе Ñъздават автоматично, ако не ÑъщеÑтвуват. +with message felamimail bg ÑÑŠÑ Ñъобщение +with message "%1" felamimail bg ÑÑŠÑ Ñъобщение "%1" +writing felamimail bg пиÑане +wrote felamimail bg напиÑа +you can use %1 for the above start-date and %2 for the end-date. felamimail bg Може да поÑочите %1 за началната дата и %2 за крайната. +you have received a new message on the felamimail bg Получено е ново Ñъобщение на +your message to %1 was displayed. felamimail bg Вашето Ñъобщение до %1 е отворено. diff --git a/felamimail/lang/egw_ca.lang b/felamimail/lang/egw_ca.lang new file mode 100644 index 0000000000..a2374f6420 --- /dev/null +++ b/felamimail/lang/egw_ca.lang @@ -0,0 +1,345 @@ +(no subject) felamimail ca (Sense assumpte) +(only cc/bcc) felamimail ca (només Cc/Cco) +(unknown sender) felamimail ca (remitent desconegut) +activate felamimail ca Activar +activate script felamimail ca activar script +add address felamimail ca Afegir adreça +add rule felamimail ca Afegir regla +add script felamimail ca Afegir script +add to %1 felamimail ca Afegir a %1 +add to address book felamimail ca Afegir a la llibreta d'adreces +add to addressbook felamimail ca Afegir a la llibreta d'adreces +additional info felamimail ca Informació addicional +address book felamimail ca Llibreta d'adreces +address book search felamimail ca Cercar a la llibreta d'adreces +after message body felamimail ca Després del cos del missatge +all address books felamimail ca Totes les llibretes d'adreces +all folders felamimail ca Totes les carpetes +all of felamimail ca tots +allways a new window felamimail ca sempre en una finestra nova +always show html emails felamimail ca Mostra sempre els correus HTML +any of felamimail ca algun +anyone felamimail ca qualsevol +as a subfolder of felamimail ca com una subcarpeta de +attachments felamimail ca Adjunts +auto refresh folder list felamimail ca Autorefrescar la llista de carpetes +back to folder felamimail ca Tornar a la carpeta +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail ca Basat en els criteris donats, els missatges que arribin poden tenir distints colors de fons a la llista de missatges. Això ajuda a distinguir fàcilment de qui són els missatges, especialment per a llistes de correu. +bcc felamimail ca Cco +before headers felamimail ca Abans de les capçaleres +between headers and message body felamimail ca Entre les capçaleres i el cos del missatge +body part felamimail ca Part del cos +can't connect to inbox!! felamimail ca no es pot connectar a la Safata d'Entrada!! +cc felamimail ca Cc +change folder felamimail ca Canviar carpeta +check message against next rule also felamimail ca aplica la següent regla a aquest missatge +checkbox felamimail ca Quadre de verificació +click here to log back in. felamimail ca Pitjeu aquí per tornar a iniciar sessió +click here to return to %1 felamimail ca Pitjeu aquí per tornar a %1 +close all felamimail ca tanca-ho tot +close this page felamimail ca tancar aquesta pàgina +close window felamimail ca Tancar finestra +color felamimail ca Color +compose felamimail ca Redactar +compress folder felamimail ca Comprimir carpeta +configuration felamimail ca Configuració +contains felamimail ca conté +create felamimail ca Crear +create folder felamimail ca Crear carpeta +create sent felamimail ca Crear carpeta d'enviats +create subfolder felamimail ca Crear subcarpeta +create trash felamimail ca Crear Paperera +created folder successfully! felamimail ca La carpeta s'ha creat correctament +dark blue felamimail ca Blau fosc +dark cyan felamimail ca Cyan fosc +dark gray felamimail ca Gris fosc +dark green felamimail ca Verd fosc +dark magenta felamimail ca Magenta fosc +dark yellow felamimail ca Groc fosc +date(newest first) felamimail ca Data (la més recent primer) +date(oldest first) felamimail ca Data (la més antiga primer) +days felamimail ca dies +deactivate script felamimail ca desactivar seqüència +default sorting order felamimail ca Mode d'ordenació predeterminat +delete all felamimail ca Esborrar tots +delete folder felamimail ca Esborrar carpeta +delete script felamimail ca esborra seqüència +delete selected felamimail ca Esborrar la selecció +delete selected messages felamimail ca Esborrar missatges seleccionats +deleted felamimail ca esborrat +deleted folder successfully! felamimail ca Carpeta esborrada correctament +disable felamimail ca Deshabilitar +discard message felamimail ca elimina el missatge +display message in new window felamimail ca Mostrar el missatge a una finestra nova +display messages in multiple windows felamimail ca mostra missatges en múltiples pantalles +display of html emails felamimail ca Mostrar els missatges HTML +display only when no plain text is available felamimail ca Mostrar només quan no hi ha text simple disponible +display preferences felamimail ca Preferències de visualització +do it! felamimail ca Fes-ho! +do not use sent felamimail ca No utilitzar Enviats +do not use trash felamimail ca No utilitzar Paperera +do you really want to delete the '%1' folder? felamimail ca Realment voleu esborrar la carpeta '%1'? +does not contain felamimail ca No conté +does not match felamimail ca No coincideix amb +does not match regexp felamimail ca No coincideix amb l'expressió +don't use sent felamimail ca No utilitzar Enviats +don't use trash felamimail ca No utilitzar Paperera +down felamimail ca avall +download felamimail ca baixar +download this as a file felamimail ca Baixar això com un fitxer +e-mail felamimail ca Correu electrònic +e-mail address felamimail ca Adreça de correu electrònic +e-mail folders felamimail ca Carpetes de correu electrònic +edit email forwarding address felamimail ca edita l'adreça de reenviar correu +edit filter felamimail ca Editar filtre +edit rule felamimail ca Afegir regla +edit selected felamimail ca Editar selecció +edit vacation settings felamimail ca edita configuració de vacances +email address felamimail ca Adreça de correu electrònic +email forwarding address felamimail ca adreça de reenviar correu +email signature felamimail ca Signatura de correu +empty trash felamimail ca Buidar paperera +enable felamimail ca Habilitar +enter your default mail domain ( from: user@domain ) admin ca Introduïu el vostre domini de correu predeterminat (de usuari@domini) +enter your imap mail server hostname or ip address admin ca Introduïu el nom del servidor de correu IMAP o l'adreça IP +enter your sieve server hostname or ip address admin ca Introduïu el nom del servidor SIEVE o l'adreça IP +enter your sieve server port admin ca Introduïu el port del servidor SIEVE +enter your smtp server hostname or ip address admin ca Introduïu el nom del servidor SIEVE o l'adreça IP +enter your smtp server port admin ca Introduïu el port del servidor smtp +error felamimail ca ERROR +error connecting to imap serv felamimail ca Error en connectar al servidor IMAP +error opening felamimail ca Error en obrir +every felamimail ca cada +every %1 days felamimail ca cada %1 dies +expunge felamimail ca Suprimir +felamimail common ca FelaMiMail +file into felamimail ca Informació del fitxer +files felamimail ca Fitxers +filter active felamimail ca Filtre actiu +filter name felamimail ca Nom del filtre +filter rules common ca regles de filtratge +first name felamimail ca Nom de pila +flagged felamimail ca marcat +flags felamimail ca Marques +folder acl felamimail ca ACL de la carpeta +folder name felamimail ca Nom de la carpeta +folder path felamimail ca Ruta de la carpeta +folder preferences felamimail ca Preferències de la carpeta +folder settings felamimail ca Opcions de la carpeta +folder status felamimail ca Estat de la carpeta +folderlist felamimail ca Llista de carpetes +foldername felamimail ca Nom de la carpeta +folders felamimail ca Carpetes +folders created successfully! felamimail ca Les carpetes s'han creat correctament +follow felamimail ca seguir +for mail to be send - not functional yet felamimail ca Pel correu pendent d'enviar - encara no funciona +for received mail felamimail ca Pel correu rebut +forward felamimail ca Reenviar +forward to address felamimail ca reenvia a l'adreça +found felamimail ca Trobat +fri felamimail ca Dv +from felamimail ca De +from(a->z) felamimail ca De (A-> Z) +from(z->a) felamimail ca De (Z-> A) +full name felamimail ca Nom sencer +greater than felamimail ca major que +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail ca Donau un cop d'ull a www.felamimail.org per saber-ne més sobre Squirrelmail.
    +header lines felamimail ca Línies de Capçalera +hide header felamimail ca Ocultar capçalera +html felamimail ca HTML +icons and text felamimail ca Icones i text +icons only felamimail ca Només icones +identifying name felamimail ca Nom identificatiu +if felamimail ca SI +if from contains felamimail ca si el remitent conté +if mail header felamimail ca si la capçalera del correu +if message size felamimail ca si la mida del missatge +if subject contains felamimail ca si l'assumpte conté +if to contains felamimail ca si el destinatari conté +illegal folder name. please select a different name. felamimail ca Nom de carpeta il·legal. Si us plau, seleccioneu un nom distint +imap felamimail ca IMAP +imap server felamimail ca Servidor IMAP +imap server address felamimail ca Adreça del servidor IMAP +imap server type felamimail ca Tipus de servidor IMAP +imaps authentication felamimail ca Identificació IMAPS +imaps encryption only felamimail ca Xifrat IMAPS només +in felamimail ca a +index order felamimail ca Ordre de l'índex +info felamimail ca Informació +invalid user name or password felamimail ca L'usuari o la contrasenya no són vàlids +javascript felamimail ca JavaScript +keep a copy of the message in your inbox felamimail ca manté una còpia del missatge dins la safata d'entrada +keep local copy of email felamimail ca manté una còpia local del correu +kilobytes felamimail ca kilobytes +language felamimail ca Idioma +last name felamimail ca Cognoms +left felamimail ca Esquerra +less felamimail ca menys +less than felamimail ca menor que +light gray felamimail ca Gris clar +list all felamimail ca Llista-ho tot +location of buttons when composing felamimail ca Ubicació dels botons en redactar +mail server login type admin ca Tipus de sessió del servidor de correu +mail settings felamimail ca Configuració del correu +mainmessage felamimail ca missatge principal +manage emailfilter / vacation preferences ca Administra filtre d'Email / Vacances +manage folders common ca Administrar carpetes +manage sieve common ca Administrar scripts Sieve +mark as deleted felamimail ca Marcar com a esborrat +mark messages as felamimail ca Marcar missatges seleccionats com a +mark selected as flagged felamimail ca Marcar la selecció com a senyalat per a descarregar +mark selected as read felamimail ca Marcar la selecció com a llegit +mark selected as unflagged felamimail ca Marcar la selecció com a no senyalat per a descarregar +mark selected as unread felamimail ca Marcar la selecció com a no llegit +match felamimail ca Coincidència +matches felamimail ca coincideix +matches regexp felamimail ca coincideix amb l'expressió +message highlighting felamimail ca Resaltat del missatge +message list felamimail ca Llista de missatges +messages felamimail ca missatges +mon felamimail ca Dl +move felamimail ca moure +move messages felamimail ca moure missatges +move to felamimail ca moure els seleccionats a +move to trash felamimail ca Moure a la paperera +moving messages to felamimail ca movent missatges a +name felamimail ca Nom +never display html emails felamimail ca No mostrar mai els correus HTML +new common ca Nou +new filter felamimail ca Nou filtre +next felamimail ca Següent +next message felamimail ca Missatge següent +no filter felamimail ca Sense filtre +no folders found felamimail ca No s'han trobat carpetes +no folders were found to subscribe to! felamimail ca No s'han trobat carpetes on subscriure's +no folders were found to unsubscribe from! felamimail ca No s'han trobat carpetes de les que desubscriure's +no highlighting is defined felamimail ca No s'ha definit un resaltat +no messages found... felamimail ca no s'han trobat missatges... +no messages were selected. felamimail ca No s'han seleccionat missatges. +no previous message felamimail ca No hi ha missatge anterior +no valid emailprofile selected!! felamimail ca No s'ha seleccionat un perfil de correu vàlid!! +none felamimail ca cap +on behalf of felamimail ca en nom de +one address is not valid felamimail ca Una adreça no és vàlida +only inbox felamimail ca Només la Safata d'entrada +only one window felamimail ca només una finestra +only unseen felamimail ca Només els no vists +open all felamimail ca obre-ho tot +options felamimail ca Opcions +organisation felamimail ca Organització +organization felamimail ca Organització +organization name admin ca Nom de l'organització +participants felamimail ca Participants +personal information felamimail ca Informació personal +please select a address felamimail ca Si us plau, seleccioneu una adreça +please select the number of days to wait between responses felamimail ca Si us plau, seleccioneu el número de dies a esperar entre respostes +please supply the message to send with auto-responses felamimail ca Si us plau, indiqueu el missatge a enviar amb auto-respostes +posting felamimail ca enviar +previous felamimail ca Anterior +previous message felamimail ca Missatge anterior +print it felamimail ca Imprimir-lo +print this page felamimail ca Imprimir aquesta pàgina +quicksearch felamimail ca Cerca ràpida +read felamimail ca llegit +reading felamimail ca llegint +recent felamimail ca recent(s) +refresh time in minutes felamimail ca Temps de refresc en minuts +remove felamimail ca eliminar +remove immediately felamimail ca Eliminar inmediatament +rename felamimail ca Renomenar +rename a folder felamimail ca Renomenar una carpeta +rename folder felamimail ca Renomenar carpeta +renamed successfully! felamimail ca Renomenat correctament +replied felamimail ca respost +reply felamimail ca Respondre +reply all felamimail ca Respondre a tots +reply to felamimail ca Respondre A +replyto felamimail ca Respondre A +respond felamimail ca Respondre +respond to mail sent to felamimail ca Respondre al correu enviat a +return felamimail ca Tornar +return to options page felamimail ca Tornar a la pàgina d'opcions +right felamimail ca Dreta +rule felamimail ca Regla +sat felamimail ca Ds +save felamimail ca Desar +save changes felamimail ca desar canvis +script name felamimail ca nom de la seqüència +script status felamimail ca estat de la seqüència +search felamimail ca Cercar +search for felamimail ca Cercar +select felamimail ca Seleccionar +select all felamimail ca Seleccionar tot +select emailprofile felamimail ca Seleccionar perfil de correu +select folder felamimail ca Selecciona la carpeta +select your mail server type admin ca Seleccionar el tipus de servidor de correu +send felamimail ca Enviar +send a reject message felamimail ca envia un missatge de rebuig +sent folder felamimail ca Carpeta d'enviats +show header felamimail ca mostrar capçalera +show new messages on main screen felamimail ca Mostrar missatges nous a la pantalla principal +sieve settings admin ca Configuració de Sieve +signature felamimail ca Signatura +simply click the target-folder felamimail ca Senzillament, cliqueu sobre la carpeta destinació +size felamimail ca Mida +size of editor window felamimail ca Mida de la finestra de l'editor +size(...->0) felamimail ca Mida (...->0) +size(0->...) felamimail ca Mida (0->...) +small view felamimail ca Vista reduïda +smtp settings admin ca Opcions SMTP +subject felamimail ca Assumpte +subject(a->z) felamimail ca Assumpte (A->Z) +subject(z->a) felamimail ca Assumpte (Z->A) +submit felamimail ca Enviar +subscribe felamimail ca Subscriure's +subscribed felamimail ca Subscrit +subscribed successfully! felamimail ca Subscripció correcta +sun felamimail ca Dg +table of contents felamimail ca Taula de continguts +text only felamimail ca Només text +the connection to the imap server failed!! felamimail ca Ha fallat la connexió amb el servidor IMAP! +then felamimail ca ALESHORES +this folder is empty felamimail ca AQUESTA CARPETA ESTÀ BUIDA +this php has no imap support compiled in!! felamimail ca Aquesta instal·lació de PHP no té suport IMAP! +thu felamimail ca Dj +to felamimail ca Per a +to mail sent to felamimail ca al correu enviat a +translation preferences felamimail ca Preferències de la traducció +translation server felamimail ca Servidor de traduccions +trash fold felamimail ca Carpeta Paperera +trash folder felamimail ca Carpeta Paperera +tue felamimail ca Dt +type felamimail ca tipus +unflagged felamimail ca Sense senyalar +unknown err felamimail ca Error desconegut +unknown error felamimail ca Error desconegut +unknown sender felamimail ca Remitent desconegut +unknown user or password incorrect. felamimail ca Usuari desconegut o contrasenya incorrecta +unread common ca No llegit +unseen felamimail ca No vist +unselect all felamimail ca Deseleccionar tot +unsubscribe felamimail ca Desubscriure +unsubscribed felamimail ca No subscrit +unsubscribed successfully! felamimail ca Desubscripció correcta +up felamimail ca a dalt +use emailadmin to create profiles felamimail ca utilitzeu EmailAdmin per a crear perfils de correu +use a signature felamimail ca Utilitzar una signatura +use a signature? felamimail ca Utilitzar una signatura? +use addresses felamimail ca Utilitzar adreces +use custom settings felamimail ca Utilitzar opcions personalitzades +use regular expressions felamimail ca utilitza expressions regulars +use smtp auth admin ca Utilitzar identificació SMTP +users can define their own emailaccounts admin ca Els usuaris poden definir els seus propis comptes de correu +vacation notice common ca notificació de vacances +view full header felamimail ca Veure la capçalera sencera +view message felamimail ca Veure missatge +viewing full header felamimail ca Veient la capçalera sencera +viewing message felamimail ca Veient missatge +viewing messages felamimail ca Veient missatges +wed felamimail ca Dc +when deleting messages felamimail ca En esborrar missatges +with message felamimail ca amb missatge +with message "%1" felamimail ca amb missatge "%1" +wrap incoming text at felamimail ca Ajustar el text entrant a +writing felamimail ca escrivint +wrote felamimail ca ha escrit diff --git a/felamimail/lang/egw_cs.lang b/felamimail/lang/egw_cs.lang new file mode 100644 index 0000000000..3880446b9f --- /dev/null +++ b/felamimail/lang/egw_cs.lang @@ -0,0 +1,509 @@ +%1 is not writable by you! felamimail cs Pro %1 nemáte oprávnÄ›ní k zápisu! +(no subject) felamimail cs (žádný pÅ™edmÄ›t) +(only cc/bcc) felamimail cs (jen Kopie/Skrytá kopie) +(separate multiple addresses by comma) felamimail cs (více adres oddÄ›lte Äárkou) +(unknown sender) felamimail cs (neznámý odesílatel) +3paneview: if you want to see a preview of a mail by single clicking onto the subject, set the height for the message-list and the preview area here (300 seems to be a good working value). the preview will be displayed at the end of the message list on demand (click). felamimail cs 3OkenníVzhled: Pokud chcete zobrazovat náhled zprávy kliknutím na její pÅ™edmÄ›t, nastavte výšku okna pro seznam zpráv a oblast náhledu (300 vypadá jako dobrá pracovní hodnota). Náhled se po kliknutí na pÅ™edmÄ›t zprávy zobrazí na konci seznamu zpráv. +aborted felamimail cs pÅ™eruÅ¡eno +activate felamimail cs Aktivovat +activate script felamimail cs aktivovat skript +activating by date requires a start- and end-date! felamimail cs Aktivace datumem vyžaduje nastavení poÄáteÄního A koncového data! +add acl felamimail cs pÅ™idat acl +add address felamimail cs PÅ™idat adresu +add rule felamimail cs PÅ™idat pravidlo +add script felamimail cs PÅ™idat skript +add to %1 felamimail cs PÅ™idat k %1 +add to address book felamimail cs PÅ™idat do adresáře +add to addressbook felamimail cs pÅ™idat do adresáře +adding file to message. please wait! felamimail cs PÅ™ipojuji soubor ke zprávÄ›. Prosím Äekejte! +additional info felamimail cs Další informace +address book felamimail cs Adresář +address book search felamimail cs Vyhledávání v adresáři +after message body felamimail cs Za tÄ›lem zprávy +all address books felamimail cs VÅ¡echny adresáře +all folders felamimail cs VÅ¡echny složky +all messages in folder felamimail cs vÅ¡echny zprávy ve složce +all of felamimail cs vÅ¡e z +allow images from external sources in html emails felamimail cs Povolit obrázky z externích zdrojů v HTML e-mailech +allways a new window felamimail cs Vždy nové okno +always show html emails felamimail cs Vždy zobrazovat HTML e-maily +and felamimail cs a +any of felamimail cs kterýkoli z +any status felamimail cs jakýkoli status +anyone felamimail cs kdokoli +as a subfolder of felamimail cs jako podsložka (Äeho) +attach felamimail cs PÅ™ipojit +attachments felamimail cs Přílohy +authentication required felamimail cs vyžadována autentikace +auto refresh folder list felamimail cs Automaticky obnovit seznam složek +back to folder felamimail cs ZpÄ›t do složky +bad login name or password. felamimail cs Chybné pÅ™ihlaÅ¡ovací jméno nebo heslo. +bad or malformed request. server responded: %s felamimail cs Chybný nebo Å¡patnÄ› fomulovaný požadavek. Server odpovÄ›dÄ›l: %s +bad request: %s felamimail cs Chybný požadavek: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail cs Příchozí zprávy mohou mít na základÄ› zadaných kritérií odliÅ¡né barvy na pozadí v seznamu zpráv. Snadno pak odlišíte zprávy od různých odesílatelů, což se hodí zejména v diskusních skupinách. +bcc felamimail cs Skrytá kopie +before headers felamimail cs PÅ™ed hlaviÄkami +between headers and message body felamimail cs Mezi hlaviÄkami a tÄ›lem zprávy +body part felamimail cs Äást tÄ›la +by date felamimail cs datumem +can not send message. no recipient defined! felamimail cs není možné odeslat zprávu, příjemce nebyl definován! +can't connect to inbox!! felamimail cs nelze se pÅ™ipojit k INBOXu!! +cc felamimail cs Kopie +change folder felamimail cs ZmÄ›nit složku +check message against next rule also felamimail cs zkontrolovat zprávu také proti následujícímu pravidlu +checkbox felamimail cs ZaÅ¡krtávací políÄko +choose from vfs felamimail cs vybrat z VFS +clear search felamimail cs Nové hledání +click here to log back in. felamimail cs KliknÄ›te sem pro opÄ›tovné pÅ™ihlášení. +click here to return to %1 felamimail cs KliknÄ›te se pro návrat na %1 +close all felamimail cs zavřít vÅ¡e +close this page felamimail cs zavřít tuto stránku +close window felamimail cs Zavřít okno +color felamimail cs Barva +compose felamimail cs Nová zpráva +compose as new felamimail cs VytvoÅ™it jako novou zprávu +compress folder felamimail cs Komprimovat složku +condition felamimail cs podmínka +configuration felamimail cs Konfigurace +configure a valid imap server in emailadmin for the profile you are using. felamimail cs Nakonfigurujte platný IMAP server v Administrátoru poÅ¡ty pro profil, který používáte. +connection dropped by imap server. felamimail cs PÅ™ipojení ukonÄeno IMAP serverem. +contact not found! felamimail cs Kontakt nebyl nalezen! +contains felamimail cs obsahuje +copy or move messages? felamimail cs Kopírovat nebo pÅ™esunout zprávy? +copying messages to felamimail cs kopíruji zprávy do +could not complete request. reason given: %s felamimail cs Nemohu dokonÄit požadavek. Důvod: %s +could not import message: felamimail cs Nemohu importovat zprávu: +could not open secure connection to the imap server. %s : %s. felamimail cs Nemohu otevřít zabezpeÄené pÅ™ipojení k IMAP serveru. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail cs CRAM-MD5 nebo DIGEST-MD5 vyžadují nainstalovaný balík Auth_SASL. +create felamimail cs VytvoÅ™it +create folder felamimail cs VytvoÅ™it složku +create sent felamimail cs VytvoÅ™it složku Odeslané +create subfolder felamimail cs VytvoÅ™it podsložku +create trash felamimail cs VytvoÅ™it složku KoÅ¡ +created folder successfully! felamimail cs Složka byla úspeÅ¡nÄ› vytvoÅ™ena! +dark blue felamimail cs TmavÄ› modrá +dark cyan felamimail cs TmavÄ› azurová +dark gray felamimail cs TmavÄ› Å¡edá +dark green felamimail cs TmavÄ› zelená +dark magenta felamimail cs TmavÄ› fialová +dark yellow felamimail cs TmavÄ› žlutá +date(newest first) felamimail cs Datum (od nejnovÄ›jšího) +date(oldest first) felamimail cs Datum (od nejstaršího) +days felamimail cs dny +deactivate script felamimail cs deaktivace skriptu +default felamimail cs výchozí +default signature felamimail cs výchozí podpis +default sorting order felamimail cs Výchozí třídÄ›ní +delete all felamimail cs smazat vÅ¡e +delete folder felamimail cs Smazat složku +delete script felamimail cs smazat skript +delete selected felamimail cs Smazat vybrané +delete selected messages felamimail cs smazat vybrané zprávy +deleted felamimail cs smazané +deleted folder successfully! felamimail cs Složka úspěšnÄ› smazána ! +deleting messages felamimail cs mažu zprávy +disable felamimail cs Zakázat +discard felamimail cs zahodit +discard message felamimail cs zahodit zprávu +display message in new window felamimail cs Zobrazit zprávu v novém oknÄ› +display messages in multiple windows felamimail cs Zobrazovat zprávy ve více oknech +display of html emails felamimail cs Zobrazování HTML zpráv +display only when no plain text is available felamimail cs Zobrazovat jen pokud není k dispozici prostý text +display preferences felamimail cs PÅ™edvolby zobrazení +displaying html messages is disabled felamimail cs zobrazování HTML zpráv je zakázáno +do it! felamimail cs ProveÄ ! +do not use sent felamimail cs Nepoužívat Odeslané +do not use trash felamimail cs Nepoužívat KoÅ¡ +do not validate certificate felamimail cs neověřovat certifikát +do you really want to delete the '%1' folder? felamimail cs Opravdu chcete smazat složku '%1' ? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail cs Opravdu chcete smazat vybraná nastavení úÄtu a pÅ™iÅ™azené identity? +do you really want to delete the selected signatures? felamimail cs Opravdu chcete smazat vybrané podpisy? +do you really want to move or copy the selected messages to folder: felamimail cs Opravdu chcete pÅ™esunout nebo kopírovat vybrané zprávy do složky: +do you really want to move the selected messages to folder: felamimail cs Opravdu chcete pÅ™esunout vybrané zprávy do složky: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail cs Chcete být požádáni o potvrzení pÅ™i pÅ™esouvání vybraných zpráv do jiné složky? +do you want to prevent the editing/setup for forwarding of mails via settings (, even if sieve is enabled)? felamimail cs Chcete zablokovat zmÄ›ny v pÅ™esmÄ›rování poÅ¡ty prostÅ™ednictvím nastavení (i když je povolen SIEVE)? +do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? felamimail cs Chcete zablokovat zmÄ›ny v pravidlech pro filtrování poÅ¡ty (i když je povolen SIEVE)? +do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if sieve is enabled)? felamimail cs Chcete zablokovat zmÄ›ny v zasílání upozornÄ›ní na příchod zprávy (i když je povolen SIEVE)? +do you want to prevent the editing/setup of the absent/vacation notice (, even if sieve is enabled)? felamimail cs Chcete zablokovat zmÄ›ny ve zprávách o nepřítomnosti (i když je povolen SIEVE)? +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail cs Chcete zablokovat správu poÅ¡tovních složek (vytváření, pÅ™idÄ›lování přístupových práv a pÅ™ihlášení k odebírání)? +does not contain felamimail cs neobsahuje +does not exist on imap server. felamimail cs neexistuje na IMAP serveru. +does not match felamimail cs neshoduje se s +does not match regexp felamimail cs neshoduje se s regulárním výrazem +don't use draft folder felamimail cs Nepoužívat složku Rozepsané +don't use sent felamimail cs Nepoužívat Odeslané +don't use template folder felamimail cs Nepoužívat složku Å¡ablon +don't use trash felamimail cs Nepoužívat KoÅ¡ +dont strip any tags felamimail cs neodstraňovat žádné Å¡títky +down felamimail cs dolů +download felamimail cs stáhnout +download this as a file felamimail cs Stáhnout jako soubor +draft folder felamimail cs Rozepsané +drafts felamimail cs Rozepsané +e-mail felamimail cs E-mail +e-mail address felamimail cs E-mailová adresa +e-mail folders felamimail cs E-mailové složky +edit email forwarding address felamimail cs editovat adresu pro pÅ™eposílání +edit filter felamimail cs Editovat filtr +edit rule felamimail cs editovat pravidlo +edit selected felamimail cs Editovat vybrané +edit vacation settings felamimail cs editovat nastavení odpovÄ›di v nepřítomnosti +editor type felamimail cs Typ editoru +email address felamimail cs E-mailová adresa +email forwarding address felamimail cs adresa pro pÅ™eposílání +email notification update failed felamimail cs aktualizace e-mailových upozornÄ›ní se nezdaÅ™ila +email signature felamimail cs Podpis zprávy +emailaddress felamimail cs e-mailová adresa +empty trash felamimail cs Vyprázdnit koÅ¡ +enable felamimail cs povolit +encrypted connection felamimail cs Å¡ifrované pÅ™ipojení +enter your default mail domain ( from: user@domain ) admin cs Zadejte Vaší výchozí poÅ¡tovní doménu (z: uživatel@doména) +enter your imap mail server hostname or ip address admin cs Zadejte doménové jméno nebo IP adresu VaÅ¡eho IMAP serveru +enter your sieve server hostname or ip address admin cs Zadejte doménové jméno nebo IP adresu VaÅ¡eho SIEVE serveru +enter your sieve server port admin cs Zadejte port VaÅ¡eho SIEVE serveru +enter your smtp server hostname or ip address admin cs Zadejte doménové jméno nebo IP adresu VaÅ¡eho SMTP serveru +enter your smtp server port admin cs Zadejte port VaÅ¡eho SMTP serveru +entry saved felamimail cs Záznam uložen +error felamimail cs CHYBA +error connecting to imap serv felamimail cs Chyba spojení na IMAP server +error connecting to imap server. %s : %s. felamimail cs Chyba spojení na IMAP server. %s : %s. +error connecting to imap server: [%s] %s. felamimail cs Chyba spojení na IMAP server: [%s] %s. +error creating rule while trying to use forward/redirect. felamimail cs BÄ›hem nastavení pÅ™esmÄ›rování doÅ¡lo k chybÄ› pÅ™i vytváření pravidla. +error opening felamimail cs Chyba pÅ™i otevírání +error saving %1! felamimail cs Chyba pÅ™i ukládání %1! +error: felamimail cs Chyba: +error: could not save message as draft felamimail cs Chyba: Zprávu nebylo možné uložit jako rozepsanou +error: could not save rule felamimail cs Chyba: Nelze uložit pravidlo +error: message could not be displayed. felamimail cs Chyba: Zprávu nelze zobrazit. +every felamimail cs každý +every %1 days felamimail cs každý %1 den +expunge felamimail cs Vymazat +extended felamimail cs rozšířený +felamimail common cs FelaMiMail +file into felamimail cs soubor do +filemanager felamimail cs Správce souborů +files felamimail cs soubory +filter active felamimail cs filter aktivní +filter name felamimail cs Název filtru +filter rules common cs Pravidla filtru +first name felamimail cs KÅ™estní jméno +flagged felamimail cs s příznakem +flags felamimail cs Příznaky +folder felamimail cs složka +folder acl felamimail cs acl složky +folder name felamimail cs Název složky +folder path felamimail cs Cesta ke složce +folder preferences felamimail cs PÅ™edvolby složky +folder settings felamimail cs Nastavení složky +folder status felamimail cs Stav složky +folderlist felamimail cs Seznam složek +foldername felamimail cs Název složky +folders felamimail cs Složky +folders created successfully! felamimail cs Složky byly úspěšnÄ› vytvoÅ™eny ! +follow felamimail cs následovat +for mail to be send - not functional yet felamimail cs Pro odesílanou zprávu - zatím nefunkÄní +for received mail felamimail cs Pro pÅ™ijatou poÅ¡tu +forward felamimail cs PÅ™eposlat +forward as attachment felamimail cs pÅ™eposlat jako přílohu +forward inline felamimail cs pÅ™eposlat vložené do dopisu +forward messages to felamimail cs PÅ™eposlat zprávu (komu) +forward to felamimail cs pÅ™eposlat (komu) +forward to address felamimail cs pÅ™eposlat na adresu +forwarding felamimail cs PÅ™eposílání +found felamimail cs Nalezeno +from felamimail cs Od +from(a->z) felamimail cs Od (A->Z) +from(z->a) felamimail cs Od (Z->A) +full name felamimail cs Celé jméno +greater than felamimail cs vÄ›tší než +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail cs Pokud se o Squirrelmail chcete dozvědět více, navštivte www.felamimail.org.
    +header lines felamimail cs Řádky hlaviÄky +hide header felamimail cs skrýt záhlaví +hostname / address felamimail cs doménové jméno / adresa +how to forward messages felamimail cs Jak pÅ™eposílat zprávy +html felamimail cs HTML +icons and text felamimail cs Ikony a text +icons only felamimail cs Jen ikony +identifying name felamimail cs IndentifikaÄní jméno +identity felamimail cs Identita +if felamimail cs POKUD +if from contains felamimail cs pokud odesílatel obsahuje +if mail header felamimail cs pokud hlaviÄka obsahuje +if message size felamimail cs pokud velikost zprávy +if shown, which folders should appear on main screen felamimail cs PÅ™i zobrazení, které složky by se mÄ›ly objevit na hlavní obrazovce +if subject contains felamimail cs pokud pÅ™edmÄ›t obsahuje +if to contains felamimail cs pokud adresát obsahuje +if using ssl or tls, you must have the php openssl extension loaded. felamimail cs Pro používání SSL nebo TLS musíte mít k aktivní openssl rozšíření PHP. +illegal folder name. please select a different name. felamimail cs Neplatné jméno složky. Vyberte prosím jiné. +imap felamimail cs IMAP +imap server felamimail cs IMAP Server +imap server address felamimail cs Adresa IMAP serveru +imap server closed the connection. felamimail cs IMAP server ukonÄil spojení. +imap server closed the connection. server responded: %s felamimail cs IMAP server ukonÄil spojení. OdpovÄ›dÄ›l: %s +imap server password felamimail cs heslo pro IMAP server +imap server type felamimail cs Typ IMAP serveru +imap server username felamimail cs uživatelské jméno pro IMAP server +imaps authentication felamimail cs IMAPS autentikace +imaps encryption only felamimail cs IMAPS jen Å¡ifrování +import felamimail cs importovat +import mail felamimail cs Importovat poÅ¡tu +import message felamimail cs importovat zprávu +in felamimail cs v +inbox felamimail cs INBOX +incoming mail server(imap) felamimail cs server příchozí poÅ¡ty (IMAP) +index order felamimail cs PoÅ™adí indexu +info felamimail cs Info +invalid user name or password felamimail cs Neplatné uživatelské jméno nebo heslo +javascript felamimail cs JavaScript +jumping to end felamimail cs pÅ™eskakuji na konec +jumping to start felamimail cs pÅ™eskakuji na zaÄátek +junk felamimail cs Spam +keep a copy of the message in your inbox felamimail cs zachovat kopii zprávy ve VaÅ¡em inboxu +keep local copy of email felamimail cs zachovat lokální kopii zprávy +kilobytes felamimail cs kilobytů +language felamimail cs Jazyk +last name felamimail cs Příjmení +left felamimail cs Levý +less felamimail cs menší +less than felamimail cs menší než +light gray felamimail cs SvÄ›tle Å¡edá +list all felamimail cs Zobrazit vÅ¡e +loading felamimail cs nahrávám +location of buttons when composing felamimail cs UmístÄ›ní tlaÄítek pÅ™i psaní +mail server login type admin cs Typ pÅ™ihlášení na poÅ¡tovní server +mail settings felamimail cs Nastavení poÅ¡ty +mainmessage felamimail cs hlavní zpráva +manage email accounts and identities common cs Spravovat e-mailové úÄty a indentity +manage emailaccounts common cs Spravovat e-mailové úÄty +manage emailfilter / vacation preferences cs Spravovat e-mailový filter / odpovÄ›Ä v nepřítomnosti +manage folders common cs Spravovat složky +manage sieve common cs Spravovat Sieve skripty +manage signatures felamimail cs Spravovat podpisy +mark as deleted felamimail cs OznaÄit jako smazané +mark messages as felamimail cs OznaÄit vybrané zprávy jako +mark selected as flagged felamimail cs OznaÄit vybrané jako zprávy s příznakem +mark selected as read felamimail cs OznaÄit vybrané jako pÅ™eÄtené +mark selected as unflagged felamimail cs OznaÄit vybrané jako zprávy bez příznaku +mark selected as unread felamimail cs OznaÄit vybrané jako nepÅ™eÄtené +match felamimail cs Shoda +matches felamimail cs shoduje se s +matches regexp felamimail cs shoduje se s regulárním výrazem +max uploadsize felamimail cs maximální velikost uploadu +message highlighting felamimail cs Zvýrazňování zpráv +message list felamimail cs Seznam zpráv +messages felamimail cs zprávy +move felamimail cs pÅ™esunout +move folder felamimail cs pÅ™esunout složku +move messages felamimail cs pÅ™esunout zprávy +move messages? felamimail cs PÅ™esunout zprávy? +move selected to felamimail cs pÅ™esunout vybrané (kam) +move to trash felamimail cs PÅ™esunout do koÅ¡e +moving messages to felamimail cs pÅ™esouvám zprávy do +name felamimail cs Jméno +never display html emails felamimail cs Nikdy nezobrazovat HTML e-maily +new common cs Nové +new filter felamimail cs Nový filtr +next felamimail cs Další +next message felamimail cs Další zpráva +no active imap server found!! felamimail cs Nenalezen aktivní IMAP server!! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail cs Nebyly zadány adresy Komu/Kopie/Skrytá kopie ani složka pro uložení zprávy. +no encryption felamimail cs bez Å¡ifrování +no filter felamimail cs Žádný filtr +no folders felamimail cs žádné složky +no folders found felamimail cs Nebyly nalezeny žádné složky +no folders were found to subscribe to! felamimail cs Nebyly nalezeny složky k pÅ™ihlášení! +no folders were found to unsubscribe from! felamimail cs Nebyly nalezeny složky k odhlášení! +no highlighting is defined felamimail cs Žádné zvýrazňování není definováno +no imap server host configured!! felamimail cs Není nakonfigurován IMAP server!! +no message returned. felamimail cs Žádná zpráva se nevrátila. +no messages found... felamimail cs nebyly nalezeny žádné zprávy... +no messages selected, or lost selection. changing to folder felamimail cs Nebyla vybrána žádná zpráva nebo byl výbÄ›r ztracen. PÅ™echázím do složky +no messages were selected. felamimail cs Nebyly vybrány žádné zprávy. +no plain text part found felamimail cs nebyla nalezena Äást ve formÄ› prostého textu +no previous message felamimail cs žádná pÅ™edchozí zpráva +no recipient address given! felamimail cs Nebyla zadána adresa příjemce! +no signature felamimail cs bez podpisu +no stationery felamimail cs bez Å¡ablony +no subject given! felamimail cs Nebyl zadán pÅ™edmÄ›t! +no supported imap authentication method could be found. felamimail cs Nebyla nalezena podporovaná metoda IMAP autentikace. +no valid data to create mailprofile!! felamimail cs Chybí platné údaje pro vytvoÅ™ení poÅ¡tovního profilu!! +no valid emailprofile selected!! felamimail cs Nebyl vybrán platný e-mailový profil!! +none felamimail cs Žádné +none, create all felamimail cs žádné, vytvoÅ™it vÅ¡echny +not allowed felamimail cs není povoleno +notify when new mails arrive on these folders felamimail cs Upozornit na příchod nových zpráv do tÄ›chto složek +on felamimail cs na +on behalf of felamimail cs jménem (koho) +one address is not valid felamimail cs Jedna adresa není platná +only inbox felamimail cs Jen INBOX +only one window felamimail cs Jen jedno okno +only unseen felamimail cs Jen nepÅ™eÄtené +open all felamimail cs otevřít vÅ¡e +options felamimail cs Volby +or felamimail cs nebo +or configure an valid imap server connection using the manage accounts/identities preference in the sidebox menu. felamimail cs nebo nakonfigurujte pÅ™ipojení k IMAP serveru pomocí volby Spravovat úÄty/Identity v postranním panelu. +organisation felamimail cs organizace +organization felamimail cs organizace +organization name admin cs Jméno organizace +original message felamimail cs původní zpráva +outgoing mail server(smtp) felamimail cs odchozí poÅ¡tovní server(SMTP) +participants felamimail cs ÚÄastníci +personal information felamimail cs Osobní údaje +please ask the administrator to correct the emailadmin imap server settings for you. felamimail cs Požádejte prosím administrátora o korektní nastavení IMAP serveru pro Váš úÄet. +please configure access to an existing individual imap account. felamimail cs Nakonfigurujte prosím přístup ke stávajícímu osobnímu IMAP úÄtu. +please select a address felamimail cs Prosím vyberte adresu +please select the number of days to wait between responses felamimail cs Vyberte prosím poÄet dní, jak dlouho Äekat mezi odpovÄ›dmi +please supply the message to send with auto-responses felamimail cs Zadejte prosím zprávu, která se má odesílat v rámci automatické odpovÄ›di +port felamimail cs port +posting felamimail cs odesílání +preview disabled for folder: felamimail cs Náhled zakázán pro složku: +previous felamimail cs PÅ™edchozí +previous message felamimail cs PÅ™edchozí zpráva +print it felamimail cs Tisknout +print this page felamimail cs tisknout aktuální stranu +printview felamimail cs tiskový náhled +quicksearch felamimail cs Rychlé hledání +read felamimail cs pÅ™eÄtené +reading felamimail cs Ätení +receive notification felamimail cs PÅ™ijímat potvrzení +recent felamimail cs nedávný +refresh time in minutes felamimail cs ÄŒas obnovování v minutách +reject with felamimail cs zamítnout s +remove felamimail cs odstranit +remove immediately felamimail cs Odstranit okamžitÄ› +rename felamimail cs PÅ™ejmenovat +rename a folder felamimail cs PÅ™ejmenovat složku +rename folder felamimail cs PÅ™ejmenovat složku +renamed successfully! felamimail cs ÚspěšnÄ› pÅ™ejmenováno! +replied felamimail cs odpovÄ›zené +reply felamimail cs OdpovÄ›dÄ›t +reply all felamimail cs OdpovÄ›dÄ›t vÅ¡em +reply to felamimail cs OdpovÄ›dÄ›t (komu) +replyto felamimail cs OdpovÄ›dÄ›t (komu) +respond felamimail cs OdpovÄ›Ä +respond to mail sent to felamimail cs OdpovÄ›Ä na e-mail zaslaný (komu) +return felamimail cs Návrat +return to options page felamimail cs Návrat na stránku voleb +right felamimail cs Pravý +row order style felamimail cs Způsob Å™azení řádků +rule felamimail cs Pravidlo +save felamimail cs Uložit +save all felamimail cs Uložit vÅ¡e +save as draft felamimail cs Uložit jako rozepsané +save as infolog felamimail cs Uložit jako infolog +save changes felamimail cs Uložit zmÄ›ny +save message to disk felamimail cs Uložit zprávu na disk +script name felamimail cs jméno skriptu +script status felamimail cs status skriptu +search felamimail cs Hledat +search for felamimail cs Hledat (co) +select felamimail cs Vybrat +select a message to switch on its preview (click on subject) felamimail cs KliknÄ›te na pÅ™edmÄ›t zprávy pro zobrazení jejího náhledu +select all felamimail cs Vybrat vÅ¡e +select emailprofile felamimail cs Vybrat e-mailový profil +select folder felamimail cs vybrat složku +select your mail server type admin cs Vybrat typ e-mailového serveru +send felamimail cs Odeslat +send a reject message felamimail cs odeslat zprávu se zamítnutím +sent felamimail cs Odeslané +sent folder felamimail cs Odeslané +server supports mailfilter(sieve) felamimail cs server podporuje poÅ¡tovní filter (sieve) +set as default felamimail cs Nastavit jako výchozí +show all folders (subscribed and unsubscribed) in main screen folder pane felamimail cs zobrazit vÅ¡echny složky (pÅ™ihlášené i nepÅ™ihlášené) na hlavní obrazovce v oknÄ› složek +show header felamimail cs Zobrazit hlaviÄku +show new messages on main screen felamimail cs Zobrazovat nové zprávy na hlavní obrazovce +sieve script name felamimail cs Jméno sieve skriptu +sieve settings admin cs Nastavení sieve +signatur felamimail cs Podpis +signature felamimail cs Podpis +simply click the target-folder felamimail cs JednoduÅ¡e kliknÄ›te na cílovou složku +size felamimail cs Velikost +size of editor window felamimail cs Velikost okna editoru +size(...->0) felamimail cs Velikost (...->0) +size(0->...) felamimail cs Velikost (0->...) +skipping forward felamimail cs vynechávám pÅ™eposlání +skipping previous felamimail cs vynechávám pÅ™edchozí +small view felamimail cs malé zobrazení +smtp settings admin cs Nastavení SMTP +start new messages with mime type plain/text or html? felamimail cs ZaÄínat psaní nových zpráv jako MIME typ plain/text nebo html? +stationery felamimail cs Å¡ablona +subject felamimail cs PÅ™edmÄ›t +subject(a->z) felamimail cs PÅ™edmÄ›t (A->Z) +subject(z->a) felamimail cs PÅ™edmÄ›t (Z->A) +submit felamimail cs PÅ™ijmout +subscribe felamimail cs PÅ™ihlásit +subscribed felamimail cs PÅ™ihlášeno +subscribed successfully! felamimail cs ÚspěšnÄ› pÅ™ihlášeno ! +system signature felamimail cs systémový podpis +table of contents felamimail cs Obsah +template folder felamimail cs Složka Å¡ablon +templates felamimail cs Å ablony +text only felamimail cs Pouze text +text/plain felamimail cs prostý text +the action will be applied to all messages of the current folder.ndo you want to proceed? felamimail cs Zvolená akce bude aplikována na vÅ¡echny zprávy v aktuální složce.\nChcete pokraÄovat? +the connection to the imap server failed!! felamimail cs PÅ™ipojení k IMAP serveru selhalo!! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail cs Zdá se, že IMAP server nepodporuje vybranou metodu autentikace. Zkontaktujte prosím VaÅ¡eho systémového administrátora. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail cs Odesílatel požaduje zaslání potvrzení o pÅ™eÄtení zprávy. PÅ™ejete si potvrzení odeslat? +the mimeparser can not parse this message. felamimail cs Mimeparser nemůže zpracovat tuto zprávu. +then felamimail cs POTOM +there is no imap server configured. felamimail cs Není nakonfigurován žádný IMAP server. +this folder is empty felamimail cs TATO SLOŽKA JE PRÃZDNà +this php has no imap support compiled in!! felamimail cs Toto PHP nemá zkompilovanou podporu IMAPu. +to felamimail cs Komu +to mail sent to felamimail cs na e-mail zaslaný (komu) +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail cs Pro použití TLS pÅ™ipojení je tÅ™eba provozovat systém na PHP 5.1.0 nebo vyšším. +translation preferences felamimail cs PÅ™edvolby pÅ™ekladu +translation server felamimail cs Server pro pÅ™eklad +trash felamimail cs KoÅ¡ +trash fold felamimail cs KoÅ¡ +trash folder felamimail cs KoÅ¡ +type felamimail cs typ +unexpected response from server to authenticate command. felamimail cs NeoÄekávaná odpovÄ›Ä serveru na příkaz AUTHENTICATE. +unexpected response from server to digest-md5 response. felamimail cs NeoÄekávaná odpovÄ›Ä serveru na Digest-MD5 zprávu. +unexpected response from server to login command. felamimail cs NeoÄekávaná odpovÄ›Ä serveru na příkaz LOGIN. +unflagged felamimail cs bez příznaku +unknown err felamimail cs Neznámá chyba +unknown error felamimail cs Neznámá chyba +unknown imap response from the server. server responded: %s felamimail cs Neznámá odpovÄ›Ä IMAP serveru. Server odpovÄ›dÄ›l: %s +unknown sender felamimail cs Neznámý odesílatel +unknown user or password incorrect. felamimail cs Neznámý uživatel nebo nesprávné heslo. +unread common cs nepÅ™eÄtené +unseen felamimail cs NepÅ™eÄtené +unselect all felamimail cs ZruÅ¡it výbÄ›r +unsubscribe felamimail cs Odhlásit +unsubscribed felamimail cs Odhlášený +unsubscribed successfully! felamimail cs ÚspěšnÄ› odhlášeno ! +up felamimail cs nahoru +updating message status felamimail cs aktualizuji stav zprávy +updating view felamimail cs aktualizuji zobrazení +use emailadmin to create profiles felamimail cs pro vytvoÅ™ení profilů použijte EmailAdmin +use a signature felamimail cs Použít podpis +use a signature? felamimail cs Použít podpis? +use addresses felamimail cs Použít adresy +use custom identities felamimail cs použít uživatelsky definované identity +use custom settings felamimail cs Použít uživatelsky definovaná nastavení +use regular expressions felamimail cs použít regulární výrazy +use smtp auth admin cs Použít SMTP autentikaci +users can define their own emailaccounts admin cs Uživatelé smí definovat vlastní poÅ¡tovní úÄty +vacation notice common cs OdpovÄ›Ä v nepřítomnosti +vacation notice is active felamimail cs OdpovÄ›Ä v nepřítomnosti je aktivní +vacation start-date must be before the end-date! felamimail cs PoÄáteÄní datum automatické odpovÄ›di musí PŘEDCHÃZET koncovému datu! +validate certificate felamimail cs ověřit certifikát +view full header felamimail cs Zobrazit celou hlaviÄku +view header lines felamimail cs Zobrazit řádky hlaviÄky +view message felamimail cs Zobrazit zprávu +viewing full header felamimail cs Zobrazuji celou hlaviÄku +viewing message felamimail cs Zobrazuji zprávu +viewing messages felamimail cs Zobrazuji zprávy +when deleting messages felamimail cs PÅ™i mazání zpráv +which folders (additional to the sent folder) should be displayed using the sent folder view schema felamimail cs Které složky (kromÄ› složky Odeslané) by mÄ›ly být zobrazeny za použití schématu pro zobrazení složky Odeslané +which folders - in general - should not be automatically created, if not existing felamimail cs Které složky by nemÄ›ly být automaticky vytvářeny pokud neexistují +with message felamimail cs se zprávou +with message "%1" felamimail cs se zprávou "%1" +wrap incoming text at felamimail cs Zarovnat příchozí text +writing felamimail cs psaní +wrote felamimail cs napsal +yes, offer copy option felamimail cs Ano, nabídnout volbu kopírování +you can use %1 for the above start-date and %2 for the end-date. felamimail cs Můžete použít %1 pro poÄáteÄní datum a %2 pro koncové datum. +you have received a new message on the felamimail cs PÅ™iÅ¡la Vám nová zpráva na +your message to %1 was displayed. felamimail cs VaÅ¡e zpráva pro %1 byla zobrazena. diff --git a/felamimail/lang/egw_da.lang b/felamimail/lang/egw_da.lang new file mode 100644 index 0000000000..2a21a883ed --- /dev/null +++ b/felamimail/lang/egw_da.lang @@ -0,0 +1,367 @@ +(no subject) felamimail da (ingen emne) +(only cc/bcc) felamimail da (kun CC/BCC) +(unknown sender) felamimail da (Ukendt afsender) +activate felamimail da Aktivere +activate script felamimail da aktivere script +add felamimail da tilføj +add address felamimail da Tilføj Adresse +add rule felamimail da Tilføj Regel +add script felamimail da Tilføj Script +add to %1 felamimail da Tilføj til %1 +add to address book felamimail da Tilføj til adressebog +add to addressbook felamimail da tilføj til adressebog +additional info felamimail da Yderligere information +address book felamimail da Adressebog +address book search felamimail da Søg i adressebog +after message body felamimail da Efter meddelsesemne +all address books felamimail da Alle adressebøger +all folders felamimail da Alle Mapper +always show html emails felamimail da Vis altid HTML e-mails +anyone felamimail da alle +as a subfolder of felamimail da sun under mappe af +attachments felamimail da vedhæftet filer +auto refresh folder list felamimail da Automatisk opdatering af mappe liste +back to folder felamimail da Tilbage til mappe +bad reque felamimail da Ugyldig efterspørgelse +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail da Baseret pÃ¥ et given information, indkommende beskeder kan have forskellige baggrundsfarver i meddelelses listen. Dette hjælper at se forskel pÃ¥ hvem beskeden er fra, især for postlister. +bcc felamimail da BCC +before headers felamimail da Før hoved information +between headers and message body felamimail da Mellem hoved information og brødtekst +body part felamimail da brødtekst +can't connect to inbox!! felamimail da kan ikke forbinde til Indbakke!!! +cc felamimail da CC +change folder felamimail da Skift mappe +checkbox felamimail da Afkrydsningsboks +click here to log back in. felamimail da Klik her for at logge ind igen. +click here to return to %1 felamimail da Klik her for at vende tilbage til %1 +close all felamimail da Luk alle +close this page felamimail da luk denne side +close window felamimail da luk vindue +color felamimail da Farve +compose felamimail da Ny meddelse +compress folder felamimail da Komprimere mappe +configuration felamimail da Konfiguration +contains felamimail da indeholder +create felamimail da Opret +create folder felamimail da Opret Mappe +create sent felamimail da Opret Sendt +create subfolder felamimail da Opret Undermappe +create trash felamimail da Opret Skraldespand +created folder successfully! felamimail da Mappe oprettet sucessfuldt +dark blue felamimail da Mørk BlÃ¥ +dark cyan felamimail da Mørk Cyan +dark gray felamimail da Mørk GrÃ¥ +dark green felamimail da Mørk Grøn +dark magenta felamimail da Mørk Magenta +dark yellow felamimail da Mørk Gul +date felamimail da Dato +date(newest first) felamimail da Dato (nyeste først) +date(oldest first) felamimail da Dato (ældste først) +deactivate script felamimail da deaktivere script +default sorting order felamimail da Standart soterings rækkefølge +delete felamimail da Slet +delete all felamimail da Slet alle +delete folder felamimail da Slet Mappe +delete selected felamimail da Slet udvalgte +delete selected messages felamimail da slet udvalgte beskeder +deleted felamimail da slettet +deleted folder successfully! felamimail da Mappe er slettet sucessfuldt +disable felamimail da Deaktivere +display message in new window felamimail da Vis besked i nyt vindue +display of html emails felamimail da Vis HTML i emails +display only when no plain text is available felamimail da Vis kun nÃ¥r ren tekst version er tilgængelig +display preferences felamimail da Vis preferencer +do it! felamimail da gør det! +do not use sent felamimail da Brug ikke sendt +do not use trash felamimail da Brug ikke skraldespand +do you really want to delete the '%1' folder? felamimail da Vil du virkelig slette '%1' mappen? +does not contain felamimail da indeholder ikke +does not match felamimail da passer ikke sammen +does not match regexp felamimail da passer ikke til regexp +don't use sent felamimail da Brug ikke Sendt +don't use trash felamimail da Brug ikke skraldespand +done felamimail da Udført +down felamimail da ned +download felamimail da hent +download this as a file felamimail da hent denne som fil +e-mail felamimail da E-mail +e-mail address felamimail da E-mail Adresse +e-mail folders felamimail da E-mail mappe +edit felamimail da Rediger +edit filter felamimail da Rediger filter +edit rule felamimail da rediger regel +edit selected felamimail da Redigere udvalgte +email address felamimail da E-mail Adresse +email signature felamimail da E-mail signatur +empty trash felamimail da tøm skraldespanden +enable felamimail da aktivere +enter your default mail domain ( from: user@domain ) admin da Indtast dit standart post domæne (Fra: bruger@domæne) +enter your imap mail server hostname or ip address admin da Indtast din IMAP post server hostnavn eller IP adresse +enter your sieve server hostname or ip address admin da Indtast din SIEVE post server hostnavn eller IP adresse +enter your sieve server port admin da Indtast din SIEVE server port +enter your smtp server hostname or ip address admin da Indtast din SMTP post server hostnavn eller IP adresse +enter your smtp server port admin da Indtast din SMTP server port +erro felamimail da FEJL +error felamimail da FEJL +error connecting to imap serv felamimail da Forbindelsen til IMAP serveren fejlede +error opening felamimail da Kunne ikke Ã¥bne +expunge felamimail da slette +felamimail common da FelaMiMail +file into felamimail da akivere til +files felamimail da filer +filter active felamimail da filter aktiv +filter name felamimail da filter navn +first name felamimail da Navn +flagged felamimail da Flag sat +flags felamimail da Flag +folder acl felamimail da mappe acl +folder name felamimail da Mappe navn +folder path felamimail da Mappe Sti +folder preferences felamimail da Mappe Preferencer +folder settings felamimail da Mappe indstillinger +folder status felamimail da Mappe status +folderlist felamimail da Mappe liste +foldername felamimail da Mappe navn +folders felamimail da Mapper +folders created successfully! felamimail da Mappe oprettet sucessfuldt +follow felamimail da følg +for mail to be send - not functional yet felamimail da Til post der skal sendes - virker ikke endnu +for received mail felamimail da Til modtaget post +forward felamimail da Vidersend +found felamimail da Fundet +from felamimail da Fra +from(a->z) felamimail da Fra (A->Z) +from(z->a) felamimail da Fra (Z->A) +full name felamimail da Fulde navn +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail da Tak et kik på www.felamimail.org for at lære mere om Squirrelmail.
    +help felamimail da Hjælp +hide header felamimail da gem hovedinformation +html felamimail da HTML +icons and text felamimail da Ikoner og tekst +icons only felamimail da Kun Ikoner +identifying name felamimail da Identificerbar navn +if felamimail da HVIS +illegal folder name. please select a different name. felamimail da Ugyldig mappe navn. Vælg venligst et andet navn. +imap felamimail da IMAP +imap server felamimail da IMAP Server +imap server address felamimail da IMAP Server Adresse +imap server type felamimail da IMAP Server type +imaps authentication felamimail da IMAP-S Autifikation +imaps encryption only felamimail da Kun IMAP-S Autorisation +in felamimail da i +in order for squirrelmail to provide the full set of options you need to create the special folders listed below. just click the check box and hit the create button. felamimail da For at SquirrelMail kan levere alle valgmuligheder skaldu oprette special mapperne her under. Vælg bare afkrydsningsboksene af og tryk opret knappen. +in the center felamimail da I midten +index order felamimail da Kartotek Rækkefølge +info felamimail da Information +invalid user name or password felamimail da Forkert brugernavn eller adgangskode +javascript felamimail da JavaScript +language felamimail da Sprog +last name felamimail da Efternavn +left felamimail da Venstre +less felamimail da mindre +let this folder contain subfolders felamimail da Lad denne mappen indeholde undermapper +light blue felamimail da Lys Blå +light cyan felamimail da Lys Cyan +light gray felamimail da Lys Grå +light green felamimail da Lys Grøn +light magenta felamimail da Lys Magenta +light yellow felamimail da Lys Gul +list all felamimail da Vis alle +location of buttons when composing felamimail da Placering af knapper ved Ny Meddelse +location of folder list felamimail da Placering af mappe listen +mail server login type admin da Post server login type +mail settings felamimail da Post indstillinger +mainmessage felamimail da hovedbesked +manage folders felamimail da Administrere mapper +manage sieve felamimail da Administrere Sieve scripts +mark as deleted felamimail da Marker som slettet +mark messages as felamimail da Marker valgte beskeder som +mark selected as flagged felamimail da Sæt flag ved udvalgte +mark selected as read felamimail da Marker valgte som læst +mark selected as unflagged felamimail da Fjern flag ved udvalgte +mark selected as unread felamimail da Marker valgte som ulæst +match felamimail da Resultat +matches felamimail da resultater +matches regexp felamimail da resultater regexp +medium gray felamimail da Mellem Grå +message highlighting felamimail da Besked makering +message list felamimail da Besked Liste +messages felamimail da beskeder +minute felamimail da Minut +minutes felamimail da Minutter +more felamimail da flere +move felamimail da flyt +move messages felamimail da flyt beskeder +move to felamimail da flyt valgte til +move to trash felamimail da Flyt til skraldespanden +must be unique felamimail da Skal unik +name felamimail da Navn +never display html emails felamimail da Vis aldrig HTML emails +new felamimail da Ny +new filter felamimail da Nyt filter +next felamimail da Næste +next message felamimail da Næste E-mail +nickname felamimail da Kælenavn +no filter felamimail da Ingen Filter +no folders found felamimail da Ingen mapper fundet +no folders were found to subscribe to! felamimail da Ingen mapper blev fundet til at abonnere på! +no folders were found to unsubscribe from! felamimail da Ingen mapper blev fundet til at opsige abonnement fra! +no highlighting is defined felamimail da Ingen makering er defineret +no messages were selected. felamimail da Ingen beskeder var udvalgt +no next message felamimail da Ikke flere beskeder +no notification felamimail da Ingen underrettelse +no personal address book is defined. contact administrator. felamimail da Ingen personlig asdressebog er digineret. Kontakt systemadministratoren +no persons matching your search was found felamimail da Ingen personer blev fundet +no previous message felamimail da Ingen tidligere beskeder +no valid emailprofile selected!! felamimail da Ingen gyldig E-mail profile er valgt. +none felamimail da ingen +number of messages to index felamimail da Antal beskeder at registere +on behalf of felamimail da på vegne af +only inbox felamimail da Kun Indbakke +only unseen felamimail da Kun ulæste +open all felamimail da åben alle +options felamimail da indstillinger +organisation felamimail da organisation +organization felamimail da organisation +organization name admin da Organisation navn +oth felamimail da Org. +participants felamimail da Deltager +personal information felamimail da Deltager Information +preference file %1 not found. exiting abnormally felamimail da Preferencer fil %1 findes ikke. Afslutter med fejl. +preference file, %1, does not exist. log out, and log back in to create a default preference file. felamimail da Preference file, %1, findes ikke. Log ud, og log ind igen for at oprette en standart preference fil. +previous felamimail da Tidligere +previous message felamimail da Tidligere E-mail +print it felamimail da print +print this page felamimail da print denne side +purge felamimail da tøm +quicksearch felamimail da Hurtig søg. +read felamimail da læst +read da felamimail da Læs da +reading felamimail da læser +reason giv felamimail da Giv Grund +recent felamimail da Helt Ny +refresh folder list felamimail da opdatere mappe liste +refresh page felamimail da Opdatere Siden +refresh time in minutes felamimail da Opdaterings interval i minutter +remove felamimail da fjern +remove immediately felamimail da Fjern nu +rename felamimail da Omdøb +rename a folder felamimail da Omdøb en mappe +rename folder felamimail da Omdøb mappe +renamed successfully! felamimail da Omdøbt succesfuld +replied felamimail da Besvaret +reply felamimail da Besvar +reply all felamimail da Besvar Alle +reply to felamimail da Besvar Til +replyto felamimail da Besvar Til +return felamimail da Tilbage +return to options page felamimail da Tilbage til indstillingerne +right felamimail da Højre +rule felamimail da Regel +running squirrelmail version %1 (c) 1999-2000. felamimail da Køre SquirrelMail version %1 (c) 1999-2000 +same window - not functional yet felamimail da Samme Vindue - virker ikke endnu +save felamimail da Gem +search felamimail da Søg +search for felamimail da Søg efter +seconds felamimail da Sekunder +select felamimail da Vælg +select all felamimail da Vælg Alle +select emailprofile felamimail da Vælg E-mail profil +select home email address felamimail da Vælg privat e-mail adresse +select work email address felamimail da Vælg arbejds e-mail adresse +select your mail server type admin da Vælg din post server type +send felamimail da Send +sent fold felamimail da Sendt Mappe +sent folder felamimail da Sendt Mappe +server respond felamimail da Server svar +show header felamimail da vis hoved information +show new messages on main screen felamimail da Vis nye meddelser på startsiden +sieve settings admin da Sieve indstillinger +signature felamimail da Signatur +simply click the target-folder felamimail da Bare klik destinations mappen +size felamimail da Størrelse +size of editor window felamimail da Størrelse af redigere vindue +size(...->0) felamimail da Størrelse (...->0) +size(0->...) felamimail da Størrelse (0->...) +small view felamimail da Lille overblik +smtp settings admin da SMTP indstillinger +some or all of the help documents are not present! felamimail da Noget eller alt hjælp dokumentation er ikke tilgængelig +source felamimail da Klide +special folder options felamimail da Speciel mappe indstillinger +squirrelmail felamimail da Squirrelmail +subject felamimail da Emne +subject(a->z) felamimail da Emne (A->Z) +subject(z->a) felamimail da Emne (Z->A) +submit felamimail da Godkend +subscribe felamimail da abonnere +subscribed felamimail da Abonneret +subscribed successfully! felamimail da Abonneret sucessfuld! +successfully saved display preferences! felamimail da Skærm indstillingerne er gemt! +successfully saved folder preferences! felamimail da Mappe indstillingerne er gemt! +successfully saved personal information! felamimail da Personlige informationer er gemt! +switch current folder to felamimail da gem nuværende mappe til +table of contents felamimail da Indhold +text only felamimail da Kun Tekst +the connection to the imap server failed!! felamimail da Forbindingen til IMAP serveren fejlede +the help has not been translated to %1. it will be displayed in english instead. felamimail da Hlælp er ikke oversat til %1. Den vil brive vist i Engelsk i stedet +the index order is the order that the columns are arranged in the message index. you can add, remove, and move columns around to customize them to fit your needs. felamimail da Inholdsordenen er måden som kolonnerne er arrangeret op i beskederne. Du kan tilføje, fjerne og flytte kolonnerne rundt så de passer til dit behov. +the order of the message index can be rearanged and changed to contain the headers in any order you want. felamimail da Ordenen som beskederne kan ændres til og ændringer til hoved informationen i hvilken rækkefølge du vil. +theme felamimail da Thema +then felamimail da SÅ +these settings change the way your folders are displayed and manipulated. felamimail da Disse indstillinger ændre på måden mapperne vises og manipuleres. +this contains personal information about yourself such as your name, your email address, etc. felamimail da Her er personlige informationer om dig, som f.eks. dit navn, e-mail addresse osv. +this folder is empty felamimail da Denne mappe er tom +this php has no imap support compiled in!! felamimail da Der er ikke understøttelse for IMAP i din PHP kode. +this port is based on squirrelmail, which is a standalone imap client.
    felamimail da Dette modul er baseret op Squirrelmail, som er en uafhængig IMAP client.
    +to felamimail da Til +to the left felamimail da til venstre +to the right felamimail da til højre +top felamimail da Toppen +translation location felamimail da Oversætnings placering +translation preferences felamimail da Oversætnings indstillinger +translation server felamimail da Oversætnings server +trash fold felamimail da Skrald map. +trash folder felamimail da Skraldespands mappen +type felamimail da type +unable to list addresses from %1 felamimail da ude af stand til at liste adresserne fra %1 +unflagged felamimail da Flag ikke sat +unknown err felamimail da Ukendt fejl +unknown error felamimail da Ukendt fejl +unknown sender felamimail da Ukendt afsender +unknown user or password incorrect. felamimail da Ukendt bruger eller adgangskoden er forkert +unread felamimail da ulæst +unseen felamimail da uset +unseen and total felamimail da Uset og total +unseen message notification felamimail da Uset besked orientering +unseen message notification type felamimail da Uset besked orientering og type +unselect all felamimail da Fravælg alle +unsubscribe felamimail da Fravælg +unsubscribed felamimail da Fravalgt +unsubscribed successfully! felamimail da Fravalgt sucessfuldt +up felamimail da op +update address felamimail da Opdatere adresse +use a signature felamimail da Brug en signatur +use a signature? felamimail da Brug en signatur? +use addresses felamimail da Brug Adresser +use custom settings felamimail da Brug egne indstillinger +use javascript or html addressbook? felamimail da Brug Javascript eller HTML adressebog? +use smtp auth admin da Brug SMTP auth +users can define their own emailaccounts admin da Brugere kan selv definere deres egne e-mail kontoer +view full header felamimail da Vis fuld hoved information +view message felamimail da Vi besked +viewing full header felamimail da Viser fuld hoved information +viewing message felamimail da Viser besked +viewing messages felamimail da Viser beskeder +welcome to %1's webmail system felamimail da Velkommen til %1's WebMail system +when deleting messages felamimail da Når meddelser slettes +white felamimail da Hvid +width of folder list felamimail da Bredde på mappe listen +wrap incoming text at felamimail da indpak inkommende tekst som +writing felamimail da skriver +wrote felamimail da skrev +you can change the way that squirrelmail looks and displays information to you, such as the colors, the language, and other settings. felamimail da Du kan ændre måden SquirrelMail ser ud og viser informationer til dig, som f.eks. farver, sprog og andre indstillinger +you can only edit one address at the time felamimail da Du kan kun ændre i en adresse af gangen +you must login first. felamimail da Du skal logge ind først. +you need a valid user and password to access this page! felamimail da Du skal bruge et gyldig brugernavn og adgangskode for at kunne se denne side! +your search failed with the following error(s) felamimail da Din søgning fejlede med følgende fejl (s) +1 felamimail da 1 diff --git a/felamimail/lang/egw_de.lang b/felamimail/lang/egw_de.lang new file mode 100644 index 0000000000..8aa7071846 --- /dev/null +++ b/felamimail/lang/egw_de.lang @@ -0,0 +1,538 @@ +%1 is not writable by you! felamimail de %1 is NICHT beschreibar von Ihnen! +(no subject) felamimail de (kein Betreff) +(only cc/bcc) felamimail de (kein Kopie/Blindkopie) +(separate multiple addresses by comma) felamimail de (mehrere Adressen durch Komma trennen) +(unknown sender) felamimail de (unbekannter Absender) +3paneview: if you want to see a preview of a mail by single clicking onto the subject, set the height for the message-list and the preview area here (300 seems to be a good working value). the preview will be displayed at the end of the message list on demand (click). felamimail de Vorschauansicht: Wenn Sie eine Vorschauansicht von eMails wünschen, müssen Sie hier die Höhe des Vorschaubereichs und der Nachrichtenliste festlegen. (300 hat sich als zufriedenstellender Wert erwiesen). Sie können ebenfalls die Mindesthöhe der eMail Liste festlegen, indem Sie die gewünschte Mindesthöhe, durch Komma getrennt, an den Wert für die Höhe des Vorschaubereiches anhängen (Bsp.: 300,190). Die Vorschau wird durch einen einfachen Klick auf den Betreff der anzuzeigenden Nachricht aktiviert. +aborted felamimail de abgebrochen +activate felamimail de aktivieren +activate script felamimail de Script aktivieren +activating by date requires a start- and end-date! felamimail de Aktivieren nach Datum benötigt ein Start- UND Endedatum! +add acl felamimail de ACL zufügen +add address felamimail de Addresse zufügen +add rule felamimail de Regel hinzufügen +add script felamimail de Script hinzufügen +add to %1 felamimail de Zu %1 zufügen +add to address book felamimail de Zum Adressbuch hinzufügen +add to addressbook felamimail de Zum Adressbuch hinzufügen +adding file to message. please wait! felamimail de Füge Datei zur Nachricht hinzu. Bitte warten! +additional info felamimail de Zusätzliche Info +address book felamimail de Adressbuch +address book search felamimail de Adressbuch durchsuchen +after message body felamimail de nach dem Editorfenster +all address books felamimail de Alle Adressbücher +all folders felamimail de Alle Ordner +all messages in folder felamimail de Alle Nachrichten im Ordner +all of felamimail de mit allen +allow images from external sources in html emails felamimail de Erlaube Bilder von externen Quellen in HTML emails +allways a new window felamimail de jede E-Mail in einem neuen Fenster +always show html emails felamimail de HTML-E-Mails immer anzeigen +and felamimail de und +any of felamimail de mit einem +any status felamimail de Alle Status +anyone felamimail de jeder +as a subfolder of felamimail de als Unterordner von +attach felamimail de Anhängen +attachments felamimail de Anlagen +authentication required felamimail de Anmeldung erforderlich +auto refresh folder list felamimail de Ordnerliste automatisch aktualisieren +back to folder felamimail de zurück zu Ordner +bad login name or password. felamimail de Falscher Benutzername oder Passwort. +bad or malformed request. server responded: %s felamimail de Falsche oder ungültige Anfrage. Server antwortet: %s +bad request: %s felamimail de Falsche Anfrage: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail de Eingehende Nachrichten können, basierend auf angegebenen Kriterien, unterschiedliche Hintergrundfarben in der Nachrichtenliste haben. Das kann helfen einfach zu unterscheiden woher die Nachricht kommt, speziell für Mailinglisten. +bcc felamimail de Blindkopie +before headers felamimail de vor den Kopfzeilen +between headers and message body felamimail de zwischen Kopfzeilen und Editorfenster +body part felamimail de Hauptteil +by date felamimail de nach Datum +can not send message. no recipient defined! felamimail de Kann Nachricht nicht senden. Kein Empfänger angegeben! +can't connect to inbox!! felamimail de kann nicht mit ihrer INBOX verbinden!!! +cc felamimail de Kopie +change folder felamimail de Ordner wechseln +check message against next rule also felamimail de Nachricht auch gegen nächste Regel prüfen +checkbox felamimail de Auswahlbox +choose from vfs felamimail de aus dem VFS auswählen +clear search felamimail de Suche zurücksetzen +click here to log back in. felamimail de Hier klicken um sich wieder einzulogen. +click here to return to %1 felamimail de Hier klicken um zu %1 zurückzukehren +close all felamimail de Schließe alle +close this page felamimail de Diese Seite schließen +close window felamimail de Fenster schließen +color felamimail de Farbe +compose felamimail de Verfassen +compose as new felamimail de Als neu bearbeiten +compress folder felamimail de Ordner komprimieren +condition felamimail de Bedingung +configuration felamimail de Konfiguration +configure a valid imap server in emailadmin for the profile you are using. felamimail de Konfigurieren Sie einen gültigen IMAP Server im emailadmin für das von Ihnen verwendete Profil +connection dropped by imap server. felamimail de Verbindung von IMAP Server beendet. +contact not found! felamimail de Kontakt nicht gefunden! +contains felamimail de enthält +copy or move messages? felamimail de Nachrichten kopieren oder Verschieben? +copy to felamimail de Kopieren in +copying messages to felamimail de kopiere Nachrichten in folgenden Ordner +could not append message: felamimail de Konnte die Nachricht nicht hinzufügen: +could not complete request. reason given: %s felamimail de Konnte Anfrage nicht beenden. Grund: %s +could not import message: felamimail de Konnte diese Nachricht nicht importieren: +could not open secure connection to the imap server. %s : %s. felamimail de Konnte sichere Verbindung zum IMAP Server nicht öffnen. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail de CRAM-MD5 oder DIGEST-MD5 benötigt das Auth_SASL Packet. +create felamimail de Erzeugen +create folder felamimail de Ordner anlegen +create sent felamimail de Gesendete Objekte (Sent) Ordner anlegen +create subfolder felamimail de Unterordner anlegen +create trash felamimail de Gelöschte Objekte (Trash) Ordner anlegen +created folder successfully! felamimail de Ordner erfolgreich angelegt +dark blue felamimail de Dunkelblau +dark cyan felamimail de Dunkelzyan +dark gray felamimail de Dunkelgrau +dark green felamimail de Dunkelgrün +dark magenta felamimail de Dunkelrot +dark yellow felamimail de Braun +date(newest first) felamimail de Datum (neue zuerst) +date(oldest first) felamimail de Datum (alte zuerst) +days felamimail de Tage +deactivate script felamimail de Script abschalten +default felamimail de Vorgabe +default signature felamimail de Standard Signatur +default sorting order felamimail de Standard-Sortierreihenfolge +delete all felamimail de alle löschen +delete folder felamimail de Ordner löschen +delete script felamimail de Skript löschen +delete selected felamimail de ausgewählte Nachrichten löschen +delete selected messages felamimail de ausgewählte Nachrichten löschen +delete this folder irreversible? felamimail de Ordner unwiderruflich löschen? +deleted felamimail de gelöscht +deleted folder successfully! felamimail de Ordner erfolgreich gelöscht +deleting messages felamimail de lösche Nachrichten +disable felamimail de Deaktivieren +disable ruler for separation of mailbody and signature when adding signature to composed message (this is not according to rfc).
    if you use templates, this option is only applied to the text part of the message. felamimail de Deaktiviere den automatisch hinzugefügten Trenner zwischen EMailkörper und Signatur (Achtung: Dies ist nicht RFC konform).
    Wenn Sie Templates zur Formatierung Ihrer EMail benutzen, wird diese Option nur dann Auswirkungen haben, wenn Sie die Signatur am Anfang der EMail einfügen lassen. +discard felamimail de verwerfen +discard message felamimail de Nachricht verwerfen +display message in new window felamimail de Nachricht in neuem Fenster anzeigen +display messages in multiple windows felamimail de Nachrichten in mehreren Fenstern anzeigen +display of html emails felamimail de HTML-E-Mails anzeigen +display only when no plain text is available felamimail de nur anzeigen wenn kein Plain Text vorhanden ist +display preferences felamimail de Anzeige Einstellungen +displaying html messages is disabled felamimail de Die Anzeige von HTML-E-Mails ist deaktiviert. +displaying plain messages is disabled felamimail de Die Anzeige von reinen Text E-Mails ist deaktiviert. +do it! felamimail de Mach es! +do not use sent felamimail de Gesendete Objekte (Sent) nicht verwenden +do not use trash felamimail de Gelöschte Objekte (Trash) nicht verwenden +do not validate certificate felamimail de Zertifikat nicht überprüfen +do you really want to attach the selected messages to the new mail? felamimail de Wollen Sie die ausgewählten Nachrichten wirklich an eine neue Mail anhängen? +do you really want to delete the '%1' folder? felamimail de Wollen Sie wirklich den '%1' Ordner löschen? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail de Wollen Sie die ausgewählten Konteneinstellungen und die damit verbundenen Identitäten wirklich löschen? +do you really want to delete the selected signatures? felamimail de Möchten Sie die ausgewählte Signatur wirklich löschen? +do you really want to move or copy the selected messages to folder: felamimail de Wollen sie die ausgewählten Nachrichten in folgenden Ordner verschieben oder kopieren: +do you really want to move the selected messages to folder: felamimail de Wollen sie die ausgewählten Nachrichten in folgenden Ordner verschieben: +do you want to be asked for confirmation before attaching selected messages to new mail? felamimail de Wollen Sie vor dem Anhängen von einer oder mehreren (ausgewählten) Mails an eine neue eMail gefragt werden? +do you want to be asked for confirmation before moving selected messages to another folder? felamimail de Wollen Sie vor dem Verschieben von Mails in andere Ordner gefragt werden? +do you want to prevent the editing/setup for forwarding of mails via settings (, even if sieve is enabled)? felamimail de Wollen Sie das Editieren/Einstellen einer Mailweiterleitung (via SIEVE) unterbinden. +do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? felamimail de Wollen Sie das Editieren/Einstellen von Filterregeln (via SIEVE) unterbinden. +do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if sieve is enabled)? felamimail de Wollen Sie das Editieren/Einstellen von Benachrichtigungen per eMail (via SIEVE), wenn neue Nachrichten eintreffen, unterbinden. +do you want to prevent the editing/setup of the absent/vacation notice (, even if sieve is enabled)? felamimail de Wollen Sie das Editieren/Einstellen einer Abwesenheitsnotiz (via SIEVE) unterbinden. +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail de Möchten Sie die Verwaltung von Ordnern verhindern (anlegen, abonnieren, Zugriffsrechte)? +does not contain felamimail de enthält nicht +does not exist on imap server. felamimail de existiert nicht auf dem IMAP Server +does not match felamimail de trifft nicht zu +does not match regexp felamimail de trift nicht zu regulärer Ausdruck +don't use draft folder felamimail de keine Entwurfs Ordner verwenden +don't use sent felamimail de Keinen gesendeten E-Mails speichern +don't use template folder felamimail de Keinen Vorlagen Ordner verwenden +don't use trash felamimail de Keinen Mülleimer verwenden +dont strip any tags felamimail de keine HTML Tags entfernen. +down felamimail de runter +download felamimail de Speichern +download this as a file felamimail de als Datei downloaden +draft folder felamimail de Entwurfs Ordner +drafts felamimail de Entwürfe +e-mail felamimail de E-Mail +e-mail address felamimail de E-Mailadresse +e-mail folders felamimail de E-Mail Ordner +edit email forwarding address felamimail de Bearbeiten der E-Mail-Weiterleitung +edit filter felamimail de Filter bearbeiten +edit rule felamimail de Regel bearbeiten +edit selected felamimail de Ausgewählte bearbeiten +edit vacation settings felamimail de Abwesenheitsnotiz bearbeiten +editor type felamimail de Editortyp +email address felamimail de E-Mail-Adresse +email forwarding address felamimail de Zieladresse +email notification update failed felamimail de Die Benachrichtigung über den Gelesen-Status der eMail ist fehlgeschlagen. +email signature felamimail de E-Mail-Signatur +emailaddress felamimail de E-Mail-Adresse +empty trash felamimail de Papierkorb leeren +enable felamimail de Aktivieren +encrypted connection felamimail de verschlüsselte Verbindung +enter your default mail domain ( from: user@domain ) admin de Geben sie eine Vorgabewert für die Maildomain ein (Von: benutzer@domain) +enter your imap mail server hostname or ip address admin de IMAP-Server Hostname oder IP-Adresse +enter your sieve server hostname or ip address admin de Sieve-Server Hostname oder IP-Adresse +enter your sieve server port admin de Port Adresse des Sieve Servers +enter your smtp server hostname or ip address admin de SMTP-Server Hostname oder IP-Adresse +enter your smtp server port admin de Port Adresse des SMTP Servers +entry saved felamimail de Eintrag gespeichert +error felamimail de FEHLER +error connecting to imap serv felamimail de Konnte den IMAP Server (Mailserver) nicht erreichen +error connecting to imap server. %s : %s. felamimail de Fehler beim Verbinden mit dem IMAP Server. %s : %s. +error connecting to imap server: [%s] %s. felamimail de Fehler beim Verbinden mit dem IMAP Server: [%s] %s. +error creating rule while trying to use forward/redirect. felamimail de Fehler bei der Erstellung einer Regel zur Weiterleitung. +error opening felamimail de Fehler beim Öffnen +error saving %1! felamimail de Fehler beim Speichern von %1! +error: felamimail de FEHLER: +error: could not save message as draft felamimail de FEHLER: Die Nachricht konnte nicht als Entwurf gespeichert werden. +error: could not save rule felamimail de FEHLER: Die Regel konnte nicht gespeichert werden. +error: could not send message. felamimail de FEHLER: Die Nachricht konnte nicht versendet werden. +error: message could not be displayed. felamimail de FEHLER: Die Nachricht kann nicht angezeigt werden. +event details follow felamimail de Termindetails folgend +every felamimail de alle +every %1 days felamimail de alle %1 Tage +expunge felamimail de Endgültig löschen +extended felamimail de Erweitert +felamimail common de eMail +file into felamimail de verschiebe nach +file rejected, no %2. is:%1 felamimail de Datei abgelehnt; die vorliegende Datei ist nicht vom Typ %2. Sie ist vom Typ %1 +filemanager felamimail de Dateimanager +files felamimail de Dateien +filter active felamimail de Filter aktiv +filter name felamimail de Filtername +filter rules common de Filter Regeln +first name felamimail de Vorname +flagged felamimail de wichtig +flags felamimail de Markierungen +folder felamimail de Ordner +folder acl felamimail de Ordner ACL +folder name felamimail de Ordner Name +folder path felamimail de Ordner Pfad +folder preferences felamimail de Ordnereinstellungen +folder settings felamimail de Ordner Einstellungen +folder status felamimail de Ordner Status +folderlist felamimail de Ordnerliste +foldername felamimail de Ordnername +folders felamimail de Ordner +folders created successfully! felamimail de Ordner erfolgreich angelegt +follow felamimail de folgen +for mail to be send - not functional yet felamimail de Für zu sendende Mail - funktioniert noch nicht +for received mail felamimail de Für empfangene Mail +forward felamimail de Weiterleiten +forward as attachment felamimail de weiterleiten als Anhang +forward inline felamimail de Inline weiterleiten +forward messages to felamimail de Nachricht weiterleiten an +forward to felamimail de weiterleiten an +forward to address felamimail de weiterleiten an Adresse +forwarding felamimail de Weiterleitung +found felamimail de Gefunden +from felamimail de Von +from(a->z) felamimail de Von (A->Z) +from(z->a) felamimail de Von (Z->A) +full name felamimail de Vollständiger Name +greater than felamimail de größer als +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail de Schauen Sie mal bei www.felamimail.org vorbei, um mehr über Squirrelmail zu lernen. +header lines felamimail de Kopfzeilen +hide header felamimail de Kopfzeilen verbergen +hostname / address felamimail de Servername / Adresse +how to forward messages felamimail de Wie wollen Sie Nachrichten weiterleiten? +html felamimail de HTML +icons and text felamimail de Icons und Text +icons only felamimail de nur Icons +identifying name felamimail de Identifizierender Name +identity felamimail de Identität +if felamimail de Wenn +if from contains felamimail de wenn Von enthält +if mail header felamimail de wenn E-Mail-Header enthält +if message size felamimail de wenn Nachrichtengröße +if shown, which folders should appear on main screen felamimail de Welche Ordner, sollen in Home angezeigt werden? +if subject contains felamimail de wenn Betreff enthält +if to contains felamimail de wenn An enthält +if using ssl or tls, you must have the php openssl extension loaded. felamimail de Wenn Sie SSL oder TLS benützen, muss die openssl PHP Erweiterung geladen sein. +illegal folder name. please select a different name. felamimail de Ilegaler Ordnername. Bitte wählen Sie einen anderen Namen +imap felamimail de IMAP +imap server felamimail de IMAP Server +imap server address felamimail de IMAP Server Adresse +imap server closed the connection. felamimail de IMAP Server hat die Verbindung beendet. +imap server closed the connection. server responded: %s felamimail de IMAP Server hat die Verbindung beendet. Server antworted: %s +imap server password felamimail de IMAP Server Password +imap server type felamimail de IMAP-Servertyp +imap server username felamimail de IMAP Server Benutzername +imaps authentication felamimail de IMAPS Authetifizierung +imaps encryption only felamimail de IMAPS nur Verschlüsselung +import felamimail de Importieren +import mail felamimail de Mail Importieren +import message felamimail de Nachricht importieren +import of message %1 failed. could not save message to folder %2 due to: %3 felamimail de Der Import der Nachricht %1 schlug fehl. Die Nachricht konnte nicht in dem Ordner %2 abgelegt werden. Grund: %3 +import of message %1 failed. destination folder %2 does not exist. felamimail de Der Import der Nachricht %1 schlug fehl. Zielordner %2 existiert nicht. +import of message %1 failed. destination folder not set. felamimail de Der Import der Nachricht %1 schlug fehl. Zielordner nicht gesetzt. +import of message %1 failed. no contacts to merge and send to specified. felamimail de Der Import der Nachricht %1 schlug fehl. Es wurde keine Kontaktinformation für das Versenden und Zusammenführen von Mail und Kontaktdaten angegeben. +importance felamimail de Wichtigkeit +in felamimail de In +inbox felamimail de Posteingang +incoming mail server(imap) felamimail de eingehender Mailserver (IMAP) +index order felamimail de Spaltenanordnung +info felamimail de Info +insert the signature at top of the new (or reply) message when opening compose dialog (you may not be able to switch signatures) felamimail de Einfügen der Signatur am Anfang einer neuen EMail (auch Antworten/Weiterleiten).
    Die Signatur ist dann Teil der EMail und kann möglicherweise nicht über die Funktionalität >Signatur ändern/auswählen< verändert werden. +invalid user name or password felamimail de Falscher Benutzername oder Pasword +javascript felamimail de JavaScript +jumping to end felamimail de springe zum Ende +jumping to start felamimail de springe zum Anfang +junk felamimail de Spammails +keep a copy of the message in your inbox felamimail de eine Kopie der Nachricht in der INBOX behalten +keep local copy of email felamimail de Kopie der E-Mail behalten +kilobytes felamimail de Kilobytes +language felamimail de Sprache +last name felamimail de Nachname +left felamimail de Links +less felamimail de kleiner +less than felamimail de kleiner als +light gray felamimail de Hellgrau +list all felamimail de Alle anzeigen +loading felamimail de lade +location of buttons when composing felamimail de Ort der Knöpfe beim E-Mail schreiben +mail server login type admin de Typ der Mailserver Anmeldung +mail settings felamimail de E-Mail-Einstellungen +mainmessage felamimail de Hauptnachricht +manage email accounts and identities common de Verwaltung von E-Mail-Konten/Identitäten +manage emailaccounts common de E-Mail-Konten verwalten +manage emailfilter / vacation preferences de Verwalten der E-Mail-Filter und Abwesenheitsnotiz +manage folders common de Ordner verwalten +manage sieve common de Sieve-Scripte verwalten +manage signatures felamimail de Signaturen verwalten +mark as felamimail de Markieren als +mark as deleted felamimail de als gelöscht markieren +mark messages as felamimail de ausgewählte Nachrichten markieren als +mark selected as flagged felamimail de ausgewählte Nachrichten markieren +mark selected as read felamimail de ausgewählte Nachrichten als gelesen markieren +mark selected as unflagged felamimail de ausgewählte Nachrichten nicht markieren +mark selected as unread felamimail de ausgewählte Nachrichten als ungelesen markieren +match felamimail de Ãœbereinstimmung +matches felamimail de stimmt überein (*, ? erlaubt) +matches regexp felamimail de stimmt überein mit regulärem Ausdruck +max uploadsize felamimail de maximal Dateigröße +message highlighting felamimail de Nachrichtenhervorhebung +message list felamimail de Nachrichtenliste +messages felamimail de Nachrichten +move felamimail de Verschieben +move folder felamimail de Ordner verschieben +move messages felamimail de Nachrichten verschieben +move messages? felamimail de Nachrichten verschieben? +move to felamimail de Verschieben in +move to trash felamimail de in den Papierkorb verschieben +moving messages to felamimail de verschiebe Nachrichten nach +name felamimail de Name +never display html emails felamimail de niemals anzeigen +new common de Neu +new filter felamimail de neuer Filter +next felamimail de nächste +next message felamimail de nächste Nachricht +no active imap server found!! felamimail de Kein aktiver IMAP Server gefunden!! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail de Keine Empfänger Adresse (To/CC/BCC ) angegeben und kein Ordner zur Ablage der Mail spezifiziert. +no encryption felamimail de keine Verschlüsselung +no filter felamimail de kein Filter +no folders felamimail de Keine Ordner +no folders found felamimail de Keine Ordner gefunden +no folders were found to subscribe to! felamimail de Keine Order gefunden, die bestellt werden können! +no folders were found to unsubscribe from! felamimail de Keine Order gefunden, die abbestellt werden können! +no highlighting is defined felamimail de keine Hervorhebung definiert +no imap server host configured!! felamimail de Kein IMAP Server (Host) konfiguriert! +no message returned. felamimail de Keine Nachrichten gefunden. +no messages found... felamimail de keine Nachrichten gefunden... +no messages selected, or lost selection. changing to folder felamimail de Es wurden keine Nachrichten ausgewählt, oder die Auswahl ging verloren. Wechsel zum Ordner +no messages were selected. felamimail de Es wurde keine NAchricht ausgewählt +no plain text part found felamimail de Kein Text Teil gefunden. +no previous message felamimail de Keine vorherige Nachricht vorhanden +no recipient address given! felamimail de Keine Empfängeradresse angegeben! +no signature felamimail de keine Signatur +no stationery felamimail de Kein Briefkopf +no subject given! felamimail de Kein Betreff angegeben! +no supported imap authentication method could be found. felamimail de Keine unterstützte IMAP Authentifizierungsmethode gefunden. +no text body supplied, check attachments for message text felamimail de Kein E-Mail Text vorhanden, bitte prüfen Sie die Anlagen zu dieser E-Mail, um den Text zu lesen +no valid data to create mailprofile!! felamimail de Keine gültigen Daten zur Erzeugung eines Mailprofils!! +no valid emailprofile selected!! felamimail de Sie haben kein gültiges E-Mail-Profil ausgewählt! +none felamimail de kein +none, create all felamimail de keine, erstellt alle +not allowed felamimail de nicht erlaubt +notify when new mails arrive on these folders felamimail de Benachrichtigung, wenn neue E-Mails in diesen Ordnern ankommen +on felamimail de am +on behalf of felamimail de im Auftrag von +one address is not valid felamimail de Eine Adresse ist ungültig +only inbox felamimail de Nur Posteingang +only one window felamimail de nur ein einziges Fenster +only unseen felamimail de Nur nicht gesehene +open all felamimail de Öffne alle +options felamimail de Optionen +or felamimail de oder +or configure an valid imap server connection using the manage accounts/identities preference in the sidebox menu. felamimail de oder konfigurieren Sie einen gültigen IMAP Server unter Verwendung von persönlichen Identitäten (Sidebox Menü). +organisation felamimail de Organisation +organization felamimail de Organisation +organization name admin de Name der Organisation +original message felamimail de ursprüngliche Nachricht +outgoing mail server(smtp) felamimail de ausgehender Mailserver (SMTP) +participants felamimail de Teilnehmer +personal information felamimail de persönliche Informationen +please ask the administrator to correct the emailadmin imap server settings for you. felamimail de Bitte fragen Sie Ihren Administrator um die IMAP Einstellungen für Sie zu korrigieren +please configure access to an existing individual imap account. felamimail de Bitte konfigurieren Sie hier den Zugang zu einem existierenden IMAP Account. +please select a address felamimail de Bitte wählen Sie eine Adresse +please select the number of days to wait between responses felamimail de Bitte wählen wie viele Tage zwischen den Antworten gewartet werden soll +please supply the message to send with auto-responses felamimail de Bitte geben Sie eine Nachricht eine die mit der automatischen Antwort gesendet werden soll +port felamimail de Port +posting felamimail de sende +preview disabled for folder: felamimail de Die Vorschau für eMails wird in dem ausgewählten Ordner nicht unterstützt: +previous felamimail de vorherige +previous message felamimail de vorherige Nachricht +print it felamimail de E-Mail drucken +print this page felamimail de Diese Seite drucken +printview felamimail de Druckansicht +processing of file %1 failed. failed to meet basic restrictions. felamimail de Das Verarbeiten der Datei %1 schlug fehl. Grundlegende Voraussetzungen wurden nicht erfüllt. +quicksearch felamimail de Schnellsuche +read felamimail de gelesen +reading felamimail de lese +receive notification felamimail de Empfangsbestätigung +recent felamimail de neu +refresh time in minutes felamimail de Aktualisierungsintervall in Minuten +reject with felamimail de zurückweisen mit +remove felamimail de entfernen +remove immediately felamimail de sofort löschen +rename felamimail de Umbenennen +rename a folder felamimail de Ordner umbenennen +rename folder felamimail de Ordner umbenennen +renamed successfully! felamimail de Erfolgreich umbenannt +replied felamimail de beantwortet +reply felamimail de Antworten +reply all felamimail de allen Antworten +reply to felamimail de Antwort an +replyto felamimail de Antwort an +required pear class mail/mimedecode.php not found. felamimail de Die benötigte PEAR Klasse Mail/mimeDecode.php konnte nicht gefunden werden. +respond felamimail de Antworte +respond to mail sent to felamimail de Antworte auf E-Mails die gesendet werden an +return felamimail de Zurück +return to options page felamimail de zurück zu Einstellungen +right felamimail de Rechts +row order style felamimail de Spaltenanordnung +rule felamimail de Regel +save felamimail de Speichern +save all felamimail de Alle speichern +save as draft felamimail de als Entwurf speichern +save as infolog felamimail de Als Infolog speichern +save as ticket felamimail de Als Ticket speichern +save changes felamimail de Änderungen speichern +save message to disk felamimail de Nachricht speichern +save of message %1 failed. could not save message to folder %2 due to: %3 felamimail de Das speichern der Nachricht %1 schlug fehl. Sie konnte nicht im Ordner %2 abgelegt werden. Grund: %3 +save: felamimail de Speichern: +script name felamimail de Skriptname +script status felamimail de Skriptstatus +search felamimail de Suchen +search for felamimail de Suchen nach +select felamimail de Auswählen +select a message to switch on its preview (click on subject) felamimail de Wählen Sie eine Nachricht durch einen Mausklick auf den Betreff aus, um den Vorschaumodus für diese zu aktivieren. +select all felamimail de alle auswählen +select emailprofile felamimail de E-Mail-Profil auswählen +select folder felamimail de Ordner auswählen +select your mail server type admin de Wählen Sie den Typ des Mailservers +send felamimail de Senden +send a reject message felamimail de Ablehnungs-E-Mail senden +sender felamimail de Absender +sent felamimail de Gesendet +sent folder felamimail de Ordner für gesendete Nachrichten +server supports mailfilter(sieve) felamimail de Server unterstützt Mailfilter(Sieve) +set as default felamimail de Als Vorgabe setzen +show all folders (subscribed and unsubscribed) in main screen folder pane felamimail de zeige alle Ordner (subscribed UND unsubscribed) in der Ordnerleiste des Hauptfensters +show header felamimail de Kopfzeilen anzeigen +show new messages on main screen felamimail de Neue Nachrichten auf der Startseite anzeigen? +sieve script name felamimail de Sieve Skript Name +sieve settings admin de Sieve Einstellungen +signatur felamimail de Signatur +signature felamimail de Signatur +simply click the target-folder felamimail de Ziel Ordner auswählen +size felamimail de Größe +size of editor window felamimail de Größe des Editorfensters +size(...->0) felamimail de Größe(...->0) +size(0->...) felamimail de Größe(0->...) +skipping forward felamimail de blättere vorwärts +skipping previous felamimail de blättere zurück +small view felamimail de schmale Ansicht +smtp settings admin de SMTP Einstellungen +start new messages with mime type plain/text or html? felamimail de Sollen neue E-Mails als plain/text oder HTML Nachrichten verfasst werden? +stationery felamimail de Briefkopf +subject felamimail de Betreff +subject(a->z) felamimail de Betreff(A->Z) +subject(z->a) felamimail de Betreff(Z->A) +submit felamimail de Absenden +subscribe felamimail de Bestellen +subscribed felamimail de abonniert +subscribed successfully! felamimail de Erfolgreich abonniert +switching of signatures failed felamimail de Umschalten der Signatur schlug fehl +system signature felamimail de System Signatur +table of contents felamimail de Inhaltsverzeichnis +template folder felamimail de Vorlagen Ordner +templates felamimail de Vorlagen +text only felamimail de Nur Text +text/plain felamimail de text/plain +the action will be applied to all messages of the current folder.\ndo you want to proceed? felamimail de Die Aktion wird auf ALLE Nachrichten des aktuellen Ordners angewendet.\nMöchten Sie fortfahren? +the action will be applied to all messages of the current folder.ndo you want to proceed? felamimail de Die Aktion wird auf ALLE Nachrichten des aktuellen Ordners angewendet.\nMöchten Sie fortfahren? +the connection to the imap server failed!! felamimail de Die Verbindung zum IMAP Server ist fehlgeschlagen +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail de Der IMAP Server scheint die ausgewählte Authentifizierungsmethode nicht zu unterstützen. Bitte sprechen Sie mit Ihrem Systemadministrator. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail de Der Absender der Nachricht hat eine Antwort angefordert, welche Ihm anzeigt das Sie seine Nachricht gelesen haben. Wollen Sie diese Antwort senden? +the mimeparser can not parse this message. felamimail de Der MIME Parser versteht diese Nachricht nicht. +then felamimail de dann +there is no imap server configured. felamimail de Es ist kein IMAP Server Konfiguriert +this folder is empty felamimail de DIESER ORDNER IST LEER +this php has no imap support compiled in!! felamimail de Dieses PHP hat keine IMAP Unterstützung!! +to felamimail de An +to mail sent to felamimail de Mail an senden an +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail de Für eine TLS Verbindung, benötigen Sie PHP 5.1.0 oder neuer. +translation preferences felamimail de Ãœbersetzungseinstellungen +translation server felamimail de Ãœbersetzungsserver +trash felamimail de Papierkorb +trash fold felamimail de Abfall Ordner +trash folder felamimail de Ordner für gelöschte Nachrichten +trying to recover from session data felamimail de Versuch der Wiederherstellung aus den gespeicherten Session-Daten. +type felamimail de Typ +undelete felamimail de wiederherstellen +unexpected response from server to authenticate command. felamimail de Unerwartete Antwort vom Server auf das AUTHENTICATE Kommando. +unexpected response from server to digest-md5 response. felamimail de Unerwartete Antwort vom Server auf die Digest-MD5 Antwort. +unexpected response from server to login command. felamimail de Unerwartete Antwort vom Server auf das LOGIN Kommando. +unflagged felamimail de unwichtig +unknown err felamimail de Unbekannter Fehler +unknown error felamimail de Unbekannter Fehler +unknown imap response from the server. server responded: %s felamimail de Unbekannte IMAP Antwort vom Server. Server antwortet: %s +unknown sender felamimail de Unbekannter Absender +unknown user or password incorrect. felamimail de Unbekannter Benutzer oder das Password ist falsch +unread common de ungelesen +unseen felamimail de Ungelesen +unselect all felamimail de keine auswählen +unsubscribe felamimail de Abbestellen +unsubscribed felamimail de abbestellt +unsubscribed successfully! felamimail de Erfolgreich abbestellt +up felamimail de hoch +updating message status felamimail de aktualisiere Nachrichtenstatus +updating view felamimail de aktualisiere Ansicht +use emailadmin to create profiles felamimail de benutzen Sie E-MailAdmin um Profile zu erstellen +use a signature felamimail de Signatur benutzen +use a signature? felamimail de Eine Signatur benutzen? +use addresses felamimail de Adresse benutzen +use custom identities felamimail de benutze benutzerdefinierte Identitäten +use custom settings felamimail de benutze angepaßte Einstellungen +use regular expressions felamimail de reguläre Ausdrücke verwenden +use smtp auth admin de SMTP Auth benutzen +users can define their own emailaccounts admin de Anwender können ihre eigenen Konten definieren +vacation notice common de Abwesenheitsnotiz +vacation notice is active felamimail de Abwesenheitsnotiz ist aktiv +vacation start-date must be before the end-date! felamimail de Startdatum der Urlaubsbenachrichtigung muss VOR dem Endedatum liegen! +validate certificate felamimail de Zertifikat überprüfen +view full header felamimail de alle Kopfzeilen anzeigen +view header lines felamimail de Kopfzeilen anzeigen +view message felamimail de zeige Nachricht +viewing full header felamimail de zeige alle Kopfzeilen +viewing message felamimail de zeige Nachricht +viewing messages felamimail de zeige Nachrichten +when deleting messages felamimail de wenn Nachrichten gelöscht werden +which folders (additional to the sent folder) should be displayed using the sent folder view schema felamimail de Welche Mailordner, zusätzlich zum Gesendet-Ordner, sollen im Anzeigenschema analog des Gesendet-Ordners dargestellt werden. +which folders - in general - should not be automatically created, if not existing felamimail de Welche Mailordner sollen generell NICHT automatisch angelegt werden, wenn Sie nicht existieren +with message felamimail de mit folgender Nachricht +with message "%1" felamimail de mit der Nachricht "%1" +wrap incoming text at felamimail de Text umbrechen nach +writing felamimail de schreiben +wrote felamimail de schrieb +yes, offer copy option felamimail de ja, mit Kopieroption +you can either choose to save as infolog or tracker, not both. felamimail de Sie können eine Mail entweder als Infolog ODER als Verfolgungsqueue Eintrag speichern, nicht als beides gleichzeitig. +you can use %1 for the above start-date and %2 for the end-date. felamimail de Sie können %1 für das obige Startdatum und %2 für das Endedatum verwenden. +you have received a new message on the felamimail de Sie haben eine neue Nachricht erhalten: +your message to %1 was displayed. felamimail de Ihre Nachricht an %1 wurde angezeigt. diff --git a/felamimail/lang/egw_el.lang b/felamimail/lang/egw_el.lang new file mode 100644 index 0000000000..1b7b422136 --- /dev/null +++ b/felamimail/lang/egw_el.lang @@ -0,0 +1,411 @@ +(no subject) felamimail el (κανένα θέμα) +(only cc/bcc) felamimail el (μόνο Cc/Bcc) +(unknown sender) felamimail el (άγνωστος αποστολέας) +activate felamimail el ΕνεÏγοποίηση +activate script felamimail el ενεÏγοποίηση κειμένου ομιλίας +add acl felamimail el Ï€Ïοσθήκη acl +add address felamimail el ΠÏοσθήκη διεÏθυνσης +add rule felamimail el ΠÏοσθήκη Κανόνα +add script felamimail el ΠÏοσθήκη Κειμένου ομιλίας +add to %1 felamimail el ΠÏοσθήκη στο %1 +add to address book felamimail el ΠÏοσθήκη στο βιβλίο διευθÏνσεων +add to addressbook felamimail el Ï€Ïοσθήκη στο βιβλίο διευθÏνσεων +adding file to message. please wait! felamimail el Το αÏχείο Ï€Ïοστίθεται στο μήνυμα.ΠαÏακαλώ πεÏιμένετε! +additional info felamimail el Επιπλέον πληÏοφοÏίες +address book felamimail el Βιβλίο ΔιευθÏνσεων +address book search felamimail el Αναζήτηση Βιβλίου ΔιευθÏνσεων +after message body felamimail el Μετά το κυÏίως σώμα του μηνÏματος +all address books felamimail el Όλα τα βιβλία διευθÏνσεων +all folders felamimail el Όλοι οι Φάκελοι +all of felamimail el όλα από +allow images from external sources in html emails felamimail el Îα επιτÏέπονται οι εικόνες από εξωτεÏικές πηγές στα HTML emails +allways a new window felamimail el πάντα νέο παÏάθυÏο +always show html emails felamimail el Îα εμφανίζονται πάντοτε τα HTML emails +and felamimail el και +any of felamimail el οποιοδήποτε +any status felamimail el οποιαδήποτε κατάσταση +anyone felamimail el οποιοσδήποτε +as a subfolder of felamimail el ως υποφάκελος του +attachments felamimail el Επισυνάψεις +authentication required felamimail el απαιτείται αυθεντικότητα +auto refresh folder list felamimail el Αυτόματη ανανέωση λίστας φακέλων +back to folder felamimail el Πίσω στο φάκελο +bad login name or password. felamimail el Λάθος όνομα ή κωδικός Ï€Ïόσβασης +bad request: %s felamimail el ΆκυÏη απαίτηση: % +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail el Βασισμένο πάνω στα δοθέντα κÏιτήÏια, τα εισεÏχόμενα μηνÏματα μποÏοÏν να έχουν διαφοÏετικό χÏώμα φόντου στη λίστα μηνυμάτων. Αυτό βοηθάει στην εÏκολη διάκÏιση του αποστολέα, ιδιαίτεÏα στις λίστες μηνυμάτων. +bcc felamimail el BCC +before headers felamimail el ΠÏιν τις κεφαλίδες +between headers and message body felamimail el Ανάμεσα στις κεφαλίδες και το κυÏίως σώμα του μηνÏματος +body part felamimail el κυÏίως σώμα +can't connect to inbox!! felamimail el δεν μποÏεί να συνδεθεί με τα ΕΙΣΕΡΧΟΜΕÎΑ +cc felamimail el CC +change folder felamimail el Αλλαγή φακέλου +checkbox felamimail el Checkbox +clear search felamimail el καθαÏισμός αναζήτησης +click here to log back in. felamimail el Κάντε κλικ εδώ για να εισέλθετε ξανά πίσω +click here to return to %1 felamimail el Κάντε κλικ εδώ για επιστÏοφή στο %1 +close all felamimail el κλείσιμο όλων +close this page felamimail el κλείσιμο αυτής της σελίδας +close window felamimail el Κλείσιμο παÏάθυÏου +color felamimail el ΧÏώμα +compose felamimail el Συνθέτω +compress folder felamimail el Φάκελος συμπίεσης +condition felamimail el κατάσταση +configuration felamimail el ΔιάÏθÏωση +connection dropped by imap server. felamimail el Έπεσε η σÏνδεση από τον IMAP server +contains felamimail el πεÏιέχει +could not complete request. reason given: %s felamimail el Δεν ολοκληÏώθηκε το αίτημα. Αιτία: %s +could not open secure connection to the imap server. %s : %s. felamimail el Δεν έγινε ασφαλής σÏνδεση με τον IMAP server. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail el CRAM-MD5 ή DIGEST-MD5 απαιτεί το Auth_SASL πακέτο να εγκατασταθεί. +create felamimail el ΔημιουÏγία +create folder felamimail el ΔημιουÏγία Φακέλου +create sent felamimail el ΔημιουÏγία Σταλθέντων +create subfolder felamimail el ΔημιουÏγία υποφακέλου +create trash felamimail el ΔημιουÏγία Κάδου ΑχÏήστων +created folder successfully! felamimail el ΔημιουÏγία φακέλου επιτυχής! +dark blue felamimail el ΣκοÏÏο μπλε +dark cyan felamimail el ΣκοÏÏο κυανό +dark gray felamimail el ΣκοÏÏο γκÏι +dark green felamimail el ΣκοÏÏο Ï€Ïάσινο +dark magenta felamimail el ΣκοÏÏο ματζέντα +dark yellow felamimail el ΣκοÏÏο κίτÏινο +date(newest first) felamimail el ΗμεÏομηνία (Ï€Ïώτα η πιο Ï€Ïόσφατη) +date(oldest first) felamimail el ΗμεÏομηνία (Ï€Ïώτα η πιο παλιά) +days felamimail el ημέÏες +deactivate script felamimail el απενεÏγοποίηση σεναÏίου +default signature felamimail el Ï€Ïοεπιλεγμένη υπογÏαφή +default sorting order felamimail el ΠÏοεπιλεγμένη σειÏά ταξινόμησης +delete all felamimail el διαγÏαφή όλων +delete folder felamimail el ΔιαγÏαφή Φακέλου +delete script felamimail el διαγÏαφή σεναÏίου +delete selected felamimail el ΔιαγÏαφή επιλεγμένων +delete selected messages felamimail el διαγÏαφή επιλεγμένων μηνυμάτων +deleted felamimail el διεγÏάφη +deleted folder successfully! felamimail el Φάκελος διεγÏάφη επιτυχώς +deleting messages felamimail el διαγÏαφή μηνυμάτων +disable felamimail el ΑπενεÏγοποίηση +discard felamimail el απόÏÏιψη +discard message felamimail el απόÏÏιψη μηνÏματων +display message in new window felamimail el ΠÏοβολή μηνÏματος σε νέο παÏάθυÏο +display messages in multiple windows felamimail el Ï€Ïοβολή μηνυμάτων σε πολλαπλά παÏάθυÏα +display of html emails felamimail el ΠÏοβολή των HTML emails +display only when no plain text is available felamimail el ΠÏοβολή μόνο όταν είναι δεν διαθέσιμο κανένα αποκÏυπτογÏαφημένο κείμενο +display preferences felamimail el ΠÏοβολή ΠÏοτιμήσεων +displaying html messages is disabled felamimail el η Ï€Ïοβολή των html μηνυμάτων είναι απενεÏγοποιημένη +do it! felamimail el Κάντο! +do not use sent felamimail el Μην χÏησιμοποιείτε τα Σταλθέντα +do not use trash felamimail el Μην χÏησιμοποιείτε τον Κάδο ΑχÏήστων +do not validate certificate felamimail el μην επικυÏώνετε το πιστοποιητικό +do you really want to delete the '%1' folder? felamimail el Θέλετε Ï€Ïαγματικά να διαγÏάψετε τον φάκελο '%1' ; +do you really want to delete the selected signatures? felamimail el Θέλετε Ï€Ïαγματικά να διαγάψετε τι=Ï‚ επιλεγμένες υπογÏαφές; +does not contain felamimail el δεν πεÏιέχει +does not match felamimail el δεν συμπίπτει +don't use draft folder felamimail el Μην χÏησιμοποιείτε των φάκελο Ï€Ïοσχεδίων +don't use sent felamimail el Μην χÏησιμοποιείτε τα Σταλθέντα +don't use trash felamimail el Μην χÏησιμοποιείτε των Κάδο ΑχÏήστων +down felamimail el κάτω +download felamimail el φόÏτωση +download this as a file felamimail el ΦόÏτωση Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… φακέλου +draft folder felamimail el Ï€Ïοσχέδιος φάκελος +e-mail felamimail el E-mail +e-mail address felamimail el ΔιεÏθυνση e-mail +e-mail folders felamimail el Φάκελοι e-mail +edit email forwarding address felamimail el επεξεÏγασία διευθυνσης Ï€Ïοωθημένου e-mail +edit filter felamimail el ΕπεξεÏγασία φίλτÏου +edit rule felamimail el επεξεÏγασία κανόνα +edit selected felamimail el ΕπεξεÏγασία επιλεγμένων +edit vacation settings felamimail el επεξεÏγασία Ïυθμίσεων διακοπών +email address felamimail el ΔιεÏθυνση e-mail +email forwarding address felamimail el διεÏθυνση Ï€Ïοωθημένου e-mail +email signature felamimail el ΥπογÏαφή e-mail +emailaddress felamimail el ΔιεÏθυνση e-mail +empty trash felamimail el Άδειασμα κάδου αχÏήστων +enable felamimail el ενεÏγοποίηση +encrypted connection felamimail el αποκÏυπτογÏαφημένη σÏνδεση +enter your imap mail server hostname or ip address admin el ΠληκτÏολογήστε το IMAP mail server όνομα χÏήστη ή την IP διεÏθυνση +enter your sieve server hostname or ip address admin el ΠληκτÏολογήστε το SIEVE server όνομα χÏήστη ή την IP διεÏθυνση +enter your sieve server port admin el ΠληκτÏολογήστε την SIEVE server θÏÏα +enter your smtp server hostname or ip address admin el ΠληκτÏολογήστε το SMTP server όνομα χÏήστη ή την IP διεÏθυνση +enter your smtp server port admin el ΠληκτÏολογήστε την SMTP server θÏÏα +error felamimail el ΣΦΑΛΜΑ +error connecting to imap serv felamimail el Σφάλμα κατά τη σÏνδεση με τον IMAP serv +error connecting to imap server. %s : %s. felamimail el Σφάλμα κατά τη σÏνδεση με τον IMAP server. %s : %s. +error connecting to imap server: [%s] %s. felamimail el Σφάλμα κατά τη σÏνδεση με τον IMAP server. [%s] : %s. +error opening felamimail el Σφάλμα στο άνοιγμα +every felamimail el κάθε +every %1 days felamimail el κάθε %1 ημέÏες +expunge felamimail el ΔιαγÏάφω +extended felamimail el επεκτάθηκε +felamimail common el FelaMiMail +file into felamimail el αÏχείο μέσα στο +files felamimail el αÏχεία +filter active felamimail el ενεÏγό φίλτÏο +filter name felamimail el Όνομα φίλτÏου +filter rules common el κανόνες φίλτÏου +first name felamimail el Όνομα +flagged felamimail el σημαιοστολισμένο +flags felamimail el Σημαίες +folder acl felamimail el Acl φακέλου +folder name felamimail el Όνομα φακέλου +folder path felamimail el ΔιαδÏομή φακέλου +folder preferences felamimail el ΠÏοτιμήσεις Φακέλου +folder settings felamimail el Ρυθμίσεις φακέλου +folder status felamimail el Κατάσταση φακέλου +folderlist felamimail el Λίστα φακέλου +foldername felamimail el Όνομα φακέλου +folders felamimail el Φάκελοι +folders created successfully! felamimail el Επιτυχής δημιουÏγία φακέλων! +follow felamimail el ακολουθώ +for mail to be send - not functional yet felamimail el Για αποστολή μηνÏματος - δεν λειτουÏγεί ακόμα +for received mail felamimail el Για εισεÏχόμενα μηνÏματα +forward felamimail el ΠÏοώθηση +forward to felamimail el Ï€Ïοώθηση σε +forward to address felamimail el Ï€Ïοώθηση στην διεÏθυνση +forwarding felamimail el ΠÏοωθείται +found felamimail el Î’Ïέθηκε +fri felamimail el Î Î±Ï +from felamimail el Από +from(a->z) felamimail el Από (Α->Ω) +from(z->a) felamimail el Από (Ω->Α) +full name felamimail el ΟλόκληÏο το όνομα +greater than felamimail el μεγαλÏτεÏο από +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail el Κοιτάξτε στο www.felamimail.org για να μάθετε πεÏισσότεÏα για το Squirrelmail.
    +header lines felamimail el ΓÏαμμές Τίτλου +hide header felamimail el απόκÏυψη τίτλου +hostname / address felamimail el όνομα χÏήστη / διεÏθυνση +html felamimail el HTML +icons and text felamimail el Εικόνες και κείμενο +icons only felamimail el Μόνο εικόνες +identifying name felamimail el ΑναγνώÏιση ονόματος +identity felamimail el Ταυτότητα +if felamimail el ΑΠ+if from contains felamimail el αν από τα πεÏιεχόμενα +if mail header felamimail el αν ο τίτλος του μηνÏματος +if message size felamimail el αν το μέγεθος του μηνÏματος +if subject contains felamimail el αν το θέμα πεÏιέχει +if to contains felamimail el αν το σε πεÏιέχει +if using ssl or tls, you must have the php openssl extension loaded. felamimail el Αν χÏησιμοποιείται SSL ή TLS, Ï€Ïέπει να έχετε την PHP openssl επέκταση φοÏτωμένη. +illegal folder name. please select a different name. felamimail el ΆκυÏο όνομα φακέλου. ΠαÏακαλώ επιλέξτε διαφοÏετικό όνομα. +imap felamimail el IMAP +imap server felamimail el IMAP Server +imap server address felamimail el ΔιεÏθυνση IMAP Server +imap server closed the connection. felamimail el Ο IMAP Server έκλεισε τη σÏνδεση +imap server closed the connection. server responded: %s felamimail el Ο IMAP Server έκλεισε τη σÏνδεση. Ο Server απάντησε: %s +imap server password felamimail el imap server κωδικός +imap server type felamimail el IMAP Server Ï„Ïπος +imap server username felamimail el imap server όνομα χÏήστη +imaps authentication felamimail el IMAPS ΑΥΘΕÎΤΙΚΟΤΗΤΑ +imaps encryption only felamimail el Μόνο IMAPS κÏυπτογÏάφηση +in felamimail el μέσα +inbox felamimail el ΕισεÏχόμενα +incoming mail server(imap) felamimail el server(IMAP) εισεÏχομένων μηνυμάτων +index order felamimail el Ταξινόμηση ευÏετηÏίου +info felamimail el ΠληÏοφοÏίες +invalid user name or password felamimail el ΆκυÏο όνομα χÏήστη ή κωδικός +javascript felamimail el JavaScript +jumping to end felamimail el μετάβαση στην αÏχή +jumping to start felamimail el μετάβαση στο τέλος +keep a copy of the message in your inbox felamimail el κÏατήστε ένα αντίγÏαφο του μηνÏματος στα εισεÏχόμενα +keep local copy of email felamimail el κÏατήστε ένα τοπικό αντίγÏαφο του email +kilobytes felamimail el kilobytes +language felamimail el Γλώσσα +last name felamimail el Επώνυμο +left felamimail el ΑÏιστεÏά +less felamimail el λιγότεÏο +less than felamimail el λιγότεÏο από +light gray felamimail el Ανοιχτό ΓκÏι +list all felamimail el ΔημιουÏγία λίστας με όλα +loading felamimail el φόÏτωση +location of buttons when composing felamimail el Τοποθεσία κουμπιών όταν γίνεται η σÏνθεση +mail server login type admin el ΤÏπος εισόδου μηνÏματος server +mail settings felamimail el Ρυθμίσεις μηνÏματος +mainmessage felamimail el κÏÏιο μήνυμα +manage emailaccounts preferences el ΔιαχείÏιση λογαÏισμών Email +manage emailfilter / vacation preferences el ΔιαχείÏιση φίλτÏου Email / Διακοπών +manage folders common el ΔιαχείÏιση Φακέλων +manage sieve common el ΔιαχείÏιση Sieve σεναÏίων +manage signatures felamimail el ΔιαχείÏιση υπογÏαφών +mark as deleted felamimail el Σημείωση ως διαγÏαμένο +mark messages as felamimail el Σημείωση επιλεγμένων μηνυμάτων ως +mark selected as flagged felamimail el Σημείωση επιλεγμένων ως σημαιοστολισμένα +mark selected as read felamimail el Σημείωση επιλεγμένων ως διαβασμένα +mark selected as unflagged felamimail el Σημείωση επιλεγμένων ως μη σημαιοστολισμένα +mark selected as unread felamimail el Σημείωση επιλεγμένων ως μη διαβασμένα +match felamimail el Συνδυασμός +matches felamimail el συνδυάζεται +matches regexp felamimail el συνδυάζεται regexp +max uploadsize felamimail el μέγιστο μέγεθος φοÏτώματος +message highlighting felamimail el ΥπογÏάμμιση ΜηνÏματος +message list felamimail el Κατάλογος μηνυμάτων +messages felamimail el μηνÏματα +mon felamimail el Δευ +move felamimail el μετακίνηση +move messages felamimail el μετακίνηση μηνυμάτων +move to felamimail el μετακίνηση επιλεγμένων στο +move to trash felamimail el Μετακίνηση στον Κάδο ΑχÏήστων +moving messages to felamimail el μετακίνηση επιλεγμένων στο +name felamimail el Όνομα +never display html emails felamimail el Îα μην Ï€Ïοβάλονται τα HTML emails +new common el Îέο +new filter felamimail el Îέο φίλτÏο +next felamimail el Επόμενο +next message felamimail el επόμενο μήνυμα +no active imap server found!! felamimail el Δεν βÏέθηκε ενεÏγός IMAP server!!! +no encryption felamimail el Καμία κÏυπτογÏάφηση +no filter felamimail el Κανένα φίλτÏο +no folders found felamimail el Δεν βÏέθηκε κανένας φάκελος +no folders were found to subscribe to! felamimail el Δεν βÏέθηκε κανένας φάκελος για εγγÏαφή σε αυτόν! +no folders were found to unsubscribe from! felamimail el Δεν βÏέθηκε κανένας φάκελος για παÏση συνδÏομής! +no highlighting is defined felamimail el Δεν έχει ÏŒÏιστει κάποια υπογÏάμμιση +no message returned. felamimail el Δεν επεστÏάφη κάποιο μήνυμα. +no messages found... felamimail el δεν βÏέθηκαν μηνÏματα... +no messages were selected. felamimail el Δεν επιλέχθηκαν κάποια μηνÏματα. +no plain text part found felamimail el δεν βÏέθηκε μέÏος αποκÏυπτογÏαφημένου κειμένου +no previous message felamimail el κανένα Ï€ÏοηγοÏμενο κείμενο +no supported imap authentication method could be found. felamimail el Δεν βÏέθηκε καμία υποστηÏιζόμενη IMAP επικυÏωμένη μέθοδος. +no valid emailprofile selected!! felamimail el Έχει επιλεχθεί άκυÏο Ï€Ïοφίλ Email! +none felamimail el κανένα +on behalf of felamimail el εκ μέÏους του +one address is not valid felamimail el Κάποια διεÏθυνση είναι άκυÏη +only inbox felamimail el Μόνο τα ΕΙΣΕΡΧΟΜΕÎΑ +only one window felamimail el μόνο ένα παÏάθυÏο +only unseen felamimail el μόνο αυτά που δεν έχουν Ï€Ïοβληθεί +open all felamimail el άνοιγμα όλων +options felamimail el Επιλογές +or felamimail el ή +organisation felamimail el οÏγανισμός +organization felamimail el οÏγανισμός +organization name admin el Όνομα οÏÎ³Î±Î½Î¹ÏƒÎ¼Î¿Ï +participants felamimail el Συμμετέχοντες +personal information felamimail el ΠÏοσωπικές πληÏοφοÏίες +please select a address felamimail el ΠαÏακαλώ επιλέξτε μία διεÏθυνση +please select the number of days to wait between responses felamimail el παÏακαλώ επιλέξτε τον αÏιθμό των ημεÏών για αναμονή Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ απαντήσεων +please supply the message to send with auto-responses felamimail el ΠαÏακαλώ Ï„Ïοφοδοτήστε το μήνυμα Ï€Ïος αποστολή με αυτόματες απαντήσεις +port felamimail el θÏÏα +posting felamimail el ταχυδÏόμηση +previous felamimail el ΠÏοηγοÏμενο +previous message felamimail el Ï€ÏοηγοÏμενο μήνυμα +print it felamimail el εκτÏπωση +print this page felamimail el εκτÏπωση σελίδας +quicksearch felamimail el ΓÏήγοÏη αναζήτηση +read felamimail el ανάγνωση +reading felamimail el ανάγνωση +receive notification felamimail el ΠαÏελήφθη ειδοποίηση +recent felamimail el Ï€Ïόσφατα +refresh time in minutes felamimail el Ανανέωση ÏŽÏας σε λεπτά +reject with felamimail el απόÏÏιψη με +remove felamimail el μετακίνηση +remove immediately felamimail el Άμεση μετακίνηση +rename felamimail el Μετονομασία +rename a folder felamimail el Μετονομασία ενός Φακέλου +rename folder felamimail el Μετονομασία φακέλου +renamed successfully! felamimail el Επιτυχής μετονομασία! +replied felamimail el απαντήθηκε +reply felamimail el Απάντηση +reply all felamimail el Απάντηση σε όλα +reply to felamimail el Απάντηση στο +replyto felamimail el Απάντησηστο +respond felamimail el ΑπόκÏιση +return felamimail el ΕπιστÏοφή +return to options page felamimail el ΕπιστÏοφή στη σελίδα επιλογών +right felamimail el Δεξιά +row order style felamimail el Στυλ ταξινόμησης σειÏάς +rule felamimail el Κανόνας +sat felamimail el Σάβ +save felamimail el Αποθήκευση +save as draft felamimail el Αποθήκευση ως Ï€Ïοσχέδιο +save as infolog felamimail el Αποθήκευση ως infolog +save changes felamimail el αποθήκευση αλλαγών +save message to disk felamimail el αποθήκευση αλλαγών στο δίσκο +script name felamimail el όνομα σεναÏίου +script status felamimail el κατάσταση σεναÏίου +search felamimail el Αναζήτηση +search for felamimail el Αναζήτηση για +select felamimail el Επιλογή +select all felamimail el Επιλογή όλων +select emailprofile felamimail el Επιλογή Ï€Ïοφίλ Email +select folder felamimail el επιλογή φακέλου +select your mail server type admin el Επιλέξτε τον Ï„Ïπο mail server +send felamimail el Αποστολή +send a reject message felamimail el αποστολή μηνÏματος απόÏÏιψης +sent folder felamimail el Φάκελος σταλθέντων +show header felamimail el ΠÏοβολή τίτλου +show new messages on main screen felamimail el ΠÏοβολή νέων μηνυμάτων στην κÏÏια οθόνη +sieve script name felamimail el όνομα sieve σεναÏίου +sieve settings admin el Ρυθμίσεις Sieve +signature felamimail el ΥπογÏαφή +simply click the target-folder felamimail el Απλά κάντε κλικ στον στόχο-φάκελο +size felamimail el Μέγεθος +size of editor window felamimail el Μέγεθος παÏαθÏÏου συντάκτη +size(...->0) felamimail el Μέγεθος (...->0) +size(0->...) felamimail el Μέγεθος (0->...) +skipping forward felamimail el παÏάληψη Ï€Ïοώθησης +skipping previous felamimail el παÏάληψη Ï€Ïοηγουμένων +small view felamimail el μικÏή Ï€Ïοβολή +smtp settings admin el Ρυθμίσεις SMTP +subject felamimail el Θέμα +subject(a->z) felamimail el Θέμα (Α->Ω) +subject(z->a) felamimail el Θέμα (Ω->Α) +submit felamimail el Υποβολή +subscribe felamimail el ΕγγÏαφή +subscribed felamimail el Έχει εγγÏαφεί +subscribed successfully! felamimail el Η εγγÏαφή ήταν επιτυχής +sun felamimail el ÎšÏ…Ï +table of contents felamimail el Πίνακας πεÏιεχομένων +text only felamimail el Μόνο κείμενο +the connection to the imap server failed!! felamimail el Αποτυχία σÏνδεση με τον IMAP Server +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail el Ο IMAP server δεν υποστηÏίζει την επιλεγμένη μέθοδο αυθεντικότητας.ΠαÏακαλώ επικοινωνήστε με τον διαχειÏιστή σας. +then felamimail el ΜΕΤΑ +this folder is empty felamimail el ΑΥΤΟΣ Ο ΦΑΚΕΛΟΣ ΕΙÎΑΙ ΑΔΕΙΟΣ +this php has no imap support compiled in!! felamimail el Αυτό το PHP δεν έχει καθόλου IMAP υποστήÏιξη μεταφÏασμένη!! +thu felamimail el Πέμ +to felamimail el Στο +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail el Για τη χÏησιμοποίηση TLS σÏνδεσης, Ï€Ïέπει να έχετε PHP 5.1.0 ή υψηλότεÏη έκδοση. +translation preferences felamimail el ΠÏοτιμήσεις ΜετάφÏασης +translation server felamimail el Server μετάφÏασης +trash fold felamimail el Φάκ Κάδου ΑχÏήστων +trash folder felamimail el Φάκελος Κάδου ΑχÏήστων +tue felamimail el ΤÏί +type felamimail el Ï„Ïπος +unexpected response from server to authenticate command. felamimail el ΑπÏόσμενη απάντηση από τον server στην ΕΞΑΚΡΙΒΩΣΗ ΓÎΗΣΙΟΤΗΤΑΣ εντολής. +unexpected response from server to digest-md5 response. felamimail el ΑπÏόσμενη απάντηση από τον server στην Digest-MD5 απάντηση. +unexpected response from server to login command. felamimail el ΑπÏόσμενη απάντηση από τον server στην εντολή ΕΙΣΟΔΟΥ +unflagged felamimail el αποσημαιοστολίστηκε +unknown err felamimail el Άγνωστο λάθ +unknown error felamimail el Άγνωστο λάθος +unknown imap response from the server. server responded: %s felamimail el Άγνωστη IMAP απάντηση από τον server.Απάντηση Server:%s +unknown sender felamimail el Άγνωστος αποστολέας +unknown user or password incorrect. felamimail el Άγνωστος χÏήστης ή λάθος κωδικός. +unread common el Αδιάβαστα +unseen felamimail el Αθέατα +unselect all felamimail el Αποεπιλογή όλων +unsubscribe felamimail el ΠαÏση συνδÏομής +unsubscribed felamimail el Η συνδÏομή σταμάτησε +unsubscribed successfully! felamimail el Η συνδÏομή σταμάτησε επιτυχώς! +up felamimail el πάνω +updating message status felamimail el ενημέÏωση κατάστασης μηνÏματος +updating view felamimail el ενημέÏωση εμφάνισης +use emailadmin to create profiles felamimail el χÏησιμοποιήστε EmailAdmin για τη δημιουÏγία Ï€Ïοφίλ +use a signature felamimail el ΧÏήση υπογÏαφής +use a signature? felamimail el ΧÏήση υπογÏαφής; +use addresses felamimail el ΧÏήση διευθÏνσεων +use custom settings felamimail el ΧÏήση σÏνηθων Ρυθμίσεων +use regular expressions felamimail el χÏήση κανονικών εκφÏάσεων +use smtp auth admin el ΧÏήση SMTP αυθ +users can define their own emailaccounts admin el Οι χÏήστες μποÏοÏν να οÏίσουν τους δικοÏÏ‚ τους email λογαÏιασμοÏÏ‚ +vacation notice common el ειδοποίηση διακοπών +vacation notice is active felamimail el Η ειδοποίηση διακοπών είναι ενεÏγή +validate certificate felamimail el επικÏÏωση Ï€Î¹ÏƒÏ„Î¿Ï€Î¿Î¹Î·Ï„Î¹ÎºÎ¿Ï +view full header felamimail el ΠÏοβολή πλήÏους τίτλου +view header lines felamimail el ΠÏοβολή γÏαμμών τίτλου +view message felamimail el ΠÏοβολή μηνÏματος +viewing full header felamimail el ΠÏοβάλλεται πλήÏης τίτλος +viewing message felamimail el ΠÏοβολή μηνÏματος +viewing messages felamimail el ΠÏοβολή μηνυμάτων +wed felamimail el Τετ +when deleting messages felamimail el Όταν διαγÏάφονται τα μηνÏματα +with message felamimail el με μήνυμα +with message "%1" felamimail el με μήνυμα "%1" +wrap incoming text at felamimail el ΤÏλιγμα εισεÏχόμενου μηνÏματος σε +writing felamimail el γÏάφεται +wrote felamimail el γÏάφτηκε diff --git a/felamimail/lang/egw_en.lang b/felamimail/lang/egw_en.lang new file mode 100644 index 0000000000..ed3206e723 --- /dev/null +++ b/felamimail/lang/egw_en.lang @@ -0,0 +1,549 @@ +%1 is not writable by you! felamimail en %1 is NOT writable by you! +(no subject) felamimail en No subject +(only cc/bcc) felamimail en Only Cc/Bcc +(separate multiple addresses by comma) felamimail en Separate multiple addresses by comma +(unknown sender) felamimail en Unknown sender +3paneview: if you want to see a preview of a mail by single clicking onto the subject, set the height for the message-list and the preview area here (300 seems to be a good working value). the preview will be displayed at the end of the message list on demand (click). felamimail en 3PaneView: If you want to see a preview of a mail by single click onto the subject, set the height for the message list and the preview area e.g. 300. You may specify the minimum height of the message list too, by adding it after the specified IFrame Preview height, separated by comma (e.g.: 300,190) +aborted felamimail en Aborted +activate felamimail en Activate +activate script felamimail en Activate script +activating by date requires a start- and end-date! felamimail en Activating by date requires a start AND end date! +add acl felamimail en Add ACL +add address felamimail en Add address +add rule felamimail en Add rule +add script felamimail en Add script +add to %1 felamimail en Add to %1 +add to address book felamimail en Add to address book +add to addressbook felamimail en Add to address book +adding file to message. please wait! felamimail en Adding file to message. Please wait! +additional info felamimail en Additional info +address book felamimail en Address Book +address book search felamimail en Address Book search +after message body felamimail en After message body +all address books felamimail en All address books +all folders felamimail en All folders +all messages in folder felamimail en All messages in folder +all of felamimail en All of +allow images from external sources in html emails felamimail en Allow images from external sources in HTML emails +allways a new window felamimail en Always a new window +always show html emails felamimail en Always show HTML emails +and felamimail en And +any of felamimail en Any of +any status felamimail en Any status +anyone felamimail en Anyone +as a subfolder of felamimail en As a sub folder of +attach felamimail en Attach +attachments felamimail en Attachments +authentication required felamimail en Authentication required +auto refresh folder list felamimail en Auto refresh folder list +back to folder felamimail en Back to folder +bad login name or password. felamimail en Bad login name or password! +bad or malformed request. server responded: %s felamimail en Bad or malformed request. Server responded: %s +bad request: %s felamimail en Bad request: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail en Based upon given criteria, incoming messages can have different background colors in the message list. This helps to easily distinguish who the messages are from, especially for mailing lists. +bcc felamimail en BCC +before headers felamimail en Before headers +between headers and message body felamimail en Between headers and message body +body part felamimail en Body part +by date felamimail en By date +can not send message. no recipient defined! felamimail en Can't send a message. No recipient defined! +can't connect to inbox!! felamimail en Can't connect to INBOX!! +cc felamimail en CC +change folder felamimail en Change folder +check message against next rule also felamimail en Check message against next rule also +checkbox felamimail en Check box +choose from vfs felamimail en Choose from VFS +clear search felamimail en Clear search +click here to log back in. felamimail en Click to log back in. +click here to return to %1 felamimail en Click to return to %1 +close all felamimail en Close all +close this page felamimail en Close this page +close window felamimail en Close window +color felamimail en Color +compose felamimail en Compose +compose as new felamimail en Compose as new +compress folder felamimail en Compress folder +condition felamimail en Condition +configuration felamimail en Configuration +configure a valid imap server in emailadmin for the profile you are using. felamimail en Configure a valid IMAP server in eMailAdmin for the profile you are using. +connection dropped by imap server. felamimail en Connection dropped by IMAP server. +contact not found! felamimail en Contact not found! +contains felamimail en Contains +copy or move messages? felamimail en Copy or move messages +copy to felamimail en Copy to +copying messages to felamimail en Copying messages to +could not append message: felamimail en Could not append message: +could not complete request. reason given: %s felamimail en Could not complete request. %s +could not import message: felamimail en Could not import message: +could not open secure connection to the imap server. %s : %s. felamimail en Could not open secure connection to the IMAP server. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail en CRAM-MD5 or DIGEST-MD5 requires the Auth_SASL package to be installed. +create felamimail en Create +create folder felamimail en Create folder +create sent felamimail en Create Sent +create subfolder felamimail en Create sub folder +create trash felamimail en Create Trash +created folder successfully! felamimail en Created folder successfully! +dark blue felamimail en Dark blue +dark cyan felamimail en Dark cyan +dark gray felamimail en Dark gray +dark green felamimail en Dark green +dark magenta felamimail en Dark magenta +dark yellow felamimail en Dark yellow +date received felamimail en Date received +date(newest first) felamimail en Date -newest first +date(oldest first) felamimail en Date -oldest first +days felamimail en Days +deactivate script felamimail en De-activate script +default felamimail en Default +default signature felamimail en Default signature +default sorting order felamimail en Default sorting order +delete all felamimail en Delete all +delete folder felamimail en Delete folder +delete script felamimail en Delete script +delete selected felamimail en Delete selected +delete selected messages felamimail en Delete selected messages +delete this folder irreversible? felamimail en Delete this folder irreversible? +deleted felamimail en Deleted +deleted folder successfully! felamimail en Deleted folder successfully! +deleting messages felamimail en Deleting messages +disable felamimail en Disable +disable ruler for separation of mailbody and signature when adding signature to composed message (this is not according to rfc).
    if you use templates, this option is only applied to the text part of the message. felamimail en Disable ruler for separation of mail body and signature when adding signature to composed message .
    If templates are used, this option is only applied to the text part of the message. +discard felamimail en Discard +discard message felamimail en Discard message +display message in new window felamimail en Display message in new window +display messages in multiple windows felamimail en Display messages in multiple windows +display of html emails felamimail en Display HTML emails +display only when no plain text is available felamimail en Display only when no plain text is available +display preferences felamimail en Display preferences +displaying html messages is disabled felamimail en Displaying HTML messages is disabled. +displaying plain messages is disabled felamimail en Displaying plain messages is disabled. +do it! felamimail en Do it! +do not use sent felamimail en Do not use Sent +do not use trash felamimail en Do not use Trash +do not validate certificate felamimail en Do not validate certificate +do you really want to attach the selected messages to the new mail? felamimail en Do you really want to attach the selected messages to the mail? +do you really want to delete the '%1' folder? felamimail en Do you really want to delete the '%1' folder? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail en Do you really want to delete the selected account settings and the associated identity? +do you really want to delete the selected signatures? felamimail en Do you really want to delete the selected signatures? +do you really want to move or copy the selected messages to folder: felamimail en Do you really want to move or copy the selected messages to folder: +do you really want to move the selected messages to folder: felamimail en Do you really want to move the selected messages to folder: +do you want to be asked for confirmation before attaching selected messages to new mail? felamimail en Do you want to be asked for confirmation before attaching selected messages to new mail? +do you want to be asked for confirmation before moving selected messages to another folder? felamimail en Do you want to be asked for confirmation before moving selected messages to another folder? +do you want to prevent the editing/setup for forwarding of mails via settings (, even if sieve is enabled)? felamimail en Do you want to prevent the editing/setup for forwarding of mails via settings, even if SIEVE is enabled? +do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? felamimail en Do you want to prevent the editing/setup of filter rules, even if SIEVE is enabled? +do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if sieve is enabled)? felamimail en Do you want to prevent the editing/setup of notification by mail to other email addresses if emails arrive, even if SIEVE is enabled? +do you want to prevent the editing/setup of the absent/vacation notice (, even if sieve is enabled)? felamimail en Do you want to prevent the editing/setup of the absent/vacation notice, even if SIEVE is enabled? +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail en Do you want to prevent the managing of folders --creation, access rights AND subscription? +does not contain felamimail en Does not contain +does not exist on imap server. felamimail en Does not exist on IMAP server. +does not match felamimail en Does not match +does not match regexp felamimail en Does not match regexp +don't use draft folder felamimail en Don't use Draft folder +don't use sent felamimail en Don't use Sent folder +don't use template folder felamimail en Don't use Template folder +don't use trash felamimail en Don't use Trash folder +dont strip any tags felamimail en Dont strip any tags +down felamimail en Down +download felamimail en Download +download this as a file felamimail en Download this as a file +draft folder felamimail en Draft folder +drafts felamimail en Drafts +e-mail felamimail en Email +e-mail address felamimail en Email address +e-mail folders felamimail en Email folders +edit email forwarding address felamimail en Edit email forwarding address +edit filter felamimail en Edit filter +edit rule felamimail en Edit rule +edit selected felamimail en Edit selected +edit vacation settings felamimail en Edit vacation settings +editor type felamimail en Editor type +email address felamimail en Email address +email forwarding address felamimail en Email forwarding address +email notification update failed felamimail en Email notification update failed +email signature felamimail en Email signature +emailaddress felamimail en Email address +empty trash felamimail en Empty trash +enable felamimail en Enable +encrypted connection felamimail en Encrypted connection +enter your default mail domain ( from: user@domain ) admin en Enter your default mail domain from user@domain +enter your imap mail server hostname or ip address admin en Enter your IMAP mail server hostname or IP address +enter your sieve server hostname or ip address admin en Enter your SIEVE server hostname or IP address +enter your sieve server port admin en Enter your SIEVE server port +enter your smtp server hostname or ip address admin en Enter your SMTP server hostname or IP address +enter your smtp server port admin en Enter your SMTP server port +entry saved felamimail en Entry saved. +error felamimail en ERROR +error connecting to imap serv felamimail en Error connecting to IMAP server. +error connecting to imap server. %s : %s. felamimail en Error connecting to IMAP server. %s : %s. +error connecting to imap server: [%s] %s. felamimail en Error connecting to IMAP server: [%s] %s. +error creating rule while trying to use forward/redirect. felamimail en Error creating rule while trying to use forward/redirect. +error opening felamimail en Error opening! +error saving %1! felamimail en Error saving %1! +error: felamimail en Error: +error: could not save message as draft felamimail en Error: Could not save message as draft. +error: could not save rule felamimail en Error: Could not save rule. +error: could not send message. felamimail en Error: Could not send message. +error: message could not be displayed. felamimail en ERROR: Message could not be displayed. +event details follow felamimail en Event details follow +every felamimail en Every +every %1 days felamimail en Every %1 days +expunge felamimail en Expunge +extended felamimail en Extended +felamimail common en eMail +file into felamimail en File into +file rejected, no %2. is:%1 felamimail en File rejected, no %2. Is:%1 +filemanager felamimail en File Manager +files felamimail en Files +filter active felamimail en Filter active +filter name felamimail en Filter name +filter rules common en Filter rules +first name felamimail en First name +flagged felamimail en Flagged +flags felamimail en Flags +folder felamimail en Folder +folder acl felamimail en Folder ACL +folder name felamimail en Folder name +folder path felamimail en Folder path +folder preferences felamimail en Folder preferences +folder settings felamimail en Folder settings +folder status felamimail en Folder status +folderlist felamimail en Folder list +foldername felamimail en Folder name +folders felamimail en Folders +folders created successfully! felamimail en Folders created successfully! +follow felamimail en Follow +for mail to be send - not functional yet felamimail en For mail to be send - not functional yet +for received mail felamimail en For received mail +forward felamimail en Forward +forward as attachment felamimail en Forward as attachment +forward inline felamimail en Forward inline +forward messages to felamimail en Forward messages to +forward to felamimail en Forward to +forward to address felamimail en Forward to address +forwarding felamimail en Forwarding +found felamimail en Found +from felamimail en From +from(a->z) felamimail en From (A->Z) +from(z->a) felamimail en From (Z->A) +full name felamimail en Full Name +greater than felamimail en Greater than +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail en Have a look at www.felamimail.org to learn more about Squirrelmail.
    +header lines felamimail en Header lines +hide header felamimail en Hide header +hostname / address felamimail en Hostname / address +how to forward messages felamimail en How to forward messages +html felamimail en HTML +icons and text felamimail en Icons and text +icons only felamimail en Icons only +identifying name felamimail en Identifying name +identity felamimail en Identity +if felamimail en IF +if from contains felamimail en If from contains +if mail header felamimail en If mail header +if message size felamimail en If message size +if shown, which folders should appear on main screen felamimail en If shown, which folders should appear on main screen +if subject contains felamimail en If subject contains +if to contains felamimail en If to contains +if using ssl or tls, you must have the php openssl extension loaded. felamimail en If using SSL or TLS, you must have the PHP openssl extension loaded. +illegal folder name. please select a different name. felamimail en Invalid folder name. Please select a different name. +imap felamimail en IMAP +imap server felamimail en IMAP server +imap server address felamimail en IMAP server address +imap server closed the connection. felamimail en IMAP server closed the connection. +imap server closed the connection. server responded: %s felamimail en IMAP server closed the connection. %s +imap server password felamimail en IMAP server password +imap server type felamimail en IMAP server type +imap server username felamimail en IMAP server user name +imaps authentication felamimail en IMAPS authentication +imaps encryption only felamimail en IMAPS encryption only +import felamimail en Import +import mail felamimail en Import mail +import message felamimail en Import message +import of message %1 failed. could not save message to folder %2 due to: %3 felamimail en Import of message %1 failed. Could not save message to folder %2 due to: %3 +import of message %1 failed. destination folder %2 does not exist. felamimail en Import of message %1 failed. Destination folder %2 does not exist. +import of message %1 failed. destination folder not set. felamimail en Import of message %1 failed. Destination folder not set. +import of message %1 failed. no contacts to merge and send to specified. felamimail en Import of message %1 failed. No contacts to merge and send to specified. +importance felamimail en Importance +in felamimail en In +inbox felamimail en INBOX +incoming mail server(imap) felamimail en Incoming mail server (IMAP) +index order felamimail en Index order +info felamimail en Info +insert the signature at top of the new (or reply) message when opening compose dialog (you may not be able to switch signatures) felamimail en Insert the signature at top of the new message when opening compose dialog. +invalid user name or password felamimail en Invalid user name or password! +javascript felamimail en JavaScript +jumping to end felamimail en Jumping to end +jumping to start felamimail en Jumping to start +junk felamimail en Junk +keep a copy of the message in your inbox felamimail en Keep a copy of the message in your inbox +keep local copy of email felamimail en Keep local copy of email +kilobytes felamimail en kilobytes +language felamimail en Language +last name felamimail en Last name +left felamimail en Left +less felamimail en Less +less than felamimail en Less than +light gray felamimail en Light gray +list all felamimail en List all +loading felamimail en Loading +location of buttons when composing felamimail en Location of buttons when composing +mail grid behavior: how many messages should the mailgrid load? if you select all messages there will be no pagination for mail message list. (beware, as some actions on all selected messages may be problematic depending on the amount of selected messages.) felamimail en Mail Grid Behavior: how many messages should the mail grid load? If you select all messages there will be no pagination for mail message list. +mail server login type admin en Mail server login type +mail settings felamimail en Mail settings +mainmessage felamimail en Main message +manage email accounts and identities common en Manage email accounts and identities +manage emailaccounts common en Manage email accounts +manage emailfilter / vacation preferences en Manage email filter / vacation +manage folders common en Manage folders +manage sieve common en Manage sieve scripts +manage signatures felamimail en Manage signatures +mark as felamimail en Mark as +mark as deleted felamimail en Mark as deleted +mark messages as felamimail en Mark selected messages as +mark selected as flagged felamimail en Mark selected as flagged +mark selected as read felamimail en Mark selected as read +mark selected as unflagged felamimail en Mark selected as unflagged +mark selected as unread felamimail en Mark selected as unread +match felamimail en Match +matches felamimail en Matches +matches regexp felamimail en Matches regexp +max uploadsize felamimail en Max upload size +message highlighting felamimail en Message highlighting +message list felamimail en Message list +messages felamimail en Messages +move felamimail en Move +move folder felamimail en Move folder +move messages felamimail en Move messages +move messages? felamimail en Move messages +move selected to felamimail en Move selected to +move to felamimail en Move to +move to trash felamimail en Move to Trash +moving messages to felamimail en Moving messages to +name felamimail en Name +never display html emails felamimail en Never display HTML emails +new common en New +new filter felamimail en New filter +next felamimail en Next +next message felamimail en Next message +no active imap server found!! felamimail en No active IMAP server found! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail en No address TO/CC/BCC supplied and no folder to save message provided +no encryption felamimail en No encryption +no filter felamimail en No filter +no folders felamimail en No folders +no folders found felamimail en No folders found +no folders were found to subscribe to! felamimail en No folders were found to subscribe to! +no folders were found to unsubscribe from! felamimail en No folders were found to unsubscribe from! +no highlighting is defined felamimail en No highlighting is defined! +no imap server host configured!! felamimail en No IMAP server host configured! +no message returned. felamimail en No message returned. +no messages found... felamimail en No messages found... +no messages selected, or lost selection. changing to folder felamimail en No messages selected or lost the selection. Changing to folder +no messages were selected. felamimail en No messages were selected. +no plain text part found felamimail en No plain text part found. +no previous message felamimail en No previous messages. +no recipient address given! felamimail en No recipient address given! +no signature felamimail en No signature! +no stationery felamimail en No stationery! +no subject given! felamimail en No subject given! +no supported imap authentication method could be found. felamimail en No supported IMAP authentication method could be found. +no text body supplied, check attachments for message text felamimail en No text body supplied, check attachments for message text +no valid data to create mailprofile!! felamimail en No valid data to create email profile! +no valid emailprofile selected!! felamimail en No valid email profile selected! +none felamimail en None +none, create all felamimail en None, create all +not allowed felamimail en Not allowed +notify when new mails arrive on these folders felamimail en Notify when new mails arrive on these folders +on felamimail en On +on behalf of felamimail en On behalf of +one address is not valid felamimail en One address is not valid +only inbox felamimail en Only INBOX +only one window felamimail en Only one window +only send message, do not copy a version of the message to the configured sent folder felamimail en Send message only, do not copy it to Sent folder +only unseen felamimail en Only unseen +open all felamimail en Open all +options felamimail en Options +or felamimail en Or +or configure an valid imap server connection using the manage accounts/identities preference in the sidebox menu. felamimail en Or configure an valid IMAP server connection using the Manage accounts and identities preference in the side menu. +organisation felamimail en Organisation +organization felamimail en Organization +organization name admin en Organization name +original message felamimail en Original message +outgoing mail server(smtp) felamimail en Outgoing mail server SMTP +participants felamimail en Participants +personal information felamimail en Personal information +please ask the administrator to correct the emailadmin imap server settings for you. felamimail en Ask the administrator to correct the eMailAdmin IMAP server settings +please configure access to an existing individual imap account. felamimail en Configure access to an existing individual IMAP account +please select a address felamimail en Select an address +please select the number of days to wait between responses felamimail en Select the number of days to wait between responses +please supply the message to send with auto-responses felamimail en Supply the message to send with auto-responses +port felamimail en Port +posting felamimail en Posting +preview disabled for folder: felamimail en Preview disabled for folder: +previous felamimail en Previous +previous message felamimail en Previous message +primary emailadmin profile felamimail en Primary eMailAdmin profile +print it felamimail en Print +print this page felamimail en Print this page +printview felamimail en Print view +processing of file %1 failed. failed to meet basic restrictions. felamimail en Processing of file %1 failed. Failed to meet basic restrictions. +quicksearch felamimail en Quick search +read felamimail en Read +reading felamimail en Reading +receive notification felamimail en Receive notification +recent felamimail en Recent +refresh time in minutes felamimail en Refresh time in minutes +reject with felamimail en Reject with +remove felamimail en Remove +remove immediately felamimail en Remove immediately +rename felamimail en Rename +rename a folder felamimail en Rename a folder +rename folder felamimail en Rename folder +renamed successfully! felamimail en Renamed successfully! +replied felamimail en Replied +reply felamimail en Reply +reply all felamimail en Reply All +reply to felamimail en Reply To +replyto felamimail en Reply To +required pear class mail/mimedecode.php not found. felamimail en Required PEAR class Mail / mimeDecode.php not found. +respond felamimail en Respond +respond to mail sent to felamimail en Respond to mail sent to +return felamimail en Return +return to options page felamimail en Return to options page +right felamimail en Right +row order style felamimail en Row order style +rule felamimail en Rule +save felamimail en Save +save all felamimail en Save all +save as draft felamimail en Save as draft +save as infolog felamimail en Save as InfoLog +save as ticket felamimail en Save as Tracker ticket +save as tracker felamimail en Save as Tracker +save changes felamimail en Save changes +save message to disk felamimail en Save message to disk +save of message %1 failed. could not save message to folder %2 due to: %3 felamimail en Save of message %1 failed. Could not save message to folder %2 due to: %3 +save: felamimail en Save: +script name felamimail en Script name +script status felamimail en Script status +search felamimail en Search +search for felamimail en Search for +select felamimail en Select +select a message to switch on its preview (click on subject) felamimail en Select a message to preview. +select all felamimail en Select all +select emailprofile felamimail en Select email profile +select folder felamimail en Select folder +select your mail server type admin en Select mail server type +send felamimail en Send +send a reject message felamimail en Send a reject message +send message and move to send folder (if configured) felamimail en Send message and move to Sent folder +sender felamimail en Sender +sent felamimail en Sent +sent folder felamimail en Sent folder +server supports mailfilter(sieve) felamimail en Server supports mail filter (sieve) +set as default felamimail en Set as default +show all folders (subscribed and unsubscribed) in main screen folder pane felamimail en Show all folders, subscribed AND unsubscribed, in main screen folder pane. +show all messages felamimail en Show all messages +show header felamimail en Show header +show new messages on main screen felamimail en Show new messages on main screen +sieve script name felamimail en Sieve script name +sieve settings admin en Sieve settings +signatur felamimail en Signature +signature felamimail en Signature +simply click the target-folder felamimail en Click the target folder +size felamimail en Size +size of editor window felamimail en Size of editor window +size(...->0) felamimail en Size (...->0) +size(0->...) felamimail en Size (0->...) +skipping forward felamimail en Skipping forward +skipping previous felamimail en Skipping previous +small view felamimail en Small view +smtp settings admin en SMTP settings +start new messages with mime type plain/text or html? felamimail en Start new messages with mime type plain/text or HTML? +stationery felamimail en Stationery +subject felamimail en Subject +subject(a->z) felamimail en Subject (A->Z) +subject(z->a) felamimail en Subject (Z->A) +submit felamimail en Submit +subscribe felamimail en Subscribe +subscribed felamimail en Subscribed +subscribed successfully! felamimail en Subscribed successfully! +switching of signatures failed felamimail en Switching of signatures failed +system signature felamimail en System signature +table of contents felamimail en Table of contents +template folder felamimail en Template folder +templates felamimail en Templates +text only felamimail en Text only +text/plain felamimail en Text/plain +the action will be applied to all messages of the current folder.\ndo you want to proceed? felamimail en The action will be applied to all messages of the current folder.\nDo you want to proceed? +the action will be applied to all messages of the current folder.ndo you want to proceed? felamimail en The action will be applied to all messages of the current folder.\nDo you want to proceed? +the connection to the imap server failed!! felamimail en The connection to the IMAP Server failed! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail en The IMAP server does not appear to support the authentication method selected. Contact your system administrator. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail en The message sender has requested a response to indicate that you have read this message. Would you like to send a receipt? +the mimeparser can not parse this message. felamimail en The mimeparser can not parse this message. +then felamimail en THAN +there is no imap server configured. felamimail en There is no IMAP server configured. +this folder is empty felamimail en THIS FOLDER IS EMPTY +this php has no imap support compiled in!! felamimail en This PHP has no IMAP support compiled in! +to felamimail en To +to mail sent to felamimail en To mail sent to +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail en To use a TLS connection, you must be running a version of PHP 5.1.0 or higher. +translation preferences felamimail en Translation preferences +translation server felamimail en Translation server +trash felamimail en Trash +trash fold felamimail en Trash folder +trash folder felamimail en Trash folder +trust servers seen / unseen info when retrieving the folder status. (if you select no, we will search for the unseen messages and count them ourselves) felamimail en Trust servers SEEN / UNSEEN info when retrieving the folder status +trying to recover from session data felamimail en Trying to recover from session data +type felamimail en Type +undelete felamimail en Undelete +unexpected response from server to authenticate command. felamimail en Unexpected response from server to AUTHENTICATE command. +unexpected response from server to digest-md5 response. felamimail en Unexpected response from server to Digest-MD5 response. +unexpected response from server to login command. felamimail en Unexpected response from server to LOGIN command. +unflagged felamimail en Unflagged +unknown err felamimail en Unknown error +unknown error felamimail en Unknown error! +unknown imap response from the server. server responded: %s felamimail en Unknown IMAP response from the server. %s +unknown sender felamimail en Unknown sender +unknown user or password incorrect. felamimail en Unknown user or incorrect password +unread common en Unread +unseen felamimail en Unseen +unselect all felamimail en Unselect all +unsubscribe felamimail en Unsubscribe +unsubscribed felamimail en Unsubscribed. +unsubscribed successfully! felamimail en Unsubscribed successfully! +up felamimail en Up +updating message status felamimail en Updating message status. +updating view felamimail en Updating view. +use emailadmin to create profiles felamimail en Use eMailAdmin to create profiles. +use a signature felamimail en Use signature +use a signature? felamimail en Use signature +use addresses felamimail en Use addresses +use common preferences max. messages felamimail en Use common preferences max. messages +use custom identities felamimail en Use custom identities +use custom settings felamimail en Use custom settings +use regular expressions felamimail en Use regular expressions +use smtp auth admin en Use SMTP authentication +users can define their own emailaccounts admin en Users can define their own email accounts +vacation notice common en Vacation notice +vacation notice is active felamimail en Vacation notice is active +vacation start-date must be before the end-date! felamimail en Vacation start date must be BEFORE the end date! +validate certificate felamimail en Validate certificate +view full header felamimail en View full header +view header lines felamimail en View header lines +view message felamimail en View message +viewing full header felamimail en Viewing full header +viewing message felamimail en Viewing message +viewing messages felamimail en Viewing messages +when deleting messages felamimail en When deleting messages +when sending messages felamimail en When sending messages +which folders (additional to the sent folder) should be displayed using the sent folder view schema felamimail en Which folders additionally to the Sent folder should be displayed using the Sent Folder View Schema +which folders - in general - should not be automatically created, if not existing felamimail en Which folders - in general - should NOT be automatically created, if not existing +with message felamimail en With message +with message "%1" felamimail en With message "%1" +wrap incoming text at felamimail en Wrap incoming text at +writing felamimail en Writing +wrote felamimail en Wrote +yes, offer copy option felamimail en Yes, offer copy option +you can either choose to save as infolog or tracker, not both. felamimail en You can either choose to save as InfoLog OR Tracker, not both. +you can use %1 for the above start-date and %2 for the end-date. felamimail en You can use %1 for the above start date and %2 for the end date. +you have received a new message on the felamimail en You have received a new message on the +your message to %1 was displayed. felamimail en Your message to %1 was displayed. diff --git a/felamimail/lang/egw_es-es.lang b/felamimail/lang/egw_es-es.lang new file mode 100644 index 0000000000..f9da2ac406 --- /dev/null +++ b/felamimail/lang/egw_es-es.lang @@ -0,0 +1,516 @@ +%1 is not writable by you! felamimail es-es ¡NO tiene permiso de escritura en %1! +(no subject) felamimail es-es (Sin asunto) +(only cc/bcc) felamimail es-es (sólo Cc/Cco) +(separate multiple addresses by comma) felamimail es-es (separar múltiples direcciones con comas) +(unknown sender) felamimail es-es (remitente desconocido) +3paneview: if you want to see a preview of a mail by single clicking onto the subject, set the height for the message-list and the preview area here (300 seems to be a good working value). the preview will be displayed at the end of the message list on demand (click). felamimail es-es Vista de tres paneles: si desea tener una vista previa del correo con un simple clic en el asunto, ponga aquí la altura para la lista de mensajes y el área de vista previa (300 parece un valor apropiado). La vista previa se mostrará al final de la lista de mensajes bajo demanda, al pulsar. +aborted felamimail es-es abortado +activate felamimail es-es Activar +activate script felamimail es-es activar script +activating by date requires a start- and end-date! felamimail es-es Activar por fecha requiere una fecha de inicio y otra de final +add acl felamimail es-es añadir acl +add address felamimail es-es Añadir dirección +add rule felamimail es-es Añadir regla +add script felamimail es-es Añadir script +add to %1 felamimail es-es Añadir a %1 +add to address book felamimail es-es Añadir a la libreta de direcciones +add to addressbook felamimail es-es Añadir a la libreta de direcciones +adding file to message. please wait! felamimail es-es Añadiendo fichero al mensaje. Por favor, espere. +additional info felamimail es-es Información adicional +address book felamimail es-es Libreta de direcciones +address book search felamimail es-es Buscar en la libreta de direcciones +after message body felamimail es-es Después del cuerpo del mensaje +all address books felamimail es-es Todas las libretas de direcciones +all folders felamimail es-es Todas las carpetas +all messages in folder felamimail es-es todos los mensajes de la carpeta +all of felamimail es-es todos los +allow images from external sources in html emails felamimail es-es Permitir imágenes de origen externo en correos HTML +allways a new window felamimail es-es siempre una ventana nueva +always show html emails felamimail es-es Mostrar siempre los correos HTML +and felamimail es-es y +any of felamimail es-es cualquiera de +any status felamimail es-es cualquier estado +anyone felamimail es-es cualquiera +as a subfolder of felamimail es-es como una subcarpeta de +attach felamimail es-es Adjuntar +attachments felamimail es-es Adjuntos +authentication required felamimail es-es se requiere identificación +auto refresh folder list felamimail es-es Refrescar automáticamente la lista de carpetas +back to folder felamimail es-es Volver a la carpeta +bad login name or password. felamimail es-es El usuario o contraseña son incorrectos +bad or malformed request. server responded: %s felamimail es-es Petición mal formada o errónea. El servidor respondió: %s +bad request: %s felamimail es-es Petición errónea: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail es-es Basado en los criterios dados, los mensajes que lleguen pueden tener distintos colores de fondo en la lista de mensajes. Esto ayuda a distinguir fácilmente de quién son los mensajes, espcialmente para listas de correo. +bcc felamimail es-es CCO +before headers felamimail es-es Antes de las cabeceras +between headers and message body felamimail es-es Entre las cabeceras y el cuerpo del mensaje +body part felamimail es-es Parte del cuerpo +by date felamimail es-es por fecha +can not send message. no recipient defined! felamimail es-es ¡no puedo enviar el mensaje por no tener destinatario! +can't connect to inbox!! felamimail es-es ¡¡No se puede leer la Bandeja de entrada!! +cc felamimail es-es CC +change folder felamimail es-es Cambiar carpeta +check message against next rule also felamimail es-es comprobar el mensaje también con la regla siguiente +checkbox felamimail es-es Casilla +clear search felamimail es-es Limpiar búsqueda +click here to log back in. felamimail es-es Pulse aquí para volver a iniciar sesión +click here to return to %1 felamimail es-es Pulse aquí para volver a %1 +close all felamimail es-es cerrar todas +close this page felamimail es-es cerrar esta página +close window felamimail es-es Cerrar ventana +color felamimail es-es Color +compose felamimail es-es Redactar +compose as new felamimail es-es Redactar como nuevo +compress folder felamimail es-es Comprimir carpeta +condition felamimail es-es condición +configuration felamimail es-es Configuración +configure a valid imap server in emailadmin for the profile you are using. felamimail es-es Configure un servidor IMAP válido en emailadmin para el perfil que está usando. +connection dropped by imap server. felamimail es-es La conexión ha sido ignorada por el servidor IMAP +contact not found! felamimail es-es ¡No se encontró el contacto! +contains felamimail es-es contiene +copy or move messages? felamimail es-es ¿Copiar o mover mensajes? +copying messages to felamimail es-es copiar los mensajes a +could not complete request. reason given: %s felamimail es-es No se pudo completar la petición. Razón: %s +could not import message: felamimail es-es No se pudo importar el mensaje: +could not open secure connection to the imap server. %s : %s. felamimail es-es No se pudo abrir una conexión segura al servidor IMAP. %s: %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail es-es CRAM-MD5 o DIGEST-MD5 necesitan que esté instalado el paquete Auth_SASL. +create felamimail es-es Crear +create folder felamimail es-es Crear carpeta +create sent felamimail es-es Crear carpeta Enviados +create subfolder felamimail es-es Crear subcarpeta +create trash felamimail es-es Crear carpeta Papelera +created folder successfully! felamimail es-es La carpeta se ha creado correctamente +dark blue felamimail es-es Azul oscuro +dark cyan felamimail es-es Cyan oscuro +dark gray felamimail es-es Gris oscuro +dark green felamimail es-es Verde oscuro +dark magenta felamimail es-es Violeta oscuro +dark yellow felamimail es-es Amarillo oscuro +date(newest first) felamimail es-es Fecha (la más reciente primero) +date(oldest first) felamimail es-es Fecha (la más antigua primero) +days felamimail es-es días +deactivate script felamimail es-es desactivar script +default felamimail es-es predeterminado +default signature felamimail es-es Firma predeterminada +default sorting order felamimail es-es Modo de ordenar predeterminado +delete all felamimail es-es Borrar todos +delete folder felamimail es-es Borrar carpeta +delete script felamimail es-es borrar script +delete selected felamimail es-es Borrar la selección +delete selected messages felamimail es-es Borrar mensajes seleccionados +deleted felamimail es-es Borrado +deleted folder successfully! felamimail es-es Carpeta borrada correctamente +deleting messages felamimail es-es borrando mensajes +disable felamimail es-es Deshabilitar +disable ruler for separation of mailbody and signature when adding signature to composed message (this is not according to rfc).
    if you use templates, this option is only applied to the text part of the message. felamimail es-es desactivar la regla para separar el cuerpo del mensaje y la firma al añadir la firma al mensaje redactado (sin seguir las reglas del RFC).
    Si usa plantillas, esta opción se aplica sólo a la parte de texto del mensaje. +discard felamimail es-es descargar +discard message felamimail es-es descartar mensaje +display message in new window felamimail es-es Mostrar el mensaje en una ventana nueva +display messages in multiple windows felamimail es-es mostrar los mensajes en múltiples ventanas +display of html emails felamimail es-es Mostrar los mensajes HTML +display only when no plain text is available felamimail es-es Mostrar sólo cuando no hay texto simple disponible +display preferences felamimail es-es Preferencias de visualización +displaying html messages is disabled felamimail es-es Mostrar los mensajes en HTML está desactivado +do it! felamimail es-es ¡Hacerlo! +do not use sent felamimail es-es No usar Enviados +do not use trash felamimail es-es No usar Papelera +do not validate certificate felamimail es-es No validar el certificado +do you really want to delete the '%1' folder? felamimail es-es ¿Realmente quiere borrar la carpeta '%1'? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail es-es ¿Realmente desea borrar las configuraciones de cuenta seleccionadas y la identidad asociada? +do you really want to delete the selected signatures? felamimail es-es ¿Realmente desea borrar las firmas seleccionadas? +do you really want to move or copy the selected messages to folder: felamimail es-es ¿Realmente desea mover o copiar los siguientes mensajes a la carpeta: +do you really want to move the selected messages to folder: felamimail es-es ¿Realmente desea mover los mensajes seleccionados a la carpeta: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail es-es ¿Desea que se le pida confirmación antes de mover los mensajes seleccionados a otra carpeta? +do you want to prevent the editing/setup for forwarding of mails via settings (, even if sieve is enabled)? felamimail es-es ¿Desea prevenir la edición o configuración de los correos mediante las preferencias (incluso si SIEVE está activado)? +do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? felamimail es-es ¿Desea prevenir la edición o configuración de las reglas de filtrado (incluso si SIEVE está activado)? +do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if sieve is enabled)? felamimail es-es ¿Desea prevenir la edición o configuración de la notificación a otras direcciones si llegan correos (incluso si SIEVE está activado)? +do you want to prevent the editing/setup of the absent/vacation notice (, even if sieve is enabled)? felamimail es-es ¿Desea prevenir la edición o configuración de la notificación de ausencia o vacaciones (incluso si SIEVE está activado)? +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail es-es ¿Desea prevenir la gestión de carpetas (creación, derechos de acceso Y suscripción)? +does not contain felamimail es-es No contiene +does not exist on imap server. felamimail es-es No existe en el servidor IMAP +does not match felamimail es-es No coincide con +does not match regexp felamimail es-es No coincide con la expresión +don't use draft folder felamimail es-es No usar la carpeta borradores +don't use sent felamimail es-es No usar Enviados +don't use template folder felamimail es-es No usar la carpeta de plantillas +don't use trash felamimail es-es No usar Papelera +dont strip any tags felamimail es-es no separar ninguna etiqueta +down felamimail es-es abajo +download felamimail es-es descargar +download this as a file felamimail es-es Descargar esto como un fichero +draft folder felamimail es-es Carpeta borradores +drafts felamimail es-es Borradores +e-mail felamimail es-es Correo electrónico +e-mail address felamimail es-es Dirección de correo electrónico +e-mail folders felamimail es-es Carpetas de correo electrónico +edit email forwarding address felamimail es-es editar la dirección de reenvío del correo +edit filter felamimail es-es Editar filtro +edit rule felamimail es-es Añadir regla +edit selected felamimail es-es Editar selección +edit vacation settings felamimail es-es editar configuración de vacaciones +editor type felamimail es-es Tipo de editor +email address felamimail es-es Dirección de correo electrónico +email forwarding address felamimail es-es dirección de reenvío del correo +email notification update failed felamimail es-es falló la actualización de la notificación de correo electrónico +email signature felamimail es-es Firma de correo +emailaddress felamimail es-es dirección de correo electrónico +empty trash felamimail es-es Vaciar papelera +enable felamimail es-es Habilitar +encrypted connection felamimail es-es conexión cifrada +enter your default mail domain ( from: user@domain ) admin es-es Introduzca su dominio de correo predeterminado (From: usuario@dominio) +enter your imap mail server hostname or ip address admin es-es Introduzca el nombre del servidor de correo IMAP o la dirección IP +enter your sieve server hostname or ip address admin es-es Introduzca el nombre del servidor SIEVE o la dirección IP +enter your sieve server port admin es-es Introduzca el puerto del servidor SIEVE +enter your smtp server hostname or ip address admin es-es ntroduzca el nombre del servidor SMTP o la dirección IP +enter your smtp server port admin es-es Introduzca el el puerto del servidor SMTP +entry saved felamimail es-es Se ha guardado la entrada +error felamimail es-es ERROR +error connecting to imap serv felamimail es-es Error al conectar al servidor IMAP +error connecting to imap server. %s : %s. felamimail es-es Error al conectar con el servidor IMAP: %s: %s +error connecting to imap server: [%s] %s. felamimail es-es Error al conectar con el servidor IMAP: [%s] %s +error creating rule while trying to use forward/redirect. felamimail es-es Error al crear la regla al intentar reenviar. +error opening felamimail es-es Error al abrir +error saving %1! felamimail es-es ¡Error al guardar %1! +error: felamimail es-es Error: +error: could not save message as draft felamimail es-es Error: no se pudo salvar el mensaje como borrador +error: could not save rule felamimail es-es Error: no se pudo guardar la regla +error: message could not be displayed. felamimail es-es ERROR: No se pudo mostrar el mensaje +event details follow felamimail es-es Los detalles del evento a continuación +every felamimail es-es cada +every %1 days felamimail es-es cada %1 días +expunge felamimail es-es Suprimir +extended felamimail es-es extendida +felamimail common es-es FelaMiMail +file into felamimail es-es Información del fichero +filemanager felamimail es-es Administrador de ficheros +files felamimail es-es Ficheros +filter active felamimail es-es Filtro activo +filter name felamimail es-es Nombre del filtro +filter rules common es-es reglas de filtrado +first name felamimail es-es Nombre de pila +flagged felamimail es-es marcado +flags felamimail es-es Marcas +folder felamimail es-es carpeta +folder acl felamimail es-es ACL de la carpeta +folder name felamimail es-es Nombre de la carpeta +folder path felamimail es-es Ruta de la carpeta +folder preferences felamimail es-es Preferencias de la carpeta +folder settings felamimail es-es Opciones de la carpeta +folder status felamimail es-es Estado de la carpeta +folderlist felamimail es-es Lista de carpetas +foldername felamimail es-es Nombre de carpeta +folders felamimail es-es Carpetas +folders created successfully! felamimail es-es Las carpetas se han creado correctamente +follow felamimail es-es seguir +for mail to be send - not functional yet felamimail es-es Para el correo pendiente de enviar - todavía no funciona +for received mail felamimail es-es Para el correo recibido +forward felamimail es-es Reenviar +forward as attachment felamimail es-es reenviar como adjunto +forward inline felamimail es-es reenviar como incorporado +forward messages to felamimail es-es Reenviar mensajes a +forward to felamimail es-es reenviar a +forward to address felamimail es-es reenviar a la dirección +forwarding felamimail es-es Reenviando +found felamimail es-es Encontrado +fri felamimail es-es Vie +from felamimail es-es De +from(a->z) felamimail es-es De (A-> Z) +from(z->a) felamimail es-es De (Z-> A) +full name felamimail es-es Nombre completo +greater than felamimail es-es mayor que +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail es-es Eche un vistazo a www.felamimail.org para saber más acerca de Squirrelmail.
    +header lines felamimail es-es Líneas de encabezado +hide header felamimail es-es Ocultar cabecera +hostname / address felamimail es-es servidor / dirección +how to forward messages felamimail es-es cómo reenviar mensajes +html felamimail es-es HTML +icons and text felamimail es-es Iconos y texto +icons only felamimail es-es Sólo iconos +identifying name felamimail es-es Nombre identificativo +identity felamimail es-es identidad +if felamimail es-es SI +if from contains felamimail es-es si el remitente contiene +if mail header felamimail es-es si el encabezado +if message size felamimail es-es si el tamaño del mensaje +if shown, which folders should appear on main screen felamimail es-es Si se muestra, qué carpetas deben aparecer en la pantalla principal +if subject contains felamimail es-es si el asunto contiene +if to contains felamimail es-es si el destinatario contiene +if using ssl or tls, you must have the php openssl extension loaded. felamimail es-es Si se usa SSL o TLS, debe tener la extensión openssl de PHP cargada. +illegal folder name. please select a different name. felamimail es-es Nombre de carpeta ilegal. Por favor, seleccione un nombre distinto +imap felamimail es-es IMAP +imap server felamimail es-es Servidor IMAP +imap server address felamimail es-es Dirección del servidor IMAP +imap server closed the connection. felamimail es-es El servidor IMAP cerró la conexión. +imap server closed the connection. server responded: %s felamimail es-es El servidor IMAP cerró la conexión. El servidor respondió: %s +imap server password felamimail es-es contraseña del servidor IMAP +imap server type felamimail es-es Tipo de servidor IMAP +imap server username felamimail es-es usuario del servidor IMAP +imaps authentication felamimail es-es Identificación IMAPS +imaps encryption only felamimail es-es Cifrado IMAPS solamente +import felamimail es-es importar +import mail felamimail es-es Importar correo +import message felamimail es-es importar mensaje +in felamimail es-es en +inbox felamimail es-es Bandeja de entrada +incoming mail server(imap) felamimail es-es servidor de correo entrante (IMAP) +index order felamimail es-es Orden del índice +info felamimail es-es Información +insert the signature at top of the new (or reply) message when opening compose dialog (you may not be able to switch signatures) felamimail es-es inserte la firma en la parte superior del mensaje al abrir el diálogo de redactar (quizás no pueda cambiar la firma) +invalid user name or password felamimail es-es El usuario o la contraseña no son válidos +javascript felamimail es-es JavaScript +jumping to end felamimail es-es saltando al final +jumping to start felamimail es-es saltando al principio +junk felamimail es-es Basura +keep a copy of the message in your inbox felamimail es-es guardar una copia del mensaje en la bandeja de entrada +keep local copy of email felamimail es-es guardar copia local del correo +kilobytes felamimail es-es kilobytes +language felamimail es-es Idioma +last name felamimail es-es Apellidos +left felamimail es-es Izquierda +less felamimail es-es menos +less than felamimail es-es menor que +light gray felamimail es-es Gris claro +list all felamimail es-es Listar todo +loading felamimail es-es cargando +location of buttons when composing felamimail es-es Ubicación de los botones al redactar +mail server login type admin es-es Tipo de sesión del servidor de correo +mail settings felamimail es-es Configuración del correo +mainmessage felamimail es-es mensaje principal +manage email accounts and identities common es-es Administrar cuentas de correo e identidades +manage emailaccounts common es-es Administrar cuentas de correo +manage emailfilter / vacation preferences es-es Administrar filtros de correo / Vacaciones +manage folders common es-es Administrar carpetas +manage sieve common es-es Administrar scripts Sieve +manage signatures felamimail es-es Administrar firmas +mark as deleted felamimail es-es Marcar como borrado +mark messages as felamimail es-es Marcar mensajes seleccionados como +mark selected as flagged felamimail es-es Marcar la selección como para descargar +mark selected as read felamimail es-es Marcar la selección como leído +mark selected as unflagged felamimail es-es Marcar la selección como para no descargar +mark selected as unread felamimail es-es Marcar la selección como no leído +match felamimail es-es Coincidencia +matches felamimail es-es coincide +matches regexp felamimail es-es coincide con la expresión +max uploadsize felamimail es-es tamaño máximo de subida +message highlighting felamimail es-es Resaltado del mensaje +message list felamimail es-es Lista de mensajes +messages felamimail es-es mensajes +mon felamimail es-es Lun +move felamimail es-es mover +move folder felamimail es-es mover carpeta +move messages felamimail es-es mover mensajes +move messages? felamimail es-es ¿Mover mensajes? +move to felamimail es-es mover los seleccionados a +move to trash felamimail es-es Mover a la papelera +moving messages to felamimail es-es mover mensajes a +name felamimail es-es Nombre +never display html emails felamimail es-es Nunca mostar los correos en HTML +new common es-es Nuevo +new filter felamimail es-es Nuevo filtro +next felamimail es-es Siguiente +next message felamimail es-es Mensaje siguiente +no active imap server found!! felamimail es-es ¡No se encontró ningún servidor IMAP activo! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail es-es No se ha suministrado dirección para el campo A/CC/CCO, ni carpeta donde guardar el mensaje. +no encryption felamimail es-es Sin cifrar +no filter felamimail es-es Sin filtro +no folders felamimail es-es no hay carpetas +no folders found felamimail es-es No se encontraron carpetas +no folders were found to subscribe to! felamimail es-es No se encontraron carpetas a las que suscribirse +no folders were found to unsubscribe from! felamimail es-es No se encontraron carpetas de las que desuscribirse +no highlighting is defined felamimail es-es No se definió un resaltado +no imap server host configured!! felamimail es-es ¡No se ha configurado un servidor IMAP! +no message returned. felamimail es-es No se devolvió ningún mensaje. +no messages found... felamimail es-es no se encontraron mensajes... +no messages selected, or lost selection. changing to folder felamimail es-es No hay mensajes seleccionados, o se ha perdido la selección. Cambiando a la carpeta +no messages were selected. felamimail es-es No se seleccionaron mensajes +no plain text part found felamimail es-es No se encontró ninguna parte con texto sencillo +no previous message felamimail es-es No hay mensaje anterior +no recipient address given! felamimail es-es ¡No se han indicado destinatarios! +no signature felamimail es-es sin firma +no stationery felamimail es-es sin material preimpreso +no subject given! felamimail es-es ¡No se ha indicado un asunto! +no supported imap authentication method could be found. felamimail es-es No se pudo encontrar ningún método de identificación IMAP +no valid data to create mailprofile!! felamimail es-es ¡No hay datos válidos para crear el perfil de correo! +no valid emailprofile selected!! felamimail es-es No se ha seleccionado un perfil de correo válido +none felamimail es-es ninguno +none, create all felamimail es-es ninguno, crear todo +not allowed felamimail es-es no permitido +notify when new mails arrive on these folders felamimail es-es notificar cuando lleguen mensajes nuevos a estas carpetas +on felamimail es-es en +on behalf of felamimail es-es en nombre de +one address is not valid felamimail es-es Una dirección no es válida +only inbox felamimail es-es Sólo la Bandeja de entrada +only one window felamimail es-es sólo una ventana +only unseen felamimail es-es Sólo los no vistos +open all felamimail es-es abrir todas +options felamimail es-es Opciones +or felamimail es-es o +or configure an valid imap server connection using the manage accounts/identities preference in the sidebox menu. felamimail es-es o configurar una conexión a un servidor IMAP válido usando la preferencia de Gestionar cuentas/identidades en el menú lateral. +organisation felamimail es-es Organización +organization felamimail es-es Organización +organization name admin es-es Nombre de la organización +original message felamimail es-es mensaje original +outgoing mail server(smtp) felamimail es-es servidor de correo de salida (SMTP) +participants felamimail es-es Participantes +personal information felamimail es-es Información personal +please ask the administrator to correct the emailadmin imap server settings for you. felamimail es-es Por favor, solicite al administrador que corrija la configuración del servidor IMAP. +please configure access to an existing individual imap account. felamimail es-es por favor, configure el acceso a una cuenta individual IMAP. +please select a address felamimail es-es Por favor, seleccione una dirección +please select the number of days to wait between responses felamimail es-es Por favor, seleccione el número de días a esperar entre las respuestas +please supply the message to send with auto-responses felamimail es-es Por favor, indique el mensaje a enviar para respuestas automáticas +port felamimail es-es puerto +posting felamimail es-es enviar +previous felamimail es-es Anterior +previous message felamimail es-es Mensaje anterior +print it felamimail es-es Imprimirlo +print this page felamimail es-es Imprimir esta página +printview felamimail es-es vista de impresión +quicksearch felamimail es-es Búsqueda rápida +read felamimail es-es leídos +reading felamimail es-es leyendo +receive notification felamimail es-es Recibir notificación +recent felamimail es-es reciente(s) +refresh time in minutes felamimail es-es Tiempo de refresco en minutos +reject with felamimail es-es rechazar con +remove felamimail es-es eliminar +remove immediately felamimail es-es Eliminar inmediatamente +rename felamimail es-es Renombrar +rename a folder felamimail es-es Renombrar una carpeta +rename folder felamimail es-es Renombrar carpeta +renamed successfully! felamimail es-es Renombrado correctamente +replied felamimail es-es respondido +reply felamimail es-es Responder +reply all felamimail es-es Responder a todos +reply to felamimail es-es Responder A +replyto felamimail es-es Responder A +respond felamimail es-es Responder +respond to mail sent to felamimail es-es Responder al correo enviado a +return felamimail es-es Volver +return to options page felamimail es-es Volver a la página de opciones +right felamimail es-es Derecha +row order style felamimail es-es estilo de ordenar filas +rule felamimail es-es Regla +sat felamimail es-es Sab +save felamimail es-es Guardar +save all felamimail es-es Guardar todo +save as draft felamimail es-es guardar como borrador +save as infolog felamimail es-es guardar como registro de notas y tareas +save changes felamimail es-es guardar cambios +save message to disk felamimail es-es Guardar mensaje en el disco +script name felamimail es-es nombre del script +script status felamimail es-es estado del script +search felamimail es-es Buscar +search for felamimail es-es Buscar +select felamimail es-es Seleccionar +select all felamimail es-es Seleccionar todo +select emailprofile felamimail es-es Seleccionar perfil de correo +select folder felamimail es-es seleccionar carpeta +select your mail server type admin es-es Seleccionar el tipo de servidor de correo +send felamimail es-es Enviar +send a reject message felamimail es-es enviar un mensaje de rechazo +sent felamimail es-es Enviados +sent folder felamimail es-es Carpeta de enviados +server supports mailfilter(sieve) felamimail es-es El servidor soporta filtro de correo (sieve) +set as default felamimail es-es Establecer como predeterminado +show all folders (subscribed and unsubscribed) in main screen folder pane felamimail es-es mostrar todas las carpetas (suscritas Y no suscritas) en la pantalla principal +show header felamimail es-es mostrar cabecera +show new messages on main screen felamimail es-es Mostrar mensajes nuevos en la pantalla principal +sieve script name felamimail es-es nombre del script sieve +sieve settings admin es-es Configuración de Sieve +signatur felamimail es-es Firma +signature felamimail es-es Firma +simply click the target-folder felamimail es-es Simplemente pulse en la carpeta destino +size felamimail es-es Tamaño +size of editor window felamimail es-es Tamaño de la ventana del editor +size(...->0) felamimail es-es Tamaño (...->0) +size(0->...) felamimail es-es Tamaño (0->...) +skipping forward felamimail es-es saltando el siguiente +skipping previous felamimail es-es saltando el anterior +small view felamimail es-es Vista reducida +smtp settings admin es-es Opciones SMTP +start new messages with mime type plain/text or html? felamimail es-es ¿Comenzar nuevos mensajes con el tipo MIME plain/text o html? +stationery felamimail es-es material preimpreso +subject felamimail es-es Asunto +subject(a->z) felamimail es-es Asunto (A->Z) +subject(z->a) felamimail es-es Asunto (Z->A) +submit felamimail es-es Enviar +subscribe felamimail es-es Suscribirse +subscribed felamimail es-es Suscrito +subscribed successfully! felamimail es-es Suscripción correcta +sun felamimail es-es Dom +system signature felamimail es-es firma del sistema +table of contents felamimail es-es Tabla de contenidos +template folder felamimail es-es Carpeta de plantillas +templates felamimail es-es Plantillas +text only felamimail es-es Sólo texto +text/plain felamimail es-es text/plain +the action will be applied to all messages of the current folder.ndo you want to proceed? felamimail es-es La acción se aplicará a todos los mensajes de la carpeta actual.\n¿Desea continuar? +the connection to the imap server failed!! felamimail es-es ¡Ha fallado la conexión con el servidor IMAP! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail es-es El servidor IMAP no parece que soporte el método de identificación seleccionado. Por favor, póngase en contacto con su administrador del sistema. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail es-es El remitente del mensaje ha solicitado una respuesta para indicar que usted ha leído este mensaje. ¿Desea enviar una confirmación? +the mimeparser can not parse this message. felamimail es-es El intérprete mime no puede interpretar este mensaje +then felamimail es-es ENTONCES +there is no imap server configured. felamimail es-es No se ha configurado un servidor IMAP. +this folder is empty felamimail es-es ESTA CARPETA ESTA VACIA +this php has no imap support compiled in!! felamimail es-es ¡Esta instalación de PHP no tiene soporte IMAP! +thu felamimail es-es Jue +to felamimail es-es Para +to mail sent to felamimail es-es al correo enviado a +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail es-es Para usar una conexión TLS, debe estar ejecutando una versión de PHP 5.1.0 o superior. +translation preferences felamimail es-es Preferencias de la traducción +translation server felamimail es-es Servidor de traducciones +trash felamimail es-es Papelera +trash fold felamimail es-es Carpeta Papelera +trash folder felamimail es-es Carpeta Papelera +tue felamimail es-es Mar +type felamimail es-es tipo +unexpected response from server to authenticate command. felamimail es-es Respuesta inesperada del servidor al comando AUTHENTICATE. +unexpected response from server to digest-md5 response. felamimail es-es Respuesta inesperada del servidor a la respuesta Digest-MD5. +unexpected response from server to login command. felamimail es-es Respuesta inesperada del servidor al comando LOGIN. +unflagged felamimail es-es Sin marcar +unknown err felamimail es-es Error desconocido +unknown error felamimail es-es Error desconocido +unknown imap response from the server. server responded: %s felamimail es-es Respuesta IMAP desconocida del servidor. El servidor respondió: %s +unknown sender felamimail es-es Remitente desconocido +unknown user or password incorrect. felamimail es-es Usuario desconocido o contraseña incorrecta +unread common es-es No leído +unseen felamimail es-es No vistos +unselect all felamimail es-es Deseleccionar todo +unsubscribe felamimail es-es Desuscribir +unsubscribed felamimail es-es No suscrito +unsubscribed successfully! felamimail es-es Desuscripción correcta +up felamimail es-es arriba +updating message status felamimail es-es actualizando estado del mensaje +updating view felamimail es-es Actualizando la vista +use emailadmin to create profiles felamimail es-es use EmailAdmin para crear perfiles +use a signature felamimail es-es Usar una firma +use a signature? felamimail es-es ¿Usar una firma? +use addresses felamimail es-es Usar direcciones +use custom identities felamimail es-es usar identidades personalizadas +use custom settings felamimail es-es Usar opciones personalizadas +use regular expressions felamimail es-es usar expresiones regulares +use smtp auth admin es-es Usar identificación SMTP +users can define their own emailaccounts admin es-es Los usuarios pueden definir sus propias cuentas de correo +vacation notice common es-es aviso de vacaciones +vacation notice is active felamimail es-es El aviso de vacaciones está activo +vacation start-date must be before the end-date! felamimail es-es ¡La fecha de inicio de las vacaciones debe ser ANTES de la fecha de fin! +validate certificate felamimail es-es validar certificado +view full header felamimail es-es Ver la cabecera completa +view header lines felamimail es-es Ver líneas del encabezado +view message felamimail es-es Ver mensaje +viewing full header felamimail es-es Viendo la cabecera completa +viewing message felamimail es-es Viendo mensaje +viewing messages felamimail es-es Viendo mensajes +wed felamimail es-es Mié +when deleting messages felamimail es-es Al borrar mensajes +which folders (additional to the sent folder) should be displayed using the sent folder view schema felamimail es-es qué carpetas (además de la de Enviados) debe mostrarse usando el equema de la vista de Enviados +which folders - in general - should not be automatically created, if not existing felamimail es-es qué carpetas, en general, NO deben crearse automáticamente si no existen +with message felamimail es-es con mensaje +with message "%1" felamimail es-es con mensaje "%1" +wrap incoming text at felamimail es-es Ajustar el texto entrante a +writing felamimail es-es escribiendo +wrote felamimail es-es escribió +yes, offer copy option felamimail es-es sí, ofrecer la opción de copiar +you can use %1 for the above start-date and %2 for the end-date. felamimail es-es Puede usar %1 para la fecha de inicio de arriba y %2 para la fecha de fin. +you have received a new message on the felamimail es-es Ha recibido un mensaje nuevo en la +your message to %1 was displayed. felamimail es-es Su mensaje para %1 ha sido mostrado diff --git a/felamimail/lang/egw_et.lang b/felamimail/lang/egw_et.lang new file mode 100755 index 0000000000..e72c9f965a --- /dev/null +++ b/felamimail/lang/egw_et.lang @@ -0,0 +1,187 @@ +(unknown sender) felamimail et (tundmatu saatja) +activate felamimail et Aktiveeri +activate script felamimail et Aktiveeri skript +add address felamimail et Lisa aadress +add script felamimail et Lisa skript +all address books felamimail et Kõik Aadressi raamatud +all folders felamimail et Kõik Kaustad +all of felamimail et kõik välja +always show html emails felamimail et Alati näita HTML emaile +and felamimail et ja +any status felamimail et kõik staatused +back to folder felamimail et Tagasi kausta +bad login name or password. felamimail et Vale kasutajanimi või parool +change folder felamimail et Muuda kausta +close all felamimail et sule kõik +close this page felamimail et sulge see leht +close window felamimail et Sulge aken +color felamimail et Värv +configuration felamimail et Konfiguratsioon +contains felamimail et sisaldab +date(newest first) felamimail et Kuupäev (uuemad enne) +date(oldest first) felamimail et Kuupäev (vanemad enne) +default felamimail et vaikimisi +default sorting order felamimail et Vaikimisi sorteerimise järjekord +delete all felamimail et kustuta kõik +delete folder felamimail et Kustuta kaust +delete script felamimail et kustuta skript +delete selected felamimail et Kustuta valitud +delete selected messages felamimail et kustuta valitud teated +deleted felamimail et kustutatud +deleted folder successfully! felamimail et Kaust kustutatud täielikult! +deleting messages felamimail et kustutan kirjad +disable felamimail et Keela +discard felamimail et unusta +discard message felamimail et unusta kirjad +display message in new window felamimail et Näita kirju uues aknas +display messages in multiple windows felamimail et Näita kirju mitmes aknas +display of html emails felamimail et Näita HTML emaile +display only when no plain text is available felamimail et Näita ainult kui plain tekst pole saadaval +display preferences felamimail et Näita Eelistusi +displaying html messages is disabled felamimail et html kirjade näitamine on välja lülitatud +do it! felamimail et tee seda! +do not use sent felamimail et Ära kasuta Sent +do not use trash felamimail et Ära kasuta Trash +do not validate certificate felamimail et ära valideeri sertifikaati +do you really want to delete the '%1' folder? felamimail et Tahad tõesti kustutada '%1' kaust? +do you really want to delete the selected signatures? felamimail et Tahad tõesti kustutada valitud signatuurid? +does not contain felamimail et ei sisalda +don't use sent felamimail et Ära kasuta Sent +don't use trash felamimail et Ära kasuta Trash +down felamimail et alla +download felamimail et lae alla +download this as a file felamimail et Lae see alla kui fail +e-mail felamimail et E-Mail +e-mail address felamimail et E-Mail aadress +e-mail folders felamimail et E-Mail Kaustad +edit email forwarding address felamimail et edit emaili edasisaatmise aadressi +edit filter felamimail et Muuda filtrit +edit selected felamimail et Muuda valitut +email address felamimail et E-Mail Aadress +email forwarding address felamimail et email edasisaatmise aadress +empty trash felamimail et tühjenda prügi +enable felamimail et luba +encrypted connection felamimail et krüpteeritud ühendus +error felamimail et VIGA +error opening felamimail et Viga avamisel +every felamimail et iga +extended felamimail et laiendatud +file into felamimail et faili info +files felamimail et failid +filter active felamimail et filter aktiivne +filter name felamimail et Filtri nimi +first name felamimail et Eesnimi +flags felamimail et Lipud +folder name felamimail et Kausta nimi +folder path felamimail et Kausta Teekond +folder preferences felamimail et Kausta Eelistused +folder settings felamimail et Kausta setingud +folder status felamimail et Kausta staatus +folderlist felamimail et Kausta nimekiri +foldername felamimail et Kausta nimi +folders felamimail et Kaustad +folders created successfully! felamimail et Kaustad tehtud täielikult! +forward felamimail et Edasi +fri felamimail et Re +full name felamimail et Täis nimi +icons only felamimail et Ikoonid ainult +if felamimail et KUI +illegal folder name. please select a different name. felamimail et Lubamatu kaustanimi. Palun vali uus. +imap felamimail et IMAP +imap server felamimail et IMAP Server +imap server address felamimail et IMAP Serveri Aadress +imap server closed the connection. felamimail et IMAP server sulges ühenduse. +imap server closed the connection. server responded: %s felamimail et IMAP Server sulges ühenduse. Server Vastas: %s +imap server password felamimail et imap serveri parool +imap server type felamimail et IMAP Serveri tüüp +imap server username felamimail et imap serveri kasutajanimi +imaps authentication felamimail et IMAPS Audentimine +imaps encryption only felamimail et IMAPS Krüpteering ainult +in felamimail et sisse +incoming mail server(imap) felamimail et Sissetuleva meili server(IMAP) +invalid user name or password felamimail et vale kasutaja või parool +language felamimail et Keel +last name felamimail et perekonnanimi +left felamimail et Vasak +less felamimail et vähem +less than felamimail et vähem kui +mail server login type admin et Mail serveri logimise tüüp +mail settings felamimail et Mail setingud +manage emailaccounts preferences et Manageeri Emailkontosid +manage folders common et Manageeri Kaustu +manage signatures felamimail et Manageeri Signatuure +mark as deleted felamimail et Märgi kui kustutatud +mark messages as felamimail et Märgi valitud kirjad kui +mark selected as flagged felamimail et Märgi valitud kui flagged +mark selected as read felamimail et Märgi valitud kui loetud +mark selected as unflagged felamimail et Märgi valitud kui unflagged +mark selected as unread felamimail et Märgi valitud kui lugematta +messages felamimail et kirjad +mon felamimail et Esm +move felamimail et liiguta +move messages felamimail et liiguta kirjad +move to trash felamimail et Liiguta trash-i +name felamimail et Nimi +never display html emails felamimail et Ära näita kunagi HTML emaile +new common et Uus +new filter felamimail et Uus filter +next felamimail et Järgmine +next message felamimail et järgmine kiri +no active imap server found!! felamimail et Aktiivset IMAP serverit ei leitud !! +no folders found felamimail et Kaustu ei leitud +no signature felamimail et pole signatuuri +only inbox felamimail et Ainult INBOX +only one window felamimail et ainult üks aken +only unseen felamimail et Ainult nägematta +open all felamimail et ava kõik +or felamimail et või +organisation felamimail et organisatsioon +personal information felamimail et Personaalne informatsioon +please select a address felamimail et Palun vali aadress +port felamimail et port +posting felamimail et postitan +previous felamimail et Eelmine +previous message felamimail et eelmine teade +print it felamimail et prindi see +print this page felamimail et prindi see leht +quicksearch felamimail et Kiirotsing +read felamimail et loetud +reading felamimail et loen +recent felamimail et hiljutised +refresh time in minutes felamimail et Värkendamise aeg minutites +remove felamimail et eemalda +remove immediately felamimail et Eemalda koheselt! +rename felamimail et Nimeta ümber +replied felamimail et vastatud +reply felamimail et Vasta +save felamimail et Salvesta +save changes felamimail et Salvesta muudatused +script name felamimail et skripti nimi +script status felamimail et scripti staatus +search felamimail et Otsi +select felamimail et Vali +select all felamimail et Vali Kõik +select emailprofile felamimail et Vali Email Profiil +select folder felamimail et vali kaust +select your mail server type admin et Vali mailiserveri tüüp +send felamimail et Saada +size(...->0) felamimail et Suurus (...->0) +size(0->...) felamimail et Suurus (0->...) +text only felamimail et Tekst ainult +the connection to the imap server failed!! felamimail et Ühendus IMAP Serveriga ebaõnnestus!! +this folder is empty felamimail et SEE KAUST ON TÜHI +trash folder felamimail et Trash Kaust +unknown error felamimail et Tundmatu vida +unknown sender felamimail et Tundmatu saatja +unknown user or password incorrect. felamimail et Tundmatu kasutaja või vale parool. +unread common et lugematta +unseen felamimail et Nägematta +up felamimail et üles +updating view felamimail et uuendan vaadet +use a signature felamimail et Kasuta signatuuri +use a signature? felamimail et Kasuta signatuuri ? +use addresses felamimail et Kasuta Aadresse +view message felamimail et Vaata teadet +viewing message felamimail et Näitan kirja +viewing messages felamimail et Näitan kirju +writing felamimail et Kirjutan diff --git a/felamimail/lang/egw_eu.lang b/felamimail/lang/egw_eu.lang new file mode 100644 index 0000000000..f0be57dac9 --- /dev/null +++ b/felamimail/lang/egw_eu.lang @@ -0,0 +1,352 @@ +(no subject) felamimail eu (gai gabe) +(only cc/bcc) felamimail eu (bakarrik kopia/kopia izkutua) +(unknown sender) felamimail eu (bidaltzaile ezezaguna) +activate felamimail eu Aktibatu +activate script felamimail eu Script-a aktibatu +add acl felamimail eu acl gehitu +add address felamimail eu Helbidea gehitu +add rule felamimail eu Erregela gehitu +add script felamimail eu Script bat gehitu +add to %1 felamimail eu gehitu %1 -i +add to address book felamimail eu Gehitu kontaktu agendara +add to addressbook felamimail eu gehitu kontaktu agendara +adding file to message. please wait! felamimail eu Fitxategia mezura atxikitzen ari da. Itxaron mesedez! +additional info felamimail eu Informazio gehiago +address book felamimail eu Kontaktu agenda +address book search felamimail eu Bilatu kontaktu agedan +after message body felamimail eu Mezuaren gorputzaren ondoren +all address books felamimail eu Kontaktu agenda guztiak +all folders felamimail eu Karpeta guztiak +all of felamimail eu guztiak +allways a new window felamimail eu beti leiho berri bat +always show html emails felamimail eu Betik erakutsi HTML formatuan emailak +and felamimail eu eta +any of felamimail eu batekin +anyone felamimail eu Edozein +as a subfolder of felamimail eu Barne karpeta gisa +attachments felamimail eu Atxikiak +authentication required felamimail eu Autentifikazioa behar da +auto refresh folder list felamimail eu Berritu karpeta lista +back to folder felamimail eu Itzuli karpetara +bad login name or password. felamimail eu Izen edo pasahitz okerra +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail eu ezarritako kriterioen arabera erakutzia. Mezuak kolore ezberdinak izan ditzake. Hau mezua nondik datorren garbiago ikusteko erabiltzen da, bereziki email listetarako. +bcc felamimail eu Kopia izkutua +before headers felamimail eu Goiburuen aurretik +between headers and message body felamimail eu Mezuaren buru eta gorputzaren artean +body part felamimail eu emailaren gorputza +can't connect to inbox!! felamimail eu Ezin Sarrera karpetara konektatu!! +cc felamimail eu Kopia +change folder felamimail eu Karpeta aldatu +checkbox felamimail eu Kontrol-laukia +click here to log back in. felamimail eu Klikatu hemen berriz sartzeko +click here to return to %1 felamimail eu Klikatu hemen %1 -era bueltatzeko +close all felamimail eu Guztia itxi +close this page felamimail eu Orri hau itxi +close window felamimail eu Leihoa itxi +color felamimail eu Kolorea +compose felamimail eu Idatzi +compress folder felamimail eu Karpeta konprimatu +condition felamimail eu baldintza +configuration felamimail eu Konfigurazioa +contains felamimail eu dauka +create felamimail eu Sortu +create folder felamimail eu Karpeta sortu +create sent felamimail eu Bidalitakoen karpeta sortu +create subfolder felamimail eu Barne karpeta sortu +create trash felamimail eu Zakar karpeta sortu +created folder successfully! felamimail eu Karpeta arrakastaz sortua +dark blue felamimail eu Urdin iluna +dark cyan felamimail eu Cyan iluna +dark gray felamimail eu Gris iluna +dark green felamimail eu Berde iluna +dark magenta felamimail eu Magenda iluna +dark yellow felamimail eu Ori iluna +date(newest first) felamimail eu Data (berriak lehenik) +date(oldest first) felamimail eu Data (Zaharrak lehenik) +days felamimail eu egunak +deactivate script felamimail eu Script-a ezgaitu +default sorting order felamimail eu sailkapen lehenetsia +delete all felamimail eu Dena ezabatu +delete folder felamimail eu Karpeta ezabatu +delete script felamimail eu ezabatu script-a +delete selected felamimail eu Ezabatu hautaturikoa +delete selected messages felamimail eu Ezabatu hautaturiko mezuak +deleted felamimail eu Ezabatua +deleted folder successfully! felamimail eu Karpeta arrakastaz ezabatua +deleting messages felamimail eu Mezuak ezabatzen +disable felamimail eu Ezgaitu +discard felamimail eu baztertu +discard message felamimail eu mezua baztertu +display message in new window felamimail eu mezua lehio berri batean erakutzi +display of html emails felamimail eu HTML emailak erakutzi +display only when no plain text is available felamimail eu Erakutsi soilik testu sinpleko bertsiorik ez denean +display preferences felamimail eu Erakutsi lehentasunak +do it! felamimail eu Egin! +do not use sent felamimail eu Ez erabili Bidalitakoak karpeta +do not use trash felamimail eu Ez erabili Zakarra karpeta +do you really want to delete the '%1' folder? felamimail eu Ziur zaude '%1' karpeta ezabatu nahi duzula? +does not contain felamimail eu ez da agertzen +does not match felamimail eu ez du parekatzen +does not match regexp felamimail eu ez du parekatzen regexp +don't use sent felamimail eu Ez erabili Bidalitakoak karpeta +don't use trash felamimail eu Ez erabili Zakarra karpeta +down felamimail eu behea +download felamimail eu deskargatu +download this as a file felamimail eu artxibo gisa deskargatu +e-mail felamimail eu E-Posta elektronikoa +e-mail address felamimail eu E-Posta helbidea +e-mail folders felamimail eu E-Posta karpetak +edit filter felamimail eu Iragazkia aldatu +edit rule felamimail eu erregela aldatu +edit selected felamimail eu hautatua aldatu +edit vacation settings felamimail eu oporrent lehentasunak aldatu +email address felamimail eu E-Posta helbidea +email signature felamimail eu E-Posta sinadura +emailaddress felamimail eu helbide elektronikoa +empty trash felamimail eu Zakarra hutsik +enable felamimail eu indarrean jarri +encrypted connection felamimail eu konexioa enkriptatua +enter your default mail domain ( from: user@domain ) admin eu Sartu zure oinarrizko posta domeinua (From: erabiltzailea@domeinua) +enter your imap mail server hostname or ip address admin eu Sartu zure IMAP posta zerbitzariaren ostalari-izena (hostname) edo IP helbidea +enter your sieve server hostname or ip address admin eu Sartu zure SIEVE zerbitzariaren ostalari-izena (hostname) edo IP helbidea +enter your sieve server port admin eu Sartu zure SIEVE zerbitzariaren portu-zenbakia +enter your smtp server hostname or ip address admin eu Sartu zure SMTP zerbitzariaren ostalari-izena (hostname) edo IP helbidea +enter your smtp server port admin eu Sartu zure SMTP zerbitzariaren portu-zenbakia +error felamimail eu ERROREA +error connecting to imap serv felamimail eu IMAP zerbitzariarekin konektatzerakoan errorea +error opening felamimail eu Errorea irekitzean +every felamimail eu guztiak +every %1 days felamimail eu guztiak %1 egunetan +expunge felamimail eu Deuseztu +extended felamimail eu hedatua +felamimail common eu Posta +file into felamimail eu Filtroa +files felamimail eu artxiboak +filter active felamimail eu Filtro aktiboa +filter name felamimail eu Filtroaren izena +filter rules felamimail eu Filtratzeko erregelak +first name felamimail eu Lehen izena +flagged felamimail eu Bandera du +flags felamimail eu Banderak +folder acl felamimail eu Karpetaren ACL-ak +folder name felamimail eu Karpeta izena +folder path felamimail eu Karpetaren bidea +folder preferences felamimail eu Karpetaren preferentziak +folder settings felamimail eu Karpeta ezarpenak +folder status felamimail eu Karpetaren egoera +folderlist felamimail eu Karpeta zerrenda +foldername felamimail eu Karpetaren izena +folders felamimail eu Karpetak +folders created successfully! felamimail eu Karpeta arrakastaz sortua! +follow felamimail eu Jarraitu +for mail to be send - not functional yet felamimail eu Bidali beharreko e-Postentzat - ez erabilgarri oraindik +for received mail felamimail eu Jasotako e-Postarentzat +forward felamimail eu Birbidali +forward to felamimail eu Birbidali hona +forward to address felamimail eu Birbidali helbide honetara +found felamimail eu Aurkitua +fri felamimail eu Ostirala +from felamimail eu Nork +from(a->z) felamimail eu Nork (A->Z) +from(z->a) felamimail eu Nork (Z->A) +full name felamimail eu Izen Abizenak +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail eu Begiratu ondorengo helbidean www.felamimail.org Squirrelmailaren inguruan informazio gehiago izateko.
    +header lines felamimail eu Goiburua +hide header felamimail eu Goiburua ezkutatu +html felamimail eu HTML +icons and text felamimail eu Ikonoak eta testuak +icons only felamimail eu Ikonoak soilik +identifying name felamimail eu Izena identifikatzen +identity felamimail eu identitate +if felamimail eu baldin +illegal folder name. please select a different name. felamimail eu Karpeta izen desegokia. Mesedez hautatu izen ezberdin bat. +imap felamimail eu IMAP +imap server felamimail eu IMAP Zerbitzaria +imap server address felamimail eu IMAP Zerbitzariaren helbidea +imap server closed the connection. felamimail eu IMAP zerbitzariak konexioa itxi du +imap server password felamimail eu imap zerbitzariko pasahitza +imap server type felamimail eu IMAP Zerbitzari tipoa +imap server username felamimail eu imap zerbitzariko erabiltzaile izena +imaps authentication felamimail eu IMAPS Autentifikazioa +imaps encryption only felamimail eu IMAPS Enkripzioa soilik +in felamimail eu barne +index order felamimail eu Indize ordena +info felamimail eu Informazioa +invalid user name or password felamimail eu Erabiltzaile edo pasahitz okerra +javascript felamimail eu JavaScript +language felamimail eu Hizkuntza +last name felamimail eu Abizena +left felamimail eu Ezkerra +less felamimail eu Gutxiago +light gray felamimail eu Gris argia +list all felamimail eu Guztiak zerrendatu +loading felamimail eu kargatzen +location of buttons when composing felamimail eu Botoien posizioa idazterakoan +mail server login type admin eu E-Posta zerbitzarian saioa hasteko era +mail settings felamimail eu E-Posta lehentasunak +mainmessage felamimail eu Mezu nagusia +manage folders common eu Karpetak kudeatu +manage sieve common eu Kudeatu Sieve Script-a +mark as deleted felamimail eu Guztiak ezabatzeko hautatu +mark messages as felamimail eu Hautatu mezua +mark selected as flagged felamimail eu Hautatutakoari bandera jarri +mark selected as read felamimail eu Hautatutakoa irakurrita bezala +mark selected as unflagged felamimail eu Hautatutakoari bandera kendu +mark selected as unread felamimail eu Hautatutakoa irakurri gabe bezala +match felamimail eu Parekatu +matches felamimail eu Parekatuak +matches regexp felamimail eu Regexp parekatuak +message highlighting felamimail eu Mezua nabaritu +message list felamimail eu Mezu zerrenda +messages felamimail eu mezuak +mon felamimail eu Astelehena +move felamimail eu mugitu +move messages felamimail eu mugitu mezuak +move to felamimail eu mugitu hautatuak +move to trash felamimail eu Mugitu Zakarra karpetara +moving messages to felamimail eu mezua mugitu hona +name felamimail eu Izena +never display html emails felamimail eu Inoiz ez bistaratu HTML emailak +new common eu Berria +new filter felamimail eu Iragazki berria +next felamimail eu Hurrengoa +next message felamimail eu hurrengo mezua +no filter felamimail eu Iragazki gabe +no folders found felamimail eu Ez da karpetarik aurkitu +no folders were found to subscribe to! felamimail eu Ez da harpidedun egiteko karpetarik aurkitu! +no folders were found to unsubscribe from! felamimail eu Ez da harpidedun izateari uzteko karpetarik aurkitu! +no highlighting is defined felamimail eu Ez dago mezu nabariturik definituta +no message returned. felamimail eu Ez da mezurik itzuli +no messages found... felamimail eu ez da mezurik aurkitu... +no messages were selected. felamimail eu Ez da mezurik hautatu. +no previous message felamimail eu ez dago aurreko mezurik +no valid emailprofile selected!! felamimail eu posta elektroniko profil egokirik hautatu gabe! +none felamimail eu bat ere ez +on behalf of felamimail eu kontura +one address is not valid felamimail eu Helbideetako baten formatua okerra da +only inbox felamimail eu Sarrerako ontzia bakarrik +only one window felamimail eu leiho bat bakarrik +only unseen felamimail eu Ikusi gabeak bakarrik +open all felamimail eu guztiak ireki +options felamimail eu Aukerak +organisation felamimail eu erakundea +organization felamimail eu erakundea +organization name admin eu Erakundearen izena +participants felamimail eu Partaideak +personal information felamimail eu Informazio pertsonala +please select a address felamimail eu Mesedez hautatu helbide da +please select the number of days to wait between responses felamimail eu Mesedez hautatu erantzunen artean itxaron beharreko tartea +please supply the message to send with auto-responses felamimail eu Sar ezazu erantzun automatikoetan bidali beharreko mezua +port felamimail eu ataka +posting felamimail eu bidalketa +previous felamimail eu Aurrekoa +previous message felamimail eu aurreko mezua +print it felamimail eu inprimatu +print this page felamimail eu inprimatu orri hau +quicksearch felamimail eu Bilaketa azkarra +read felamimail eu irakurria +reading felamimail eu irakurtzen +recent felamimail eu berria +refresh time in minutes felamimail eu Eguneratze denbora tartea minututan +remove felamimail eu ezabatu +remove immediately felamimail eu ezabatu bat batean +rename felamimail eu Izena aldatu +rename a folder felamimail eu Karpeta baten izena aldatu +rename folder felamimail eu Karpeta izena aldatu +renamed successfully! felamimail eu Izena aldatua izan da +replied felamimail eu erantzunda +reply felamimail eu Erantzun +reply all felamimail eu Erantzun guztiei +reply to felamimail eu Erantzun +replyto felamimail eu Erantzun +respond felamimail eu Erantzun +respond to mail sent to felamimail eu Erantzun nori bidalitako emailari +return felamimail eu Itzuli +return to options page felamimail eu Itzuli aukeren orrialdera +right felamimail eu Zuzen +rule felamimail eu Erregela +sat felamimail eu Larunbata +save felamimail eu Gorde +save changes felamimail eu aldaketak gorde +script name felamimail eu scriptaren izena +script status felamimail eu scriptaren egoera +search felamimail eu Bilatu +search for felamimail eu Bilatu +select felamimail eu Hautatu +select all felamimail eu Guztiak hautatu +select emailprofile felamimail eu Posta profila hautatu +select folder felamimail eu Karpeta hautatu +select your mail server type admin eu Hautatu zure posta zerbitzari mota +send felamimail eu Bidali +send a reject message felamimail eu bidali eta hautatu mezua +sent folder felamimail eu Bidalitakoen karpeta +show header felamimail eu bistaratu goiburuak +show new messages on main screen felamimail eu Erakutzi posta berria lehendabizio pantailan +sieve settings admin eu SIEVE ren lehentasunak +signature felamimail eu Sinadura +simply click the target-folder felamimail eu hautatu non gorde nahi duzun karpeta zerrendan +size felamimail eu Tamainua +size of editor window felamimail eu Edizio leihoaren tamainua +size(...->0) felamimail eu Tamainua (...->0) +size(0->...) felamimail eu Tamainua (0->...) +small view felamimail eu ikuspegi txikia +smtp settings admin eu SMTP lehentasunak +subject felamimail eu Gaia +subject(a->z) felamimail eu Gaia (A->Z) +subject(z->a) felamimail eu Gaia (Z->A) +submit felamimail eu Bidali +subscribe felamimail eu Harpidetu +subscribed felamimail eu Harpidetuta +subscribed successfully! felamimail eu Harpidetza burutua +sun felamimail eu Igandea +table of contents felamimail eu Edukien taula +text only felamimail eu Testua bakarrik +the connection to the imap server failed!! felamimail eu IMAP zerbitzariarekiko konexioak hutsegin du +then felamimail eu ORDUAN +this folder is empty felamimail eu KARPETA HAU UTZIK DAGO +this php has no imap support compiled in!! felamimail eu PHParendako IMAPa konpilatu gabe +thu felamimail eu Osteguna +to felamimail eu Nori +to mail sent to felamimail eu Nori bidalitako postari +translation preferences felamimail eu Itzulpenen lehentasunak +translation server felamimail eu Itzulpenen zerbitzaria +trash fold felamimail eu Zakar karpeta +trash folder felamimail eu Zakar karpeta +tue felamimail eu Asteartea +type felamimail eu mota +unflagged felamimail eu bandera gabea +unknown err felamimail eu errore ezezaguna +unknown error felamimail eu errore ezezaguna +unknown sender felamimail eu Bidaltzaile ezezaguna +unknown user or password incorrect. felamimail eu Erabiltzaile ezezaguna edo pasahitz okerra +unread common eu Irakurri gabea +unseen felamimail eu Ikusi gabea +unselect all felamimail eu Hautaketa guztiak kendu +unsubscribe felamimail eu Harpidetza kendu +unsubscribed felamimail eu Harpidetza kenduta +unsubscribed successfully! felamimail eu Harpidetza arrakastaz kenduta +up felamimail eu gora +use emailadmin to create profiles felamimail eu erabili EmailAdmin profilak sortzeko +use a signature felamimail eu Erabili sinadura +use a signature? felamimail eu Sinadura erabili? +use addresses felamimail eu Helbideak erabili +use custom settings felamimail eu Lehentasun hautatuak erabili +use javascript or html addressbook? felamimail eu Javascript edo HTML helbide liburua erabili? +use smtp auth admin eu SMTP autentifikazioa erabili +users can define their own emailaccounts admin eu Erabiltzaileek euren posta kontuak defini ditzazkete +vacation notice felamimail eu Opor abisua +validate certificate felamimail eu balioztatu ziurtagiria +view full header felamimail eu Goiburu osoak ikusi +view message felamimail eu Mezua ikusi +viewing full header felamimail eu Goiburu osoak ikusten +viewing message felamimail eu Mezua ikusten +viewing messages felamimail eu Mezuak ikusten +wed felamimail eu Asteazkena +welcome to %1's webmail system felamimail eu Ongietorri %1 webmail sistemara +when deleting messages felamimail eu Mezuak ezabatzerakoan +with message felamimail eu mezuarekin +with message "%1" felamimail eu %1 mezuarekin +wrap incoming text at felamimail eu Posta sarrerak bateratu +writing felamimail eu Idazten +wrote felamimail eu Idatzia +you must login first. felamimail eu Lehenbizi sisteman sartu beharra daukazu diff --git a/felamimail/lang/egw_fa.lang b/felamimail/lang/egw_fa.lang new file mode 100644 index 0000000000..f86e83de70 --- /dev/null +++ b/felamimail/lang/egw_fa.lang @@ -0,0 +1,351 @@ +(no subject) felamimail fa (بدون عنوان) +(only cc/bcc) felamimail fa (Ùقط رونوشت/رونوشت دوم) +(unknown sender) felamimail fa (Ùرستنده نامشخص) +activate felamimail fa Ùعال سازی +activate script felamimail fa اسکریپت Ùعال سازی +add address felamimail fa اÙزودن نشانی +add rule felamimail fa اÙزودن قانون +add script felamimail fa اÙزودن اسکریپت +add to %1 felamimail fa اÙزودن به %1 +add to address book felamimail fa اÙزودن به دÙترچه آدرس +add to addressbook felamimail fa اÙزودن به دÙترچه آدرس +additional info felamimail fa اطلاعات بیشتر +address book felamimail fa دÙترچه آدرس +address book search felamimail fa جستجوی دÙترچه آدرس +after message body felamimail fa پس از بدنه پیام +all address books felamimail fa همه دÙترچه آدرسها +all folders felamimail fa همه پوشه ها +all of felamimail fa همه +allways a new window felamimail fa همیشه پنجره جدید +always show html emails felamimail fa همیشه رایانامه های زنگام را نمایش بده +any of felamimail fa هرکدام از +anyone felamimail fa همه +as a subfolder of felamimail fa بعنوان زیر پوشه +attachments felamimail fa پیوندها +auto refresh folder list felamimail fa بازخوانی خودکار Ùهرست پوشه +back to folder felamimail fa بازگشت به پوشه +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail fa برپایه شاخصهای تعیین شده، پیامهای ورودی در Ùهرست پیامها Ù…ÛŒ توانند رنگهای پس زمینه متÙاوتی داشته باشند. این Ú©Ù…Ú© Ù…ÛŒ کند Ú©Ù‡ به راحتی پیامها از یکدیگر تشخیص داده شوند +bcc felamimail fa رونوشت دوم +before headers felamimail fa قبل از سرآیندها +between headers and message body felamimail fa بین سرآیندها Ùˆ بدنه پیام +body part felamimail fa قسمت بدنه +can't connect to inbox!! felamimail fa ناتوان از اتصال به صندوق ورودی!!! +cc felamimail fa رونوشت +change folder felamimail fa تغییر پوشه +check message against next rule also felamimail fa پیام را در مقابل قانون بعد هم بازرسی Ú©Ù† +checkbox felamimail fa جعبه انتخاب +click here to log back in. felamimail fa برای ورود مجدد اینجا کلیک کنید +click here to return to %1 felamimail fa برای بازگشت به %1 اینجا را کلیک کنید +close all felamimail fa بستن همه +close this page felamimail fa بستن این صÙحه +close window felamimail fa بستن پنجره +color felamimail fa رنگ +compose felamimail fa نامه جدید +compress folder felamimail fa Ùشرده سازی پوشه +configuration felamimail fa پیکربندی +contains felamimail fa شامل +could not add folder %1 (%2) !!! felamimail fa ناتوان از اÙزودن پوشه %1 (%2) !!! +could not delete folder %1 (%2) !!! felamimail fa ناتوان از حذ٠پوشه %1 (%2) !!! +could not rename folder %1 to %2 (%3) !!! felamimail fa ناتوان از تغییر نام پوشه %1 به %2 (%3) !!! +create felamimail fa ایجاد +create folder felamimail fa ایجاد پوشه +create sent felamimail fa ایجاد ارسال شده +create subfolder felamimail fa ایجاد زیر پوشه +create trash felamimail fa ایجاد بازیاÙت +created folder successfully! felamimail fa پوشه با موÙقیت ایجاد شد +custom felamimail fa سÙارشی +dark blue felamimail fa آبی تیره +dark cyan felamimail fa Ùیروزه ای تیره +dark gray felamimail fa خاکستری تیره +dark green felamimail fa سبز تیره +dark magenta felamimail fa بنÙØ´ تیره +dark yellow felamimail fa زرد تیره +date(newest first) felamimail fa تاریخ (جدیدها اول) +date(oldest first) felamimail fa تاریخ (قدیمی ها اول) +days felamimail fa روز +deactivate script felamimail fa غیرÙعال سازی اسکریپت +default sorting order felamimail fa ترتیب مرتب سازی پیش Ùرض +delete all felamimail fa حذ٠همه +delete folder felamimail fa حذ٠پوشه +delete script felamimail fa حذ٠اسکریپت +delete selected felamimail fa حذ٠انتخاب شده ها +delete selected messages felamimail fa حذ٠پیامهای انتخاب شده +deleted felamimail fa حذ٠شد +deleted folder successfully! felamimail fa پوشه با موÙقیت حذ٠شد! +disable felamimail fa غیر Ùعال +discard message felamimail fa نادیده گرÙتن پیام +display messages in multiple windows felamimail fa نمایش پیامها در چند پنجره +display of html emails felamimail fa نمایش رایانامه های زنگام +display only when no plain text is available felamimail fa نمایش Ùقط وقتی Ú©Ù‡ متن معمولی موجود نیست +display preferences felamimail fa مشخصات نمایش +do it! felamimail fa انجامش بده! +do not use sent felamimail fa از ارسال شده استÙاده نشود +do not use trash felamimail fa از بازیاÙت استÙاده نشود +do you really want to delete the '%1' folder? felamimail fa آیا واقعا مطمئنید Ú©Ù‡ Ù…ÛŒ خواهید پوشه '%1' را حد٠کنید؟ +does not contain felamimail fa شامل نیست +does not match felamimail fa جور نیست +does not match regexp felamimail fa با عبارت باقاعده جور نبود +don't use sent felamimail fa از ارسال شده استÙاده نشود +don't use trash felamimail fa از بازیاÙت استÙاده نشود +down felamimail fa پائین +download felamimail fa دریاÙت +download this as a file felamimail fa دریاÙت این بعنوان یک پرونده +e-mail felamimail fa رایانامه Û² +e-mail address felamimail fa نشانی رایانامه +e-mail folders felamimail fa پوشه رایانامه +edit email forwarding address felamimail fa ویرایش نشانی رایانامه پیش سو +edit filter felamimail fa ویرایش صاÙÛŒ +edit rule felamimail fa ویرایش قانون +edit selected felamimail fa ویرایش انتخاب شده ها +edit vacation settings felamimail fa ویرایش تنظیمات بیکاری +email address felamimail fa نشانی رایانامه +email forwarding address felamimail fa نشانی رایانامه پیش سو +email signature felamimail fa امضاء رایانامه +empty trash felamimail fa خالی کردن زباله +enable felamimail fa Ùعال +enter your default mail domain ( from: user@domain ) admin fa حوزه پیش Ùرض رایانامه خود را وارد کنید( از: user@domain‌ ) +enter your imap mail server hostname or ip address admin fa نام میزبان یا نشانی IP کارگزار IMAP را وارد کنید +enter your sieve server hostname or ip address admin fa نام میزبان یا نشانی IP کارگزار SIEVE را وارد کنید +enter your sieve server port admin fa درگاه کارگزار SIEVE راوارد کنید +enter your smtp server hostname or ip address admin fa نام میزبان یا نشانی IP کارگزار SMTP را وارد کنید +enter your smtp server port admin fa درگاه کارگزار SMTP راوارد کنید +error felamimail fa خطا! +error connecting to imap serv felamimail fa خطا در اتصال به کارگزار Ø¢ÛŒ مپ +error opening felamimail fa خطا در باز کردن +every felamimail fa هر +every %1 days felamimail fa هر %1 روز +expunge felamimail fa محو کردن +felamimail common fa رایانامه Û² +file into felamimail fa پرونده در +files felamimail fa پرونده ها +filter active felamimail fa Ùعالسازی صاÙÛŒ +filter name felamimail fa نام صاÙÛŒ +filter rules felamimail fa قوانین صاÙÛŒ +first name felamimail fa نام +flagged felamimail fa علامت گذاری شده +flags felamimail fa علامتها +folder acl felamimail fa حق دسترسی پوشه +folder name felamimail fa نام پوشه +folder path felamimail fa مسیر پوشه +folder preferences felamimail fa مشخصات پوشه +folder settings felamimail fa تنظیمات پوشه +folder status felamimail fa وضعیت پوشه +folderlist felamimail fa Ùهرست پوشه +foldername felamimail fa نام پوشه +folders felamimail fa پوشه ها +folders created successfully! felamimail fa پوشه ها با موÙقیت ایجاد شدند! +follow felamimail fa پیرو +for mail to be send - not functional yet felamimail fa برای رایانامه هایی Ú©Ù‡ ارسال Ù…ÛŒ شوند - هنوز عملیاتی نیست +for received mail felamimail fa برای رایانامه های دریاÙت شده +forward felamimail fa پیش سو +forward to address felamimail fa پیش سو به نشانی +forwarding felamimail fa پیش سو Ù…ÛŒ شود +found felamimail fa پیدا شدن +fri felamimail fa جمعه +from felamimail fa از +from(a->z) felamimail fa از(A->Z) +from(z->a) felamimail fa از (Z->A) +full name felamimail fa نام کامل +greater than felamimail fa بزرگتر از +header lines felamimail fa خطوط سرآیند +hide header felamimail fa پنهانسازی سرآیند +html felamimail fa زنگام +icons and text felamimail fa نمایه Ùˆ متن +icons only felamimail fa Ùقط نمایه +identifying name felamimail fa نام شناخته شده +if felamimail fa اگر +if from contains felamimail fa اگر از شامل باشد +if mail header felamimail fa اگر سرآیند نامه باشد +if message size felamimail fa اگر اندازه پیام باشد +if subject contains felamimail fa اگر موضوع شامل باشد +if to contains felamimail fa اگر به شامل باشد +illegal folder name. please select a different name. felamimail fa نام نامعتبر برای پوشه. لطÙا نام دیگری برگزینید +imap felamimail fa Ø¢ÛŒ مپ +imap server felamimail fa کارگزار Ø¢ÛŒ مپ +imap server address felamimail fa نشانی کارگزار Ø¢ÛŒ مپ +imap server type felamimail fa نوع کارگزار Ø¢ÛŒ مپ +in felamimail fa در +index order felamimail fa ترتیب اندیکس +info felamimail fa اطلاعات +invalid user name or password felamimail fa نام کاربری یا گذرواژه نادرست +javascript felamimail fa جاوا اسکریپت +keep a copy of the message in your inbox felamimail fa یک نسخه از پیام را در صندوق ورودی نگهداری شود +keep local copy of email felamimail fa نسخه محلی از رایانامه نگهداری شود +kilobytes felamimail fa کیلوبایت +language felamimail fa زبان +last name felamimail fa نام خانوادگی +left felamimail fa Ú†Ù¾ +less felamimail fa کمتر +less than felamimail fa کمتر از +light gray felamimail fa خاکستری روشن +list all felamimail fa Ùهرست همه +location of buttons when composing felamimail fa محل دکمه ها در زمان نوشتن نامه جدید +mail server login type admin fa نوع ورود کارگزار رایانامه +mail settings felamimail fa تنظیمات رایانامه +mainmessage felamimail fa پیام اصلی +manage emailfilter / vacation preferences fa مدیریت بیکاری/صاÙÛŒ رایانامه +manage folders common fa مدیریت پوشه ها +manage sieve common fa مدیریت اسکریپتهای Sieve +mark as deleted felamimail fa شناسائی بعنوان حذ٠شده +mark messages as felamimail fa شناسائی انتخاب شده ها بعنوان +mark selected as flagged felamimail fa شناسائی انتخاب شده ها بعنوان علامت دار +mark selected as read felamimail fa شناسائی انتخاب شده ها بعنوان خوانده شده +mark selected as unflagged felamimail fa شناسائی انتخاب شده ها بعنوان بدون علامت +mark selected as unread felamimail fa شناسائی انتخاب شده ها بعنوان خوانده نشده +match felamimail fa جور شود +matches felamimail fa جور شده ها +matches regexp felamimail fa عبارات باقاعده جور شده +message highlighting felamimail fa نمایان سازی پیامها +message list felamimail fa Ùهرست پیامها +messages felamimail fa پیام +mon felamimail fa دوشنبه +move felamimail fa انتقال دادن +move messages felamimail fa انتقال پیامها +move to felamimail fa انتقال انتخاب شده ها به +move to trash felamimail fa انتقال به بازیاÙت +moving messages to felamimail fa در حال انتقال پیامها به +name felamimail fa نام +never display html emails felamimail fa هرگز پیامهای زنگام را نشان نده +new common fa جدید +new filter felamimail fa صاÙÛŒ جدید +next felamimail fa بعدی +next message felamimail fa پیام بعدی +no filter felamimail fa بدون صاÙÛŒ +no folders found felamimail fa پوشه ای پیدا نشد +no folders were found to subscribe to! felamimail fa پوشه ای برای عضویت پیدا نشد! +no folders were found to unsubscribe from! felamimail fa پوشه ای برای لغو عضویت پیدا نشد! +no highlighting is defined felamimail fa نمایان سازی تعری٠نشده +no messages found... felamimail fa پیامی پیدا نشد... +no messages were selected. felamimail fa پیامی انتخاب نشده +no previous message felamimail fa پیام قبلی موجود نیست +no valid emailprofile selected!! felamimail fa تنظیمات معتبری برای رایانامه انتخاب نشده!!! +none felamimail fa هیچ +on behalf of felamimail fa در نیمه +one address is not valid felamimail fa یکی از نشانیها معتبر نیستند +only inbox felamimail fa Ùقط صندوق ورودی +only one window felamimail fa Ùقط یک پنجره +only unseen felamimail fa Ùقط ندیده ها +open all felamimail fa بازکردن همه +options felamimail fa گزینه ها +organisation felamimail fa سازمان +organization felamimail fa سازمان +organization name admin fa نام سازمان +participants felamimail fa همکاران +personal information felamimail fa اطلاعات شخصی +please select a address felamimail fa لطÙا یک نشانی انتخاب کنید +please select the number of days to wait between responses felamimail fa لطÙا تعداد روزها برای انتظار مابین پاسخها را انتخاب کنید +please supply the message to send with auto-responses felamimail fa لطÙا پیامی را برای ارسال پاسخ خودکار تعیین کنید +posting felamimail fa درحال پست +previous felamimail fa قبلی +previous message felamimail fa پیام قبلی +print it felamimail fa چاپش Ú©Ù† +print this page felamimail fa چاپ این صÙحه +quicksearch felamimail fa جستجوی سریع +read felamimail fa خوانده شده +reading felamimail fa در حال خواندن +recent felamimail fa اخیر +refresh time in minutes felamimail fa زمان بازخوانی به دقیقه +remove felamimail fa حذ٠کردن +remove immediately felamimail fa Ùورا حذ٠شود +rename felamimail fa تغییر نام +rename a folder felamimail fa تغییر نام یک پوشه +rename folder felamimail fa تغییر نام پوشه +renamed successfully! felamimail fa با موÙقیت تغییر نام یاÙت! +replied felamimail fa پاسخ داده شده +reply felamimail fa پاسخ +reply all felamimail fa پاسخ به همه +reply to felamimail fa پاسخ به +replyto felamimail fa پاسخ به +respond felamimail fa پاسخ +respond to mail sent to felamimail fa پاسخ به نامه ارسال شده به +return felamimail fa بازگشت +return to options page felamimail fa بازگشت به صÙحه گزینه ها +right felamimail fa راست +rule felamimail fa قانون +sat felamimail fa شنبه +save felamimail fa ذخیره +save changes felamimail fa ذخیره تغییرات +script name felamimail fa نام اسکریپت +script status felamimail fa وضعیت اسکریپت +search felamimail fa جستجو +search for felamimail fa جستجو برای +select felamimail fa انتخاب +select all felamimail fa انتخاب همه +select emailprofile felamimail fa تنظیمات رایانامه را انتخاب کنید +select folder felamimail fa پوشه را انتخاب کنید +select your mail server type admin fa نوع کارگزار رایانامه خود را انتخاب کنید +send felamimail fa ارسال +send a reject message felamimail fa ارسال یک پیام برگشتی +sent folder felamimail fa پوشه ارسال شده +show header felamimail fa نمایش سرآیند +show new messages on main screen felamimail fa نمایش پیامهای جدید در صÙحه اصلی(خانه) +sieve settings admin fa تنظیمات Sieve +signature felamimail fa امضاء +simply click the target-folder felamimail fa برای انتقال انتخاب شده ها Ùقط روی پوشه مقصد کلیک کنید +size felamimail fa اندازه +size of editor window felamimail fa اندازه پنجره ویرایشگر +size(...->0) felamimail fa اندازه (...->0) +size(0->...) felamimail fa اندازه (0->...) +skipping forward ... felamimail fa پرش به جلو ... +small view felamimail fa نمای Ú©ÙˆÚ†Ú© +smtp settings admin fa تنظیمات SMTP +subject felamimail fa موضوع +subject(a->z) felamimail fa موضوع (A->Z) +subject(z->a) felamimail fa موضوع (Z->A) +submit felamimail fa ثبت +subscribe felamimail fa عضو شدن +subscribed felamimail fa عضو شده +subscribed successfully! felamimail fa عضویت با موÙقیت انجام شد! +sun felamimail fa یکشنبه +table of contents felamimail fa Ùهرست محتویات +text only felamimail fa Ùقط متن +the connection to the imap server failed!! felamimail fa اتصال به کارگزار Ø¢ÛŒ مپ ناموÙÙ‚ بود!!! +the mimeparser can not parse this message. felamimail fa تشخیص دهنده نوع Ùایل قادر به تشخیص این پیام نیست +then felamimail fa سپس +this folder is empty felamimail fa این پوشه خالی است +this php has no imap support compiled in!! felamimail fa این PHP پشتیبانی از Ø¢ÛŒ مپ را در خود ندارد! +thu felamimail fa پنجشنبه +to felamimail fa به +to mail sent to felamimail fa برای نامه های ارسال شده +translation preferences felamimail fa مشخصات ترجمه +translation server felamimail fa کارگزار ترجمه +trash fold felamimail fa پوشه بازیاÙت +trash folder felamimail fa پوشه بازیاÙت +tue felamimail fa سه شنبه +type felamimail fa نوع +unflagged felamimail fa بی علامت +unknown err felamimail fa خطای ناشناخته +unknown error felamimail fa خطای ناشناخته +unknown sender felamimail fa Ùرستنده ناشناس +unknown user or password incorrect. felamimail fa نام کاربری یا گذرواژه نادرست است +unread common fa خوانده نشده +unseen felamimail fa دیده نشده +unselect all felamimail fa خارج کردن از انتخاب همه +unsubscribe felamimail fa لغو عضویت +unsubscribed felamimail fa عضویت لغو شده +unsubscribed successfully! felamimail fa لغو شدن عضویت با موÙقیت انجام شد! +up felamimail fa بالا +use emailadmin to create profiles felamimail fa از مدیر رایانامهif you use templates, this option is only applied to the text part of the message. felamimail fi Ota tekstin ja allekirjoituksen välissä oleva eroitin pois käytöstä. Jos käytät mallipohjia, tämä koskee ainoastaan viestin tekstiosaa. +discard felamimail fi Hylkää +discard message felamimail fi Hylkää viesti +display message in new window felamimail fi Näytä viesti uudessa ikkunassa +display messages in multiple windows felamimail fi Näytä viesti uudessa ikkunassa? +display of html emails felamimail fi HTML sähköpostien näkymä +display only when no plain text is available felamimail fi Näytä vain kun "pelkkä teksti" ei ole saatavilla +display preferences felamimail fi Näytä asetukset +displaying html messages is disabled felamimail fi HTML viestien näyttäminen on estetty +do it! felamimail fi Tee se! +do not use sent felamimail fi Älä käytä Lähetetyt-kansiota +do not use trash felamimail fi Älä käytä Roskakoria +do not validate certificate felamimail fi Älä tarkista sertifikaattia +do you really want to attach the selected messages to the new mail? felamimail fi Haluatko varmasti liittää tiedostot? +do you really want to delete the '%1' folder? felamimail fi Oletko varma että haluat poistaa kansion '%1' +do you really want to delete the selected accountsettings and the assosiated identity. felamimail fi Haluatko varmasti poistaa valitut tiliasetukset ja Identiteetin? +do you really want to delete the selected signatures? felamimail fi Haluatko varmasti poistaa valitut allekirjoitukset? +do you really want to move or copy the selected messages to folder: felamimail fi Haluatko varmasti siirtää tai kopioida valitsemasi viestit kansioon: +do you really want to move the selected messages to folder: felamimail fi Haluatko varmasti siirtää valitsemasi viestit kansioon: +do you want to be asked for confirmation before attaching selected messages to new mail? felamimail fi haluatko, että sinulta varmistetaan asia ennenkuin liität tiedostoja? +do you want to be asked for confirmation before moving selected messages to another folder? felamimail fi Haluatko, että sinulta varmistetaan asia ennenkuin siirrät valitut viestit toiseen kansioon? +do you want to prevent the editing/setup for forwarding of mails via settings (, even if sieve is enabled)? felamimail fi Haluatko estää välitettävän (Forwarding) sähköpostin muokkauksen/käyttöönoton, (vaikka SIEVE on käytössä)? +do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? felamimail fi Haluatko estää suodatinsääntöjen (Filter rules) muokkauksen/käyttöönoton, (vaikka SIEVE on käytössä)? +do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if sieve is enabled)? felamimail fi Haluatko estää houmautussviestien muokkauksen /käyttöönoton, kun sähköpostin saapuessa tiettyyn kansioon huomautusvieti lähetettäisiin toiseen kansioon, (vaikka SIEVE on käytössä)? +do you want to prevent the editing/setup of the absent/vacation notice (, even if sieve is enabled)? felamimail fi Haluatko estää lomaviestien (Vacation notice) muokkauksen /käyttöönoton, (vaikka SIEVE on käytössä)? +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail fi Haluatko estää kansioiden muokkauksen /käyttöönoton, (Kansioiden luominen, ACL-oikeuksien myöntäminen ja kansioiden näkyvyys sähköpostitilillä)? +does not contain felamimail fi Ei sisällä +does not exist on imap server. felamimail fi Ei löydy IMAP palvelimelta. +does not match felamimail fi Ei täsmää +does not match regexp felamimail fi Merkkijono ei täsmää +don't use draft folder felamimail fi Älä käytä Luonnokset -kansiota +don't use sent felamimail fi Älä käytä Lähetetyt -kansiota +don't use template folder felamimail fi Älä käytä Mallipohjat -kansiota +don't use trash felamimail fi Älä käytä Roskakori -kansiota +dont strip any tags felamimail fi Älä poista tunnuksia +down felamimail fi Alas +download felamimail fi Lataa +download this as a file felamimail fi Lataa tiedostona +draft folder felamimail fi Luonnokset -kansio +drafts felamimail fi Luonnokset +e-mail felamimail fi Sähköposti +e-mail address felamimail fi Sähköpostiosoite +e-mail folders felamimail fi Sähköpostikansiot +edit email forwarding address felamimail fi Muokkaa välitettävää osoitetta +edit filter felamimail fi Muokkaa suodatinta +edit rule felamimail fi Muokkaa sääntöä +edit selected felamimail fi Muokkaa valittua +edit vacation settings felamimail fi Muokkaa lomavastaaja-asetuksia +editor type felamimail fi Editorin tyyppi +email address felamimail fi Sähköpostiosoite +email forwarding address felamimail fi Välitettävä osoite +email notification update failed felamimail fi Sähköpostin huomautusviestipäivitys epäonnistui +email signature felamimail fi Sähköpostin allekirjoitus +emailaddress felamimail fi Sähköpostiosoite +empty trash felamimail fi Tyhjennä roskakori +enable felamimail fi Ota käyttöön +encrypted connection felamimail fi Salattu yhteys +enter your default mail domain ( from: user@domain ) admin fi Anna oletus verkkotunnus (domain) ( Mistä: käyttäjä@verkkotunnus ) +enter your imap mail server hostname or ip address admin fi Anna IMAP -palvelimen nimi tai IP osoite +enter your sieve server hostname or ip address admin fi Anna SIEVE -palvelimen nimi tai IP osoite +enter your sieve server port admin fi Anna SIEVE -palvelimen portti +enter your smtp server hostname or ip address admin fi Anna SMTP -palvelimen host-nimi tai IP osoite +enter your smtp server port admin fi Anna SMTP -palvelimen portti +entry saved felamimail fi Tallennettu +error felamimail fi VIRHE +error connecting to imap serv felamimail fi Virhe yhdistettäessä IMAP palvelimeen +error connecting to imap server. %s : %s. felamimail fi Virhe yhdistettäessä IMAP palvelimeen. %s : %s. +error connecting to imap server: [%s] %s. felamimail fi Virhe yhdistettäessä IMAP palvelimeen: [%s] %s. +error creating rule while trying to use forward/redirect. felamimail fi Virhe suodatussääntöjen luomisessa edelleenlähetykseen. +error opening felamimail fi Virhe avattaessa +error saving %1! felamimail fi Virhe tallennettaessa %1! +error: felamimail fi Virhe: +error: could not save message as draft felamimail fi Virhe: Viestiä ei voitu tallentaa luonnoksena. +error: could not save rule felamimail fi Virhe: Sääntöä ei voitu tallentaa +error: could not send message. felamimail fi Virhe: Viestiä ei voitu lähettää. +error: message could not be displayed. felamimail fi Virhe: Viestiä ei voida näyttää. +event details follow felamimail fi Tapahtuman yksityiskohdat +every felamimail fi Joka +every %1 days felamimail fi Joka %1:s päivä +expunge felamimail fi Tuhoa +extended felamimail fi Laajennettu +felamimail common fi Sähköposti +file into felamimail fi Tiedosto +filemanager felamimail fi Tiedostonhallinta +files felamimail fi Tiedostot +filter active felamimail fi Aktivoi suodatin +filter name felamimail fi Suodattimen nimi +filter rules common fi Hallitse suodattimia +first name felamimail fi Etunimi +flagged felamimail fi Merkitty tunnuksella +flags felamimail fi Tunnukset +folder felamimail fi Kansio +folder acl felamimail fi Kansion ACL-oikeudet +folder name felamimail fi Kansion nimi +folder path felamimail fi Kansion polku +folder preferences felamimail fi Kansion oletusasetukset +folder settings felamimail fi Kansion asetukset +folder status felamimail fi Kansion tila +folderlist felamimail fi Kansioluettelo +foldername felamimail fi Kansion nimi +folders felamimail fi Kansiot +folders created successfully! felamimail fi Kansiot luotu! +follow felamimail fi seuraa +for mail to be send - not functional yet felamimail fi Lähetettäville viesteille - ei vielä käytössä +for received mail felamimail fi Vastaanotetuille viesteille +forward felamimail fi Välitä eteenpäin +forward as attachment felamimail fi Liitteenä +forward inline felamimail fi Viestiin sisällytettynä +forward messages to felamimail fi Välitä viestit: +forward to felamimail fi Välitä: +forward to address felamimail fi Välitä osoitteeseen +forwarding felamimail fi Hallitse viestien välityksiä +found felamimail fi Löytyi +from felamimail fi Lähettäjä +from(a->z) felamimail fi A:sta Z:taan +from(z->a) felamimail fi Z:sta A:han +full name felamimail fi Koko nimi +greater than felamimail fi Suurempi kuin +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail fi Katso www.felamimail.org oppiaksesi lisää Squirrelmailista.
    +header lines felamimail fi Ylätunnisterivit +hide header felamimail fi Piilota ylätunniste +hostname / address felamimail fi Palvelimen nimi / osoite +how to forward messages felamimail fi Kuinka viestejä välitetään +html felamimail fi HTML +icons and text felamimail fi Kuvakkeet ja teksti +icons only felamimail fi Vain kuvakkeet +identifying name felamimail fi Tunniste +identity felamimail fi Identiteetti +if felamimail fi JOS +if from contains felamimail fi Jos lähettäjä sisältää +if mail header felamimail fi Jos postin ylätunniste +if message size felamimail fi Jos viestin koko +if shown, which folders should appear on main screen felamimail fi Jos näytetään, mitkä kansiot tulisi näyttää etusivulla? +if subject contains felamimail fi Jos aihe sisältää +if to contains felamimail fi Jos vastaanottaja sisältää +if using ssl or tls, you must have the php openssl extension loaded. felamimail fi Jos käytetään SSL tai TLS, sinulla pitää olla ladattuna PHP openssl lisäpaketti. +illegal folder name. please select a different name. felamimail fi Kansion nimi ei kelpaa. Anna uusi nimi. +imap felamimail fi IMAP +imap server felamimail fi IMAP -palvelin +imap server address felamimail fi IMAP -palvelimen osoite +imap server closed the connection. felamimail fi IMAP -palvelin katkaisi yhteyden. +imap server closed the connection. server responded: %s felamimail fi IMAP -palvelin katkaisi yhteyden. Palvelin palauttaa: %s +imap server password felamimail fi IMAP -palvelimen salasana +imap server type felamimail fi IMAP -palvelin tyyppi +imap server username felamimail fi IMAP -palvelimen käyttäjätunnus +imaps authentication felamimail fi IMAPS -tunnistus +imaps encryption only felamimail fi Vain IMAPS -salaus +import felamimail fi Tuonti +import mail felamimail fi Tuo sähköposteja +import message felamimail fi Tuo sähköpostiviesti +import of message %1 failed. could not save message to folder %2 due to: %3 felamimail fi Viestin %1 tuonti epäonnistui. Viestiä ei voitu tallentaa kansioon %2. Syy: %3 +import of message %1 failed. destination folder %2 does not exist. felamimail fi Viestin %1 tuonti epäonnistui. Kohdekansiota %1 ei löytynyt. +import of message %1 failed. destination folder not set. felamimail fi Viestin %1 tuonti epäonnistui. kohdekansiota ei asetettu. +import of message %1 failed. no contacts to merge and send to specified. felamimail fi Viestin %1 tuonti epäonnistui. Kontaktia ei ole asetettu. +importance felamimail fi Tärkeys +in felamimail fi Sisältää +inbox felamimail fi Saapuneet +incoming mail server(imap) felamimail fi Saapuvan sähköpostin palvelin (IMAP) +index order felamimail fi Indeksijärjestys +info felamimail fi Info +insert the signature at top of the new (or reply) message when opening compose dialog (you may not be able to switch signatures) felamimail fi Aseta allekirjoitus oman viestisi alapuolelle vastatessasi sähköpostiin. +invalid user name or password felamimail fi Virheellinen käyttäjänimi tai salasana +javascript felamimail fi JavaScript +jumping to end felamimail fi Siirry loppuun +jumping to start felamimail fi Siirry alkuun +junk felamimail fi Roskaposti +keep a copy of the message in your inbox felamimail fi Pidä kopio viestistä Inboxissa +keep local copy of email felamimail fi Säilytä kopio viestistä +kilobytes felamimail fi Kilotavu(a) +language felamimail fi Kieli +last name felamimail fi Sukunimi +left felamimail fi Vasen +less felamimail fi Vähemmän +less than felamimail fi Vähemmän kuin +light gray felamimail fi Vaaleanharmaa +list all felamimail fi Näytä kaikki +loading felamimail fi Ladataan +location of buttons when composing felamimail fi Painikkeiden sijainti kirjoitettaessa +mail server login type admin fi Sähköpostipalvelimen kirjautumistyyppi +mail settings felamimail fi Viestien asetukset +mainmessage felamimail fi Pääviesti +manage email accounts and identities common fi Hallitse sähköpostitilejä ja identiteettejä +manage emailaccounts common fi Hallitse sähköpostitilejä +manage emailfilter / vacation preferences fi Hallitse sähköpostisuodatinta / Lomaviestejä +manage folders common fi Hallitse kansioita +manage sieve common fi Hallitse SIEVE skriptejä +manage signatures felamimail fi Hallitse allekirjoituksia +mark as felamimail fi Merkitse +mark as deleted felamimail fi Merkitse poistetuksi +mark messages as felamimail fi Merkitse valitut viestit +mark selected as flagged felamimail fi Merkitse tunnuksella +mark selected as read felamimail fi Merkitse valitut luetuiksi +mark selected as unflagged felamimail fi Poista tunniste valituista viesteistä +mark selected as unread felamimail fi Merkitse valitut lukemattomiksi +match felamimail fi Yhteensopivuus +matches felamimail fi Täsmäävät +matches regexp felamimail fi Täsmäävät merkkijonoon +max uploadsize felamimail fi Suurin latauskoko +message highlighting felamimail fi Viestien korostus +message list felamimail fi Viestilista +messages felamimail fi Viestiä +move felamimail fi Siirrä +move folder felamimail fi Siirrä kansio +move messages felamimail fi Siirrä viesti(t) +move messages? felamimail fi Siirretäänkö viestit? +move selected to felamimail fi Siirrä valitut +move to felamimail fi Siirrä valitut: +move to trash felamimail fi Siirrä roskakoriin +moving messages to felamimail fi Siirretään viestejä +name felamimail fi Nimi +never display html emails felamimail fi Älä näytä HTML -sähköposteja +new common fi Uusi +new filter felamimail fi Uusi suodatin +next felamimail fi Seuraava +next message felamimail fi Seuraava viesti +no active imap server found!! felamimail fi Aktiivista IMAP palvelinta ei löydetty !! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail fi Osoitetta ei ole annettu kohtaan Kenelle/Kopio/Piilokopio , eikä Kansiota, mihin viesti pitäisi tallentaa löydy. +no encryption felamimail fi Ei salausta +no filter felamimail fi Ei suodatinta +no folders felamimail fi Ei kansioita +no folders found felamimail fi Kansioita ei löytynyt +no folders were found to subscribe to! felamimail fi Ei tilattavia kansioita! +no folders were found to unsubscribe from! felamimail fi Ei peruttavia kansioita! +no highlighting is defined felamimail fi Korostusta ei määritelty +no imap server host configured!! felamimail fi IMAP palvelinta ei ole konfiguroitu +no message returned. felamimail fi Ei palautettuja viestejä +no messages found... felamimail fi Viestejä ei löytynyt... +no messages selected, or lost selection. changing to folder felamimail fi Ei valittuja viestejä tai yhteys menetettyn. Vaihdetaan kansioon: +no messages were selected. felamimail fi Ei valittuja viestejä. +no plain text part found felamimail fi Pelkkää tekstiä ei löytynyt +no previous message felamimail fi Ei edellistä viestiä +no recipient address given! felamimail fi Vastaanottajan osoite puuttuu! +no signature felamimail fi Ei allekirjoitusta +no stationery felamimail fi Ei sähköpostin taustakuvamalleja +no subject given! felamimail fi Aihe puuttuu! +no supported imap authentication method could be found. felamimail fi Tuettua IMAP tunnistustapaa ei löydetty. +no valid data to create mailprofile!! felamimail fi Ei voimassaolevia tietoja sähköpostiprofiilin luomiseen! +no valid emailprofile selected!! felamimail fi Voimassaolevaa sähköpostiprofiilia ei ole valittuna!! +none felamimail fi Ei mitään +none, create all felamimail fi Ei mitään, luo kaikki +not allowed felamimail fi Ei sallittu +notify when new mails arrive on these folders felamimail fi Huomauta uusien viestien saapuessa näihin kansioihin +on behalf of felamimail fi Puolesta +one address is not valid felamimail fi Yksi osoite ei kelpaa +only inbox felamimail fi Vain Saapuneet +only one window felamimail fi Vain yksi ikkuna +only send message, do not copy a version of the message to the configured sent folder felamimail fi Ainoastaan lähetä viesti, älä kopoi sitä Lähetetyt-kansioon +only unseen felamimail fi Vain avaamattomat +open all felamimail fi Avaa kaikki +options felamimail fi Asetukset +or felamimail fi Tai +or configure an valid imap server connection using the manage accounts/identities preference in the sidebox menu. felamimail fi Tai konfiguroi IMAP -palvelin kohdassa Hallitse sähköpostitilejä ja Identiteettejä (sivuvalikossa). +organisation felamimail fi Organisaatio +organization felamimail fi Organisaatio +organization name admin fi Organisaation nimi +original message felamimail fi Alkuperäinen viesti +outgoing mail server(smtp) felamimail fi Lähtevän sähköpostin palvelin (SMTP) +participants felamimail fi Osallistujat +personal information felamimail fi Omat tiedot +please ask the administrator to correct the emailadmin imap server settings for you. felamimail fi Pyydä ylläpitäjiltä IMAP palvelinasetukset. +please configure access to an existing individual imap account. felamimail fi Konfiguroi jo olemassaolevan IMAP sähköpostitilisi asetukset. +please select a address felamimail fi Valitse osoite +please select the number of days to wait between responses felamimail fi Valitse päivien lukumäärä, joka vastausten välillä odotetaan +please supply the message to send with auto-responses felamimail fi Anna viesti joka lähetetään automaattisella vastauksella +port felamimail fi Portti +posting felamimail fi Postitus +preview disabled for folder: felamimail fi Esinäkymä otettu pois kansiosta: +previous felamimail fi Edellinen +previous message felamimail fi Edellinen viesti +primary emailadmin profile felamimail fi Ensisijainen sähköpostiprofiili +print it felamimail fi Tulosta +print this page felamimail fi Tulosta tämä sivu +printview felamimail fi Tulostuksen esikatselu +quicksearch felamimail fi Pikahaku +read felamimail fi Luettu +reading felamimail fi Luetaan... +receive notification felamimail fi Pyydä vastaanottokuittaus +recent felamimail fi Viimeaikaiset +refresh time in minutes felamimail fi Päivitysaika minuutteina +reject with felamimail fi Hylkää +remove felamimail fi Poista +remove immediately felamimail fi Poista heti +rename felamimail fi Vaihda nimi +rename a folder felamimail fi Nimeä kansio uudelleen +rename folder felamimail fi Nimeä kansio uudelleen +renamed successfully! felamimail fi Nimi vaihdettu! +replied felamimail fi Vastattu +reply felamimail fi Vastaa +reply all felamimail fi Vastaa kaikille +reply to felamimail fi Vastaanottaja +replyto felamimail fi Vastaanottaja +respond felamimail fi Vastaa +respond to mail sent to felamimail fi Vastaa viestiin, mikä lähetettiin osoitteeseen: +return felamimail fi Takaisin +return to options page felamimail fi Takaisin asetukset -sivulle +right felamimail fi Oikea +row order style felamimail fi Rivijärjestyksen muotoilu +rule felamimail fi Sääntö +save felamimail fi Tallenna +save all felamimail fi Tallenna kaikki +save as draft felamimail fi Tallenna luonnoksena +save as infolog felamimail fi Tallenna InfoLogina +save as ticket felamimail fi Tallenna reklamaationa +save as tracker felamimail fi Tallenna reklamaationa +save changes felamimail fi Tallenna muutokset +save message to disk felamimail fi Tallenna viesti levylle +save of message %1 failed. could not save message to folder %2 due to: %3 felamimail fi Viestin %1 tallennus epäonnistui. Viestiä ei voitu tallentaa kansioon %2. Syy: %3 +save: felamimail fi Tallenna: +script name felamimail fi Skriptin nimi +script status felamimail fi Skriptin tila +search felamimail fi Etsi +search for felamimail fi Etsi +select felamimail fi Valitse +select a message to switch on its preview (click on subject) felamimail fi Valitse viesti esinäkymään +select all felamimail fi Valitse kaikki +select emailprofile felamimail fi Valitse sähköpostin profiili +select folder felamimail fi Valitse kansio +select your mail server type admin fi Valitse (posti)palvelimesi tyyppi +send felamimail fi Lähetä +send a reject message felamimail fi Lähetä kieltäytymisviesti +send message and move to send folder (if configured) felamimail fi Lähetä viesti ja siirrä Lähetetyt kansioon +sender felamimail fi Lähettäjä +sent felamimail fi Lähetetyt +sent folder felamimail fi Lähetetyt kansio +server supports mailfilter(sieve) felamimail fi Palvelin tukee sähköpostin suodatusta (SIEVE) +set as default felamimail fi Aseta oletukseksi +show all folders (subscribed and unsubscribed) in main screen folder pane felamimail fi Näytä kaikki kansiot (tilatut ja tilaamattomat) sähköpostivalikossa. +show all messages felamimail fi Näytä kaikki viestit +show header felamimail fi Näytä ylätunniste +show new messages on main screen felamimail fi Näytä uudet viestit etusivulla +sieve script name felamimail fi SIEVE skriptin nimi +sieve settings admin fi SIEVE asetukset +signatur felamimail fi Allekirjoitus +signature felamimail fi Allekirjoitus +simply click the target-folder felamimail fi Valitse kohdekansio +size felamimail fi Koko +size of editor window felamimail fi Muokkausikkunan koko +size(...->0) felamimail fi Koko (...->0) +size(0->...) felamimail fi Koko (0->...) +skipping forward felamimail fi Siirry seuraavaan +skipping previous felamimail fi Siirry edelliseen +small view felamimail fi Pieni näkymä +smtp settings admin fi SMTP asetukset +start new messages with mime type plain/text or html? felamimail fi Haluatko aloitaa uudet viestit pelkkänä tekstinä vai HTML:nä? +stationery felamimail fi Sähköpostin taustakuva -mallipohjat +subject felamimail fi Aihe +subject(a->z) felamimail fi Aiheet A > Z +subject(z->a) felamimail fi Aiheet Z > A +submit felamimail fi Lähetä +subscribe felamimail fi Tilaa +subscribed felamimail fi Tilattu +subscribed successfully! felamimail fi Tilattu onnistuneesti! +switching of signatures failed felamimail fi Allekirjoituksen vaihto epäonnistui +system signature felamimail fi Yleinen allekirjoitus +table of contents felamimail fi Sisältö +template folder felamimail fi Mallipohjat -kansio +templates felamimail fi Mallipohjat +text only felamimail fi Vain tekstiä +text/plain felamimail fi Pelkkä teksti +the connection to the imap server failed!! felamimail fi Yhteys IMAP palvelimeen epäonnistui!! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail fi IMAP palvelin ei tue valittua tunnistustapaa. Ota yhteyttä järjestelmän ylläpitäjään. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail fi Viestin lähettäjä haluaa vahvistuksen, että olet saanut tämän viestin. Haluatko lähettää sen? +the mimeparser can not parse this message. felamimail fi Mimeparseri ei voi jäsentää tätä viestiä +then felamimail fi TAI +there is no imap server configured. felamimail fi IMAP palvelinta ei ole konfiguroitu +this folder is empty felamimail fi Kansio on tyhjä +this php has no imap support compiled in!! felamimail fi Tällä PHP:llä ei ole IMAP -tukea!! +to felamimail fi Kenelle: +to mail sent to felamimail fi Kenelle posti lähetetään: +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail fi Käyttääksesi TLS yhteyttä, sinulla pitää olla PHP 5.1.0 tai uudempi versio. +translation preferences felamimail fi Käännösten asetukset +translation server felamimail fi Käännöspalvelin +trash felamimail fi Roskakori +trash fold felamimail fi Roskakori -kansio +trash folder felamimail fi Roskakori -kansio +type felamimail fi Tyyppi +unexpected response from server to authenticate command. felamimail fi Odottamaton vastaus palvelimelta AUTHENTICATE komentoon. +unexpected response from server to digest-md5 response. felamimail fi Odottamaton vastaus palvelimen Digest-MD5 vastaukselta. +unexpected response from server to login command. felamimail fi Odottamaton vastaus palvelimelta LOGIN kirjautumiskomentoon +unflagged felamimail fi Tunnukseton +unknown err felamimail fi Tunt. virh. +unknown error felamimail fi Tuntematon virhe +unknown imap response from the server. server responded: %s felamimail fi Tuntematon vastaus IMAP palvelimelta. Palvelin vastasi: %s +unknown sender felamimail fi Tuntematon lähettäjä +unknown user or password incorrect. felamimail fi Tuntematon käyttäjä tai väärä salasana. +unread common fi Lukematon +unseen felamimail fi Lukematon +unselect all felamimail fi Poista kaikki valinnat +unsubscribe felamimail fi Peruuta tilaus +unsubscribed felamimail fi Peruutettu +unsubscribed successfully! felamimail fi Tilaus peruutettu! +up felamimail fi Ylös +updating message status felamimail fi Päivitä viestin tila +updating view felamimail fi Päivitysnäkymä +use emailadmin to create profiles felamimail fi Käytä EmailAdmin tehdäksesi profiileja +use a signature felamimail fi Käytä allekirjoitusta +use a signature? felamimail fi Käytetäänkö allekirjoitusta? +use addresses felamimail fi Käytä osoitteita +use common preferences max. messages felamimail fi Käytä asetusten maximi määrää +use custom identities felamimail fi Käytä muokattuja identiteettejä +use custom settings felamimail fi Käytä muokattuja (lisä-) asetuksia +use regular expressions felamimail fi Käytä tavanomaisia ilmaisuja +use smtp auth admin fi Käytä SMTP -tunnistusta +users can define their own emailaccounts admin fi Käyttäjät voivat määritellä omia (uusia) sähköpostitilejä +vacation notice common fi Lomavastaaja +vacation notice is active felamimail fi Lomavastaaja on käytössä +vacation start-date must be before the end-date! felamimail fi Lomavastaajan aloituspäivän pitää olla ennen loppumispäivää +validate certificate felamimail fi Tarkista sertifikaatti +view full header felamimail fi Näytä koko ylätunniste +view header lines felamimail fi Näytä ylätunnisterivit +view message felamimail fi Näytä viesti +viewing full header felamimail fi Näytetään kaikki ylätunnisterivit +viewing message felamimail fi Viestien katselu +viewing messages felamimail fi Viestien katselu +when deleting messages felamimail fi Kun poistetaan viestejä +when sending messages felamimail fi Kun lähetetään viestejä +which folders (additional to the sent folder) should be displayed using the sent folder view schema felamimail fi Minkä kansioiden (Lähetetyt-kansion lisäksi) tulisi käyttää Sent Folder View Schemaa? +which folders - in general - should not be automatically created, if not existing felamimail fi Mitä kansioita -yleisesti ottaen - EI pitäisi automaattisesti luoda, jos ne eivät ole jo olemassa? +with message felamimail fi Vastausviesti +with message "%1" felamimail fi Viestin "%1" kanssa +wrap incoming text at felamimail fi Aseta rivinleveydeksi +writing felamimail fi Kirjoitetaan +wrote felamimail fi Kirjoitettu +yes, offer copy option felamimail fi Kyllä, tarjoa kopiointimahdollisuutta +you can either choose to save as infolog or tracker, not both. felamimail fi Voit tallentaa joko InfoLogina tai reklamaationa, et molempina! +you can use %1 for the above start-date and %2 for the end-date. felamimail fi Käytä aloituspäivälle %1 ja lopetuspäivälle %1. +you have received a new message on the felamimail fi Uusi viesti kansiossa: +your message to %1 was displayed. felamimail fi Viesti henkilölle %1 esitetty diff --git a/felamimail/lang/egw_fr.lang b/felamimail/lang/egw_fr.lang new file mode 100644 index 0000000000..19a7f0a2f5 --- /dev/null +++ b/felamimail/lang/egw_fr.lang @@ -0,0 +1,429 @@ +(no subject) felamimail fr (pas de sujet) +(only cc/bcc) felamimail fr (seulement Cc/Bcc) +(unknown sender) felamimail fr (envoyeur inconnu) +activate felamimail fr Activer +activate script felamimail fr Activer le script +add acl felamimail fr ajouter acl +add address felamimail fr Ajouter l'adresse +add rule felamimail fr Ajouter une règle +add script felamimail fr Ajouter un script +add to %1 felamimail fr Ajouter à %1 +add to address book felamimail fr Ajouter au carnet d'adresses +add to addressbook felamimail fr Ajouter au carnet d'adresses +adding file to message. please wait! felamimail fr Ajout fichier au message. Veuillez patienter! +additional info felamimail fr Informations additionnelles +address book felamimail fr Carnet d'adresses +address book search felamimail fr Recherche dans le carnet d'adresses +after message body felamimail fr Après le corps du message +all address books felamimail fr Tous les carnets d'adresses +all folders felamimail fr Tous les dossiers +all of felamimail fr tous de +allow images from external sources in html emails felamimail fr Autoriser les images de sources externes dans les emails HTML +allways a new window felamimail fr toujours une nouvelle fenêtre +always show html emails felamimail fr Toujours affecher les messages HTML +and felamimail fr et +any of felamimail fr un de +any status felamimail fr n'importe quel statut +anyone felamimail fr N'importe qui +as a subfolder of felamimail fr Comme un sous-dossier de +attachments felamimail fr Attachements +authentication required felamimail fr authentification requise +auto refresh folder list felamimail fr Auto-rafraîchir la liste des dossiers +back to folder felamimail fr Retour au dossier +bad login name or password. felamimail fr Mauvais login ou mot de passe +bad or malformed request. server responded: %s felamimail fr Requête invalide ou malformée. Le serveur a répondu: %s +bad request: %s felamimail fr Requête invalide: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail fr En se basant sur les critères donnés, les messages entrants peuvent avoir des couleurs de fond différentes dans la liste des messages. Ceci aide à distinguer aisément de qui sont les messages, spécialement pour les listes de diffusion. +bcc felamimail fr Copie cachée +before headers felamimail fr Avant les entêtes +between headers and message body felamimail fr Entre les entêtes et le corps du message +body part felamimail fr Corps du message +can not send message. no recipient defined! felamimail fr Impossible d'envoyer le message, il n'y a pas de destinataire +can't connect to inbox!! felamimail fr Impossible de se connecter au serveur! +cc felamimail fr Copie à +change folder felamimail fr Changer de dossier +check message against next rule also felamimail fr vérifiez le message avec la prochaine règle également +checkbox felamimail fr Case à cocher +clear search felamimail fr réinitialiser termes de la recherche +click here to log back in. felamimail fr Cliquez ici pour vous reconnecter +click here to return to %1 felamimail fr Cliquez ici pour retourner à %1 +close all felamimail fr Tout fermer +close this page felamimail fr Fermer cette page +close window felamimail fr Fermer la fenêtre +color felamimail fr Couleur +compose felamimail fr Composer +compress folder felamimail fr Compresser le dossier +condition felamimail fr condition +configuration felamimail fr Configuration +connection dropped by imap server. felamimail fr Connexion annulée par le serveur IMAP +contains felamimail fr contient +could not complete request. reason given: %s felamimail fr Requête non achevée. Raison invoquée: %s +could not open secure connection to the imap server. %s : %s. felamimail fr Impossible d'avoir une connexion sécurisée avec le serveur IMAP. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail fr CRAM-MD5 ou DIGEST-MD5 requièrent l'installation du paquetage Auth_SASL. +create felamimail fr Créer +create folder felamimail fr Créer un dossier +create sent felamimail fr Créer Sent (envoyés) +create subfolder felamimail fr Créer un sous-dossier +create trash felamimail fr Créer la corbeille +created folder successfully! felamimail fr Dossier créé avec succès! +dark blue felamimail fr Bleu foncé +dark cyan felamimail fr Cyan foncé +dark gray felamimail fr Gris foncé +dark green felamimail fr Vert foncé +dark magenta felamimail fr Magenta foncé +dark yellow felamimail fr Jaune foncé +date(newest first) felamimail fr Date (plus récente d'abord) +date(oldest first) felamimail fr Date (plus ancienne d'abord) +days felamimail fr jours +deactivate script felamimail fr désactiver les scripts +default felamimail fr défaut +default signature felamimail fr signature par défaut +default sorting order felamimail fr Ordre de tri par défaut +delete all felamimail fr Effacer tous +delete folder felamimail fr Effacer le dossier +delete script felamimail fr Effacer le script +delete selected felamimail fr Effacer sélectionnés +delete selected messages felamimail fr Effacer les messages sélectionnés +deleted felamimail fr Effacés +deleted folder successfully! felamimail fr Dossier effacé avec succès! +deleting messages felamimail fr suppression des messages +disable felamimail fr Désactiver +discard felamimail fr annuler +discard message felamimail fr annuler les modifications +display message in new window felamimail fr Afficher le message dans une nouvelle fenêtre +display messages in multiple windows felamimail fr afficher les messages dans plusieurs fenêtres +display of html emails felamimail fr Afficher les messages HTML +display only when no plain text is available felamimail fr Afficher seulement quand le format texte n'est pas disponible +display preferences felamimail fr Afficher les préférences +displaying html messages is disabled felamimail fr l'affichage des messages html est désactivé +do it! felamimail fr Fais-le! +do not use sent felamimail fr Ne pas utiliser Sent (envoyés) +do not use trash felamimail fr Ne pas utiliser la corbeille +do not validate certificate felamimail fr ne pas valider le certificat +do you really want to delete the '%1' folder? felamimail fr Voulez-vous vraiment effacer le dossier '%1'? +do you really want to delete the selected signatures? felamimail fr Voulez-vous vraiment supprimer les signatures sélectionnées? +does not contain felamimail fr ne contient pas +does not match felamimail fr ne correspond pas +does not match regexp felamimail fr ne correspond pas à la regexp +don't use draft folder felamimail fr Ne pas utiliser un dossier brouillon +don't use sent felamimail fr Ne pas utiliser Eléments envoyés +don't use trash felamimail fr Ne pas utiliser la Corbeille +down felamimail fr bas +download felamimail fr Télécharger +download this as a file felamimail fr Télécharger en tant que fichier +draft folder felamimail fr dossier brouillon +drafts felamimail fr Projets +e-mail felamimail fr EMail +e-mail address felamimail fr Adresse de messagerie +e-mail folders felamimail fr Dossiers EMail +edit email forwarding address felamimail fr Editer l'adresse de transfert d'email +edit filter felamimail fr Modifier le filtre +edit rule felamimail fr Modifier la règle +edit selected felamimail fr Modifier sélectionné +edit vacation settings felamimail fr Editer les paramètre de vacances +email address felamimail fr Adresse de messagerie +email forwarding address felamimail fr Adresse mail de transfert +email signature felamimail fr Signature de messagerie +emailaddress felamimail fr adresse email +empty trash felamimail fr Vider la Corbeille +enable felamimail fr Activer +encrypted connection felamimail fr connexion chiffrée +enter your default mail domain ( from: user@domain ) admin fr Entrez votre domaine par défaut (De: utilisateur@domaine.com) +enter your imap mail server hostname or ip address admin fr Entrez le nom de votre serveur de mail IMAP ou son adresse IP +enter your sieve server hostname or ip address admin fr Entrez le nom de votre serveur SIEVE ou son adresse IP +enter your sieve server port admin fr Entrez le port de votre serveur SIEVE +enter your smtp server hostname or ip address admin fr Entrez le nom ou l'adresse IP de votre serveur SMTP +enter your smtp server port admin fr Entrez le port SMTP +error felamimail fr ERREUR +error connecting to imap serv felamimail fr Erreur lors de la connexion au serveur IMAP +error connecting to imap server. %s : %s. felamimail fr Erreur lors de connexion au serveur IMAP. %s : %s. +error connecting to imap server: [%s] %s. felamimail fr Erreur lors de connexion au serveur IMAP: [%s] %s. +error opening felamimail fr Erreur à l'ouverture +every felamimail fr tous +every %1 days felamimail fr tous les %1 jours +expunge felamimail fr Purger +extended felamimail fr étendu +felamimail common fr Messagerie +file into felamimail fr Fichier dans +files felamimail fr Fichiers +filter active felamimail fr Filtre actif +filter name felamimail fr Nom du filtre +filter rules common fr Règles de filtrage +first name felamimail fr Prénom +flagged felamimail fr Marqué +flags felamimail fr Drapeaux +folder acl felamimail fr Droits sur le dossier +folder name felamimail fr Nom du dossier +folder path felamimail fr Chemin du dossier +folder preferences felamimail fr Préférences du dossier +folder settings felamimail fr Réglages du dossier +folder status felamimail fr Etat du dossier +folderlist felamimail fr Liste des dossiers +foldername felamimail fr Nom du dossier +folders felamimail fr Dossiers +folders created successfully! felamimail fr Dossiers crées avec succès! +follow felamimail fr Suivre +for mail to be send - not functional yet felamimail fr Pour le mail à envoyer - pas encore fonctionnel +for received mail felamimail fr Pour le mail reçu +forward felamimail fr Transférer +forward to felamimail fr transférer à +forward to address felamimail fr Tranférer à l'adresse +forwarding felamimail fr Transfert +found felamimail fr Trouvé +fri felamimail fr Ven +from felamimail fr De +from(a->z) felamimail fr De (A->Z) +from(z->a) felamimail fr De (Z->A) +full name felamimail fr Nom complet +greater than felamimail fr plus grand que +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail fr Jettez un oeil à www.felamimail.org pour en savoir plus sur Squirrelmail.
    +header lines felamimail fr Lignes d'Entête +hide header felamimail fr Cacher l'entête +hostname / address felamimail fr nom d'hôte / adresse +html felamimail fr HTML +icons and text felamimail fr Icônes et texte +icons only felamimail fr Icônes seulement +identifying name felamimail fr Identifie le nom +identity felamimail fr identité +if felamimail fr SI +if from contains felamimail fr Si l'expéditeur contient +if mail header felamimail fr Si l'en-tête de courrier +if message size felamimail fr Si la taille du message +if subject contains felamimail fr Si le sujet contient +if to contains felamimail fr Si A contient +if using ssl or tls, you must have the php openssl extension loaded. felamimail fr Si vous utilisez SSL ou TLS, l'extension PHP openssl doit être chargée. +illegal folder name. please select a different name. felamimail fr Nom de dossier illégal. SVP choisissez-en un autre. +imap felamimail fr IMAP +imap server felamimail fr Serveur IMAP +imap server address felamimail fr Adresse IP du serveur IMAP +imap server closed the connection. felamimail fr le serveur IMAP a fermé la connexion. +imap server closed the connection. server responded: %s felamimail fr le serveur IMAP a fermé la connexion. Le serveur a répondu: %s +imap server password felamimail fr mot de passe du serveur imap +imap server type felamimail fr Type de serveur IMAP +imap server username felamimail fr utilisateur du serveur imap +imaps authentication felamimail fr Authentification IMAPS +imaps encryption only felamimail fr Chiffrement IMAPS seulement +in felamimail fr Dans +inbox felamimail fr Boîte de réception +incoming mail server(imap) felamimail fr serveur de courier entrant (IMAP) +index order felamimail fr Ordre d'index +info felamimail fr Info +invalid user name or password felamimail fr Nom d'utilisateur ou mot de passe invalide +javascript felamimail fr JavaScript +jumping to end felamimail fr saut à la fin +jumping to start felamimail fr saut au début +keep a copy of the message in your inbox felamimail fr Garder une copie du message dans votre courrier entrant +junk felamimail fr Déchet +keep local copy of email felamimail fr Garder un copie local de votre email +kilobytes felamimail fr kilo-octets +language felamimail fr Langue +last name felamimail fr Nom de famille +left felamimail fr Gauche +less felamimail fr Moins +less than felamimail fr Moins que +light gray felamimail fr Gris léger +list all felamimail fr Lister tous +loading felamimail fr chargement +location of buttons when composing felamimail fr Emplacement des boutons lors de la composition +mail server login type admin fr Type d'authentification de messagerie +mail settings felamimail fr Réglages EMail +mainmessage felamimail fr Message principal +manage emailaccounts preferences fr Gérer les comptes email +manage emailfilter / vacation preferences fr Gérer les filtres / les vacances +manage folders common fr Gérer les dossiers +manage sieve common fr Gérer les scripts SIEVE +manage signatures felamimail fr Gérer les signatures +mark as deleted felamimail fr Marquer comme effacé +mark messages as felamimail fr Marquer les messages sélectionnés comme +mark selected as flagged felamimail fr Marquer le choix comme marqués +mark selected as read felamimail fr Marquer le choix comme lus +mark selected as unflagged felamimail fr Marquer le choix comme non-marqués +mark selected as unread felamimail fr Marquer le choix comme non-lus +match felamimail fr Correspond +matches felamimail fr correspond +matches regexp felamimail fr correspond +max uploadsize felamimail fr taille de dépôt maximale +message highlighting felamimail fr Mise en évidence de message +message list felamimail fr Liste des messages +messages felamimail fr Messages +mon felamimail fr Lun +move felamimail fr Déplacer +move messages felamimail fr Déplacer les messages +move to felamimail fr Déplacer le choix vers +move to trash felamimail fr Déplacer vers la Corbeille +moving messages to felamimail fr Déplacer les messages vers +name felamimail fr Nom +never display html emails felamimail fr Ne jamais afficher les messages HTML +new common fr Nouveau +new filter felamimail fr Nouveau filtre +next felamimail fr Suivant +next message felamimail fr Message suivant +no active imap server found!! felamimail fr Aucun serveur IMAP trouvé!! +no encryption felamimail fr pas de chiffrement +no filter felamimail fr Pas de filtre +no folders found felamimail fr Aucun dossier trouvé +no folders were found to subscribe to! felamimail fr Aucun dossier auquel s'inscrire n'a été trouvé! +no folders were found to unsubscribe from! felamimail fr Aucun dossier auquel se désinscrire n'a été trouvé! +no highlighting is defined felamimail fr Aucune mise en évidence n'est définie +no message returned. felamimail fr Aucun message retourné. +no messages found... felamimail fr Aucuns messages trouvés... +no messages were selected. felamimail fr Aucun message n'a été choisi. +no plain text part found felamimail fr aucune section texte plein trouvée +no previous message felamimail fr Pas de message précédent +no recipient address given! felamimail fr Il n'a pas d'adresse de destinataire +no signature felamimail fr pas de signature +no supported imap authentication method could be found. felamimail fr Aucune méthode d'authentification IMAP n'a été trouvée. +no valid emailprofile selected!! felamimail fr Aucun profil de messagerie selectionné! +none felamimail fr Aucun +on behalf of felamimail fr sur la base de +one address is not valid felamimail fr Une adresse n'est pas valide +only inbox felamimail fr Seulement INBOX +only one window felamimail fr Seulement une fenêtre +only unseen felamimail fr Seulement les non-vus +open all felamimail fr Tout ouvrir +options felamimail fr Options +or felamimail fr ou +organisation felamimail fr Entreprise +organization felamimail fr Entreprise +organization name admin fr Nom de l'entreprise +outgoing mail server(smtp) felamimail fr serveur de courrier sortant (SMTP) +participants felamimail fr Participants +personal information felamimail fr Informations personnelles +please select a address felamimail fr Sélectionner une adresse +please select the number of days to wait between responses felamimail fr Sélectionner le nombre de jours pour attendre entre les réponses +please supply the message to send with auto-responses felamimail fr Ecriver le message pour envoyer en réponse automatique +port felamimail fr port +posting felamimail fr Poster +previous felamimail fr Précédent +previous message felamimail fr Message précédent +print it felamimail fr Imprimes-la +print this page felamimail fr Imprimer cette page +quicksearch felamimail fr Recherche Rapide +read felamimail fr lu +reading felamimail fr Lire +receive notification felamimail fr Notification de réception +recent felamimail fr Récent +refresh time in minutes felamimail fr Temps de rafraîchissement en minutes +reject with felamimail fr rejecter avec +remove felamimail fr Enlever +remove immediately felamimail fr Enlever immédiatement +rename felamimail fr Renommer +rename a folder felamimail fr Renommer un dossier +rename folder felamimail fr Renommer le dossier +renamed successfully! felamimail fr Renommage réussi! +replied felamimail fr Répondu +reply felamimail fr Répondre +reply all felamimail fr Répondre à tous +reply to felamimail fr Répondre à +replyto felamimail fr Répondre A +respond felamimail fr Répondre +respond to mail sent to felamimail fr Répondre au courrier envoyé à +return felamimail fr Retourner +return to options page felamimail fr Retourner à la page des options +right felamimail fr Droit +row order style felamimail fr style d'ordonnancement de ligne +rule felamimail fr Règle +sat felamimail fr Sa +save felamimail fr Sauver +save as draft felamimail fr enregistrer comme brouillon +save as infolog felamimail fr enregistrer comme infolog +save changes felamimail fr enregistrer les modifications +save message to disk felamimail fr enregistrer le message sur le disque +script name felamimail fr nom du script +script status felamimail fr status du script +search felamimail fr Rechercher +search for felamimail fr Rechercher +select felamimail fr Sélectionner +select all felamimail fr Sélectionner tous +select emailprofile felamimail fr Sélectionner le profil de messagerie +select folder felamimail fr Sélectionner un dossier +select your mail server type admin fr Sélectionner votre type de serveur de messagerie +send felamimail fr Envoyer +send a reject message felamimail fr envoyez un message de rejet +sent felamimail fr Envoyer +sent folder felamimail fr Dossier contenant les messages envoyés +server supports mailfilter(sieve) felamimail fr le serveur support les filtres de messages (sieve) +show header felamimail fr Montrer les entêtes +show new messages on main screen felamimail fr Afficher les nouveaux messages sur l'écran principal +sieve script name felamimail fr nom du script sieve +sieve settings admin fr Réglages SIEVE +signature felamimail fr Signature +simply click the target-folder felamimail fr Cliquer sur le dossier de destination +size felamimail fr Taille +size of editor window felamimail fr Taille de la fenêtre d'édition +size(...->0) felamimail fr Taille (MAX -> 0) +size(0->...) felamimail fr Taille (0 -> MAX) +skipping forward felamimail fr saut en avant +skipping previous felamimail fr saut en arrière +small view felamimail fr Affichage réduit +smtp settings admin fr Réglages SMTP +subject felamimail fr Sujet +subject(a->z) felamimail fr Sujet (A->Z) +subject(z->a) felamimail fr Sujet (Z->A) +submit felamimail fr Soumettre +subscribe felamimail fr Souscrire +subscribed felamimail fr Souscrit +subscribed successfully! felamimail fr Souscrit avec succès! +sun felamimail fr Di +system signature felamimail fr signature systéme +table of contents felamimail fr Table des contenus +templates felamimail fr Templates +text only felamimail fr Texte seulement +the connection to the imap server failed!! felamimail fr La connexion au serveur IMAP a échoué!! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail fr Le serveur IMAP ne supporte pas la méthode d'authentification choisie. Veuillez contacter votre administrateur système. +the mimeparser can not parse this message. felamimail fr L'analyseur mime ne peut pas décoder ce message. +then felamimail fr ALORS +this folder is empty felamimail fr CE DOSSIER EST VIDE +this php has no imap support compiled in!! felamimail fr PHP n'est pas compilé avec le support IMAP! +thu felamimail fr Jeu +to felamimail fr A +to mail sent to felamimail fr au message envoyé à +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail fr Pour utiliser une connexion TLS vous devez avoir PHP 5.1.0 ou supérieur. +translation preferences felamimail fr Préférences de traduction +translation server felamimail fr Serveur de traduction +trash felamimail fr Corbeille +trash folder felamimail fr Dossier Corbeille +tue felamimail fr Ma +type felamimail fr Type +unexpected response from server to authenticate command. felamimail fr Réponse inattendue du serveur à la commande AUTHENTICATE. +unexpected response from server to digest-md5 response. felamimail fr Réponse inattendue du serveur à la réponse Digest-MD5. +unexpected response from server to login command. felamimail fr Réponse inattendue du serveur à la commande LOGIN. +unflagged felamimail fr Dé-marqué +unknown err felamimail fr Erreur inconnue +unknown error felamimail fr Erreur inconnue +unknown imap response from the server. server responded: %s felamimail fr Réponse IMAP inconnue du serveur. Le serveur a répondu: %s +unknown sender felamimail fr Expéditeur inconnu +unknown user or password incorrect. felamimail fr Utilisateur inconnu ou mot de passe incorrect. +unread common fr Non-lu +unseen felamimail fr Non-lu +unselect all felamimail fr Désélectionner tout +unsubscribe felamimail fr Se désinscrire +unsubscribed felamimail fr Désinscrit +unsubscribed successfully! felamimail fr Désinscrit avec succès! +up felamimail fr Haut +updating message status felamimail fr mise à jour du statut des messages +updating view felamimail fr mise à jour des vues +use emailadmin to create profiles felamimail fr utiliser Admin mailpour créer les profiles +use a signature felamimail fr Utiliser une signature +use a signature? felamimail fr Utiliser une signature? +use addresses felamimail fr Utiliser les adresses +use custom settings felamimail fr Utiliser les préférences personnelles +use regular expressions felamimail fr Utiliser des expressions régulières +use smtp auth admin fr Utiliser l'authentification SMTP +users can define their own emailaccounts admin fr Les utilisateurs peuvent définir leurs propres comptes de messagerie +vacation notice common fr Notification de vacances +vacation notice is active felamimail fr La notice d'absence est activée +validate certificate felamimail fr valider le certificat +view full header felamimail fr Voir l'entête complet +view header lines felamimail fr voir les lignes d'entête +view message felamimail fr Voir message +viewing full header felamimail fr Visualise toutes les entêtes +viewing message felamimail fr Visualise le message +viewing messages felamimail fr Visualise les messages +wed felamimail fr Me +when deleting messages felamimail fr Quand j'efface les messages +with message felamimail fr avec message +with message "%1" felamimail fr avec message "%1" +wrap incoming text at felamimail fr Couper le texte entrant à +writing felamimail fr Ecrire +wrote felamimail fr Ecrivait diff --git a/felamimail/lang/egw_hr.lang b/felamimail/lang/egw_hr.lang new file mode 100644 index 0000000000..3862b7e1d2 --- /dev/null +++ b/felamimail/lang/egw_hr.lang @@ -0,0 +1,811 @@ +%1 %2 in %3 calendar hr %1 %2 u %3 +%1 matches found calendar hr PronaÄ.eno %1 podataka koji ispunjavaju kriterij +%1 records imported calendar hr Podataka %1 uneseno +%1 records read (not yet imported, you may go %2back%3 and uncheck test import) admin hr %1 zapisa proÄitano (joÅ¡ nije uvezeno, možete se %2vratiti%3 i odznaÄiti Testiraj Uvoz) +%1 records read (not yet imported, you may go back and uncheck test import) calendar hr %1 podataka proÄitano (joÅ¡ nije uneseno, možete se vratiti i deselektirati testno unoÅ¡enje) +(e.g. 1969) admin hr (npr. 1969) +(for weekly) calendar hr (Za tjedno ponavljanje) +(i/v)cal calendar hr (i/v)Cal +(no subject) felamimail hr (nema teme) +(only cc/bcc) felamimail hr (samo Cc/Bcc) +(unknown sender) felamimail hr (nepoznat poÅ¡aljioc) +1 match found calendar hr PronaÄ.en 1 zapis???????? +no conversion type <none> could be located. please choose a conversion type from the list admin hr Nema konverzijskog tipa <nema> nemogu locirati. Molim vas izaberite vrstu konverzije s liste +@-eval() is only availible to admins!!! admin hr @-eval() je dostupan samo administratorima!!! +a calendar hr a +accept calendar hr Prihvati +accepted calendar hr PrihvaÄ.eno +action that caused the notify: added, canceled, accepted, rejected, ... calendar hr Akcija Äija je posljedica poruka: Dodano, Prekinuto, Primljeno, Odbijeno, ... +actions admin hr Akcije +activate felamimail hr Aktiviraj +activate script felamimail hr aktiviraj skriptu +add a single entry by passing the fields. calendar hr Dodaj jedan unos proslijeÄ.ujuÄ.i polja +add address felamimail hr Dodaj adresu +add alarm calendar hr Dodaj alarm +add contact calendar hr Dodaj kontakt +add custom field admin hr Dodaj proizvoljno polje +add or update a single entry by passing the fields. calendar hr Dodaj ili obnovi jedan unos proslijeÄ.ujuÄ.i polja. +add rule felamimail hr Dodaj pravilo +add script felamimail hr Dodaj skriptu +add to %1 felamimail hr Dodaj k %1 +add to address book felamimail hr Dodaj u adresar +add to addressbook felamimail hr dodaj u adrersar +added calendar hr Dodano +additional info felamimail hr Dodatne informacije +address book felamimail hr Adresar +address book - vcard in admin hr Adresar - VCard in +address book - view admin hr Adresar - pregled +address book search felamimail hr Pretraživanje adresara +address line 2 admin hr Adresa Linija 2 +address line 3 admin hr Adresa Linija 3 +address type admin hr Tip Adrese +addressbook common hr Adresar +addressbook preferences admin hr Postavke Adresara +addressbook-fieldname admin hr Adresar-Naziv polja +addvcard admin hr Dodaj VCard +after message body felamimail hr Nakon poruke +alarm calendar hr Alarm +alarm for %1 at %2 in %3 calendar hr Alarm za %1 pri %2 u %3 +alarm management calendar hr Upravljanje alarmom +alarm-management calendar hr Upravljanje-alarmom +alarms calendar hr Alarmi +all address books felamimail hr svi adresari +all day calendar hr Cijeli dan +all folders felamimail hr Sve mape +alt. csv import admin hr Alt. CSV Uvoz +always show html emails felamimail hr Uvijek prikaži HTML e-mailove +anyone felamimail hr svi +are you sure you want to delete this country ? calendar hr Da li ste sigurni da želite obrisati ovu zemlju? +are you sure you want to delete this field? admin hr Da li ste sigurni da želite obrisati ovo polje? +are you sure you want to delete this holiday ? calendar hr Da li ste sigurni da želite obrisati ovaj praznik? +are you sure\nyou want to\ndelete these alarms? calendar hr Da li ste sigurni da želite obrisati ovaj alarm? +are you sure\nyou want to\ndelete this entry ? calendar hr Da li ste sigurni da želite obrisati ovaj podatak? +are you sure\nyou want to\ndelete this entry ?\n\nthis will delete\nthis entry for all users. calendar hr Jeste li sigurni da želite obrisati ovaj zapis ?\n\nOvaj zapis Ä.e biti obrisan za sve korisnike. +are you sure\nyou want to\ndelete this single occurence ?\n\nthis will delete\nthis entry for all users. calendar hr Da li ste sigurni da želite obrisati occurence ?\n\nOvaj zapis Ä.e biti obrisan za sve korisnike. +as a subfolder of felamimail hr kao podmapa od +attachments felamimail hr Privitci +auto refresh folder list felamimail hr Automatsko obnavljavljanje liste mapa +back to folder felamimail hr Povratak u mapu +bad reque felamimail hr Nepravilno ponavljanje reda +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail hr U ovisnosti o danim uvjetima, ulazne poruke mogu imati razliÄite podloge u listi poruka. Ovime lakÅ¡e razlikujete od koga ste dobili poruke, posebno ukoliko ste na nekoj mail listi. +bbs phone admin hr BBS Telefon +bcc felamimail hr BCC +before headers felamimail hr Prije zaglavlja +before the event calendar hr prije obveze +between headers and message body felamimail hr IzmeÄ‘u zaglavlja i teksta poruke +birthday common hr Datum RoÄ.enja +birthdays common hr RoÄ.endani +blank admin hr Prazno +body part felamimail hr body part +brief description calendar hr Kratki opis +business calendar hr Poslovno +business address type admin hr Vrsta Poslovne Adrese +business city admin hr Tvrtka - Grad +business country admin hr Tvrtka - Država +business email admin hr Tvrtka - E-mail +business email type admin hr Tvrtka - Vrsta e-maila +business fax admin hr Tvrtka - Fax +business phone admin hr Tvrtka - Broj telefona +business state admin hr Tvrtka - Županija +business street admin hr Tvrtka - Ulica +business zip code admin hr Tvrtka - PoÅ¡tanski broj +calendar common hr Kalendar +calendar - [iv]cal importer calendar hr Calendar - [iv]Cal Importer +calendar - add calendar hr Kalendar - Dodaj +calendar - edit calendar hr Kalendar - Obrada +calendar event calendar hr Kalendarska obveza +calendar holiday management admin hr ureÄ.ivanje kalendarskih praznika +calendar preferences calendar hr Postavke kalendara +calendar settings admin hr Postavke kalendara +calendar-fieldname calendar hr Kalendar - Ime polja +can't connect to inbox!! felamimail hr nemogu se spojiti sa INBOX!! +canceled calendar hr Otkazano +car phone admin hr Telefon u Automobilu +cc felamimail hr CC +cell phone admin hr Mobilni telefon +change all events for $params['old_owner'] to $params['new_owner']. calendar hr Promijeni sve obveze od $params['old_owner'] u $params['new_owner']. +change folder felamimail hr Promijeni mapu +change status calendar hr Status promjene +charset of file calendar hr Charset of file +checkbox felamimail hr selektiraj +city common hr Grad +click %1here%2 to return to the calendar. calendar hr Pritisnite %1ovdje%2 za povratak u kalendar. +click here to log back in. felamimail hr Ponovni prijavak +click here to return to %1 felamimail hr Povratak na %1 +close all felamimail hr zatvori sve +close this page felamimail hr zatvori ovu stranicu +close window felamimail hr Zatvori prozor +color felamimail hr Boja +company common hr Tvrtka +company name common hr Naziv tvrtke +compose felamimail hr Pisanje nove poruke +compress folder felamimail hr Smanjii mapu +configuration felamimail hr Konfiguracija +contact common hr Kontakt +contact application admin hr Aplikacija kontakta +contact settings admin hr PodeÅ¡enja kontakta +contains felamimail hr sadrži +copied by %1, from record #%2. admin hr Kopirao %1, iz zapisa #%2. +countries calendar hr Zemlje +country calendar hr Zemlja +create felamimail hr Napravi +create folder felamimail hr Napravi mapu +create sent felamimail hr Napravi poslano +create subfolder felamimail hr Napravi podmapu +create trash felamimail hr Napravi smeće +created by calendar hr Napravio +created folder successfully! felamimail hr Mapa uspjeÅ¡no napravljena +csv-fieldname calendar hr CSV-Ime polja +csv-filename calendar hr CSV-Ime datoteke +custom admin hr Proizvoljno +custom fields calendar hr Proizvoljna polja +custom fields and sorting common hr Proizvoljna polja i sortiranje +daily calendar hr Dnevno +daily matrix view calendar hr Dnevni matriÄni pregled +dark blue felamimail hr Tamno plavo +dark cyan felamimail hr Tamno cijan +dark gray felamimail hr Tamno sivo +dark green felamimail hr Tamno zeleno +dark magenta felamimail hr Tamno magenta +dark yellow felamimail hr Tamno žuto +date(newest first) felamimail hr po datumu (noviji prvo) +date(oldest first) felamimail hr po datumu (stariji prvo) +days calendar hr dana +days repeated calendar hr dana ponavljano +dayview calendar hr Dnevni pregled +deactivate script felamimail hr deaktiviraj skriptu +debug output in browser admin hr Prikaz poruka o izlaznim greÅ¡kama unutar pretraživaÄa +default appointment length (in minutes) calendar hr PoÄetno vrijeme obveze (u minutama) +default calendar filter calendar hr PoÄetna vrijednost kalendarskog filtra +default calendar view calendar hr PoÄetni izgled kalendara +default filter admin hr Osnovni Filter +default length of newly created events. the length is in minutes, eg. 60 for 1 hour. calendar hr PoÄetno postavljeno trajanje novostvorenih obveza. Trajanje je u minutama, tj. 60 za 1 sat +default sorting order felamimail hr PoÄetno postavljen redoslijed sortiranja +defines the size in minutes of the lines in the day view. calendar hr Definira veliÄinu u minutama linija u dnevnom pregledu. +delete a single entry by passing the id. calendar hr ObriÅ¡i jedan unos proslijeÄ.ujuÄ.i polja +delete all felamimail hr obriÅ¡i sve +delete an entire users calendar. calendar hr ObriÅ¡i korisnikov cijelokupni kalendar. +delete folder felamimail hr ObriÅ¡i mapu +delete selected felamimail hr ObriÅ¡i izabrano +delete selected contacts calendar hr ObriÅ¡i izabrane kontakte +delete selected messages felamimail hr obriÅ¡i izabrane poruke +delete series calendar hr ObriÅ¡i serije +delete single calendar hr ObriÅ¡i jedan +deleted felamimail hr obrisano +deleted folder successfully! felamimail hr UspjeÅ¡no obrisana mapa +department common hr Odjel +description calendar hr Opis +disable felamimail hr Onemogući +disabled calendar hr Onesposobljeno +display interval in day view calendar hr Prikaži interval u dnevnom izgledu +display message in new window felamimail hr Prikaži poruku u novom prozoru +display mini calendars when printing calendar hr Prikaži smanjene kalendare prilikom ispisa +display of html emails felamimail hr Prikaz HTML emailova +display only when no plain text is available felamimail hr Prikaži samo u neprisutnosti obiÄnog teksta +display preferences felamimail hr Prikaži postavke +display status of events calendar hr Prikaži status obveza +displays your default calendar view on the startpage (page you get when you enter egroupware or click on the homepage icon)? calendar hr Prikazuje vaÅ¡ poÄetno postavljen izgled kalendara na poÄetnoj stranici (stranica koja se uÄita kada otvorite eGroupware ili kliknete na ikonu za poÄetnu stranicu)? +do it! felamimail hr UÄini to!! +do not use sent felamimail hr Ne upotrebljavaj mapu Poslano +do not use trash felamimail hr Ne upotrebljavaj mapu Smeće +do you really want to delete the '%1' folder? felamimail hr Da li zaista želite obrsati mapu: '%1'? +do you want to be notified about new or changed appointments? you be notified about changes you make yourself.
    you can limit the notifications to certain changes only. each item includes all the notification listed above it. all modifications include changes of title, description, participants, but no participant responses. if the owner of an event requested any notifcations, he will always get the participant responses like acceptions and rejections too. calendar hr Da li želite biti obavijeÅ¡teni o novim ili promijenjenim obvezama? Biti Ä.e te obavijeÅ¡teni o promijenama kada ih sami napravite.
    Obavijesti možete ograniÄiti na samo o odreÄ.ene promjene. Svaka obavijest ukljuÄuje dogaÄ.aje nabrojene gore. Sve promjene ukljuÄuju promjene naslova, opisa, sudionika, ali ne i odgovor sudionika. Ukoliko je vlasnik obveze zahtijevao neku obavijest, uvijek Ä.e dobiti sudionikov odgovor poput prihvata ali i odbijanja. +do you want to receive a regulary summary of your appointsments via email?
    the summary is sent to your standard email-address on the morning of that day or on monday for weekly summarys.
    it is only sent when you have any appointments on that day or week. calendar hr Da li želite primati redoviti sažetak vaših obveza na vaš e-mail?
    Sažetak Ä.e biti poslan na vaÅ¡u e-mail adresu ujutro toga dana ili u ponedjeljak za tjedne sažetke.
    Sažetak Ä.e biti poslan samo ako imate obvezu taj dan ili tjedan. +do you wish to autoload calendar holidays files dynamically? admin hr Da li želite dinamiÄko automatizirano punjenje datoteka za praznike? +does not contain felamimail hr ne sadrži +does not match felamimail hr nema podudarnosti +does not match regexp felamimail hr nema podudarnosti regexp +domestic admin hr DomaÄ.i +don't use sent felamimail hr Ne upotrebljavaj PoÅ¡iljanje +don't use trash felamimail hr Ne upotrebljavaj Smeće +down felamimail hr dolje +download felamimail hr Prenesi sa poslužitelja +download export file (uncheck to debug output in browser) admin hr Preuzmi sa poslužitelja izvezenu datoteku (OdznaÄi za prikaz poruka o izlaznim greÅ¡kama unutar pretraživaÄa) +download this as a file felamimail hr Prenesi sa poslužitelja kao datoteku +duration calendar hr Trajanje +e-mail felamimail hr E-Mail +e-mail address felamimail hr E-Mail adresa +e-mail folders felamimail hr E-Mail mapa +edit custom field admin hr Uredi proizvoljno polje +edit custom fields admin hr Uredi proizvoljna polja +edit filter felamimail hr Uredi filter +edit rule felamimail hr uredi pravilo +edit selected felamimail hr Uredi izabrano +edit series calendar hr Uredi serije +edit single calendar hr Uredi pojedinaÄan +email address felamimail hr E-Mail adresa +email notification calendar hr Obavijesti putem e-maila +email notification for %1 calendar hr Obavijesti o Emailu za %1 +email signature felamimail hr Email potpis +empty for all calendar hr isprazni za sve +empty trash felamimail hr isprazni Smeće +enable felamimail hr omogući +enabled calendar hr OmoguÄ.eno +end date/time calendar hr Datum/Vrijeme kraja +enddate calendar hr Datum kraja +ends calendar hr ZavrÅ¡ava +enter output filename: ( .vcs appended ) calendar hr Unesite ime izlazne datoteke: ( .vcs nastavak ) +enter the path to the exported file here admin hr Unesi stazu do izvezene datoteke +enter your default mail domain ( from: user@domain ) admin hr Unesite vaÅ¡u poÄetno postavljenu domenu za poruke (format: korisnik@domena) +enter your imap mail server hostname or ip address admin hr Unesite ime vaÅ¡eg IMAP poslužitelja ili IP adresu +enter your sieve server hostname or ip address admin hr Unesite ime vaÅ¡eg SIEVE poslužitelja ili IP adresu +enter your sieve server port admin hr Unesite port vaÅ¡eg SIEVE poslužitelja +enter your smtp server hostname or ip address admin hr Unesite ime vaÅ¡eg SMTP poslužitelja ili IP adresu +enter your smtp server port admin hr Unesite port vaÅ¡eg SMTP poslužitelja +error felamimail hr GREÅ KA +error connecting to imap serv felamimail hr GreÅ¡ka prilikom spajanja na IMAP poslužitelj +error opening felamimail hr GreÅ¡ka prilikom otvaranja +event details follow calendar hr Slijede detalji obveze +exceptions calendar hr Iznimke +export calendar hr Export +export a list of entries in ical format. calendar hr Export a list of entries in iCal format. +export contacts admin hr Izvezi Kontakte +export file name admin hr Izvezi Datoteku +export from addressbook admin hr Izvezi iz Adresara +expunge felamimail hr IzbriÅ¡i +extended calendar hr Produži +extended updates always include the complete event-details. ical's can be imported by certain other calendar-applications. calendar hr ProÅ¡ireni updates uvijek ukljuÄuju potpune detalje o obvezama. iCal-ove datoteke mogu uvezesti i odreÄ.ene kalendarske aplikacije. +external participants calendar hr Vanjski sudionici +extra admin hr Ekstra +failed sending message to '%1' #%2 subject='%3', sender='%4' !!! calendar hr Nisam uspio poslati poruku za '%1' #%2 subject='%3', sender='%4' !!! +fax admin hr Fax +fax number common hr Fax - Broj +felamimail common hr FelaMiMail +field %1 has been added ! admin hr Polje %1 je dodano ! +field %1 has been updated ! admin hr Polje %1 ažurirano ! +field name admin hr Ime Polja +fields to show in address list admin hr Polja za prikazati u listi adresa +fieldseparator calendar hr Razmaknica polja +file into felamimail hr informacije o datoteci +files felamimail hr datoteke +filter active felamimail hr aktivni filtri +filter name felamimail hr Ime filtra +first name felamimail hr Ime +firstname of person to notify calendar hr Ime osobe za obavijestiti +flagged felamimail hr flagged +flags felamimail hr Flags +folder acl felamimail hr acl mapa +folder name felamimail hr Ime mape +folder path felamimail hr Folder Path +folder preferences felamimail hr Postavke mape +folder settings felamimail hr Postavke mape +folder status felamimail hr Status mape +folderlist felamimail hr Lista mapa +foldername felamimail hr Ime mape +folders felamimail hr Mape +folders created successfully! felamimail hr Mape napravljene uspjeÅ¡no! +follow felamimail hr prati +for mail to be send - not functional yet felamimail hr Slanje poÅ¡te joÅ¡ nije u funkciji +for received mail felamimail hr Za primljenu poÅ¡tu +format of event updates calendar hr Ažuriranje formata ili dogaÄ.aja +forward felamimail hr Proslijedi +found felamimail hr PronaÄ‘eno +fr calendar hr P +free/busy calendar hr Obveze +freebusy: unknow user '%1', wrong password or not availible to not loged in users !!! calendar hr Obveze: Nepoznat korisnik '%1', pogreÅ¡na zaporka ili nije dostupno neprijavljenim korisnicima !!! +frequency calendar hr Frekvencija / UÄestalost +fri felamimail hr Pet +from felamimail hr PoÅ¡aljitelj +from(a->z) felamimail hr po poÅ¡aljitelju (silazno A->Z) +from(z->a) felamimail hr po poÅ¡aljitelju (uzlazno Z->A) +full description calendar hr Puni opis +full name felamimail hr Puno ime +fullname of person to notify calendar hr Puno ime osobe za obavijestiti +generate printer-friendly version calendar hr Verzija za ispis +geo admin hr GEO +global categories calendar hr Globalne kategorije +global public and group public calendar hr Global Public and group public +global public only calendar hr Samo javno globalno +go! calendar hr Kreni! +grant addressbook access common hr Dozvole Pristupa Adresaru +grant calendar access common hr Dozvoli pristup kalendaru +group planner calendar hr Grupni planer +group public only calendar hr Samo javna grupa +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail hr Pogledajte www.felamimail.org da bi nauÄili neÅ¡to viÅ¡e o Squirrelmail.
    +header lines felamimail hr Linije zaglavlja +here is your requested alarm. calendar hr Ovo je vaÅ¡ zahtijevani alarm +hide header felamimail hr sakrij zaglavlje +high priority calendar hr Visoki prioritet +holiday calendar hr Praznik +holiday management calendar hr UreÄ.ivanje praznika +holiday-management calendar hr Upravljanje praznicima +holidays calendar hr Praznici +home address type admin hr Vrsta domaÄ.e adrese +home city admin hr Osobno - Grad +home country admin hr Osobno - Država +home email admin hr Osobno - Email +home email type admin hr Osobno - vrsat Email +home phone admin hr Osobno - Telefon +home state admin hr Osobno - Županija +home street admin hr Osobno - Ulica +home zip code admin hr Osobno - PoÅ¡tanski broj +hours calendar hr sati +html felamimail hr HTML +i participate calendar hr Sudjelujem +ical / rfc2445 calendar hr iCal / rfc2445 +icons and text felamimail hr Ikone i tekst +icons only felamimail hr Samo ikone +identifying name felamimail hr Ime za prepoznavanje +if felamimail hr AKO +if checked holidays falling on a weekend, are taken on the monday after. calendar hr ukoliko izabrani, praznici koji padaju na subotu ili nedjelju, primjenjuju se na slijedeÄ.i ponedjeljak. +if you dont set a password here, the information is availible to everyone, who knows the url!!! calendar hr Ukoliko tu ne postavite zaporku, ova informacija je dostupna svima koji poznaju URL!!! +ignore conflict calendar hr Zanemari sukob +illegal folder name. please select a different name. felamimail hr Nažalost nemožete koristiti uneÅ¡eno ime. Molimo vas unesite drugo ime za mapu. +imap felamimail hr IMAP +imap server felamimail hr IMAP Poslužitelj +imap server address felamimail hr IMAP Adresa poslužitelja +imap server type felamimail hr IMAP vrsta poslužitelja +imaps authentication felamimail hr IMAPS provjera valjnanosti +imaps encryption only felamimail hr Samo IMAPS enkripcija +import calendar hr Uvezi +import contacts admin hr Uvezi Kontakte +import csv-file common hr Uvezi CSV-File +import csv-file into addressbook admin hr Uvezi CSV-Datoteku u Adresar +import file admin hr Uvezi Datoteku +import from ldif, csv, or vcard admin hr Uvezi iz LDIF, CSV, ili VCard +import from outlook admin hr Uvezi iz Outlook +import next set admin hr Uvezi slijedeÄ.i set +import_instructions admin hr U Netscape, otvori Adresar i izaberi Export iz File menija. Izvezena datoteka biti Ä.e u LDIF formatu.

    Ili, u Outlook, izaberite vaš Contacts mapu, izaberite Import and Export... iz File menija i izvezite vaše kontakte u tekst razmaknut zarezom (comma separated text (CSV)) datoteku.

    Ili, u Palm Desktop 4.0 ili viÅ¡e, izaberite vaÅ¡ adresar i izaberite Export iz File menija. Izvezena datoteka biti Ä.e u VCard formatu. +in felamimail hr u +in order for squirrelmail to provide the full set of options you need to create the special folders listed below. just click the check box and hit the create button. felamimail hr Kako bi SquirelMail ponudio sve mogućnosti morate ispod napraviti posebnu listu mapa. Samo oznaÄite i izaberite "napravi". +in the center felamimail hr u centru +index order felamimail hr Redoslijed indeksa +info felamimail hr Informacije +international admin hr MeÄ.unarodni +interval calendar hr Interval +intervals in day view calendar hr intervali u dnevnom pregledu +intervals per day in planner view calendar hr intervali po danu u planerskom preledu +invalid entry id. calendar hr NevažeÄ.i unos indetiteta +invalid user name or password felamimail hr Nevaljani korisnik ili zaporka +isdn phone admin hr ISDN Telefon +javascript felamimail hr JavaScript +label admin hr LAbela +language felamimail hr Jezik +last calendar hr poslijednji +last name felamimail hr Prezime +lastname of person to notify calendar hr Prezime osobe za obavijestiti +ldap context for contacts admin hr LDAP kontekst za kontakte +ldap host for contacts admin hr LDAP poslužitelj za kontakte +ldap root dn for contacts admin hr LDAP root dn for contacts +ldap root pw for contacts admin hr LDAP root pw for contacts +ldif admin hr LDIF +left felamimail hr Lijevo +length shown
    (emtpy for full length) calendar hr Pruikazana dužina
    (Ostavite prazno za punu dužinu) +length
    (<= 255) calendar hr Dužina
    (<= 255) +less felamimail hr manje +let this folder contain subfolders felamimail hr Ova mapa smije sadržavati podmape +light blue felamimail hr Svijetlo plavo +light cyan felamimail hr Svijetlo cijan +light gray felamimail hr Svijetlo sivo +light green felamimail hr Svijetlo zeleno +light magenta felamimail hr Svijetlo magenta +light yellow felamimail hr Svijetlo žuto +line 2 admin hr Linija 2 +link calendar hr Link +link to view the event calendar hr Link to view the event +list all felamimail hr Prikaži sve +list all categories. calendar hr Prikaži sve kategorije. +load [iv]cal calendar hr Unesi [iv]Cal +location calendar hr Lokacija +location of buttons when composing felamimail hr Lokacija buttons prilikom pisanja poruke +location of folder list felamimail hr Lokacija liste mapa +location to autoload from admin hr Lokacija za automatsko unoÅ¡enje forme +mail server login type admin hr Vrsta prijave mail poslužitelja +mail settings felamimail hr Postavke poÅ¡te +mainmessage felamimail hr glavna poruka +make freebusy information availible to not loged in persons? calendar hr OmoguÄ.i pristup informacijama o obvezama korisnicima koji nisu prijavljeni +manage folders felamimail hr UreÄ‘ivanje mapa +manage sieve felamimail hr UreÄ‘ivanje Sieve skripti +mark as deleted felamimail hr OznaÄi obrisanim +mark messages as felamimail hr OznaÄi izabranu poruku kao +mark records as private admin hr OznaÄi podatak kao privatan +mark selected as flagged felamimail hr OznaÄi izabrano kao flagged +mark selected as read felamimail hr OznaÄi izabrano proÄitanim +mark selected as unflagged felamimail hr OznaÄi izabrano kao unflagged +mark selected as unread felamimail hr OznaÄi izabrano neproÄitanim +match felamimail hr PronaÄ‘i podudarnosti +matches felamimail hr podudarnosti +matches regexp felamimail hr podudara se sa regexp +matrixview calendar hr MatriÄni pregled +medium gray felamimail hr Srednje sivo +message felamimail hr Poruka +message highlighting felamimail hr Istaknuto u poruci +message list felamimail hr Lista poruka +message phone admin hr Telefon za poruke +messages felamimail hr poruke +middle name admin hr Srednje Ime +minute felamimail hr Minuta +minutes felamimail hr Minute +mo calendar hr P +mobile admin hr Mobilni +mobile phone admin hr Mobilni Telefon +modem phone admin hr Modemski Telefon +modified calendar hr Promijenjeno +modify list of external participants calendar hr Promijeni listu vanjskih sudionika +mon felamimail hr Pon +month calendar hr Mjesec +monthly calendar hr MjeseÄno +monthly (by date) calendar hr MjeseÄno (po datumima) +monthly (by day) calendar hr MjeseÄno (po danima) +monthview calendar hr MjeseÄni pregled +more felamimail hr joÅ¡ (viÅ¡e) +move felamimail hr premjesti +move messages felamimail hr premjesti poruku +move to felamimail hr premjesti izabrano u +move to trash felamimail hr Premjesti u Smeće +must be unique felamimail hr Mora biti jedinstven +name felamimail hr Ime +never display html emails felamimail hr Nikad ne prikaži HTML emailove +new common hr Novo +new entry calendar hr Novi unos +new filter felamimail hr Novi filter +new name must not exist and not be empty!!! calendar hr Novo ime ne smije veÄ. postojati i ne smije biti prazno!!! +next felamimail hr Slijedeće +next message felamimail hr slijedeća poruka +nickname felamimail hr Nadimak +no filter felamimail hr Nema filtera +no folders found felamimail hr Nisam naÅ¡ao mapu(e) +no folders were found to subscribe to! felamimail hr Nisam naÅ¡ao mape za pretplatu! +no folders were found to unsubscribe from! felamimail hr Nisam naÅ¡ao mape za odjaviti pretplatu! +no highlighting is defined felamimail hr Nije definirano niÅ¡ta za istaknuti u poruci +no matches found calendar hr Nemogu naÄ.i podudarnosti +no messages were selected. felamimail hr Niste izabrali nijednu poruku +no next message felamimail hr Nema viÅ¡e slijedećih poruka +no notification felamimail hr Bez obavijesti +no personal address book is defined. contact administrator. felamimail hr Ne postoji osobni adresar. Kontaktirajte vaÅ¡eg administratora. +no persons matching your search was found felamimail hr Nisam naÅ¡ao osobe koje se podudaraju sa vaÅ¡om pretragom +no previous message felamimail hr Nema viÅ¡e prethodnih poruka +no response calendar hr Nema odgovora +no valid emailprofile selected!! felamimail hr Izabrani profil nije važeći!! +no vcard admin hr Bez VCard +none felamimail hr nikakav +notification messages for added events calendar hr ObavjeÅ¡tavajuÄ.a poruka o dodanim obvezama +notification messages for canceled events calendar hr ObavjeÅ¡tavajuÄ.a poruka o otkazanim obvezama +notification messages for modified events calendar hr ObavjeÅ¡tavajuÄ.a poruka o promijenjenim obvezama +notification messages for your alarms calendar hr ObavjeÅ¡tavajuÄ.a poruka o vaÅ¡im alarmima +notification messages for your responses calendar hr ObavjeÅ¡tavajuÄ.a poruka o vaÅ¡im odgovorima +number of intervals per day in planner view calendar hr Broj intervala po danu u pogledu planera +number of messages to index felamimail hr Proj poruka za indeksirati +number of months calendar hr Broj mjeseci +number of records to read (%1) calendar hr Broj zapisa za proÄitati (%1) +observance rule calendar hr Pravilo nadgledanja +occurence calendar hr UÄestalost +old startdate calendar hr Stari datum poÄetka +olddate calendar hr Stari datum +on %1 %2 %3 your meeting request for %4 calendar hr On %1 %2 %3 your meeting request for %4 +on all changes calendar hr Za bilo koju promjenu +on all modification, but responses calendar hr Za sve promjene, ali i odgovore +on any time change too calendar hr Za bilo koju promjenu vremena +on behalf of felamimail hr u ime +on invitation / cancelation only calendar hr Samo za poziv / otkaz +on participant responses too calendar hr Prlikomi odgovora sudionika +on time change of more than 4 hours too calendar hr Prlikomi promjeei vremena viÅ¡e od 4 sata +only inbox felamimail hr Samo INBOX +only unseen felamimail hr Samo neviÄ‘ene +open all felamimail hr otvori sve +open todo's: calendar hr Open To Do Items: +options felamimail hr Opcije +order calendar hr Naredba +organisation felamimail hr organizacija +organization felamimail hr organization +organization name admin hr Ime organizacije +oth felamimail hr Oth +other number admin hr Drugi broj +other phone admin hr Drugi telefon +overlap holiday calendar hr overlap holiday +pager common hr Pager +parcel admin hr paketski +participant calendar hr Sudionik +participants felamimail hr Sudionici +participates calendar hr Sudjeluje +password for not loged in users to your freebusy information? calendar hr Zaporka za neprijavljene korisnike za vaÅ¡e informacije o obvezama? +people holiday calendar hr državni praznik +permission denied calendar hr UskraÄ.ena dozvola +personal information felamimail hr Osobne informacije +phone number common hr Broj Telefona +phone numbers common hr Brojevi Telefona +planner calendar hr Planer +planner by category calendar hr Planer po kategoriji +planner by user calendar hr Planer po korisniku +please confirm,accept,reject or examine changes in the corresponding entry in your calendar calendar hr Molimo vas potvrdite, prihvatite, odbijte ili pregledajte promjene u odgovarajuÄ.em unosu u vaÅ¡em kalendaru +please enter a filename !!! calendar hr Molimo vas unesite ime datoteke!!! +please enter a name for that field ! admin hr Molim vas unesite naziv za to polje ! +postal common hr PoÅ¡tanski +posting felamimail hr posting +pref admin hr pref +preference file %1 not found. exiting abnormally felamimail hr Datoteka o postavkama %1 nije naÄ‘ena. ------------------ +preference file, %1, does not exist. log out, and log back in to create a default preference file. felamimail hr Datoteka o postavkama, %1, ne postoji. Odjavite se i ponovo prijavite radi stvaranja poÄetne datoteke postavki. +prefix admin hr Prefiks +preselected group for entering the planner calendar hr Predizabrana grupa za unos planera +previous felamimail hr PrijaÅ¡nja +previous message felamimail hr prijaÅ¡nja poruka +print calendars in black & white calendar hr Ispis crno bijelog kalendara +print it felamimail hr ispiÅ¡i +print the mini calendars calendar hr Ispis smanjenih kalendara +print this page felamimail hr ispiÅ¡i ovu stanicu +printer friendly calendar hr Verzija za ispis +privat calendar hr Privatno +private and global public calendar hr Private and Global Public +private and group public calendar hr Private and Group Public +private only calendar hr Samo privatno +public key admin hr Javni kljuÄ +purge felamimail hr izbriÅ¡i +quicksearch felamimail hr Brza pretraga +re-edit event calendar hr Ponovo uredi obvezu +read felamimail hr proÄitaj +read a list of entries. calendar hr ProÄitaj listu svih unosa +read a single entry by passing the id and fieldlist. calendar hr ProÄitaj jedan zapis proslijeÄ.ujuÄ.i Å¡ifru i listu polja +read da felamimail hr ProÄitaj da +read this list of methods. calendar hr ProÄitaj listu metoda +reading felamimail hr Äitam +reason giv felamimail hr Razlog Giv +receive email updates calendar hr Receive email updates +receive extra information in event mails calendar hr Receive extra information in event mails +receive summary of appointments calendar hr Primi sažetak obveza +recent felamimail hr nedavni +record access admin hr Pristup Podacima +record owner admin hr Vlasnik Podataka +recurring event calendar hr ponavljajuÄ.a obveza +refresh calendar hr Obnovi +refresh folder list felamimail hr obnovi listu mapa +refresh page felamimail hr Obnovi stranicu +refresh time in minutes felamimail hr Obnovi vrijeme u minutama +reinstate calendar hr Ponovi postavi +rejected calendar hr Odbijeno +remove felamimail hr makni +remove immediately felamimail hr ObriÅ¡i odmah +rename felamimail hr Preimenuj +rename a folder felamimail hr Preimenuj mapu +rename folder felamimail hr Preimenuj mapu +renamed successfully! felamimail hr UspjeÅ¡no preimenovano +repeat day calendar hr Ponovi na dan +repeat end date calendar hr Krajnji datum ponavljanja +repeat type calendar hr Tip ponavljanja +repeating event information calendar hr Informacije o ponavljajuÄ.oj obvezi +repetition calendar hr Ponavljanje +repetitiondetails (or empty) calendar hr Detalji ponavljanja (ili prazno) +replied felamimail hr odgovoreno +reply felamimail hr Odgovori +reply all felamimail hr Odgovori svima +reply to felamimail hr Odgovori +replyto felamimail hr Odgovori +reset calendar hr Postavi ponovo +retrieve contacts admin hr Ispravi kontakte +return felamimail hr Povratak +return to options page felamimail hr Povratak na stranicu opcija +right felamimail hr Desno +rule felamimail hr Pravilo +running squirrelmail version %1 (c) 1999-2000. felamimail hr Pokrećem SquirrelMail verziju %1 (c) 1999-2000. +sa calendar hr Su +same window - not functional yet felamimail hr Isti prozor - joÅ¡ nije u funkciji +sat felamimail hr Sub +save felamimail hr Spremi +scheduling conflict calendar hr Sukob u rasporedu +search felamimail hr Potraga +search for felamimail hr Traži +search results calendar hr Rezultat pretrage +seconds felamimail hr Sekunde +select felamimail hr Izaberite +select all felamimail hr Izaberite sve +select emailprofile felamimail hr Izabertei e-mail profil +select home email address felamimail hr Izaberite kućnu e-mail adresu +select the type of conversion admin hr Izaberite vrstu konverzije +select the type of conversion: admin hr Izaberite vrstu konverzije: +select where you want to store admin hr Izaberite gdje želite spremiti +select work email address felamimail hr Izaberite poslovnu e-mail adresu +select your mail server type admin hr Izaberte vrstu mail poslužitelja +selected contacts (%1) calendar hr Izabrani kontakti (%1) +send felamimail hr PoÅ¡alji +send updates via email common hr Send updates via EMail +send/receive updates via email calendar hr Send/Receive updates via EMail +sent fold felamimail hr PoÅ¡alji mapa +sent folder felamimail hr Mapa poslano +server respond felamimail hr Odgovor poslužitelja +set a year only for one-time / non-regular holidays. calendar hr Set a Year only for one-time / non-regular holidays. +set new events to private calendar hr Postavi nove dogaÄ.aju u privatno +should invitations you rejected still be shown in your calendar ?
    you can only accept them later (eg. when your scheduling conflict is removed), if they are still shown in your calendar! calendar hr Da li Ä.e pozivi koje ste odbili i dalje biti prikazani u vaÅ¡em kalendaru?
    Možete ih prihvatiti kasnije (tj. kada su sukobi u rasporedu rijeÅ¡eni), ako su joÅ¡ uvijek prikazani u vaÅ¡em kalendaru! +should new events created as private by default ? calendar hr Trebaju li se nove obvezei postaviti kao privatne? +should not loged in persons be able to see your freebusy information? you can set an extra password, different from your normal password, to protect this informations. the freebusy information is in ical format and only include the times when you are busy. it does not include the event-name, description or locations. the url to your freebusy information is %1. calendar hr Da li želite da neprijavljenji korisnici vide informacije o vaÅ¡im obvezama? Možete dodati joÅ¡ jednu dodatnu zaporku, razliÄitu od vaÅ¡e uobiÄajne zaporke, radi zaÅ¡tite vaÅ¡ih informacija. Informacije o vaÅ¡im obvezama su u iCal formatu i ukljuÄuju samo vremena kada ste zauzeti. Ne ukljuÄuje ime dogaÄ.aja, opis ili lokaciju. URL informacija o vaÅ¡im obvezama je: %1. +should the mini calendars by printed / displayed in the printer friendly views ? calendar hr Da li Ä.e se smanjeni kalendari ispisati / prikazati u verziji za ispis? +should the printer friendly view be in black & white or in color (as in normal view)? calendar hr Da li Ä.e se verzija za ispis prikazati crno-bijelo ili u boji? +should the status of the event-participants (accept, reject, ...) be shown in brakets after each participants name ? calendar hr Da li bi se status sudionika obveze (prihvaÄ.en, odbijen, ...) trebao prikazati nakon imena sudionika u zagradama? +show birthday reminders on main screen admin hr Pokaži roÄ.endanske podsjetnike na glavnom ekranu +show day view on main screen calendar hr Prikaži dnevni prikaz na glavnom ekranu +show default view on main screen calendar hr Prikaži poÄetno postavljeni prikaz na glavnom ekranu +show header felamimail hr prikaži zaglavlje +show high priority events on main screen calendar hr Prikaži obveze visokog prioriteta na glavnom ekranu +show invitations you rejected calendar hr Prikaži odbijene pozive +show list of upcoming events calendar hr Prikaži listu dolazeÄ.ih obvezama +show new messages on main screen felamimail hr Prikaži novu poruku na glavnom ekranu +sieve settings admin hr Postavke Sieve +signature felamimail hr Potpis +simply click the target-folder felamimail hr Samo izaberite ciljanu mapu +single event calendar hr jedna obveza +size felamimail hr VeliÄina +size of editor window felamimail hr VeliÄina prozora za ureÄ‘ivanje +size(...->0) felamimail hr po veliÄini (silazno ...->0) +size(0->...) felamimail hr po veliÄini (uzlazno 0->...) +small view felamimail hr smanji pogled +smtp settings admin hr Postavke SMTP +some or all of the help documents are not present! felamimail hr Nedostaju neke ili sve datoteke za pomoć! +sorry, the owner has just deleted this event calendar hr Žao mi je, vlasnik je upravo obrisao ovu obvezu +sorry, this event does not exist calendar hr Nažalost, ova obveza ne postoji +sorry, this event does not have exceptions defined calendar hr Žao mi je, ova obveza nema definirane iznimke +sort by calendar hr Poredaj po +source felamimail hr Izvor +special folder options felamimail hr Posebne mogućnosti sa mapama +specifies the the number of intervals shown in the planner view. calendar hr Specificira broj intervala prikazanih u pregledu planera. +squirrelmail felamimail hr Squirrelmail +start date/time calendar hr Datum/vrijeme poÄetka +start- and enddates calendar hr PoÄetni i krajnji datumi +startdate calendar hr Datum poÄetka +startrecord calendar hr PoÄetak zapisa +state common hr Županija +street common hr Ulica +su calendar hr Ne +subject felamimail hr Tema +subject(a->z) felamimail hr po temi (silazno A->Z) +subject(z->a) felamimail hr po temi (uzlazno Z->A) +submit felamimail hr PoÅ¡alji +submit to repository calendar hr Submit to Repository +subscribe felamimail hr Pretplata +subscribed felamimail hr Pretplaćen +subscribed successfully! felamimail hr UspjeÅ¡no ste pretplaćeni! +successfully imported %1 records into your addressbook. admin hr UspjeÅ¡no uneseno %1 zapis(a) u vaÅ¡ Adresar. +successfully saved display preferences! felamimail hr UspjeÅ¡no spremljene postavke prikaza! +successfully saved folder preferences! felamimail hr UspjeÅ¡no spremljene postavke mapa! +successfully saved personal information! felamimail hr UspjeÅ¡no spremljene osobne informacije! +suffix admin hr Sufiks +sun felamimail hr Ned +switch current folder to felamimail hr promijeni trenutnu mapu u +table of contents felamimail hr Tabela sadržaja +tentative calendar hr Probni +test import (show importable records only in browser) calendar hr Test Import (show importable records only in browser) +text calendar hr Tekst +text only felamimail hr Samo tekst +th calendar hr Ä. +that field name has been used already ! admin hr Ovaj naziv polja je veÄ. u upotrebi ! +the connection to the imap server failed!! felamimail hr Neuspjelo spajanje na IMAP poslužitelja!! +the following conflicts with the suggested time:

      %1
    calendar hr SlijedeÄ.e se koosi sa predloženim vremenom:
      %1
    +the help has not been translated to %1. it will be displayed in english instead. felamimail hr Pomoć nije prevedena na %1. Biti će prikazana na engleskom. +the index order is the order that the columns are arranged in the message index. you can add, remove, and move columns around to customize them to fit your needs. felamimail hr Indeks redoslijeda je redoslijed rasporeda kolona u indeksu poruka. Možete dodati, maknuti, i pomaknuti kolumne po vlastitom nahođenju +the order of the message index can be rearanged and changed to contain the headers in any order you want. felamimail hr Redoslijed indeksa poruka se može promijeniti tako da sadrži zaglavlja u redoslijedu kakvim vi želite. +the user %1 is not participating in this event! calendar hr Korisnik %1 ne sudjeluje o ovoj obvezi! +theme felamimail hr Tema +then felamimail hr TADA +there was an error trying to connect to your news server.
    please contact your admin to check the news servername, username or password. calendar hr Dogodila se greška prilikom spajanja na vašeg poslužitelja vijesti.
    Molimo vas kontaktirajte vaÅ¡eg administratora, radi provjere imena posljužitelja, korisniÄkog imena i zaporke. +these settings change the way your folders are displayed and manipulated. felamimail hr Ovim postavkama mijenjate naÄin na koji se prikazuju vaÅ¡e mape i kako ih ureÄ‘ujete. +this contains personal information about yourself such as your name, your email address, etc. felamimail hr Ovdije su sdržane vaÅ¡e osobne informacije poput imena, e-maila, i sl. +this day is shown as first day in the week or month view. calendar hr Ovaj dan je prikazan kao prvi dan u tjednu u mjeseÄnom pregledu. +this defines the end of your dayview. events after this time, are shown below the dayview. calendar hr Ovdje odreÄ.ujete kraj vaÅ¡eg dnevnog pregleda. Obveze koje su poslije ovog vremena prikazane su ispod vaÅ¡eg dnevnog pregleda. +this defines the start of your dayview. events before this time, are shown above the dayview.
    this time is also used as a default starttime for new events. calendar hr Ovdje odreÄ.ujete poÄetak vaÅ¡eg dnevnog pregleda. Obveze prije ovog vremena su prikazane iznad vaÅ¡eg dnevnog pregleda.
    Ovo vrijeme se takoÄ.er koristi kao poÄetna vrijednost poÄetka novih obveza. +this folder is empty felamimail hr OVA MAPA JE PRAZNA +this group that is preselected when you enter the planner. you can change it in the planner anytime you want. calendar hr Ova grupa je predizabrana kada uÄ.ete u planer. Možete je promijeniti u planeru kad god hoÄ.ete. +this is mostly caused by a not or wrongly configured smtp server. notify your administrator. calendar hr Uzrok ovoga je vjerovatno nepodeÅ¡en ili loÅ¡e podeÅ¡en SMTP server. Obavijestite vaÅ¡eg administratora. +this message is sent for canceled or deleted events. calendar hr Ova poruka je poslana za otkazane ili obrisane obveze. +this message is sent for modified or moved events. calendar hr Ova poruka je poslana za promijenjene ili pomaknute obveze. +this message is sent to every participant of events you own, who has requested notifcations about new events.
    you can use certain variables which get substituted with the data of the event. the first line is the subject of the email. calendar hr Ova poruka je poslana svim sudionicima u obvezama koje posjedujete, a koji zahtijevaju poruku o novim dogaÄ.ajima.
    Možete upotrijebiti odreÄ.ene varijable koje su zamijenjene sa podacima o obvezi. Prva linija je tema e-mail poruke. +this message is sent when you accept, tentative accept or reject an event. calendar hr Ova poruka se Å¡alje kada prihvatite, probno prihvatite ili odbijete neku obvezu. +this message is sent when you set an alarm for a certain event. include all information you might need. calendar hr Ova poruka se Å¡alje kada postavite alarm za odreÄ.ene obveze. UkljuÄite sve informacije koje bi mogli zatrebati. +this month calendar hr Ovog mjeseca +this person's first name was not in the address book. admin hr Ime ove osobe nije u Adresaru. +this person's last name was not in the address book. admin hr Prezime ove osobe nije u Adresaru. +this php has no imap support compiled in!! felamimail hr Ovaj PHP nema ugraÄ‘enu podrÅ¡ku za IMAP!! +this port is based on squirrelmail, which is a standalone imap client.
    felamimail hr Ovaj port se bazira na Squirrelmail-u, koji je samostalni klijent za IMAP.
    +this week calendar hr Ovog tjedna +this year calendar hr Ove godine +thu felamimail hr ÄŒet +title calendar hr Naslov +title of the event calendar hr Ime obveze +title-row calendar hr Title-row +to felamimail hr Za +to many might exceed your execution-time-limit calendar hr to many might exceed your execution-time-limit +to the left felamimail hr prema lijevo +to the right felamimail hr prema desno +to-firstname calendar hr Prema - Imenu +to-fullname calendar hr Prema - Imenu i prezimenu +to-lastname calendar hr Prema - Prezimenu +today calendar hr Danas +today is %1's birthday! common hr Danas je %1's roÄ.endan! +tomorrow is %1's birthday. common hr Sutra je %1's roÄ.endan. +top felamimail hr Vrh +translation calendar hr Prijevod +translation location felamimail hr Lokacija prijevoda +translation preferences felamimail hr Postavke prijevoda +translation server felamimail hr Poslužitelj prijevoda +trash fold felamimail hr Mapa Smeće +trash folder felamimail hr Mapa Smeće +tu calendar hr U +tue felamimail hr Uto +type felamimail hr vrsta (tip) +unable to list addresses from %1 felamimail hr Nemogu prikazati adrese iz %1 +unflagged felamimail hr unflagged +unknown err felamimail hr Nepoznata greÅ¡ka +unknown error felamimail hr Nepoznata greÅ¡ka +unknown sender felamimail hr PoÅ¡iljatelj nepoznat +unknown user or password incorrect. felamimail hr Nepoznat korisnik ili nevažeća zaporka. +unread common hr neproÄitano +unseen felamimail hr NeviÄ‘eno +unseen and total felamimail hr NeviÄ‘eno i ukupno +unseen message notification felamimail hr Obavijest o neviÄ‘enim porukama +unseen message notification type felamimail hr Vrsta obavijesti o neviÄ‘enim porukama +unselect all felamimail hr Odizaberi sve +unsubscribe felamimail hr Odpretplata +unsubscribed felamimail hr Odpretplaćen +unsubscribed successfully! felamimail hr UspijeÅ¡an prekid pretplate! +up felamimail hr gore +update a single entry by passing the fields. calendar hr Update a single entry by passing the fields. +update address felamimail hr Obnovi adresu +updated calendar hr Updated +use a signature felamimail hr Upotrijebi potpis +use a signature? felamimail hr Upotrijebi potpis? +use addresses felamimail hr Upotrijebi adresu +use country list admin hr Upotrijebi listu zemalja +use custom settings felamimail hr Upotrijebi prilagoÄ‘ene postavke +use end date calendar hr Upotrijebi krajnji datum +use javascript or html addressbook? felamimail hr Upotrijebi Javascript ili HTML adresar? +use smtp auth admin hr Upotrijebi SMTP autorizaciju +users can define their own emailaccounts admin hr Korisnici mogu sami definirati svoje e-mail raÄune +vcard common hr VCard +vcards require a first name entry. admin hr VCard zahtijevaju unos imena +vcards require a last name entry. admin hr Vcard zahtijevaju unos prezimena +video phone admin hr Video telefon +view full header felamimail hr Prikaži cijelo zaglavlje +view message felamimail hr Prikaži poruku +view this entry calendar hr Prikaži ovaj unos +viewing full header felamimail hr Prikazujem cijelo zaglavlje +viewing message felamimail hr Prikazujem poruku +viewing messages felamimail hr Prikazujem poruku +voice phone admin hr Glasovni telefon +warning!! ldap is valid only if you are not using contacts for accounts storage! admin hr UPOZORENJE!! LDAP je valjan samo ako NE upotrebljavate kontakte za spremanje korisniÄkih raÄuna! +we calendar hr S +wed felamimail hr Sri +week calendar hr Tjedan +weekday starts on calendar hr PoÄetak radnog tjedna +weekly calendar hr Tjedno +weekview calendar hr Tjedni pregled +welcome to %1's webmail system felamimail hr DobrodoÅ¡li u %1-ov WebMail sustav +when creating new events default set to private calendar hr Prilikom stvaranja novih obveza poÄetno postavi na privatno +when deleting messages felamimail hr Prilikom brisanja poruka +which events do you want to see when you enter the calendar. calendar hr Koje obveze želite vidjeti kada otvorite kalendar. +which of calendar view do you want to see, when you start calendar ? calendar hr Koji kalendarski pregled želite imati kada pokrenete kalendar ? +white felamimail hr ZapiÅ¡i +width of folder list felamimail hr Å irina liste mapa +work day ends on calendar hr Radni dan zavrÅ¡ava u +work day starts on calendar hr Radni dan poÄinje u +work phone admin hr Telefon na poslu +workdayends calendar hr Kraj radnog tjedna +wrap incoming text at felamimail hr Omotaj ulazni tekst pri +writing felamimail hr zapisujem +wrote felamimail hr zapisano (zapisao je) +yearly calendar hr GodiÅ¡nje +yearview calendar hr GodiÅ¡nji pregled +you can change the way that squirrelmail looks and displays information to you, such as the colors, the language, and other settings. felamimail hr Možete promijeniti naÄin na koji SquirelMail izgleda i prikazuje informacije poput boje, jezika ili drugih postavki. +you can either set a year or a occurence, not both !!! calendar hr You can either set a Year or a Occurence, not both !!! +you can only edit one address at the time felamimail hr Možete urediti samo jednu adresu istovremeno. +you can only set a year or a occurence !!! calendar hr You can only set a year or a occurence !!! +you do not have permission to add alarms to this event !!! calendar hr Nemate dozvolu za dodavanje alarma na ovu obvezu !!! +you do not have permission to delete this alarm !!! calendar hr Nemate dozvolu za brisanje ovog alarma !!! +you do not have permission to enable/disable this alarm !!! calendar hr Nemate dozvolu za aktiviranje/deaktiviranje ovog alarma!!!! +you do not have permission to read this record! calendar hr Nemate dozvolu Äitanja ovog zapisa +you have %1 high priority events on your calendar today. common hr Danas imate %1 obveza visokog prioriteta. +you have 1 high priority event on your calendar today. common hr Danas imate 1 obvezu visokog proioriteta. +you have a meeting scheduled for %1 calendar hr Imate sastanak na rasporedu za %1 +you have not entered a title calendar hr Nist unijeli ime +you have not entered a valid date calendar hr Niste unijeli važeÄ.i datum +you have not entered a valid time of day calendar hr Niste unijeli važeÄ.e vrijeme dana +you have not entered participants calendar hr Niste unijeli sudionike +you must enter one or more search keywords calendar hr Morate unijeti bar jednu ili viÅ¡e kljuÄnih rijeÄi za pretraživanje +you must login first. felamimail hr Morate se prvo prijaviti. +you must select a [iv]cal. (*.[iv]cs) calendar hr Morate izabrati [iv]Cal. (*.[iv]cs) +you must select a vcard. (*.vcf) admin hr Morate izabrati vcard. (*.vcf) +you must select at least 1 column to display admin hr Morate izabrati bar 1 kolumnu za prikazati +you need a valid user and password to access this page! felamimail hr Trebate biti važeći korisnik ili imati važeću zaporku za pristup ovim stranicama! +you need to set either a day or a occurence !!! calendar hr You need to set either a day or a occurence !!! +your meeting scheduled for %1 has been canceled calendar hr VaÅ¡ sastanak na rasporedu za %1 je otkazan +your meeting that had been scheduled for %1 has been rescheduled to %2 calendar hr VaÅ¡ sastanak zakazan za %1 je premijeÅ¡ten na %2 +your search failed with the following error(s) felamimail hr Neuspjela pretraga sa slijedeÄom(im) greÅ¡kom(ama) +your suggested time of %1 - %2 conflicts with the following existing calendar entries: calendar hr VaÅ¡e predloženo vrijeme od %1 - %2 je u sukobu sa postojeÄ.im obvezama u kalendaru +zip code common hr PoÅ¡tanski Broj +zip_note admin hr

    Obavijest: Datoteka može biti zip kolekcija .csv, .vcf, ili .ldif datoteka. Ipak, nemojte miješati vrste datoteka po uvozu. +1 felamimail hr 1 diff --git a/felamimail/lang/egw_hu.lang b/felamimail/lang/egw_hu.lang new file mode 100644 index 0000000000..340e57b678 --- /dev/null +++ b/felamimail/lang/egw_hu.lang @@ -0,0 +1,494 @@ +%1 is not writable by you! felamimail hu %1-hez nincs írási jogosultságod! +(no subject) felamimail hu (nincs tárgy) +(only cc/bcc) felamimail hu (csak CC/BCC) +(separate multiple addresses by comma) felamimail hu (több címezett elválasztása vesszővel) +(unknown sender) felamimail hu (ismeretlen feladó) +activate felamimail hu Aktivál +activate script felamimail hu szkript aktiválás +activating by date requires a start- and end-date! felamimail hu Dátum szeretni aktiváláshoz kezdés ÉS befejezés időpont is szükséges! +add acl felamimail hu ACL hozzáadása +add address felamimail hu Cím hozzáadása +add rule felamimail hu Szabály hozzáadása +add script felamimail hu Szkript hozzáadása +add to %1 felamimail hu Add hozzá ehhez: %1 +add to address book felamimail hu Címjegyzékhez hozzáad +add to addressbook felamimail hu címjegyzékhez hozzáad +adding file to message. please wait! felamimail hu Fájl hozzáadása az üzenethez. Kérlek várj. +additional info felamimail hu További információ +address book felamimail hu Címjegyzék +address book search felamimail hu Címjegyzékben keresés +after message body felamimail hu Üzenetrész után +all address books felamimail hu Összes címjegyzék +all folders felamimail hu Összes mappa +all of felamimail hu összes innnen +allow images from external sources in html emails felamimail hu Külső forrásból származó képek megjelenítése a HTML email-ekben +allways a new window felamimail hu mindig új ablak +always show html emails felamimail hu Mindig jelenítse meg a HTML üzenetet +and felamimail hu és +any of felamimail hu bármennyi +any status felamimail hu bármilyen állapot +anyone felamimail hu bárki +as a subfolder of felamimail hu mint almappa innen +attach felamimail hu Csatol +attachments felamimail hu Mellékletek +authentication required felamimail hu hitelesítés szükséges +auto refresh folder list felamimail hu Mappalista automatikus frissítése +back to folder felamimail hu Vissza a mappába +bad login name or password. felamimail hu Hibás belépési név vagy jelszó. +bad or malformed request. server responded: %s felamimail hu Hibás vagy sérült kérés. Szerver válasza: %s +bad request: %s felamimail hu Hibás kérés: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail hu A megadott feltételek alapján a bejövő levelek különböző színű háttérrel jelennek meg a listán. Ez nagyban megkönnyíti a feladók azonosítását, különösen levelezőlista esetén. +bcc felamimail hu BCC +before headers felamimail hu Fejlécek előtt +between headers and message body felamimail hu Feljécek és üzenet között +body part felamimail hu test rész +by date felamimail hu dátum szerint +can not send message. no recipient defined! felamimail hu Üzenet kézbesítése nem lehetséges, nincs megadva címzett! +can't connect to inbox!! felamimail hu nem tudok csatlakozni az INBOX-hoz!!! +cc felamimail hu CC +change folder felamimail hu Mappa változtatása +check message against next rule also felamimail hu üzenet ellenőrzése a következő szabály szerint is +checkbox felamimail hu Jelölőnégyzet +clear search felamimail hu keresés törlése +click here to log back in. felamimail hu Kattints ide a bejelentkezéshez. +click here to return to %1 felamimail hu Kattints ide hogy %1 +close all felamimail hu összes bezárása +close this page felamimail hu lap bezárása +close window felamimail hu Ablak bezárása +color felamimail hu Szín +compose felamimail hu Szerkeszt +compose as new felamimail hu szerkesztés újként +compress folder felamimail hu Mappa tömörítése +condition felamimail hu feltétel +configuration felamimail hu Beállítás +configure a valid imap server in emailadmin for the profile you are using. felamimail hu IMAP szerver beállítása az aktuális profilhoz. +connection dropped by imap server. felamimail hu A kapcsolatot az IMAP szerver eldobta. +contact not found! felamimail hu Nem találom a címzettet! +contains felamimail hu tartalmaz +could not complete request. reason given: %s felamimail hu Kérést nem lehet teljesíteni. Az ok: %s +could not import message: felamimail hu Nem lehetséges az üzenet importálása: +could not open secure connection to the imap server. %s : %s. felamimail hu Nem lehetséges biztonságosan kapcsolódni az IMAP szerverhez. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail hu CRAM-MD5 vagy DIGEST-MD5 használatához az Auth_SASL csomagot telepíteni kell. +create felamimail hu Létrehoz +create folder felamimail hu Mappa létrehozása +create sent felamimail hu 'Elküldött' mappa létrehozása +create subfolder felamimail hu Almappa létrehozása +create trash felamimail hu 'Szemetes' létrehozása +created folder successfully! felamimail hu Mappa létrehozása sikeres. +dark blue felamimail hu Sötétkék +dark cyan felamimail hu Sötétcián +dark gray felamimail hu Sötétszürke +dark green felamimail hu Sötétzöld +dark magenta felamimail hu Sötét bíborvörös +dark yellow felamimail hu Sötétsárga +date(newest first) felamimail hu Dátum (újak elsőnek) +date(oldest first) felamimail hu Dátum (régiek elsőnek) +days felamimail hu napok +deactivate script felamimail hu szkript deaktiválása +default felamimail hu alapértelmezett +default signature felamimail hu alapértelmezett aláírás +default sorting order felamimail hu Alapértelmezett rendezési sor +delete all felamimail hu összes törlése +delete folder felamimail hu Mappa törlése +delete script felamimail hu szkript törlése +delete selected felamimail hu Kijelölt törlése +delete selected messages felamimail hu Kijelölt üzenetek törlése +deleted felamimail hu törölve +deleted folder successfully! felamimail hu Mappa törlése sikeres. +deleting messages felamimail hu üzenetek törlése +disable felamimail hu Letilt +discard felamimail hu elvet +discard message felamimail hu üzenet elvetése +display message in new window felamimail hu Üzenet megjelenítése új ablakban +display messages in multiple windows felamimail hu üzenetek megjelenítése több ablakban +display of html emails felamimail hu HTML email-ek megjelenítése +display only when no plain text is available felamimail hu Csak akkor jelenítse meg, ha nincs egyszerű szöveg +display preferences felamimail hu Beállítások megjelenítése +displaying html messages is disabled felamimail hu HTML levelek megjelenítése tiltva +do it! felamimail hu csináld! +do not use sent felamimail hu Ne használd az 'Elküldött' mappát +do not use trash felamimail hu Ne használd az 'Szemetes' mappát +do not validate certificate felamimail hu ne ellenőrizze a tanúsítványt +do you really want to delete the '%1' folder? felamimail hu Valóban törölni kívánja a '%1' mappát? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail hu Valóban törölni szeretnéd a kijelölt fiókot és a hozzá tartozó beállításokat? +do you really want to delete the selected signatures? felamimail hu Valóban törölni szeretnéd a kiválasztott aláírást? +do you really want to move the selected messages to folder: felamimail hu Valóban át szeretnéd mozgatni a kijelölt üzenetet a következő mappába: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail hu Szeretnél megerősítést a kijelölt üzenetek áthelyezése előtt? +do you want to prevent the editing/setup for forwarding of mails via settings (, even if sieve is enabled)? felamimail hu Meg szeretnéd akadályozni a továbbított üzenetek módosítását? (engedélyezett SIEVE esetén is) +do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? felamimail hu Meg szeretnéd akadályozni a szűrő szabályok létrehozását és alkalmazását? (engedélyezett SIEVE esetén is) +do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if sieve is enabled)? felamimail hu Meg szeretnéd akadályozni más címre küldött figyelmeztető e-mail beállítását beérkező üzenet esetén? (engedélyezett SIEVE esetén is) +do you want to prevent the editing/setup of the absent/vacation notice (, even if sieve is enabled)? felamimail hu Meg szeretnéd akadályozni a "szabadságon vagyok" üzenet módosításának lehetőségét? (engedélyezett SIEVE esetén is) +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail hu Meg szeretnéd akadályozni a mappák létrehozásának és módosításának lehetőségét? (létrehozás, hozzáférés korlátozás, feliratkozás) +does not contain felamimail hu nem tartalmazza +does not exist on imap server. felamimail hu nincs létrehozva az IMAP szerveren +does not match felamimail hu nem egyezik +does not match regexp felamimail hu nem egyezik a reguláris kifejezéssel +don't use draft folder felamimail hu Ne használd a 'Vázlat' mappát +don't use sent felamimail hu Ne használja a 'Elküldött' mappát +don't use template folder felamimail hu Ne használja a "Sablonok" mappát +don't use trash felamimail hu Ne használja a 'Szemetes' mappát +dont strip any tags felamimail hu Címkék meghagyása +down felamimail hu Le +download felamimail hu Letölt +download this as a file felamimail hu Letöltés mint állomány +draft folder felamimail hu vázlat mappa +drafts felamimail hu Piszkozatok +e-mail felamimail hu E-Mail +e-mail address felamimail hu E-Mail cím +e-mail folders felamimail hu E-Mail mappa +edit email forwarding address felamimail hu az email továbbítási címének szerkesztése +edit filter felamimail hu Szűrő szerkesztése +edit rule felamimail hu szabály szerkesztése +edit selected felamimail hu Kijelölt szerkesztése +edit vacation settings felamimail hu szabadság beállítások szerkesztése +editor type felamimail hu Szerkesztő típusa +email address felamimail hu E-Mail cím +email forwarding address felamimail hu az email továbbítási cím +email notification update failed felamimail hu e-mail értesítő frissítés mező +email signature felamimail hu E-Mail aláírás +emailaddress felamimail hu E-Mail cím +empty trash felamimail hu Szemetes ürítése +enable felamimail hu engedélyez +encrypted connection felamimail hu titkosított kapcsolat +enter your default mail domain ( from: user@domain ) admin hu Add meg az alapértelmezett levelező tartományt (a felhasználó@tartomány-ból) +enter your imap mail server hostname or ip address admin hu Add meg az IMAP szerver nevét vagy IP címét +enter your sieve server hostname or ip address admin hu Add meg a SIEVE szerver nevét vagy IP címét +enter your sieve server port admin hu Add meg a SIEVE szerver portcímét +enter your smtp server hostname or ip address admin hu Az SMTP-kiszolgáló hosztneve vagy IP-címe +enter your smtp server port admin hu Az SMTP-kiszolgáló portszáma +error felamimail hu Hiba +error connecting to imap serv felamimail hu IMAP szerverhez csatlakozáskor hiba történt +error connecting to imap server. %s : %s. felamimail hu Hiba történt az IMAP szerverhez csatlakozás közben. %s : %s +error connecting to imap server: [%s] %s. felamimail hu Hiba történt az IMAP szerverhez csatlakozás közben. [%s ]: %s +error opening felamimail hu Nem sikerült megnyitni +error saving %1! felamimail hu Hiba %1 mentése során! +error: felamimail hu Hiba: +error: could not save message as draft felamimail hu Hiba: üzenet mentése piszkozatként nem sikerült +error: message could not be displayed. felamimail hu Hiba: az üzenet nem megjeleníthető +every felamimail hu minden +every %1 days felamimail hu minden %1 napon +expunge felamimail hu Kitöröl +extended felamimail hu kibővített +felamimail common hu FelaMiMail +file into felamimail hu állományba +filemanager felamimail hu Filekezelő +files felamimail hu Fájlok +filter active felamimail hu Szűrő aktív +filter name felamimail hu Szűrő neve +filter rules common hu Szűrési szabály +first name felamimail hu Vezetéknév +flagged felamimail hu megjelölt +flags felamimail hu Címkék +folder felamimail hu mappa +folder acl felamimail hu Mappa ACL +folder name felamimail hu Mappa név +folder path felamimail hu Mappa útvonala +folder preferences felamimail hu Mappa tulajdonságok +folder settings felamimail hu Mappa beállításai +folder status felamimail hu Mappa státusz +folderlist felamimail hu Mappa lista +foldername felamimail hu Mappa név +folders felamimail hu Mappák +folders created successfully! felamimail hu Mappák sikeresen létrehozva! +follow felamimail hu követés +for mail to be send - not functional yet felamimail hu Elküldött levelekre - még nem működik +for received mail felamimail hu Bejövő levelekre +forward felamimail hu Továbbít +forward as attachment felamimail hu továbbítás mellékletként +forward inline felamimail hu továbbítás beágyazva +forward messages to felamimail hu Üzenetek továbbítása +forward to felamimail hu Továbbítás ide +forward to address felamimail hu Címzettnek továbbít +forwarding felamimail hu Továbbítás +found felamimail hu Talált +fri felamimail hu Pé +from felamimail hu Feladó +from(a->z) felamimail hu Feladó (A->Z) +from(z->a) felamimail hu Feladó (Z->A) +full name felamimail hu Teljes Neve +greater than felamimail hu nagyobb mint +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail hu Keresd fel a www.felamimail.org oldalt további információkért a Squirrelmail-ről.
    +header lines felamimail hu Email fejléce +hide header felamimail hu Fejléc elrejtése +hostname / address felamimail hu gazdagépnév / cím +how to forward messages felamimail hu Ãœzenet továbbítás módja +html felamimail hu HTML +icons and text felamimail hu Ikonok és képek +icons only felamimail hu Csak ikonok +identifying name felamimail hu Azonosító név +identity felamimail hu azonosító +if felamimail hu HA +if from contains felamimail hu ha feladó tartalmazza +if mail header felamimail hu ha a levél fejléce +if message size felamimail hu ha a levél mérete +if shown, which folders should appear on main screen felamimail hu a fÅ‘képernyÅ‘n megjelenÅ‘ mappák kijelölése +if subject contains felamimail hu ha a tárgy tartalmazza +if to contains felamimail hu ha a címzett tartalmazza +if using ssl or tls, you must have the php openssl extension loaded. felamimail hu SSL vagy TLS használatához a PHP openssl bÅ‘vítményét telepíteni kell. +illegal folder name. please select a different name. felamimail hu Érvénytelen mappanév. Kérlek válassz másik nevet. +imap felamimail hu IMAP +imap server felamimail hu IMAP szerver +imap server address felamimail hu IMAP szerver címe +imap server closed the connection. felamimail hu Az IMAP szerver lezárta a kapcsolatot. +imap server closed the connection. server responded: %s felamimail hu Az IMAP szerver lezárta a kapcsolatot. A szerver válasza: %s +imap server password felamimail hu IMAP szerver jelszava +imap server type felamimail hu IMAP szerver típusa +imap server username felamimail hu IMAP szerver felhasználóneve +imaps authentication felamimail hu IMAPS azonosítás +imaps encryption only felamimail hu csak IMAPS titkosítás +import felamimail hu import +import mail felamimail hu Ãœzenet importálása +in felamimail hu be +inbox felamimail hu BejövÅ‘ +incoming mail server(imap) felamimail hu bejövÅ‘ levélszerver (IMAP) +index order felamimail hu Index rendezés +info felamimail hu Info +invalid user name or password felamimail hu Érvénytelen felhasználónév vagy jelszó +javascript felamimail hu JavaScript +jumping to end felamimail hu ugrás az utolsóra +jumping to start felamimail hu ugrás az elsÅ‘re +junk felamimail hu Spam +keep a copy of the message in your inbox felamimail hu másolat megÅ‘rzése a BejövÅ‘ postafiókban +keep local copy of email felamimail hu helyi másolat megÅ‘rzése +kilobytes felamimail hu kilobájt +language felamimail hu Nyelv +last name felamimail hu Keresztnév +left felamimail hu Balra +less felamimail hu kisebb +less than felamimail hu kisebb mint +light gray felamimail hu Világosszürke +list all felamimail hu Összes listázása +loading felamimail hu betöltés +location of buttons when composing felamimail hu Szerkesztéskor a gombok elhelyezkedése +mail server login type admin hu Mail szerver bejelentkezés típusa +mail settings felamimail hu Levelezési beállítások +mainmessage felamimail hu főüzenet +manage email accounts and identities common hu felhasználói fiókók és azonosítók szerkesztése +manage emailaccounts common hu E-mail azonosítók kezelése +manage emailfilter / vacation preferences hu E-mail szűrÅ‘/szabadság kezelése +manage folders common hu Mappák kezelése +manage sieve common hu Sieve szkriptek kezelése +manage signatures felamimail hu Aláírások kezelése +mark as deleted felamimail hu Törlésre megjelöl +mark messages as felamimail hu Kiválasztott üzenetek címkézése mint +mark selected as flagged felamimail hu Kiválasztott üzenetek címkéje mint "Megjelölt" +mark selected as read felamimail hu Kiválasztott üzenetek megjelölése mint "Olvasott" +mark selected as unflagged felamimail hu Kiválasztott üzenetek címkézése mint "Jelöletlen" +mark selected as unread felamimail hu Kiválasztott üzenetek megjelölése mint "Olvasatlan" +match felamimail hu Egyezés +matches felamimail hu egyezés +matches regexp felamimail hu reguláris kifejezés egyezése +max uploadsize felamimail hu max feltölthetÅ‘ fájl méret +message highlighting felamimail hu Ãœzenet színkiemelés +message list felamimail hu Ãœzenetlista +messages felamimail hu üzenetek +mon felamimail hu Hé +move felamimail hu Mozgat +move folder felamimail hu mappa mozgatása +move messages felamimail hu üzenetek mozgatása +move to felamimail hu kijelöltek mozgatása +move to trash felamimail hu Szemetesbe mozgatás +moving messages to felamimail hu üzenetek mozgatása +name felamimail hu Név +never display html emails felamimail hu Soha ne jelenítse meg a HTML formátumú emaileket +new common hu Új +new filter felamimail hu Új szűrÅ‘ +next felamimail hu KövetkezÅ‘ +next message felamimail hu következÅ‘ üzenet +no active imap server found!! felamimail hu Atkív IMAP szerver nem található! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail hu Nincs címzett és mappa az üzenet mentéséhez beállítva. +no encryption felamimail hu titkosítás nélkül +no filter felamimail hu SzűrÅ‘ nélkül +no folders felamimail hu nincs mappa +no folders found felamimail hu Mappa nem található +no folders were found to subscribe to! felamimail hu Nincs mappa melyre feliratkozhatna! +no folders were found to unsubscribe from! felamimail hu Nincs mappa melyrÅ‘l leíratkozhatna! +no highlighting is defined felamimail hu Színkiemelés nincs definiálva +no imap server host configured!! felamimail hu IMAP szerver nincs beállítva. +no message returned. felamimail hu Nincs visszaadott üzenet. +no messages found... felamimail hu üzenetek nem találhatóak... +no messages selected, or lost selection. changing to folder felamimail hu Nincs üzenet kiválasztva, átlépek a következÅ‘ mappába: +no messages were selected. felamimail hu Nincsenek kiválasztva üzenetek. +no plain text part found felamimail hu nem található egyszerű szöveges tartalom +no previous message felamimail hu nincs elÅ‘zÅ‘ üzenet +no recipient address given! felamimail hu Címzett nincs megadva! +no signature felamimail hu nincs aláírás +no subject given! felamimail hu Az üzenethez nincs tárgy megadva. +no supported imap authentication method could be found. felamimail hu Nem található támogatott IMAP azonosítási eljárás. +no valid emailprofile selected!! felamimail hu Nincs érvényes email profil kiválasztva!!! +none felamimail hu Semmi +none, create all felamimail hu egyik sem, összes létrehozása +notify when new mails arrive on these folders felamimail hu értesítés ha új üzenet érkezik ezekbe a mappákba +on felamimail hu be +on behalf of felamimail hu kinek a nevében +one address is not valid felamimail hu Egy cím érvénytelen +only inbox felamimail hu Csak a BejövÅ‘ postafiók +only one window felamimail hu csak egy ablak +only unseen felamimail hu Csak az újak +open all felamimail hu összes megnyitása +options felamimail hu Opciók +or felamimail hu vagy +or configure an valid imap server connection using the manage accounts/identities preference in the sidebox menu. felamimail hu állíts be egy érvényes IMAP szervert az oldaldoboz Fiókok/azonosítok beállítása menüben. +organisation felamimail hu szervezet +organization felamimail hu szervezet +organization name admin hu Szervezet neve +original message felamimail hu eredeti üzenet +outgoing mail server(smtp) felamimail hu kimenÅ‘ levelezÅ‘ szerver +participants felamimail hu RésztvevÅ‘k +personal information felamimail hu Személyes információk +please ask the administrator to correct the emailadmin imap server settings for you. felamimail hu Kérlek lépj kapcsolatban a rendszergazdával az IMAP szerver beállításaival kapcsolatban. +please select a address felamimail hu Kérlek válassz címet +please select the number of days to wait between responses felamimail hu Kérlek add hány napot várjon a válaszok között +please supply the message to send with auto-responses felamimail hu Kérlek add meg az automatikus válaszüzenetet +port felamimail hu portcím +posting felamimail hu kézbesítés +previous felamimail hu elÅ‘zÅ‘ +previous message felamimail hu elÅ‘zÅ‘ üzenet +print it felamimail hu nyomtat +print this page felamimail hu oldal nyomtatása +printview felamimail hu nyomtatási kép +quicksearch felamimail hu Gyorskeresés +read felamimail hu olvasott +reading felamimail hu olvasás +receive notification felamimail hu Tértivevény +recent felamimail hu legfrissebb +refresh time in minutes felamimail hu Frissítési idÅ‘intervallum percben +reject with felamimail hu elutasítás +remove felamimail hu eltávolítás +remove immediately felamimail hu Azonnali eltávolítás +rename felamimail hu Ãtnevez +rename a folder felamimail hu Mappa átnevezése +rename folder felamimail hu Mappa átnevezése +renamed successfully! felamimail hu Sikeres átnevezés! +replied felamimail hu megválaszolt +reply felamimail hu Válasz +reply all felamimail hu Válasz mindenkinek +reply to felamimail hu Válasz +replyto felamimail hu Válasz +respond felamimail hu Válaszol +respond to mail sent to felamimail hu Válaszol a címzettnek +return felamimail hu Vissza +return to options page felamimail hu Vissza az opciók lapra +right felamimail hu Jobbra +row order style felamimail hu sorok rendezése +rule felamimail hu Szabály +sat felamimail hu Szo +save felamimail hu Elment +save all felamimail hu Összes mentése +save as draft felamimail hu Mentés vázlatként +save as infolog felamimail hu Mentés InfoLog-ként +save changes felamimail hu Változások mentése +save message to disk felamimail hu Ãœzenet mentése lemezre +script name felamimail hu szkript név +script status felamimail hu szkript státusz +search felamimail hu Keres +search for felamimail hu Keres +select felamimail hu Kiválaszt +select all felamimail hu Mindet kiválaszt +select emailprofile felamimail hu Email profil kiválasztása +select folder felamimail hu Mappa kiválasztása +select your mail server type admin hu Válassza ki a levelezÅ‘szerver típusát +send felamimail hu Küld +send a reject message felamimail hu Visszautasító levél küldése +sent felamimail hu Elköldött üzenetek +sent folder felamimail hu 'Elküldött' mappa +server supports mailfilter(sieve) felamimail hu a szerver támogatja a levélszűrÅ‘ket (sieve) +set as default felamimail hu Beállítás alapértelmezettként +show header felamimail hu fejléc megjelenítése +show new messages on main screen felamimail hu Új üzenetek megjelenítése a fÅ‘képernyÅ‘n +sieve script name felamimail hu sieve szűrÅ‘ szkript neve +sieve settings admin hu SIEVE beállítások +signatur felamimail hu Aláírás +signature felamimail hu Aláírás +simply click the target-folder felamimail hu Kattintson a célmappára +size felamimail hu Méret +size of editor window felamimail hu SzerkesztÅ‘ablak mérete +size(...->0) felamimail hu Méret (...->0) +size(0->...) felamimail hu Méret (0->...) +skipping forward felamimail hu következÅ‘re ugrás +skipping previous felamimail hu elÅ‘zÅ‘re ugrás +small view felamimail hu tömör nézet +smtp settings admin hu SMTP beállítások +start new messages with mime type plain/text or html? felamimail hu Új üzenet írása egyszerű szöveg vagy html-ként? +subject felamimail hu Tárgy +subject(a->z) felamimail hu Tárgy (A->Z) +subject(z->a) felamimail hu Tárgy (Z->A) +submit felamimail hu Elküld +subscribe felamimail hu Feliratkozás +subscribed felamimail hu Feliratkozva +subscribed successfully! felamimail hu Sikeres feliratkozás! +sun felamimail hu Va +system signature felamimail hu rendszer aláírás +table of contents felamimail hu Tartalomjegyzék +template folder felamimail hu Sablonok mappa +templates felamimail hu Sablonok +text only felamimail hu Csak szöveg +text/plain felamimail hu szöveg +the connection to the imap server failed!! felamimail hu Sikertelen csatlakozás az IMAP szerverhez! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail hu Az IMAP szerver úgy tűnik nem támogatja a kiválasztott hitelesítést. Tovább információért lLépj kapcsolatba a rendszergazdával. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail hu A feladó kéri tértivevényt küldését amely jelzi, hogy megkaptad az üzenetet. Szeretnéd hogy elküldjem? +the mimeparser can not parse this message. felamimail hu A MIME feldolgozó nem tudta feldolgozni ezt az üzenetet. +then felamimail hu AKKOR +there is no imap server configured. felamimail hu Nincs IMAP szerver beállítva. +this folder is empty felamimail hu EZ A MAPPA ÃœRES +this php has no imap support compiled in!! felamimail hu Az alkalmazott PHP verzió nem tartalmaz IMAP támogatást! (telepíteni kell) +thu felamimail hu Csü +to felamimail hu Címzett +to mail sent to felamimail hu az üzenet elküldlve +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail hu TLS kapcsolat használatához a PHP verziója legalább 5.1.0 kell legyen. +translation preferences felamimail hu Fordítási tulajdonságok +translation server felamimail hu Fordító szerver +trash felamimail hu Törölt üzenetek +trash fold felamimail hu "Szemetes" mappa +trash folder felamimail hu "Szemetes" mappa +tue felamimail hu Ke +type felamimail hu Típus +unexpected response from server to authenticate command. felamimail hu Váratlan válasz a szervertÅ‘l az AUTHENTICATE parancsra. +unexpected response from server to digest-md5 response. felamimail hu Váratlan válasz a szervertÅ‘l a DIGEST-MD5 parancsra. +unexpected response from server to login command. felamimail hu Váratlan válasz a szervertÅ‘l a LOGIN parancsra. +unflagged felamimail hu jelöletlen +unknown err felamimail hu Ismeretlen hiba +unknown error felamimail hu Ismeretlen hiba +unknown imap response from the server. server responded: %s felamimail hu Ismeretlen válasz a szervertÅ‘l: %s. +unknown sender felamimail hu Ismeretlen feladó +unknown user or password incorrect. felamimail hu Ismeretlen felhasználó vagy jelszó +unread common hu Olvasatlan +unseen felamimail hu Új +unselect all felamimail hu Összes kijelölés megszüntetése +unsubscribe felamimail hu Leiratkozás +unsubscribed felamimail hu Leiratkozva +unsubscribed successfully! felamimail hu Sikeres leiratkozás! +up felamimail hu Fel +updating message status felamimail hu üzenet állapotok frissítése +updating view felamimail hu nézet frissítése +use emailadmin to create profiles felamimail hu Használd az Email Adminisztrációt profilkészítésre +use a signature felamimail hu Aláírás használata +use a signature? felamimail hu Használjuk az aláírást? +use addresses felamimail hu Címek használata +use custom identities felamimail hu Egyedi azonosító használata +use custom settings felamimail hu Egyedi beállítások használata +use regular expressions felamimail hu reguláris kifejezés használata +use smtp auth admin hu SMTP hitelesítés használata +users can define their own emailaccounts admin hu A felhasználók saját maguk állíthatják be az email postafiókjaikat +vacation notice common hu szabadság értesítés +vacation notice is active felamimail hu Szabadság értesítÅ‘ aktív +vacation start-date must be before the end-date! felamimail hu Szabadság kezdete korábban legyen mint a vége! +validate certificate felamimail hu tanúsítvány ellenÅ‘rzése +view full header felamimail hu Teljes fejléc megjelenítése +view header lines felamimail hu fejléc tartalom megjelenítése +view message felamimail hu Ãœzenet megjelenítése +viewing full header felamimail hu Teljes fejléc megjelenítése +viewing message felamimail hu Ãœzenet megjelenítése +viewing messages felamimail hu Ãœzenetek megjelenítése +wed felamimail hu Sze +when deleting messages felamimail hu Ãœzenet törlése esetén +which folders (additional to the sent folder) should be displayed using the sent folder view schema felamimail hu melyik mappa legyen az Elküldött levelek mappa szerint megjelenítve? +which folders - in general - should not be automatically created, if not existing felamimail hu Melyik mappa ne legyen automatikusan létrehozva? +with message felamimail hu üzenettel +with message "%1" felamimail hu "%1" üzenettel +wrap incoming text at felamimail hu BejövÅ‘ szöveg tördelése +writing felamimail hu írás +wrote felamimail hu írta +you can use %1 for the above start-date and %2 for the end-date. felamimail hu %1-t használd kezdÅ‘ dátumként, %2-t befejezÅ‘ dátumként. +you have received a new message on the felamimail hu Új üzenet érkezett a +your message to %1 was displayed. felamimail hu Az üzeneted %1 magkapta. diff --git a/felamimail/lang/egw_id.lang b/felamimail/lang/egw_id.lang new file mode 100644 index 0000000000..a2ce4502be --- /dev/null +++ b/felamimail/lang/egw_id.lang @@ -0,0 +1,350 @@ +%1 is not writable by you! felamimail id %1 TIDAK dapat anda tulisi! +(no subject) felamimail id (tanpa subyek) +(only cc/bcc) felamimail id (hanya CC/BCC) +(separate multiple addresses by comma) felamimail id (pisahkan alamat-alamat dengan koma) +(unknown sender) felamimail id (pengirim takdikenal) +aborted felamimail id dibatalkan +activate felamimail id Aktifkan +activate script felamimail id Aktifkan skrip +activating by date requires a start- and end-date! felamimail id Pengaktifan menurut tanggal memerlukan tanggal awal DAN akhir! +add acl felamimail id Tambah ACL +add address felamimail id Tambah alamat +add rule felamimail id Tambah Rule/Aturan +add script felamimail id Tambah Skrip +add to %1 felamimail id Tambahkan ke %1 +add to address book felamimail id Tambahkan ke buku alamat +add to addressbook felamimail id Tambahkan ke buku alamat +adding file to message. please wait! felamimail id Menambahkan berkas ke pesan. Mohon tunggu! +additional info felamimail id Info Tambahan +address book felamimail id Buku Alamat +address book search felamimail id Mencari Buku Alamat +after message body felamimail id Setelah tubuh-pesan +all address books felamimail id Semua buku alamat +all folders felamimail id Semua Folder +all messages in folder felamimail id semua pesan dalam folder +all of felamimail id semua +and felamimail id and +any of felamimail id sembarang +any status felamimail id status apapun +anyone felamimail id siapapun +as a subfolder of felamimail id sebagai subfolder dari +attach felamimail id Lampirkan +attachments felamimail id Lampiran +authentication required felamimail id authentication required +back to folder felamimail id Kembali ke folder +bcc felamimail id BCC +before headers felamimail id Sebelum header +between headers and message body felamimail id Diantara header dan tubuh-pesan +body part felamimail id batang tubuh +by date felamimail id menurut tanggal +cc felamimail id CC +change folder felamimail id Ubah folder +checkbox felamimail id Checkbox +clear search felamimail id bersihkan pencarian +click here to log back in. felamimail id Klik disini untuk masuk lagi. +click here to return to %1 felamimail id Klik disini untuk kembali ke %1 +close all felamimail id tutup semuanya +close this page felamimail id tutup halaman ini +close window felamimail id Tutup jendela +color felamimail id Warna +compose felamimail id Tulis +compose as new felamimail id tulis sbg pesan baru +compress folder felamimail id Mampatkan folder +condition felamimail id kondisi +configuration felamimail id Konfigurasi +contact not found! felamimail id Kontak tidak ditemukan! +contains felamimail id mengandung +copy or move messages? felamimail id Salin atau Pindahkan Pesan? +copying messages to felamimail id menyalin pesan ke +create felamimail id Bikin +create folder felamimail id Bikin Folder +create sent felamimail id Bikin Sent +create subfolder felamimail id Bikin subfolder +create trash felamimail id Bikin Trash +created folder successfully! felamimail id Sukses bikin folder! +dark blue felamimail id Dark Blue +dark cyan felamimail id Dark Cyan +dark gray felamimail id Dark Gray +dark green felamimail id Dark Green +dark magenta felamimail id Dark Magenta +dark yellow felamimail id Dark Yellow +date(newest first) felamimail id Tanggal (terbaru) +date(oldest first) felamimail id Tanggal (terkuno) +days felamimail id hari +deactivate script felamimail id batalkan skrip +default felamimail id bawaan +default signature felamimail id tandatangan bawaan +default sorting order felamimail id Pengurutan bawaan +delete all felamimail id hapus semuanya +delete folder felamimail id Hapus Folder +delete script felamimail id hapus skrip +delete selected felamimail id Hapus selected +delete selected messages felamimail id hapus pesan terpilih +deleted felamimail id dihapus +deleted folder successfully! felamimail id Sukses menghapus folder! +deleting messages felamimail id menghapus pesan +disable felamimail id Disable +discard felamimail id buang +discard message felamimail id buang pesan +display preferences felamimail id Kesukaan Tampilan +do it! felamimail id laksanakan! +do you really want to delete the '%1' folder? felamimail id Anda sungguh ingin menghapus folder '%1'? +down felamimail id turun +download felamimail id unduh +download this as a file felamimail id Unduh sebagai berkas +draft folder felamimail id draft folder +drafts felamimail id Drafts +e-mail felamimail id E-Mail +e-mail address felamimail id Alamat E-Mail +e-mail folders felamimail id Folder E-Mail +edit filter felamimail id Edit saringan +edit rule felamimail id edit rule/aturan +edit selected felamimail id Edit yang dipilih +editor type felamimail id Tipe Editor +email address felamimail id Alamat E-Mail +email signature felamimail id Tandatangan Email +emailaddress felamimail id alamat email +empty trash felamimail id kosongkan trash +enable felamimail id enable +encrypted connection felamimail id encrypted connection +entry saved felamimail id Entri disimpan +error felamimail id ERROR +error opening felamimail id Error opening +error saving %1! felamimail id Error menyimpan %1! +error: felamimail id Error: +event details follow felamimail id Berikut ini detil kegiatan +every felamimail id setiap +every %1 days felamimail id setiap %1 hari +expunge felamimail id Expunge +extended felamimail id extended +felamimail common id eMail +file into felamimail id file into +filemanager felamimail id Manajer berkas +files felamimail id berkas +filter active felamimail id saringan aktif +filter name felamimail id Nama saringan +filter rules common id aturan saringan +first name felamimail id Nama Depan +flagged felamimail id ditandai +flags felamimail id Bendera +folder felamimail id folder +folder acl felamimail id ACL folder +folder name felamimail id Nama Folder +folder path felamimail id Jejak Folder +folder preferences felamimail id Kesukaan Folder +folder settings felamimail id Pengaturan Folder +folder status felamimail id Status Folder +folderlist felamimail id Daftar Folder +foldername felamimail id Nama Folder +folders felamimail id Folder +folders created successfully! felamimail id sukses bikin Folder! +follow felamimail id follow +forward felamimail id Forward +forward as attachment felamimail id forward as attachment +forward inline felamimail id forward inline +forward messages to felamimail id Forward messages to +forward to felamimail id forward to +forward to address felamimail id forward to address +forwarding felamimail id Forwarding +found felamimail id Ditemukan +fri felamimail id Jum +from felamimail id Dari +from(a->z) felamimail id Dari (A->Z) +from(z->a) felamimail id Dari (Z->A) +full name felamimail id Nama Lengkap +greater than felamimail id lebih dari +header lines felamimail id Baris Header +hide header felamimail id sembunyikan header +hostname / address felamimail id namahost / alamat +html felamimail id HTML +icons and text felamimail id Ikon dan teks +icons only felamimail id Hanya Ikon +identifying name felamimail id Mengenali nama +identity felamimail id identitas +if felamimail id IF +imap felamimail id IMAP +imap server felamimail id IMAP Server +imap server address felamimail id IMAP Server Address +imap server password felamimail id imap server password +imap server type felamimail id IMAP Server type +imap server username felamimail id imap server username +imaps authentication felamimail id IMAPS Authentication +imaps encryption only felamimail id IMAPS Encryption only +import felamimail id impor +import mail felamimail id Impor Mail +in felamimail id dalam +inbox felamimail id INBOX +index order felamimail id Urutan Indeks +info felamimail id Info +javascript felamimail id JavaScript +jumping to end felamimail id loncat ke akhir +jumping to start felamimail id loncat ke awal +junk felamimail id Junk +kilobytes felamimail id kilobyte +language felamimail id Bahasa +last name felamimail id Nama Belakang +left felamimail id Kiri +less felamimail id kurang +less than felamimail id kurang dari +light gray felamimail id Light Gray +list all felamimail id Tampilkan semuanya +loading felamimail id memuatkan +mail settings felamimail id Pengaturan Mail +mainmessage felamimail id Pesan utama +manage email accounts and identities common id Mengelola Akoun eMail dan Identitas +manage emailaccounts common id Mengelola akoun EMail +manage emailfilter / vacation preferences id Mengelola saringan eMail / Liburan +manage folders common id Mengelola Folder +manage sieve common id Manage Sieve scripts +manage signatures felamimail id Mengelola Tandatangan +mark as deleted felamimail id Tandai sbg terhapus +match felamimail id Cocok +matches felamimail id kecocokan +matches regexp felamimail id cocok regexp +max uploadsize felamimail id max uploadsize +message highlighting felamimail id Penyorotan Pesan +message list felamimail id Daftar Pesan +messages felamimail id pesan-pesan +mon felamimail id Sen +move felamimail id Pindahkan +move folder felamimail id pindahkan folder +move messages felamimail id pindahkan pesan +move messages? felamimail id Pindahkan Pesan? +name felamimail id Nama +new common id Baru +new filter felamimail id Saringan baru +next felamimail id Berikutnya +next message felamimail id pesan berikutnya +no encryption felamimail id tiada enkripsi +no filter felamimail id Tiada Saringan +no folders felamimail id tiada folder +no signature felamimail id tiada tandatangan +no stationery felamimail id no stationery +no subject given! felamimail id tiada subyek diisikan! +none felamimail id tiada +not allowed felamimail id tidak dibolehkan +on felamimail id pada +on behalf of felamimail id bertindak sebagai +only inbox felamimail id Hanya INBOX +only unseen felamimail id Hanya yang belum dilihat +open all felamimail id buka semuanya +options felamimail id Pilihan +or felamimail id or +organisation felamimail id organisasi +organization felamimail id organisasi +organization name admin id Nama Organisasi +original message felamimail id pesan asal +participants felamimail id Peserta +personal information felamimail id Info Pribadi +port felamimail id port +posting felamimail id posting +previous felamimail id Sebelumnya +previous message felamimail id pesan sebelumnya +print it felamimail id cetak +print this page felamimail id cetak halaman ini +printview felamimail id lihat cetakan +quicksearch felamimail id Cari cepat +read felamimail id terbaca +reading felamimail id membaca +receive notification felamimail id Terima notifikasi +recent felamimail id terbaru +reject with felamimail id tolak dengan +remove felamimail id buang +remove immediately felamimail id Buang segera +rename felamimail id Ubah +rename a folder felamimail id Ubah Folder +rename folder felamimail id Ubah folder +renamed successfully! felamimail id Sukses mengubah! +replied felamimail id dibalas +reply felamimail id Balas +reply all felamimail id Balas ke Semua +reply to felamimail id Balas Ke +replyto felamimail id ReplyTo +respond felamimail id Tanggapan +return felamimail id Kembali +right felamimail id Kanan +rule felamimail id Rule/Aturan +sat felamimail id Sab +save felamimail id Simpan +save all felamimail id Simpan semuanya +save as draft felamimail id simpan sbg draft +save as infolog felamimail id simpan sbg infolog +save changes felamimail id simpan perubahan +save message to disk felamimail id simpan pesan ke disk +script name felamimail id nama skrip +script status felamimail id status skrip +search felamimail id Pencarian +search for felamimail id Mencari +select felamimail id Pilih +select all felamimail id Pilih Semuanya +select emailprofile felamimail id Pilih Profil Email +select folder felamimail id pilih folder +send felamimail id Kirim +send a reject message felamimail id kirim pesan penolakan +sent felamimail id Sent +sent folder felamimail id Sent Folder +set as default felamimail id Tetapkan sbg bawaan +show header felamimail id tampilkan header +sieve settings admin id Sieve settings +signatur felamimail id Tandatangan +signature felamimail id Tandatangan +simply click the target-folder felamimail id Cukup klik folder tujuan +size felamimail id Ukuran +size(...->0) felamimail id Ukuran (...->0) +size(0->...) felamimail id Ukuran (0->...) +skipping forward felamimail id skipping forward +skipping previous felamimail id skipping previous +small view felamimail id small view +smtp settings admin id SMTP settings +stationery felamimail id stationery +subject felamimail id Subyek +subject(a->z) felamimail id Subyek (A->Z) +subject(z->a) felamimail id Subyek (Z->A) +submit felamimail id Kirimkan +subscribe felamimail id Berlangganan +subscribed felamimail id Berlangganan +subscribed successfully! felamimail id Sukses berlangganan! +sun felamimail id Min +system signature felamimail id tandatangan sistem +table of contents felamimail id Daftar Isi +template folder felamimail id Folder Templat +templates felamimail id Templat +text only felamimail id Hanya teks +text/plain felamimail id text/plain +then felamimail id THEN +this folder is empty felamimail id THIS FOLDER IS EMPTY +thu felamimail id Kam +to felamimail id Kepada +translation preferences felamimail id Kesukaan Penerjemahan +translation server felamimail id Server Penerjemahan +trash felamimail id Trash +trash fold felamimail id Trash Fold +trash folder felamimail id Trash Folder +tue felamimail id Sel +type felamimail id tipe +unflagged felamimail id tak ditandai +unknown err felamimail id Unknown err +unknown error felamimail id Unknown error +unknown sender felamimail id Pengirim Takdikenal +unread common id Tak dibaca +unseen felamimail id Tak dilihat +unselect all felamimail id Batalkan semua pilihan +unsubscribe felamimail id Batal berlangganan +unsubscribed felamimail id Batal berlangganan +unsubscribed successfully! felamimail id Sukses membatalkan langganan! +up felamimail id naik +updating view felamimail id memperbarui tampilan +use addresses felamimail id Gunakan Alamat +vacation notice common id vacation notice +validate certificate felamimail id validate certificate +view full header felamimail id Lihat header penuh +view message felamimail id Lihat pesan +viewing full header felamimail id Melihat header penuh +viewing message felamimail id Melihat pesan +viewing messages felamimail id Melihat pesan +wed felamimail id Rab +with message felamimail id dengan pesan +with message "%1" felamimail id dengan pesan "%1" +wrap incoming text at felamimail id Gulung teks pada +writing felamimail id menulis +wrote felamimail id menulis diff --git a/felamimail/lang/egw_it.lang b/felamimail/lang/egw_it.lang new file mode 100644 index 0000000000..815d16df22 --- /dev/null +++ b/felamimail/lang/egw_it.lang @@ -0,0 +1,343 @@ +(no subject) felamimail it (nessun oggetto) +(only cc/bcc) felamimail it (solo Cc/Ccn) +(unknown sender) felamimail it (mittente sconosciuto) +activate felamimail it Attiva +activate script felamimail it attiva script +add address felamimail it Aggiungi indirizzo +add rule felamimail it Aggiungi Regola +add script felamimail it Aggiungi Script +add to %1 felamimail it Aggiungi a %1 +add to address book felamimail it Aggiungi alla rubrica +add to addressbook felamimail it aggiungi alla rubrica +additional info felamimail it Informazioni Addizionali +address book felamimail it Rubrica +address book search felamimail it Ricerca Rubrica +after message body felamimail it Dopo il corpo del messaggio +all address books felamimail it Tutte le rubriche +all folders felamimail it Tutte le Cartelle +all of felamimail it tutto di +allways a new window felamimail it sempre in una nuova finestra +always show html emails felamimail it Visualizza sempre le e-mail HTML +any of felamimail it qualche di +anyone felamimail it chiunque +as a subfolder of felamimail it come sottocartella di +attachments felamimail it Allegati +auto refresh folder list felamimail it Auto aggiorna elenco cartelle +back to folder felamimail it Torna alla cartella +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail it In base ai criteri stabiliti, i messaggi in entrata possono avere differenti colori nell'elenco messaggi. Ciò aiuta a distinguere facilmente la provenienza dei messaggi, specialmente per liste di distribuzione. +bcc felamimail it CCN +before headers felamimail it Prima degli header +between headers and message body felamimail it Tra gli header e il corpo del messaggio +body part felamimail it body part +can't connect to inbox!! felamimail it non riesco a connettermi alla INBOX !! +cc felamimail it CC +change folder felamimail it Cambia cartella +check message against next rule also felamimail it controlla il messaggio anche con regola seguente +checkbox felamimail it Checkbox +click here to log back in. felamimail it Clicca qui per loggarti di nuovo. +click here to return to %1 felamimail it Clicca qui per tornare a %1 +close all felamimail it chiudi tutto +close this page felamimail it chiudi questa pagina +close window felamimail it Chiudi finestra +color felamimail it Colore +compose felamimail it Componi +compress folder felamimail it Comprimi cartella +configuration felamimail it Configurazione +contains felamimail it contiene +create felamimail it Crea +create folder felamimail it Crea Cartella +create sent felamimail it Crea Messaggi Inviati +create subfolder felamimail it Crea sottocartella +create trash felamimail it Crea Cestino +created folder successfully! felamimail it Cartella creata correttamente! +dark blue felamimail it Blu Scuro +dark cyan felamimail it Ciano Scuro +dark gray felamimail it Grigio Scuro +dark green felamimail it Verde Scuro +dark magenta felamimail it Magenta Scuro +dark yellow felamimail it Giallo Scuro +date(newest first) felamimail it Data (prima più recenti) +date(oldest first) felamimail it Data (prima meno recenti) +days felamimail it giorni +deactivate script felamimail it disattiva script +default sorting order felamimail it Ordinamento predefinito +delete all felamimail it cancella tutto +delete folder felamimail it Cancella Cartella +delete script felamimail it cancella script +delete selected felamimail it Cancella selezionati +delete selected messages felamimail it cancella i messaggi selezionati +deleted felamimail it cancellato +deleted folder successfully! felamimail it Cartella cancellata! +disable felamimail it Disabilita +discard message felamimail it scarta messaggio +display message in new window felamimail it Visualizza i messaggi in una nuova finestra +display of html emails felamimail it Visualizzazione delle e-mail HTML +display only when no plain text is available felamimail it Visualizza solo quando non disponibile il testo normale +display preferences felamimail it Visualizza Preferenze +do it! felamimail it fallo! +do not use sent felamimail it Non usare Inviati +do not use trash felamimail it Non usare Cestino +do you really want to delete the '%1' folder? felamimail it Vuoi veramente cancellare la cartella '%1' ? +does not contain felamimail it non contiene +does not match felamimail it non corrisponde +does not match regexp felamimail it non corrisponde a regexp +don't use sent felamimail it Non usare Posta Inviata +don't use trash felamimail it Non usare il Cestino +down felamimail it sotto +download felamimail it download +download this as a file felamimail it Download come un file +e-mail felamimail it E-Mail +e-mail address felamimail it indirizzo E-Mail +e-mail folders felamimail it Cartelle E-Mail +edit filter felamimail it Modifica filtro +edit rule felamimail it modifica regola +edit selected felamimail it Modifica selezionato +edit vacation settings felamimail it Modifica impostazioni vacation +email address felamimail it Indirizzo E-Mail +email signature felamimail it Firma E-mail +empty trash felamimail it svuota cestino +enable felamimail it abilita +enter your default mail domain ( from: user@domain ) admin it Inserisci il tuo dominio di posta predefinito ( Da: utente@dominio ) +enter your imap mail server hostname or ip address admin it Enter your IMAP mail server hostname or IP address +enter your sieve server hostname or ip address admin it Enter your SIEVE server hostname or IP address +enter your sieve server port admin it Enter your SIEVE server port +enter your smtp server hostname or ip address admin it Enter your SMTP server hostname or IP address +enter your smtp server port admin it Enter your SMTP server port +error felamimail it ERRORE +error connecting to imap serv felamimail it Errore in connessione al server IMAP +error opening felamimail it Errore in apertura +every felamimail it ogni +every %1 days felamimail it ogni %1 giorni +expunge felamimail it Svuota +felamimail common it FelaMiMail +file into felamimail it file in +files felamimail it files +filter active felamimail it filtro attivo +filter name felamimail it Nome Filtro +filter rules felamimail it Regole Filtro +first name felamimail it Nome +flagged felamimail it contrassegnato +flags felamimail it Flags +folder acl felamimail it acl cartella +folder name felamimail it Nome Cartella +folder path felamimail it Path della Cartella +folder preferences felamimail it Preferenze Cartelle +folder settings felamimail it Impostazioni Cartelle +folder status felamimail it Stato Cartelle +folderlist felamimail it Lista Cartele +foldername felamimail it Nome cartella +folders felamimail it Cartelle +folders created successfully! felamimail it Cartella creata correttamente! +follow felamimail it segue +for mail to be send - not functional yet felamimail it For mail to be send - not functional yet +for received mail felamimail it For received mail +forward felamimail it Inoltra +forward to address felamimail it inoltra a indirizzo +found felamimail it Trovato +fri felamimail it Ven +from felamimail it Da +from(a->z) felamimail it Da (A->Z) +from(z->a) felamimail it Da (Z->A) +full name felamimail it Nome Completo +greater than felamimail it superiore a +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail it Have a look at www.felamimail.org to learn more about Squirrelmail.
    +header lines felamimail it Linee Intestazione +hide header felamimail it nascondi intestazione +html felamimail it HTML +icons and text felamimail it Icone e Testo +icons only felamimail it Solo icone +identifying name felamimail it Nome identificativo +if felamimail it SE +if from contains felamimail it se da contiene +if mail header felamimail it se intestazione messaggio +if message size felamimail it se dimensione messaggio +if subject contains felamimail it se oggetto contiene +if to contains felamimail it se a contiene +illegal folder name. please select a different name. felamimail it Nome cartella non permesso. Prego scegli un altro nome. +imap felamimail it IMAP +imap server felamimail it Server IMAP +imap server address felamimail it Indirizzo Server IMAP +imap server type felamimail it Tipo Server IMAP +imaps authentication felamimail it IMAPS Authentication +imaps encryption only felamimail it IMAPS Encryption only +in felamimail it nel +index order felamimail it Index Order +info felamimail it Info +invalid user name or password felamimail it Nome utente o password errati +javascript felamimail it JavaScript +keep a copy of the message in your inbox felamimail it mantieni una copia del messaggio nella tua posta in arrivo +kilobytes felamimail it kilobyte +language felamimail it Lingua +last name felamimail it Cognome +left felamimail it Sinistra +less felamimail it pochi +less than felamimail it meno di +light gray felamimail it Grigio Chiaro +list all felamimail it Visualizza tutti +location of buttons when composing felamimail it Location of buttons when composing +mail server login type admin it Mail server login type +mail settings felamimail it Imposazioni Mail +mainmessage felamimail it messaggio principale +manage emailfilter / vacation preferences it Gestione Filtro Email / Assenze +manage folders common it Gestione Cartelle +manage sieve common it Gestione script Sieve +mark as deleted felamimail it Segna come cancellato +mark messages as felamimail it Segna i messaggi selezionati come +mark selected as flagged felamimail it Segna come contrassegnati +mark selected as read felamimail it Segna come già letto +mark selected as unflagged felamimail it Segna come non contrassegnati +mark selected as unread felamimail it Segna come da leggere +match felamimail it Corrisponde +matches felamimail it corrispondenze +matches regexp felamimail it matches regexp +message highlighting felamimail it Message Highlighting +message list felamimail it Lista Messaggi +messages felamimail it messaggi +mon felamimail it Lun +move felamimail it sposta +move messages felamimail it sposta messaggi +move to felamimail it sposta selezionato in +move to trash felamimail it Sposta nel cestino +moving messages to felamimail it spostamento messaggi in +name felamimail it Nome +never display html emails felamimail it Non visualizzare mai le e-mail HTML +new common it Nuovo +new filter felamimail it Nuovo Filtro +next felamimail it Successivo +next message felamimail it prossimo messaggio +no filter felamimail it Nessun Filtro +no folders found felamimail it Nessuna cartella trovata +no folders were found to subscribe to! felamimail it No folders were found to subscribe to! +no folders were found to unsubscribe from! felamimail it No folders were found to unsubscribe from! +no highlighting is defined felamimail it Nessuna evidenziazione definita +no messages found... felamimail it nessun messaggio trovato... +no messages were selected. felamimail it Nessun messaggio selezionato. +no previous message felamimail it nessun Messaggio precedente +no valid emailprofile selected!! felamimail it Nessun Profilo E-Mail valido selezionato!! +none felamimail it nessuno +on behalf of felamimail it on behalf of +one address is not valid felamimail it Un indirizzo non è valido +only inbox felamimail it Solo INBOX +only one window felamimail it solo una finestra +only unseen felamimail it Solo non letti +open all felamimail it apri tutto +options felamimail it Opzioni +organisation felamimail it organizzazione +organization felamimail it organizzazione +organization name admin it Nome organizzazione +participants felamimail it Partecipanti +personal information felamimail it Informazioni Personali +please select a address felamimail it Prego seleziona un indirizzo +please select the number of days to wait between responses felamimail it Prego seleziona il numero di giorni da aspettare tra le risposte +please supply the message to send with auto-responses felamimail it Prego fornisci il messaggio ta inviare con la risposta automatica +posting felamimail it invio +previous felamimail it Precedente +previous message felamimail it messaggio precedente +print it felamimail it stampa +print this page felamimail it stampa questa pagina +quicksearch felamimail it Ricerca Veloce +read felamimail it leggi +reading felamimail it leggendo +recent felamimail it recenti +refresh time in minutes felamimail it Tempo di aggiornamento in minuti +remove felamimail it rimuovi +remove immediately felamimail it Rimuovi immediatamente +rename felamimail it Rinomina +rename a folder felamimail it Rinomina una Cartella +rename folder felamimail it Rinomina cartella +renamed successfully! felamimail it Rinominato correttamente! +replied felamimail it risposto +reply felamimail it Rispondi +reply all felamimail it Rispondi a Tutti +reply to felamimail it Rispondi A +replyto felamimail it Rispondi A +respond felamimail it AutoRispondi +respond to mail sent to felamimail it AutoRispondi alle mail inviate a +return felamimail it Ritorna +return to options page felamimail it Return to options page +right felamimail it Destra +rule felamimail it Regole +sat felamimail it Sab +save felamimail it Salva +save changes felamimail it salva modifiche +script name felamimail it nome script +script status felamimail it stato script +search felamimail it Ricerca +search for felamimail it Cerca +select felamimail it Seleziona +select all felamimail it Seleziona Tutti +select emailprofile felamimail it Seleziona Profilo E-Mail +select folder felamimail it seleziona cartella +select your mail server type admin it Selezona il tipo di server mail +send felamimail it Invia +send a reject message felamimail it invia messaggio di rifiuto +sent folder felamimail it Cartella Posta Inviata +show header felamimail it visualizza header +show new messages on main screen felamimail it Visualizza i nuovi messaggi nella schermata principale +sieve settings admin it Impostazioni Sieve +signature felamimail it Firma +simply click the target-folder felamimail it Semplicemente clicca la cartella destinazione +size felamimail it Dimensione +size of editor window felamimail it Dimensione della finestra di edit +size(...->0) felamimail it Dimensione (...->0) +size(0->...) felamimail it Dimensione (0->...) +small view felamimail it visualizzazione ridotta +smtp settings admin it Impostazioni SMTP +subject felamimail it Oggetto +subject(a->z) felamimail it Oggetto (A->Z) +subject(z->a) felamimail it Oggetto (Z->A) +submit felamimail it Invia +subscribe felamimail it Sottoscrivi +subscribed felamimail it Sottoscritti +subscribed successfully! felamimail it Sottoscritto con successo! +sun felamimail it Dom +table of contents felamimail it Indice dei contenuti +text only felamimail it Solo testo +the connection to the imap server failed!! felamimail it La connessione al server IMAP è fallita!! +then felamimail it ALLORA +this folder is empty felamimail it QUESTA CARTELLA E' VUOTA +this php has no imap support compiled in!! felamimail it Questo PHP non contiene il supporto IMAP!! +thu felamimail it Gio +to felamimail it A +to mail sent to felamimail it to mail sent to +translation preferences felamimail it Preferenze Traduzioni +translation server felamimail it Server Traduzioni +trash fold felamimail it Cestino +trash folder felamimail it Cestino +tue felamimail it Mar +type felamimail it tipo +unflagged felamimail it non contrassegnato +unknown err felamimail it Errore Sconosciuto +unknown error felamimail it Errore Sconosciuto +unknown sender felamimail it Mittente Sconosciuto +unknown user or password incorrect. felamimail it Utente sconosciuto o password sbagliata. +unread common it da leggere +unseen felamimail it Nuovi +unselect all felamimail it Deseleziona Tutto +unsubscribe felamimail it Unsubscribe +unsubscribed felamimail it Unsubscribed +unsubscribed successfully! felamimail it Unsubscribed successfully! +up felamimail it su +use a signature felamimail it Usa una firma +use a signature? felamimail it Usare una firma? +use addresses felamimail it Usa Indirizzo +use custom settings felamimail it Usa Impostazioni Personali +use javascript or html addressbook? felamimail it Usa rubrica Javascript o HTML? +use regular expressions felamimail it usa espressioni regolari +use smtp auth admin it usa autenticazione SMTP +users can define their own emailaccounts admin it Gli utenti possono definire i propri account email +vacation notice felamimail it notifica assenza +view full header felamimail it Visualizza gli header completi +view message felamimail it Visualizza messaggio +viewing full header felamimail it Viewing full header +viewing message felamimail it Viewing message +viewing messages felamimail it Viewing messages +wed felamimail it Mer +welcome to %1's webmail system felamimail it Benvenuti al sistema WebMail %1 +when deleting messages felamimail it Durante la cancellazione dei messaggi +with message felamimail it con messaggio +with message "%1" felamimail it con messaggio "%1" +wrap incoming text at felamimail it Affianca testo a +writing felamimail it scrittura +wrote felamimail it scritto +you must login first. felamimail it Devi prima eseguire il Login. diff --git a/felamimail/lang/egw_iw.lang b/felamimail/lang/egw_iw.lang new file mode 100755 index 0000000000..b1bbf7ae74 --- /dev/null +++ b/felamimail/lang/egw_iw.lang @@ -0,0 +1,369 @@ +(no subject) felamimail iw (×œ×œ× × ×•×©×) +(only cc/bcc) felamimail iw (רק העתק/העתק מוסתר) +(unknown sender) felamimail iw (שולח ×œ× ×™×“×•×¢) +activate felamimail iw הפעל +activate script felamimail iw הפעל סקריפט +add address felamimail iw הוסף כתובת +add rule felamimail iw הוסף חוק +add script felamimail iw הוסף סקריפט +add to %1 felamimail iw הוסף ×ל %1 +add to address book felamimail iw הוסף לספר כתובות +add to addressbook felamimail iw הוסף לספר כתובות +additional info felamimail iw מידע נוסף +address book felamimail iw ספר כתובות +address book search felamimail iw חיפוש בספר כתובות +after message body felamimail iw ×חרי גוף ההודעה +all address books felamimail iw כל ספרי הכתובות +all folders felamimail iw כל התיקיות +always show html emails felamimail iw HTML תמיד להציג דו×ר ×לקטרוני +anyone felamimail iw כל ×חד +as a subfolder of felamimail iw כתת תיקיה של +attachments felamimail iw ×ž×¦×•×¨×¤×™× +auto refresh folder list felamimail iw רענן רשימת תיקיות ×וטומטית +back to folder felamimail iw חזור לתיקיה +bad reque felamimail iw בקשה ×œ× ×—×•×§×™×ª +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail iw בהת×× ×œ×§×¨×˜×¨×™×•× ×™× ×ž×•×’×“×¨×™×, צבע הרקע של דו×ר נכנס מתקבל בהת×× ×œ×©× ×”×©×•×œ×—. ×–×” שימושי במיוחד ברשימות תפוצה. +bcc felamimail iw העתק מוסתר +before headers felamimail iw לפני הכותרות +between headers and message body felamimail iw בין הכותרות לגוף ההודעה +body part felamimail iw ההודעה גופה +can't connect to inbox!! felamimail iw !×œ× ×™×›×•×œ להתחבר לתיבת הדו×ר הנכנס +cc felamimail iw העתק +change folder felamimail iw שנה תיקיה +checkbox felamimail iw תיבת סימון +click here to log back in. felamimail iw הקלק ×›×ן להכנס שוב +click here to return to %1 felamimail iw הקלק ×›×ן כדי לחזור ×ל %1 +close all felamimail iw סגור הכל +close this page felamimail iw סגור עמוד ×–×” +close window felamimail iw (סגור חלון (קר בבית :-) +color felamimail iw צבע +compose felamimail iw חדש +compress folder felamimail iw קבץ תיקיה +configuration felamimail iw הגדרה +contains felamimail iw מכיל +create felamimail iw צור +create folder felamimail iw צור תיקיה +create sent felamimail iw צור ×¤×¨×™×˜×™× ×©× ×©×œ×—×• +create subfolder felamimail iw צור תת תיקיה +create trash felamimail iw צור ×שפה +created folder successfully! felamimail iw התיקיה נוצרה בהצלחה +dark blue felamimail iw כחול ×›×”×” +dark cyan felamimail iw צי×ן ×›×”×” +dark gray felamimail iw ×פור ×›×”×” +dark green felamimail iw ירוק ×›×”×” +dark magenta felamimail iw סגול ×›×”×” +dark yellow felamimail iw צהוב ×›×”×” +date(newest first) felamimail iw (ת×ריך (×—×“×©×™× ×ª×—×™×œ×” +date(oldest first) felamimail iw (ת×ריך (×™×©× ×™× ×ª×—×™×œ×” +days felamimail iw ×™×ž×™× +deactivate script felamimail iw הפס הפעלת סקריפט +default sorting order felamimail iw סדר מיון מחדלי +delete all felamimail iw מחק הכל +delete folder felamimail iw מחק תיקיה +delete script felamimail iw מחק סקריפט +delete selected felamimail iw מחק × ×‘×—×¨×™× +delete selected messages felamimail iw מחק הודעות מובחרות +deleted felamimail iw נמחקו +deleted folder successfully! felamimail iw !מחקתי תיקיה בהצלחה +disable felamimail iw הפוך ×œ×œ× ×¤×¢×™×œ +display message in new window felamimail iw הצג הודעה בחלון חדש +display of html emails felamimail iw HTML הצגת דו×ר +display only when no plain text is available felamimail iw הצג רק ×›×שר טקסט פשוט ×œ× ×–×ž×™×Ÿ +display preferences felamimail iw עדיפויות תצוגה +do it! felamimail iw !עשה ×–×ת +do not use sent felamimail iw ×œ× ×œ×”×©×ª×ž×© בתיקית נשלח +do not use trash felamimail iw ×œ× ×œ×”×©×ª×ž×© בתיקית ×שפה +do you really want to delete the '%1' folder? felamimail iw ?בטוח שברצונך למחוק ×ת תיקיית '%1' +does not contain felamimail iw ×ינו מכיל +does not match felamimail iw ×ינו תו×× +does not match regexp felamimail iw regexp ×ינו תו×× +don't use sent felamimail iw ×œ× ×œ×”×©×ª×ž×© בתיקית ×¤×¨×™×˜×™× ×©× ×©×œ×—×• +don't use trash felamimail iw ×œ× ×œ×”×©×ª×ž×© בתיקית ×שפה +down felamimail iw למטה +download felamimail iw הורד +download this as a file felamimail iw הורד ×ת ×–×” כקובץ +e-mail felamimail iw דו×"ל +e-mail address felamimail iw כתובת דו×"ל +e-mail folders felamimail iw תיקיות דו×"ל +edit filter felamimail iw ערוך מסנן +edit rule felamimail iw ערוץ חוק +edit selected felamimail iw ערוך × ×‘×—×¨×™× +edit vacation settings felamimail iw ערוך הגדרת חופשות +email address felamimail iw כתובת דו×"ל +email signature felamimail iw חתימת דו×"ל +empty trash felamimail iw רוקן ×שפה +enable felamimail iw ×פשר +enter your default mail domain ( from: user@domain ) admin iw (user@domain :הכנס ×ת דומיין הדו×ר המחדלי שלך (×œ×“×•×’×ž× +enter your imap mail server hostname or ip address admin iw שלו IP-שלך ×ו ×תכתובת ×” IMAP-הכנס ×ת ×©× ×©×¨×ª ×” +enter your sieve server hostname or ip address admin iw שלו IP-שלך ×ו ×תכתובת ×” Sieve-הכנס ×ת ×©× ×©×¨×ª ×” +enter your sieve server port admin iw שלך Sieve-הכנס ×ת פורט שרת ×” +enter your smtp server hostname or ip address admin iw שלו IP-שלך ×ו ×תכתובת ×” SMTP-הכנס ×ת ×©× ×©×¨×ª ×” +enter your smtp server port admin iw שלך SMTP-הכנס ×ת פורט שרת ×” +error felamimail iw שגי××” +error connecting to imap serv felamimail iw IMAP שגי××” בחיבור לשרת +error opening felamimail iw שגיעה בפתיחת +every felamimail iw כל +every %1 days felamimail iw כל %1 ×™×ž×™× +expunge felamimail iw השמד +file into felamimail iw תייק בתוך +files felamimail iw ×§×‘×¦×™× +filter active felamimail iw מסנן פעיל +filter name felamimail iw ×©× ×ž×¡× ×Ÿ +filter rules felamimail iw חוקי סינון +first name felamimail iw ×©× ×¤×¨×˜×™ +flagged felamimail iw מדוגל +flags felamimail iw ×“×’×œ×™× +folder acl felamimail iw רשימת גישה לתיקיה +folder name felamimail iw ×©× ×ª×™×§×™×” +folder path felamimail iw מסלול ×ל התיקיה +folder preferences felamimail iw עדיפויות תיקיה +folder settings felamimail iw הגדרות תיקיה +folder status felamimail iw סט×טוס תיקיה +folderlist felamimail iw רשימת תיקיות +foldername felamimail iw ×©× ×ª×™×§×™×” +folders felamimail iw תיקיות +folders created successfully! felamimail iw !התיקיה נוצרה בהצלחה +follow felamimail iw עקוב +for mail to be send - not functional yet felamimail iw עבור דו×ר שישלח - עדיין ×œ× ×¢×•×‘×“ +for received mail felamimail iw עבור דו×ר נכנס +forward felamimail iw העבר +found felamimail iw × ×ž×¦× +fri felamimail iw שישי +from felamimail iw מ×ת +from(a->z) felamimail iw (מ×ת (× ->ת +from(z->a) felamimail iw (מ×ת (ת->× +full name felamimail iw ×©× ×ž×œ× +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail iw תסתכל ב- www.felamimail.org כדי ללמוד עוד על Squirrelmail.
    +header lines felamimail iw שורות כותרת +hide header felamimail iw הסתר כותרת +icons and text felamimail iw צלמיות וטקסט +icons only felamimail iw צלמיות בלבד +identifying name felamimail iw ×©× ×ž×–×”×” +if felamimail iw ×× +illegal folder name. please select a different name. felamimail iw ×©× ×ª×™×§×™×” ×œ× ×—×•×§×™. × × ×œ×‘×—×•×¨ ×©× ×חר. +imap server felamimail iw שרת IMAP +imap server address felamimail iw כתובת שרת IMAP +imap server type felamimail iw סוג שרת IMAP +imaps authentication felamimail iw ×ימות IMAPS +imaps encryption only felamimail iw הצפנת IMAPS בלבד +in felamimail iw בתוך +in order for squirrelmail to provide the full set of options you need to create the special folders listed below. just click the check box and hit the create button. felamimail iw כדי ש-SquirrelMail יוכל לספק ×ת ×ž×œ×•× ×”×ופציות ×”×פשריות עליך ליצור ×ת התיקיות המיוחדות הרשומות למטה. רק סמן ×ת התיבה ולחץ על כפתור צור. +in the center felamimail iw במרכז +index order felamimail iw סדר ×ינדקס +info felamimail iw מידע +invalid user name or password felamimail iw ×©× ×ž×©×ª×ž×© ×ו ×¡×™×¡×ž× ×œ× ×—×•×§×™ +language felamimail iw שפה +last name felamimail iw ×©× ×ž×©×¤×—×” +left felamimail iw שמ×ל +less felamimail iw פחות +let this folder contain subfolders felamimail iw תיקיה זו מכילה תתי תיקיות +light blue felamimail iw כחול בהיר +light cyan felamimail iw צי×ן בהיר +light gray felamimail iw ×פור בהיר +light green felamimail iw ירוק בהיר +light magenta felamimail iw סגול בהיר +light yellow felamimail iw צהוב בהיר +list all felamimail iw הצג הכל +location of buttons when composing felamimail iw ×ž×™×§×•× ×”×›×¤×ª×•×¨×™× ×‘×¢×ª כתיבת הודעה +location of folder list felamimail iw ×ž×™×§×•× ×¨×©×™×ž×ª התיקיות +mail server login type admin iw סוג הכניסה לשרת הדו×ר +mail settings felamimail iw הגדרות דו×ר +mainmessage felamimail iw הודעה ר×שית +manage folders common iw ניהול תיקיות +manage sieve common iw ניהול ×¡×§×¨×™×¤×˜×™× ×©×œ Sieve +mark as deleted felamimail iw סמן כמחוק +mark messages as felamimail iw סמן הודעות נבחרות ×›- +mark selected as flagged felamimail iw סמן נבחרות כמדוגלות +mark selected as read felamimail iw סמן נבחרות כנקר×ו +mark selected as unflagged felamimail iw סמן נבחרות ×›×œ× ×ž×“×•×’×œ×•×ª +mark selected as unread felamimail iw סמן נבחרות ×›×œ× × ×§×¨×ו +match felamimail iw הת×× +matches felamimail iw הת×מות +matches regexp felamimail iw הת×מות regexp +medium gray felamimail iw ×פור בינוני +message felamimail iw הודעה +message highlighting felamimail iw הדגשות הודעה +message list felamimail iw רשימת הודעות +messages felamimail iw הודעות +minute felamimail iw דקה +minutes felamimail iw דקות +mon felamimail iw שני +more felamimail iw עוד +move felamimail iw ×”×–×– +move messages felamimail iw ×”×–×– הודעות +move to felamimail iw ×”×–×– הודעות ×ל +move to trash felamimail iw ×”×–×– ל×שפה +must be unique felamimail iw חייב להיות ייחודי +name felamimail iw ×©× +never display html emails felamimail iw ×œ×¢×•×œ× ×œ× ×œ×”×¦×™×’ הודעות HTML +new common iw חדש +new filter felamimail iw מסנן חדש +next felamimail iw הב××” +next message felamimail iw ההודעה הב××” +nickname felamimail iw ×©× ×—×™×‘×” +no filter felamimail iw ×œ×œ× ×ž×¡× ×Ÿ +no folders found felamimail iw ×œ× × ×ž×¦×ו תיקיות +no folders were found to subscribe to! felamimail iw ×œ× × ×ž×¦×ו תיקיות ש×פשר ×œ×”×¨×©× ×ליהן! +no folders were found to unsubscribe from! felamimail iw ×œ× × ×ž×¦×ו תיקיות ש×פשר לבטל הרשמה מהן! +no highlighting is defined felamimail iw ×œ× ×ž×•×’×“×¨×ª הדגשה כלשהי +no messages were selected. felamimail iw ×œ× × ×‘×—×¨×” ××£ הודעה. +no next message felamimail iw ×ין הודעה הב××” +no notification felamimail iw ×ין התרעה +no personal address book is defined. contact administrator. felamimail iw ×œ× ×”×•×’×“×¨×” ספר כתובות ×ישי. צור קשר ×× ×”×ž× ×”×œ. +no persons matching your search was found felamimail iw ×œ× × ×ž×¦×ו ×× ×©×™× ×”×ž×ª××™×ž×™× ×œ×—×™×¤×•×©. +no previous message felamimail iw ×ין הודעה קודמת +no valid emailprofile selected!! felamimail iw ×œ× × ×‘×—×¨×” פרופיל דו×"ל חוקי !! +none felamimail iw ×œ×œ× +number of messages to index felamimail iw מספר ההודעות למיפתוח +on behalf of felamimail iw ×‘×©× +only inbox felamimail iw רק תיבת דו×ר נכנס +only unseen felamimail iw רק ×œ× × ×§×¨×ו +open all felamimail iw פתח הכל +options felamimail iw ×פשריות +organisation felamimail iw ×ירגון +organization felamimail iw ×ירגון +organization name admin iw ×©× ×”×ירגון +oth felamimail iw ×חר +participants felamimail iw ×ž×©×ª×ª×¤×™× +personal information felamimail iw מידע ×ישי +posting felamimail iw שולח +preference file %1 not found. exiting abnormally felamimail iw קובץ עדיפויות %1 ×œ× × ×ž×¦×. ×™×•×¦× ×™×¦×™××” ×œ× ×˜×‘×¢×™×ª. +preference file, %1, does not exist. log out, and log back in to create a default preference file. felamimail iw קובץ עדיפויות, %!, ×œ× ×§×™×™×. ×¦× ×ž×”×ž×¢×¨×›×ª וכנס מחדש כדי ליצור קובץ עדיפויות מחדלי. +previous felamimail iw הקודמת +previous message felamimail iw ההודעה הקודמת +print it felamimail iw הדפס +print this page felamimail iw הדפס עמוד ×–×” +purge felamimail iw טהר +quicksearch felamimail iw חיפוש מהיר +read felamimail iw ×§×¨× +read da felamimail iw ×§×¨× ×ž×™×“×¢ +reading felamimail iw ×§×•×¨× +reason giv felamimail iw הסיבה הניתנת +recent felamimail iw ל×חרונה +refresh folder list felamimail iw רענן רשימת תיקיות +refresh page felamimail iw רענן עמוד +refresh time in minutes felamimail iw זמן רענון בדקות +remove felamimail iw הסר +remove immediately felamimail iw הסר מיד +rename felamimail iw שנה ×©× +rename a folder felamimail iw שנה ×©× ×ª×™×§×™×” +rename folder felamimail iw שנה ×©× ×ª×™×§×™×” +renamed successfully! felamimail iw ×”×©× ×©×•× ×” בהצלחה! +replied felamimail iw הישיב +reply felamimail iw השב +reply all felamimail iw השב לכל +reply to felamimail iw השב ל +replyto felamimail iw השב ל +return felamimail iw חזור +return to options page felamimail iw חזור לעמוד ×פשריות +right felamimail iw ימין +rule felamimail iw חוק +running squirrelmail version %1 (c) 1999-2000. felamimail iw מריץ SquirrelMail גירס×%1 (c) 1999-2000. +same window - not functional yet felamimail iw ×ותו חלון - עוד ×œ× ×¢×•×‘×“ +sat felamimail iw שבת +save felamimail iw שמור +search felamimail iw חפש +search for felamimail iw חפש +seconds felamimail iw שניות +select felamimail iw בחר +select all felamimail iw בחר הכל +select emailprofile felamimail iw בחר פרופיל דו×"ל +select home email address felamimail iw בחר כתובת דו×\"ל בבית +select work email address felamimail iw בחר כתובת דו×\"ל בעבודה +select your mail server type admin iw בחר ×ת סוג שרת הדו×ר שלך +send felamimail iw שלח +sent fold felamimail iw תיקית נשלחו +sent folder felamimail iw תיקיית נשלחו +server respond felamimail iw תגובת השרת +show header felamimail iw הצג כותרת +show new messages on main screen felamimail iw הצג הודעות חדשות במסך הר×שי. +sieve settings admin iw הגדרות Sieve +signature felamimail iw חתימה +simply click the target-folder felamimail iw פשוט הקלק על תיקיית היעד +size felamimail iw גודל +size of editor window felamimail iw גודל חלון העריכה +size(...->0) felamimail iw גודל (...->0) +size(0->...) felamimail iw גודל (0->...) +small view felamimail iw תצוגה קטנה +smtp settings admin iw הגדרות SMTP +some or all of the help documents are not present! felamimail iw לפחות חלק מקבצי העזרה חסרי! +source felamimail iw מקור +special folder options felamimail iw ×פשריות תיקיה מיוחדות +subject felamimail iw × ×•×©× +subject(a->z) felamimail iw × ×•×©× (× -> ת) +subject(z->a) felamimail iw × ×•×©× (ת -> ×) +submit felamimail iw הגש +subscribe felamimail iw ×”×¨×©× +subscribed felamimail iw ×¨×©×•× +subscribed successfully! felamimail iw × ×¨×©× ×‘×”×¦×œ×ª×”~! +successfully saved display preferences! felamimail iw עדיפויות תצוגה נשמרו בהצלחה! +successfully saved folder preferences! felamimail iw עדיפויות תיקיה נשמרו בהצלחה! +successfully saved personal information! felamimail iw מידע ×ישי נשמר בהצלחה! +sun felamimail iw ר×שון +switch current folder to felamimail iw החלף תיקיה נוכחית ל- +table of contents felamimail iw תוכן ×”×¢×™× ×™×™× ×™× +text only felamimail iw טקסו בלבד +the connection to the imap server failed!! felamimail iw הקישור לשרת IMAP נכשל!! +the help has not been translated to %1. it will be displayed in english instead. felamimail iw העזרה עדיין ×œ× ×ª×•×¨×’×ž×” ל %1. ×”×™× ×ª×•×¦×’ ב×נגלית ×‘×ž×§×•× ×–×ת. +the index order is the order that the columns are arranged in the message index. you can add, remove, and move columns around to customize them to fit your needs. felamimail iw סדר ×”×ינדקס ×”×•× ×”×¡×“×¨ בו העמודות מסודרות ב×ינדקס ההודעות. ×פשר להוסיף, להסיר ולהזיז עמודות כדי להת××™× ×ותן לצורכיך. +the order of the message index can be rearanged and changed to contain the headers in any order you want. felamimail iw ניתן לשנות ×ת סדר ×ינדקס ההודעות כדי להכיל ×ת הכותרות בכל סדר רצוי לך. +theme felamimail iw ערכת × ×•×©× +these settings change the way your folders are displayed and manipulated. felamimail iw הגדרות ×לו משנות ×ת הדרך בה התיקיות שלך מוצגות ומטופלות. +this contains personal information about yourself such as your name, your email address, etc. felamimail iw ×–×” מכיל מידע ×ישי ודותך כמו שמך, כתובת דו"ל וכדומה. +this folder is empty felamimail iw תיקיה זו ריקה +this port is based on squirrelmail, which is a standalone imap client.
    felamimail iw פורט זה מבוסס על Squirrelmail, שהנו לקוח IMAP העומד בפני עצמו.
    +thu felamimail iw חמישי +to felamimail iw ×ל +to the left felamimail iw לשמ×ל +to the right felamimail iw לימין +top felamimail iw עליון +translation location felamimail iw ×ž×™×§×•× ×”×ª×¨×’×•× +translation preferences felamimail iw עדיפויות ×ª×¨×’×•× +translation server felamimail iw שרת ×ª×¨×’×•× +trash fold felamimail iw תיקיית ×שפה +trash folder felamimail iw תיקיית ×שפה +tue felamimail iw שלישי +type felamimail iw סוג +unable to list addresses from %1 felamimail iw ×œ× ×™×›×•×œ להציג כתובות מ-%1 +unflagged felamimail iw ×œ× ×ž×“×•×’×œ×™× +unknown err felamimail iw שגי××” ×œ× ×™×“×•×¢×” +unknown error felamimail iw שגי××” ×œ× ×™×“×•×¢×” +unknown sender felamimail iw שולח ×œ× ×™×“×•×¢ +unknown user or password incorrect. felamimail iw משתמש ×œ× ×ž×•×›×¨ ×ו שגי××” בסיסמ×. +unread common iw ×œ× × ×§×¨× +unseen felamimail iw ×œ× × ×¨××” +unseen and total felamimail iw ×œ× × ×¨×ו וסך הכל +unseen message notification felamimail iw התרעה על הודעה ×©×œ× × ×¨××” +unseen message notification type felamimail iw סוג ההתרעה על הודעה ×©×œ× × ×¨××” +unselect all felamimail iw נקה בחר הכל +unsubscribe felamimail iw בטל הרשמה +unsubscribed felamimail iw הרשמה בוטלה +unsubscribed successfully! felamimail iw הרשמה בוטלה בהצלחה! +up felamimail iw למעלה +update address felamimail iw עדכן כתובת +use emailadmin to create profiles felamimail iw השתמש ב-EmailAdmin כדי ליצור ×¤×¨×•×¤×™×œ×™× +use a signature felamimail iw השתמש בחתימה +use a signature? felamimail iw השתמש בחתימה? +use addresses felamimail iw השתמש בכתובת +use custom settings felamimail iw השתמש בהגדרות מות×מות ×ישית +use javascript or html addressbook? felamimail iw להשתמש בספר כתובת Javascript ×ו HTML? +use smtp auth admin iw השתמש ב×ימות ×ž×©×ª×ž×©×™× ×©×œ SMTP +users can define their own emailaccounts admin iw ×ž×©×ª×ž×©×™× ×™×›×•×œ×™× ×œ×”×’×“×™×¨ ×‘×¢×¦×ž× ×ת חשבונות דו×ר ×”×לקטרוני ×©×œ×”× +view full header felamimail iw הצג כותרת מל××” +view message felamimail iw הצג הודעה +viewing full header felamimail iw מציג כותרת מל××” +viewing message felamimail iw מציג הודעה +viewing messages felamimail iw מציג הודעות +wed felamimail iw רביעי +welcome to %1's webmail system felamimail iw ברוך בו×ך ×ל מערכ ×”-WebMail של %1 +when deleting messages felamimail iw בשעת מחיקת הדעות +white felamimail iw לבן +width of folder list felamimail iw רוחב רשימת התיקיות +wrap incoming text at felamimail iw גלל טקסט נכנס ב- +writing felamimail iw כותב +wrote felamimail iw כתב +you can change the way that squirrelmail looks and displays information to you, such as the colors, the language, and other settings. felamimail iw ×פשר לשנות ×ת הצורה בה SquirrelMail נר××” ומציג מידע, לדוגמת צבעי×, שפות והגדרות נוספות. +you can only edit one address at the time felamimail iw ×שפר לערוך רק כתובת ×חת בכל ×¤×¢× +you must login first. felamimail iw עליך להכנס למערכת קוד×. +you need a valid user and password to access this page! felamimail iw צריך ×©× ×ž×©×ª×ž×© וסיסמה בתוקף כדי לגשת לעמוד ×–×”! +your search failed with the following error(s) felamimail iw חיפשך נכשל ×¢× ×”×©×’×™××”(ות) הב×ות diff --git a/felamimail/lang/egw_ja.lang b/felamimail/lang/egw_ja.lang new file mode 100644 index 0000000000..e98fd3ecd1 --- /dev/null +++ b/felamimail/lang/egw_ja.lang @@ -0,0 +1,71 @@ +add address felamimail ja 追加 +add to %1 felamimail ja %1 追加 +additional info felamimail ja 追加情報 +as a subfolder of felamimail ja 親フォルダ +attach: felamimail ja 添付ファイル +attachments felamimail ja 添付ファイル +bcc: felamimail ja BCC: +body felamimail ja 本文 +cc: felamimail ja CC: +checkbox felamimail ja ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ +checked messages felamimail ja 指定メッセージ +color felamimail ja 色 +create folder felamimail ja ãƒ•ã‚©ãƒ«ãƒ€ä½œæˆ +Created folder successfully! felamimail ja フォルダを作æˆã—ã¾ã—ãŸã€‚ +current folder felamimail ja ç¾åœ¨ã®ãƒ•ã‚©ãƒ«ãƒ€ +current folder: felamimail ja ç¾åœ¨ã®ãƒ•ã‚©ãƒ«ãƒ€ +date: felamimail ja é€ä¿¡æ—¥ä»˜ï¼š +delete folder felamimail ja フォルダ削除 +deleted folder successfully! felamimail ja フォルダを削除ã—ã¾ã—ãŸã€‚ +delete selected felamimail ja 削除 +down felamimail ja 下 +download this as a file felamimail ja ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ダウンロード +e-mail address felamimail ja é›»å­ãƒ¡ãƒ¼ãƒ« +edit selected felamimail ja 訂正 +everywhere felamimail ja ã™ã¹ã¦ +from: felamimail ja 差出人: +identifying name felamimail ja 定義å +index order felamimail ja 表示項目設定 +info felamimail ja 追加情報 +message list felamimail ja メッセージ一覧 +message highlighting felamimail ja メッセージ強調表示 +move felamimail ja 移動 +move & follow felamimail ja 移動ã¨é¸æŠž +move to: felamimail ja é¸æŠžãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ç§»å‹•å…ˆ +must be unique felamimail ja é‡è¤‡ã—ãªã„値を入力 +new felamimail ja æ–°è¦ä½œæˆ +new name: felamimail ja æ–°ã—ã„フォルダå: +nickname felamimail ja ニックãƒãƒ¼ãƒ  +no folders found felamimail ja フォルダãªã— +no folders were found to subscribe to! felamimail ja 表示å¯èƒ½ãªãƒ•ã‚©ãƒ«ãƒ€ãŒã‚ã‚Šã¾ã›ã‚“。 +no folders were found to unsubscribe from! felamimail ja éžè¡¨ç¤ºå¯èƒ½ãªãƒ•ã‚©ãƒ«ãƒ€ãŒã‚ã‚Šã¾ã›ã‚“。 +no highlighting is defined felamimail ja 強調表示ã¯æœªå®šç¾©ã§ã™ã€‚ +no messages found felamimail ja メッセージãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。 +no messages were selected. felamimail ja メッセージをé¸æŠžã—ã¦ãã ã•ã„。 +options felamimail ja オプション +original message felamimail ja Original Message +personal address book felamimail ja 個人アドレス帳 +personal information felamimail ja 個人情報 +refresh folder list felamimail ja フォルダå†è¡¨ç¤º +remove felamimail ja 削除 +rename a folder felamimail ja フォルダåã®å¤‰æ›´ +renamed successfully! felamimail ja フォルダåを変更ã—ã¾ã—ãŸã€‚ +reply to felamimail ja リプライ +select all felamimail ja å…¨ã¦é¸æŠž +signature felamimail ja ç½²å +subscribe felamimail ja 表示 +subscribed successfully! felamimail ja 表示ã«ã—ã¾ã—ãŸã€‚ +this contains personal information about yourself such as your name, your email address, etc. felamimail ja é›»å­ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚„é€ä¿¡è€…åãªã©ã®å€‹äººæƒ…報を設定ã—ã¾ã™ã€‚ +to felamimail ja ï½”ï½ +to: felamimail ja 宛先: +unsubscribe felamimail ja éžè¡¨ç¤º +unsubscribed successfully! felamimail ja éžè¡¨ç¤ºã«ã—ã¾ã—ãŸã€‚ +unselect all felamimail ja å…¨ã¦é¸æŠžè§£é™¤ +up felamimail ja 上 +update address felamimail ja アドレス更新 +use a signature? felamimail ja ç½²åを使用 +view full header felamimail ja ヘッダ表示 +viewing full header felamimail ja ヘッダ表示 +viewing message felamimail ja 表示数 +view messages felamimail ja メッセージ表示 +viewing messages felamimail ja 表示数 diff --git a/felamimail/lang/egw_lt.lang b/felamimail/lang/egw_lt.lang new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/felamimail/lang/egw_lt.lang @@ -0,0 +1 @@ + diff --git a/felamimail/lang/egw_lv.lang b/felamimail/lang/egw_lv.lang new file mode 100644 index 0000000000..b37800b8bc --- /dev/null +++ b/felamimail/lang/egw_lv.lang @@ -0,0 +1,302 @@ +(no subject) felamimail lv (nav temata) +(only cc/bcc) felamimail lv (tikai Cc/Bcc) +(unknown sender) felamimail lv (nezinÄms sÅ«tÄ«tÄjs) +activate felamimail lv AktivizÄ“t +activate script felamimail lv aktivizÄ“t skriptu +add address felamimail lv Pievienot adresi +add rule felamimail lv Pievienot kÄrtulu +add script felamimail lv Pievienot skriptu +add to %1 felamimail lv Pievinot %1 +add to address book felamimail lv Pievienot adreÅ¡u grÄmatai +add to addressbook felamimail lv pievienot adreÅ¡u grÄmatai +additional info felamimail lv Papildus informÄcija +address book felamimail lv AdreÅ¡u grÄmata +address book search felamimail lv AdreÅ¡u grÄmatas meklÄ“tÄjs +after message body felamimail lv PÄ“c vÄ“stules teksta +all address books felamimail lv Visas adreÅ¡u grÄmatas +all folders felamimail lv Visas mapes +always show html emails felamimail lv VienmÄ“r rÄdÄ«t HTML e-pasta vÄ“stules +anyone felamimail lv jebkurÅ¡ +as a subfolder of felamimail lv kÄ apakÅ¡mape +attachments felamimail lv Pielikumi +auto refresh folder list felamimail lv AutomÄtiski atsvaidzinÄt mapes sarakstu +back to folder felamimail lv Atpakaļ uz mapi +bcc felamimail lv BCC +before headers felamimail lv Pirms galvenes +between headers and message body felamimail lv Starp galveni un vÄ“stules tekstu +body part felamimail lv teksta daļa +can't connect to inbox!! felamimail lv nevar pieslÄ“gties iesÅ«tnei!! +cc felamimail lv CC +change folder felamimail lv PÄriet uz mapi +checkbox felamimail lv izvÄ“les rÅ«tiņa +click here to log back in. felamimail lv NoklikÅ¡Ä·ini Å¡eit, lai autorizÄ“tos vÄ“lreiz. +click here to return to %1 felamimail lv NoklikÅ¡Ä·ini Å¡eit, lai atgrieztos uz %1 +close all felamimail lv aizvÄ“rt visu +close this page felamimail lv aizvÄ“rt Å¡o lapu +close window felamimail lv AizvÄ“rt logu +color felamimail lv KrÄsa +compose felamimail lv RakstÄ«t jaunu +compress folder felamimail lv KompresÄ“t mapi +configuration felamimail lv KonfigurÄ“Å¡ana +contains felamimail lv satur +create felamimail lv Izveidot +create folder felamimail lv Izveidot mapi +create sent felamimail lv Izveidot NosÅ«tÄ«tÄs +create subfolder felamimail lv Izveidot apakÅ¡mapi +create trash felamimail lv Izveidot mapi DzÄ“stÄs +created folder successfully! felamimail lv Mape veiksmÄ«gi izveidota! +dark blue felamimail lv TumÅ¡i zils +dark cyan felamimail lv TumÅ¡s ciÄns +dark gray felamimail lv TumÅ¡i pelÄ“ks +dark green felamimail lv TumÅ¡i zaļš +dark magenta felamimail lv TumÅ¡s fuksÄ«ns +dark yellow felamimail lv TumÅ¡i dzeltens +date(newest first) felamimail lv Datums (jaunÄkais pirmais) +date(oldest first) felamimail lv Datums (vecÄkais pirmais) +days felamimail lv dienas +deactivate script felamimail lv deaktivizÄ“t skriptu +default sorting order felamimail lv NoklusÄ“tÄ kÄrtoÅ¡anas secÄ«ba +delete all felamimail lv izdzÄ“st visu +delete folder felamimail lv IzdzÄ“st mapi +delete selected felamimail lv IzdzÄ“st atzÄ«mÄ“to +delete selected messages felamimail lv izdzÄ“st atzÄ«mÄ“tÄs vÄ“stules +deleted felamimail lv izdzÄ“sts +deleted folder successfully! felamimail lv Mape veiksmÄ«gi izdzÄ“ta! +disable felamimail lv Neatļauts +display message in new window felamimail lv ParÄdÄ«t vÄ“stuli jaunÄ logÄ +display of html emails felamimail lv ParÄdÄ«t HTML vÄ“stules +display only when no plain text is available felamimail lv ParÄdÄ«t tikai tad, kad pieejams atklÄts teksts +display preferences felamimail lv ParÄdÄ«t izvÄ“les +do it! felamimail lv dari to! +do not use sent felamimail lv Nelieto nosÅ«tÄ«ts +do not use trash felamimail lv Nelieto atkritumi +do you really want to delete the '%1' folder? felamimail lv Vai tieÅ¡Äm vÄ“lies dzÄ“st mapi "%1"? +does not contain felamimail lv nesatur +does not match felamimail lv neatbilst +don't use sent felamimail lv Nelieto nosÅ«tÄ«ts +don't use trash felamimail lv Nelieto atkritui +down felamimail lv lejÄ +download felamimail lv lejupielÄdÄ“t +download this as a file felamimail lv LejupielÄdÄ“t Å¡o kÄ failu +e-mail felamimail lv E-pasts +e-mail address felamimail lv E-pasta adrese +e-mail folders felamimail lv E-pasta mapes +edit filter felamimail lv Rediģēt filtru +edit rule felamimail lv rediģēt kÄrtulu +edit selected felamimail lv Rediģēt atzÄ«mÄ“to +email address felamimail lv E-pasta adrese +email signature felamimail lv E-pasta paraksts +empty trash felamimail lv atbrÄ«vot atkritumus +enable felamimail lv atļaut +enter your default mail domain ( from: user@domain ) admin lv Ievadi noklusÄ“to pasta domÄ“nu (NO: lietotÄjs@domÄ“ns) +enter your imap mail server hostname or ip address admin lv Ievadi tava IMAP servera hosta vÄrdu vai IP adresi +enter your sieve server hostname or ip address admin lv Ievadi tava SIEVE servera hosta vÄrdu vai IP adresi +enter your sieve server port admin lv Ievadi tava SIEVE servera portu +enter your smtp server hostname or ip address admin lv Ievadi tava SMTP servera hosta vÄrdu vai IP adresi +enter your smtp server port admin lv Ievadi tava SMTP servera portu +error felamimail lv Kļūda! +error connecting to imap serv felamimail lv Kļūda pieslÄ“dzoties IMAP serverim +error opening felamimail lv Kļūda atverot +every felamimail lv katru +every %1 days felamimail lv katras %1 dienas +expunge felamimail lv Izņemt +felamimail common lv ViA e-pasts +file into felamimail lv ievietot +files felamimail lv datnes +filter active felamimail lv aktÄ«vais filtrs +filter name felamimail lv Filtra nosaukums +first name felamimail lv VÄrds +flagged felamimail lv arkarodziņiem +flags felamimail lv Karodziņi +folder name felamimail lv Mapes nosaukums +folder path felamimail lv Mapes ceļš +folder preferences felamimail lv Mapes izvÄ“les +folder settings felamimail lv Mapes uzstÄdÄ«jumi +folder status felamimail lv Mapes statuss +folderlist felamimail lv Mapes saraksts +foldername felamimail lv Mapes nosaukums +folders felamimail lv Mapes +folders created successfully! felamimail lv Mapes tika veiksmÄ«gi izveidotas! +follow felamimail lv sekot +for received mail felamimail lv SaņemtÄm vÄ“stulÄ“m +forward felamimail lv PÄrsÅ«tÄ«t +forward to address felamimail lv pÄrsÅ«tÄ«t uz adresi +found felamimail lv Atrasts +fri felamimail lv Pk +from felamimail lv No +from(a->z) felamimail lv No (A->Z) +from(z->a) felamimail lv No (Z->A) +full name felamimail lv Pilns vÄrds +greater than felamimail lv lielÄks nekÄ +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail lv Lai vairÄk uzzinÄtu par Squirrelmail, paskaties www.felamimail.org
    +header lines felamimail lv Galvenes rindas +hide header felamimail lv noslÄ“pt galveni +html felamimail lv HTML +icons and text felamimail lv Ikonas un teksts +icons only felamimail lv RÄdÄ«t tikai ikonas +identifying name felamimail lv IdentificÄ“ vÄrdu +if felamimail lv Ja +illegal folder name. please select a different name. felamimail lv Neatļauts mapes nosaukums. LÅ«dzu, izvÄ“lies citu! +imap felamimail lv IMAP +imap server felamimail lv IMAP serveris +imap server address felamimail lv IMAP servera adrese +imap server type felamimail lv IMAP servera tips +imaps authentication felamimail lv IMAP servera autentifikÄcija +imaps encryption only felamimail lv IMAP servera Å¡ifrÄ“Å¡ana +in felamimail lv in +index order felamimail lv Indeksu kÄrtÄ«ba +info felamimail lv InformÄcija +invalid user name or password felamimail lv NederÄ«gs lietotÄjvÄrds vai parole +javascript felamimail lv JavaScript +keep a copy of the message in your inbox felamimail lv saglabÄt vÄ“stules kopiju IESŪTNÄ’ +kilobytes felamimail lv kb +language felamimail lv Valoda +last name felamimail lv UzvÄrds +left felamimail lv Pa kreisi +less felamimail lv mazÄk +less than felamimail lv mazÄk nekÄ +light gray felamimail lv GaiÅ¡i pelÄ“ks +list all felamimail lv UzskaitÄ«t visu +location of buttons when composing felamimail lv Pogu novietojums, kad raksta +mail settings felamimail lv Pasta uzstÄdÄ«jumi +mainmessage felamimail lv galvenais ziņojums +manage folders common lv PÄrvaldÄ«t mapes +manage sieve common lv PÄrvaldÄ«t SIEVE skriptus +mark as deleted felamimail lv AtzÄ«mÄ“t kÄ izdzÄ“stu +mark messages as felamimail lv AtzÄ«mÄ“t atlasÄ«tÄs vÄ“stules kÄ +mark selected as read felamimail lv AtzÄ«mÄ“t atlasÄ«tÄs kÄ izlasÄ«tas +mark selected as unread felamimail lv AtzÄ«mÄ“ atlasÄ«tÄs kÄ nelasÄ«tas +message highlighting felamimail lv VÄ“stules izgaismoÅ¡ana +message list felamimail lv VÄ“stuļu saraksts +messages felamimail lv vÄ“stules +mon felamimail lv Pr +move felamimail lv pÄrvietot +move messages felamimail lv pÄrvietot vÄ“stules +move to felamimail lv pÄrvietot atlasÄ«tÄs uz +move to trash felamimail lv PÄrvietot uz atkritumiem +moving messages to felamimail lv vÄ“stules tiek pÄrvietoti uz +name felamimail lv VÄrds +never display html emails felamimail lv Nekas nerÄdÄ«t HTML vÄ“stules +new common lv Jauns +new filter felamimail lv Jauns filtrs +next felamimail lv NÄkoÅ¡ais +next message felamimail lv nÄkamÄ vÄ“stule +no filter felamimail lv Bez filtra +no folders found felamimail lv Netika atrasta neviena mape +no folders were found to subscribe to! felamimail lv Netika atrasta neviena mape, kurai pierakstÄ«ties! +no folders were found to unsubscribe from! felamimail lv Netika atrasta neviena mape, no kuras izrakstÄ«ties! +no highlighting is defined felamimail lv Nav definÄ“ta izgaismoÅ¡ana +no messages found... felamimail lv netika atrasta neviena vÄ“stule... +no messages were selected. felamimail lv Netika atlasÄ«ta neviena vÄ“stule +no previous message felamimail lv nav iepriekÅ¡Ä“jÄs vÄ“stules +no valid emailprofile selected!! felamimail lv Nav atlasÄ«ts derÄ«gs E-pasta profils +none felamimail lv neviens +only inbox felamimail lv Tikai iesÅ«tne +only unseen felamimail lv Tikai neredzÄ“tos +open all felamimail lv atvÄ“rt visus +options felamimail lv IespÄ“jas +organization felamimail lv organizÄcija +organization name admin lv OrganizÄcijas nosaukums +participants felamimail lv DalÄ«bnieki +personal information felamimail lv PersonÄ«gÄ informÄcija +please select a address felamimail lv LÅ«dzu, izvÄ“lieties adresi +posting felamimail lv apziņoÅ¡ana +previous felamimail lv IepriekÅ¡Ä“jÄ +previous message felamimail lv IepriekÅ¡Ä“jÄ vÄ“stule +print it felamimail lv izdrukÄ to +print this page felamimail lv izdrukÄ Å¡o lapu +quicksearch felamimail lv Ä€trÄ meklÄ“Å¡ana +read felamimail lv lasÄ«t +reading felamimail lv lasÄ«Å¡ana +recent felamimail lv nesen +refresh time in minutes felamimail lv AtjaunoÅ¡anas laiks ( minÅ«tÄ“s ) +remove felamimail lv pÄrvietot +remove immediately felamimail lv PÄrvietot nekavÄ“joties +rename felamimail lv PÄrsaukt +rename a folder felamimail lv PÄrsaukt mapi +rename folder felamimail lv PÄrsaukt mapi +renamed successfully! felamimail lv VeiksmÄ«gi pÄrsaukts! +replied felamimail lv atbildÄ“ts +reply felamimail lv AtbildÄ“t +reply all felamimail lv AtbildÄ“t visiem +reply to felamimail lv AtbildÄ“t +replyto felamimail lv AtbildÄ“t +return felamimail lv Atgriezties +return to options page felamimail lv Atgriezties opciju lapÄ +right felamimail lv Pa labi +rule felamimail lv KÄrtula +sat felamimail lv Se +save felamimail lv SaglabÄt +save changes felamimail lv sag;abÄt izmaiņas +search felamimail lv MeklÄ“t +search for felamimail lv MeklÄ“t +select felamimail lv AtzÄ«mÄ“t +select all felamimail lv AtzÄ«mÄ“t visu +select emailprofile felamimail lv AtzÄ«mÄ“ e-pasta profilu +select your mail server type admin lv AtzÄ«mÄ“ tava e-pasta servera tipu +send felamimail lv SÅ«tÄ«t +sent folder felamimail lv Mape nosÅ«tÄ«ts +show header felamimail lv rÄdÄ«t galveni +show new messages on main screen felamimail lv RÄdÄ«t jaunÄs vÄ“stules galvenajÄ logÄ +sieve settings admin lv SIEVE uzstÄdÄ«jumi +signature felamimail lv Paraksts +simply click the target-folder felamimail lv VienkÄrÅ¡i noklikÅ¡Ä·ini uz mÄ“rÄ·a mapes +size felamimail lv IzmÄ“rs +size of editor window felamimail lv Redaktora loga izmÄ“rs +size(...->0) felamimail lv IzmÄ“rs (...->0) +size(0->...) felamimail lv IzmÄ“rs (0->...) +small view felamimail lv mazais skats +smtp settings admin lv SMTP uzstÄdÄ«jumi +subject felamimail lv TÄ“ma +subject(a->z) felamimail lv TÄ“ma (A->Z) +subject(z->a) felamimail lv TÄ“ma (Z->A) +submit felamimail lv Iesniegt +subscribe felamimail lv ParakstÄ«ties +subscribed felamimail lv ParakstÄ«ts +subscribed successfully! felamimail lv VeiksmÄ«gi parakstÄ«ts! +sun felamimail lv Sv +table of contents felamimail lv Satura rÄdÄ«tÄjs +text only felamimail lv Tikai teksts +the connection to the imap server failed!! felamimail lv NeveiksmÄ«ga pieslÄ“gÅ¡anÄs IMAP serverim! +then felamimail lv THEN +this folder is empty felamimail lv Å Ä« mape ir tukÅ¡a +this php has no imap support compiled in!! felamimail lv Å im PHP nav IMAP nokompilÄ“ts atbalsts +thu felamimail lv Ce +to felamimail lv Uz +translation preferences felamimail lv VÄ“lamie tulkoÅ¡anas iestatÄ«jumi +translation server felamimail lv Tulkojuma serveris +trash folder felamimail lv Atkritumu mape +tue felamimail lv Ot +type felamimail lv tips +unknown err felamimail lv NezinÄma kļūda +unknown error felamimail lv NezinÄma kļūda +unknown sender felamimail lv NezinÄms sÅ«tÄ«tÄjs +unknown user or password incorrect. felamimail lv NezinÄms lietotÄjs vai nepareiza parole +unread common lv NelasÄ«ts +unseen felamimail lv NeredzÄ“ts +unselect all felamimail lv Noņemt atzÄ«mi no visÄm +unsubscribe felamimail lv AtrakstÄ«ties +unsubscribed felamimail lv AtrakstÄ«ts +unsubscribed successfully! felamimail lv VeiksmÄ«gi atrakstÄ«ts! +up felamimail lv augÅ¡up +use emailadmin to create profiles felamimail lv lai izveidotu profilus,lieto EmailAdmin +use a signature felamimail lv Lietot parakstu +use a signature? felamimail lv Lietot parakstu? +use addresses felamimail lv Lietot adreses +use custom settings felamimail lv Lietot persnonalizÄ“tus iestatÄ«jumus +use javascript or html addressbook? felamimail lv LIetot Javascript vai HTML adreÅ¡u grÄmatu? +use smtp auth admin lv Lieto SMTP autentifikÄciju +users can define their own emailaccounts admin lv LietotÄji paÅ¡i var kontrolÄ“t savus e-pasta kontus +vacation notice felamimail lv norÄde par atraÅ¡anos atvaļinÄjumÄ +view full header felamimail lv RÄdÄ«t pilnu galveni +view message felamimail lv RÄdÄ«t vÄ“stuli +viewing full header felamimail lv RÄda pilnu galveni +viewing message felamimail lv RÄda vÄ“stuli +viewing messages felamimail lv RÄda vÄ“stules +wed felamimail lv Tr +welcome to %1's webmail system felamimail lv Lapni lÅ«dzam %1 WebMail sistÄ“mÄ +when deleting messages felamimail lv Kad dzÄ“Å¡ vÄ“stules +wrap incoming text at felamimail lv IenÄkoÅ¡o tekstu dalÄ«t rindÄs pie +writing felamimail lv raksta +wrote felamimail lv rakstÄ«ja +you must login first. felamimail lv Jums vispirms jÄautorizÄ“jas! diff --git a/felamimail/lang/egw_nl.lang b/felamimail/lang/egw_nl.lang new file mode 100644 index 0000000000..147e7935be --- /dev/null +++ b/felamimail/lang/egw_nl.lang @@ -0,0 +1,471 @@ +(no subject) felamimail nl (geen onderwerp) +(only cc/bcc) felamimail nl (alleen Cc./Bcc.) +(separate multiple addresses by comma) felamimail nl (meerdere adressen scheiden door komma's) +(unknown sender) felamimail nl (onbekende afzender) +activate felamimail nl Activeren +activate script felamimail nl script inschakelen +activating by date requires a start- and end-date! felamimail nl Activering op datum vereist een begin- EN einddatum! +add acl felamimail nl ACL toevoegen +add address felamimail nl Adres toevoegen +add rule felamimail nl Regel toevoegen +add script felamimail nl Script toevoegen +add to %1 felamimail nl Aan %1 toevoegen +add to address book felamimail nl Aan adresboek toevoegen +add to addressbook felamimail nl Aan adresboek toevoegen +adding file to message. please wait! felamimail nl Een bestand wordt aan het bericht toegevoegd. Even wachten! +additional info felamimail nl Extra informatie +address book felamimail nl Adresboek +address book search felamimail nl Zoeken in adresboek +after message body felamimail nl Na tekstgedeelte +all address books felamimail nl Alle adresboeken +all folders felamimail nl Alle mappen +all of felamimail nl alles van +allow images from external sources in html emails felamimail nl Afbeeldingen vanaf externe bronnen in HTML emails toestaan +allways a new window felamimail nl altijd in een nieuw venster +always show html emails felamimail nl Altijd HTML-emails weergeven +and felamimail nl en +any of felamimail nl iedere van +any status felamimail nl iedere status +anyone felamimail nl iedereen +as a subfolder of felamimail nl als een submap van +attachments felamimail nl bijlagen +authentication required felamimail nl authenticatie vereist +auto refresh folder list felamimail nl Automatisch mappenlijst verversen +back to folder felamimail nl Terug naar map +bad login name or password. felamimail nl Ongeldige login of wachtwoord +bad or malformed request. server responded: %s felamimail nl Ongeldig of slecht geformuleerde aanvraag. Server reageerde: %s +bad request: %s felamimail nl Ongeldig verzoek: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail nl Gebaseerd op opgegeven criteria, kunnen inkomende berichten verschillende achtergrondkleuren krijgen in de berichtenlijst. Dit maakt het makkelijker te zien van wie de berichten afkomstig zijn, vooral in mailinglijsten. +bcc felamimail nl BCC +before headers felamimail nl Voor berichtkoppen +between headers and message body felamimail nl Tussen berichtkoppen en tekstgedeelte +body part felamimail nl tekstgedeelte +by date felamimail nl op datum +can not send message. no recipient defined! felamimail nl kan bericht niet verzenden. Geen ontvanger ingevuld! +can't connect to inbox!! felamimail nl kan geen verbinding maken met INBOX!! +cc felamimail nl CC +change folder felamimail nl Wijzig map +check message against next rule also felamimail nl controleer bericht ook tegen de volgende regel +checkbox felamimail nl Checkbox +clear search felamimail nl zoekveld leegmaken +click here to log back in. felamimail nl Klik hier om opnieuw in te loggen. +click here to return to %1 felamimail nl Klik hier om terug te gaan naar %1 +close all felamimail nl alles sluiten +close this page felamimail nl Sluit dit venster +close window felamimail nl Venster sluiten +color felamimail nl Kleur +compose felamimail nl Schrijf nieuw bericht +compose as new felamimail nl Stel op als nieuw +compress folder felamimail nl Comprimeer map +condition felamimail nl conditie +configuration felamimail nl Configuratie +connection dropped by imap server. felamimail nl Connectie verbroken door IMAP server. +contains felamimail nl bevat +could not complete request. reason given: %s felamimail nl Kon verzoek niet afmaken. Opgegeven reden: %s +could not import message: felamimail nl Kon het bericht niet importeren: +could not open secure connection to the imap server. %s : %s. felamimail nl Kon beveiligde verbinding met de IMAP server niet openen. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail nl CRAM-MD5 of DIGEST-MD5 vereist dat het Auth_SASL package geinstalleerd is. +create felamimail nl Aanmaken +create folder felamimail nl Map aanmaken +create sent felamimail nl Verzondenmap aanmaken +create subfolder felamimail nl Submap aanmaken +create trash felamimail nl Prullenmandmap aanmaken +created folder successfully! felamimail nl Map met succes aangemaakt! +dark blue felamimail nl Donker blauw +dark cyan felamimail nl Donker cyaan +dark gray felamimail nl Donker grijs +dark green felamimail nl Donker groen +dark magenta felamimail nl Donker magenta +dark yellow felamimail nl Donker geel +date(newest first) felamimail nl Datum (nieuwste eerst) +date(oldest first) felamimail nl Datum (oudste eerst) +days felamimail nl dagen +deactivate script felamimail nl script uitschakelen +default felamimail nl standaard +default signature felamimail nl standaard ondertekening +default sorting order felamimail nl Standaard volgorde +delete all felamimail nl Alles verwijderen +delete folder felamimail nl Map verwijderen +delete script felamimail nl script verwijderen +delete selected felamimail nl Het geselecteerde verwijderen +delete selected messages felamimail nl Geselecteerde berichten verwijderen +deleted felamimail nl verwijderde +deleted folder successfully! felamimail nl Map met succes verwijderd! +deleting messages felamimail nl berichten worden verwijderd +disable felamimail nl Deactiveren +discard felamimail nl negeer +discard message felamimail nl bericht negeren +display message in new window felamimail nl Bericht in nieuw venster weergeven +display messages in multiple windows felamimail nl berichten in meerdere vensters weergeven +display of html emails felamimail nl Weergave van HTML-emails +display only when no plain text is available felamimail nl Alleen weergeven als platte tekst niet beschikbaar is. +display preferences felamimail nl Weergavevoorkeuren +displaying html messages is disabled felamimail nl weergeven van html berichten is uitgeschakeld +do it! felamimail nl Nu uitvoeren! +do not use sent felamimail nl 'Verzonden' niet gebruiken +do not use trash felamimail nl 'Prullenmand' niet gebruiken +do not validate certificate felamimail nl valideer het certificaat niet +do you really want to delete the '%1' folder? felamimail nl Weet u zeker dat u de '%1' map wilt verwijderen? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail nl Wilt u de geselecteerde Account instellingen en de bijbehorende identiteit echt verwijderen? +do you really want to delete the selected signatures? felamimail nl Wilt u de geselecteerde ondertekening echt verwijderen? +do you really want to move the selected messages to folder: felamimail nl Wilt u de geselecteerde bericht werkelijk verplaatsen naar folder: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail nl Wilt u een bevestigingsvraag krijgen voordat de geselecteerde berichten naar een andere folder worden verplaatst? +does not contain felamimail nl bevat niet +does not exist on imap server. felamimail nl bestaat niet op IMAP server. +does not match felamimail nl komt niet overeen met +does not match regexp felamimail nl komt niet overeen met regexp +don't use draft folder felamimail nl Concepten folder niet gebruiken +don't use sent felamimail nl 'Verzonden' niet gebruiken +don't use template folder felamimail nl Sjablonenfolder niet gebruiken +don't use trash felamimail nl 'Prullenmand' niet gebruiken +dont strip any tags felamimail nl geen enkele tag verwijderen +down felamimail nl omlaag +download felamimail nl Downloaden +download this as a file felamimail nl Dit als een bestand downloaden +draft folder felamimail nl conceptenfolder +drafts felamimail nl Concepten +e-mail felamimail nl Email +e-mail address felamimail nl Emailadres +e-mail folders felamimail nl Emailmappen +edit email forwarding address felamimail nl wijzig email doorstuur adres +edit filter felamimail nl Filter wijzigen +edit rule felamimail nl regel bewerken +edit selected felamimail nl Het geselecteerde wijzigen +edit vacation settings felamimail nl afwezigheidsinstellingen bewerken +editor type felamimail nl Tekstbewerker type +email address felamimail nl Emailadres +email forwarding address felamimail nl email doorstuur adres +email notification update failed felamimail nl email melding kon niet worden bijgewerkt +email signature felamimail nl Emailondertekening +emailaddress felamimail nl emailadres +empty trash felamimail nl Prullenmand legen +enable felamimail nl inschakelen +encrypted connection felamimail nl versleutelde verbinding +enter your default mail domain ( from: user@domain ) admin nl Vul uw standaard mail domein in ( Van: gebruiker@domein ) +enter your imap mail server hostname or ip address admin nl Voer de naam of het IP-adres in van uw IMAP-mailserver +enter your sieve server hostname or ip address admin nl Voer de naam of het IP-adres in van uw SIEVE-server +enter your sieve server port admin nl Voer de poort in van uw SIEVE-server +enter your smtp server hostname or ip address admin nl Vul uw SMTP server hostnaam of IP adres in +enter your smtp server port admin nl Vul uw SMTP server poort in +error felamimail nl FOUT +error connecting to imap serv felamimail nl Fout met het verbinden met de IMAP-server +error connecting to imap server. %s : %s. felamimail nl Fout bij verbinden met de IMAP server. %s : %s +error connecting to imap server: [%s] %s. felamimail nl Fout bij verbinden met de IMAP server: [%s] %s +error opening felamimail nl Fout bij het openen +error: felamimail nl Fout: +error: could not save message as draft felamimail nl Fout: Bericht kon niet worden opgeslagen als Concept +every felamimail nl iedere +every %1 days felamimail nl iedere %1 dagen +expunge felamimail nl Definitief verwijderen +extended felamimail nl uitgebreid +felamimail common nl FelaMiMail +file into felamimail nl bestand naar +files felamimail nl bestanden +filter active felamimail nl Filter actief +filter name felamimail nl Naam filter +filter rules common nl filter regels +first name felamimail nl Voornaam +flagged felamimail nl gemarkeerd +flags felamimail nl Markeringen +folder felamimail nl folder +folder acl felamimail nl folder acl +folder name felamimail nl Mapnaam +folder path felamimail nl Mappad +folder preferences felamimail nl Map voorkeuren +folder settings felamimail nl Map instellingen +folder status felamimail nl Map status +folderlist felamimail nl Mappenlijst +foldername felamimail nl Mapnaam +folders felamimail nl Mappen +folders created successfully! felamimail nl Mappen met succes aangemaakt! +follow felamimail nl volgen +for mail to be send - not functional yet felamimail nl Voor nog te vezenden email - nog niet functioneel +for received mail felamimail nl Voor ontvangen email +forward felamimail nl Doorsturen +forward as attachment felamimail nl doorsturen als bijlage +forward inline felamimail nl doorsturen in het bericht +forward messages to felamimail nl Berichten doorsturen naar +forward to felamimail nl doorsturen naar +forward to address felamimail nl doorsturen naar adres +forwarding felamimail nl Wordt doorgezonden +found felamimail nl Gevonden +fri felamimail nl Vri +from felamimail nl Van +from(a->z) felamimail nl Van (A->Z) +from(z->a) felamimail nl Van (Z->A) +full name felamimail nl Volledige naam +greater than felamimail nl groter dan +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail nl Surf naar www.felamimail.org voor meer informatie over Squirrelmail.
    +header lines felamimail nl Kopregels +hide header felamimail nl Verberg berichtkop +hostname / address felamimail nl host naam / adres +how to forward messages felamimail nl hoe berichten doorgestuurd moeten worden +html felamimail nl HTML +icons and text felamimail nl Icoontjes en tekst +icons only felamimail nl Alleen icoontjes +identifying name felamimail nl Naam voor identificatie +identity felamimail nl identiteit +if felamimail nl ALS +if from contains felamimail nl als van bevat +if mail header felamimail nl als berichtkop bevat +if message size felamimail nl als berichtgrootte +if shown, which folders should appear on main screen felamimail nl indien getoond, welke folders moeten zichtbaar worden op het hoofdscherm +if subject contains felamimail nl als onderwerp bevat +if to contains felamimail nl als aan bevat +if using ssl or tls, you must have the php openssl extension loaded. felamimail nl Indien SSL of TLS gebruikt wordt, moet de PHP extensie openssl geladen zijn. +illegal folder name. please select a different name. felamimail nl Mapnaam niet toegestaan. Select a.b.u. een andere naam. +imap felamimail nl IMAP +imap server felamimail nl IMAP server +imap server address felamimail nl IMAP serveradres +imap server closed the connection. felamimail nl IMAP server sloot de verbinding +imap server closed the connection. server responded: %s felamimail nl IMAP server sloot de verbinding af. Server antwoordde: %s +imap server password felamimail nl imap server wachtwoord +imap server type felamimail nl IMAP servertype +imap server username felamimail nl imap server gebruikersnaam +imaps authentication felamimail nl IMAPS authenticatie +imaps encryption only felamimail nl Uitsluitend IMAPS encryptie +import felamimail nl importeren +import mail felamimail nl Berichten importeren +in felamimail nl in +inbox felamimail nl POSTVAK IN +incoming mail server(imap) felamimail nl inkomene mail server (IMAP) +index order felamimail nl Index volgorde +info felamimail nl Informatie +invalid user name or password felamimail nl Ongeldige gebruikersnaam of -wachtwoord +javascript felamimail nl JavaScript +jumping to end felamimail nl springt naar eind +jumping to start felamimail nl springt naar begin +junk felamimail nl Junk +keep a copy of the message in your inbox felamimail nl bewaar een kopie van het bericht in uw postvak in +keep local copy of email felamimail nl bewaar een lokale kopie van het bericht +kilobytes felamimail nl kilobytes +language felamimail nl Taal +last name felamimail nl Achternaam +left felamimail nl Links +less felamimail nl minder +less than felamimail nl minder dan +light gray felamimail nl Licht grijs +list all felamimail nl Alles weergeven +loading felamimail nl wordt geladen +location of buttons when composing felamimail nl Locatie van knoppen bij het schrijven van een nieuw bericht +mail server login type admin nl Mail server login type +mail settings felamimail nl Emailinstellingen +mainmessage felamimail nl hoofdbericht +manage email accounts and identities common nl Beheer email accounts en identiteiten +manage emailaccounts common nl Beheer email accounts +manage emailfilter / vacation preferences nl Beheer emailfilter / afwezigheid +manage folders common nl Beheer mappen +manage sieve common nl Beheer Sieve scripts +manage signatures felamimail nl Beheer ondertekeningen +mark as deleted felamimail nl Markeer als verwijderd +mark messages as felamimail nl Markeer geselecteerde berichten als +mark selected as flagged felamimail nl Markeer geselecteerde als 'gemarkeerd' +mark selected as read felamimail nl Markeer geselecteerde als 'gelezen' +mark selected as unflagged felamimail nl Markeer geselecteerde als 'niet gemarkeerd' +mark selected as unread felamimail nl Markeer geselecteerde als 'niet gezelezen +match felamimail nl Overeenkomstige +matches felamimail nl komt overeen met +matches regexp felamimail nl komt overeen met regexp +max uploadsize felamimail nl maximum upload grootte +message highlighting felamimail nl Bericht inkleuring +message list felamimail nl Berichtenlijst +messages felamimail nl berichten +mon felamimail nl Maa +move felamimail nl verplaatsen +move messages felamimail nl berichten verplaatsen +move to felamimail nl geselecteerde verplaatsen naar +move to trash felamimail nl Verplaatsen naar prullenmand +moving messages to felamimail nl berichten verplaatsen naar +name felamimail nl Naam +never display html emails felamimail nl Nooit HTML-emails weergeven +new common nl Nieuw +new filter felamimail nl Nieuwe filter +next felamimail nl Volgende +next message felamimail nl volgende bericht +no active imap server found!! felamimail nl Geen actieve IMAP server gevonden!! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail nl Geen adres in AAN/CC/BCC opgegeven en geen map aangegeven waar bericht opgeslagen moet worden. +no encryption felamimail nl geen versleuteling +no filter felamimail nl Geen filter +no folders found felamimail nl Geen mappen gevonden +no folders were found to subscribe to! felamimail nl Geen mappen gevonden om lid van te worden! +no folders were found to unsubscribe from! felamimail nl Geen mappen gevonden om lidmaatschap van op te zeggen! +no highlighting is defined felamimail nl Geen inkleuring ingesteld +no message returned. felamimail nl Geen bericht teruggekomen. +no messages found... felamimail nl geen berichten gevonden... +no messages selected, or lost selection. changing to folder felamimail nl Geen berichten geselecteerd of selectie is verloren gegaan. Schakelt naar folder +no messages were selected. felamimail nl Geen berichten geselecteerd. +no plain text part found felamimail nl geen platte tekst onderdeel gevonden +no previous message felamimail nl geen vorig bericht +no recipient address given! felamimail nl Geen ontvanger adres opgegeven! +no signature felamimail nl geen ondertekening +no subject given! felamimail nl Geen onderwerp opgegeven! +no supported imap authentication method could be found. felamimail nl Geen ondersteunde IMAP authenticatie methode werd gevonden. +no valid emailprofile selected!! felamimail nl Geen geldig Emailprofiel geselecteerd! +none felamimail nl geen +on felamimail nl op +on behalf of felamimail nl namens +one address is not valid felamimail nl Een adres is ongeldig +only inbox felamimail nl Alleen INBOX +only one window felamimail nl uitsluitend één venster +only unseen felamimail nl Alleen ongelezen +open all felamimail nl open alle +options felamimail nl Opties +or felamimail nl of +organisation felamimail nl organisatie +organization felamimail nl Organisatie +organization name admin nl Organisatienaam +original message felamimail nl originele bericht +outgoing mail server(smtp) felamimail nl uitgaande mail server (SMTP) +participants felamimail nl Deelnemers +personal information felamimail nl Persoonlijke informatie +please select a address felamimail nl Kies s.v.p. een adres +please select the number of days to wait between responses felamimail nl Kies s.v.p. het aantal dagen dat gewacht moet worden tussen de antwoorden +please supply the message to send with auto-responses felamimail nl Vul s.v.p. het bericht in dat met de automatisch antwoorden meegezonden moet worden +port felamimail nl poort +posting felamimail nl plaatsen +previous felamimail nl Vorig +previous message felamimail nl Vorig bericht +print it felamimail nl Uitprinten +print this page felamimail nl Deze pagina uitprinten +printview felamimail nl afdrukweergave +quicksearch felamimail nl Snelzoeken +read felamimail nl lezen +reading felamimail nl lezen +receive notification felamimail nl Ontvangst bevestiging +recent felamimail nl Recente +refresh time in minutes felamimail nl Ververstijd in minuten +reject with felamimail nl weiger met +remove felamimail nl Verwijderen +remove immediately felamimail nl Meteen verwijderen +rename felamimail nl Hernoemen +rename a folder felamimail nl Een map hernoemen +rename folder felamimail nl Map hernoemen +renamed successfully! felamimail nl Met succes hernoemd! +replied felamimail nl gereageerd +reply felamimail nl Reageer +reply all felamimail nl Reageer aan adressen in bericht +reply to felamimail nl Reageer aan +replyto felamimail nl Reageer aan +respond felamimail nl Antwoorden +respond to mail sent to felamimail nl antwoorden op mail gezonden aan +return felamimail nl Terug +return to options page felamimail nl Terug naar pagina met opties +right felamimail nl Rechts +row order style felamimail nl rijvolgorde stijl +rule felamimail nl Regel +sat felamimail nl Zat +save felamimail nl Opslaan +save as draft felamimail nl opslaan als concept +save as infolog felamimail nl opslaan als infolog +save changes felamimail nl wijzigingen bewaren +save message to disk felamimail nl bericht opslaan op schijf +script name felamimail nl script naam +script status felamimail nl script status +search felamimail nl Zoeken +search for felamimail nl Zoeken naar +select felamimail nl Selecteren +select all felamimail nl Alles selecteren +select emailprofile felamimail nl Emailprofiel selecteren +select folder felamimail nl map selecteren +select your mail server type admin nl Selecteer uw mail server type +send felamimail nl Verzenden +send a reject message felamimail nl verstuur een weigeringsbericht +sent felamimail nl Verzonden +sent folder felamimail nl Verzondenmap +server supports mailfilter(sieve) felamimail nl server ondersteunt mailfilter (sieve) +set as default felamimail nl Instellen als standaard +show header felamimail nl berichtkop weergeven +show new messages on main screen felamimail nl Nieuwe berichten op hoofdscherm weergeven +sieve script name felamimail nl sieve script naam +sieve settings admin nl SIEVE instellingen +signatur felamimail nl Ondertekening +signature felamimail nl Ondertekening +simply click the target-folder felamimail nl Klik gewoon op de doelmap +size felamimail nl Grootte +size of editor window felamimail nl Grootte van schrijfvenster +size(...->0) felamimail nl Grootte (...->0) +size(0->...) felamimail nl Grootte 0->...) +skipping forward felamimail nl springt voorwaarts +skipping previous felamimail nl springt achterwaarts +small view felamimail nl kleine weergave +smtp settings admin nl SMTP-instellingen +start new messages with mime type plain/text or html? felamimail nl begin nieuwe berichten met mime type, plain/text of html? +subject felamimail nl Onderwerp +subject(a->z) felamimail nl Onderwerp (A->Z) +subject(z->a) felamimail nl Onderwerp (Z->A) +submit felamimail nl Verzend +subscribe felamimail nl Lid worden +subscribed felamimail nl Lid van +subscribed successfully! felamimail nl Met succes lid geworden! +sun felamimail nl Zon +system signature felamimail nl systeem ondertekening +table of contents felamimail nl Inhoudsopgave +template folder felamimail nl Sjabloon folder +templates felamimail nl Sjablonen +text only felamimail nl Alleen tekst +text/plain felamimail nl text/plain +the connection to the imap server failed!! felamimail nl De vebinding met de IMAP-server is mislukt!! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail nl De IMAP server blijkt de authenticatie methode niet te ondersteunen. Neem contact op met uw systeem beheerder. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail nl De afzender heeft verzocht om een leesbevestiging. Wilt u een leesbevestiging verzenden? +the mimeparser can not parse this message. felamimail nl De mimeparsers kan dit bericht niet lezen. +then felamimail nl DAN +this folder is empty felamimail nl DEZE MAP IS LEEG +this php has no imap support compiled in!! felamimail nl In deze PHP versie is geen IMAP ondersteuning meegecompileerd!! +thu felamimail nl Don +to felamimail nl Aan +to mail sent to felamimail nl naar mail gezonden aan +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail nl Om een TLS verbinding te gebruiken moet u PHP versie 5.1.0 of hoger gebruiken. +translation preferences felamimail nl Voorkeuren vertaling +translation server felamimail nl Server vertaling +trash felamimail nl Prullenbak +trash fold felamimail nl Prullenbak +trash folder felamimail nl Prullenbak +tue felamimail nl Din +type felamimail nl type +unexpected response from server to authenticate command. felamimail nl Onverwacht antwoord van de server op het AUTHENTICATIE verzoek. +unexpected response from server to digest-md5 response. felamimail nl Onverwacht antwoord van de server op het Digest-MD5 verzoek. +unexpected response from server to login command. felamimail nl Onverwachte reactie van de server op LOGIN opdracht. +unflagged felamimail nl niet gemarkeerd +unknown err felamimail nl Onbekende fout +unknown error felamimail nl Onbekende fout +unknown imap response from the server. server responded: %s felamimail nl Onbekend IMAP antwoord van de server. De server antwoordde: %s +unknown sender felamimail nl Onbekende afzender +unknown user or password incorrect. felamimail nl Onbekende gebruiker of ongeldig wachtwoord. +unread common nl ongelezen +unseen felamimail nl Ongezien +unselect all felamimail nl Deselecteer alles +unsubscribe felamimail nl Afmelden +unsubscribed felamimail nl Afgemeld +unsubscribed successfully! felamimail nl Met succes afgmeld +up felamimail nl boven +updating message status felamimail nl bericht status wordt bijgewerkt +updating view felamimail nl weergave wordt bijgewerkt +use emailadmin to create profiles felamimail nl gebruik EmailAdmin om profielen aan te maken +use a signature felamimail nl Gebruik een ondertekening +use a signature? felamimail nl Een ondertekening gebruiken? +use addresses felamimail nl Gebruik adressen +use custom identities felamimail nl gebruik aangepaste identiteiten +use custom settings felamimail nl Gebruik aangepaste instellingen +use regular expressions felamimail nl gebruik reguliere expressies +use smtp auth admin nl Gebruik SMTP-authenticatie +users can define their own emailaccounts admin nl Gebruikers kunnen hun eigen email accounts maken +vacation notice common nl afwezigheidsbericht +vacation notice is active felamimail nl Afwezigheidbericht is ingeschakeld +vacation start-date must be before the end-date! felamimail nl Afwezigheidbericht startdatum moet VOOR de einddatum liggen! +validate certificate felamimail nl certificaat valideren +view full header felamimail nl Volledige berichtkop weergeven +view header lines felamimail nl kopregels weergeven +view message felamimail nl Bericht weergeven +viewing full header felamimail nl volledige berichtkop weergeven +viewing message felamimail nl bericht weergeven +viewing messages felamimail nl berichten weergeven +wed felamimail nl Woe +when deleting messages felamimail nl Bij het verwijderen van berichten +with message felamimail nl met bericht +with message "%1" felamimail nl met bericht "%1" +wrap incoming text at felamimail nl Kort tekst binnenkomende berichten af op +writing felamimail nl schrijft +wrote felamimail nl schreef +you can use %1 for the above start-date and %2 for the end-date. felamimail nl U kunt %1 gebruiken voor de bovenstaande startdatum en %2 voor de einddatum. +you have received a new message on the felamimail nl U heeft een nieuw bericht ontvangen op de +your message to %1 was displayed. felamimail nl Uw bericht aan %1 is bij de ontvanger weergegeven. diff --git a/felamimail/lang/egw_no.lang b/felamimail/lang/egw_no.lang new file mode 100644 index 0000000000..1a9e421bbb --- /dev/null +++ b/felamimail/lang/egw_no.lang @@ -0,0 +1,344 @@ +(no subject) felamimail no (uten emne) +(only cc/bcc) felamimail no (kun Kopi/Blindkopi) +(unknown sender) felamimail no (ukjent avsender) +activate felamimail no Aktiviser +activate script felamimail no Aktiviser skript +add address felamimail no Legg til adresse +add rule felamimail no Legg til regel +add script felamimail no Legg til skript +add to %1 felamimail no Legg til %1 +add to address book felamimail no Legg til i adressebok +add to addressbook felamimail no legg til i adressebok +additional info felamimail no Tilleggsinformasjon +address book felamimail no Adressebok +address book search felamimail no Søk i adressebok +after message body felamimail no Etter meldingstekst +all address books felamimail no Alle adressebøker +all folders felamimail no Alle mapper +all of felamimail no alle av +allways a new window felamimail no altid et nytt vindu +always show html emails felamimail no Vis alltid HTML meldinger +any of felamimail no noen av +anyone felamimail no hvem som helst +as a subfolder of felamimail no som en undermappe av +attachments felamimail no Vedlegg +auto refresh folder list felamimail no Oppdater mappeliste automatisk +back to folder felamimail no TIlbake til mappe +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail no Basert på gitte kriterier, kan innkommende meldinger ha forskjellig bakgrunnsfarge i meldingslisten. Dette gir deg oversikt over hvem meldingene er fra, spesielt for e-post lister. +bcc felamimail no Blindkopi +before headers felamimail no Før overskrift +between headers and message body felamimail no Mellom overskift og meldingstekst +body part felamimail no meldingstekst +can't connect to inbox!! felamimail no kan ikke koble til Innboks!! +cc felamimail no Kopi +change folder felamimail no Bytt mappe +check message against next rule also felamimail no Kontroller melding mot neste regel også +checkbox felamimail no Sjekkboks +click here to log back in. felamimail no Klikk her for å logge på igjen +click here to return to %1 felamimail no Klikk her for å returnere til %1 +close all felamimail no lukk alle +close this page felamimail no lukk denne siden +close window felamimail no Lukk vindu +color felamimail no Farge +compose felamimail no Ny melding +compress folder felamimail no Komprimer mappe +configuration felamimail no Konfigurasjon +contains felamimail no inneholder +create felamimail no Opprett +create folder felamimail no Opprett Mappe +create sent felamimail no Opprett Sendt +create subfolder felamimail no Opprett Undermappe +create trash felamimail no Opprett Søppelkurv +created folder successfully! felamimail no Opprettet mappe +dark blue felamimail no Mørk Blå +dark cyan felamimail no Mørk Cyan +dark gray felamimail no Mørk Grå +dark green felamimail no Mørk Grønn +dark magenta felamimail no Mørk Magenta +dark yellow felamimail no Mørk Gul +date(newest first) felamimail no Dato (nyeste først) +date(oldest first) felamimail no Dato (eldste først) +days felamimail no dager +deactivate script felamimail no deaktiver skript +default sorting order felamimail no Standard sortering +delete all felamimail no slett alle +delete folder felamimail no Slett Mappe +delete script felamimail no Slett skript +delete selected felamimail no Slett valgt +delete selected messages felamimail no slett valgte meldinger +deleted felamimail no slettet +deleted folder successfully! felamimail no Slettet mappe +disable felamimail no Deaktiver +discard message felamimail no Forkast melding +display message in new window felamimail no Vis melding i nytt vindu +display of html emails felamimail no Visning av HTML e-post +display only when no plain text is available felamimail no Vis bare når ingen normal tekst er tilgjengelig +display preferences felamimail no Vis Preferanser +do it! felamimail no gjør det! +do not use sent felamimail no Bruk ikke Sendt +do not use trash felamimail no Bruk ikke Søppelkurv +do you really want to delete the '%1' folder? felamimail no Vil du virkelig slette mappen %1? +does not contain felamimail no inneholder ikke +does not match felamimail no stemmer ikke +does not match regexp felamimail no stemmer ikke med regexp +don't use sent felamimail no Ikke bruk Sendt +don't use trash felamimail no Ikke bruk Søppelkurv +down felamimail no ned +download felamimail no last ned +download this as a file felamimail no Last ned dette som en fil +e-mail felamimail no E-mail +e-mail address felamimail no E-mailadresse +e-mail folders felamimail no E-mailmapper +edit filter felamimail no Rediger filter +edit rule felamimail no Rediger regel +edit selected felamimail no Rediger valgt +edit vacation settings felamimail no Redigere ferieinnstillinger +email address felamimail no E-post Adresse +email signature felamimail no E-post signatur +empty trash felamimail no tøm søppelkurv +enable felamimail no muliggjør +enter your default mail domain ( from: user@domain ) admin no Skriv inn ditt standard e-post domene (Fra: bruker@domene) +enter your imap mail server hostname or ip address admin no Skriv inn IMAP tjenernavn eller IP-adresse +enter your sieve server hostname or ip address admin no Skriv inn SIEVE tjenernavn eller IP adresse +enter your sieve server port admin no Skriv inn SIEVE tjenerport +enter your smtp server hostname or ip address admin no Skriv inn SMTP tjenernavn eller IP adresse +enter your smtp server port admin no Skriv inn SMTP tjenerport +error felamimail no FEIL +error connecting to imap serv felamimail no Feil ved tilkobling til IMAP tjener +error opening felamimail no Kunne ikke åpne +every felamimail no hver +every %1 days felamimail no hver %1 dag +expunge felamimail no Slett for godt +felamimail common no E-post +file into felamimail no fil til +files felamimail no filer +filter active felamimail no aktivt filter +filter name felamimail no Filternavn +filter rules felamimail no Regler for filter +first name felamimail no Fornavn +flagged felamimail no flagget +flags felamimail no Flagg +folder acl felamimail no mappe acl +folder name felamimail no Mappemavn +folder path felamimail no Mappesti +folder preferences felamimail no Mappepreferanser +folder settings felamimail no Mappeinnstillinger +folder status felamimail no Mappestatus +folderlist felamimail no Mappeliste +foldername felamimail no Mappenavn +folders felamimail no Mapper +folders created successfully! felamimail no Mappe opprettet! +follow felamimail no følg +for mail to be send - not functional yet felamimail no For mail som skal sendes - ikke funksjonell ennå +for received mail felamimail no For mottatt e-post +forward felamimail no Videresend +forward to address felamimail no Videresend til adresse +found felamimail no Funnet +fri felamimail no Fre +from felamimail no Fra +from(a->z) felamimail no Fra (A -> Å) +from(z->a) felamimail no Fra (Å -> A) +full name felamimail no Fullt Navn +greater than felamimail no Større enn +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail no Ta en kikk på www.felamimail.org for å lære mer om Squirrelmail.
    +header lines felamimail no Hodelinjer +hide header felamimail no gjem hode +html felamimail no HTML +icons and text felamimail no Ikoner og tekst +icons only felamimail no Kun ikoner +identifying name felamimail no Identifiserbart navn +if felamimail no Dersom +if from contains felamimail no dersom fra inneholder +if mail header felamimail no dersom meldingshodet +if message size felamimail no dersom meldingsstørrelse +if subject contains felamimail no dersom emnet inneholder +if to contains felamimail no dersom til inneholder +illegal folder name. please select a different name. felamimail no Ulovlig mappenavn. Vennligst velg et annet navn. +imap felamimail no IMAP +imap server felamimail no IMAP Tjener +imap server address felamimail no IMAP Tjener Adresse +imap server type felamimail no IMAP Tjener type +imaps authentication felamimail no IMAPS Autentisering +imaps encryption only felamimail no Kun IMAPS Kryptering +in felamimail no i +index order felamimail no Inndeks Sortering +info felamimail no Informasjon +invalid user name or password felamimail no Galt brukernavn eller passord +javascript felamimail no JavaScript +keep a copy of the message in your inbox felamimail no behold en kopi av meldingen i din innboks +kilobytes felamimail no kilobytes +language felamimail no SprÃ¥k +last name felamimail no Etternavn +left felamimail no Venstre +less felamimail no mindre +less than felamimail no mindre enn +light gray felamimail no Lys GrÃ¥ +list all felamimail no List ut alle +location of buttons when composing felamimail no Knappers lokasjon ved opprettelse +mail server login type admin no E-post tjener innloggingstype +mail settings felamimail no E-post innstillinger +mainmessage felamimail no hovedmelding +manage emailfilter / vacation preferences no Betjen e-mailfilter / ferie +manage folders common no Behandle Mapper +manage sieve common no Behandle Sieve skript +mark as deleted felamimail no Merk som slettet +mark messages as felamimail no Merk valgt melding som +mark selected as flagged felamimail no Merk valgt som flagget +mark selected as read felamimail no Merk valgt som lest +mark selected as unflagged felamimail no Merk valgt som uflagget +mark selected as unread felamimail no Merk valgt som ulest +match felamimail no Treff +matches felamimail no treff +matches regexp felamimail no treffer regexp +message highlighting felamimail no Meldingsmerking +message list felamimail no Meldingsliste +messages felamimail no meldinger +mon felamimail no Man +move felamimail no flytt +move messages felamimail no flytt meldinger +move to felamimail no flytt valgt til +move to trash felamimail no Flytt til søppelkurv +moving messages to felamimail no Flytter meldinger til +name felamimail no Navn +never display html emails felamimail no Vis aldri HTML e-post +new common no Ny +new filter felamimail no Nytt filter +next felamimail no Neste +next message felamimail no neste melding +no filter felamimail no Ingen filter +no folders found felamimail no Fant ingen mapper +no folders were found to subscribe to! felamimail no Fant ingen mapper Ã¥ melde pÃ¥ +no folders were found to unsubscribe from! felamimail no Fant ingen mapper Ã¥ avmelde fra +no highlighting is defined felamimail no Ingen merking er definert +no messages found... felamimail no Ingen meldinger funnet +no messages were selected. felamimail no Ingen meldinger er valgt +no previous message felamimail no ingen foregÃ¥ende Melding +no valid emailprofile selected!! felamimail no Ingen Gyldig E-post profil er valgt +none felamimail no ingen +on behalf of felamimail no pÃ¥ vegne av +one address is not valid felamimail no En av adressene er ikke gyldig +only inbox felamimail no Kun INNBOKS +only one window felamimail no Bare et vindu +only unseen felamimail no Bare usett +open all felamimail no Ã¥pne alle +options felamimail no Alternativer +organisation felamimail no organisering +organization felamimail no organisasjon +organization name admin no Organisasjonsnavn +participants felamimail no Deltagere +personal information felamimail no Personlig informasjon +please select a address felamimail no Vennligst velg en adresse +please select the number of days to wait between responses felamimail no Vennligst velg antall dager for vent melding tilbakemeldinger +please supply the message to send with auto-responses felamimail no Vennligst registrer meldingen som skal sendes som automatisk tilbakemelding +posting felamimail no posting +previous felamimail no Forrige +previous message felamimail no forrige melding +print it felamimail no skriv ut +print this page felamimail no skriv ut denne siden +quicksearch felamimail no Hurtigsøk +read felamimail no les +reading felamimail no lesing +recent felamimail no siste +refresh time in minutes felamimail no Oppdateringstid i minutter +remove felamimail no fjern +remove immediately felamimail no Fjern umiddelbart +rename felamimail no Gi nytt navn +rename a folder felamimail no Gi en Mappe nytt navn +rename folder felamimail no Gi mappen nytt navn +renamed successfully! felamimail no Vellykket nytt navn +replied felamimail no svart +reply felamimail no Svar +reply all felamimail no Svar alle +reply to felamimail no Svar til +replyto felamimail no SvarTil +respond felamimail no Responder +respond to mail sent to felamimail no Responder pÃ¥ mail sent til +return felamimail no Tilbake +return to options page felamimail no Tilbake til alternativer +right felamimail no Høyre +rule felamimail no Regel +sat felamimail no Lør +save felamimail no Lagre +save changes felamimail no Lagre endringer +script name felamimail no Navn pÃ¥ skript +script status felamimail no Status for skript +search felamimail no Søk +search for felamimail no Søk etter +select felamimail no Velg +select all felamimail no Velg alle +select emailprofile felamimail no Velg E-post Profil +select folder felamimail no Velg mappe +select your mail server type admin no Velg din e-post tjener type +send felamimail no Send +send a reject message felamimail no send en avvisningsmelding +sent folder felamimail no Sendt Mappe +show header felamimail no vis meldingshode +show new messages on main screen felamimail no Vis nye meldinger pÃ¥ hovedside +sieve settings admin no Sieve innstillinger +signature felamimail no Signatur +simply click the target-folder felamimail no Klikk pÃ¥ mÃ¥lmappe +size felamimail no Størrelse +size of editor window felamimail no Størrelse pÃ¥ editeringsvindu +size(...->0) felamimail no Størrelse (...->0) +size(0->...) felamimail no Størrelse (0->...) +small view felamimail no liten visning +smtp settings admin no SMTP innstillinger +subject felamimail no Emne +subject(a->z) felamimail no Emne (A->Ã…) +subject(z->a) felamimail no Emne (Ã…->A) +submit felamimail no Send +subscribe felamimail no Meld pÃ¥ +subscribed felamimail no Meldt pÃ¥ +subscribed successfully! felamimail no PÃ¥melding vellykket +sun felamimail no Søn +table of contents felamimail no Innhold +text only felamimail no Kun tekst +the connection to the imap server failed!! felamimail no Koblingen til IMAP tjeneren feilet!! +then felamimail no DA +this folder is empty felamimail no DENNE MAPPEN ER TOM +this php has no imap support compiled in!! felamimail no PHP versjonen har ingen IMAP-støtte kompilert inn +thu felamimail no Tor +to felamimail no Til +to mail sent to felamimail no Til mail sent til +translation preferences felamimail no Oversettelses innstillinger +translation server felamimail no Oversettelses tjener +trash fold felamimail no Søppelmappe +trash folder felamimail no Søppelmappe +tue felamimail no Tir +type felamimail no type +unflagged felamimail no avflagget +unknown err felamimail no Ukjent feil +unknown error felamimail no Ukjent feil +unknown sender felamimail no Ukjent Avsender +unknown user or password incorrect. felamimail no Ukjent bruker eller galt passord +unread common no Ulest +unseen felamimail no Usett +unselect all felamimail no Velg bort Alle +unsubscribe felamimail no Avmeld +unsubscribed felamimail no Avmeldt +unsubscribed successfully! felamimail no Vellykket avmelding +up felamimail no opp +use emailadmin to create profiles felamimail no bruk EmailAdmin for Ã¥ opprette profiler +use a signature felamimail no Bruk en signatur +use a signature? felamimail no Bruk en signatur? +use addresses felamimail no Bruk adresser +use custom settings felamimail no Bruk Normale Innstillinger +use javascript or html addressbook? felamimail no Bruk Javascript eller HTML adressebok? +use regular expressions felamimail no bruk regulære uttrykk +use smtp auth admin no Bruk SMTP autentisering +users can define their own emailaccounts admin no Brukere kan definere egne e-post kontoer +vacation notice felamimail no Ferie melding +view full header felamimail no Vis hele meldingshodet +view message felamimail no Vis melding +viewing full header felamimail no Viser hele meldingshodet +viewing message felamimail no Viser melding +viewing messages felamimail no Viser meldinger +wed felamimail no Ons +welcome to %1's webmail system felamimail no Velkommen til %1 WebMail system +when deleting messages felamimail no NÃ¥r du sletter meldinger +with message felamimail no Med melding +with message "%1" felamimail no Med melding "%1" +wrap incoming text at felamimail no Bryt innkommende tekst ved +writing felamimail no skrivning +wrote felamimail no skrev +you must login first. felamimail no Du mÃ¥ logge inn først diff --git a/felamimail/lang/egw_pl.lang b/felamimail/lang/egw_pl.lang new file mode 100755 index 0000000000..360c473305 --- /dev/null +++ b/felamimail/lang/egw_pl.lang @@ -0,0 +1,410 @@ +(no subject) felamimail pl (bez tematu) +(only cc/bcc) felamimail pl (tylko DW/UDW) +(unknown sender) felamimail pl (nieznany nadawca) +activate felamimail pl Aktywuj +activate script felamimail pl aktywuj skrypt +add acl felamimail pl dodaj listÄ™ ACL +add address felamimail pl Dodaj adres +add rule felamimail pl Dodaj reguÅ‚Ä™ +add script felamimail pl Dodaj skrypt +add to %1 felamimail pl Dodaj do %1 +add to address book felamimail pl Dodaj do książki adresowej +add to addressbook felamimail pl dodaj do książki adresowej +adding file to message. please wait! felamimail pl DodajÄ™ plik do wiadomoÅ›ci. ProszÄ™ czekać +additional info felamimail pl Informacje dodatkowe +address book felamimail pl Książka adresowa +address book search felamimail pl Przeszukiwanie książki adresowej +after message body felamimail pl Za treÅ›ciÄ… wiadomoÅ›ci +all address books felamimail pl Wszystkie książki adresowe +all folders felamimail pl Wszystkie foldery +all of felamimail pl wszystkie z +allow images from external sources in html emails felamimail pl Zezwalaj na wyÅ›wietlanie obrazkow z zewnÄ™trznych serwerów w wiadomoÅ›ciach HTML +allways a new window felamimail pl zawsze w nowym oknie +always show html emails felamimail pl Zawsze pokazuj maile napisane w HTML +and felamimail pl i +any of felamimail pl dowolny z +any status felamimail pl dowolny status +anyone felamimail pl ktokolwiek +as a subfolder of felamimail pl jako podfolder w +attachments felamimail pl ZaÅ‚Ä…czniki +authentication required felamimail pl wymagane jest uwierzytelnianie +auto refresh folder list felamimail pl Automatycznie odÅ›wieżaj listÄ™ folderów +back to folder felamimail pl Wróć do folderu +bad login name or password. felamimail pl ZÅ‚a nazwa użytkownika lub hasÅ‚o +bad or malformed request. server responded: %s felamimail pl NieprawidÅ‚owe lub źle skonstruowane żądane. Serwer odpowiedziaÅ‚: %s +bad request: %s felamimail pl NieprawidÅ‚owe żądanie: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail pl Zgodnie ze wskazanymi dyspozycjami, wiadomoÅ›ci przychodzÄ…ce bÄ™dÄ… miaÅ‚y odpowiednie tÅ‚o wiadomoÅ›ci na liÅ›cie. Pozwala to Å‚atwo odróżnić nadawców wiadomoÅ›ci, szczególnie gdy sÄ… to listy mailingowe. +bcc felamimail pl UDW +before headers felamimail pl Przed nagłówkiem +between headers and message body felamimail pl PomiÄ™dzy nagłówkiem a treÅ›ciÄ… +body part felamimail pl treść wiadomoÅ›ci +can't connect to inbox!! felamimail pl nie można podÅ‚Ä…czyć siÄ™ do INBOX! +cc felamimail pl DW +change folder felamimail pl ZmieÅ„ folder +check message against next rule also felamimail pl sprawdź również kolejnÄ™ reguÅ‚Ä™ +clear search felamimail pl wyczyść wyszukiwanie +click here to log back in. felamimail pl Kliknij aby zalogować siÄ™ ponownie +click here to return to %1 felamimail pl Kliknij tutaj aby wrócić do %1 +close all felamimail pl zamknij wszystko +close this page felamimail pl zamknij tÄ™ stronÄ™ +close window felamimail pl Zamknij okno +color felamimail pl Kolor +compose felamimail pl Utwórz +compress folder felamimail pl Kompaktuj folder +condition felamimail pl warunek +configuration felamimail pl Konfiguracja +connection dropped by imap server. felamimail pl PoÅ‚Ä…czenie zerwane przez serwer IMAP +contains felamimail pl zawiera +could not complete request. reason given: %s felamimail pl Nie udaÅ‚o siÄ™ zrealizować żądania. Powód: %s +could not open secure connection to the imap server. %s : %s. felamimail pl Nie udaÅ‚o siÄ™ nawiÄ…zać bezpiecznego poÅ‚Ä…czenia +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail pl CRAM-MD5 lub DIGEST-MD5 wymagajÄ… obecnoÅ›ci pakietu Auth_SASL. +create felamimail pl Stwórz +create folder felamimail pl Tworzenie folderu +create sent felamimail pl Stwórz WysÅ‚ane +create subfolder felamimail pl Stwórzy podfolder +create trash felamimail pl Stwórz Kosz +created folder successfully! felamimail pl Utworzono folder pomyÅ›lnie! +dark blue felamimail pl Ciemno Niebieski +dark cyan felamimail pl Ciemny Cyan +dark gray felamimail pl Ciemny Szary +dark green felamimail pl Ciemny Zielony +dark magenta felamimail pl Ciemny Magenta +dark yellow felamimail pl Ciemny Żółty +date(newest first) felamimail pl Data (od najnowszych) +date(oldest first) felamimail pl Data (od najstarszych) +days felamimail pl dni +deactivate script felamimail pl deaktywuj skrypt +default signature felamimail pl domyÅ›lna sygnaturka +default sorting order felamimail pl DomyÅ›lny porzÄ…dek sortowania +delete all felamimail pl kasuj wszystko +delete folder felamimail pl UsuÅ„ folder +delete script felamimail pl usuÅ„ skrypt +delete selected felamimail pl UsuÅ„ zaznaczone +delete selected messages felamimail pl skasuj wybrane wiadomoÅ›ci +deleted felamimail pl skasowany +deleted folder successfully! felamimail pl Folder zostaÅ‚ pomyÅ›lnie usuniÄ™ty! +deleting messages felamimail pl usuwanie wiadomoÅ›ci w toku +disable felamimail pl WyÅ‚Ä…cz +discard felamimail pl odrzuć +discard message felamimail pl odrzuć wiadomość +display message in new window felamimail pl WyÅ›wietl wiadomość w nowym oknie +display messages in multiple windows felamimail pl wyÅ›wietl wiadomoÅ›ci w wielu oknach +display of html emails felamimail pl WyÅ›wietlaj wiadomość w HTML +display only when no plain text is available felamimail pl WyÅ›wietlaj jedynie, jeżeli nie ma wersji tekstowej +display preferences felamimail pl WyÅ›wietl preferencje +displaying html messages is disabled felamimail pl WyÅ›wietlanie wiadomoÅ›ci w HTML jest wyÅ‚Ä…czone +do it! felamimail pl zrób to! +do not use sent felamimail pl Nie używaj WysÅ‚anych +do not use trash felamimail pl Nie używaj Kosza +do not validate certificate felamimail pl nie sprawdzaj poprawnoÅ›ci certyfikatu +do you really want to delete the '%1' folder? felamimail pl Czy na pewno chcesz usunąć folder '%1'? +do you really want to delete the selected signatures? felamimail pl Czy na pewno chcesz usunąć wybrane podpisy? +does not contain felamimail pl nie zawiera +does not match felamimail pl nie pasuje +does not match regexp felamimail pl nie pasuje do wzorca +don't use draft folder felamimail pl Nie używaj folderu szkiców +don't use sent felamimail pl Nie używaj WysÅ‚anych +don't use trash felamimail pl Nie używaj Kosza +down felamimail pl w dół +download felamimail pl pobierz +download this as a file felamimail pl pobierz jako plik +draft folder felamimail pl folder szkiców +e-mail felamimail pl E-mail +e-mail address felamimail pl Adres e-mail +e-mail folders felamimail pl Foldery e-mail +edit email forwarding address felamimail pl edytuj adres e-mail przekazywania wiadomoÅ›ci +edit filter felamimail pl Edytuj filtr +edit rule felamimail pl edytuj reguÅ‚Ä™ +edit selected felamimail pl Edytuj wybrane +edit vacation settings felamimail pl edytuj ustawienia autorespondera +email address felamimail pl Adres e-mail +email forwarding address felamimail pl adres e-mail przekazywania wiadomoÅ›ci +email signature felamimail pl Sygnaturka +emailaddress felamimail pl adres_email +empty trash felamimail pl opróżnij kosz +enable felamimail pl wÅ‚Ä…cz +encrypted connection felamimail pl poÅ‚Ä…czenie szyfrowane +enter your default mail domain ( from: user@domain ) admin pl Podaj domyÅ›lnÄ… domenÄ™ pocztowÄ… (Od: użytkownik@domena) +enter your imap mail server hostname or ip address admin pl Podaj nazwÄ™ hosta lub IP serwera IMAP +enter your sieve server hostname or ip address admin pl Podaj nazwÄ™ hosta lub IP serwera SIEVE +enter your sieve server port admin pl Podaj port serwera SIEVE +enter your smtp server hostname or ip address admin pl Podaj nazwÄ™ hosta lub IP serwera SMTP +enter your smtp server port admin pl Podaj port serwera SMTP +error felamimail pl BÅÄ„D +error connecting to imap serv felamimail pl BÅ‚Ä…d Å‚Ä…czenia z serwerem IMAP +error connecting to imap server. %s : %s. felamimail pl BÅ‚Ä…d poÅ‚Ä…czenia do serwera IMAP. %s : %s +error connecting to imap server: [%s] %s. felamimail pl BÅ‚Ä…d poÅ‚Ä…czenia do serwera IMAP. [%s] %s +error opening felamimail pl BÅ‚Ä…d podczas otwierania +every felamimail pl co +every %1 days felamimail pl co %1 dni +expunge felamimail pl Opróżnij +extended felamimail pl rozszerzone +felamimail common pl FelaMiMail +file into felamimail pl informacja o pliku +files felamimail pl pliki +filter active felamimail pl filtr jest aktywny +filter name felamimail pl nazwa filtra +filter rules common pl reguÅ‚y filtra +first name felamimail pl ImiÄ™ +flagged felamimail pl oflagowano +flags felamimail pl flagi +folder acl felamimail pl lista ACL folderu +folder name felamimail pl Nazwa foldera +folder path felamimail pl Åšcieżka foldera +folder preferences felamimail pl Preferencje folderów +folder settings felamimail pl Ustawienia foldera +folder status felamimail pl Status foldera +folderlist felamimail pl Lista folderów +foldername felamimail pl Nazwa foldera +folders felamimail pl Foldery +folders created successfully! felamimail pl PomyÅ›lnie utworzono folder +follow felamimail pl odpowiedz +for mail to be send - not functional yet felamimail pl Dla wiadomoÅ›ci przygtowanych do wysÅ‚ania - jeszcze nie dziaÅ‚a ;-) +for received mail felamimail pl Dla wiadomoÅ›ci otrzymanych +forward felamimail pl PrzeÅ›lij dalej +forward to felamimail pl PrzeÅ›lij do +forward to address felamimail pl PrzeÅ›lij na adres +forwarding felamimail pl Przekazywanie +found felamimail pl Znaleziono +fri felamimail pl PiÄ… +from felamimail pl Od +from(a->z) felamimail pl Od (A->Z) +from(z->a) felamimail pl Od (Z->A) +full name felamimail pl PeÅ‚na nazwa +greater than felamimail pl wiÄ™ksze niż +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail pl Aby dowiedzieć się więcej o Squirrelmail, zajrzyj na www.felamimail.org.
    +header lines felamimail pl Linie nagłówka +hide header felamimail pl ukryj nagłówek +hostname / address felamimail pl adres domenowy / adres IP +html felamimail pl HTML +icons and text felamimail pl Ikony i tekst +icons only felamimail pl Tylko ikony +identifying name felamimail pl Nazwa identyfikatora +identity felamimail pl tożsamość +if felamimail pl JEŻELI +if from contains felamimail pl jeżeli pole 'From:" zawiera +if mail header felamimail pl jeżeli nagłówek wiadomości +if message size felamimail pl jeżeli rozmiar wiadomości +if subject contains felamimail pl jeżeli pole "Temat" zawiera +if to contains felamimail pl jeżeli pole "Adresat" zawiera +if using ssl or tls, you must have the php openssl extension loaded. felamimail pl Jeżeli korzystasz z SSL lub TLS, musisz mieć dołączone rozszerzenie OpenSSL do PHP. +illegal folder name. please select a different name. felamimail pl Nazwa folderu nie jest poprawna. Proszę wybrać inną nazwę. +imap felamimail pl IMAP +imap server felamimail pl Serwer IMAP +imap server address felamimail pl Adres serwera IMAP +imap server closed the connection. felamimail pl Serwer IMAP zakończył połączenie. +imap server closed the connection. server responded: %s felamimail pl Serwer IMAP zakończył połączenie. Serwer zwrócił: %s +imap server password felamimail pl hasło do serwera IMAP +imap server type felamimail pl Typ serwera IMAP +imap server username felamimail pl nazwa użytkownika do serwera IMAP +imaps authentication felamimail pl Autentykacja IMAPS +imaps encryption only felamimail pl Tylko szyfrowanie IMAPS +in felamimail pl w +inbox felamimail pl ODEBRANE +incoming mail server(imap) felamimail pl serwer poczty przychodzącej (IMAP) +index order felamimail pl Porządek indeksu +info felamimail pl Info +invalid user name or password felamimail pl Zła nazwa użytkownika lub hasło +javascript felamimail pl JavaScript +jumping to end felamimail pl skacze na koniec +jumping to start felamimail pl skacze na początek +keep a copy of the message in your inbox felamimail pl zachowaj kopię wiadomości w folderze ODEBRANE +keep local copy of email felamimail pl zachowja lokalną kopię tej wiadomości +kilobytes felamimail pl kilobajtów +language felamimail pl Język +last name felamimail pl Nazwisko +less felamimail pl mniej +less than felamimail pl mniej niż +light gray felamimail pl Jasny Szary +list all felamimail pl Pokaż wszystko +loading felamimail pl ładowanie +location of buttons when composing felamimail pl Położenie przycisków przy pisaniu maila +mail server login type admin pl Typ logowania do serwera poczty +mail settings felamimail pl Ustawienia poczty +mainmessage felamimail pl treść_wiadomości +manage emailaccounts preferences pl Zarządzaj kontami pocztowymi +manage emailfilter / vacation preferences pl Zarządzaj filtrem pocztym / powiadomieniami +manage folders common pl Zarządzanie folderami +manage sieve common pl Zarządzaj skryptami Sieve +manage signatures felamimail pl Zarządzaj sygnaturkami +mark as deleted felamimail pl Zaznacz jako usunietą +mark messages as felamimail pl Zaznacz wybrane wiadomości jako +mark selected as flagged felamimail pl Zaznacz wybrane oflagowaniem +mark selected as read felamimail pl Zaznacz wybrane wiadomości jako przeczytane +mark selected as unflagged felamimail pl Zaznacz wybrane jako nie oflagowane +mark selected as unread felamimail pl Zaznacz wybrane wiadomości jako nieprzeczytane +match felamimail pl Zgodne +matches felamimail pl pasuje do +matches regexp felamimail pl pasuje do wyrażenia regularnego +max uploadsize felamimail pl limit ładowania danych +message highlighting felamimail pl Podświetlanie wiadomości +message list felamimail pl Lista wiadomości +messages felamimail pl wiadomości +mon felamimail pl Pon +move felamimail pl przenieś +move messages felamimail pl przenieś wiadomości +move to felamimail pl przenieś wiadomości do +move to trash felamimail pl przenieś do kosza +moving messages to felamimail pl przenoszę wiadomości do +name felamimail pl Nazwa +never display html emails felamimail pl Nigdy nie wyświetlaj emaili HTML +new common pl Nowe +new filter felamimail pl Nowy filtr +next felamimail pl Następny +next message felamimail pl następna wiadomość +no active imap server found!! felamimail pl Nie znaleziono aktywnego serwera IMAP! +no encryption felamimail pl brak szyfrowania +no filter felamimail pl Brak filtra +no folders found felamimail pl Nie znaleziono folderów +no folders were found to subscribe to! felamimail pl Nie znaleziono folderów do aktywowania subskrypcji! +no folders were found to unsubscribe from! felamimail pl Nie znaleziono folderów do anulowania subskrypcji! +no highlighting is defined felamimail pl Nie zdefiniowano podświetleń +no message returned. felamimail pl Nie otrzymano wiadomości. +no messages found... felamimail pl nie znaleziono wiadomości... +no messages were selected. felamimail pl Nie wybrano żadnej wiadomości +no plain text part found felamimail pl brak części 'czystym' tekstem +no previous message felamimail pl brak poprzedniej wiadomości +no supported imap authentication method could be found. felamimail pl Nie znaleziono obsługiwanej metody autentykacji IMAP. +no valid emailprofile selected!! felamimail pl Nie wybrano poprawnego profilu e-mail. +none felamimail pl Żaden +on behalf of felamimail pl w imieniu +one address is not valid felamimail pl Jeden adres nie jest poprawny +only inbox felamimail pl Tylko ODEBRANE +only one window felamimail pl tylko jedno okno +only unseen felamimail pl tylko nie przeczytane +open all felamimail pl otwórzy wszystkie +options felamimail pl Opcje +or felamimail pl lub +organisation felamimail pl instytucja +organization felamimail pl instytucja +organization name admin pl Nazwa instutucji +outgoing mail server(smtp) felamimail pl serwer poczty wychodzącej (SMTP) +participants felamimail pl Uczestnicy +personal information felamimail pl Informacje osobiste +please select a address felamimail pl Proszę wybrać adres +please select the number of days to wait between responses felamimail pl Wybierz, ile dni czekać między odpowiedziami +please supply the message to send with auto-responses felamimail pl Proszę wprowadzić wiadomość przesyłaną w automatycznych odpowiedziach +previous felamimail pl Poprzedni +previous message felamimail pl poprzednia wiadomość +print it felamimail pl wydrukuj to +print this page felamimail pl wydrukuj tę stronę +quicksearch felamimail pl Szybkie wyszukiwanie +read felamimail pl Odczytaj +reading felamimail pl odczytywanie +receive notification felamimail pl Odebrano powiadomienie +recent felamimail pl ostatnie +refresh time in minutes felamimail pl Czas odświeżania w minutach +reject with felamimail pl odrzuć z +remove felamimail pl usuń +remove immediately felamimail pl usuń natychmiast +rename felamimail pl Zmiana nazwy +rename a folder felamimail pl Zmiana nazwy foldera +rename folder felamimail pl Zmień nazwę foldera +renamed successfully! felamimail pl Pomyślnie zmieniono nazwę +replied felamimail pl odpowiedziano +reply felamimail pl Odpowiedz +reply all felamimail pl Odpowiedz wszystkim +reply to felamimail pl Odpowiedz +replyto felamimail pl Odpowiedz +respond felamimail pl Odpowiedź +respond to mail sent to felamimail pl odpowiedz na mail wysłany do +return felamimail pl Powrót +return to options page felamimail pl Powrót do strony konfiguracji +row order style felamimail pl styl porządku wierszy +rule felamimail pl Reguła +sat felamimail pl Sob +save felamimail pl Zapisz +save as draft felamimail pl zapisz jako szkic +save as infolog felamimail pl zapisz jako zadanie Dziennika CRM +save changes felamimail pl zachowaj zmiany +save message to disk felamimail pl zachowaj wiadomość na dysku +script name felamimail pl nazwa skryptu +script status felamimail pl status skryptu +search felamimail pl Szukaj +search for felamimail pl Szukaj dla +select felamimail pl Wybierz +select all felamimail pl Wybierz wszystko +select emailprofile felamimail pl Wybierz profil email +select folder felamimail pl Wybierz folder +select your mail server type admin pl Wybierz typ serwera email +send felamimail pl Wyślij +send a reject message felamimail pl odeślij wiadomość odrzucającą +sent folder felamimail pl Folder Wysłane +server supports mailfilter(sieve) felamimail pl serwer posiada filtr poczy (sieve - sito) +show header felamimail pl pokaż nagłówek +show new messages on main screen felamimail pl Wyświetlać nowe wiadomości na stronie głównej? +sieve script name felamimail pl Nazwa skryptu sita ('sieve') +sieve settings admin pl Ustawienia Sieve +signature felamimail pl Sygnaturka +simply click the target-folder felamimail pl Kliknij folder docelowy +size felamimail pl Wielkość +size of editor window felamimail pl Wielkość okna edytora +size(...->0) felamimail pl Rozmiar (...->0) +size(0->...) felamimail pl Rozmiar (0->...) +skipping forward felamimail pl omija kolejną +skipping previous felamimail pl omija poprzednią +small view felamimail pl widok uproszczony +smtp settings admin pl Ustawienia SMTP +subject felamimail pl Temat +subject(a->z) felamimail pl Temat (A->Z) +subject(z->a) felamimail pl Temat (Z->A) +submit felamimail pl Wyślij +subscribe felamimail pl Subskrybuj +subscribed felamimail pl Uruchomiono subskrypcję +subscribed successfully! felamimail pl Uruchomiono subskrypcję poprawnie! +sun felamimail pl Nie +table of contents felamimail pl Spis treści +text only felamimail pl Tylko tekst +the connection to the imap server failed!! felamimail pl Nieudane połączenie z serwerem SMTP!! +the mimeparser can not parse this message. felamimail pl Nie udało się przetworzyć zawartości MIME tej wiadomości +then felamimail pl WTEDY +this folder is empty felamimail pl TEN FOLDER JEST PUSTY +this php has no imap support compiled in!! felamimail pl PHP nie ma skompilowanej obsługi IMAP!! +thu felamimail pl Czw +to felamimail pl Do +translation preferences felamimail pl Preferencje tłumaczenia +translation server felamimail pl Serwer tłumaczeń +trash fold felamimail pl Folder Kosza +trash folder felamimail pl Folder Kosza +tue felamimail pl Wto +type felamimail pl typ +unexpected response from server to authenticate command. felamimail pl Niespodziewana odpowiedź z serwera na polecenie AUTHENTICATE +unexpected response from server to digest-md5 response. felamimail pl Niespodziewana odpowiedź z serwera na polecenie Digest-MD5 +unexpected response from server to login command. felamimail pl Niespodziewana odpowiedź serwera na polecenie LOGIN. +unflagged felamimail pl nie oflagowano +unknown err felamimail pl Nieznany błąd +unknown error felamimail pl Nieznany błąd +unknown sender felamimail pl Nieznany nadawca +unknown user or password incorrect. felamimail pl Użytkownik nieznany lub hasło niezgodne. +unread common pl nieprzeczytane +unseen felamimail pl nieprzeczytane (nie pobrane) +unselect all felamimail pl Odznacz wszystko +unsubscribe felamimail pl Anuluj subskrypcję +unsubscribed felamimail pl Anulowano subskrypcję +unsubscribed successfully! felamimail pl Anulowano subskrypcję poprawnie! +up felamimail pl w górę +updating message status felamimail pl aktualizuję status wiadomości +updating view felamimail pl aktualizuję widok +use a signature felamimail pl Użyj sygnaturki +use a signature? felamimail pl Użyć sygnaturki? +use addresses felamimail pl użyj adresów +use custom settings felamimail pl Użyj ustawień użytkownika +use regular expressions felamimail pl użyj wyrażeń regularnych +use smtp auth admin pl Skorzystaj z autentykacji SMTP +users can define their own emailaccounts admin pl Użytkownicy mogą definiować swoje własne konta poczty elektronicznej +vacation notice common pl powiadomienie urlopowe +vacation notice is active felamimail pl Powiadomienie urlopowe jest aktywne +validate certificate felamimail pl sprawdź poprawność certyfikatu +view full header felamimail pl Pokaż pełny nagłówek +view header lines felamimail pl pokaż linie nagłówka +view message felamimail pl Pokaż wiadomość +viewing full header felamimail pl Pokazuje cały nagłówek +viewing message felamimail pl Pokazuje wiadomość +viewing messages felamimail pl Pokazuje wiadomości +wed felamimail pl Śro +when deleting messages felamimail pl Gdy usuwasz wiadomość +with message felamimail pl z wiadomością +with message "%1" felamimail pl z wiadomością '%1' +wrap incoming text at felamimail pl Szerokość zawijania werszy +writing felamimail pl zapisywanie +wrote felamimail pl zapisano diff --git a/felamimail/lang/egw_pt-br.lang b/felamimail/lang/egw_pt-br.lang new file mode 100644 index 0000000000..c95d29ba17 --- /dev/null +++ b/felamimail/lang/egw_pt-br.lang @@ -0,0 +1,471 @@ +(no subject) felamimail pt-br (sem assunto) +(only cc/bcc) felamimail pt-br (somente Cc/Cco) +(separate multiple addresses by comma) felamimail pt-br (separar vários endereços por vírgula) +(unknown sender) felamimail pt-br (remetente desconhecido) +activate felamimail pt-br Ativar +activate script felamimail pt-br Ativar script +activating by date requires a start- and end-date! felamimail pt-br Ativação por data requer uma data inicial e final! +add acl felamimail pt-br Adicionar ACL +add address felamimail pt-br Adicionar endereço +add rule felamimail pt-br Adicionar Regra +add script felamimail pt-br Adicionar Script +add to %1 felamimail pt-br Adicionar a %1 +add to address book felamimail pt-br Adicionar aos Contatos +add to addressbook felamimail pt-br Adicionar aos Contatos +adding file to message. please wait! felamimail pt-br Adicionando arquivo à mensagem. Por favor, aguarde... +additional info felamimail pt-br Adicionar informação +address book felamimail pt-br Contatos +address book search felamimail pt-br Procurar nos Contatos +after message body felamimail pt-br Após o corpo da mensagem +all address books felamimail pt-br Todos os contatos +all folders felamimail pt-br Todas as pastas +all of felamimail pt-br Todos +allow images from external sources in html emails felamimail pt-br Todas as imagens de origem externa em e-mails em HTML +allways a new window felamimail pt-br sempre uma nova janela +always show html emails felamimail pt-br Sempre mostar mensagens em HMTL +and felamimail pt-br e +any of felamimail pt-br qualquer +any status felamimail pt-br qualquer status +anyone felamimail pt-br qualquer um +as a subfolder of felamimail pt-br como subpasta de +attachments felamimail pt-br Anexos +authentication required felamimail pt-br autenticação requerida +auto refresh folder list felamimail pt-br Auto atualizar lista de pastas +back to folder felamimail pt-br Voltar para a pasta +bad login name or password. felamimail pt-br Nome de usuário ou senha incorretos. +bad or malformed request. server responded: %s felamimail pt-br Requisição mal formada ou incorreta. Servidor respondeu: %s +bad request: %s felamimail pt-br Requisição incorreta: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail pt-br Baseado nos critérios fornecidos, mensagens de entrada podem ter cores de fundo diferentes na lista de mensagens. Isso ajuda a distinguir de quem são as mensagens, particularmente no caso de listas de mensagens. +bcc felamimail pt-br CCO +before headers felamimail pt-br Antes dos cabeçalhos +between headers and message body felamimail pt-br Entre cabeçalho e corpo da mensagem +body part felamimail pt-br corpo da mensagem +by date felamimail pt-br por data +can not send message. no recipient defined! felamimail pt-br não foi possível enviar mensagem. Sem conteúdo definido! +can't connect to inbox!! felamimail pt-br não foi possível conectar com CAIXA DE ENTRADA +cc felamimail pt-br cc +change folder felamimail pt-br Mudar pasta +check message against next rule also felamimail pt-br Verificar mensagem com a próxima regra também +checkbox felamimail pt-br Caixa de seleção +clear search felamimail pt-br limpar procura +click here to log back in. felamimail pt-br Clique aqui para conectar +click here to return to %1 felamimail pt-br Clique aqui para voltar a %1 +close all felamimail pt-br Fechar todos +close this page felamimail pt-br Fechar esta página +close window felamimail pt-br Fechar janela +color felamimail pt-br Cor +compose felamimail pt-br Compor +compose as new felamimail pt-br compor como novo +compress folder felamimail pt-br Compactar pasta +condition felamimail pt-br condição +configuration felamimail pt-br Configuração +connection dropped by imap server. felamimail pt-br Conexão interrompida pelo servidor IMAP. +contains felamimail pt-br contém +could not complete request. reason given: %s felamimail pt-br Não foi possível completar a requisição. Motivo informado: %s +could not import message: felamimail pt-br Não foi possível importar Mensagem: +could not open secure connection to the imap server. %s : %s. felamimail pt-br Não foi possível abrir conexão segura ao servidor IMAP. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail pt-br CRAM-MD5 ou DIGEST-MD5 requerem que o pacote Auth_SASL esteja instalado. +create felamimail pt-br Criar +create folder felamimail pt-br Criar pasta +create sent felamimail pt-br Criar Enviadas +create subfolder felamimail pt-br Criar sub-pasta +create trash felamimail pt-br Criar Lixeira +created folder successfully! felamimail pt-br Pasta criada com sucesso! +dark blue felamimail pt-br Azul escuro +dark cyan felamimail pt-br Cyan escuro +dark gray felamimail pt-br Cinza escuro +dark green felamimail pt-br Verde escuro +dark magenta felamimail pt-br Vinho +dark yellow felamimail pt-br Amarelo escuro +date(newest first) felamimail pt-br Data (mais novas primeiro) +date(oldest first) felamimail pt-br Data (mais antigas primeiro) +days felamimail pt-br dias +deactivate script felamimail pt-br desativar script +default felamimail pt-br padrão +default signature felamimail pt-br assinatura padrão +default sorting order felamimail pt-br Ordem padrão de classificação +delete all felamimail pt-br Remover todas +delete folder felamimail pt-br Remover pasta +delete script felamimail pt-br Remover script +delete selected felamimail pt-br Remover selecionados +delete selected messages felamimail pt-br Remover mensagens selecionadas +deleted felamimail pt-br Removido +deleted folder successfully! felamimail pt-br Pasta removida com sucesso! +deleting messages felamimail pt-br removendo mensagens +disable felamimail pt-br Desabilitada +discard felamimail pt-br descartar +discard message felamimail pt-br Descartar mensagem +display message in new window felamimail pt-br Exibir mensagem em uma nova janela +display messages in multiple windows felamimail pt-br Exibir mensagens em múltiplas janelas +display of html emails felamimail pt-br Exibir emails em HTML +display only when no plain text is available felamimail pt-br Exibir somente quando não possuir versão em texto plano disponível +display preferences felamimail pt-br Preferências de Exibição +displaying html messages is disabled felamimail pt-br a exibição de mensagens HTML está desativada +do it! felamimail pt-br faça! +do not use sent felamimail pt-br Não usar Enviadas +do not use trash felamimail pt-br Não usar Lixeira +do not validate certificate felamimail pt-br não valide certificados +do you really want to delete the '%1' folder? felamimail pt-br Você realmente deseja apagar a pasta '%1'? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail pt-br Você realmente deseja remover as configurações de conta selecionadas e as identidades associadas? +do you really want to delete the selected signatures? felamimail pt-br Você realmente deseja remover as assinaturas selecionadas ? +do you really want to move the selected messages to folder: felamimail pt-br Você realmente deseja mover a(s) mensagem(ns) selecionada(s) para a pasta: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail pt-br Você deseja ser perguntado para confirmação ao mover mensagens para outra pasta? +does not contain felamimail pt-br não contém +does not exist on imap server. felamimail pt-br não existe no Servidor IMAP. +does not match felamimail pt-br Não coincide +does not match regexp felamimail pt-br não coincide com a expressão usada +don't use draft folder felamimail pt-br Não usar pasta Rascunhos +don't use sent felamimail pt-br Não usar pasta Mensagens Enviadas +don't use template folder felamimail pt-br Não usar pasta Modelos +don't use trash felamimail pt-br Não usar pasta Lixeira +dont strip any tags felamimail pt-br Não remover nenhuma tag +down felamimail pt-br baixo +download felamimail pt-br Download +download this as a file felamimail pt-br Fazer download como arquivo +draft folder felamimail pt-br Pasta Rascunho +drafts felamimail pt-br Rascunhos +e-mail felamimail pt-br E-Mail +e-mail address felamimail pt-br Endereço de E-Mail +e-mail folders felamimail pt-br Pastas de E-Mail +edit email forwarding address felamimail pt-br Editar e-mail de encaminhamento +edit filter felamimail pt-br Editar filtro +edit rule felamimail pt-br Editar regra +edit selected felamimail pt-br Editar selecionado +edit vacation settings felamimail pt-br Editar configurações de ausência +editor type felamimail pt-br Tipo do Editor +email address felamimail pt-br Endereço de E-Mail +email forwarding address felamimail pt-br E-Mail de encaminhamento +email notification update failed felamimail pt-br Atualização do email de notificação falhou +email signature felamimail pt-br Assinatura de E-Mail +emailaddress felamimail pt-br endereço de e-mail +empty trash felamimail pt-br Esvaziar Lixeira +enable felamimail pt-br habilitado +encrypted connection felamimail pt-br conexão criptografada +enter your default mail domain ( from: user@domain ) admin pt-br Digite o seu domínio de correio eletrônico (do modelo usuario@dominio) +enter your imap mail server hostname or ip address admin pt-br Digite o nome ou o endereço IP do seu servidor IMAP +enter your sieve server hostname or ip address admin pt-br Digite o nome ou o endereço IP do seu servidor SIEVE +enter your sieve server port admin pt-br Digite a porta do seu servidor SIEVE +enter your smtp server hostname or ip address admin pt-br Digite o nome ou o endereço IP do seu servidor SMTP +enter your smtp server port admin pt-br Preencha a porta do seu servidor SMTP +error felamimail pt-br ERRO +error connecting to imap serv felamimail pt-br Erro conectando ao servidor IMAP +error connecting to imap server. %s : %s. felamimail pt-br Erro conectando ao servidor IMAP. %s : %s. +error connecting to imap server: [%s] %s. felamimail pt-br Erro conectando ao servidor IMAP: [%s] %s. +error opening felamimail pt-br Erro abrindo +error: felamimail pt-br Erro: +error: could not save message as draft felamimail pt-br Erro: Não foi possível salvar a mensagem como Rascunho +every felamimail pt-br cada +every %1 days felamimail pt-br cada %1 dia(s) +expunge felamimail pt-br Excluir +extended felamimail pt-br extendido +felamimail common pt-br eMail +file into felamimail pt-br Arquivar em +files felamimail pt-br arquivos +filter active felamimail pt-br filtro ativo +filter name felamimail pt-br Nome do filtro +filter rules common pt-br Regras de filtros +first name felamimail pt-br Primeiro nome +flagged felamimail pt-br sinalizado +flags felamimail pt-br Sinalizadores +folder felamimail pt-br pasta +folder acl felamimail pt-br permissão da pasta +folder name felamimail pt-br Nome da pasta +folder path felamimail pt-br Caminho da Pasta +folder preferences felamimail pt-br Preferências de pastas +folder settings felamimail pt-br Configurações da Pasta +folder status felamimail pt-br Status da Pasta +folderlist felamimail pt-br Lista de Pastas +foldername felamimail pt-br Nome da pasta +folders felamimail pt-br Pastas +folders created successfully! felamimail pt-br Pastas criadas com sucesso! +follow felamimail pt-br seguir +for mail to be send - not functional yet felamimail pt-br Para mensagem a ser enviada (não funcionando ainda) +for received mail felamimail pt-br Para email recebido +forward felamimail pt-br Encaminhar +forward as attachment felamimail pt-br encaminhar como anexo +forward inline felamimail pt-br encaminhar no corpo da mensagem +forward messages to felamimail pt-br Encaminhar mensagens para +forward to felamimail pt-br encaminhar para +forward to address felamimail pt-br Encaminhar para endereço +forwarding felamimail pt-br Encaminhando +found felamimail pt-br Encontrado +fri felamimail pt-br Sex +from felamimail pt-br De +from(a->z) felamimail pt-br de (A->Z) +from(z->a) felamimail pt-br de (Z->A) +full name felamimail pt-br Nome completo +greater than felamimail pt-br maior que +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail pt-br Dê uma olhada em www.felamimail.org para aprender um pouco mais sobre o Squirrelmail.
    +header lines felamimail pt-br Linhas de Cabeçalho +hide header felamimail pt-br esconder cabeçalho +hostname / address felamimail pt-br servidor / endereço +how to forward messages felamimail pt-br como encaminhar mensagens +html felamimail pt-br HTML +icons and text felamimail pt-br Ãcones e texto +icons only felamimail pt-br Somente ícones +identifying name felamimail pt-br Nome de identificação +identity felamimail pt-br identificar +if felamimail pt-br SE +if from contains felamimail pt-br Se "De" contém +if mail header felamimail pt-br Se cabeçalho de e-mail +if message size felamimail pt-br Se tamanho da mensagem +if shown, which folders should appear on main screen felamimail pt-br se exibidas, quais pastas deverão aparecer na tela principal +if subject contains felamimail pt-br Se assunto contém +if to contains felamimail pt-br Se "Para" contém +if using ssl or tls, you must have the php openssl extension loaded. felamimail pt-br Se estiver usando SSL ou TLS, você deve ter a extensão php 'openssl' carregada. +illegal folder name. please select a different name. felamimail pt-br Nome de pasta inválido. Por favor escolha um nome diferente. +imap felamimail pt-br IMAP +imap server felamimail pt-br Servidor IMAP +imap server address felamimail pt-br Endereço do Servidor IMAP +imap server closed the connection. felamimail pt-br O servidor IMAP fechou a conexão. +imap server closed the connection. server responded: %s felamimail pt-br O servidor IMAP fechou a conexão. O servidor respondeu: %s +imap server password felamimail pt-br senha do servidor IMAP +imap server type felamimail pt-br Tipo do Servidor IMAP +imap server username felamimail pt-br nome do usuário do servidor IMAP +imaps authentication felamimail pt-br Autenticação IMAPS +imaps encryption only felamimail pt-br Somente encriptação IMAPS +import felamimail pt-br importar +import mail felamimail pt-br Importar email +in felamimail pt-br em +inbox felamimail pt-br Caixa de Entrada +incoming mail server(imap) felamimail pt-br servidor IMAP de entrada +index order felamimail pt-br Ãndices de classificação +info felamimail pt-br Informação +invalid user name or password felamimail pt-br Usuário e/ou senha inválido(s) +javascript felamimail pt-br JavaScript +jumping to end felamimail pt-br Indo para o final +jumping to start felamimail pt-br Indo para o início +junk felamimail pt-br Spam +keep a copy of the message in your inbox felamimail pt-br Manter uma cópia da mensagem em sua caixa de entrada +keep local copy of email felamimail pt-br manter uma cópia local do e-mail +kilobytes felamimail pt-br Kbytes +language felamimail pt-br Idioma +last name felamimail pt-br Último nome +left felamimail pt-br Esquerda +less felamimail pt-br menor +less than felamimail pt-br menor que +light gray felamimail pt-br Cinza claro +list all felamimail pt-br Listar todos +loading felamimail pt-br carregando +location of buttons when composing felamimail pt-br Localização dos botões na composição +mail server login type admin pt-br Tipo de conexão do servidor de correio +mail settings felamimail pt-br Preferências de Correio +mainmessage felamimail pt-br mensagem principal +manage email accounts and identities common pt-br Gerenciar contas de e-mail e identidades +manage emailaccounts common pt-br Gerenciar contas de e-mail +manage emailfilter / vacation preferences pt-br Gerenciar Filtros / Ausência +manage folders common pt-br Gerenciar pastas +manage sieve common pt-br Gerenciar scripts Sieve +manage signatures felamimail pt-br Gerenciar assinaturas +mark as deleted felamimail pt-br Remover mensagem(ns) selecionada(s) +mark messages as felamimail pt-br Marcar mensagem(ns) selecionada(s) como +mark selected as flagged felamimail pt-br Marcar mensagem(ns) selecionada(s) como sinalizada(s) +mark selected as read felamimail pt-br Marcar mensagem(ns) selecionada(s) como lida(s) +mark selected as unflagged felamimail pt-br Marcar mensagem(ns) selecionada(s) como não sinalizada(s) +mark selected as unread felamimail pt-br Marcar mensagem(ns) selecionada(s) como não lida(s) +match felamimail pt-br Coincidente +matches felamimail pt-br coincidentes +matches regexp felamimail pt-br coincidentes com a expressão +max uploadsize felamimail pt-br tamanho máximo para upload +message highlighting felamimail pt-br Destaque de mensagens +message list felamimail pt-br Lista de mensagens +messages felamimail pt-br mensagens +mon felamimail pt-br Seg +move felamimail pt-br mover +move messages felamimail pt-br mover mensagens +move to felamimail pt-br mover selecionados para +move to trash felamimail pt-br Mover para a lixeira +moving messages to felamimail pt-br Movendo mensagens para +name felamimail pt-br Nome +never display html emails felamimail pt-br Nunca mostar mensagens em HTML +new common pt-br Novo +new filter felamimail pt-br Novo Filtro +next felamimail pt-br Próximo +next message felamimail pt-br próxima mensagem +no active imap server found!! felamimail pt-br Nenhum servidor IMAP ativo encontrado!! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail pt-br Nenhum endereço em PARA/CC/CCO informado e nenhuma pasta para salvar mensagens definida. +no encryption felamimail pt-br sem criptografia +no filter felamimail pt-br Sem filtro +no folders found felamimail pt-br Nenhuma pasta encontrada +no folders were found to subscribe to! felamimail pt-br Nenhuma pasta encontrada para inscrição +no folders were found to unsubscribe from! felamimail pt-br Nenhuma pasta encontrada para desinscrever +no highlighting is defined felamimail pt-br Nenhum destaque foi definido +no message returned. felamimail pt-br Nenhuma mensagem retornada. +no messages found... felamimail pt-br Nenhuma mensagem foi encontrada... +no messages selected, or lost selection. changing to folder felamimail pt-br Nenhuma mensagem selecionada (ou perdeu-se a seleção). Alternando para pasta +no messages were selected. felamimail pt-br Nenhuma mensagem foi selecionada. +no plain text part found felamimail pt-br Nehuma parte em texto puro encontrada +no previous message felamimail pt-br Nenhuma mensagem anterior +no recipient address given! felamimail pt-br Nenhum endereço informado! +no signature felamimail pt-br sem assinatura +no subject given! felamimail pt-br Nenhum assunto informado! +no supported imap authentication method could be found. felamimail pt-br Nenhum método de autenticação suportado pelo servidor IMAP foi encontrado. +no valid emailprofile selected!! felamimail pt-br Nenhum perfil de e-mail válido selecionado!!! +none felamimail pt-br Nenhum +on felamimail pt-br em +on behalf of felamimail pt-br em nome de +one address is not valid felamimail pt-br Um endereço não é válido +only inbox felamimail pt-br Somente Caixa de Entrada +only one window felamimail pt-br Somente uma janela +only unseen felamimail pt-br Somente não vistas +open all felamimail pt-br abrir tudo +options felamimail pt-br Opções +or felamimail pt-br ou +organisation felamimail pt-br organização +organization felamimail pt-br organização +organization name admin pt-br Nome da organização +original message felamimail pt-br mensagem original +outgoing mail server(smtp) felamimail pt-br servidor SMTP de saída +participants felamimail pt-br Participantes +personal information felamimail pt-br Informação pessoal +please select a address felamimail pt-br Por favor, selecione um endereço +please select the number of days to wait between responses felamimail pt-br Por favor, selecione o número de dias para aguardar entre respostas. +please supply the message to send with auto-responses felamimail pt-br Por favor, informe a mensagem para enviar como auto-resposta. +port felamimail pt-br porta +posting felamimail pt-br envio +previous felamimail pt-br Anteriores +previous message felamimail pt-br mensagem anterior +print it felamimail pt-br imprima +print this page felamimail pt-br Imprimir esta página +printview felamimail pt-br visualização da impressão +quicksearch felamimail pt-br Pesquia rápida +read felamimail pt-br Lido +reading felamimail pt-br Lendo +receive notification felamimail pt-br Receber notificação de entrega +recent felamimail pt-br recente +refresh time in minutes felamimail pt-br Tempo de atualização em minutos +reject with felamimail pt-br rejeitar com +remove felamimail pt-br Remover +remove immediately felamimail pt-br Remover imediatamente +rename felamimail pt-br Renomear +rename a folder felamimail pt-br Renomear uma pasta +rename folder felamimail pt-br Renomear pasta +renamed successfully! felamimail pt-br Renomeado com sucesso! +replied felamimail pt-br Respondido +reply felamimail pt-br Responde +reply all felamimail pt-br Responde a todos +reply to felamimail pt-br Responde a +replyto felamimail pt-br Responde a +respond felamimail pt-br Responder +respond to mail sent to felamimail pt-br Responder para e-mail de origem +return felamimail pt-br Voltar +return to options page felamimail pt-br Voltar à página de opções +right felamimail pt-br Direita +row order style felamimail pt-br estilo da ordem de linha +rule felamimail pt-br Regra +sat felamimail pt-br Sáb +save felamimail pt-br salvar +save as draft felamimail pt-br salvar como rascunho +save as infolog felamimail pt-br salvar como tarefa +save changes felamimail pt-br Salvar alterações +save message to disk felamimail pt-br Salvar mensagem no disco +script name felamimail pt-br Nome do script +script status felamimail pt-br Status do script +search felamimail pt-br Pesquisa +search for felamimail pt-br Pesquisa por +select felamimail pt-br Selecionar +select all felamimail pt-br Selecionar todos +select emailprofile felamimail pt-br Selecionar perfil de E-Mail +select folder felamimail pt-br Selecionar pasta +select your mail server type admin pt-br Selecionar o tipo do seu servidor de e-mail +send felamimail pt-br Enviar +send a reject message felamimail pt-br Enviar uma mensagem de rejeição +sent felamimail pt-br Enviado +sent folder felamimail pt-br Pasta Enviadas +server supports mailfilter(sieve) felamimail pt-br Servidor suporta filtro de e-mails (sieve) +set as default felamimail pt-br Definir como padrão +show header felamimail pt-br Exibir cabeçalho +show new messages on main screen felamimail pt-br Exibir novas mensagens na tela principal +sieve script name felamimail pt-br nome do script sieve +sieve settings admin pt-br Configurações SIEVE +signatur felamimail pt-br Assinatura +signature felamimail pt-br Assinatura +simply click the target-folder felamimail pt-br Clique no diretório destino +size felamimail pt-br Tamanho +size of editor window felamimail pt-br Tamanho da janela do editor +size(...->0) felamimail pt-br Tamanho (...->0) +size(0->...) felamimail pt-br Tamanho (0->...) +skipping forward felamimail pt-br buscando as próximas mensagens +skipping previous felamimail pt-br buscando as mensagens anteriores +small view felamimail pt-br Visão resumida +smtp settings admin pt-br Cofigurações SMTP +start new messages with mime type plain/text or html? felamimail pt-br iniciar novas mensagens com mime type plain/text ou html ? +subject felamimail pt-br Assunto +subject(a->z) felamimail pt-br Assunto (A->Z) +subject(z->a) felamimail pt-br Assunto (Z->A) +submit felamimail pt-br Enviar +subscribe felamimail pt-br Inscrever +subscribed felamimail pt-br Inscrito +subscribed successfully! felamimail pt-br Inscrito com sucesso! +sun felamimail pt-br Dom +system signature felamimail pt-br assinatura do sistema +table of contents felamimail pt-br Ãndice +template folder felamimail pt-br Pasta Modelos +templates felamimail pt-br Modelos +text only felamimail pt-br Somente texto +text/plain felamimail pt-br texto/plano +the connection to the imap server failed!! felamimail pt-br A conexão com o servidor IMAP falhou! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail pt-br O servidor IMAP aparentemente não suporta o método de autenticação selecionado. Por favor, entre em contato com o administrador do sistema. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail pt-br O remetente da mensagem solicitou uma resposta para indicar que você a leu. Gostaria de enviá-la? +the mimeparser can not parse this message. felamimail pt-br O analisador mime não pôde processar esta mensagem. +then felamimail pt-br ENTÃO +this folder is empty felamimail pt-br ESTA PASTA ESTà VAZIA +this php has no imap support compiled in!! felamimail pt-br Esse aplicativo PHP não foi compilado com suporte IMAP +thu felamimail pt-br Qui +to felamimail pt-br Para +to mail sent to felamimail pt-br Enviar e-mail para +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail pt-br Para usar uma conexão TLS você precisar estar rodadndo a versão 5.1.0 ou maior do PHP. +translation preferences felamimail pt-br Preferências de tradução +translation server felamimail pt-br Servidor de tradução +trash felamimail pt-br Lixeira +trash fold felamimail pt-br Pasta Lixeira +trash folder felamimail pt-br Pasta Lixeira +tue felamimail pt-br Ter +type felamimail pt-br tipo +unexpected response from server to authenticate command. felamimail pt-br Resposta inesperada do servidor para o comando AUTENTICAR. +unexpected response from server to digest-md5 response. felamimail pt-br Resposta inesperada do servidor para a resposta Digest-MD5. +unexpected response from server to login command. felamimail pt-br Resposta inesperada do servidor para o comando LOGIN. +unflagged felamimail pt-br dessinalizado +unknown err felamimail pt-br Erro desconhecido +unknown error felamimail pt-br Erro desconhecido +unknown imap response from the server. server responded: %s felamimail pt-br Resposta desconhecida do servidor IMAP. O servidor respondeu: %s +unknown sender felamimail pt-br Remetente desconhecido +unknown user or password incorrect. felamimail pt-br Usuário ou senha inválido. +unread common pt-br Não lido +unseen felamimail pt-br Não lido +unselect all felamimail pt-br Desmarcar todos +unsubscribe felamimail pt-br Desincrever +unsubscribed felamimail pt-br Desinscrito +unsubscribed successfully! felamimail pt-br Desinscrito com sucesso! +up felamimail pt-br para cima +updating message status felamimail pt-br atualizando status da(s) mensagem(ns) +updating view felamimail pt-br atualizando exibição +use emailadmin to create profiles felamimail pt-br usar Administrador de E-Mails para criar perfis. +use a signature felamimail pt-br Usar uma asinatura +use a signature? felamimail pt-br Usar uma asinatura? +use addresses felamimail pt-br Usar endereços +use custom identities felamimail pt-br Usar identifidades personalizadas +use custom settings felamimail pt-br Usar configurações personalizadas +use regular expressions felamimail pt-br Usar expressões regulares +use smtp auth admin pt-br Usar autenticação SMTP +users can define their own emailaccounts admin pt-br Usuário pode definir suas próprias contas de correio +vacation notice common pt-br Notícia de ausência +vacation notice is active felamimail pt-br Notícia de ausência está ativa +vacation start-date must be before the end-date! felamimail pt-br Data inicial de ausência deve ser ANTERIOR à data final ! +validate certificate felamimail pt-br validar certificado +view full header felamimail pt-br Exibir cabeçalho completo +view header lines felamimail pt-br Exibir linhas de cabeçalho +view message felamimail pt-br Exibir mensagem +viewing full header felamimail pt-br Exibindo cabeçalho completo +viewing message felamimail pt-br Exibindo mensagem +viewing messages felamimail pt-br Exibindo mensagens +wed felamimail pt-br Qua +when deleting messages felamimail pt-br Ao remover mensagens +with message felamimail pt-br com mensagem +with message "%1" felamimail pt-br com mensagem "%1" +wrap incoming text at felamimail pt-br Quebrar a linha do texto de entrada em +writing felamimail pt-br escrevendo +wrote felamimail pt-br escreveu +you can use %1 for the above start-date and %2 for the end-date. felamimail pt-br Você pode usar %1 para a data inicial acima e %2 para a data final. +you have received a new message on the felamimail pt-br Você recebeu uma nova mensagem na +your message to %1 was displayed. felamimail pt-br Sua mensagem para %1 foi lida diff --git a/felamimail/lang/egw_pt.lang b/felamimail/lang/egw_pt.lang new file mode 100644 index 0000000000..2173c82214 --- /dev/null +++ b/felamimail/lang/egw_pt.lang @@ -0,0 +1,352 @@ +(no subject) felamimail pt (sem assunto) +(only cc/bcc) felamimail pt (apenas Cc/Bcc) +(unknown sender) felamimail pt (remetente desconhecido) +activate felamimail pt Activar +activate script felamimail pt activar script +add address felamimail pt Adicionar endereço +add rule felamimail pt Adicionar regra +add script felamimail pt Adicionar script +add to %1 felamimail pt Adicionar a %1 +add to address book felamimail pt Adicionar ao livro de endereços +add to addressbook felamimail pt adicionar ao livro de endereços +additional info felamimail pt Informação adicional +address book felamimail pt Livro de Endereços +address book search felamimail pt Pesquisa no livro de endereços +after message body felamimail pt Depois do corpo da mensagem +all address books felamimail pt Todos os livros de endereços +all folders felamimail pt Todas as pastas +all of felamimail pt todos de +allways a new window felamimail pt Sempre numa nova janela +always show html emails felamimail pt Exibir sempre mensagens HTML +any of felamimail pt algum de +anyone felamimail pt alguém +as a subfolder of felamimail pt como subpasta de +attachments felamimail pt Anexos +auto refresh folder list felamimail pt Actualização automática da lista de pastas +back to folder felamimail pt Voltar à pasta +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail pt Baseado em critérios dados, as mensagens recebidas podem ter cores de fundo diferentes na lista de mensagens. Isso facilita a distinção da origem das mensagens, particularmente no caso de listas de mensagens. +bcc felamimail pt Bcc +before headers felamimail pt Antes do cabeçalho +between headers and message body felamimail pt Entre cabeçalho e corpo da mensagem +body part felamimail pt corpo da mensagem +can't connect to inbox!! felamimail pt não é possível aceder à caixa de entrada!! +cc felamimail pt Cc +change folder felamimail pt Alterar pastas +check message against next rule also felamimail pt Verificar mensagem aplicando a regra seguinte também +checkbox felamimail pt Caixa de selecção +click here to log back in. felamimail pt Clique aqui para (re-)entrar. +click here to return to %1 felamimail pt Clique aqui para voltar a %1 +close all felamimail pt fechar tudo +close this page felamimail pt fechar esta página +close window felamimail pt Fecha janela +color felamimail pt Cor +compose felamimail pt Compor +compress folder felamimail pt Comprimir pasta +configuration felamimail pt Configuração +contains felamimail pt contém +could not add folder %1 (%2) !!! felamimail pt Não foi possível adicionar a pasta %1 (%2) !!! +could not delete folder %1 (%2) !!! felamimail pt Não foi possível eliminar a pasta %1 (%2) !!! +could not rename folder %1 to %2 (%3) !!! felamimail pt Não foi possível renomear a pasta %1 para %2 (%3) !!! +create felamimail pt Criar +create folder felamimail pt Criar pasta +create sent felamimail pt Criar a pasta Enviados +create subfolder felamimail pt Criar subpasta +create trash felamimail pt Criar a pasta Lixo +created folder successfully! felamimail pt Pasta criada com sucesso! +dark blue felamimail pt Azul escuro +dark cyan felamimail pt Cyan escuro +dark gray felamimail pt Cinza escuro +dark green felamimail pt Verde escuro +dark magenta felamimail pt Bordeaux escuro +dark yellow felamimail pt Amarelo escuro +date(newest first) felamimail pt Data (+ recente primeiro) +date(oldest first) felamimail pt Data (+ antiga primeiro) +days felamimail pt dias +deactivate script felamimail pt desactivar script +default sorting order felamimail pt Ordenar por (por omissão) +delete all felamimail pt eliminar tudo +delete folder felamimail pt Eliminar pasta +delete script felamimail pt eliminar script +delete selected felamimail pt Eliminar seleccionados +delete selected messages felamimail pt eliminar mensagens seleccionadas +deleted felamimail pt eliminado/a +deleted folder successfully! felamimail pt Pasta eliminada com sucesso! +disable felamimail pt Desactivar +discard message felamimail pt Cancelar mensagem +display messages in multiple windows felamimail pt Apresentar mensagens +display of html emails felamimail pt Apresentar mensagens em HTML +display only when no plain text is available felamimail pt Apresentar apenas quando a versão de texto não estiver disponível +display preferences felamimail pt Preferências de apresentação +do it! felamimail pt Executa! +do not use sent felamimail pt Não utilizar a pasta Enviados +do not use trash felamimail pt Não utilizar a pasta Lixo +do you really want to delete the '%1' folder? felamimail pt Tem a certeza de que deseja eliminar a pasta '%1'? +does not contain felamimail pt não contém +does not match felamimail pt não coincide +does not match regexp felamimail pt regexp não coincide +don't use sent felamimail pt Não utilizar a pasta Enviados +don't use trash felamimail pt Não utilizar a pasta Lixo +down felamimail pt baixo +download felamimail pt transferência +download this as a file felamimail pt Transferir como ficheiro +e-mail felamimail pt Correio electrónico +e-mail address felamimail pt Endereço de correio electrónico +e-mail folders felamimail pt Pastas de correio electrónico +edit email forwarding address felamimail pt editar endereço de reencaminhamento de mensagens +edit filter felamimail pt Editar filtro +edit rule felamimail pt Editar regra +edit selected felamimail pt Editar seleccionado +edit vacation settings felamimail pt editar definições de ausência +email address felamimail pt Endereço de correio electrónico +email forwarding address felamimail pt endereço de reencaminhamento de mensagens +email signature felamimail pt Assinatura +empty trash felamimail pt Esvaziar o Lixo +enable felamimail pt Activar +enter your default mail domain ( from: user@domain ) admin pt Insira o seu domínio de correio electrónico por omissão ( De: utilizador@domínio ) +enter your imap mail server hostname or ip address admin pt Insira o nome do seu servidor de correio electrónico IMAP ou o endereço IP +enter your sieve server hostname or ip address admin pt Insira o nome do seu servidor SIEVE ou o endereço IP +enter your sieve server port admin pt Insira o porto do seu servidor SIEVE +enter your smtp server hostname or ip address admin pt Insira o nome do seu servidor SMTP ou o endereço IP +enter your smtp server port admin pt Insira o porto do seu servidor SMTP +error felamimail pt Erro +error connecting to imap serv felamimail pt Erro na ligação ao servidor IMAP +error opening felamimail pt Erro ao abrir +every felamimail pt todos +every %1 days felamimail pt todos os %1 dias +expunge felamimail pt Apagar +felamimail common pt FelaMiMail +file into felamimail pt Ficheiro em +files felamimail pt ficheiros +filter active felamimail pt filtro activo +filter name felamimail pt Nome do filtro +filter rules felamimail pt regras do filtro +first name felamimail pt Primeiro nome +flagged felamimail pt marcado +flags felamimail pt Marcadores +folder acl felamimail pt Pasta ACL +folder name felamimail pt Nome da pasta +folder path felamimail pt Folder Path +folder preferences felamimail pt Preferências de pastas +folder settings felamimail pt Definições das pastas +folder status felamimail pt Estado das pastas +folderlist felamimail pt Lista de pastas +foldername felamimail pt Nome da pasta +folders felamimail pt Pastas +folders created successfully! felamimail pt Pastas criadas com sucesso! +follow felamimail pt seguir +for mail to be send - not functional yet felamimail pt Para mensagens a ser enviadas - ainda não funcional +for received mail felamimail pt Para mensagens recebidas +forward felamimail pt Encaminhar +forward to address felamimail pt Encaminhar para o endereço +forwarding felamimail pt A encaminhar +found felamimail pt Encontrado +fri felamimail pt Fri +from felamimail pt De +from(a->z) felamimail pt De (A->Z) +from(z->a) felamimail pt De (Z->A) +full name felamimail pt Nome completo +greater than felamimail pt maior que +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail pt Para mais informações sobre o Squirrelmail, visite a ligação www.felamimail.org.
    +header lines felamimail pt Linhas do cabeçalho +hide header felamimail pt esconder cabeçalho +html felamimail pt HTML +icons and text felamimail pt Ãcones e texto +icons only felamimail pt Apenas ícones +identifying name felamimail pt Nome de identificação +if felamimail pt Se +if from contains felamimail pt Se o campo de contiver +if mail header felamimail pt Se o cabeçalho da mensagem for +if message size felamimail pt Se o tamanho da mensagem for +if subject contains felamimail pt Se o assunto contiver +if to contains felamimail pt Se o campo para contiver +illegal folder name. please select a different name. felamimail pt Nome de pasta inválida. Por favor, escolha um nome diferente. +imap felamimail pt IMAP +imap server felamimail pt Servidor IMAP +imap server address felamimail pt Endereço de servidor IMAP +imap server type felamimail pt Tipo de servidor IMAP +imaps authentication felamimail pt Autenticação IMAP +imaps encryption only felamimail pt Apenas cifra IMAP +in felamimail pt em +index order felamimail pt Ãndice +info felamimail pt Info +invalid user name or password felamimail pt Nome de utilizador ou senha inválidos +javascript felamimail pt JavaScript +keep a copy of the message in your inbox felamimail pt Guardar uma cópia da mensagem na suca caixa de entrada +keep local copy of email felamimail pt Guardar cópia local de mensagens +kilobytes felamimail pt kilobytes +language felamimail pt linguagem +last name felamimail pt Apelido +left felamimail pt Esquerda +less felamimail pt menos +less than felamimail pt menos de +light gray felamimail pt Cinza claro +list all felamimail pt Listar todos +location of buttons when composing felamimail pt Localização dos botões na hora de compor +mail server login type admin pt Tipo de acesso ao servidor de correio electrónico +mail settings felamimail pt Preferências de mensagens +mainmessage felamimail pt mensagem principal +manage emailfilter / vacation preferences pt Gerir filtro de mensagens / ausência +manage folders common pt Gerir pastas +manage sieve common pt Gerir scripts SIEVE +mark as deleted felamimail pt Marcar como apagada +mark messages as felamimail pt Marcar mensagens seleccionadas como +mark selected as flagged felamimail pt Marcar mensagens seleccionadas como marcadas +mark selected as read felamimail pt Marcar mensagens seleccionadas como lidas +mark selected as unflagged felamimail pt Marcar mensagens seleccionadas como não marcadas +mark selected as unread felamimail pt Marcar mensagens seleccionadas como não lidas +match felamimail pt Exacto +matches felamimail pt Coincide +matches regexp felamimail pt Coincide com regexp +message highlighting felamimail pt Colorização de mensagens +message list felamimail pt Lista de mensagens +messages felamimail pt Mensagens +mon felamimail pt Seg +move felamimail pt Mover +move messages felamimail pt Mover mensagens +move to felamimail pt Mover mensagens seleccionadas para +move to trash felamimail pt Mover para o lixo +moving messages to felamimail pt A mover mensagens para +name felamimail pt Nome +never display html emails felamimail pt Nunca apresentar mensagens HTML +new common pt Novo +new filter felamimail pt Novo filtro +next felamimail pt Seguinte +next message felamimail pt mensagem seguinte +no filter felamimail pt Sem filtro +no folders found felamimail pt Nenhuma pasta encontrada +no folders were found to subscribe to! felamimail pt Nenhuma pasta encontrada para subscrição! +no folders were found to unsubscribe from! felamimail pt Nenhuma pasta encontrada para desistência de subscrição! +no highlighting is defined felamimail pt Nenhuma colorização foi definida +no messages found... felamimail pt Nenhuma mensagem encontrada... +no messages were selected. felamimail pt Nenhuma mensagem foi seleccionada. +no previous message felamimail pt Nenhuma mensagem anterior +no valid emailprofile selected!! felamimail pt Nenhum perfil válido de correio electrónico seleccionado!! +none felamimail pt Nenhum +on behalf of felamimail pt em nome de +one address is not valid felamimail pt Um endereço não é válido +only inbox felamimail pt Apenas caixa de entrada +only one window felamimail pt Apenas numa janela +only unseen felamimail pt Apenas não vistas +open all felamimail pt abrir tudo +options felamimail pt Opções +organisation felamimail pt empresa +organization felamimail pt empresa +organization name admin pt Nome da empresa +participants felamimail pt Participantes +personal information felamimail pt Informação pessoal +please select a address felamimail pt Por favor, seleccione um endereço +please select the number of days to wait between responses felamimail pt Por favor, seleccione o número de dias a esperar entre respostas +please supply the message to send with auto-responses felamimail pt Por favor, insira uma mensagem a enviar como auto-resposta +posting felamimail pt publicar +previous felamimail pt Anterior +previous message felamimail pt mensagens anterior +print it felamimail pt imprimir +print this page felamimail pt imprimir esta página +quicksearch felamimail pt Pesquisa simples +read felamimail pt Lido +reading felamimail pt A ler +recent felamimail pt recente +refresh time in minutes felamimail pt Actualizar (em minutos) +remove felamimail pt eliminar +remove immediately felamimail pt Eliminar imediatamente +rename felamimail pt Renomear +rename a folder felamimail pt Renomear uma pasta +rename folder felamimail pt Renomear pasta +renamed successfully! felamimail pt Renomeado com sucesso! +replied felamimail pt respondido +reply felamimail pt Responder +reply all felamimail pt Responder a todos +reply to felamimail pt Responder a +replyto felamimail pt Responder a +respond felamimail pt Responder +respond to mail sent to felamimail pt Responder a mensagem enviada para +return felamimail pt Voltar +return to options page felamimail pt Voltar à página de opções +right felamimail pt Direita +rule felamimail pt Regra +sat felamimail pt Sáb +save felamimail pt Guardar +save changes felamimail pt Guardar alterações +script name felamimail pt Nome do script +script status felamimail pt Estado do script +search felamimail pt Pesquisa +search for felamimail pt Pesquisar por +select felamimail pt Seleccionar +select all felamimail pt Seleccionar todos +select emailprofile felamimail pt Seleccionar perfil de correio electrónico +select folder felamimail pt Seleccionar pasta +select your mail server type admin pt Seleccionar o tipo do seu servidor de correio electrónico +send felamimail pt Enviar +send a reject message felamimail pt enviar mensagem de rejeição +sent folder felamimail pt Pasta Enviados +show header felamimail pt exibir cabeçalho +show new messages on main screen felamimail pt Exibir novas mensagens no ecrã principal +sieve settings admin pt Configurações do Sieve +signature felamimail pt Assinatura +simply click the target-folder felamimail pt Clique simplesmente na pasta de destino +size felamimail pt Tamanho +size of editor window felamimail pt Tamanho da janela para editar +size(...->0) felamimail pt Tamanho (...->0) +size(0->...) felamimail pt Tamanho (0->...) +small view felamimail pt Sumário +smtp settings admin pt Configurações do SMTP +subject felamimail pt Assunto +subject(a->z) felamimail pt Assunto (A->Z) +subject(z->a) felamimail pt Assunto (Z-->A) +submit felamimail pt Enviar +subscribe felamimail pt Subscrever +subscribed felamimail pt Subscrito +subscribed successfully! felamimail pt Subscreveu com sucesso! +sun felamimail pt Dom +table of contents felamimail pt Tabela de conteúdos +text only felamimail pt Apenas texto +the connection to the imap server failed!! felamimail pt Falha na ligação ao servidor IMAP!! +the mimeparser can not parse this message. felamimail pt O mimeparser não pode analisar estas mensagem. +then felamimail pt então +this folder is empty felamimail pt Esta pasta está vazia +this php has no imap support compiled in!! felamimail pt O PHP não tem suporte de IMAP compilado!! +thu felamimail pt Qui +to felamimail pt Para +to mail sent to felamimail pt Para mensagens enviadas para +translation preferences felamimail pt Preferências de tradução +translation server felamimail pt Servidor de tradução +trash fold felamimail pt Pasta Lixo +trash folder felamimail pt Pasta Lixo +tue felamimail pt Ter +type felamimail pt Tipo +unflagged felamimail pt desmarcado +unknown err felamimail pt Erro desconhecido +unknown error felamimail pt Erro desconhecido +unknown sender felamimail pt Remetente desconhecido +unknown user or password incorrect. felamimail pt Utilizador desconhecido ou senha incorrecta. +unread common pt Não lida +unseen felamimail pt Não vista +unselect all felamimail pt Não seleccionar tudo +unsubscribe felamimail pt Desistir de subscrição +unsubscribed felamimail pt Desistência de subscrição +unsubscribed successfully! felamimail pt Desistência de subscrição executada com sucesso! +up felamimail pt para cima +use emailadmin to create profiles felamimail pt utilizar Administração do Correio Electrónico para criar perfis +use a signature felamimail pt Utilizar uma assinatura +use a signature? felamimail pt Utilizar uma asinatura? +use addresses felamimail pt Utilizar endereços +use custom settings felamimail pt Utilizar definições personalizadas +use javascript or html addressbook? felamimail pt Utilizar livro de endereços Javascript ou HTML? +use regular expressions felamimail pt Utilizar expressões regulares +use smtp auth admin pt Utilizar autenticação SMTP +users can define their own emailaccounts admin pt Os utilizadores podem definir as suas contas de correio electrónico +vacation notice felamimail pt aviso de ausência +view full header felamimail pt Ver cabeçalho completo +view message felamimail pt Ver mensagem +viewing full header felamimail pt A ver cabeçalho completo +viewing message felamimail pt A ver mensagem +viewing messages felamimail pt A ver mensagens +wed felamimail pt Qua +welcome to %1's webmail system felamimail pt Bem-vindo ao sistema de WebMail %1 +when deleting messages felamimail pt Ao eliminar mensagens +with message felamimail pt com mensagem +with message "%1" felamimail pt com mensagem "%1" +wrap incoming text at felamimail pt Quebrar a linha do texto de entrada em +writing felamimail pt A escrever +wrote felamimail pt Escreveu +you must login first. felamimail pt É necessário entrar primeiro. diff --git a/felamimail/lang/egw_ru.lang b/felamimail/lang/egw_ru.lang new file mode 100644 index 0000000000..cc13659c27 --- /dev/null +++ b/felamimail/lang/egw_ru.lang @@ -0,0 +1,466 @@ +(no subject) felamimail ru (без темы) +(only cc/bcc) felamimail ru (только Cc/Bcc) +(separate multiple addresses by comma) felamimail ru (разделÑÑ‚ÑŒ подрÑд идущие адреÑа запÑтой) +(unknown sender) felamimail ru (неизвеÑтный отправитель) +activate felamimail ru Ðктивировать +activate script felamimail ru Ðктивировать Ñкрипт +activating by date requires a start- and end-date! felamimail ru ÐÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ð¿Ð¾ дате требует Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ñ Ð½Ð°Ñ‡Ð°Ð¹Ð»ÑŒÐ½Ð¾Ð¹ И конечной даты! +add acl felamimail ru добавить ACL +add address felamimail ru Добавить Ð°Ð´Ñ€ÐµÑ +add rule felamimail ru Добавить правило +add script felamimail ru Добавить Ñкрипт +add to %1 felamimail ru Добавить в %1 +add to address book felamimail ru добавить в адреÑную книгу +add to addressbook felamimail ru добавить в адреÑную книгу +adding file to message. please wait! felamimail ru Добавление файла в Ñообщение.ПожалуйÑта подождите. +additional info felamimail ru Ð”Ð¾Ð±Ð°Ð²Ð¾Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ. +address book felamimail ru ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð° +address book search felamimail ru ПоиÑк по адреÑной книге +after message body felamimail ru ПоÑле оÑновного ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +all address books felamimail ru Ð’Ñе адреÑные книги +all folders felamimail ru Ð’Ñе папки +all of felamimail ru вÑе из +allow images from external sources in html emails felamimail ru Разрешать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· внешних иÑточников в пиÑьмах формата HTML +allways a new window felamimail ru вÑегда новое окно +always show html emails felamimail ru Ð’Ñегда показывать пиÑьма формата HTML +and felamimail ru и +any of felamimail ru любой из +any status felamimail ru любое ÑоÑтоÑние +anyone felamimail ru хоть один +as a subfolder of felamimail ru как подпапка +attachments felamimail ru Ð’Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ +authentication required felamimail ru требуетÑÑ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ +auto refresh folder list felamimail ru Ðвтообновление ÑпиÑка папок +back to folder felamimail ru Обратно в папку +bad login name or password. felamimail ru Ðеверное Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ пароль +bad or malformed request. server responded: %s felamimail ru Ðеверный или нераÑпознанный запроÑ. Ответ Сервера: %s +bad request: %s felamimail ru Ðеверный запроÑ: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail ru ОÑновываÑÑÑŒ на вышеуказанных правилах, входÑщие ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ имет разные цвета заливки в ÑпиÑке Ñообщений. Это помогает легче определÑÑ‚ÑŒ какое пиÑьмо от кого, оÑобенно при иÑпользовании почтовых раÑÑылок. +bcc felamimail ru BCC(ÑÐºÑ€Ñ‹Ñ‚Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ) +before headers felamimail ru Перед заголовком +between headers and message body felamimail ru Между заголовком и телом ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +body part felamimail ru раздел тела +by date felamimail ru по дате +can not send message. no recipient defined! felamimail ru не могу поÑлать Ñообщение. не указаны получатели! +can't connect to inbox!! felamimail ru не могу ÑоединитьÑÑ Ñ INBOX(входÑщие) +cc felamimail ru CC(Ð¢Ð²ÐµÑ€Ð´Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ) +change folder felamimail ru Сменить папку +check message against next rule also felamimail ru Проверить Ñообщение также на ÑоответÑтвие Ñледующему правилу +checkbox felamimail ru Флажок +clear search felamimail ru очиÑтить поиÑк +click here to log back in. felamimail ru Кликните здеÑÑŒ чтобы вернутьÑÑ +click here to return to %1 felamimail ru Кликните здеÑÑŒ чтобы вернутьÑÑ Ðº %1 +close all felamimail ru закрыть вÑе +close this page felamimail ru закрыть Ñту Ñтраницу +close window felamimail ru Закрыть окно +color felamimail ru Цвет +compose felamimail ru Ðовое пиÑьмо +compose as new felamimail ru Создать как новое +compress folder felamimail ru Сжать папку +condition felamimail ru ÑоÑтоÑние +configuration felamimail ru ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ +connection dropped by imap server. felamimail ru Соединение разорвано IMAP Ñервером +contains felamimail ru Ñодержат +could not complete request. reason given: %s felamimail ru Ðе могу завершить запроÑ. Ð’Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°Ñ ÐŸÑ€Ð¸Ñ‡Ð¸Ð½Ð°: %s +could not open secure connection to the imap server. %s : %s. felamimail ru Ðе могу открыть защищенное Ñоединение Ñ Ñервером IMAP. %s : %s +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail ru CRAM-MD5 и DIGEST-MD5 требуют уÑтановленного пакета Auth_SASL. +create felamimail ru Ñоздать +create folder felamimail ru Создать папку +create sent felamimail ru Создать Отправку +create subfolder felamimail ru Создать подпапку +create trash felamimail ru Создать муÑорный Ñщик +created folder successfully! felamimail ru Папка уÑпешно Ñоздана +dark blue felamimail ru Темно-Ñиний +dark cyan felamimail ru Темно-голубой +dark gray felamimail ru Темно-Ñерый +dark green felamimail ru Темно-зеленый +dark magenta felamimail ru Темно-малиновый +dark yellow felamimail ru Темно-желтый +date(newest first) felamimail ru Дата (новые - первыми) +date(oldest first) felamimail ru Дата (Ñтарые - первыми) +days felamimail ru дни +deactivate script felamimail ru Отключить Ñкрипт +default felamimail ru По умолчанию +default signature felamimail ru подпиÑÑŒ по умолчанию +default sorting order felamimail ru ПорÑдок Ñортировки по умолчанию +delete all felamimail ru Ñтереть вÑе +delete folder felamimail ru Удалить папку +delete script felamimail ru удалить Ñкрипт +delete selected felamimail ru Удалить выбранное +delete selected messages felamimail ru удалить отмеченные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +deleted felamimail ru Ñтерто +deleted folder successfully! felamimail ru Папка уÑпешно удалена! +deleting messages felamimail ru Удаление ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +disable felamimail ru Отключено +discard felamimail ru отклонить +discard message felamimail ru отклонить Ñообщение +display message in new window felamimail ru Показать Ñообщение в новом окне +display messages in multiple windows felamimail ru Показать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² неÑкольких окнах +display of html emails felamimail ru Показывать пиÑьма в формате HTML +display only when no plain text is available felamimail ru Показывать только еÑли не доÑтупен обычный тект +display preferences felamimail ru Показать ÐаÑтройки +displaying html messages is disabled felamimail ru показ Ñообщений HTML отключен +do it! felamimail ru так их! +do not use sent felamimail ru Ðе иÑпользовать Sent (Отправленные) +do not use trash felamimail ru Ðе иÑпользовать Trash (Корзина) +do not validate certificate felamimail ru не проверÑÑ‚ÑŒ Ñертификат +do you really want to delete the '%1' folder? felamimail ru Ð’Ñ‹ правда желаете удалить папку %1? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail ru Ð’Ñ‹ дейÑтвительно хотите удалить выбранные наÑтройки Учетной запиÑи и ÑвÑзанного Идентификатора. +do you really want to delete the selected signatures? felamimail ru Ð’Ñ‹ правда желаете удалить выбранную подпиÑÑŒ? +do you really want to move the selected messages to folder: felamimail ru что желаете перемеÑтить выбранные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð² папку: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail ru Желаете ли вы получать Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° подтверждение прежде чем выбранные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ перемещены в другую папку? +does not contain felamimail ru не Ñодержит +does not exist on imap server. felamimail ru не ÑущеÑтвует на Ñервере IMAP. +does not match felamimail ru не Ñовпадает +does not match regexp felamimail ru не Ñовпадает regexp +don't use draft folder felamimail ru Ðе иÑпользовать папку Draft (Черновики) +don't use sent felamimail ru Ðе иÑпользовать Sent (Отправленные) +don't use template folder felamimail ru Ðе иÑпользовать папку шаблонов +don't use trash felamimail ru Ðе иÑпользовать Trash (Корзина) +dont strip any tags felamimail ru не ÑбраÑывать никакие Ñ‚Ñги +down felamimail ru вниз +download felamimail ru загрузить(Ñкачать) +download this as a file felamimail ru Скачать Ñтот файл +draft folder felamimail ru Папка черновиков +drafts felamimail ru Черновики +e-mail felamimail ru E-mail +e-mail address felamimail ru Ð°Ð´Ñ€ÐµÑ Ñл. почты +e-mail folders felamimail ru папки Ñл. почты +edit email forwarding address felamimail ru редактировать Ð°Ð´Ñ€ÐµÑ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñл. почты +edit filter felamimail ru Редактировать фильтр +edit rule felamimail ru редактировать правило +edit selected felamimail ru Редактировать выбранное +edit vacation settings felamimail ru редактировать наÑтройки отказа +editor type felamimail ru Тип редактора +email address felamimail ru ÐÐ´Ñ€ÐµÑ Ñл. почты +email forwarding address felamimail ru Ð°Ð´Ñ€ÐµÑ Ð¿ÐµÑ€ÐµÐ½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñл. почты +email notification update failed felamimail ru неудачное обновление почтового ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ +email signature felamimail ru ПодпиÑÑŒ Ñл. пиÑьма +emailaddress felamimail ru Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ñ‡Ñ‚Ñ‹ +empty trash felamimail ru очиÑтить корзину +enable felamimail ru включить +encrypted connection felamimail ru зашифрованное Ñоединение +enter your default mail domain ( from: user@domain ) admin ru Ведите ваш почтовый домен по умолчанию (От: user@domain) +enter your imap mail server hostname or ip address admin ru Укажите Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° или IP Ð°Ð´Ñ€ÐµÑ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñервера IMAP +enter your sieve server hostname or ip address admin ru Укажите Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° или IP Ð°Ð´Ñ€ÐµÑ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñервера SIEVE +enter your sieve server port admin ru Укажите порт Ñервера SIEVE +enter your smtp server hostname or ip address admin ru Укажите Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° или IP Ð°Ð´Ñ€ÐµÑ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñервера SMTP +enter your smtp server port admin ru Укажите порт Ñервера SMTP +error felamimail ru ОШИБКР+error connecting to imap serv felamimail ru Ошибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ñервером IMAP +error connecting to imap server. %s : %s. felamimail ru Ошибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ñервером IMAP. %s : %s. +error connecting to imap server: [%s] %s. felamimail ru Ошибка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ñервером IMAP: [%s] %s. +error opening felamimail ru Ошибка Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ +error: could not save message as draft felamimail ru Ошибка: Ðе могу Ñохранить Сообщение как Черновик +every felamimail ru каждый +every %1 days felamimail ru каждые %1 дни +expunge felamimail ru Вычеркнуть +extended felamimail ru раÑширенный +felamimail common ru Почта FelaMi +file into felamimail ru в файл +files felamimail ru файлы +filter active felamimail ru фильтр активирован +filter name felamimail ru Ð˜Ð¼Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð° +filter rules common ru правила Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ +first name felamimail ru Ð˜Ð¼Ñ +flagged felamimail ru отмечено флажком +flags felamimail ru Флажки +folder felamimail ru папка +folder acl felamimail ru ACL папки +folder name felamimail ru Ð˜Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸ +folder path felamimail ru Путь Папки +folder preferences felamimail ru ÐаÑтройки Папки +folder settings felamimail ru УÑтановки папки +folder status felamimail ru СоÑтоÑние папки +folderlist felamimail ru СпиÑок папок +foldername felamimail ru Ð˜Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸ +folders felamimail ru Папки +folders created successfully! felamimail ru Папки Ñозданы уÑпешно! +follow felamimail ru Ñледовать +for mail to be send - not functional yet felamimail ru Ð”Ð»Ñ Ð¿Ð¸Ñем подготовленных к отправке - пока не работает +for received mail felamimail ru Ð”Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñтого пиÑьма +forward felamimail ru ПереÑлать +forward as attachment felamimail ru переÑлать как вложение +forward inline felamimail ru переÑлать как еÑÑ‚ÑŒ +forward messages to felamimail ru ПереÑлать ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +forward to felamimail ru переÑлать +forward to address felamimail ru переÑлать на Ð°Ð´Ñ€ÐµÑ +forwarding felamimail ru ПереÑылка +found felamimail ru Ðайдено +fri felamimail ru Птн +from felamimail ru От +from(a->z) felamimail ru От (Ð->Я) +from(z->a) felamimail ru От (Я->Ð) +full name felamimail ru Полное Ð¸Ð¼Ñ +greater than felamimail ru больше чем +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail ru Чтобы узнать больше о Squirrelmail поÑетите Ñтраницу www.felamimail.org.
    +header lines felamimail ru Строки заголовка +hide header felamimail ru Скрыть заголовок +hostname / address felamimail ru Ð¸Ð¼Ñ ÐºÐ¾Ð¼Ð¿ÑŒÑŽÑ‚ÐµÑ€Ð° / Ð°Ð´Ñ€ÐµÑ +how to forward messages felamimail ru как перенаправлÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +html felamimail ru HTML +icons and text felamimail ru Пиктограммы и подпиÑи +icons only felamimail ru Только пиктограммы +identifying name felamimail ru Ð˜Ð¼Ñ Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ +identity felamimail ru Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ +if felamimail ru ЕСЛИ +if from contains felamimail ru еÑли поле ОТ Ñодержит +if mail header felamimail ru еÑли заголовок пиÑьма +if message size felamimail ru еÑли размер ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +if shown, which folders should appear on main screen felamimail ru еÑли показано, какие папки Ñледует выводить на оÑновной Ñкран +if subject contains felamimail ru еÑли поле Предмет Ñодержит +if to contains felamimail ru еÑли поле Кому Ñодержит +if using ssl or tls, you must have the php openssl extension loaded. felamimail ru При иÑпользовании SSL либо TLS, у Ð²Ð°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ быть загружено раÑширение PHP openssl +illegal folder name. please select a different name. felamimail ru ÐедопуÑтимое Ð¸Ð¼Ñ Ð¿Ð°Ð¿ÐºÐ¸. ПожадуйÑта выберите другое. +imap felamimail ru IMAP +imap server felamimail ru Сервер IMAP +imap server address felamimail ru ÐÐ´Ñ€ÐµÑ Ð¡ÐµÑ€Ð²ÐµÑ€Ð° IMAP +imap server closed the connection. felamimail ru Сервер IMAP разорвал Ñоединение. +imap server closed the connection. server responded: %s felamimail ru Сервер IMAP разорвал Ñоединение. Ответ Ñервера: %s +imap server password felamimail ru пароль Ñервера IMAP +imap server type felamimail ru Тип Сервера IMAP +imap server username felamimail ru Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñервера IMAP +imaps authentication felamimail ru ÐÐ²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ IMAPS +imaps encryption only felamimail ru Шифрование только IMAPS +in felamimail ru в +inbox felamimail ru ВходÑщие (INBOX) +incoming mail server(imap) felamimail ru Сервер входÑщих Ñообщений (IMAP) +index order felamimail ru ПорÑдок ИндекÑации +info felamimail ru Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ +invalid user name or password felamimail ru Ðеверно указаны Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ð»Ð¸ пароль +javascript felamimail ru JavaScript +jumping to end felamimail ru перейти в конец +jumping to start felamimail ru перейти к началу +junk felamimail ru Спам +keep a copy of the message in your inbox felamimail ru хранить копию Ñообщений в вашей папке ВходÑщие (inbox) +keep local copy of email felamimail ru хранить локальную копию Ñл. пиÑьма +kilobytes felamimail ru килобайт +language felamimail ru Язык +last name felamimail ru Ð¤Ð°Ð¼Ð¸Ð»Ð¸Ñ +left felamimail ru Левый +less felamimail ru меньше +less than felamimail ru меньше чем +light gray felamimail ru Светло-Ñерый +list all felamimail ru Показать вÑе +loading felamimail ru загружаю +location of buttons when composing felamimail ru РаÑположение кнопок при Ñоздании пиÑьма +mail server login type admin ru Тип входа Ñервера почты +mail settings felamimail ru ÐаÑтройки почты +mainmessage felamimail ru оÑновное Ñообщение +manage email accounts and identities common ru УправлÑÑ‚ÑŒ учетными запиÑÑми Ñлектропочты и идентификациÑми +manage emailaccounts common ru Управление учетными запиÑÑми Ñл. почты +manage emailfilter / vacation preferences ru УправлÑÑ‚ÑŒ Фильтром/Отказом +manage folders common ru Управление папками +manage sieve common ru Управлени Ñкриптами Sieve +manage signatures felamimail ru Управление подпиÑÑми +mark as deleted felamimail ru Отметить как Ñтертое +mark messages as felamimail ru Отметить выбранное Ñообщение как +mark selected as flagged felamimail ru Отметить флажком +mark selected as read felamimail ru Отметить как прочтенное +mark selected as unflagged felamimail ru СнÑÑ‚ÑŒ флажок +mark selected as unread felamimail ru Отметить как не прочтенное +match felamimail ru Совпадает +matches felamimail ru ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ +matches regexp felamimail ru Ñаовпадает Ñ regexp +max uploadsize felamimail ru макÑ. размер публикации +message highlighting felamimail ru ПодÑветка Сообщений +message list felamimail ru СпиÑок Сообщений +messages felamimail ru ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +mon felamimail ru Пнд +move felamimail ru перемеÑтить +move messages felamimail ru перемеÑтить ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +move to felamimail ru перемеÑтить выбранное в +move to trash felamimail ru ПеремеÑтить в корзину +moving messages to felamimail ru Перемещение Ñообщений в +name felamimail ru Ð˜Ð¼Ñ +never display html emails felamimail ru Ðикогда не показывать Ñл. пиÑьма в формате HTML +new common ru Ðовое +new filter felamimail ru Ðовый фильтр +next felamimail ru Следующее +next message felamimail ru Следующее Ñообщение +no active imap server found!! felamimail ru Ðе обнаружен дейÑтвующий Ñервер IMAP +no encryption felamimail ru без ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ +no filter felamimail ru Без Фильтра +no folders found felamimail ru Папки не найдены +no folders were found to subscribe to! felamimail ru Ðе обнаружено папок Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки! +no folders were found to unsubscribe from! felamimail ru Ðе обнаружено папок Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ°Ð·Ð° от подпиÑки! +no highlighting is defined felamimail ru ПодÑветка не определена +no message returned. felamimail ru Ðет ответного ÑообщениÑ. +no messages found... felamimail ru ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ найдены... +no messages selected, or lost selection. changing to folder felamimail ru Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ выбраны либо выбор утерÑн. Переход на папку +no messages were selected. felamimail ru Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ выбраны +no plain text part found felamimail ru не найдена текÑÑ‚Ð¾Ð²Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ +no previous message felamimail ru нет предыдущего Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +no recipient address given! felamimail ru Ðе указан Ð°Ð´Ñ€ÐµÑ Ð¿Ð¾Ð»ÑƒÑ‡Ð°Ñ‚ÐµÐ»Ñ! +no signature felamimail ru без подпиÑи +no subject given! felamimail ru Тема не указана! +no supported imap authentication method could be found. felamimail ru Ðе может быть найден поддерживаемый метод IMAP авторизации. +no valid emailprofile selected!! felamimail ru Ðе выбран правильный профиль Ñл. почты!! +none felamimail ru ничего +on felamimail ru на +on behalf of felamimail ru от имени +one address is not valid felamimail ru Один из адреÑов неверен +only inbox felamimail ru Только ВходÑщие (INBOX) +only one window felamimail ru Только одно окно +only unseen felamimail ru Только не проÑмотренные +open all felamimail ru открыть вÑе +options felamimail ru ÐаÑтройки +or felamimail ru или +organisation felamimail ru ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ +organization felamimail ru ÐžÑ€Ð³Ð°Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ +organization name admin ru Ðазвание организации +original message felamimail ru иÑходное Ñообщение +outgoing mail server(smtp) felamimail ru Ñервер иÑходÑщих Ñообщений (SMTP) +participants felamimail ru ПодпиÑчики +personal information felamimail ru Ð›Ð¸Ñ‡Ð½Ð°Ñ Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ +please select a address felamimail ru ПожалуйÑта выберите Ð°Ð´Ñ€ÐµÑ +please select the number of days to wait between responses felamimail ru ПожалуйÑта выборите количеÑтво дней Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ ответами +please supply the message to send with auto-responses felamimail ru ПожалуйÑта введите Ñообщение Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ автоответчиком +port felamimail ru порт +posting felamimail ru Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ +previous felamimail ru Предыдущий +previous message felamimail ru Предыдущее Ñообщение +print it felamimail ru раÑпечатать +print this page felamimail ru раÑпечатать Ñтраницу +printview felamimail ru предвартельный проÑмотр +quicksearch felamimail ru БыÑтрый поиÑк +read felamimail ru прочитано +reading felamimail ru чтение +receive notification felamimail ru Получать Ð½Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ +recent felamimail ru недавнее +refresh time in minutes felamimail ru Ð’Ñ€ÐµÐ¼Ñ Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð² минутах +reject with felamimail ru отклонить Ñ +remove felamimail ru Удалить +remove immediately felamimail ru Удалить немедленно +rename felamimail ru Переименовать +rename a folder felamimail ru Переименовать Папку +rename folder felamimail ru Переименовать папку +renamed successfully! felamimail ru УÑпешно переименовано! +replied felamimail ru был ответ +reply felamimail ru Ответить +reply all felamimail ru Ответить вÑем +reply to felamimail ru Ответить +replyto felamimail ru Ответить +respond felamimail ru Ответ +respond to mail sent to felamimail ru ответить на пиÑьмо поÑланное на +return felamimail ru ВернутьÑÑ +return to options page felamimail ru ВернутьÑÑ Ð½Ð° Ñтраницу наÑтроек +right felamimail ru Вправо +row order style felamimail ru порÑдок Ñортировки Ñтрок +rule felamimail ru Правило +sat felamimail ru Сбт +save felamimail ru Сохранить +save as draft felamimail ru Ñохранить как черновик +save as infolog felamimail ru Ñохранить как Ñлемент ИнфоЖурнала +save changes felamimail ru Ñохранить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ +save message to disk felamimail ru Ñохранить Ñообщение на диÑк +script name felamimail ru Ð¸Ð¼Ñ Ñкрипта +script status felamimail ru ÑоÑтоÑние Ñкрипта +search felamimail ru ПоиÑк +search for felamimail ru ИÑкать +select felamimail ru Выбрать +select all felamimail ru Выбрать Ð’Ñе +select emailprofile felamimail ru Выбрать профиль Ñл. почты +select folder felamimail ru выбрать папку +select your mail server type admin ru Выберите тип вашего Ñервера почты +send felamimail ru Отправить +send a reject message felamimail ru Отправить отказ +sent felamimail ru Отправлено +sent folder felamimail ru Отправленные +server supports mailfilter(sieve) felamimail ru Ñервер поддерживает фильтрацию почты (sieve) +set as default felamimail ru УÑтановить по умолчанию +show header felamimail ru Показать заголовок +show new messages on main screen felamimail ru Показывать новые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° оÑновном Ñкране +sieve script name felamimail ru название Ñкрипта sieve +sieve settings admin ru ÐаÑтройки Sieve +signatur felamimail ru ПодпиÑÑŒ +signature felamimail ru ПодпиÑÑŒ +simply click the target-folder felamimail ru ПроÑтой щелчек на целевой папке +size felamimail ru Размер +size of editor window felamimail ru Размер окна Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ +size(...->0) felamimail ru Размер (...->0) +size(0->...) felamimail ru Размер (0->...) +skipping forward felamimail ru Прокрутить вперед +skipping previous felamimail ru прокрутка предыдущих(?) +small view felamimail ru проÑмотр в небольшом окне +smtp settings admin ru Параметры SMTP +start new messages with mime type plain/text or html? felamimail ru новое Ñообщение начинать как текÑÑ‚ или html? +subject felamimail ru Тема +subject(a->z) felamimail ru Тема (Ð->Я) +subject(z->a) felamimail ru Тема (Я->Ð) +submit felamimail ru Отправить +subscribe felamimail ru ПодпиÑатьÑÑ +subscribed felamimail ru ПодпиÑано +subscribed successfully! felamimail ru ПодпиÑалиÑÑŒ уÑпешно! +sun felamimail ru Ð’Ñкр +system signature felamimail ru ÑиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑŒ +table of contents felamimail ru Содержание +template folder felamimail ru Папка шаблонов +templates felamimail ru Шаблоны +text only felamimail ru Только текÑÑ‚ +text/plain felamimail ru проÑтой текÑÑ‚ +the connection to the imap server failed!! felamimail ru СоединитьÑÑ Ñ Ñервером IMAP не удалоÑÑŒ!! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail ru Сервер IMAP не Ñообщил о поддержке выбранного метода авторизации. ПожалуйÑта ÑвÑжитеÑÑŒ Ñ ÑиÑтемным админиÑтратором. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail ru Отправитель ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð·Ð°Ñ‚Ñ€ÐµÐ±Ð¾Ð²Ð°Ð» ответ Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ„Ð°ÐºÑ‚Ð° Ð¿Ñ€Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð²Ð°Ð¼Ð¸ ÑообщениÑ. Ð’Ñ‹ хотите поÑлать подтверждение о прочтении? +the mimeparser can not parse this message. felamimail ru Обработчик MIME не может обработать Ñто Ñообщение.и +then felamimail ru ТОГДР+this folder is empty felamimail ru ЭТРПÐПКРПУСТР+this php has no imap support compiled in!! felamimail ru Эта верÑÐ¸Ñ PHP Ñобрана без поддержки IMAP!! +thu felamimail ru Чт +to felamimail ru Кому +to mail sent to felamimail ru отправить Ñообщение получателю +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail ru Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ TLS, у Ð²Ð°Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ работать PHP верÑии 5.1.0 или выше. +translation preferences felamimail ru ÐаÑтройки перевода +translation server felamimail ru Сервер перевода +trash felamimail ru Корзина +trash fold felamimail ru Папка Корзина +trash folder felamimail ru Папка Корзина +tue felamimail ru Ð’Ñ‚ +type felamimail ru тип +unexpected response from server to authenticate command. felamimail ru ÐепредуÑмотренный ответ Ñервера на команду AUTHENTICATE +unexpected response from server to digest-md5 response. felamimail ru ÐепредуÑмотренный ответ Ñервера на Ñообщение Digest-MD5 +unexpected response from server to login command. felamimail ru ÐепредуÑмотренный ответ Ñервера на команду LOGIN +unflagged felamimail ru не отмечено флажком +unknown err felamimail ru ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° +unknown error felamimail ru ÐеизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° +unknown imap response from the server. server responded: %s felamimail ru ÐеизвеÑтный ответ Ñерера IMAP. Сервер ответил: %s +unknown sender felamimail ru ÐеизвеÑтный отправитель +unknown user or password incorrect. felamimail ru ÐеизвеÑтный пользователь либо неверный пароль +unread common ru Ðе прочитано +unseen felamimail ru Ðе проÑмотрено +unselect all felamimail ru СнÑÑ‚ÑŒ вÑе отметки +unsubscribe felamimail ru ОтказатьÑÑ Ð¾Ñ‚ подпиÑки +unsubscribed felamimail ru Отказ от подпиÑки +unsubscribed successfully! felamimail ru Отказ от подпиÑки удалÑÑ! +up felamimail ru вверх +updating message status felamimail ru обновление ÑоÑтоÑÐ½Ð¸Ñ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +updating view felamimail ru обновление окна проÑмотра +use emailadmin to create profiles felamimail ru иÑпользуйте EmailAdmin Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ +use a signature felamimail ru ИÑпользовать подпиÑÑŒ +use a signature? felamimail ru ИÑпользовать подпиÑÑŒ? +use addresses felamimail ru ИÑпользовать ÐдреÑа +use custom identities felamimail ru иÑпользовать пользовательÑкую идентификацию +use custom settings felamimail ru ИÑпользовать ПользовательÑкие ÐаÑтройки +use regular expressions felamimail ru иÑпользоватьраÑширенные правила (reg exp) +use smtp auth admin ru ИÑпользовать авторизацию по SMTP +users can define their own emailaccounts admin ru Пользователь может назначать Ñвои ÑобÑтвенные учетные запиÑи Ñл. почты. +vacation notice common ru уведомление об отказе +vacation notice is active felamimail ru Уведомление об отказе активно +vacation start-date must be before the end-date! felamimail ru Дата начала отказа должно быть РÐÐЬШЕ даты окончаниÑ! +validate certificate felamimail ru проверить Ñертификат +view full header felamimail ru ПроÑмотр заголовка полноÑтью +view header lines felamimail ru ПроÑмотр Ñтрок заголовка +view message felamimail ru ПроÑмотреть Ñообщение +viewing full header felamimail ru ПроÑмотр заголовка полноÑтью +viewing message felamimail ru ПроÑмотр ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ +viewing messages felamimail ru ПроÑмотр Ñообщений +wed felamimail ru Ср +when deleting messages felamimail ru При удалении Ñообщений +with message felamimail ru Ñ Ñообщением +with message "%1" felamimail ru Ñ Ñообщением "%1" +wrap incoming text at felamimail ru Перевод Ñтрок поÑтупающего текÑта на +writing felamimail ru запиÑываю +wrote felamimail ru запиÑано +you can use %1 for the above start-date and %2 for the end-date. felamimail ru Ð’Ñ‹ можете иÑпользовать %1 в качеÑтве даты начала и %2 в качеÑтве даты окончаниÑ. +you have received a new message on the felamimail ru Ð’Ñ‹ получили новое Ñообщение на +your message to %1 was displayed. felamimail ru Ваше Ñообщение получателю %1 было показано. diff --git a/felamimail/lang/egw_sk.lang b/felamimail/lang/egw_sk.lang new file mode 100644 index 0000000000..d0a5e24dbc --- /dev/null +++ b/felamimail/lang/egw_sk.lang @@ -0,0 +1,514 @@ +%1 is not writable by you! felamimail sk na %1 NEmáte právo zápisu! +(no subject) felamimail sk (bez predmetu) +(only cc/bcc) felamimail sk (iba Kópia/Skrytá kópia) +(separate multiple addresses by comma) felamimail sk (oddeliÅ¥ viacero adries Äiarkou) +(unknown sender) felamimail sk (neznámy odosielateľ) +3paneview: if you want to see a preview of a mail by single clicking onto the subject, set the height for the message-list and the preview area here (300 seems to be a good working value). the preview will be displayed at the end of the message list on demand (click). felamimail sk 3-okenný pohľad: Ak si želáte vidieÅ¥ náhľad správy pomcou jednoduchého kliknutia na predmet, nastavte si tu výšku zoznamu správ a oblasti pre náhľad (300 sa zdá byÅ¥ dobre fungujúcou hodnotou). Náhľad sa zobrazí na konci zoznamu správ na požiadanie (kliknutie). +aborted felamimail sk zruÅ¡ené +activate felamimail sk AktivovaÅ¥ +activate script felamimail sk aktivovaÅ¥ skript +activating by date requires a start- and end-date! felamimail sk Aktivácia dátumom vyžaduje dátum zaÄiatku AJ konca! +add acl felamimail sk PridaÅ¥ ACL +add address felamimail sk PridaÅ¥ adresu +add rule felamimail sk PridaÅ¥ pravidlo +add script felamimail sk PridaÅ¥ skript +add to %1 felamimail sk PridaÅ¥ do %1 +add to address book felamimail sk PridaÅ¥ do adresára +add to addressbook felamimail sk PridaÅ¥ do adresára +adding file to message. please wait! felamimail sk Pripájam súbor k správe. Prosím Äakajte. +additional info felamimail sk ÄŽalÅ¡ie info +address book felamimail sk Adresár +address book search felamimail sk Hľadanie v Adresári +after message body felamimail sk Za telom správy +all address books felamimail sk VÅ¡etky Adresáre +all folders felamimail sk VÅ¡etky prieÄinky +all messages in folder felamimail sk vÅ¡etky správy v prieÄinku +all of felamimail sk vÅ¡etko z +allow images from external sources in html emails felamimail sk PovoliÅ¥ v HTML E-mailoch obrázky z externých zdrojov +allways a new window felamimail sk Vždy nové okno +always show html emails felamimail sk Vždy zobraziÅ¥ HTML správy +and felamimail sk a +any of felamimail sk ktorýkoľvek z +any status felamimail sk ktorýkoľvek stav +anyone felamimail sk ktokoľvek +as a subfolder of felamimail sk ako podprieÄinok (Äoho) +attach felamimail sk PriložiÅ¥ +attachments felamimail sk Prílohy +authentication required felamimail sk požaduje sa overenie +auto refresh folder list felamimail sk Automaticky obnoviÅ¥ zoznam prieÄinkov +back to folder felamimail sk Naspäť do prieÄinka +bad login name or password. felamimail sk Chybné prihlasovacie meno alebo heslo. +bad or malformed request. server responded: %s felamimail sk Chybná požiadavka. OdpoveÄ servera: %s +bad request: %s felamimail sk Chybná požiadavka: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail sk Na základe zadaných kritérií, príchodzie správy môžu maÅ¥ rozliÄnú farbu pozadia v zozname správ. Je to pomôcka pre ľahÅ¡ie rozlíšenie odosielateľa, najmä v prípade mailing listov. +bcc felamimail sk Skrytá kópia +before headers felamimail sk Pred hlaviÄkou +between headers and message body felamimail sk Medzi hlaviÄkou a telom správy +body part felamimail sk ÄasÅ¥ tela +by date felamimail sk podľa dátumu +can not send message. no recipient defined! felamimail sk Nepodarilo sa odoslaÅ¥ správu. Nebol zadaný adresát! +can't connect to inbox!! felamimail sk nedá sa pripojiÅ¥ k DoruÄenej poÅ¡te! +cc felamimail sk Kópia +change folder felamimail sk ZmeniÅ¥ prieÄinok +check message against next rule also felamimail sk skontrolovaÅ¥ správu aj voÄi ÄalÅ¡iemu pravidlu +checkbox felamimail sk ZaÄiarkávacie políÄko +clear search felamimail sk vyÄistiÅ¥ hľadanie +click here to log back in. felamimail sk Ak sa chcete znovu prihlásiÅ¥, kliknite sem. +click here to return to %1 felamimail sk Ak sa chcete vrátiÅ¥ do %1, kliknite sem +close all felamimail sk zavrieÅ¥ vÅ¡etko +close this page felamimail sk zavrieÅ¥ túto stránku +close window felamimail sk ZavrieÅ¥ okno +color felamimail sk Farba +compose felamimail sk Nová správa +compose as new felamimail sk vytvoriÅ¥ ako nové +compress folder felamimail sk ZhutniÅ¥ prieÄinok +condition felamimail sk okolnosÅ¥ +configuration felamimail sk Konfigurácia +configure a valid imap server in emailadmin for the profile you are using. felamimail sk Nakonfigurujte v emailadmin platný IMAP server pre profil, ktorý používate. +connection dropped by imap server. felamimail sk Spojenie preruÅ¡ené IMAP serverom. +contact not found! felamimail sk Kontakt sa nenaÅ¡iel! +contains felamimail sk obsahuje +copy or move messages? felamimail sk KopírovaÅ¥ alebo presunúť správy? +copying messages to felamimail sk Kopírujem správy do +could not complete request. reason given: %s felamimail sk Nepodarilo sa dokonÄiÅ¥ požiadavku. Dôvod: %s +could not import message: felamimail sk Nepodarilo sa importovaÅ¥ správu: +could not open secure connection to the imap server. %s : %s. felamimail sk Nepodarilo sa nadviazaÅ¥ zabezpeÄené spojenie k IMAP serveru. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail sk CRAM-MD5 alebo DIGEST-MD5 vyžaduje, aby bol nainÅ¡talovaný balík Auth_SASL. +create felamimail sk VytvoriÅ¥ +create folder felamimail sk VytvoriÅ¥ prieÄinok +create sent felamimail sk VytvoriÅ¥ [Odoslaná poÅ¡ta] +create subfolder felamimail sk VytvoriÅ¥ podprieÄinok +create trash felamimail sk VytvoriÅ¥ [Odpadkový kôš] +created folder successfully! felamimail sk PrieÄinok vytvorený! +dark blue felamimail sk Tmavá modrá +dark cyan felamimail sk Tmavá zelenomodrá +dark gray felamimail sk Tmavá sivá +dark green felamimail sk Tmavá zelená +dark magenta felamimail sk Tmavá purpurová +dark yellow felamimail sk Tmavá žltá +date(newest first) felamimail sk Dátum (novÅ¡ie na zaÄiatok) +date(oldest first) felamimail sk Dátum (starÅ¡ie na zaÄiatok) +days felamimail sk dni +deactivate script felamimail sk deaktivovaÅ¥ skript +default felamimail sk predvolené +default signature felamimail sk predvolený podpis +default sorting order felamimail sk Predvolené triedenie +delete all felamimail sk odstrániÅ¥ vÅ¡etko +delete folder felamimail sk OdstrániÅ¥ prieÄinok +delete script felamimail sk odstrániÅ¥ skript +delete selected felamimail sk OdstrániÅ¥ oznaÄené +delete selected messages felamimail sk odstrániÅ¥ oznaÄené správy +deleted felamimail sk Odstránené +deleted folder successfully! felamimail sk PrieÄinok bol odstránený! +deleting messages felamimail sk Odstraňujem správy +disable felamimail sk Vypnúť +disable ruler for separation of mailbody and signature when adding signature to composed message (this is not according to rfc).
    if you use templates, this option is only applied to the text part of the message. felamimail sk Zakázať pravítko oddeľujúce telo správy od podpisu, pri pridávaní podpisu do písanej správy (toto nie je v súlade s RFC).
    Ak používate Å¡ablóny, táto voľba sa uplatní len na textovú ÄasÅ¥ správy. +discard felamimail sk ZahodiÅ¥ +discard message felamimail sk zahodiÅ¥ správu +display message in new window felamimail sk ZobraziÅ¥ správu v novom okne +display messages in multiple windows felamimail sk ZobraziÅ¥ správy vo viacerých oknách +display of html emails felamimail sk Zobrazovanie HTML správ +display only when no plain text is available felamimail sk ZobraziÅ¥ iba keÄ nie je poruke Äistý neformátovaný text +display preferences felamimail sk Nastavenia zobrazovania +displaying html messages is disabled felamimail sk Zobrazovanie HTML správ je vypnuté +do it! felamimail sk Vykonaj! +do not use sent felamimail sk NepoužívaÅ¥ [Odoslana poÅ¡ta] +do not use trash felamimail sk NepoužívaÅ¥ [Odpadkový kôš] +do not validate certificate felamimail sk NepotvrdiÅ¥ certifikát +do you really want to delete the '%1' folder? felamimail sk Naozaj chcete odstrániÅ¥ prieÄinok '%1'? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail sk Naozaj chcete odstrániÅ¥ vybrané nastavenia úÄtu a súvisiacu Identitu? +do you really want to delete the selected signatures? felamimail sk Naozaj chcete odstrániÅ¥ oznaÄené podpisy? +do you really want to move or copy the selected messages to folder: felamimail sk SkutoÄne si želáte presunúť alebo kopírovaÅ¥ vybrané správy do prieÄinka: +do you really want to move the selected messages to folder: felamimail sk Ste si istý, že chcete presunúť vybrané správy do prieÄinka: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail sk VyžadovaÅ¥ potvrdenie pred presunutím vybraných správ do iného prieÄinka? +do you want to prevent the editing/setup for forwarding of mails via settings (, even if sieve is enabled)? felamimail sk ZabrániÅ¥ úpravám/nastaveniam pre preposielanie poÅ¡ty pomocou nastavení (, aj keÄ je povolený SIEVE)? +do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? felamimail sk ZabrániÅ¥ úpravám/nastaveniam pre filtrovacie pravidlá (, aj keÄ je povolený SIEVE)? +do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if sieve is enabled)? felamimail sk ZabrániÅ¥ úpravám/nastaveniam pre e-mailové upozornenia na iné e-mailové adresy (, aj keÄ je povolený SIEVE)? +do you want to prevent the editing/setup of the absent/vacation notice (, even if sieve is enabled)? felamimail sk ZabrániÅ¥ úpravám/nastaveniam pre oznámenia o absencii/dovolenke (, aj keÄ je povolený SIEVE)? +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail sk ZabrániÅ¥ správe prieÄinkov (vytváranie, prístupové práva A Älenstvo)? +does not contain felamimail sk neobsahuje +does not exist on imap server. felamimail sk neexistuje na IMAP serveri. +does not match felamimail sk nezodpovedá +does not match regexp felamimail sk nezodpovedá regulárnemu výrazu +don't use draft folder felamimail sk NepoužívaÅ¥ prieÄinok návrhov +don't use sent felamimail sk NepoužívaÅ¥ [Odoslana poÅ¡ta] +don't use template folder felamimail sk NepoužívaÅ¥ [Å ablóny] +don't use trash felamimail sk NepoužívaÅ¥ [Odpadkový kôš] +dont strip any tags felamimail sk neodstraňovaÅ¥ znaÄky +down felamimail sk dole +download felamimail sk StiahnuÅ¥ +download this as a file felamimail sk StiahnuÅ¥ to do súboru +draft folder felamimail sk PrieÄinok návrhov +drafts felamimail sk Návrhy +e-mail felamimail sk E-Mail +e-mail address felamimail sk E-mailová adresa +e-mail folders felamimail sk E-mailové prieÄinky +edit email forwarding address felamimail sk upraviÅ¥ preposielaciu adresu E-mailu +edit filter felamimail sk UpraviÅ¥ filter +edit rule felamimail sk upraviÅ¥ pravidlo +edit selected felamimail sk UpraviÅ¥ vybrané +edit vacation settings felamimail sk upraviÅ¥ nastavenia vyprázdňovania +editor type felamimail sk Typ editora +email address felamimail sk E-mailová adresa +email forwarding address felamimail sk preposielacia adresa E-mailu +email notification update failed felamimail sk zlyhala e-mailová aktualizácia upozornenia +email signature felamimail sk E-mailový podpis +emailaddress felamimail sk E-mailová adresa +empty trash felamimail sk VyprázdniÅ¥ Odpadkový kôš +enable felamimail sk Zapnúť +encrypted connection felamimail sk Å¡ifrované spojenie +enter your default mail domain ( from: user@domain ) admin sk ZadaÅ¥ predvolenú poÅ¡tovú doménu (Z tvaru: používateľ@doména) +enter your imap mail server hostname or ip address admin sk Zadajte názov (hostname) alebo IP vášho IMAP servera +enter your sieve server hostname or ip address admin sk Zadajte názov (hostname) alebo IP vášho SIEVE servera +enter your sieve server port admin sk Zadajte port vášho SIEVE servera +enter your smtp server hostname or ip address admin sk Zadajte názov (hostname) alebo IP vášho SMTP servera +enter your smtp server port admin sk Zadajte port vášho SMTP servera +entry saved felamimail sk Položka bola uložená +error felamimail sk CHYBA +error connecting to imap serv felamimail sk Chyba poÄas pripájania na IMAP server +error connecting to imap server. %s : %s. felamimail sk Chyba poÄas pripájania k IMAP serveru. %s : %s. +error connecting to imap server: [%s] %s. felamimail sk Chyba poÄas pripájania k IMAP serveru: [%s] %s. +error creating rule while trying to use forward/redirect. felamimail sk Chyba pri vytváraní pravidla pri pokuse o preposlanie/presmerovanie. +error opening felamimail sk Chyba pri otváraní +error saving %1! felamimail sk Chyba poÄas ukladania %1! +error: felamimail sk Chyba: +error: could not save message as draft felamimail sk Chyba: Nepodarilo sa uložiÅ¥ správu ako Návrh +error: could not save rule felamimail sk Chyba: Nepodarilo sa uložiÅ¥ pravidlo +error: message could not be displayed. felamimail sk CHYBA: Správa sa nedá zobraziÅ¥. +event details follow felamimail sk Podrobnosti udalosti: +every felamimail sk každý +every %1 days felamimail sk každých +expunge felamimail sk OdstrániÅ¥ +extended felamimail sk Rozšírené +felamimail common sk FelaMiMail +file into felamimail sk súbor do +filemanager felamimail sk Správca súborov +files felamimail sk súbory +filter active felamimail sk filter aktívny +filter name felamimail sk Názov filtra +filter rules common sk pravidlá filtra +first name felamimail sk Krstné meno +flagged felamimail sk oznaÄené +flags felamimail sk Príznaky +folder felamimail sk prieÄinok +folder acl felamimail sk prístupové práva (acl) prieÄinku +folder name felamimail sk Názov prieÄinku +folder path felamimail sk Cesta k prieÄinku +folder preferences felamimail sk Predvoľby prieÄinku +folder settings felamimail sk Nastavenia prieÄinku +folder status felamimail sk Stav prieÄinku +folderlist felamimail sk Zoznam prieÄinkov +foldername felamimail sk Názov prieÄinku +folders felamimail sk PrieÄinky +folders created successfully! felamimail sk PrieÄinky boli úspeÅ¡ne vytvorené! +follow felamimail sk nasledovaÅ¥ +for mail to be send - not functional yet felamimail sk Pre správu urÄenú na odoslanie - v súÄasnosti nefunkÄné +for received mail felamimail sk Pre prijaté správy +forward felamimail sk OdoslaÅ¥ Äalej +forward as attachment felamimail sk OdoslaÅ¥ Äalej ako prílohu +forward inline felamimail sk OdoslaÅ¥ Äalej v texte +forward messages to felamimail sk OdoslaÅ¥ správy Äalej (komu) +forward to felamimail sk OdoslaÅ¥ Äalej (komu) +forward to address felamimail sk OdoslaÅ¥ Äalej na adresu +forwarding felamimail sk Odosielanie Äalej +found felamimail sk NaÅ¡iel +fri felamimail sk Pia +from felamimail sk Od +from(a->z) felamimail sk Od (A->Z) +from(z->a) felamimail sk Od (Z->A) +full name felamimail sk Celé meno +greater than felamimail sk väÄÅ¡ie než +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail sk Pozrite na t www.felamimail.org pre ÄalÅ¡ie informácie o Squirrelmail.
    +header lines felamimail sk Riadky hlaviÄky +hide header felamimail sk skryÅ¥ hlaviÄku +hostname / address felamimail sk názov stroja (hostname) / adresa +how to forward messages felamimail sk Ako odosielaÅ¥ Äalej +html felamimail sk HTML +icons and text felamimail sk Ikony a text +icons only felamimail sk Len ikony +identifying name felamimail sk IdentifikaÄné meno +identity felamimail sk identita +if felamimail sk AK +if from contains felamimail sk ak Od obsahuje +if mail header felamimail sk ak hlaviÄka správu +if message size felamimail sk ak veľkosÅ¥ správy +if shown, which folders should appear on main screen felamimail sk Ak je zobrazené, ktoré prieÄinky sa majú objaviÅ¥ na hlavnej obrazovke +if subject contains felamimail sk ak predmet obsahuje +if to contains felamimail sk ak Komu obsahuje +if using ssl or tls, you must have the php openssl extension loaded. felamimail sk Ak používate SSL alebo TLS, musíte maÅ¥ nahraté rozšírenie PHP openssl. +illegal folder name. please select a different name. felamimail sk Nepovolený názov prieÄinka. Prosím zvoľte iný názov. +imap felamimail sk IMAP +imap server felamimail sk IMAP server +imap server address felamimail sk Adresa IMAP servera +imap server closed the connection. felamimail sk IMAP server ukonÄil spojenie. +imap server closed the connection. server responded: %s felamimail sk IMAP server ukonÄil spojenie. OdpoveÄ servera: %s +imap server password felamimail sk Heslo pre IMAP server +imap server type felamimail sk Typ IMAP servera +imap server username felamimail sk Používateľské meno pre IMAP server +imaps authentication felamimail sk IMAPS overovanie +imaps encryption only felamimail sk Iba IMAPS Å¡ifrovanie +import felamimail sk Import +import mail felamimail sk Import Správy +import message felamimail sk importovaÅ¥ správu +in felamimail sk v +inbox felamimail sk DoruÄená poÅ¡ta +incoming mail server(imap) felamimail sk Príchodzí mail server (IMAP) +index order felamimail sk Poradie indexu +info felamimail sk Info +insert the signature at top of the new (or reply) message when opening compose dialog (you may not be able to switch signatures) felamimail sk vložiÅ¥ podpis na vrch novej správy (alebo odpovede) pri otvorení okna pre úpravu (nemusí sa vám podariÅ¥ meniÅ¥ podpisy) +invalid user name or password felamimail sk Chybné používateľské meno alebo heslo +javascript felamimail sk JavaScript +jumping to end felamimail sk skoÄiÅ¥ na koniec +jumping to start felamimail sk skoÄiÅ¥ na zaÄiatok +junk felamimail sk Spam +keep a copy of the message in your inbox felamimail sk ponechaÅ¥ kópiu správy v prieÄinku DoruÄenej poÅ¡ty +keep local copy of email felamimail sk uschovaÅ¥ lokálnu kópiu správy +kilobytes felamimail sk kilobajtov +language felamimail sk Jazyk +last name felamimail sk Priezvisko +left felamimail sk Vľavo +less felamimail sk menej +less than felamimail sk menej než +light gray felamimail sk Svetlosivá +list all felamimail sk ZobraziÅ¥ vÅ¡etko +loading felamimail sk naÄítava sa +location of buttons when composing felamimail sk Rozmiestnenie tlaÄidiel pri písaní správy +mail server login type admin sk Typ prihlásenia poÅ¡tového servera +mail settings felamimail sk Nastavenia poÅ¡ty +mainmessage felamimail sk hlavná správa +manage email accounts and identities common sk Správa E-mailových PrieÄinkov a Identít +manage emailaccounts common sk Správa E-mailových úÄtov +manage emailfilter / vacation preferences sk Správa E-mailového filtra / Odstraňovania +manage folders common sk Správa prieÄinkov +manage sieve common sk Správa Sieve skriptov +manage signatures felamimail sk Správa Podpisov +mark as deleted felamimail sk OznaÄiÅ¥ ako odstránené +mark messages as felamimail sk OznaÄiÅ¥ vybrané správy ako +mark selected as flagged felamimail sk OznaÄiÅ¥ vybrané ako oznaÄkované +mark selected as read felamimail sk OznaÄiÅ¥ vybrané ako preÄítané +mark selected as unflagged felamimail sk OznaÄiÅ¥ vybrané ako neoznaÄkované +mark selected as unread felamimail sk OznaÄiÅ¥ vybrané ako nepreÄítané +match felamimail sk Zhoda +matches felamimail sk zhody +matches regexp felamimail sk spĺňa regulérny výraz +max uploadsize felamimail sk max.veľkosÅ¥ pre odovzdanie +message highlighting felamimail sk Zvýrazňovanie správ +message list felamimail sk Zoznam správ +messages felamimail sk správy +mon felamimail sk Pon +move felamimail sk presunúť +move folder felamimail sk presunúť prieÄinok +move messages felamimail sk presunúť správy +move messages? felamimail sk Presunúť správy? +move to felamimail sk presunúť vybrané do +move to trash felamimail sk Presunúť do Odpadkového koÅ¡a +moving messages to felamimail sk presúvam správy do +name felamimail sk Meno +never display html emails felamimail sk NezobrazovaÅ¥ HTML správy +new common sk Nové +new filter felamimail sk Nový filter +next felamimail sk ÄŽalší +next message felamimail sk ÄalÅ¡ia správa +no active imap server found!! felamimail sk NenaÅ¡iel sa žiadny aktívny IMAP server !! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail sk Nebola zadaná adresa KOMU/KÓPIA/SLEPà KÓPIA, ani prieÄinok pre uloženie správy. +no encryption felamimail sk bez Å¡ifrovania +no filter felamimail sk Žiadny filter +no folders felamimail sk žiadne prieÄinky +no folders found felamimail sk Žiadne prieÄinky sa nenaÅ¡li +no folders were found to subscribe to! felamimail sk NenaÅ¡li sa prieÄinky pre prihlásenie! +no folders were found to unsubscribe from! felamimail sk NenaÅ¡li sa prieÄinky pre odhlásenie! +no highlighting is defined felamimail sk Nebolo nastavené zvýrazňovanie +no imap server host configured!! felamimail sk Nebola nastavená host adresa IMAP servera!! +no message returned. felamimail sk Žiadna správa sa nevrátila. +no messages found... felamimail sk žiadne správy sa nenaÅ¡li +no messages selected, or lost selection. changing to folder felamimail sk Neboli oznaÄené žiadne správy, alebo sa oznaÄenie stratilo. Prechádzam do prieÄinku +no messages were selected. felamimail sk Neboli vybrané žiadne správy +no plain text part found felamimail sk Nebola nájdená žiadna Äisto textová ÄasÅ¥ +no previous message felamimail sk žiadna predchádzajúca správa +no recipient address given! felamimail sk Nebol zadaný adresát! +no signature felamimail sk žiadny podpis +no subject given! felamimail sk Nebol zadaný predmet sprrávy! +no supported imap authentication method could be found. felamimail sk NenaÅ¡la sa žiadna z podporovaných metód IMAP overovania. +no valid data to create mailprofile!! felamimail sk Nie sú k dispozícii platné údaje k vytvoreniu poÅ¡tového profilu! +no valid emailprofile selected!! felamimail sk Nebol vybratý platný E-mailový profil! +none felamimail sk žiadne +none, create all felamimail sk žiadne, vytvoriÅ¥ vÅ¡etko +not allowed felamimail sk nepovolené +notify when new mails arrive on these folders felamimail sk upozorniÅ¥, keÄ do týchto prieÄinkov príde správa +on felamimail sk ohľadom +on behalf of felamimail sk pre koho +one address is not valid felamimail sk Jedna adresa je neplatná +only inbox felamimail sk Iba DoruÄená poÅ¡ta +only one window felamimail sk Iba jedno okno +only unseen felamimail sk Iba nepreÄítané +open all felamimail sk otvoriÅ¥ vÅ¡etko +options felamimail sk Voľby +or felamimail sk alebo +or configure an valid imap server connection using the manage accounts/identities preference in the sidebox menu. felamimail sk alebo nastavte platné pripojenie na IMAP server pomocou predvolieb v Správe ÚÄtov/Identít v postrannej ponuke. +organisation felamimail sk organizácia +organization felamimail sk organizácia +organization name admin sk Názov organizácie +original message felamimail sk Pôvodná správa +outgoing mail server(smtp) felamimail sk Odchodzí mail server (SMTP) +participants felamimail sk ÚÄastníci +personal information felamimail sk Osobné informácie +please ask the administrator to correct the emailadmin imap server settings for you. felamimail sk Prosím požiadajte správcu, aby opravil nastavenia IMAP servera. +please configure access to an existing individual imap account. felamimail sk Prosím nakonfigurujte prístup k existujúcemu osobnému IMAP úÄtu. +please select a address felamimail sk Prosím vyberte adresu +please select the number of days to wait between responses felamimail sk Prosím vyberte poÄet dní, koľko ÄakaÅ¥ medzi odpoveÄami +please supply the message to send with auto-responses felamimail sk Prosím zadajte správu, ktorá sa má posielaÅ¥ v rámci automatickej odpovede +port felamimail sk port +posting felamimail sk posielanie +previous felamimail sk Predchádzajúca +previous message felamimail sk predchádzajúca správa +print it felamimail sk vytlaÄ to +print this page felamimail sk vytlaÄiÅ¥ túto stránku +printview felamimail sk Náhľad pre tlaÄ +quicksearch felamimail sk Rýchle hľadanie +read felamimail sk ÄítaÅ¥ +reading felamimail sk Äíta sa +receive notification felamimail sk PrijaÅ¥ upozornenie +recent felamimail sk súÄasné +refresh time in minutes felamimail sk ÄŒas obnovovania (v minútach) +reject with felamimail sk odmietnuÅ¥ ako +remove felamimail sk odstrániÅ¥ +remove immediately felamimail sk OdstrániÅ¥ ihneÄ +rename felamimail sk PremenovaÅ¥ +rename a folder felamimail sk PremenovaÅ¥ prieÄinok +rename folder felamimail sk PremenovaÅ¥ prieÄinok +renamed successfully! felamimail sk ÚspeÅ¡ne premenované. +replied felamimail sk zodpovedané +reply felamimail sk OdpoveÄ +reply all felamimail sk OdpoveÄ vÅ¡etkým +reply to felamimail sk OdpovedaÅ¥ (komu) +replyto felamimail sk OdpovedaÅ¥ (komu) +respond felamimail sk OdpovedaÅ¥ +respond to mail sent to felamimail sk odpoveÄ odoslaná (komu) +return felamimail sk Návrat +return to options page felamimail sk Návrat na stránku volieb +right felamimail sk Vpravo +row order style felamimail sk Å týl usporiadania riadkov +rule felamimail sk Pravidlo +sat felamimail sk Sob +save felamimail sk UložiÅ¥ +save all felamimail sk UložiÅ¥ vÅ¡etko +save as draft felamimail sk uložiÅ¥ ako návrh +save as infolog felamimail sk uložiÅ¥ do Záznamníka +save changes felamimail sk uložiÅ¥ zmeny +save message to disk felamimail sk uložiÅ¥ správu na disk +script name felamimail sk názov skriptu +script status felamimail sk stav skriptu +search felamimail sk HľadaÅ¥ +search for felamimail sk Hľadaj +select felamimail sk VybraÅ¥ +select all felamimail sk VybraÅ¥ vÅ¡etko +select emailprofile felamimail sk VybraÅ¥ E-mailový profil +select folder felamimail sk vybraÅ¥ prieÄinok +select your mail server type admin sk Vyberte typ vášho poÅ¡tového servera +send felamimail sk OdoslaÅ¥ +send a reject message felamimail sk odoslaÅ¥ odmietaciu správu +sent felamimail sk Odoslaná poÅ¡ta +sent folder felamimail sk PrieÄinok Odoslaná poÅ¡ta +server supports mailfilter(sieve) felamimail sk server podporuje mailfilter (sieve) +set as default felamimail sk NastaviÅ¥ ako predvolené +show all folders (subscribed and unsubscribed) in main screen folder pane felamimail sk ZobraziÅ¥ vÅ¡etky prieÄinky (prihlásené A neprihlásené) v hlavnom zobrazovacom okne +show header felamimail sk zobraziÅ¥ hlaviÄku +show new messages on main screen felamimail sk ZobrazovaÅ¥ nové správy na hlavnej stránke +sieve script name felamimail sk Názov Sieve skriptu +sieve settings admin sk Nastavenia Sieve +signatur felamimail sk Podpis +signature felamimail sk Podpis +simply click the target-folder felamimail sk Jednoducho kliknúť na cieľový prieÄinok +size felamimail sk VeľkosÅ¥ +size of editor window felamimail sk VeľkosÅ¥ okna editora +size(...->0) felamimail sk VeľkosÅ¥ (...->0) +size(0->...) felamimail sk VeľkosÅ¥ (0->...) +skipping forward felamimail sk preskoÄiÅ¥ vpred +skipping previous felamimail sk preskoÄiÅ¥ späť +small view felamimail sk zmenÅ¡ený pohľad +smtp settings admin sk Nastavenia SMTP +start new messages with mime type plain/text or html? felamimail sk VytváraÅ¥ nové správy pomocou mime typu plain/text, alebo HTML? +subject felamimail sk Predmet +subject(a->z) felamimail sk Predmet (A->Z) +subject(z->a) felamimail sk Predmet (Z->A) +submit felamimail sk OdoslaÅ¥ +subscribe felamimail sk PrihlásiÅ¥ +subscribed felamimail sk Prihlásené +subscribed successfully! felamimail sk ÚspeÅ¡ne prihlásené! +sun felamimail sk Ned +system signature felamimail sk podpis systému +table of contents felamimail sk Obsahová tabuľka +template folder felamimail sk PrieÄinok Å ablóny +templates felamimail sk Å ablóny +text only felamimail sk Iba text +text/plain felamimail sk text/plain +the action will be applied to all messages of the current folder.ndo you want to proceed? felamimail sk Akcia sa vykoná pre vÅ¡etky správy v aktuálnom prieÄinku.\nPokraÄovaÅ¥? +the connection to the imap server failed!! felamimail sk Pripojenie na IMAP server sa nepodarilo!!! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail sk Tento IMAP server nepodporuje vybranú metódu overovania. Prosím kontaktujte správcu systému. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail sk Odosielateľ správy si vyžiadal potvrdenie o tom, že ste si jeho správu už preÄítali. Chcete, aby sa mu toto potvrdenie odoslalo? +the mimeparser can not parse this message. felamimail sk Analyzátor MIME nedokázal spracovaÅ¥ túto správu. +then felamimail sk TAK +there is no imap server configured. felamimail sk Nie je nastavený žiadny IMAP server. +this folder is empty felamimail sk TENTO PRIEÄŒINOK JE PRÃZDNY +this php has no imap support compiled in!! felamimail sk Tento PHP nemá zakompilovanú podporu IMAP!! +thu felamimail sk Å tv +to felamimail sk Komu +to mail sent to felamimail sk pre správu poslanú (komu) +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail sk Ak chcete používaÅ¥ TLS spojenie, musíte fungovaÅ¥ na PHP verzii 5.1.0 alebo vyÅ¡Å¡ej. +translation preferences felamimail sk Nastavenia prekladu +translation server felamimail sk Prekladový server +trash felamimail sk Odpadkový kôš +trash fold felamimail sk PrieÄinok Odpad +trash folder felamimail sk PrieÄinok Odpadkový kôš +tue felamimail sk Uto +type felamimail sk typ +unexpected response from server to authenticate command. felamimail sk NeoÄakávaná odpoveÄ servera na príkaz AUTENTHICATE. +unexpected response from server to digest-md5 response. felamimail sk NeoÄakávaná odpoveÄ servera na Digest-MD5 odpoveÄ. +unexpected response from server to login command. felamimail sk NeoÄakávaná odpoveÄ od servera na príkaz LOGIN. +unflagged felamimail sk neoznaÄkovaný +unknown err felamimail sk Bližšie neurÄená chyba +unknown error felamimail sk Bližšie neurÄená chyba +unknown imap response from the server. server responded: %s felamimail sk Neznáma IMAP odpoveÄ od servera: %s +unknown sender felamimail sk Neznámy odosielateľ +unknown user or password incorrect. felamimail sk Neznámy používateľ alebo chybné heslo +unread common sk NepreÄítané +unseen felamimail sk Neotvorené +unselect all felamimail sk ZruÅ¡iÅ¥ výber +unsubscribe felamimail sk OdhlásiÅ¥ +unsubscribed felamimail sk Odhlásené +unsubscribed successfully! felamimail sk ÚspeÅ¡ne odhlásené! +up felamimail sk hore +updating message status felamimail sk Aktualizujem stav správy +updating view felamimail sk aktualizácia pohľadu +use emailadmin to create profiles felamimail sk pre vytváranie profilov použite EmailAdmin +use a signature felamimail sk PoužiÅ¥ podpis +use a signature? felamimail sk PoužiÅ¥ podpis? +use addresses felamimail sk PoužiÅ¥ adresy +use custom identities felamimail sk použiÅ¥ používateľské identity +use custom settings felamimail sk PoužiÅ¥ používateľské nastavenia +use regular expressions felamimail sk použiÅ¥ regulérne výrazy +use smtp auth admin sk PoužiÅ¥ SMTP overovanie +users can define their own emailaccounts admin sk Používatelia smú definovaÅ¥ ich vlastné poÅ¡tové úÄty +vacation notice common sk Upozornenie o odstraňovaní +vacation notice is active felamimail sk Upozornenie o odstraňovaní je aktívne +vacation start-date must be before the end-date! felamimail sk Dátum zaÄiatku odstraňovania musí byÅ¥ PRED dátumom konca! +validate certificate felamimail sk PotvrdiÅ¥ certifikát +view full header felamimail sk ZobraziÅ¥ celú hlaviÄku +view header lines felamimail sk zobraziÅ¥ riadky hlaviÄky +view message felamimail sk ZobraziÅ¥ správu +viewing full header felamimail sk Zobrazujem celú hlaviÄku +viewing message felamimail sk Zobrazujem správu +viewing messages felamimail sk Zobrazujem správy +wed felamimail sk Str +when deleting messages felamimail sk Ako odstraňovaÅ¥ správy +which folders (additional to the sent folder) should be displayed using the sent folder view schema felamimail sk Ktoré prieÄinky (popri prieÄinku Odoslané) sa majú zobrazovaÅ¥ pomocou schémy Zobrazenie PrieÄinka Odoslaných správ +which folders - in general - should not be automatically created, if not existing felamimail sk Ktoré prieÄinky - vo vÅ¡eobecnosti - sa NEMAJÚ vytváraÅ¥ automaticky, keÄ neexistujú +with message felamimail sk so správou +with message "%1" felamimail sk so správou "%1" +wrap incoming text at felamimail sk ZarovnaÅ¥ príchodzí text: +writing felamimail sk zapisuje sa +wrote felamimail sk zapísal +yes, offer copy option felamimail sk áno, ponúknuÅ¥ možnosÅ¥ kópie +you can use %1 for the above start-date and %2 for the end-date. felamimail sk Môžete použiÅ¥ %1 pre vyÅ¡Å¡ieuvedený dátum zaÄiatku a %2 pre dátum konca. +you have received a new message on the felamimail sk Dostali ste novú správu: +your message to %1 was displayed. felamimail sk VaÅ¡a správa adresátovi %1 bola zobrazená. diff --git a/felamimail/lang/egw_sl.lang b/felamimail/lang/egw_sl.lang new file mode 100644 index 0000000000..178be913bc --- /dev/null +++ b/felamimail/lang/egw_sl.lang @@ -0,0 +1,514 @@ +%1 is not writable by you! felamimail sl Nimate pravice pisanja v %1! +(no subject) felamimail sl (brez zadeve) +(only cc/bcc) felamimail sl (le CC/BCC) +(separate multiple addresses by comma) felamimail sl (veÄ naslovov loÄite z vejico) +(unknown sender) felamimail sl (neznan poÅ¡iljatelj) +3paneview: if you want to see a preview of a mail by single clicking onto the subject, set the height for the message-list and the preview area here (300 seems to be a good working value). the preview will be displayed at the end of the message list on demand (click). felamimail sl Pogled 3D: Äe želite videti predogled sporoÄila z enojnim klikom na zadevo, nastavite viÅ¡ino seznama sporoÄil in podroÄja prikaza (300 je dober primer iz prakse). Predogled bo na zahtevo (klik) prikazan na dnu seznama sporoÄil. +aborted felamimail sl Prekinjeno +activate felamimail sl Aktiviraj +activate script felamimail sl Skripta za aktiviranje +activating by date requires a start- and end-date! felamimail sl Aktiviranje glede na datum zahteva doloÄitev zaÄetnega in konÄnega datuma! +add acl felamimail sl Dodaj ACL +add address felamimail sl Dodaj naslov +add rule felamimail sl Dodaj pravilo +add script felamimail sl Dodaj skripto +add to %1 felamimail sl Dodaj v %1 +add to address book felamimail sl Dodaj v adresar +add to addressbook felamimail sl Dodaj v adresar +adding file to message. please wait! felamimail sl Dodajam datoteko k sporoÄilu. PoÄakajte, prosim. +additional info felamimail sl Podrobnosti +address book felamimail sl Imenik +address book search felamimail sl Iskanje po adresarju +after message body felamimail sl Za besedilom +all address books felamimail sl Vsi adresarji +all folders felamimail sl Vse mape +all messages in folder felamimail sl Vsa sporoÄila v mapi +all of felamimail sl Vse od +allow images from external sources in html emails felamimail sl Dovoli slike iz zunanjih virov v sporoÄilih HTML +allways a new window felamimail sl Vedno novo okno +always show html emails felamimail sl Vedno prikaži HTML sporoÄila +and felamimail sl in +any of felamimail sl Katerikoli od +any status felamimail sl Katerikoli status +anyone felamimail sl Kdorkoli +as a subfolder of felamimail sl Kot podmapa v +attach felamimail sl Priloži +attachments felamimail sl Priponke +authentication required felamimail sl Zahtevana je avtentikacija +auto refresh folder list felamimail sl Samodejno osveži seznam map +back to folder felamimail sl Nazaj v mapo +bad login name or password. felamimail sl NapaÄno uporabniÅ¡ko ime ali geslo +bad or malformed request. server responded: %s felamimail sl NapaÄna ali napaÄno oblikovana zahteva. Odgovor strežnika: %s +bad request: %s felamimail sl NapaÄna zahteva: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail sl Glede na podane kriterije imajo prispela sporoÄila v seznamih razliÄne barve ozadij. To pomaga pri razlikovanju med poÅ¡iljatelji sporoÄil, Å¡e posebej v poÅ¡tnih seznamih. +bcc felamimail sl BCC +before headers felamimail sl Pred glavo sporoÄila +between headers and message body felamimail sl Med glavo in telesom sporoÄila +body part felamimail sl Telo sporoÄila +by date felamimail sl Po datumu +can not send message. no recipient defined! felamimail sl Ne morem poslati sporoÄila - ni doloÄen prejemnik! +can't connect to inbox!! felamimail sl Ne morem se povezati z INBOX nabiralnikom! +cc felamimail sl CC +change folder felamimail sl Spremeni mapo +check message against next rule also felamimail sl Preverite sporoÄilo tudi z naslednjim pravilom +checkbox felamimail sl Potrditveno polje +clear search felamimail sl ZbriÅ¡i iskanje +click here to log back in. felamimail sl Kliknite tu za ponovno prijavo. +click here to return to %1 felamimail sl Kliknite tu za vrnitev v %1 +close all felamimail sl Zapri vse +close this page felamimail sl Zapri to stran +close window felamimail sl Zapri okno +color felamimail sl Barva +compose felamimail sl Novo sporoÄilo +compose as new felamimail sl Sestavi kot novo +compress folder felamimail sl Stisni mapo +condition felamimail sl Pogoj +configuration felamimail sl Nastavitev +configure a valid imap server in emailadmin for the profile you are using. felamimail sl Nastavite veljavni strežnik IMAP v emailadmin za profile, ki jih uporabljate. +connection dropped by imap server. felamimail sl Strežnik IMAP je prekinil povezavo. +contact not found! felamimail sl Stik ni bil najden! +contains felamimail sl Vsebuje +copy or move messages? felamimail sl Kopiram ali premaknem sporoÄilo? +copying messages to felamimail sl Kopiram sporoÄilo v +could not complete request. reason given: %s felamimail sl Ne morem dokonÄati zahteve. Podan vzrok: %s +could not import message: felamimail sl SporoÄila ni bilo mogoÄe uvoziti: +could not open secure connection to the imap server. %s : %s. felamimail sl Ne morem vzpostaviti varne povezave s strežnikom IMAP. %s: %s +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail sl CRAM-MD5 ali DIGEST-MD5 zahteva nameÅ¡Äen paket Auth_SASL. +create felamimail sl Ustvari +create folder felamimail sl Ustvari mapo +create sent felamimail sl Ustvari mapo Poslano (Sent) +create subfolder felamimail sl Ustvari podmapo +create trash felamimail sl Ustvari mapo KoÅ¡ (Trash) +created folder successfully! felamimail sl Mapa je bila uspeÅ¡no ustvarjena. +dark blue felamimail sl Temno modra +dark cyan felamimail sl Temno sinja +dark gray felamimail sl Temno siva +dark green felamimail sl Temno zelena +dark magenta felamimail sl Temno vijoliÄna +dark yellow felamimail sl Temno rumena +date(newest first) felamimail sl Datum (najprej novejÅ¡i) +date(oldest first) felamimail sl Datum (najprej starejÅ¡i) +days felamimail sl Dni +deactivate script felamimail sl Skript za deaktiviranje +default felamimail sl Privzeto +default signature felamimail sl Privzeti podpis +default sorting order felamimail sl Privzet naÄin razvrÅ¡Äanja +delete all felamimail sl BriÅ¡i vse +delete folder felamimail sl BriÅ¡i mapo +delete script felamimail sl IzbriÅ¡i skript +delete selected felamimail sl BriÅ¡i oznaÄene +delete selected messages felamimail sl BriÅ¡i oznaÄena sporoÄila +deleted felamimail sl Izbrisano +deleted folder successfully! felamimail sl Mapa je bila uspeÅ¡no izbrisana! +deleting messages felamimail sl Brisanje sporoÄila +disable felamimail sl OnemogoÄi +discard felamimail sl Zavrzi +discard message felamimail sl Zavrzi sporoÄilo +display message in new window felamimail sl Prikaži sporoÄilo v novem oknu +display messages in multiple windows felamimail sl Prikaži sporoÄila v veÄ oknih +display of html emails felamimail sl Prikazovanje HTML sporoÄil +display only when no plain text is available felamimail sl Prikaži le, ko ni na voljo navadnega besedila +display preferences felamimail sl Prikaži nastavitve +displaying html messages is disabled felamimail sl Prikazovanje sporoÄil HTML je onemogoÄeno +do it! felamimail sl Izvedi! +do not use sent felamimail sl Ne uporabljaj mape Poslano (Sent) +do not use trash felamimail sl Ne uporabljaj mape KoÅ¡ (Trash) +do not validate certificate felamimail sl Ne preverjaj certifikata +do you really want to delete the '%1' folder? felamimail sl Ali res želite izbrisati mapo '%1'? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail sl Res želite izbrisati izbrano nastavitev raÄuna in identiteto? +do you really want to delete the selected signatures? felamimail sl Res želite izbrisati izbrane podpise? +do you really want to move or copy the selected messages to folder: felamimail sl Res želite premakniti ali kopirati izbrana sporoÄila v mapo: +do you really want to move the selected messages to folder: felamimail sl Res želite premakniti izbrana sporoÄila v mapo: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail sl Želite biti vpraÅ¡ani za potrditev pred premikanjem izbranih sporoÄil v drugo mapo? +do you want to prevent the editing/setup for forwarding of mails via settings (, even if sieve is enabled)? felamimail sl Želite prepreÄiti urejanje/nastavljanje posredovanja sporoÄil v nastavitvah (tudi Äe je SIEVE omogoÄen)? +do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? felamimail sl Želite prepreÄiti urejanje/nastavljanje pravil filtrov (tudi Äe je SIEVE omogoÄen)? +do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if sieve is enabled)? felamimail sl Želite prepreÄiti urejanje/nastavljanje obvestil po poÅ¡ti na drugi e-naslov, Äe pride sporoÄilo (tudi Äe je SIEVE omogoÄen)? +do you want to prevent the editing/setup of the absent/vacation notice (, even if sieve is enabled)? felamimail sl Želite prepreÄiti urejanje/nastavljanje obvestila o odsotnosti/dopustu (tudi Äe je SIEVE omogoÄen)? +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail sl Želite prepreÄiti upravljanje map (ustvarjanje, pravice dostopa in naroÄila)? +does not contain felamimail sl Ne vsebuje +does not exist on imap server. felamimail sl Ne obstaja na strežniku IMAP. +does not match felamimail sl Se ne ujema +does not match regexp felamimail sl Se ne ujema z regularnim izrazom +don't use draft folder felamimail sl Ne uporabljaj mape Osnutki +don't use sent felamimail sl Ne uporabljaj mape Poslano (Sent) +don't use template folder felamimail sl Ne uporabljaj mape s predlogami +don't use trash felamimail sl Ne uporabljaj mape KoÅ¡ (Trash) +dont strip any tags felamimail sl Ne razÄleni znaÄk +down felamimail sl Navzdol +download felamimail sl Prenesi +download this as a file felamimail sl Prenesi kot datoteko +draft folder felamimail sl Mapa Osnutki +drafts felamimail sl Osnutki +e-mail felamimail sl E-PoÅ¡ta +e-mail address felamimail sl E-PoÅ¡tni naslov +e-mail folders felamimail sl E-PoÅ¡tne mape +edit email forwarding address felamimail sl Uredi posredovalni naslov E-poÅ¡te +edit filter felamimail sl Uredi filter +edit rule felamimail sl Uredi pravilo +edit selected felamimail sl Uredi oznaÄeno +edit vacation settings felamimail sl Uredi nastavitve odsotnosti +editor type felamimail sl Vrsta urejevalnika +email address felamimail sl E-PoÅ¡tni naslov +email forwarding address felamimail sl Posredovalni naslov E-poÅ¡te +email notification update failed felamimail sl Posodobitev obvestila elektronske poÅ¡te ni uspelo +email signature felamimail sl E-poÅ¡tni podpis +emailaddress felamimail sl PoÅ¡tni naslov +empty trash felamimail sl Izprazni smeti +enable felamimail sl OmogoÄi +encrypted connection felamimail sl Kodirana povezava +enter your default mail domain ( from: user@domain ) admin sl Vnesite svojo privzeto domeno za naslove: +enter your imap mail server hostname or ip address admin sl Vnesite ime ali naslov IP strežnika IMAP +enter your sieve server hostname or ip address admin sl Vnesite ime ali naslov IP strežnika SIEVE +enter your sieve server port admin sl Vnesite vrata strežnika SIEVE +enter your smtp server hostname or ip address admin sl Vnesite ime ali naslov IP strežnika SMTP +enter your smtp server port admin sl Vnesite vrata strežnika SMTP +entry saved felamimail sl Vnos shranjen +error felamimail sl NAPAKA +error connecting to imap serv felamimail sl Napaka pri povezovanju s strežnikom IMAP +error connecting to imap server. %s : %s. felamimail sl Napaka pri povezavi s strežnikom IMAP. %s: %s. +error connecting to imap server: [%s] %s. felamimail sl Napaka pri povezovanja s strežnikom IMAP: [%s] %s. +error creating rule while trying to use forward/redirect. felamimail sl Napaka pri ustvarjanju pravila za posredovanje/preusmeritev. +error opening felamimail sl Napaka pri odpiranju +error saving %1! felamimail sl Napaka pri shranjevanju %1! +error: felamimail sl Napaka: +error: could not save message as draft felamimail sl Napaka: ne morem shraniti sporoÄila kot osnutek +error: could not save rule felamimail sl Napaka: ne morem shraniti pravila +error: message could not be displayed. felamimail sl Napaka: ne morem prikazati sporoÄila. +event details follow felamimail sl Podrobnosti dogodka sledijo +every felamimail sl Vsak +every %1 days felamimail sl Vsakih %1 dni +expunge felamimail sl PoÄisti +extended felamimail sl RazÅ¡irjeno +felamimail common sl E-poÅ¡ta +file into felamimail sl Shrani v +filemanager felamimail sl Upravljalec dokumentov +files felamimail sl Datoteke +filter active felamimail sl Filter je aktiven +filter name felamimail sl Ime filtra +filter rules common sl Pravila filtra +first name felamimail sl Ime +flagged felamimail sl OznaÄen +flags felamimail sl Zastavice +folder felamimail sl Mapa +folder acl felamimail sl ACL mape +folder name felamimail sl Ime mape +folder path felamimail sl Pot mape +folder preferences felamimail sl Lastnosti mape +folder settings felamimail sl Nastavitve mape +folder status felamimail sl Status mape +folderlist felamimail sl Seznam map +foldername felamimail sl Ime mape +folders felamimail sl Mape +folders created successfully! felamimail sl Mape so bile uspeÅ¡no ustvarjene! +follow felamimail sl Sledi +for mail to be send - not functional yet felamimail sl Za poÅ¡iljanje sporoÄila - Å¡e ne deluje +for received mail felamimail sl Za prejeto poÅ¡to +forward felamimail sl Posreduj +forward as attachment felamimail sl Posreduj kot prilogo +forward inline felamimail sl Posreduj v sporoÄilu +forward messages to felamimail sl Posreduj sporoÄilo osebi +forward to felamimail sl Posreduj +forward to address felamimail sl Posreduj na naslov +forwarding felamimail sl Posredujem +found felamimail sl Najdenih +fri felamimail sl Pet +from felamimail sl PoÅ¡iljatelj +from(a->z) felamimail sl PoÅ¡iljatelj (A->Z) +from(z->a) felamimail sl PoÅ¡iljatelj (Z->A) +full name felamimail sl Polno ime +greater than felamimail sl VeÄje kakor +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail sl Oglejte si www.felamimail.org za veÄ informacij o SquirrelMail.
    +header lines felamimail sl Glava sporoÄila +hide header felamimail sl Skrij glavo +hostname / address felamimail sl Ime gostitelja/naslov +how to forward messages felamimail sl Kako naj se posreduje sporoÄilo +html felamimail sl HTML +icons and text felamimail sl Ikone in besedilo +icons only felamimail sl Le ikone +identifying name felamimail sl DoloÄujoÄe ime +identity felamimail sl Identiteta +if felamimail sl IF +if from contains felamimail sl ÄŒe od vsebuje +if mail header felamimail sl ÄŒe glava elektronskega sporoÄila +if message size felamimail sl ÄŒe velikost sporoÄila +if shown, which folders should appear on main screen felamimail sl ÄŒe so prikazana, katere mape naj bodo prikazane na prvi strani? +if subject contains felamimail sl ÄŒe zadeva vsebuje +if to contains felamimail sl ÄŒe za vsebuje +if using ssl or tls, you must have the php openssl extension loaded. felamimail sl ÄŒe želite uporabljati SSL ali TSL, morate naložiti razÅ¡iritev PHP openssl. +illegal folder name. please select a different name. felamimail sl Nedovoljeno ime mape. Prosim, izberite drugo ime. +imap felamimail sl IMAP +imap server felamimail sl Strežnik IMAP +imap server address felamimail sl Naslov strežnika IMAP +imap server closed the connection. felamimail sl Strežnik IMAP je prekinil povezavo. +imap server closed the connection. server responded: %s felamimail sl Strežnik IMAP je prekinil povezavo. Odgovor strežnika: %s +imap server password felamimail sl Geslo strežnika IMAP +imap server type felamimail sl Tip strežnika IMAP +imap server username felamimail sl UporabniÅ¡ko ime strežnika IMAP +imaps authentication felamimail sl Avtentikacija IMAPS +imaps encryption only felamimail sl Le IMAPS Å¡ifriranje +import felamimail sl Uvozi +import mail felamimail sl Uvozi poÅ¡to +import message felamimail sl Uvozi sporoÄilo +in felamimail sl V +inbox felamimail sl Prejeto +incoming mail server(imap) felamimail sl Strežnik za prihajajoÄo poÅ¡to (IMAP) +index order felamimail sl Vrstni red kazala +info felamimail sl Podatki +invalid user name or password felamimail sl NapaÄno uporabniÅ¡ko ime ali geslo +javascript felamimail sl Javascript +jumping to end felamimail sl Skok na konec +jumping to start felamimail sl Skok na zaÄetek +junk felamimail sl Smeti +keep a copy of the message in your inbox felamimail sl Obdrži kopijo sporoÄila v mapi Prejeto +keep local copy of email felamimail sl Obdrži lokalno kopijo E-poÅ¡te +kilobytes felamimail sl Kilobajtov +language felamimail sl Jezik +last name felamimail sl Priimek +left felamimail sl Levo +less felamimail sl Manj +less than felamimail sl Manj kot +light gray felamimail sl Svetlo siva +list all felamimail sl IzpiÅ¡i vse +loading felamimail sl Nalaganje +location of buttons when composing felamimail sl Položaj gumbov pri pisanju novega sporoÄila +mail server login type admin sl NaÄin prijave v poÅ¡tni strežnik +mail settings felamimail sl Nastavitve mape +mainmessage felamimail sl Glavno sporoÄilo +manage email accounts and identities common sl Urejanje raÄunov in identitet +manage emailaccounts common sl Upravljanje poÅ¡tnih raÄunov +manage emailfilter / vacation preferences sl Uredi EMailFilter/ odsotnost +manage folders common sl Upravljanje map +manage sieve common sl Upravljanje skript za Sieve +manage signatures felamimail sl Upravljanje podpisov +mark as deleted felamimail sl OznaÄi kot izbrisano +mark messages as felamimail sl OznaÄi izbrana sporoÄila kot +mark selected as flagged felamimail sl OznaÄenim sporoÄilom dodaj zastavico +mark selected as read felamimail sl OznaÄi izbrana sporoÄila kot prebrana +mark selected as unflagged felamimail sl OznaÄenim sporoÄilom odvzemi zastavico +mark selected as unread felamimail sl OznaÄi izbrana sporoÄila kot neprebrana +match felamimail sl Ujemanje +matches felamimail sl Se ujema z +matches regexp felamimail sl Se ujema z regularnim izrazom +max uploadsize felamimail sl NajveÄja velikost prenosa +message highlighting felamimail sl Poudarjanje sporoÄil +message list felamimail sl Seznam sporoÄil +messages felamimail sl SporoÄila +mon felamimail sl Pon +move felamimail sl Premakni +move folder felamimail sl Premakni mapo +move messages felamimail sl Premakni sporoÄila +move messages? felamimail sl Premaknem sporoÄila? +move to felamimail sl Premakni oznaÄeno v +move to trash felamimail sl Premakni v smeti +moving messages to felamimail sl Premikanje sporoÄila v +name felamimail sl Ime +never display html emails felamimail sl Nikoli ne prikaži sporoÄil HTML +new common sl Novo +new filter felamimail sl Nov filter +next felamimail sl Naslednji +next message felamimail sl Naslednje sporoÄilo +no active imap server found!! felamimail sl Ni aktivnega strežnika IMAP! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail sl Ni bil podan niti naslov Za/Kp/Skp niti mapa, kamor naj bi se sporoÄilo shranilo. +no encryption felamimail sl Brez Å¡ifriranja +no filter felamimail sl Brez filtra +no folders felamimail sl Brez mapo +no folders found felamimail sl Ne najdem map +no folders were found to subscribe to! felamimail sl Ni map za naroÄilo! +no folders were found to unsubscribe from! felamimail sl Ni map za odjavo! +no highlighting is defined felamimail sl Poudarjanje ni definirano +no imap server host configured!! felamimail sl Noben strežnik IMAP ni nastavljen! +no message returned. felamimail sl Ni vrnjenega sporoÄila. +no messages found... felamimail sl Nobeno sporoÄilo ni najdeno +no messages selected, or lost selection. changing to folder felamimail sl Nobeno sporoÄilo ni izbrano ali pa je izbira izgubljena. Grem v mapo +no messages were selected. felamimail sl Nobeno sporoÄilo ni izbrano +no plain text part found felamimail sl Ni najdenega Äistega besedila +no previous message felamimail sl Ni predhodnjega sporoÄila +no recipient address given! felamimail sl Ni nobenega nsalove prejemnika! +no signature felamimail sl Brez podpisa +no stationery felamimail sl Brez stacionarnega +no subject given! felamimail sl Ni zadeve! +no supported imap authentication method could be found. felamimail sl Ni podprte metode avtentikacije IMAP. +no valid data to create mailprofile!! felamimail sl Ni veljavnih podatkov za ustvarjanje poÅ¡tneg aprofila! +no valid emailprofile selected!! felamimail sl Ni veljavnega E-poÅ¡tnega profila! +none felamimail sl Prazno +none, create all felamimail sl Prazno, ustvari vse +not allowed felamimail sl Ni dovoljenja +notify when new mails arrive on these folders felamimail sl Obvesti, ko nova sporoÄila pridejo v te mape +on felamimail sl VkljuÄeno +on behalf of felamimail sl V imenu +one address is not valid felamimail sl En naslov ni veljaven +only inbox felamimail sl Le nabiralnik INBOX +only one window felamimail sl Le eno okno +only unseen felamimail sl Le nova +open all felamimail sl Odpri vse +options felamimail sl Možnosti +or felamimail sl ali +or configure an valid imap server connection using the manage accounts/identities preference in the sidebox menu. felamimail sl ali nastavite veljavno povezavo do strežnik IMAP preko Upravljanje raÄunov/Lastnosti identitete v meniju. +organisation felamimail sl Organizacija +organization felamimail sl Organizacija +organization name admin sl Ime organizacije +original message felamimail sl Izvirno sporoÄilo +outgoing mail server(smtp) felamimail sl Strežnik za odhajajoÄo poÅ¡to (IMAP) +participants felamimail sl Soudeleženci +personal information felamimail sl Osebni podatki +please ask the administrator to correct the emailadmin imap server settings for you. felamimail sl Prosite skrbnika, da popravi nastavitve strežnika IMAP. +please configure access to an existing individual imap account. felamimail sl nastavite dostop do obstojeÄega raÄuna IMAP. +please select a address felamimail sl Izberite naslov +please select the number of days to wait between responses felamimail sl Izberite koliko dni naj poÄakam med odgovori +please supply the message to send with auto-responses felamimail sl VpiÅ¡ite sporoÄilo, ki se bo poslalo pri samodejnem odgovoru +port felamimail sl Vrata +posting felamimail sl Objavljanje +previous felamimail sl Predhodnje +previous message felamimail sl Predhodnje sporoÄilo +print it felamimail sl Natisni +print this page felamimail sl Natisni to stran +printview felamimail sl Predogled tiskanja +quicksearch felamimail sl Hitro iskanje +read felamimail sl Prebrano +reading felamimail sl Branje +receive notification felamimail sl Sprejmi potrdilo +recent felamimail sl Nedavno +refresh time in minutes felamimail sl Osvežitveni Äas v minutah +reject with felamimail sl Zavrni z +remove felamimail sl Odstrani +remove immediately felamimail sl Takoj odstrani +rename felamimail sl Preimenuj +rename a folder felamimail sl Preimenuj mapo +rename folder felamimail sl Preimenuj mapo +renamed successfully! felamimail sl Preimenovanje je bilo uspeÅ¡no! +replied felamimail sl Odgovorjeno +reply felamimail sl Odgovori +reply all felamimail sl Odgovori vsem +reply to felamimail sl Odgovori na naslov +replyto felamimail sl Odgovori na +respond felamimail sl Odgovori +respond to mail sent to felamimail sl Odgovori na sporoÄilo poslano na +return felamimail sl Vrnitev +return to options page felamimail sl Vrnitev na stran opcij +right felamimail sl Desno +row order style felamimail sl Slog zaporednih vrstic +rule felamimail sl Pravilo +sat felamimail sl Sob +save felamimail sl Shrani +save all felamimail sl Shrani vse +save as draft felamimail sl Shrani kot osnutek +save as infolog felamimail sl Shrani kot Infolog +save changes felamimail sl Shrani spremembe +save message to disk felamimail sl Shrani sporoÄilo na disk +script name felamimail sl Ime skripte +script status felamimail sl Status skripte +search felamimail sl Iskanje +search for felamimail sl IÅ¡Äi +select felamimail sl OznaÄi +select all felamimail sl OznaÄi vse +select emailprofile felamimail sl Izberite E-poÅ¡tni profil +select folder felamimail sl Izberi mapo +select your mail server type admin sl Izberite tip poÅ¡tnega strežnika +send felamimail sl PoÅ¡lji +send a reject message felamimail sl PoÅ¡lji zavrnjeno sporoÄilo +sent felamimail sl Poslano +sent folder felamimail sl Mapa s poslanimi +server supports mailfilter(sieve) felamimail sl Strežnik podpira mailfilter (sieve) +set as default felamimail sl Nastavi kot privzeto +show all folders (subscribed and unsubscribed) in main screen folder pane felamimail sl Prikaži vse mape (naroÄene in ne-naroÄene) v glavnem oknu +show header felamimail sl Prikaži glavo +show new messages on main screen felamimail sl Prikaži nova sporoÄila na zaÄetnem zaslonu +sieve script name felamimail sl Ime skripte sieve +sieve settings admin sl Nastavitve Sieve +signatur felamimail sl Podpis +signature felamimail sl Podpis +simply click the target-folder felamimail sl Kliknite ciljno mapo +size felamimail sl Velikost +size of editor window felamimail sl Velikost okna za urejanje +size(...->0) felamimail sl Velikost (... -> 0) +size(0->...) felamimail sl Velikost (0 -> ...) +skipping forward felamimail sl Skok naprej +skipping previous felamimail sl Skok nazaj +small view felamimail sl SkrÄen pogled +smtp settings admin sl Nastavitve SMTP +start new messages with mime type plain/text or html? felamimail sl ZaÄnem novo sporoÄilo kot navadno besedilo ali kot HTML? +stationery felamimail sl Stacionarno +subject felamimail sl Zadeva +subject(a->z) felamimail sl Zadeva (A->Z) +subject(z->a) felamimail sl Zadeva (Z->A) +submit felamimail sl PoÅ¡lji +subscribe felamimail sl NaroÄi +subscribed felamimail sl NaroÄeno +subscribed successfully! felamimail sl UspeÅ¡no naroÄeno! +sun felamimail sl Ned +system signature felamimail sl Sistemski podpis +table of contents felamimail sl Kazalo +template folder felamimail sl Mapa s predlogami +templates felamimail sl Predloge +text only felamimail sl Le besedilo +text/plain felamimail sl Navadno besedilo +the action will be applied to all messages of the current folder.ndo you want to proceed? felamimail sl To dejanje bo izvedeno nad vsemi sporoÄili v trenutni mapi.\nŽelite nadaljevati? +the connection to the imap server failed!! felamimail sl Povezava na strežnik IMAP ni uspela. +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail sl Strežnik IMAP verjetno ne podpira izbrane metode avtentikacije. Kontaktirajte sistemskega administratorja. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail sl PoÅ¡iljatelj sporoÄila je zahteval potrdilo, da ste sporoÄilo prebrali. Želite poslati obvestilo o tem? +the mimeparser can not parse this message. felamimail sl Mimeparser ne more prebrati tega sporoÄila. +then felamimail sl THEN +there is no imap server configured. felamimail sl Noben strežnik IMAP ni nastavljen. +this folder is empty felamimail sl TA MAPA JE PRAZNA +this php has no imap support compiled in!! felamimail sl Ta PHP ne vsebuje podpore za IMAP! +thu felamimail sl ÄŒet +to felamimail sl Prejemnik +to mail sent to felamimail sl SporoÄilo poslano na +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail sl ÄŒe želite uporabljati povezavo TLS, morate imeti razliÄico PHP 5.1.0 ali veÄ. +translation preferences felamimail sl Nastavitve prevodov +translation server felamimail sl Strežnik s prevodi +trash felamimail sl KoÅ¡ +trash fold felamimail sl KoÅ¡ +trash folder felamimail sl Mapa KoÅ¡ +tue felamimail sl Tor +type felamimail sl Vrsta +unexpected response from server to authenticate command. felamimail sl NepriÄakovan odgovor strežnika na ukaz AUTHENTICATE. +unexpected response from server to digest-md5 response. felamimail sl NepriÄakovan odgovor strežnika na odgovor Digest-MD5. +unexpected response from server to login command. felamimail sl NepriÄakovan odgovor strežnika na ukaz LOGIN. +unflagged felamimail sl Brez zastavice +unknown err felamimail sl Neznana napaka +unknown error felamimail sl Neznana napaka +unknown imap response from the server. server responded: %s felamimail sl Neznan odgovor IMAP strežnika. Strežnik je odgovoril: %s +unknown sender felamimail sl Neznan poÅ¡iljatelj +unknown user or password incorrect. felamimail sl Neznan uporabnik ali napaÄno geslo. +unread common sl Neprebrano +unseen felamimail sl Novo +unselect all felamimail sl OdznaÄi vse +unsubscribe felamimail sl Odjavi +unsubscribed felamimail sl Odjavljen +unsubscribed successfully! felamimail sl UspeÅ¡no odjavljen! +up felamimail sl Gor +updating message status felamimail sl Posodabljanje stanja sporoÄil +updating view felamimail sl Posodabljanje pogleda +use emailadmin to create profiles felamimail sl uporabi EmailAdmin za izdelavo profilov +use a signature felamimail sl Uporabi podpis +use a signature? felamimail sl Uporabim podpis? +use addresses felamimail sl Uporabi naslove +use custom identities felamimail sl Uporabi identiteto po meri +use custom settings felamimail sl Uporabi lastne nastavitve +use regular expressions felamimail sl uporabite regularne izraze +use smtp auth admin sl Uporabi SMTP avtentikacijo +users can define their own emailaccounts admin sl Uporabniki lahko definirajo lastne E-poÅ¡tne raÄune +vacation notice common sl Obvestilo o odsotnosti +vacation notice is active felamimail sl Obvestilo o odsotnosti je aktivno +vacation start-date must be before the end-date! felamimail sl ZaÄetni datum poÄitnic mora biti pred konÄnim +validate certificate felamimail sl Preveri certifikat +view full header felamimail sl Pokaži celotno glavo +view header lines felamimail sl Pokaži glavo +view message felamimail sl Pokaži sporoÄilo +viewing full header felamimail sl Prikaz celotne glave +viewing message felamimail sl Prikaz sporoÄila +viewing messages felamimail sl Prikaz sporoÄil +wed felamimail sl Sre +when deleting messages felamimail sl Ob brisanju sporoÄil +which folders (additional to the sent folder) should be displayed using the sent folder view schema felamimail sl Katere mape (poleg Poslano) naj bodo prikazane z uporabo sheme Pogled mape Poslano +which folders - in general - should not be automatically created, if not existing felamimail sl Katere mape - na sploÅ¡no - naj ne bodo samodejno ustvarjene, Äe že ne obstajajo +with message felamimail sl S sporoÄilom +with message "%1" felamimail sl S sporoÄilom "%1" +wrap incoming text at felamimail sl Besedilo prelomi pri +writing felamimail sl Pisanje +wrote felamimail sl Je napisal +yes, offer copy option felamimail sl Da, ponudi možnost Kopija +you can use %1 for the above start-date and %2 for the end-date. felamimail sl Za zaÄetni datum lahko uporabite %1 in za konÄni datum %2 +you have received a new message on the felamimail sl Prejeli ste novo sporoÄilo na +your message to %1 was displayed. felamimail sl VaÅ¡e sporoÄilo za %1 je bilo prikazano. diff --git a/felamimail/lang/egw_sv.lang b/felamimail/lang/egw_sv.lang new file mode 100644 index 0000000000..332e2cb895 --- /dev/null +++ b/felamimail/lang/egw_sv.lang @@ -0,0 +1,417 @@ +(no subject) felamimail sv (ingen rubrik) +(only cc/bcc) felamimail sv (endast Cc/Bcc) +(unknown sender) felamimail sv (okänd avsändare) +activate felamimail sv Aktivera +activate script felamimail sv Aktivera skript +add acl felamimail sv Lägg till ACL +add address felamimail sv Lägg till adress +add rule felamimail sv Lägg till regel +add script felamimail sv Lägg till skript +add to %1 felamimail sv Lägg till %1 +add to address book felamimail sv Lägg till i Adressbok +add to addressbook felamimail sv Lägg till i Adressbok +adding file to message. please wait! felamimail sv Bifogar fil i meddelandet. Var god och vänta! +additional info felamimail sv Övrig information +address book felamimail sv Adressbok +address book search felamimail sv Sök i Adressbok +after message body felamimail sv Efter meddelandets innehÃ¥ll +all address books felamimail sv Alla adressböcker +all folders felamimail sv Alla kataloger +all of felamimail sv Alla +allways a new window felamimail sv Alltid nytt fönster +always show html emails felamimail sv Visa alltid HTML e-post +and felamimail sv Och +any of felamimail sv NÃ¥gon av +any status felamimail sv Alla status +anyone felamimail sv Alla +as a subfolder of felamimail sv Som underkatalog till +attachments felamimail sv Bilagor +authentication required felamimail sv Autentisering krävs +auto refresh folder list felamimail sv Auto uppdatera katalog lista +back to folder felamimail sv Tillbaks till katalog +bad login name or password. felamimail sv Ogiltigt användarna eller lösenord +bad or malformed request. server responded: %s felamimail sv Ogiltig eller ofullständig förfrÃ¥gan. Server svarade: %s +bad request: %s felamimail sv Ogiltig förfrÃ¥gan: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail sv Baserat pÃ¥ given kriteria kan inkommande meddelanden ha olika bakgrundsfärg i meddelande listan. Detta är hjälper till att skilja pÃ¥ meddelande typ/avsändare. +bcc felamimail sv Bcc +before headers felamimail sv Före brevhuvud +between headers and message body felamimail sv Mellan brevhuvud och meddelandets innehÃ¥ll +body part felamimail sv MeddelandeinnehÃ¥ll +can't connect to inbox!! felamimail sv Kan inte ansluta till Inkorg +cc felamimail sv Cc +change folder felamimail sv Byt katalog +check message against next rule also felamimail sv Verifiera meddelande även mot nästa regel +checkbox felamimail sv Kryssruta +clear search felamimail sv Rensa sökning +click here to log back in. felamimail sv Till inloggningen +click here to return to %1 felamimail sv Ã…tergÃ¥ till %1 +close all felamimail sv Stäng alla +close this page felamimail sv Stäng sidan +close window felamimail sv Stäng fönster +color felamimail sv Färg +compose felamimail sv Skriv +compress folder felamimail sv Komprimera katalog +condition felamimail sv vilkor +configuration felamimail sv Alternativ +connection dropped by imap server. felamimail sv Anslutningen stängd av IMAP server +contains felamimail sv InnehÃ¥ller +could not complete request. reason given: %s felamimail sv Kunde inte fullfölja förfrÃ¥gan. Svaret: %s +could not open secure connection to the imap server. %s : %s. felamimail sv Kunde inte öppna en söker anslutning till IMAP servern. %s: %s +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail sv CRAM-MD5 och DIGEST-MD5 kräver att Auth_SASL paketet installerats +create felamimail sv Skapa +create folder felamimail sv Skapa Katalog +create sent felamimail sv Skapa Skickat +create subfolder felamimail sv Skapa Underkatalog +create trash felamimail sv Skapa Borttaget +created folder successfully! felamimail sv Skapade katalog +dark blue felamimail sv Mörk BlÃ¥ +dark cyan felamimail sv Mörk Cyan +dark gray felamimail sv Mörk GrÃ¥ +dark green felamimail sv Mörk Grön +dark magenta felamimail sv Mörk Magenta +dark yellow felamimail sv Mörk Gul +date(newest first) felamimail sv Datum (nyaste först) +date(oldest first) felamimail sv Datum (äldsta först) +days felamimail sv Dagar +deactivate script felamimail sv Inaktivera skript +default signature felamimail sv Standard signatur +default sorting order felamimail sv Standard sorterings ordning +delete all felamimail sv Radera alla +delete folder felamimail sv Radera katalog +delete script felamimail sv Radera skript +delete selected felamimail sv Radera valda +delete selected messages felamimail sv Radera valad meddelanden +deleted felamimail sv Raderade +deleted folder successfully! felamimail sv Katalog raderad +deleting messages felamimail sv Raderar meddelanden +disable felamimail sv Inaktivera +discard felamimail sv Ignorera +discard message felamimail sv Ignorera meddelande +display message in new window felamimail sv Visa meddelanden i nytt fönster +display messages in multiple windows felamimail sv Visa meddelanden i flera fönster +display of html emails felamimail sv Visning av HTML e-post +display only when no plain text is available felamimail sv Visa endast när textformat inte är tillgängligt +display preferences felamimail sv Visa alternativ +displaying html messages is disabled felamimail sv Cisa HTML meddelanden är inaktiverat +do it! felamimail sv Gör Det! +do not use sent felamimail sv Använd inte Skickat +do not use trash felamimail sv Använd inte Borttaget +do not validate certificate felamimail sv Validera inte certifikat +do you really want to delete the '%1' folder? felamimail sv Vill du verkligen radera katalogen '%1'? +do you really want to delete the selected signatures? felamimail sv Vill du verkligen radera vald signatur? +does not contain felamimail sv InnehÃ¥ller inte +does not match felamimail sv Matchar inte +does not match regexp felamimail sv Matchar inte regexp +don't use draft folder felamimail sv Använd inte Utkast +don't use sent felamimail sv Använd inte Skickat +don't use trash felamimail sv Använd inte Borttaget +down felamimail sv Ner +download felamimail sv Ladda ner +download this as a file felamimail sv Ladda ner som fil +draft folder felamimail sv Utkast katalog +e-mail felamimail sv E-post +e-mail address felamimail sv E-post adress +e-mail folders felamimail sv E-post katalog +edit email forwarding address felamimail sv Ändra e-post vidarebefodrings adressen +edit filter felamimail sv Ändra filter +edit rule felamimail sv Ändra regler +edit selected felamimail sv Ändra valda +edit vacation settings felamimail sv Ändra frÃ¥nvaro alternativ +email address felamimail sv E-post adress +email forwarding address felamimail sv E-post vidarebefodrings adress +email signature felamimail sv E-post signatur +emailaddress felamimail sv E-post adress +empty trash felamimail sv Töm Borttaget +enable felamimail sv Aktivera +encrypted connection felamimail sv Krypterad anslutning +enter your default mail domain ( from: user@domain ) admin sv Standard e-post domän (From: user@domain) +enter your imap mail server hostname or ip address admin sv IMAP e-post server värdnamn eller IP adress +enter your sieve server hostname or ip address admin sv SIEVE server värdnamn eller IP adress +enter your sieve server port admin sv SIEVE server port +enter your smtp server hostname or ip address admin sv SMTP server värdnamn eller IP adress +enter your smtp server port admin sv SMTP server port +error felamimail sv FEL +error connecting to imap serv felamimail sv Fel: Kunde inte ansluta till IMAP server +error connecting to imap server. %s : %s. felamimail sv Kunde inte ansluta till IMAP server %s : %s +error connecting to imap server: [%s] %s. felamimail sv Kunde inte ansluta till IMAP server [%s] %s +error opening felamimail sv Fel: Kunde inte öppna +every felamimail sv Varje +every %1 days felamimail sv Var %1 dag +expunge felamimail sv UtplÃ¥na +extended felamimail sv Utökad +felamimail common sv FelaMiMail +file into felamimail sv Flytta till +files felamimail sv Filer +filter active felamimail sv Aktiva filter +filter name felamimail sv Filter namn +filter rules felamimail sv Filter regler +first name felamimail sv Förnamn +flagged felamimail sv Flaggad +flags felamimail sv Flaggor +folder acl felamimail sv Katalog ACL +folder name felamimail sv Katalognamn +folder path felamimail sv Katalogsökväg +folder preferences felamimail sv Katalog alternativ +folder settings felamimail sv Katalog alternativ +folder status felamimail sv Katalog status +folderlist felamimail sv Kataloglista +foldername felamimail sv Katalognamn +folders felamimail sv Kataloger +folders created successfully! felamimail sv Katalogen skapad +follow felamimail sv Följ +for mail to be send - not functional yet felamimail sv För meddelande att skicka - inte ännu funktionell +for received mail felamimail sv För mottagna meddelanden +forward felamimail sv Vidarebefodra +forward to felamimail sv Vidarebefodra till +forward to address felamimail sv Vidarebefodra till adress +forwarding felamimail sv Vidarebefodrar +found felamimail sv Hittade +fri felamimail sv Fre +from felamimail sv FrÃ¥n +from(a->z) felamimail sv FrÃ¥n (A->Ö) +from(z->a) felamimail sv FrÃ¥n (Ö->A) +full name felamimail sv Fullständigt namn +greater than felamimail sv Större än +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail sv Se vidare på adressen www.felamimail.org för att läsa mer om Squirrelmail.
    +header lines felamimail sv Brevhuvud +hide header felamimail sv Göm brevhuvud +hostname / address felamimail sv värdnamn / adress +html felamimail sv HTML +icons and text felamimail sv Ikoner och text +icons only felamimail sv Ikoner endast +identifying name felamimail sv ID namn +identity felamimail sv Identitet +if felamimail sv OM +if from contains felamimail sv om FrÃ¥n innehÃ¥ller +if mail header felamimail sv om brevhuvud +if message size felamimail sv om meddelande storlek +if subject contains felamimail sv om Ämne innehÃ¥ller +if to contains felamimail sv om Till innehÃ¥ller +if using ssl or tls, you must have the php openssl extension loaded. felamimail sv Om du vill använda SSL eller TLS mÃ¥ste PHP openssl stödet laddas +illegal folder name. please select a different name. felamimail sv Ogiltigt katalognamn, var god och välj annat. +imap felamimail sv IMAP +imap server felamimail sv IMAP Server +imap server address felamimail sv IMAP Server Adress +imap server closed the connection. felamimail sv IMAP server stängde anslutningen +imap server closed the connection. server responded: %s felamimail sv IMAP server stängde anslutningen. Serverna svarade: %s +imap server password felamimail sv IMAP Server lösenord +imap server type felamimail sv IMAP Server typ +imap server username felamimail sv IMAP Server användarnamn +imaps authentication felamimail sv IMAPS Autentisering +imaps encryption only felamimail sv IMAPS Kryptering endast +in felamimail sv den +inbox felamimail sv Inkorg +incoming mail server(imap) felamimail sv Inkommande e-post server (IMAP) +index order felamimail sv Index Ordning +info felamimail sv Info +invalid user name or password felamimail sv Oglitigt användarnamn eller lösenord +javascript felamimail sv JavaScript +jumping to end felamimail sv Hoppa till slutet +jumping to start felamimail sv Hoppa till början +keep a copy of the message in your inbox felamimail sv Spara en kopia av brev i din Inkorg +keep local copy of email felamimail sv Spara en lokal kopia av brev +kilobytes felamimail sv Kb +language felamimail sv SprÃ¥k +last name felamimail sv Efternamn +left felamimail sv Vänster +less felamimail sv Färre +less than felamimail sv Mindre än +light gray felamimail sv Ljus GrÃ¥ +list all felamimail sv Lista alla +loading felamimail sv Laddar +location of buttons when composing felamimail sv Knapp placering medans man skriver meddelande +mail server login type admin sv E-post server inloggnings typ +mail settings felamimail sv E-post alternativ +mainmessage felamimail sv huvudmeddelande +manage emailaccounts felamimail sv Hantera e-postkonton +manage emailfilter / vacation preferences sv Hantera E-postfilter / FrÃ¥nvaro +manage folders common sv Katalog hantering +manage sieve common sv Hantera Sieve skript +manage signatures felamimail sv Hantera signaturer +mark as deleted felamimail sv Markera som raderad +mark messages as felamimail sv Markera valda meddelanden som +mark selected as flagged felamimail sv Flagga för uppföljning +mark selected as read felamimail sv Markera som läst +mark selected as unflagged felamimail sv Ta bort flagga +mark selected as unread felamimail sv Markera som oläst +match felamimail sv Matcha +matches felamimail sv Matchar +matches regexp felamimail sv Matchar regexp +max uploadsize felamimail sv Max uppladdnings storlek +message highlighting felamimail sv Meddelande fokusering +message list felamimail sv Meddelande lista +messages felamimail sv Meddelanden +mon felamimail sv MÃ¥n +move felamimail sv Flytta +move messages felamimail sv Flytta meddelanden +move to felamimail sv Flytta valda till +move to trash felamimail sv Flytta till Borttaget +moving messages to felamimail sv Flyttar meddelanden till +name felamimail sv Namn +never display html emails felamimail sv Visa inte HTML meddelanden +new common sv Nya +new filter felamimail sv Nytt filter +next felamimail sv Nästa +next message felamimail sv Nästa meddelande +no active imap server found!! felamimail sv Hittade ingen IMAP server! +no encryption felamimail sv Ingen kryptering +no filter felamimail sv Inga filter +no folders found felamimail sv Ingen katalog funnen +no folders were found to subscribe to! felamimail sv Inga kataloger hittades att prenumerera +no folders were found to unsubscribe from! felamimail sv Inga kataloger hittades att avprenumerera +no highlighting is defined felamimail sv Ingen fokusering definierad +no message returned. felamimail sv Inget svar meddelandes +no messages found... felamimail sv Inga meddelanden ... +no messages were selected. felamimail sv Inga meddelanden valda +no plain text part found felamimail sv Hittade inget textfält +no previous message felamimail sv Inga tidigare meddelanden +no supported imap authentication method could be found. felamimail sv Kunde inte hitta supporterad IMAP autentiserings metod +no valid emailprofile selected!! felamimail sv Ingen giltig e-post profil vald +none felamimail sv Inga +on behalf of felamimail sv Företräder +one address is not valid felamimail sv En adress är ogiltig +only inbox felamimail sv Endast Inkorg +only one window felamimail sv Endast ett fönster +only unseen felamimail sv Endast olästa +open all felamimail sv Öpnna alla +options felamimail sv Alternativ +or felamimail sv eller +organisation felamimail sv Organisation +organization felamimail sv Organisation +organization name admin sv Organisations namn +outgoing mail server(smtp) felamimail sv UtgÃ¥ende e-post server (SMTP) +participants felamimail sv Deltagare +personal information felamimail sv Personlig information +please select a address felamimail sv Välj adress +please select the number of days to wait between responses felamimail sv Antal dagar mellan svar +please supply the message to send with auto-responses felamimail sv Meddelande att skicka med autosvar +port felamimail sv Port +posting felamimail sv Postat +previous felamimail sv Tidigare +previous message felamimail sv Tidigare meddelande +print it felamimail sv Skriv ut +print this page felamimail sv Skriv ut sida +quicksearch felamimail sv Snabbsök +read felamimail sv Läst +reading felamimail sv Läser +receive notification felamimail sv Mottag notifieringar +recent felamimail sv Tidigare +refresh time in minutes felamimail sv Uppdaterings intervall i minuter +reject with felamimail sv Avvisa med +remove felamimail sv Radera +remove immediately felamimail sv Radera omedelbart +rename felamimail sv Byt namn +rename a folder felamimail sv Byt namn pÃ¥ katalog +rename folder felamimail sv Byt namn pÃ¥ katalog +renamed successfully! felamimail sv Namnet bytt +replied felamimail sv Svarade +reply felamimail sv Svara +reply all felamimail sv Svara alla +reply to felamimail sv Svara till +replyto felamimail sv Svara till +respond felamimail sv Svara +respond to mail sent to felamimail sv Svars meddelande skickat till +return felamimail sv Ã…tervänd +return to options page felamimail sv Ã…tervänd till alternativ +right felamimail sv Höger +row order style felamimail sv Rad sortering +rule felamimail sv Regel +sat felamimail sv Lör +save felamimail sv Spara +save as draft felamimail sv Spara som utkast +save as infolog felamimail sv Spara som InfoLogg +save changes felamimail sv Spara ändringar +save message to disk felamimail sv Spara meddelanden till disk +script name felamimail sv Skript namn +script status felamimail sv Skript status +search felamimail sv Sök +search for felamimail sv Sök efter +select felamimail sv Välj +select all felamimail sv Välj alla +select emailprofile felamimail sv Välj e-post profil +select folder felamimail sv Välj katalog +select your mail server type admin sv Välj e-post server typ +send felamimail sv Skicka +send a reject message felamimail sv Skicka ett nekande meddelande +sent folder felamimail sv Skickat katalog +show header felamimail sv Visa brevhuvud +show new messages on main screen felamimail sv Visa nya meddelanden pÃ¥ Startsidan +sieve script name felamimail sv Sieve skript namn +sieve settings admin sv Sieve alternativ +signature felamimail sv Signatur +simply click the target-folder felamimail sv Välj mÃ¥lkatalog +size felamimail sv Storlek +size of editor window felamimail sv Editor fönster storlek +size(...->0) felamimail sv Storlek (...->0) +size(0->...) felamimail sv Storlek (0->...) +skipping forward felamimail sv Hoppar framÃ¥t +skipping previous felamimail sv Hoppar bakÃ¥t +small view felamimail sv Liten vy +smtp settings admin sv SMTP alternativ +subject felamimail sv Ämne +subject(a->z) felamimail sv Ämne (A->Ö) +subject(z->a) felamimail sv Ämne (Ö->A) +submit felamimail sv Skicka +subscribe felamimail sv Prenumerera +subscribed felamimail sv Prenumererad +subscribed successfully! felamimail sv Prenumeration lyckad +sun felamimail sv Sön +table of contents felamimail sv InnehÃ¥ll +text only felamimail sv Text endast +the connection to the imap server failed!! felamimail sv Anslutningen till IMAP servern misslyckades +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail sv IMAP servern verkar inte stödja den autentiserings metod du valt. Var god och kontakta administratör. +the mimeparser can not parse this message. felamimail sv MIME-tolken kunde inte tolka meddelandet +then felamimail sv SEN +this folder is empty felamimail sv Katalogen är tom +this php has no imap support compiled in!! felamimail sv Denna installation har inte IMAP stöd kompilerat i PHP. +thu felamimail sv Tor +to felamimail sv Till +to mail sent to felamimail sv Till meddelande skickat till +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail sv För att använda TLS anslutning mÃ¥ste du ha PHP version 5.1.0 eller högre +translation preferences felamimail sv Översättnings alternativ +translation server felamimail sv Översättnings server +trash fold felamimail sv Borttaget +trash folder felamimail sv Borttaget +tue felamimail sv Tis +type felamimail sv Typ +unexpected response from server to authenticate command. felamimail sv Oväntat svar frÃ¥n servern pÃ¥ AUTENTISERINGS kommandot +unexpected response from server to digest-md5 response. felamimail sv Oväntat svar frÃ¥n servern pÃ¥ Digest-MD5 +unexpected response from server to login command. felamimail sv Oväntat svar frÃ¥n servern pÃ¥ INLOGGINGS kommandot +unflagged felamimail sv Oflaggad +unknown err felamimail sv Okänt fel +unknown error felamimail sv Okänt fel +unknown imap response from the server. server responded: %s felamimail sv Okänt IMAP svar frÃ¥n server. Svarade: %s +unknown sender felamimail sv Okänd avsändare +unknown user or password incorrect. felamimail sv Ogiltig användare eller fel lösenord +unread common sv Oläst +unseen felamimail sv Oläst +unselect all felamimail sv Avmarkera alla +unsubscribe felamimail sv Avprenumerera +unsubscribed felamimail sv Avprenumererad +unsubscribed successfully! felamimail sv Avprenumererad +up felamimail sv Upp +updating message status felamimail sv Uppdaterar meddelande status +updating view felamimail sv Uppdaterar vy +use emailadmin to create profiles felamimail sv Använd E-post Admin för att skapa profiler +use a signature felamimail sv Använd signatur +use a signature? felamimail sv Använd signatur? +use addresses felamimail sv Använd adresser +use custom settings felamimail sv Använd anpassade inställningar +use regular expressions felamimail sv Använd regexp +use smtp auth admin sv Använd SMTP autentisering +users can define their own emailaccounts admin sv Användare kan definiera egna epost konton +vacation notice felamimail sv FrÃ¥nvaro meddelande +validate certificate felamimail sv Validera certifikat +view full header felamimail sv Visa hela brevhuvudet +view header lines felamimail sv Visa brevhuvudet +view message felamimail sv Visa meddelandet +viewing full header felamimail sv Visar hela brevhuvudet +viewing message felamimail sv Visar meddelandet +viewing messages felamimail sv Visar meddelanden +wed felamimail sv Ons +when deleting messages felamimail sv Vid meddelande radering +with message felamimail sv Med meddelande +with message "%1" felamimail sv Med meddelande "%1" +wrap incoming text at felamimail sv Avrunda inkommande text vid +writing felamimail sv Skriver +wrote felamimail sv Skrev diff --git a/felamimail/lang/egw_zh-tw.lang b/felamimail/lang/egw_zh-tw.lang new file mode 100644 index 0000000000..4ef3c8f783 --- /dev/null +++ b/felamimail/lang/egw_zh-tw.lang @@ -0,0 +1,421 @@ +(no subject) felamimail zh-tw (沒有標題) +(only cc/bcc) felamimail zh-tw (åªè¦å‰¯æœ¬/密件副本) +(unknown sender) felamimail zh-tw (ä¸çŸ¥å的寄件者) +activate felamimail zh-tw 啟用 +activate script felamimail zh-tw å•Ÿç”¨ç¨‹å¼ +add acl felamimail zh-tw 新增存å–控制 +add address felamimail zh-tw 新增ä½å€ +add rule felamimail zh-tw 新增è¦å‰‡ +add script felamimail zh-tw æ–°å¢žç¨‹å¼ +add to %1 felamimail zh-tw 新增到 %1 +add to address book felamimail zh-tw 加入通訊錄 +add to addressbook felamimail zh-tw 加入通訊錄 +adding file to message. please wait! felamimail zh-tw 新增檔案到訊æ¯ä¸­ï¼Œè«‹ç­‰å¾…ï¼ +additional info felamimail zh-tw 其他資訊 +address book felamimail zh-tw 通訊錄 +address book search felamimail zh-tw æœå°‹é€šè¨ŠéŒ„ +after message body felamimail zh-tw 在訊æ¯å…§å®¹ä¹‹å¾Œ +all address books felamimail zh-tw 所有通訊錄 +all folders felamimail zh-tw 所有資料夾 +all of felamimail zh-tw 所有的 +allow images from external sources in html emails felamimail zh-tw 在 HTML 郵件中å…許來自外部的圖片 +allways a new window felamimail zh-tw 都開啟一個新視窗 +always show html emails felamimail zh-tw 都用HTML顯示郵件 +and felamimail zh-tw 且 +any of felamimail zh-tw ä»»æ„çš„ +any status felamimail zh-tw ä»»æ„狀態 +anyone felamimail zh-tw 任何人 +as a subfolder of felamimail zh-tw å­è³‡æ–™å¤¾åœ¨ +attachments felamimail zh-tw 附加檔案 +authentication required felamimail zh-tw 需è¦ç™»å…¥ +auto refresh folder list felamimail zh-tw 自動更新資料夾清單 +back to folder felamimail zh-tw 回到資料夾 +bad login name or password. felamimail zh-tw 帳號或密碼有誤 +bad or malformed request. server responded: %s felamimail zh-tw 錯誤的請求,伺æœå™¨å›žæ‡‰ï¼š %s +bad request: %s felamimail zh-tw 錯誤的請求: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail zh-tw 基於給予的è¦å‰‡ï¼Œæ”¶é€²ä¾†çš„信件在清單中å¯ä»¥ä½¿ç”¨ä¸åŒçš„背景é¡è‰²ã€‚這樣å­å¯ä»¥è¼•æ˜“的辨識郵件的來æºï¼Œç‰¹åˆ¥æ˜¯é›»å­å ±ã€‚ +bcc felamimail zh-tw 密件副本 +before headers felamimail zh-tw é é¦–ä¹‹å‰ +between headers and message body felamimail zh-tw é é¦–與訊æ¯å…§å®¹ä¹‹é–“ +body part felamimail zh-tw 內容部份 +can't connect to inbox!! felamimail zh-tw 無法連çµæ”¶ä»¶å¤¾ï¼ +cc felamimail zh-tw 副本 +change folder felamimail zh-tw 改變資料夾 +check message against next rule also felamimail zh-tw 也用下一個è¦å‰‡æª¢æŸ¥éƒµä»¶ +checkbox felamimail zh-tw æ ¸é¸æ–¹å¡Š +clear search felamimail zh-tw 清除æœå°‹ +click here to log back in. felamimail zh-tw 點這裡登入 +click here to return to %1 felamimail zh-tw 點這裡回到%1 +close all felamimail zh-tw 全部關閉 +close this page felamimail zh-tw é—œé–‰é€™ä¸€é  +close window felamimail zh-tw 關閉視窗 +color felamimail zh-tw é¡è‰² +compose felamimail zh-tw 建立 +compress folder felamimail zh-tw 壓縮資料夾 +condition felamimail zh-tw æ¢ä»¶ +configuration felamimail zh-tw 設定 +connection dropped by imap server. felamimail zh-tw 連線被 IMAP 伺æœå™¨ä¸­æ–·äº† +contains felamimail zh-tw åŒ…å« +could not complete request. reason given: %s felamimail zh-tw 無法完æˆè«‹æ±‚,ç†ç”±ï¼š %s +could not open secure connection to the imap server. %s : %s. felamimail zh-tw 無法開啟安全連線到 IMAP 伺æœå™¨ã€‚ %s: %s +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail zh-tw CRAM-MD5 或 DIGEST-MD5 需è¦å®‰è£ Auth_SASL 程å¼ã€‚ +create felamimail zh-tw 建立 +create folder felamimail zh-tw 建立資料夾 +create sent felamimail zh-tw 建立寄件備份 +create subfolder felamimail zh-tw 建立å­è³‡æ–™å¤¾ +create trash felamimail zh-tw 建立垃圾桶 +created folder successfully! felamimail zh-tw 建立資料夾完æˆï¼ +dark blue felamimail zh-tw æ·±è— +dark cyan felamimail zh-tw æ·±é’綠 +dark gray felamimail zh-tw æ·±ç° +dark green felamimail zh-tw 深綠 +dark magenta felamimail zh-tw 深紅 +dark yellow felamimail zh-tw 深黃 +date(newest first) felamimail zh-tw 日期(新的在å‰) +date(oldest first) felamimail zh-tw 日期(舊的在å‰) +days felamimail zh-tw æ—¥ +deactivate script felamimail zh-tw åœç”¨ç¨‹å¼ +default signature felamimail zh-tw é è¨­ç°½å +default sorting order felamimail zh-tw é è¨­æŽ’åº +delete all felamimail zh-tw 刪除全部 +delete folder felamimail zh-tw 刪除資料夾 +delete script felamimail zh-tw 刪除指令 +delete selected felamimail zh-tw 刪除所é¸æ“‡çš„ +delete selected messages felamimail zh-tw 刪除所é¸æ“‡çš„è¨Šæ¯ +deleted felamimail zh-tw 刪除日期 +deleted folder successfully! felamimail zh-tw 刪除資料夾完æˆï¼ +deleting messages felamimail zh-tw 刪除信件中 +disable felamimail zh-tw åœç”¨ +discard felamimail zh-tw å–消 +discard message felamimail zh-tw å–消郵件 +display message in new window felamimail zh-tw åœ¨æ–°è¦–çª—é¡¯ç¤ºè¨Šæ¯ +display messages in multiple windows felamimail zh-tw é–‹å•Ÿå¤šå€‹è¦–çª—é¡¯ç¤ºè¨Šæ¯ +display of html emails felamimail zh-tw 顯示HTML郵件 +display only when no plain text is available felamimail zh-tw åªæœ‰åœ¨ä¸åŒ…å«å­˜æ–‡å­—時顯示 +display preferences felamimail zh-tw 顯示設定 +displaying html messages is disabled felamimail zh-tw 顯示 html 信件的功能åœç”¨ä¸­ +do it! felamimail zh-tw åŸ·è¡Œï¼ +do not use sent felamimail zh-tw ä¸ä½¿ç”¨å¯„件備份 +do not use trash felamimail zh-tw ä¸ä½¿ç”¨åžƒåœ¾æ¡¶ +do not validate certificate felamimail zh-tw ä¸é©—證執照 +do you really want to delete the '%1' folder? felamimail zh-tw 您確定è¦åˆªé™¤è³‡æ–™å¤¾ '%1' ? +do you really want to delete the selected signatures? felamimail zh-tw 您確定è¦åˆªé™¤é¸æ“‡çš„ç°½å? +does not contain felamimail zh-tw ä¸åŒ…å« +does not match felamimail zh-tw ä¸ç¬¦åˆ +does not match regexp felamimail zh-tw ä¸ç¬¦åˆæ¢ä»¶ +don't use draft folder felamimail zh-tw ä¸ä½¿ç”¨è‰ç¨¿å¤¾ +don't use sent felamimail zh-tw ä¸ä½¿ç”¨å¯„件備份 +don't use trash felamimail zh-tw ä¸ä½¿ç”¨åžƒåœ¾æ¡¶ +down felamimail zh-tw 下 +download felamimail zh-tw 下載 +download this as a file felamimail zh-tw å¦å­˜æ–°æª” +draft folder felamimail zh-tw è‰ç¨¿å¤¾ +e-mail felamimail zh-tw E-Mail +e-mail address felamimail zh-tw E-Mailä½å€ +e-mail folders felamimail zh-tw 郵件資料夾 +edit email forwarding address felamimail zh-tw 編輯郵件轉寄ä½å€ +edit filter felamimail zh-tw 編輯è¦å‰‡ +edit rule felamimail zh-tw 編輯è¦å‰‡ +edit selected felamimail zh-tw 編輯é¸å–çš„ +edit vacation settings felamimail zh-tw 編輯å‡æœŸè¨­å®š +email address felamimail zh-tw 郵件ä½å€ +email forwarding address felamimail zh-tw 郵件轉寄ä½å€ +email signature felamimail zh-tw ç°½å檔 +emailaddress felamimail zh-tw 郵件ä½å€ +empty trash felamimail zh-tw 清空垃圾桶 +enable felamimail zh-tw 啟用 +encrypted connection felamimail zh-tw 加密的連線 +enter your default mail domain ( from: user@domain ) admin zh-tw 輸入您的é è¨­éƒµä»¶ç¶²åŸŸ +enter your imap mail server hostname or ip address admin zh-tw 輸入您的IMAP伺æœå™¨ä¸»æ©Ÿå稱或IPä½å€ +enter your sieve server hostname or ip address admin zh-tw 輸入您的SIEVE伺æœå™¨ä¸»æ©Ÿå稱或IPä½å€ +enter your sieve server port admin zh-tw 輸入您的SIEVE伺æœå™¨é€£æŽ¥åŸ  +enter your smtp server hostname or ip address admin zh-tw 輸入您的SMTP伺æœå™¨ä¸»æ©Ÿå稱或IPä½å€ +enter your smtp server port admin zh-tw 輸入您的SMTP伺æœå™¨é€£æŽ¥åŸ  +error felamimail zh-tw 錯誤 +error connecting to imap serv felamimail zh-tw 連çµIMAP伺æœå™¨éŒ¯èª¤ +error connecting to imap server. %s : %s. felamimail zh-tw 連線到 IMAP 伺æœå™¨æ™‚發生錯誤。 %s : %s +error connecting to imap server: [%s] %s. felamimail zh-tw 連線到 IMAP 伺æœå™¨æ™‚發生錯誤: [%s] %s +error opening felamimail zh-tw 開啟錯誤 +every felamimail zh-tw æ¯ä¸€ +every %1 days felamimail zh-tw æ¯ %1 天 +expunge felamimail zh-tw 刪去 +extended felamimail zh-tw 延伸的 +felamimail common zh-tw FelaMiMail +file into felamimail zh-tw 檔案æ’å…¥ +files felamimail zh-tw 檔案 +filter active felamimail zh-tw è¦å‰‡å•Ÿç”¨ä¸­ +filter name felamimail zh-tw è¦å‰‡å稱 +filter rules common zh-tw éŽæ¿¾è¦å‰‡ +first name felamimail zh-tw å +flagged felamimail zh-tw 被標示 +flags felamimail zh-tw 標示 +folder acl felamimail zh-tw 資料夾 ACL +folder name felamimail zh-tw 資料夾å稱 +folder path felamimail zh-tw 資料夾路徑 +folder preferences felamimail zh-tw 資料夾å好 +folder settings felamimail zh-tw 資料夾設定 +folder status felamimail zh-tw 資料夾狀態 +folderlist felamimail zh-tw 資料夾清單 +foldername felamimail zh-tw 資料夾å稱 +folders felamimail zh-tw 資料夾 +folders created successfully! felamimail zh-tw 資料夾建立æˆåŠŸï¼ +follow felamimail zh-tw è·Ÿ +for mail to be send - not functional yet felamimail zh-tw è¦å¯„出的郵件 - 尚未寄出 +for received mail felamimail zh-tw 收到的郵件 +forward felamimail zh-tw 轉寄 +forward to felamimail zh-tw 轉寄給 +forward to address felamimail zh-tw 轉寄到信箱 +forwarding felamimail zh-tw 轉寄中 +found felamimail zh-tw 找到 +fri felamimail zh-tw 五 +from felamimail zh-tw 來自 +from(a->z) felamimail zh-tw 從 (A->Z) +from(z->a) felamimail zh-tw 從 (Z->A) +full name felamimail zh-tw å…¨å +greater than felamimail zh-tw 大於 +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail zh-tw 更多訊æ¯è«‹åƒè€ƒwww.felamimail.org
    +header lines felamimail zh-tw é ­æ¢æ–°èž +hide header felamimail zh-tw éš±è—標頭 +hostname / address felamimail zh-tw 主機å稱/ä½å€ +html felamimail zh-tw HTML +icons and text felamimail zh-tw 圖示與文字 +icons only felamimail zh-tw åªé¡¯ç¤ºåœ–示 +identifying name felamimail zh-tw 識別å稱 +identity felamimail zh-tw 識別 +if felamimail zh-tw 如果 +if from contains felamimail zh-tw å¦‚æžœå¯„ä»¶äººåŒ…å« +if mail header felamimail zh-tw 如果郵件標頭 +if message size felamimail zh-tw å¦‚æžœä¿¡ä»¶å¤§å° +if subject contains felamimail zh-tw å¦‚æžœä¸»æ—¨åŒ…å« +if to contains felamimail zh-tw å¦‚æžœæ”¶ä»¶äººåŒ…å« +if using ssl or tls, you must have the php openssl extension loaded. felamimail zh-tw 如果使用 SSL 或 TLS ,您必須先載入 PHP openssl 外掛。 +illegal folder name. please select a different name. felamimail zh-tw 錯誤的資料夾å稱,請é‡æ–°è¼¸å…¥ +imap felamimail zh-tw IMAP +imap server felamimail zh-tw IMAP伺æœå™¨ +imap server address felamimail zh-tw IMAP伺æœå™¨ä½å€ +imap server closed the connection. felamimail zh-tw IMAP伺æœå™¨é—œé–‰é€£ç·š +imap server closed the connection. server responded: %s felamimail zh-tw IMAP伺æœå™¨é—œé–‰é€£ç·šï¼Œä¼ºæœå™¨å›žæ‡‰ï¼š %s +imap server password felamimail zh-tw IMAP伺æœå™¨å¯†ç¢¼ +imap server type felamimail zh-tw IMAP伺æœå™¨ç¨®é¡ž +imap server username felamimail zh-tw IMAP伺æœå™¨å¸³è™Ÿ +imaps authentication felamimail zh-tw IMAPSé©—è­‰ +imaps encryption only felamimail zh-tw åªé€éŽIMAPS加密 +in felamimail zh-tw 在 +inbox felamimail zh-tw 收件匣 +incoming mail server(imap) felamimail zh-tw 收信伺æœå™¨ï¼ˆIMAP) +index order felamimail zh-tw æŽ’åº +info felamimail zh-tw 資訊 +invalid user name or password felamimail zh-tw 錯誤的帳號或密碼 +javascript felamimail zh-tw JavaScript +jumping to end felamimail zh-tw 跳到çµæŸçš„地方 +jumping to start felamimail zh-tw 跳到開始的地方 +keep a copy of the message in your inbox felamimail zh-tw 在收件夾ä¿ç•™éƒµä»¶å‰¯æœ¬ +keep local copy of email felamimail zh-tw 在本機ä¿ç•™ä¿¡ä»¶å‚™ä»½ +kilobytes felamimail zh-tw KB +language felamimail zh-tw 語言 +last name felamimail zh-tw 姓 +left felamimail zh-tw å·¦ +less felamimail zh-tw å°‘ +less than felamimail zh-tw å°æ–¼ +light gray felamimail zh-tw æ·ºç° +list all felamimail zh-tw 顯示全部 +loading felamimail zh-tw 載入中 +location of buttons when composing felamimail zh-tw 建立按鈕時的ä½ç½® +mail server login type admin zh-tw 郵件伺æœå™¨ç™»å…¥ç¨®é¡ž +mail settings felamimail zh-tw 郵件設定 +mainmessage felamimail zh-tw 郵件主體 +manage emailaccounts preferences zh-tw 管ç†éƒµä»¶å¸³è™Ÿ +manage emailfilter / vacation preferences zh-tw 管ç†éƒµä»¶è¦å‰‡/å‡æœŸ +manage folders common zh-tw 管ç†è³‡æ–™å¤¾ +manage sieve common zh-tw 管ç†Sieveç¨‹å¼ +manage signatures felamimail zh-tw 管ç†ç°½å +mark as deleted felamimail zh-tw 標示刪除 +mark messages as felamimail zh-tw 標示é¸å–的訊æ¯ç‚º +mark selected as flagged felamimail zh-tw 標示é¸å–的為標註 +mark selected as read felamimail zh-tw 標示é¸å–çš„ç‚ºå·²è®€å– +mark selected as unflagged felamimail zh-tw 標示é¸å–的為å–消標註 +mark selected as unread felamimail zh-tw 標示é¸å–çš„ç‚ºæœªè®€å– +match felamimail zh-tw ç¬¦åˆ +matches felamimail zh-tw ç¬¦åˆ +matches regexp felamimail zh-tw 符åˆè¦å‰‡ +max uploadsize felamimail zh-tw 上傳檔案大å°ä¸Šé™ +message highlighting felamimail zh-tw 訊æ¯é†’目標示 +message list felamimail zh-tw 訊æ¯æ¸…å–® +messages felamimail zh-tw è¨Šæ¯ +mon felamimail zh-tw 一 +move felamimail zh-tw 移動 +move messages felamimail zh-tw ç§»å‹•è¨Šæ¯ +move to felamimail zh-tw 移動é¸å–的到 +move to trash felamimail zh-tw 移到垃圾桶 +moving messages to felamimail zh-tw 移動信件到 +name felamimail zh-tw å稱 +never display html emails felamimail zh-tw ä¸é¡¯ç¤ºHTML郵件 +new common zh-tw 新增 +new filter felamimail zh-tw æ–°è¦å‰‡ +next felamimail zh-tw 下一個 +next message felamimail zh-tw 下一å°éƒµä»¶ +no active imap server found!! felamimail zh-tw 找ä¸åˆ°å¯ä»¥ä½¿ç”¨çš„ IMAP 伺æœå™¨ï¼ +no encryption felamimail zh-tw 沒有加密 +no filter felamimail zh-tw 沒有éŽæ¿¾è¦å‰‡ +no folders found felamimail zh-tw 找ä¸åˆ°è³‡æ–™å¤¾ +no folders were found to subscribe to! felamimail zh-tw 找ä¸åˆ°å¯ä»¥è¨‚閱的資料夾 +no folders were found to unsubscribe from! felamimail zh-tw 找ä¸åˆ°å¯ä»¥å–消訂閱的資料夾 +no highlighting is defined felamimail zh-tw 未定義醒目標示 +no message returned. felamimail zh-tw 沒有訊æ¯å›žæ‡‰ã€‚ +no messages found... felamimail zh-tw 沒有任何信件... +no messages were selected. felamimail zh-tw 沒有é¸å–ä»»ä½•è¨Šæ¯ +no plain text part found felamimail zh-tw 找ä¸åˆ°ç´”文字部份 +no previous message felamimail zh-tw 沒有上一個 +no recipient address given! felamimail zh-tw æ²’æœ‰è¼¸å…¥æ”¶ä»¶äººä¿¡ç®±ï¼ +no supported imap authentication method could be found. felamimail zh-tw 找ä¸åˆ°èƒ½å¤ ä½¿ç”¨çš„ IMAP 驗證方å¼ã€‚ +no valid emailprofile selected!! felamimail zh-tw 沒有é¸å–å¯ä»¥ä½¿ç”¨çš„éƒµä»¶è³‡æ–™ï¼ +none felamimail zh-tw ç„¡ +on behalf of felamimail zh-tw 代表 +one address is not valid felamimail zh-tw 其中一個信箱格å¼æœ‰èª¤ +only inbox felamimail zh-tw åªæœ‰æ”¶ä»¶å¤¾ +only one window felamimail zh-tw åªé–‹å•Ÿä¸€å€‹è¦–窗 +only unseen felamimail zh-tw åªæœ‰æœªè®€å– +open all felamimail zh-tw 全部開啟 +options felamimail zh-tw é¸é … +or felamimail zh-tw 或 +organisation felamimail zh-tw 組織 +organization felamimail zh-tw 組織 +organization name admin zh-tw 組織å稱 +outgoing mail server(smtp) felamimail zh-tw 寄信伺æœå™¨ï¼ˆSMTP) +participants felamimail zh-tw åƒèˆ‡äºº +personal information felamimail zh-tw 個人資訊 +please select a address felamimail zh-tw è«‹é¸æ“‡ä¸€å€‹ä½å€ +please select the number of days to wait between responses felamimail zh-tw è«‹é¸æ“‡å›žæ‡‰ä¹‹é–“è¦ç­‰å¾…的天數 +please supply the message to send with auto-responses felamimail zh-tw è«‹æä¾›è¦è‡ªå‹•å›žä¿¡çš„內容 +port felamimail zh-tw 連接埠 +posting felamimail zh-tw 發佈中 +previous felamimail zh-tw 上一個 +previous message felamimail zh-tw 上一å°éƒµä»¶ +print it felamimail zh-tw åˆ—å° +print this page felamimail zh-tw å°å‡ºé€™ä¸€é  +quicksearch felamimail zh-tw 快速æœå°‹ +read felamimail zh-tw è®€å– +reading felamimail zh-tw 讀å–中 +receive notification felamimail zh-tw 收到æ醒 +recent felamimail zh-tw 最近 +refresh time in minutes felamimail zh-tw é‡æ–°æ•´ç†çš„分é˜æ•¸ +reject with felamimail zh-tw 拒絕 +remove felamimail zh-tw 移除 +remove immediately felamimail zh-tw 立刻移除 +rename felamimail zh-tw 改å +rename a folder felamimail zh-tw 修改資料匣å稱 +rename folder felamimail zh-tw 修改資料匣å稱 +renamed successfully! felamimail zh-tw 修改å稱完æˆï¼ +replied felamimail zh-tw 已回信 +reply felamimail zh-tw 回信 +reply all felamimail zh-tw 全部回覆 +reply to felamimail zh-tw 回覆到 +replyto felamimail zh-tw 回覆到 +respond felamimail zh-tw 回覆 +respond to mail sent to felamimail zh-tw 回覆到郵件收件人 +return felamimail zh-tw å›žä¸Šé  +return to options page felamimail zh-tw 回到é¸é … +right felamimail zh-tw 正確 +row order style felamimail zh-tw 列順åºé¢¨æ ¼ +rule felamimail zh-tw è¦å‰‡ +sat felamimail zh-tw å…­ +save felamimail zh-tw 儲存 +save as draft felamimail zh-tw 儲存為è‰ç¨¿ +save as infolog felamimail zh-tw 儲存為記事 +save changes felamimail zh-tw 儲存修改 +save message to disk felamimail zh-tw 儲存訊æ¯åˆ°ç¡¬ç¢Ÿ +script name felamimail zh-tw 指令å稱 +script status felamimail zh-tw 指令狀態 +search felamimail zh-tw æœå°‹ +search for felamimail zh-tw æœå°‹ +select felamimail zh-tw é¸æ“‡ +select all felamimail zh-tw é¸æ“‡å…¨éƒ¨ +select emailprofile felamimail zh-tw é¸æ“‡éƒµä»¶è³‡æ–™ +select folder felamimail zh-tw é¸æ“‡è³‡æ–™å¤¾ +select your mail server type admin zh-tw é¸æ“‡æ‚¨çš„郵件伺æœå™¨ç¨®é¡ž +send felamimail zh-tw é€å‡º +send a reject message felamimail zh-tw 寄é€ä¸€å€‹æ‹’絕信件 +sent folder felamimail zh-tw 寄件備份 +server supports mailfilter(sieve) felamimail zh-tw 伺æœå™¨æ”¯æ´éƒµä»¶è¦å‰‡(sieve) +show header felamimail zh-tw 顯示標頭 +show new messages on main screen felamimail zh-tw 在主è¦ç•«é¢é¡¯ç¤ºæ–°è¨Šæ¯ +sieve script name felamimail zh-tw sieve 程å¼å稱 +sieve settings admin zh-tw Sieve設定 +signature felamimail zh-tw ç°½å檔 +simply click the target-folder felamimail zh-tw 點é¸ç›®æ¨™è³‡æ–™å¤¾ +size felamimail zh-tw å¤§å° +size of editor window felamimail zh-tw ç·¨è¼¯è¦–çª—å¤§å° +size(...->0) felamimail zh-tw å¤§å° (...->0) +size(0->...) felamimail zh-tw 大å°(0->...) +skipping forward felamimail zh-tw ç•¥éŽè½‰å¯„ +skipping previous felamimail zh-tw ç•¥éŽä¸Šä¸€å€‹ +small view felamimail zh-tw ç¸®å° +smtp settings admin zh-tw SMTP設定 +subject felamimail zh-tw 主旨 +subject(a->z) felamimail zh-tw 標題(A->Z) +subject(z->a) felamimail zh-tw 標題(Z->A) +submit felamimail zh-tw é€å‡º +subscribe felamimail zh-tw 訂閱 +subscribed felamimail zh-tw 已訂閱 +subscribed successfully! felamimail zh-tw 訂閱完æˆï¼ +sun felamimail zh-tw æ—¥ +table of contents felamimail zh-tw 內容表單 +text only felamimail zh-tw 純文字 +the connection to the imap server failed!! felamimail zh-tw 連çµIMAP伺æœå™¨ç™¼ç”ŸéŒ¯èª¤ï¼ +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail zh-tw IMAP 伺æœå™¨ä¸æ”¯æ´æŒ‡å®šçš„èªè­‰æ–¹å¼ï¼Œè«‹è¯ç¹«æ‚¨çš„系統管ç†å“¡ã€‚ +the mimeparser can not parse this message. felamimail zh-tw mime 解æžç¨‹å¼ç„¡æ³•è™•ç†é€™å°éƒµä»¶ +then felamimail zh-tw 然後 +this folder is empty felamimail zh-tw 這個資料夾沒有任何信件 +this php has no imap support compiled in!! felamimail zh-tw 您的PHP並未編譯為支æ´IMAP的狀態 +thu felamimail zh-tw å›› +to felamimail zh-tw 到 +to mail sent to felamimail zh-tw 到郵件寄件人 +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail zh-tw è¦ä½¿ç”¨ TLS 連線,您必須執行在 PHP 5.1.0 或是更新版本中。 +translation preferences felamimail zh-tw 翻譯å好 +translation server felamimail zh-tw 翻譯伺æœå™¨ +trash fold felamimail zh-tw 垃圾桶 +trash folder felamimail zh-tw 垃圾桶 +tue felamimail zh-tw 二 +type felamimail zh-tw æ ¼å¼ +unexpected response from server to authenticate command. felamimail zh-tw 伺æœå™¨ AUTHENTICATE 指令傳回了ä¸æ˜Žçš„回應。 +unexpected response from server to digest-md5 response. felamimail zh-tw 伺æœå™¨ Digest-MD5 指令傳回了ä¸æ˜Žçš„回應。 +unexpected response from server to login command. felamimail zh-tw 伺æœå™¨ç™»å…¥æŒ‡ä»¤å‚³å›žäº†ä¸æ˜Žçš„回應。 +unflagged felamimail zh-tw å–消標示 +unknown err felamimail zh-tw ä¸çŸ¥å的錯誤 +unknown error felamimail zh-tw ä¸çŸ¥å的錯誤 +unknown imap response from the server. server responded: %s felamimail zh-tw ä¸æ˜Žçš„ IMAP 伺æœå™¨å›žæ‡‰ï¼Œå›žæ‡‰å…§å®¹ï¼š %s +unknown sender felamimail zh-tw ä¸çŸ¥å的寄件人 +unknown user or password incorrect. felamimail zh-tw ä¸çŸ¥å的使用者或是密碼錯誤 +unread common zh-tw æœªè®€å– +unseen felamimail zh-tw æœªè®€å– +unselect all felamimail zh-tw å–消全部é¸å– +unsubscribe felamimail zh-tw å–消訂閱 +unsubscribed felamimail zh-tw å–消訂閱 +unsubscribed successfully! felamimail zh-tw å–消訂閱完æˆï¼ +up felamimail zh-tw 上一層 +updating message status felamimail zh-tw 更新訊æ¯ç‹€æ…‹ä¸­ +updating view felamimail zh-tw 更新檢視 +use emailadmin to create profiles felamimail zh-tw 使用 éƒµä»¶ç®¡ç† ä¾†å»ºç«‹è³‡æ–™ +use a signature felamimail zh-tw 使用簽å檔 +use a signature? felamimail zh-tw 使用簽å檔? +use addresses felamimail zh-tw 使用ä½å€ +use custom settings felamimail zh-tw 使用個人設定 +use regular expressions felamimail zh-tw 使用樣å¼æ¯”å° +use smtp auth admin zh-tw 使用SMTPèªè­‰ +users can define their own emailaccounts admin zh-tw 使用者å¯ä»¥è‡ªè¡Œå®šç¾©éƒµä»¶å¸³è™Ÿ +vacation notice common zh-tw å‡æœŸæ醒 +vacation notice is active felamimail zh-tw å‡æœŸæ醒功能啟用中 +validate certificate felamimail zh-tw é©—è­‰ +view full header felamimail zh-tw 顯示完整標頭 +view header lines felamimail zh-tw 檢視檔頭 +view message felamimail zh-tw é¡¯ç¤ºè¨Šæ¯ +viewing full header felamimail zh-tw 顯示完整標頭中 +viewing message felamimail zh-tw 顯示訊æ¯ä¸­ +viewing messages felamimail zh-tw 顯示訊æ¯ä¸­ +wed felamimail zh-tw 三 +when deleting messages felamimail zh-tw 當刪除訊æ¯æ™‚ +with message felamimail zh-tw 信件 +with message "%1" felamimail zh-tw 信件 "%1" +wrap incoming text at felamimail zh-tw 自動斷行 +writing felamimail zh-tw 編輯中 +wrote felamimail zh-tw 寫 diff --git a/felamimail/lang/egw_zh.lang b/felamimail/lang/egw_zh.lang new file mode 100644 index 0000000000..59efc8aad7 --- /dev/null +++ b/felamimail/lang/egw_zh.lang @@ -0,0 +1,434 @@ +(no subject) felamimail zh (无主题) +(only cc/bcc) felamimail zh (仅抄é€/密é€) +(separate multiple addresses by comma) felamimail zh (多个地å€ç”±é€—å·åˆ†å¼€) +(unknown sender) felamimail zh (未知å‘件人) +activate felamimail zh 激活 +activate script felamimail zh å¯ç”¨è„šæœ¬ +activating by date requires a start- and end-date! felamimail zh 以日期激活需è¦ä¸€ä¸ªå¼€å§‹å’Œç»“æŸæ—¥æœŸï¼ +add acl felamimail zh 添加 ACL +add address felamimail zh æ·»åŠ åœ°å€ +add rule felamimail zh 添加规则 +add script felamimail zh 添加脚本 +add to %1 felamimail zh 添加至%1 +add to address book felamimail zh 添加至通讯录 +add to addressbook felamimail zh 添加至通讯录 +adding file to message. please wait! felamimail zh 添加文件到邮件,请ç¨å€™ï¼ +additional info felamimail zh é™„åŠ ä¿¡æ¯ +address book felamimail zh 通讯簿 +address book search felamimail zh 通讯簿æœç´¢ +after message body felamimail zh åœ¨é‚®ä»¶å†…å®¹åŽ +all address books felamimail zh 所有通讯簿 +all folders felamimail zh 所有邮件夹 +all of felamimail zh 所有的 +allow images from external sources in html emails felamimail zh 在HTML邮件中å…许外部图片æ¥æº +allways a new window felamimail zh å…è®¸æ–°çª—å£ +always show html emails felamimail zh 总是显示HTML邮件 +and felamimail zh å’Œ +any of felamimail zh 任何 +any status felamimail zh ä»»ä½•çŠ¶æ€ +anyone felamimail zh 任何人 +as a subfolder of felamimail zh 作为该邮件夹的å­é‚®ä»¶å¤¹ +attachments felamimail zh 附件 +authentication required felamimail zh å¿…è¦é™„件 +auto refresh folder list felamimail zh 自动刷新邮件夹列表 +back to folder felamimail zh 返回邮件夹 +bad login name or password. felamimail zh 错误登录åæˆ–å¯†ç  +bad or malformed request. server responded: %s felamimail zh ä¸æ­£ç¡®çš„请求。æœåŠ¡å™¨æˆ–应:%s +bad request: %s felamimail zh 错误请求:%s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail zh 基于给定的标准,接收的邮件在列表中å¯ä»¥ä½¿ç”¨ä¸åŒçš„背景颜色,这å¯ä»¥æœ‰åŠ©äºŽè½»æ˜“辨别邮件的æ¥æºï¼Œç‰¹åˆ«æ˜¯é‚®ä»¶åˆ—表。 +bcc felamimail zh å¯†é€ +before headers felamimail zh åœ¨é‚®ä»¶å¤´ä¹‹å‰ +between headers and message body felamimail zh 在邮件头和邮件内容之间 +body part felamimail zh 内容部份 +by date felamimail zh 以日期 +can not send message. no recipient defined! felamimail zh ä¸èƒ½å‘é€é‚®ä»¶ã€‚æ”¶ä»¶äººæ²¡æœ‰å®šä¹‰ï¼ +can't connect to inbox!! felamimail zh æ— æ³•è¿žæŽ¥æ”¶ä»¶ç®±ï¼ +cc felamimail zh æŠ„é€ +change folder felamimail zh 更改邮件夹 +check message against next rule also felamimail zh 也用下一个规则检查邮件 +checkbox felamimail zh å¤é€‰æ¡† +clear search felamimail zh 清除æœç´¢ +click here to log back in. felamimail zh 点击此处登录. +click here to return to %1 felamimail zh 点击此处返回到 %1 +close all felamimail zh 全部关闭 +close this page felamimail zh å…³é—­è¯¥é¡µé¢ +close window felamimail zh å…³é—­çª—å£ +color felamimail zh 颜色 +compose felamimail zh 撰写 +compress folder felamimail zh 压缩文件夹 +condition felamimail zh æ¡ä»¶ +configuration felamimail zh é…ç½® +connection dropped by imap server. felamimail zh 连接被 IMAP æœåŠ¡å™¨ä¸­æ–­ +contains felamimail zh åŒ…å« +could not complete request. reason given: %s felamimail zh 无法完æˆè¯·æ±‚。原因是:%s +could not open secure connection to the imap server. %s : %s. felamimail zh 无法开å¯åˆ° IMAP æœåŠ¡å™¨çš„安全连接。%s:%s。 +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail zh CRAM-MD5 或 DIGEST-MD5 需è¦å®‰è£… Auth_SASL 包。 +create felamimail zh 创建 +create folder felamimail zh 创建邮件夹 +create sent felamimail zh 创建å‘件箱 +create subfolder felamimail zh 创建å­é‚®ä»¶å¤¹ +create trash felamimail zh 创建回收站 +created folder successfully! felamimail zh 邮件夹创建æˆåŠŸï¼ +dark blue felamimail zh æš—è“色 +dark cyan felamimail zh æš—é’色 +dark gray felamimail zh æš—ç°è‰² +dark green felamimail zh 暗绿色 +dark magenta felamimail zh 暗紫色 +dark yellow felamimail zh 暗黄色 +date(newest first) felamimail zh 日期 (最近邮件优先) +date(oldest first) felamimail zh 日期 (最早邮件优先) +days felamimail zh 天 +deactivate script felamimail zh åœç”¨è„šæœ¬ +default felamimail zh 默认 +default signature felamimail zh 默认签å +default sorting order felamimail zh é»˜è®¤æŽ’åº +delete all felamimail zh 全部删除 +delete folder felamimail zh 删除邮件夹 +delete script felamimail zh 删除脚本 +delete selected felamimail zh 删除所选 +delete selected messages felamimail zh 删除选择的邮件 +deleted felamimail zh 已删除 +deleted folder successfully! felamimail zh 邮件夹删除æˆåŠŸ! +deleting messages felamimail zh 删除邮件 +disable felamimail zh ç¦ç”¨ +discard felamimail zh å–消 +discard message felamimail zh å–消邮件 +display message in new window felamimail zh 打开新窗å£ä»¥æŸ¥çœ‹é‚®ä»¶ +display messages in multiple windows felamimail zh 在多窗å£æ˜¾ç¤ºé‚®ä»¶ +display of html emails felamimail zh 显示HTML邮件 +display only when no plain text is available felamimail zh 仅当邮件éžçº¯æ–‡æœ¬æ—¶æ˜¾ç¤º +display preferences felamimail zh 显示用户å‚æ•° +displaying html messages is disabled felamimail zh 显示HTML邮件被ç¦ç”¨ +do it! felamimail zh æ‰§è¡Œï¼ +do not use sent felamimail zh ä¸ä½¿ç”¨å‘件箱 +do not use trash felamimail zh ä¸ä½¿ç”¨å›žæ”¶ç«™ +do not validate certificate felamimail zh ä¸ç¡®è®¤è¯ä¹¦ +do you really want to delete the '%1' folder? felamimail zh 确定è¦åˆ é™¤é‚®ä»¶å¤¹'%1'å—? +do you really want to delete the selected signatures? felamimail zh 您确定è¦åˆ é™¤é€‰æ‹©çš„ç­¾åå—? +does not contain felamimail zh ä¸åŒ…å« +does not match felamimail zh ä¸ç¬¦åˆ +does not match regexp felamimail zh ä¸ç¬¦åˆæ¡ä»¶ +don't use draft folder felamimail zh ä¸ä½¿ç”¨è‰ç¨¿å¤¹ +don't use sent felamimail zh ä¸ä½¿ç”¨å‘件箱 +don't use trash felamimail zh ä¸ä½¿ç”¨å›žæ”¶ç«™ +down felamimail zh å‘下 +download felamimail zh 下载 +download this as a file felamimail zh 作为文件下载 +draft folder felamimail zh è‰ç¨¿å¤¹ +e-mail felamimail zh 电å­é‚®ä»¶ +e-mail address felamimail zh é‚®ä»¶åœ°å€ +e-mail folders felamimail zh 邮件夹 +edit email forwarding address felamimail zh 编辑邮件转å‘åœ°å€ +edit filter felamimail zh 编辑过滤器 +edit rule felamimail zh 编辑规则 +edit selected felamimail zh 编辑选定 +edit vacation settings felamimail zh 编辑å‡æœŸè®¾ç½® +email address felamimail zh é‚®ä»¶åœ°å€ +email forwarding address felamimail zh 邮件转å‘åœ°å€ +email signature felamimail zh 邮件签å +emailaddress felamimail zh é‚®ä»¶åœ°å€ +empty trash felamimail zh 清空回收站 +enable felamimail zh å¯ç”¨ +encrypted connection felamimail zh 加密的连接 +enter your default mail domain ( from: user@domain ) admin zh 输入您的默认邮件域(如:user@domain 中 @ 之åŽçš„所字æ¯) +enter your imap mail server hostname or ip address admin zh 输入您的 IMAP æœåŠ¡å™¨ä¸»æœºå或 IP åœ°å€ +enter your sieve server hostname or ip address admin zh 输入您的 ISIEV æœåŠ¡å™¨ä¸»æœºå或 IP åœ°å€ +enter your sieve server port admin zh 输入您的 ISIEV æœåŠ¡å™¨ç«¯å£ +enter your smtp server hostname or ip address admin zh 输入您的 SMAP æœåŠ¡å™¨ä¸»æœºå或 IP åœ°å€ +enter your smtp server port admin zh 输入您的 SMAP æœåŠ¡å™¨ç«¯å£ +error felamimail zh 错误 +error connecting to imap serv felamimail zh 连接 IMAP æœåŠ¡å™¨é”™è¯¯ +error connecting to imap server. %s : %s. felamimail zh 连接到 IMAP æœåŠ¡å™¨é”™è¯¯ã€‚%s:%s。 +error connecting to imap server: [%s] %s. felamimail zh 连接到 IMAP æœåŠ¡å™¨é”™è¯¯ï¼š[%s] %s。 +error opening felamimail zh 打开错误 +every felamimail zh æ¯ä¸€ +every %1 days felamimail zh æ¯ %1 天 +expunge felamimail zh 删掉 +extended felamimail zh 延伸的 +felamimail common zh 我的邮箱 +file into felamimail zh 文件æ’å…¥ +files felamimail zh 文件 +filter active felamimail zh 过滤器激活 +filter name felamimail zh 过滤器å称 +filter rules common zh 过滤规则 +first name felamimail zh å +flagged felamimail zh 已标记 +flags felamimail zh 标记 +folder felamimail zh 邮件夹 +folder acl felamimail zh 邮件夹 ACL +folder name felamimail zh 邮件夹å称 +folder path felamimail zh 邮件夹路径 +folder preferences felamimail zh 邮件夹用户å‚æ•° +folder settings felamimail zh 邮件夹设置 +folder status felamimail zh é‚®ä»¶å¤¹çŠ¶æ€ +folderlist felamimail zh 邮件夹列表 +foldername felamimail zh 邮件夹å称 +folders felamimail zh 邮件夹 +folders created successfully! felamimail zh 邮件夹创建æˆåŠŸï¼ +follow felamimail zh è·Ÿ +for mail to be send - not functional yet felamimail zh è¦å‘出的邮件 - 尚未å‘出 +for received mail felamimail zh 收到的邮件 +forward felamimail zh è½¬å‘ +forward messages to felamimail zh 转å‘邮件到 +forward to felamimail zh 转å‘到 +forward to address felamimail zh 转å‘åˆ°åœ°å€ +forwarding felamimail zh 转å‘中 +found felamimail zh 建立 +fri felamimail zh 五 +from felamimail zh å‘件人 +from(a->z) felamimail zh 从 (A->Z) +from(z->a) felamimail zh 从 (Z->A) +full name felamimail zh 姓å +greater than felamimail zh 大于 +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail zh 更多信æ¯è¯·å‚考www.felamimail.org
    +header lines felamimail zh 邮件头 +hide header felamimail zh éšè—邮件头 +hostname / address felamimail zh 主机å / åœ°å€ +html felamimail zh HTML +icons and text felamimail zh 图标与文字 +icons only felamimail zh åªæ˜¾ç¤ºå›¾æ ‡ +identifying name felamimail zh 正在识别å称 +identity felamimail zh 身份 +if felamimail zh 如果 +if from contains felamimail zh 如果å‘ä»¶äººåŒ…å« +if mail header felamimail zh 如果邮件头 +if message size felamimail zh å¦‚æžœé‚®ä»¶å¤§å° +if subject contains felamimail zh å¦‚æžœä¸»é¢˜åŒ…å« +if to contains felamimail zh å¦‚æžœæ”¶ä»¶äººåŒ…å« +if using ssl or tls, you must have the php openssl extension loaded. felamimail zh 如果使用 SSL 或 TLS,您必须加载 PHP openssl 扩展。 +illegal folder name. please select a different name. felamimail zh 邮件夹å称无效。请指定其他å称。 +imap felamimail zh IMAP +imap server felamimail zh IMAP æœåŠ¡å™¨ +imap server address felamimail zh IMAP æœåŠ¡å™¨åœ°å€ +imap server closed the connection. felamimail zh IMAP æœåŠ¡å™¨å·²å…³é—­è¿žæŽ¥ã€‚ +imap server closed the connection. server responded: %s felamimail zh IMAP æœåŠ¡å™¨å·²å…³é—­è¿žæŽ¥ã€‚æœåŠ¡å™¨å›žåº”:%s +imap server password felamimail zh IMAP æœåŠ¡å™¨å¯†ç  +imap server type felamimail zh IMAP æœåŠ¡å™¨ç±»åž‹ +imap server username felamimail zh IMAP æœåŠ¡å™¨ç”¨æˆ·å +imaps authentication felamimail zh IMAPS èº«ä»½éªŒè¯ +imaps encryption only felamimail zh ä»… IMAPS 加密 +in felamimail zh 在 +inbox felamimail zh 收件箱 +incoming mail server(imap) felamimail zh 收件æœåŠ¡å™¨(IMAP) +index order felamimail zh ç´¢å¼•é¡ºåº +info felamimail zh ä¿¡æ¯ +invalid user name or password felamimail zh 用户å或密ç æ— æ•ˆ +javascript felamimail zh JavaScript +jumping to end felamimail zh 跳到结尾 +jumping to start felamimail zh 跳到开始 +keep a copy of the message in your inbox felamimail zh 在收件箱ä¿ç•™ä¸€ä¸ªé‚®ä»¶å‰¯æœ¬ +keep local copy of email felamimail zh 在本地ä¿ç•™é‚®ä»¶å‰¯æœ¬ +kilobytes felamimail zh kb +language felamimail zh 语言 +last name felamimail zh 姓 +left felamimail zh å·¦ +less felamimail zh å°‘ +less than felamimail zh 少于 +light gray felamimail zh 亮ç°è‰² +list all felamimail zh 全部列出 +loading felamimail zh 载入 +location of buttons when composing felamimail zh 排版时按钮的ä½ç½® +mail server login type admin zh 邮件æœåŠ¡å™¨ç™»å½•ç±»åž‹ +mail settings felamimail zh 邮件设置 +mainmessage felamimail zh 主è¦é‚®ä»¶ +manage emailaccounts preferences zh 管ç†é‚®ä»¶å¸æˆ· +manage emailfilter / vacation preferences zh 管ç†é‚®ä»¶è¿‡æ»¤ / å‡æœŸ +manage folders common zh é‚®ä»¶å¤¹ç®¡ç† +manage sieve common zh 管ç†æœåŠ¡å™¨è„šæœ¬ +manage signatures felamimail zh 管ç†ç­¾å +mark as deleted felamimail zh 标记为已删除 +mark messages as felamimail zh 将选定邮件标记为 +mark selected as flagged felamimail zh 标记选定邮件 +mark selected as read felamimail zh 将选定邮件标记为已读 +mark selected as unflagged felamimail zh 清除选定邮件标记 +mark selected as unread felamimail zh 将选定邮件标记为未读 +match felamimail zh ç¬¦åˆ +matches felamimail zh ç¬¦åˆ +matches regexp felamimail zh 符åˆè§„则 +max uploadsize felamimail zh 最大上传 +message highlighting felamimail zh 邮件高亮显示 +message list felamimail zh 邮件列表 +messages felamimail zh 邮件 +mon felamimail zh 一 +move felamimail zh 移动 +move messages felamimail zh 移动邮件 +move to felamimail zh 将选定邮件移至 +move to trash felamimail zh 移动至回收站 +moving messages to felamimail zh 移动邮件到 +name felamimail zh å称 +never display html emails felamimail zh 从ä¸æ˜¾ç¤º HTML 邮件 +new common zh 新建 +new filter felamimail zh 新建过滤器 +next felamimail zh 下一个 +next message felamimail zh 下一å°é‚®ä»¶ +no active imap server found!! felamimail zh 找ä¸åˆ°å¯ä½¿ç”¨çš„ IMAP æœåŠ¡å™¨ï¼ +no encryption felamimail zh 未加密 +no filter felamimail zh 无过滤器 +no folders found felamimail zh 找ä¸åˆ°é‚®ä»¶å¤¹ +no folders were found to subscribe to! felamimail zh 找ä¸åˆ°å¯ä»¥è®¢é˜…çš„æ–‡ä»¶å¤¹ï¼ +no folders were found to unsubscribe from! felamimail zh 找ä¸åˆ°å¯ä»¥å–消订阅的邮件夹 +no highlighting is defined felamimail zh 为定义çªå‡ºæ˜¾ç¤º +no message returned. felamimail zh 没有邮件回应 +no messages found... felamimail zh 未å‘现邮件... +no messages were selected. felamimail zh 没有选择任何邮件。 +no plain text part found felamimail zh 未找到纯文本部分 +no previous message felamimail zh 没有上一个 +no recipient address given! felamimail zh 没有给定收件人地å€ï¼ +no signature felamimail zh 没有签å +no subject given! felamimail zh æ²¡æœ‰æŒ‡å®šçš„ä¸»é¢˜ï¼ +no supported imap authentication method could be found. felamimail zh 找ä¸åˆ°æ”¯æŒ IMAP 验è¯æ–¹æ³•ã€‚ +no valid emailprofile selected!! felamimail zh 指定的邮件å¸æˆ·æ— æ•ˆï¼ +none felamimail zh æ—  +on behalf of felamimail zh 代表 +one address is not valid felamimail zh 其中一个地å€æ— æ•ˆ +only inbox felamimail zh åªæœ‰æ”¶ä»¶ç®± +only one window felamimail zh åªä¸€ä¸ªçª—å£ +only unseen felamimail zh åªæœ‰æœªè¯»å– +open all felamimail zh 全部打开 +options felamimail zh 选项 +or felamimail zh 或 +organisation felamimail zh 组织 +organization felamimail zh 组织 +organization name admin zh 组织å称 +outgoing mail server(smtp) felamimail zh å‘件邮件æœåŠ¡å™¨(IMAP) +participants felamimail zh å‚与者 +personal information felamimail zh ä¸ªäººä¿¡æ¯ +please select a address felamimail zh è¯·é€‰æ‹©åœ°å€ +please select the number of days to wait between responses felamimail zh 请选择回å¤ä¹‹é—´è¦ç­‰å¾…的天数 +please supply the message to send with auto-responses felamimail zh 请æä¾›è¦è‡ªåŠ¨å›žå¤çš„内容 +port felamimail zh ç«¯å£ +posting felamimail zh å‘布中 +previous felamimail zh 上一个 +previous message felamimail zh 上一å°é‚®ä»¶ +print it felamimail zh æ‰“å° +print this page felamimail zh 打å°è¯¥é¡µ +quicksearch felamimail zh 快速æœç´¢ +read felamimail zh 已读 +reading felamimail zh 读å–中 +receive notification felamimail zh 接收通知 +recent felamimail zh 最近 +refresh time in minutes felamimail zh 刷新时间分钟数 +reject with felamimail zh æ‹’ç» +remove felamimail zh 删除 +remove immediately felamimail zh 立刻删除 +rename felamimail zh é‡å‘½å +rename a folder felamimail zh é‡å‘½å一个文件夹 +rename folder felamimail zh é‡å‘½å邮件夹 +renamed successfully! felamimail zh é‡å‘½å邮件夹æˆåŠŸï¼ +replied felamimail zh å·²å›žå¤ +reply felamimail zh å›žå¤ +reply all felamimail zh å…¨éƒ¨å›žå¤ +reply to felamimail zh 回å¤åˆ° +replyto felamimail zh 回å¤åˆ° +respond felamimail zh å›žå¤ +respond to mail sent to felamimail zh 回å¤é‚®ä»¶æ”¶ä»¶äºº +return felamimail zh 返回 +return to options page felamimail zh 返回到选项 +right felamimail zh 正确 +row order style felamimail zh 行排åºç±»åž‹ +rule felamimail zh 规则 +sat felamimail zh å…­ +save felamimail zh ä¿å­˜ +save as draft felamimail zh 存为è‰ç¨¿ +save as infolog felamimail zh 存为记事本 +save changes felamimail zh ä¿å­˜ä¸ºä¿®æ”¹ +save message to disk felamimail zh ä¿å­˜é‚®ä»¶åˆ°ç£ç›˜ +script name felamimail zh 脚本å +script status felamimail zh è„šæœ¬çŠ¶æ€ +search felamimail zh æœç´¢ +search for felamimail zh æœç´¢ +select felamimail zh 选择 +select all felamimail zh 全选 +select emailprofile felamimail zh 选择邮件 Profile +select folder felamimail zh 选择文件夹 +select your mail server type admin zh 选择您的邮件æœåŠ¡å™¨ç±»åž‹ +send felamimail zh å‘é€ +send a reject message felamimail zh å‘é€ä¸€æ‹’ç»é‚®ä»¶ +sent folder felamimail zh å‘件夹 +server supports mailfilter(sieve) felamimail zh æœåŠ¡å™¨æ”¯æŒé‚®ä»¶è¿‡æ»¤(sieve) +set as default felamimail zh è®¾ç½®ä½œä¸ºç¼ºçœ +show header felamimail zh 显示邮件头 +show new messages on main screen felamimail zh 在首页上显示新邮件 +sieve script name felamimail zh Sieve 脚本å +sieve settings admin zh Sieve 设置 +signature felamimail zh ç­¾å +simply click the target-folder felamimail zh 简å•åœ°ç‚¹å‡»ç›®æ ‡æ–‡ä»¶å¤¹ +size felamimail zh å¤§å° +size of editor window felamimail zh 编辑窗å£å¤§å° +size(...->0) felamimail zh å¤§å° (...->0) +size(0->...) felamimail zh 大å°(0->...) +skipping forward felamimail zh 跳到å‰é¢ +skipping previous felamimail zh 跳回上一个 +small view felamimail zh å°è§†å›¾ +smtp settings admin zh SMTP设置 +subject felamimail zh 主题 +subject(a->z) felamimail zh 主题 (A->Z) +subject(z->a) felamimail zh 主题 (Z->A) +submit felamimail zh æ交 +subscribe felamimail zh 订阅 +subscribed felamimail zh 已订阅 +subscribed successfully! felamimail zh 订阅æˆåŠŸï¼ +sun felamimail zh æ—¥ +system signature felamimail zh 系统签å +table of contents felamimail zh 目录 +text only felamimail zh 纯文字 +the connection to the imap server failed!! felamimail zh 连接 IMAP æœåŠ¡å™¨å‘ç”Ÿé”™è¯¯ï¼ +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail zh IMAP æœåŠ¡å™¨ä¸æ”¯æŒé€‰å®šçš„认è¯æ–¹æ³•ã€‚请è”系系统管ç†å‘˜ã€‚ +the mimeparser can not parse this message. felamimail zh mime 解æžå™¨ä¸èƒ½è§£æžè¿™ä¸ªé‚®ä»¶ã€‚ +then felamimail zh ç„¶åŽ +this folder is empty felamimail zh 这个文件夹时空的 +this php has no imap support compiled in!! felamimail zh 您的 PHP å¹¶æœªç¼–è¯‘ä¸ºæ”¯æŒ IMAPï¼ +thu felamimail zh å›› +to felamimail zh 收件人 +to mail sent to felamimail zh 到邮件收件人 +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail zh è¦ä½¿ç”¨ TLS 连接,您必须è¿è¡Œ PHP 5.1.0 或更高版本。 +translation preferences felamimail zh 翻译å好 +translation server felamimail zh 翻译æœåŠ¡å™¨ +trash fold felamimail zh 垃圾桶 +trash folder felamimail zh 回收站 +tue felamimail zh 二 +type felamimail zh 类型 +unexpected response from server to authenticate command. felamimail zh æœåŠ¡å™¨ AUTHENTICATE 指令返回了ä¸æ˜Žå›žåº”。 +unexpected response from server to digest-md5 response. felamimail zh æœåŠ¡å™¨ Digest-MD5 指令返回了ä¸æ˜Žå›žåº”。 +unexpected response from server to login command. felamimail zh æœåŠ¡å™¨ç™»å½•æŒ‡ä»¤è¿”回了ä¸æ˜Žå›žåº”。 +unflagged felamimail zh 已清除标记 +unknown err felamimail zh 未知错误 +unknown error felamimail zh 未知错误 +unknown imap response from the server. server responded: %s felamimail zh 未知 IMAP æœåŠ¡å™¨å›žåº”。æœåŠ¡å™¨å›žåº”:%s +unknown sender felamimail zh 未知å‘件人 +unknown user or password incorrect. felamimail zh 未知用户或密ç é”™è¯¯ã€‚ +unread common zh 未读 +unseen felamimail zh 未读 +unselect all felamimail zh å–消全部选择 +unsubscribe felamimail zh å–消订阅 +unsubscribed felamimail zh å·²å–消订阅 +unsubscribed successfully! felamimail zh å–消订阅æˆåŠŸï¼ +up felamimail zh å‘上 +updating message status felamimail zh æ›´æ–°é‚®ä»¶çŠ¶æ€ +updating view felamimail zh 更新查看 +use emailadmin to create profiles felamimail zh 使用邮件管ç†æ¥åˆ›å»ºé…置文件(profile) +use a signature felamimail zh 使用签å +use a signature? felamimail zh 使用签å? +use addresses felamimail zh ä½¿ç”¨åœ°å€ +use custom settings felamimail zh 使用自定义设置 +use regular expressions felamimail zh ä½¿ç”¨æ­£åˆ™è¡¨è¾¾å¼ +use smtp auth admin zh 使用 SMTP è®¤è¯ +users can define their own emailaccounts admin zh 用户å¯å®šä¹‰ä»–们自己的邮件å¸æˆ· +vacation notice common zh å‡æœŸé€šçŸ¥ +vacation notice is active felamimail zh å‡æœŸé€šçŸ¥å·²æ¿€æ´» +vacation start-date must be before the end-date! felamimail zh å‡æœŸå¼€å§‹æ—¥æœŸå¿…须是在结æŸæ—¥æœŸä¹‹å‰ï¼ +validate certificate felamimail zh 有效è¯ä¹¦ +view full header felamimail zh 查看完整邮件头 +view header lines felamimail zh 查看邮件头 +view message felamimail zh 查看邮件 +viewing full header felamimail zh 查看完整邮件头 +viewing message felamimail zh 查看邮件 +viewing messages felamimail zh 查看邮件 +wed felamimail zh 三 +when deleting messages felamimail zh 当删除邮件时 +with message felamimail zh 与邮件 +with message "%1" felamimail zh 与邮件"%1" +wrap incoming text at felamimail zh 邮件æ¢è¡Œè®¾ç½® +writing felamimail zh 写 +wrote felamimail zh 写信 +you can use %1 for the above start-date and %2 for the end-date. felamimail zh 您å¯ä»¥ä½¿ç”¨ä¸Šè¿°å¼€å§‹æ—¥æœŸ%1和结æŸæ—¥æœŸ%2。 diff --git a/felamimail/setup/etemplates.inc.php b/felamimail/setup/etemplates.inc.php new file mode 100644 index 0000000000..b6ce6be0e4 --- /dev/null +++ b/felamimail/setup/etemplates.inc.php @@ -0,0 +1,65 @@ + 'felamimail.stationery.sample','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:4:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:7:",header";s:5:"label";s:6:"Header";}}i:2;a:1:{s:1:"A";a:4:{s:4:"type";s:4:"html";s:4:"name";s:7:"message";s:4:"span";s:8:",message";s:5:"label";s:7:"message";}}i:3;a:1:{s:1:"A";a:4:{s:4:"type";s:4:"html";s:4:"name";s:9:"signature";s:4:"span";s:10:",signature";s:5:"label";s:9:"signature";}}}s:4:"rows";i:3;s:4:"cols";i:1;s:4:"size";s:21:"100%,,0,fullwidth,0,0";s:7:"options";a:5:{i:3;s:9:"fullwidth";i:0;s:4:"100%";i:4;s:1:"0";i:5;s:1:"0";i:2;s:1:"0";}}}','size' => '100%,,0,fullwidth,0,0','style' => 'body { + font-family: "Lucida Grande"; + font-size: 12px; + color: #000000; + background-color: #eaeaea; + margin: 0; + padding: 0; +} + +table.fullwidth { + table-layout:fixed; + width: 100%; + margin: 0; + padding: 0; + border: 0; +} + +td.header { + background-color: #322f40; + color: #ffffff; + font-weight: bold; + margin: 0; + padding: 1em; + border-left: 6px solid #504a66; + border-bottom: 1px solid #504a66; +} + +td.message { + margin: 0.5em; + padding: 1em; + color: #333333; + font-family: "Lucida Grande"; + font-size: 12px; +} + +td.signature { + color: #666666; + border-left: 5px solid #747474; + margin: 0.5em; + padding-left: 8px; + font-family: "Lucida Grande"; + font-size: 12px; +} + +img { + border: 0; + margin: 0; + padding: 0; +} +','modified' => '1250287711',); + diff --git a/felamimail/setup/setup.inc.php b/felamimail/setup/setup.inc.php new file mode 100644 index 0000000000..45b825fe08 --- /dev/null +++ b/felamimail/setup/setup.inc.php @@ -0,0 +1,85 @@ + 'phpgwapi', + 'versions' => Array('1.7','1.8','1.9') +); +$setup_info['felamimail']['depends'][] = array( + 'appname' => 'emailadmin', + 'versions' => Array('1.7','1.8','1.9') +); +$setup_info['felamimail']['depends'][] = array( + 'appname' => 'egw-pear', + 'versions' => Array('1.8','1.9') +); +// installation checks for felamimail +$setup_info['felamimail']['check_install'] = array( + '' => array( + 'func' => 'pear_check', + ), +# get's provided by egw-pear temporarly + 'Net_Sieve' => array( + 'func' => 'pear_check', + ), + 'Net_IMAP' => array( + 'func' => 'pear_check', + ), + 'Auth_SASL' => array( + 'func' => 'pear_check', + ), + 'Mail_Mime' => array( + 'func' => 'pear_check', + 'version' => '1.4.1', + ), + 'Mail_mimeDecode' => array( + 'func' => 'pear_check', + ), + 'imap' => array( + 'func' => 'extension_check', + ), + 'magic_quotes_gpc' => array( + 'func' => 'php_ini_check', + 'value' => 0, + 'verbose_value' => 'Off', + ), + 'tnef' => array( + 'func' => 'tnef_check', + ), +); diff --git a/felamimail/setup/tables_current.inc.php b/felamimail/setup/tables_current.inc.php new file mode 100644 index 0000000000..f4642298ed --- /dev/null +++ b/felamimail/setup/tables_current.inc.php @@ -0,0 +1,73 @@ + array( + 'fd' => array( + 'fmail_filter_accountid' => array('type' => 'int','precision' => '4','nullable' => False), + 'fmail_filter_data' => array('type' => 'text') + ), + 'pk' => array('fmail_filter_accountid'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + ), + 'egw_felamimail_accounts' => array( + 'fd' => array( + 'fm_owner' => array('type' => 'int','precision' => '4','nullable' => False), + 'fm_id' => array('type' => 'auto'), + 'fm_realname' => array('type' => 'varchar','precision' => '128'), + 'fm_organization' => array('type' => 'varchar','precision' => '128'), + 'fm_emailaddress' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_signatureid' => array('type' => 'int','precision' => '4'), + 'fm_ic_hostname' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_port' => array('type' => 'int','precision' => '4'), + 'fm_ic_username' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_password' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_encryption' => array('type' => 'int','precision' => '4'), + 'fm_og_hostname' => array('type' => 'varchar','precision' => '128'), + 'fm_og_port' => array('type' => 'int','precision' => '4'), + 'fm_og_smtpauth' => array('type' => 'bool'), + 'fm_og_username' => array('type' => 'varchar','precision' => '128'), + 'fm_og_password' => array('type' => 'varchar','precision' => '128'), + 'fm_active' => array('type' => 'bool','nullable' => False), + 'fm_ic_validatecertificate' => array('type' => 'bool'), + 'fm_ic_enable_sieve' => array('type' => 'bool','precision' => '255'), + 'fm_ic_sieve_server' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_sieve_port' => array('type' => 'int','precision' => '4'), + 'fm_ic_folderstoshowinhome' => array('type' => 'text'), + 'fm_ic_sentfolder' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_trashfolder' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_draftfolder' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_templatefolder' => array('type' => 'varchar','precision' => '128'), + ), + 'pk' => array('fm_id'), + 'fk' => array(), + 'ix' => array('fm_owner'), + 'uc' => array() + ), + 'egw_felamimail_signatures' => array( + 'fd' => array( + 'fm_signatureid' => array('type' => 'auto'), + 'fm_accountid' => array('type' => 'int','precision' => '11'), + 'fm_signature' => array('type' => 'text'), + 'fm_description' => array('type' => 'varchar','precision' => '255'), + 'fm_defaultsignature' => array('type' => 'bool') + ), + 'pk' => array('fm_signatureid'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array(array('fm_signatureid','fm_accountid')) + ) + ); +?> diff --git a/felamimail/setup/tables_update.inc.php b/felamimail/setup/tables_update.inc.php new file mode 100644 index 0000000000..33a977ab4f --- /dev/null +++ b/felamimail/setup/tables_update.inc.php @@ -0,0 +1,528 @@ +oProc->AddColumn('phpgw_felamimail_cache','to_name',array('type' => 'varchar', 'precision' => 120)); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_felamimail_cache','to_address',array('type' => 'varchar', 'precision' => 120)); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.8.3'; + return $GLOBALS['setup_info']['felamimail']['currentver']; +} + +function felamimail_upgrade0_8_3() +{ + + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_felamimail_cache','attachments',array('type' => 'varchar', 'precision' => 120)); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.8.4'; + return $GLOBALS['setup_info']['felamimail']['currentver']; +} + +function felamimail_upgrade0_8_4() +{ + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.9.0'; + return $GLOBALS['setup_info']['felamimail']['currentver']; +} + +function felamimail_upgrade0_9_0() +{ + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_folderstatus', 'accountname', array('type' => 'varchar', 'precision' => 200, 'nullable' => false)); + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_cache', 'accountname', array('type' => 'varchar', 'precision' => 200, 'nullable' => false)); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.9.1'; + return $GLOBALS['setup_info']['felamimail']['currentver']; +} + +function felamimail_upgrade0_9_1() +{ + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.9.2'; + return $GLOBALS['setup_info']['felamimail']['currentver']; +} + +function felamimail_upgrade0_9_2() +{ + $GLOBALS['egw_setup']->oProc->CreateTable('phpgw_felamimail_displayfilter', + Array( + 'fd' => array( + 'accountid' => array('type' => 'int', 'precision' => 4, 'nullable' => false), + 'filter' => array('type' => 'text') + ), + 'pk' => array('accountid'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + ) + + ); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.9.3'; + return $GLOBALS['setup_info']['felamimail']['currentver']; +} + +function felamimail_upgrade0_9_3() +{ + $GLOBALS['egw_setup']->oProc->DropTable('phpgw_felamimail_cache'); + $GLOBALS['egw_setup']->oProc->query('delete from phpgw_felamimail_folderstatus',__LINE__,__FILE__); + $GLOBALS['egw_setup']->oProc->CreateTable('phpgw_felamimail_cache', + Array( + 'fd' => array( + 'accountid' => array('type' => 'int', 'precision' => 4, 'nullable' => false), + 'hostname' => array('type' => 'varchar', 'precision' => 60, 'nullable' => false), + 'accountname' => array('type' => 'varchar', 'precision' => 200, 'nullable' => false), + 'foldername' => array('type' => 'varchar', 'precision' => 200, 'nullable' => false), + 'uid' => array('type' => 'int', 'precision' => 4, 'nullable' => false), + 'subject' => array('type' => 'text'), + 'striped_subject'=> array('type' => 'text'), + 'sender_name' => array('type' => 'varchar', 'precision' => 120), + 'sender_address'=> array('type' => 'varchar', 'precision' => 120), + 'to_name' => array('type' => 'varchar', 'precision' => 120), + 'to_address' => array('type' => 'varchar', 'precision' => 120), + 'date' => array('type' => 'varchar', 'precision' => 120), + 'size' => array('type' => 'int', 'precision' => 4), + 'attachments' => array('type' => 'varchar', 'precision' =>120) + ), + 'pk' => array('accountid','hostname','accountname','foldername','uid'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + ) + ); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.9.4'; + return $GLOBALS['setup_info']['felamimail']['currentver']; +} + + +function felamimail_upgrade0_9_4() +{ + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_cache','accountname',array( + 'type' => 'varchar', + 'precision' => '25', + 'nullable' => False + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_cache','date',array( + 'type' => 'int', + 'precision' => '8' + )); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.9.5'; + return $GLOBALS['setup_info']['felamimail']['currentver']; +} + + +function felamimail_upgrade0_9_5() +{ + $GLOBALS['setup_info']['felamimail']['currentver'] = '1.0.0'; + return $GLOBALS['setup_info']['felamimail']['currentver']; +} + + +function felamimail_upgrade1_0_0() +{ + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','accountid','fmail_accountid'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','hostname','fmail_hostname'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','accountname','fmail_accountname'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','foldername','fmail_foldername'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','uid','fmail_uid'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','subject','fmail_subject'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','striped_subject','fmail_striped_subject'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','sender_name','fmail_sender_name'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','sender_address','fmail_sender_address'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','to_name','fmail_to_name'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','to_address','fmail_to_address'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','date','fmail_date'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','size','fmail_size'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','attachments','fmail_attachments'); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '1.0.0.001'; + return $GLOBALS['setup_info']['felamimail']['currentver']; +} + + +function felamimail_upgrade1_0_0_001() +{ + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','accountid','fmail_accountid'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','hostname','fmail_hostname'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','accountname','fmail_accountname'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','foldername','fmail_foldername'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','messages','fmail_messages'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','recent','fmail_recent'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','unseen','fmail_unseen'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','uidnext','fmail_uidnext'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','uidvalidity','fmail_uidvalidity'); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '1.0.0.002'; + return $GLOBALS['setup_info']['felamimail']['currentver']; +} + + +function felamimail_upgrade1_0_0_002() +{ + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_displayfilter','accountid','fmail_filter_accountid'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_displayfilter','filter','fmail_filter_data'); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '1.0.0.003'; + return $GLOBALS['setup_info']['felamimail']['currentver']; +} + + +function felamimail_upgrade1_0_0_003() +{ + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_cache', 'fmail_accountname', array('type' => 'varchar','precision' => '200','nullable' => False)); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '1.0.0.004'; + return $GLOBALS['setup_info']['felamimail']['currentver']; +} + + +function felamimail_upgrade1_0_0_004() +{ + // index was to big for mysql with charset utf8 (max 1000byte = 333 utf8 chars) + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_cache','fmail_accountname',array( + 'type' => 'varchar', + 'precision' => '128', + 'nullable' => False + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_cache','fmail_foldername',array( + 'type' => 'varchar', + 'precision' => '128', + 'nullable' => False + )); + + $GLOBALS['egw_setup']->oProc->RenameTable('phpgw_felamimail_cache','egw_felamimail_cache'); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '1.0.0.005'; + return $GLOBALS['setup_info']['felamimail']['currentver']; +} + + +function felamimail_upgrade1_0_0_005() +{ + // index was to big for mysql with charset utf8 (max 1000byte = 333 utf8 chars) + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_folderstatus','fmail_accountname',array( + 'type' => 'varchar', + 'precision' => '128', + 'nullable' => False + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_folderstatus','fmail_foldername',array( + 'type' => 'varchar', + 'precision' => '128', + 'nullable' => False + )); + + $GLOBALS['egw_setup']->oProc->RenameTable('phpgw_felamimail_folderstatus','egw_felamimail_folderstatus'); + $GLOBALS['egw_setup']->oProc->RenameTable('phpgw_felamimail_displayfilter','egw_felamimail_displayfilter'); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '1.0.0.006'; + return $GLOBALS['setup_info']['felamimail']['currentver']; +} + + +function felamimail_upgrade1_0_0_006() +{ + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.2'; +} + + +function felamimail_upgrade1_2() +{ + $GLOBALS['egw_setup']->oProc->CreateTable('fm_accounts',array( + 'fd' => array( + 'fm_owner' => array('type' => 'int','precision' => '4','nullable' => False), + 'fm_id' => array('type' => 'auto'), + 'fm_realname' => array('type' => 'varchar','precision' => '128'), + 'fm_organization' => array('type' => 'varchar','precision' => '128'), + 'fm_emailaddress' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_ic_hostname' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_ic_port' => array('type' => 'int','precision' => '4','nullable' => False), + 'fm_ic_username' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_ic_password' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_encryption' => array('type' => 'bool','nullable' => False), + 'fm_og_hostname' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_og_port' => array('type' => 'int','precision' => '4','nullable' => False), + 'fm_og_smtpauth' => array('type' => 'bool','nullable' => False), + 'fm_og_username' => array('type' => 'varchar','precision' => '128'), + 'fm_og_password' => array('type' => 'varchar','precision' => '128') + ), + 'pk' => array('fm_id'), + 'fk' => array(), + 'ix' => array('fm_owner'), + 'uc' => array() + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.2.001'; +} + + +function felamimail_upgrade1_2_001() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('fm_accounts','fm_active',array( + 'type' => 'bool', + 'nullable' => False + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.2.002'; +} + + +function felamimail_upgrade1_2_002() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('fm_accounts','fm_validatecertificate',array( + 'type' => 'bool', + 'nullable' => False + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.2.003'; +} + + +function felamimail_upgrade1_2_003() +{ + $GLOBALS['egw_setup']->oProc->RenameColumn('fm_accounts','fm_validatecertificate','fm_ic_validatecertificate'); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.2.004'; +} + + +function felamimail_upgrade1_2_004() +{ + $GLOBALS['egw_setup']->oProc->query('delete from egw_felamimail_folderstatus',__LINE__,__FILE__); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.3.000'; +} + + +function felamimail_upgrade1_3_000() +{ + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_cache','fmail_sender_name',array( + 'type' => 'varchar', + 'precision' => '256' + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_cache','fmail_sender_address',array( + 'type' => 'varchar', + 'precision' => '256' + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_cache','fmail_to_name',array( + 'type' => 'varchar', + 'precision' => '256' + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_cache','fmail_to_address',array( + 'type' => 'varchar', + 'precision' => '256' + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.3.001'; +} + + +function felamimail_upgrade1_3_001() +{ + $GLOBALS['egw_setup']->oProc->RenameTable('fm_accounts','egw_felamimail_accounts'); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.3.002'; +} + + +function felamimail_upgrade1_3_002() +{ + $GLOBALS['egw_setup']->oProc->CreateTable('egw_felamimail_signatures',array( + 'fd' => array( + 'fm_signatureid' => array('type' => 'auto'), + 'fm_accountid' => array('type' => 'int','precision' => '11'), + 'fm_signature' => array('type' => 'text'), + 'fm_description' => array('type' => 'varchar','precision' => '255') + ), + 'pk' => array('fm_signatureid'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array(array('fm_signatureid','fm_accountid')) + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.3.003'; +} + + +function felamimail_upgrade1_3_003() +{ + #$GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_ic_encryption',array( + # 'type' => 'int', + # 'precision' => '4', + # 'nullable' => False + #)); + + $GLOBALS['egw_setup']->oProc->RefreshTable('egw_felamimail_accounts',array( + 'fd' => array( + 'fm_owner' => array('type' => 'int','precision' => '4','nullable' => False), + 'fm_id' => array('type' => 'auto'), + 'fm_realname' => array('type' => 'varchar','precision' => '128'), + 'fm_organization' => array('type' => 'varchar','precision' => '128'), + 'fm_emailaddress' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_ic_hostname' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_ic_port' => array('type' => 'int','precision' => '4','nullable' => False), + 'fm_ic_username' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_ic_password' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_encryption' => array('type' => 'int','precision' => '4'), + 'fm_og_hostname' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_og_port' => array('type' => 'int','precision' => '4','nullable' => False), + 'fm_og_smtpauth' => array('type' => 'bool','nullable' => False), + 'fm_og_username' => array('type' => 'varchar','precision' => '128'), + 'fm_og_password' => array('type' => 'varchar','precision' => '128'), + 'fm_active' => array('type' => 'bool','nullable' => False), + 'fm_ic_validatecertificate' => array('type' => 'bool','nullable' => False), + ), + 'pk' => array('fm_id'), + 'fk' => array(), + 'ix' => array('fm_owner'), + 'uc' => array() + ), array( + 'fm_ic_encryption' => "CASE WHEN fm_ic_encryption THEN 1 ELSE 0 END", + ) + ); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.3.004'; +} + + +function felamimail_upgrade1_3_004() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_signatures','fm_defaultsignature',array( + 'type' => 'bool' + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.3.005'; +} + + +function felamimail_upgrade1_3_005() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_enable_sieve',array( + 'type' => 'bool', + 'precision' => '255' + )); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_sieve_server',array( + 'type' => 'varchar', + 'precision' => '128' + )); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_sieve_port',array( + 'type' => 'int', + 'precision' => '4' + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.3.006'; +} + + +function felamimail_upgrade1_3_006() +{ + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.4'; +} + + +function felamimail_upgrade1_4() +{ + $GLOBALS['egw_setup']->oProc->DropTable('egw_felamimail_cache'); + $GLOBALS['egw_setup']->oProc->DropTable('egw_felamimail_displayfilter'); + $GLOBALS['egw_setup']->oProc->DropTable('egw_felamimail_folderstatus'); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_signatureid',array( + 'type' => 'int', + 'precision' => '4' + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.5.001'; +} + + +function felamimail_upgrade1_5_001() +{ + $GLOBALS['egw_setup']->oProc->CreateTable('egw_felamimail_displayfilter', + Array( + 'fd' => array( + 'fmail_filter_accountid' => array('type' => 'int', 'precision' => 4, 'nullable' => false), + 'fmail_filter_data' => array('type' => 'text') + ), + 'pk' => array('fmail_filter_accountid'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + ) + ); + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.5.002'; +} + + +function felamimail_upgrade1_5_002() +{ + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_ic_encryption',array( + 'type' => 'int', + 'precision' => '4', + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_ic_hostname',array( + 'type' => 'varchar', + 'precision' => '128', + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_ic_port',array( + 'type' => 'int', + 'precision' => '4', + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_ic_username',array( + 'type' => 'varchar', + 'precision' => '128', + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_ic_validatecertificate',array( + 'type' => 'bool', + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_og_hostname',array( + 'type' => 'varchar', + 'precision' => '128', + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_og_port',array( + 'type' => 'int', + 'precision' => '4', + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_og_smtpauth',array( + 'type' => 'bool', + )); + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.5.003'; +} + + +function felamimail_upgrade1_5_003() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_folderstoshowinhome', array('type' => 'text')); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_sentfolder', array('type' => 'varchar','precision' => '128')); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_trashfolder', array('type' => 'varchar','precision' => '128')); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_draftfolder', array('type' => 'varchar','precision' => '128')); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_templatefolder', array('type' => 'varchar','precision' => '128')); + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.6.001'; +} + + +function felamimail_upgrade1_6_001() +{ + // no real changes here + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.7.001'; +} + + +function felamimail_upgrade1_7_001() +{ + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.8'; +} + + +/** + * Setting new index url with "&ajax=true" appended (via setup.inc.php) + */ +function felamimail_upgrade1_8() +{ + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.9'; +} diff --git a/felamimail/templates/default/app.css b/felamimail/templates/default/app.css new file mode 100644 index 0000000000..9c7e7f25f5 --- /dev/null +++ b/felamimail/templates/default/app.css @@ -0,0 +1,413 @@ +th.activetab +{ + color:#000000; + background-color:#D3DCE3; + border-top : 1px solid Silver; + border-left : 1px solid Silver; + border-right : 1px solid Silver; +} + +th.inactivetab +{ + color:#000000; + background-color:#E8F0F0; + border-bottom : 1px solid Silver; +} + +.td_left +{ + border-left : 1px solid Gray; + border-top : 1px solid Gray; +} + +.input_text { + border : 1px solid Silver; +} + +.td_right +{ + border-right : 1px solid Gray; + border-top : 1px solid Gray; +} + +.text_small { font-size: 10px; } +.text_small_bold { font-size: 10px; font-weight : bold; } + +div.activetab{ display:inline; } +div.inactivetab{ display:none; } + +.quoted1 { color:#660066; } +.quoted2 { color:#007777; } +.quoted3 { color:#990000; } +.quoted4 { color:#000099; } +.quoted5 { color:#bb6600; } + +tr.mail div { + cursor: default; + white-space: nowrap; +} + +tr.mail a { + cursor: pointer; + white-space: nowrap; +} + +tr.recent div, +tr.recent a, +tr.unseen div, +tr.unseen a { + color: #003075; + font-weight: bold; +} + +tr.flagged div, +tr.flagged a { + color: #ac0000 !important; +} + +tr.deleted div, +tr.deleted a { + color: silver; + text-decoration : line-through; +} + +span.status_img { + display: inline-block; + width: 12px; + height: 12px; + background-repeat: no-repeat; + background-image: url(images/kmmsgread.png); +} + +tr.deleted span.status_img { + background-image: url(images/kmmsgdel.png); +} + +tr.unseen span.status_img { + background-image: url(images/kmmsgunseen.png); +} + +tr.recent span.status_img { + background-image: url(images/kmmsgnew.png) !important; +} + +tr.replied span.status_img { + background-image: url(images/kmmsgreplied.png) !important; +} + +tr.forwarded span.status_img { + background-image: url(images/kmmsgforwarded.png) !important; +} + +.subjectBold +{ + FONT-SIZE: 12px; + font-weight : bold; + font-family : Arial; +} + +.subject +{ + FONT-SIZE: 12px; + font-family : Arial; +} + +/* +-- Why is felamimail changing the appereance of the whole egroupware page? - Commented that code out (andreas) +body +{ + background-image:url(images/body-background.png);; +} + +.body +{ + FONT-SIZE: 12px; + font-family : Arial; +} +*/ + +TR.sieveRowActive +{ + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; +} + +A.sieveRowActive +{ + FONT-SIZE: 11px; + height : 14px; + padding: 0; +} + +TR.sieveRowInActive +{ + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; + color: Silver; +} + +A.sieveRowInActive +{ + FONT-SIZE: 11px; + height : 14px; + padding: 0; + color: Silver; +} + + +.dtree { + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 11px; + color: #666; + white-space: nowrap; +} +.dtree img { + border: 0px; + vertical-align: middle; +} +.dtree a { + color: #333; + text-decoration: none; +} +.dtree a.node, .dtree a.nodeSel { + white-space: nowrap; + padding: 1px 2px 1px 2px; +} +.dtree a.node:hover, .dtree a.nodeSel:hover { + color: #333; + text-decoration: underline; +} +.dtree a.nodeSel { + background-color: #c0d2ec; +} +.dtree .clip { + overflow: hidden; +} +.dtree table, .dtree tr, .dtree td { + border: none; +} +tr.navbarBackground { + background-color:#dddddd; +} + +div.parentDIV { + background-color:#dddddd; + position: relative; + top: 0px; + left: 0px; +} + +div.navButton { + background-color:#dddddd; + float:left; + padding: 2px; + margin: 2px; + border: solid #dddddd 1px; +} + +div.navButton:hover, div.navButtonHover { + background-color:#eeeeee; + float:left; + padding: 2px; + margin: 2px; + border: solid white 1px; + border-right: solid black 1px; + border-bottom: solid black 1px; + position: relative; +} + +div.navButton:active, div.navButtonActive { + background-color:#dddddd; + float:left; + padding: 2px; + margin: 2px; + border: solid white 1px; + border-left: solid black 1px; + border-top: solid black 1px; + position: relative; +} + +div.navSeparator { + background-color:#dddddd; + float:left; + padding: 0px; + margin: 2px; + border: solid silver 1px; + height:24px; + position: relative; +} + +div.inactiveResultRow { + background-color: white; + text-align: left; +} + +div.activeResultRow { + background-color: silver; + text-align: left; +} + +div.resultBoxHidden { + width: 450px; + position: absolute; + display: none; +} + +div.resultBoxVisible { + border: solid 1px black; + width: 450px; + position: absolute; + display: block; + background: white; + max-height: 25%; + overflow: auto; +} + +button.menuButton { + float:left; + padding: 2px; + margin: 2px; + border: solid #dddddd 1px; + position: relative; + height: 25px; + width: 26px; + background-color:#dddddd; +} + +button.menuButton:hover { + background-color:#eeeeee; + float:left; + padding: 2px; + margin: 2px; + border: solid white 1px; + border-right: solid black 1px; + border-bottom: solid black 1px; + position: relative; + height: 25px; + width: 26px; +} + +button.menuButton:active { + background-color:#dddddd; + float:left; + padding: 2px; + margin: 2px; + border: solid white 1px; + border-left: solid black 1px; + border-top: solid black 1px; + position: relative; +} + +fieldset.bordertop { + border-left:0px; + border-right:0px; + border-bottom:0px; + border-top:1px solid silver; +} + +TD.mainscreenRow { + border-bottom:1px solid #CCCCEE; +} + +DIV.divButton { + width:16px; + height:16px; + border: 0px solid red; + background-repeat:no-repeat; + background-position: center center; +} + +#navbarDIV { + position:absolute; + top:0px; + height:30px; + left:0px; + right:0px; + border: solid white 1px; + border-right: solid black 1px; + border-bottom: solid black 1px; +} + +#subjectDIV { + position:fixed; + background-color:#ffffff; + top:32px; + min-height:20px; + width:100%; + font-weight:bold; + text-align:left; + line-height:20px; +} + +#headerDIV { + position:absolute; + background-color:#efefdf; + top:52px; + height:80px; + left:0px; + right:0px; + border-top: 1px solid silver; + border-bottom: 1px solid silver; + overflow:hidden; +} + +.bodyDIV { + position:absolute; + background-color:white; + top:134px; + bottom:0px; + width:100%; + border-top: 1px solid #efefdf; +} + +.bodyDIVAttachment { + bottom:80px; +} + +#messageIFRAME { + width:100%; + border:0px solid black; + height:99%; +} + +#attachmentDIV { + position:fixed; + background-color:#efefdf; + bottom:0px; + min-height:80px; + max-height:240px; + width:100%; + border-top: 1px solid silver; + overflow:auto; +} + +pre { + white-space: pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + width: 99%; +} + +/* +* new dialog style definitions +*/ +#contentdialog {padding:20px} +#dialog {position:absolute; width:425px; padding:10px; z-index:200; background:#fff} +#dialog-header {display:block; position:relative; width:411px; padding:3px 6px 7px; height:14px; font-size:14px; font-weight:bold} +#dialog-title {float:left} +#dialog-close {float:right; cursor:pointer; margin:3px 3px 0 0; height:11px; width:11px; background:url(images/dialog_close.gif) no-repeat} +#dialog-content {display:block; height:160px; padding:6px; color:#666666; font-size:13px} +#dialog-mask {position:absolute; top:0; left:0; min-height:100%; width:100%; background:#FFF; opacity:.75; filter:alpha(opacity=75); z-index:100} +.error {background:#fff url(images/error_bg.jpg) bottom right no-repeat; border:1px solid #924949; border-top:none} +.errorheader {background:url(images/error_header.gif) repeat-x; color:#6f2c2c; border:1px solid #924949; border-bottom:none} +.warning {background:#fff url(images/warning_bg.jpg) bottom right no-repeat; border:1px solid #c5a524; border-top:none} +.warningheader {background:url(images/warning_header.gif) repeat-x; color:#957c17; border:1px solid #c5a524; border-bottom:none} +.success {background:#fff url(images/success_bg.jpg) bottom right no-repeat; border:1px solid #60a174; border-top:none} +.successheader {background:url(images/success_header.gif) repeat-x; color:#3c7f51; border:1px solid #60a174; border-bottom:none} +.prompt {background:#fff url(images/prompt_bg.jpg) bottom right no-repeat; border:1px solid #4f6d81; border-top:none} +.promptheader {background:url(images/prompt_header.gif) repeat-x; color:#355468; border:1px solid #4f6d81; border-bottom:none} + diff --git a/felamimail/templates/default/composeForm.tpl b/felamimail/templates/default/composeForm.tpl new file mode 100644 index 0000000000..149a22cb98 --- /dev/null +++ b/felamimail/templates/default/composeForm.tpl @@ -0,0 +1,281 @@ + + +

    +
    + + + + + + + + +
    + + + + + + +
    + {lang_identity} + + {select_from} + +   +
    + +
    +{destinationRows}
    +
    + + + + + + + +
    + {lang_subject} + + + +   +
    +
    + + + + + + + + +
    +  
    +
    + {errorInfo}
    +
    + + + {tinymce} + + + + +
    +
    {lang_signature}/{lang_stationery}/{lang_editormode} + {select_signature}   {select_stationery}   {toggle_editormode} + +
    +
    + + + +
    + +
    + + + + + +
    {lang_attachments} +
    + +{attachment_rows} +
    +
    +
    + +
    +
    + + + + + + {name} + + + {type} + + + {size} + + + + + + + + + + + {name} + + + {type} + + + {size} + + + + + + + + + + + {select_destination} + + + + + +
    + + + + +
    +
    + + + + + + + + + + +
    +   +
    + +
    + {lang_max_uploadsize}: {max_uploadsize} +
    +
    +
    + + diff --git a/felamimail/templates/default/config.tpl b/felamimail/templates/default/config.tpl new file mode 100644 index 0000000000..a922af39f3 --- /dev/null +++ b/felamimail/templates/default/config.tpl @@ -0,0 +1,136 @@ + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     {title}
     
     {lang_Mail_settings}
    {lang_Enter_your_IMAP_mail_server_hostname_or_IP_address}:
    {lang_Select_your_mail_server_type}: + +
    IMAP server type: + +
    {lang_Enter_your_default_mail_domain_(_From:_user@domain_)}:
    {lang_Mail_server_login_type}: + +
    {lang_Users_can_define_their_own_emailaccounts}: + +
    {lang_Organization_name}:
     
     {lang_SMTP_settings}
    {lang_Enter_your_SMTP_server_hostname_or_IP_address}:
    {lang_Enter_your_SMTP_server_port}:
    {lang_Use_SMTP_auth}: + +
     
     {lang_Sieve_settings}
    {lang_Enter_your_SIEVE_server_hostname_or_IP_address}:
    {lang_Enter_your_SIEVE_server_port}:
    +  +
    + + +
    +
    + diff --git a/felamimail/templates/default/edit_account_data.tpl b/felamimail/templates/default/edit_account_data.tpl new file mode 100644 index 0000000000..c298b8fdfc --- /dev/null +++ b/felamimail/templates/default/edit_account_data.tpl @@ -0,0 +1,270 @@ + + + +
    +
    {message}
    +
    + +
    {lang_identity} {accountID} + + + + + + + + + + + + + + + + + + +
    + {lang_name} + + +
    + {lang_organization} + + +
    + {lang_emailaddress} + + +
    + {lang_signature} + + {identity_selectbox} +
    +
    + +
    +{lang_use_costum_settings} +
    + + + + + + +
    {lang_incoming_server}{lang_folder_settings}
    +
    +
    {lang_incoming_server} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {hostname_address} + + +
    + {lang_port} + + +
    + {lang_username} + + +
    + {lang_password} + + +
    + {lang_encrypted_connection} + + STARTTLS + TLS + SSL + {lang_no_encryption} +
    + {lang_do_not_validate_certificate} + + +
    + {lang_server_supports_sieve} + + +
    + {lang_port} + + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    + {lang_folder_to_appear_on_main_screen} + + {folder_selectbox} +
    + {lang_trash_folder} + + {trash_selectbox} +
    + {lang_sent_folder} + + {sent_selectbox} +
    + {lang_draft_folder} + + {draft_selectbox} +
    + {lang_template_folder} + + {template_selectbox} +
    +
    +
    + +
    {lang_outgoing_server} + + + + + + + + + + + + + + + + + + + + + +
    + {hostname_address} + + +
    + {lang_port} + + +
    + {auth_required} + + +
    + {lang_username} + + +
    + {lang_password} + + +
    +
    + + + + + +
    + + + +
    + +
    + diff --git a/felamimail/templates/default/edit_forwarding_address.tpl b/felamimail/templates/default/edit_forwarding_address.tpl new file mode 100644 index 0000000000..e276bac59f --- /dev/null +++ b/felamimail/templates/default/edit_forwarding_address.tpl @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + +
    + {lang_edit_forwarding_address} +
    + {lang_forwarding_address} + + +
    + {lang_keep_local_copy} + + +
    +   +
    + + +
    + + diff --git a/felamimail/templates/default/filterForm.tpl b/felamimail/templates/default/filterForm.tpl new file mode 100644 index 0000000000..6366b3165f --- /dev/null +++ b/felamimail/templates/default/filterForm.tpl @@ -0,0 +1,116 @@ + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {lang_filter_name}: + + +
    + {lang_from}: + + +
    + {lang_to}: + + +
    + {lang_subject}: + + +
    +   +
    + {lang_new_filter} + + +
    + + +
    + + + + + + + + +{filterrows} +
    + {lang_no_filter} + + {lang_activate} + +   + +   +
    + +
    + + + + + + + + {filtername} + + + {lang_activate} + + + {lang_delete} + + + {lang_edit} + + + \ No newline at end of file diff --git a/felamimail/templates/default/images/Read.png b/felamimail/templates/default/images/Read.png new file mode 100644 index 0000000000..8314163b08 Binary files /dev/null and b/felamimail/templates/default/images/Read.png differ diff --git a/felamimail/templates/default/images/Replied.png b/felamimail/templates/default/images/Replied.png new file mode 100644 index 0000000000..757f90582c Binary files /dev/null and b/felamimail/templates/default/images/Replied.png differ diff --git a/felamimail/templates/default/images/Unread.png b/felamimail/templates/default/images/Unread.png new file mode 100644 index 0000000000..1364ea5be1 Binary files /dev/null and b/felamimail/templates/default/images/Unread.png differ diff --git a/felamimail/templates/default/images/attach.png b/felamimail/templates/default/images/attach.png new file mode 100755 index 0000000000..97ad911c89 Binary files /dev/null and b/felamimail/templates/default/images/attach.png differ diff --git a/felamimail/templates/default/images/body-background.png b/felamimail/templates/default/images/body-background.png new file mode 100644 index 0000000000..e345bc3109 Binary files /dev/null and b/felamimail/templates/default/images/body-background.png differ diff --git a/felamimail/templates/default/images/clear_left.png b/felamimail/templates/default/images/clear_left.png new file mode 100644 index 0000000000..ea11a3e4d2 Binary files /dev/null and b/felamimail/templates/default/images/clear_left.png differ diff --git a/felamimail/templates/default/images/dialog_close.gif b/felamimail/templates/default/images/dialog_close.gif new file mode 100644 index 0000000000..31292f8e4c Binary files /dev/null and b/felamimail/templates/default/images/dialog_close.gif differ diff --git a/felamimail/templates/default/images/down_pointer.png b/felamimail/templates/default/images/down_pointer.png new file mode 100644 index 0000000000..e98a5b868b Binary files /dev/null and b/felamimail/templates/default/images/down_pointer.png differ diff --git a/felamimail/templates/default/images/error_bg.jpg b/felamimail/templates/default/images/error_bg.jpg new file mode 100644 index 0000000000..8e8e0b9d09 Binary files /dev/null and b/felamimail/templates/default/images/error_bg.jpg differ diff --git a/felamimail/templates/default/images/error_header.gif b/felamimail/templates/default/images/error_header.gif new file mode 100644 index 0000000000..b9d147955f Binary files /dev/null and b/felamimail/templates/default/images/error_header.gif differ diff --git a/felamimail/templates/default/images/fileexport.png b/felamimail/templates/default/images/fileexport.png new file mode 100644 index 0000000000..381bfc0539 Binary files /dev/null and b/felamimail/templates/default/images/fileexport.png differ diff --git a/felamimail/templates/default/images/kmmsgdel.png b/felamimail/templates/default/images/kmmsgdel.png new file mode 100644 index 0000000000..2de7775412 Binary files /dev/null and b/felamimail/templates/default/images/kmmsgdel.png differ diff --git a/felamimail/templates/default/images/kmmsgforwarded.png b/felamimail/templates/default/images/kmmsgforwarded.png new file mode 100644 index 0000000000..a26af4a2cc Binary files /dev/null and b/felamimail/templates/default/images/kmmsgforwarded.png differ diff --git a/felamimail/templates/default/images/kmmsgnew.png b/felamimail/templates/default/images/kmmsgnew.png new file mode 100644 index 0000000000..245d1569bc Binary files /dev/null and b/felamimail/templates/default/images/kmmsgnew.png differ diff --git a/felamimail/templates/default/images/kmmsgread.png b/felamimail/templates/default/images/kmmsgread.png new file mode 100644 index 0000000000..fabb08884e Binary files /dev/null and b/felamimail/templates/default/images/kmmsgread.png differ diff --git a/felamimail/templates/default/images/kmmsgreplied.png b/felamimail/templates/default/images/kmmsgreplied.png new file mode 100644 index 0000000000..685ab7306f Binary files /dev/null and b/felamimail/templates/default/images/kmmsgreplied.png differ diff --git a/felamimail/templates/default/images/kmmsgunseen.png b/felamimail/templates/default/images/kmmsgunseen.png new file mode 100644 index 0000000000..8e3de20220 Binary files /dev/null and b/felamimail/templates/default/images/kmmsgunseen.png differ diff --git a/felamimail/templates/default/images/mail_find.png b/felamimail/templates/default/images/mail_find.png new file mode 100644 index 0000000000..156187d6e6 Binary files /dev/null and b/felamimail/templates/default/images/mail_find.png differ diff --git a/felamimail/templates/default/images/mail_forward.png b/felamimail/templates/default/images/mail_forward.png new file mode 100644 index 0000000000..8673653d1a Binary files /dev/null and b/felamimail/templates/default/images/mail_forward.png differ diff --git a/felamimail/templates/default/images/mail_reply.png b/felamimail/templates/default/images/mail_reply.png new file mode 100644 index 0000000000..7bb70b96b1 Binary files /dev/null and b/felamimail/templates/default/images/mail_reply.png differ diff --git a/felamimail/templates/default/images/mail_replyall.png b/felamimail/templates/default/images/mail_replyall.png new file mode 100644 index 0000000000..c839a8acec Binary files /dev/null and b/felamimail/templates/default/images/mail_replyall.png differ diff --git a/felamimail/templates/default/images/mail_send.png b/felamimail/templates/default/images/mail_send.png new file mode 100644 index 0000000000..62b0534335 Binary files /dev/null and b/felamimail/templates/default/images/mail_send.png differ diff --git a/felamimail/templates/default/images/manage_filter.png b/felamimail/templates/default/images/manage_filter.png new file mode 100644 index 0000000000..13c113b487 Binary files /dev/null and b/felamimail/templates/default/images/manage_filter.png differ diff --git a/felamimail/templates/default/images/msg_icon_sm.gif b/felamimail/templates/default/images/msg_icon_sm.gif new file mode 100644 index 0000000000..c4a957fb71 Binary files /dev/null and b/felamimail/templates/default/images/msg_icon_sm.gif differ diff --git a/felamimail/templates/default/images/navbar.png b/felamimail/templates/default/images/navbar.png new file mode 100644 index 0000000000..0ae28269d7 Binary files /dev/null and b/felamimail/templates/default/images/navbar.png differ diff --git a/felamimail/templates/default/images/prio_high.png b/felamimail/templates/default/images/prio_high.png new file mode 100644 index 0000000000..41ea863515 Binary files /dev/null and b/felamimail/templates/default/images/prio_high.png differ diff --git a/felamimail/templates/default/images/prio_low.png b/felamimail/templates/default/images/prio_low.png new file mode 100644 index 0000000000..25c253a0fa Binary files /dev/null and b/felamimail/templates/default/images/prio_low.png differ diff --git a/felamimail/templates/default/images/prompt_bg.jpg b/felamimail/templates/default/images/prompt_bg.jpg new file mode 100644 index 0000000000..d80e9164ac Binary files /dev/null and b/felamimail/templates/default/images/prompt_bg.jpg differ diff --git a/felamimail/templates/default/images/prompt_header.gif b/felamimail/templates/default/images/prompt_header.gif new file mode 100644 index 0000000000..2709af8f85 Binary files /dev/null and b/felamimail/templates/default/images/prompt_header.gif differ diff --git a/felamimail/templates/default/images/read_answered_small.png b/felamimail/templates/default/images/read_answered_small.png new file mode 100644 index 0000000000..af0b3b3e19 Binary files /dev/null and b/felamimail/templates/default/images/read_answered_small.png differ diff --git a/felamimail/templates/default/images/read_flagged_small.png b/felamimail/templates/default/images/read_flagged_small.png new file mode 100644 index 0000000000..79ce2af475 Binary files /dev/null and b/felamimail/templates/default/images/read_flagged_small.png differ diff --git a/felamimail/templates/default/images/read_small.png b/felamimail/templates/default/images/read_small.png new file mode 100644 index 0000000000..f2ac5de112 Binary files /dev/null and b/felamimail/templates/default/images/read_small.png differ diff --git a/felamimail/templates/default/images/recent_small.gif b/felamimail/templates/default/images/recent_small.gif new file mode 100644 index 0000000000..accfbc9e51 Binary files /dev/null and b/felamimail/templates/default/images/recent_small.gif differ diff --git a/felamimail/templates/default/images/save_all.png b/felamimail/templates/default/images/save_all.png new file mode 100644 index 0000000000..b565abf05c Binary files /dev/null and b/felamimail/templates/default/images/save_all.png differ diff --git a/felamimail/templates/default/images/sm_delete.gif b/felamimail/templates/default/images/sm_delete.gif new file mode 100644 index 0000000000..37c0047c86 Binary files /dev/null and b/felamimail/templates/default/images/sm_delete.gif differ diff --git a/felamimail/templates/default/images/sm_delete.png b/felamimail/templates/default/images/sm_delete.png new file mode 100644 index 0000000000..65c7422aaa Binary files /dev/null and b/felamimail/templates/default/images/sm_delete.png differ diff --git a/felamimail/templates/default/images/sm_envelope.gif b/felamimail/templates/default/images/sm_envelope.gif new file mode 100644 index 0000000000..a756a38094 Binary files /dev/null and b/felamimail/templates/default/images/sm_envelope.gif differ diff --git a/felamimail/templates/default/images/sm_envelope.png b/felamimail/templates/default/images/sm_envelope.png new file mode 100644 index 0000000000..fbc0733134 Binary files /dev/null and b/felamimail/templates/default/images/sm_envelope.png differ diff --git a/felamimail/templates/default/images/sm_forward.gif b/felamimail/templates/default/images/sm_forward.gif new file mode 100644 index 0000000000..c8c823d401 Binary files /dev/null and b/felamimail/templates/default/images/sm_forward.gif differ diff --git a/felamimail/templates/default/images/sm_forward.png b/felamimail/templates/default/images/sm_forward.png new file mode 100644 index 0000000000..150b624019 Binary files /dev/null and b/felamimail/templates/default/images/sm_forward.png differ diff --git a/felamimail/templates/default/images/sm_reply.gif b/felamimail/templates/default/images/sm_reply.gif new file mode 100644 index 0000000000..feb4cd5e51 Binary files /dev/null and b/felamimail/templates/default/images/sm_reply.gif differ diff --git a/felamimail/templates/default/images/sm_reply.png b/felamimail/templates/default/images/sm_reply.png new file mode 100644 index 0000000000..cfb9379934 Binary files /dev/null and b/felamimail/templates/default/images/sm_reply.png differ diff --git a/felamimail/templates/default/images/sm_reply_all.gif b/felamimail/templates/default/images/sm_reply_all.gif new file mode 100644 index 0000000000..c4d0c26689 Binary files /dev/null and b/felamimail/templates/default/images/sm_reply_all.gif differ diff --git a/felamimail/templates/default/images/sm_reply_all.png b/felamimail/templates/default/images/sm_reply_all.png new file mode 100644 index 0000000000..cfe31305cf Binary files /dev/null and b/felamimail/templates/default/images/sm_reply_all.png differ diff --git a/felamimail/templates/default/images/sm_unimportant.png b/felamimail/templates/default/images/sm_unimportant.png new file mode 100644 index 0000000000..a242858082 Binary files /dev/null and b/felamimail/templates/default/images/sm_unimportant.png differ diff --git a/felamimail/templates/default/images/sm_unread.png b/felamimail/templates/default/images/sm_unread.png new file mode 100644 index 0000000000..a85a7084ed Binary files /dev/null and b/felamimail/templates/default/images/sm_unread.png differ diff --git a/felamimail/templates/default/images/sort_none.png b/felamimail/templates/default/images/sort_none.png new file mode 100644 index 0000000000..b303746de3 Binary files /dev/null and b/felamimail/templates/default/images/sort_none.png differ diff --git a/felamimail/templates/default/images/success_bg.jpg b/felamimail/templates/default/images/success_bg.jpg new file mode 100644 index 0000000000..af6f0731fe Binary files /dev/null and b/felamimail/templates/default/images/success_bg.jpg differ diff --git a/felamimail/templates/default/images/success_header.gif b/felamimail/templates/default/images/success_header.gif new file mode 100644 index 0000000000..4d7d911dbf Binary files /dev/null and b/felamimail/templates/default/images/success_header.gif differ diff --git a/felamimail/templates/default/images/to_infolog.png b/felamimail/templates/default/images/to_infolog.png new file mode 100644 index 0000000000..e651ff89e3 Binary files /dev/null and b/felamimail/templates/default/images/to_infolog.png differ diff --git a/felamimail/templates/default/images/to_tracker.png b/felamimail/templates/default/images/to_tracker.png new file mode 100644 index 0000000000..6eb0151445 Binary files /dev/null and b/felamimail/templates/default/images/to_tracker.png differ diff --git a/felamimail/templates/default/images/trash.gif b/felamimail/templates/default/images/trash.gif new file mode 100644 index 0000000000..0aef5d53d3 Binary files /dev/null and b/felamimail/templates/default/images/trash.gif differ diff --git a/felamimail/templates/default/images/trash.png b/felamimail/templates/default/images/trash.png new file mode 100644 index 0000000000..65c7422aaa Binary files /dev/null and b/felamimail/templates/default/images/trash.png differ diff --git a/felamimail/templates/default/images/unread_deleted_small.gif b/felamimail/templates/default/images/unread_deleted_small.gif new file mode 100644 index 0000000000..b307c397fb Binary files /dev/null and b/felamimail/templates/default/images/unread_deleted_small.gif differ diff --git a/felamimail/templates/default/images/unread_deleted_small.png b/felamimail/templates/default/images/unread_deleted_small.png new file mode 100644 index 0000000000..adecaa53fa Binary files /dev/null and b/felamimail/templates/default/images/unread_deleted_small.png differ diff --git a/felamimail/templates/default/images/unread_flagged_small.png b/felamimail/templates/default/images/unread_flagged_small.png new file mode 100644 index 0000000000..aec3e43658 Binary files /dev/null and b/felamimail/templates/default/images/unread_flagged_small.png differ diff --git a/felamimail/templates/default/images/unread_small.png b/felamimail/templates/default/images/unread_small.png new file mode 100644 index 0000000000..0973c29696 Binary files /dev/null and b/felamimail/templates/default/images/unread_small.png differ diff --git a/felamimail/templates/default/images/up_pointer.png b/felamimail/templates/default/images/up_pointer.png new file mode 100644 index 0000000000..956c3285dd Binary files /dev/null and b/felamimail/templates/default/images/up_pointer.png differ diff --git a/felamimail/templates/default/images/warning_bg.jpg b/felamimail/templates/default/images/warning_bg.jpg new file mode 100644 index 0000000000..379e2b8942 Binary files /dev/null and b/felamimail/templates/default/images/warning_bg.jpg differ diff --git a/felamimail/templates/default/images/warning_header.gif b/felamimail/templates/default/images/warning_header.gif new file mode 100644 index 0000000000..887d0b83cc Binary files /dev/null and b/felamimail/templates/default/images/warning_header.gif differ diff --git a/felamimail/templates/default/images/write_mail.png b/felamimail/templates/default/images/write_mail.png new file mode 100644 index 0000000000..98713acb9f Binary files /dev/null and b/felamimail/templates/default/images/write_mail.png differ diff --git a/felamimail/templates/default/importMessage.tpl b/felamimail/templates/default/importMessage.tpl new file mode 100644 index 0000000000..5d885ee157 --- /dev/null +++ b/felamimail/templates/default/importMessage.tpl @@ -0,0 +1,68 @@ + + + +
    +
    + + + + + + + + + + + + + + + + +
    + {messages} +
    +
    + + + + + {lang_select} +
    +
    +   +
    +
    + {vfs_attach_button}   {lang_toggleFS} +
    +
    + {lang_max_uploadsize}: {max_uploadsize} +
    +
    +
    + + diff --git a/felamimail/templates/default/listRules.tpl b/felamimail/templates/default/listRules.tpl new file mode 100644 index 0000000000..8277f0af9e --- /dev/null +++ b/felamimail/templates/default/listRules.tpl @@ -0,0 +1,64 @@ + + +
    + + + + + + +
    +{lang_rule}: {lang_enable} +{lang_disable} +{lang_delete} + + +{lang_add_rule} +
    +
    + + + + + + + + + + + {filterrows} + + +
     Status{lang_rule}Order
    +
    + +
    + + + + + + + + + {filter_status} + + + {filter_text} + + + Move rule up + Move rule down + + + \ No newline at end of file diff --git a/felamimail/templates/default/mainscreen.tpl b/felamimail/templates/default/mainscreen.tpl new file mode 100644 index 0000000000..58e9ca6474 --- /dev/null +++ b/felamimail/templates/default/mainscreen.tpl @@ -0,0 +1,215 @@ + + + +
    + + + + + + + + + + + +
    +
    +
    + + + + + + + + + + + + + + + +
    + + + + {message} + + {vacation_warning} + + {quota_display} +
    + + + +
    +
    + + {header_rows} + +
    +
    + + +
    +
    + + + +
    + +
    + + + {IFrameForPreview} + + + + + + + + + + + + + +
    + {link_previous} +   + + + {message} + + {trash_link} + + {link_next} +
    + + + + + + + + + +
    + {lang_connection_failed}
    +
    {connection_error_message}

    +
    + + + + + + + + +
    +  {quotaUsage_left} + +  {quotaUsage_right} +
    + + + + + {header_subject} + + + + + + {header_subject} + + + diff --git a/felamimail/templates/default/preferences_edit_signature.tpl b/felamimail/templates/default/preferences_edit_signature.tpl new file mode 100644 index 0000000000..7ce40f7684 --- /dev/null +++ b/felamimail/templates/default/preferences_edit_signature.tpl @@ -0,0 +1,26 @@ + + + + + + + +
    + {lang_description} + + + + {checkbox_isDefaultSignature} + {lang_default_signature} +
    + +{tinymce} + + + + + + + diff --git a/felamimail/templates/default/preferences_list_accounts.tpl b/felamimail/templates/default/preferences_list_accounts.tpl new file mode 100755 index 0000000000..86b1fb8809 --- /dev/null +++ b/felamimail/templates/default/preferences_list_accounts.tpl @@ -0,0 +1,13 @@ + + +{lang_add}  +{lang_delete} +
    +
    +{table} +
    +
    + diff --git a/felamimail/templates/default/preferences_list_signatures.tpl b/felamimail/templates/default/preferences_list_signatures.tpl new file mode 100644 index 0000000000..becfdff33a --- /dev/null +++ b/felamimail/templates/default/preferences_list_signatures.tpl @@ -0,0 +1,14 @@ + + + + + +
    +
    +{table} +
    +
    + diff --git a/felamimail/templates/default/preferences_manage_folder.tpl b/felamimail/templates/default/preferences_manage_folder.tpl new file mode 100644 index 0000000000..2f5fbd069c --- /dev/null +++ b/felamimail/templates/default/preferences_manage_folder.tpl @@ -0,0 +1,461 @@ + + + + + + + + + + +
    + {lang_folder_list} + + {lang_folder_settings} +
    +
    + +
    + {folder_tree} + +
    + + + + + +
    {lang_Overview}{lang_ACL}
    + {settings_view} +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {lang_imap_server}: + + {imap_server} + +   +
    + {lang_foldername}: + + {folderName} + + +
    + {lang_rename_folder} + + + + +
    + {lang_move_folder} + + + + + +
    + {lang_create_subfolder} + + + + +
    +   + +   +
    +
    +
    + + + + + + + + +
    +
    + +
    + + + {lang_setrecursively} + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Mailbox Access Rights +
    +

    Access Right

    + +
    + +

    Purpose

    + +
    +

    l

    + +
    +

    Look up the name of the mailbox (but not its contents).

    + +
    +

    r

    + +
    +

    Read the contents of the mailbox.

    + +
    +

    s

    + +
    +

    Preserve the "seen" and "recent" status of messages across IMAP sessions.

    + +
    +

    w

    + +
    +

    Write (change message flags such as "recent," "answered," and "draft").

    + +
    + +

    i

    + +
    +

    Insert (move or copy) a message into the mailbox.

    + +
    +

    p

    + +
    + +

    Post a message in the mailbox by sending the message to the mailbox's submission address (for example, post a message in the cyrushelp mailbox by sending a message to sysadmin+cyrushelp@somewhere.net).

    + +
    +

    c

    + +
    + +

    Create a new mailbox below the top-level mailbox (ordinary users cannot create top-level mailboxes).

    + +
    +

    d

    + +
    +

    Delete a message and/or the mailbox itself.

    + +
    +

    a

    + +
    +

    Administer the mailbox (change the mailbox's ACL).

    + +
    + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Abbreviations for Common Access Rights +
    +

    Abbreviation

    + +
    + +

    Access Rights

    + +
    +

    Result

    + +
    +

    none

    + +
    + +

    Blank

    + +
    +

    The user has no rights whatsoever.

    + +
    +

    read

    + +
    + +

    lrs

    + +
    +

    Allows a user to read the contents of the mailbox.

    + +
    +

    post

    + +
    + +

    lrps

    + +
    +

    Allows a user to read the mailbox and post to it through the delivery system by sending mail to the mailbox's submission address.

    + +
    +

    append

    + +
    + +

    lrsip

    + +
    +

    Allows a user to read the mailbox and append messages to it, either via IMAP or through the delivery system.

    + +
    +

    write

    + +
    + +

    lrswipcd

    + +
    +

    Allows a user to read the maibox, post to it, append messages to it, and delete messages or the mailbox itself. The only right not given is the right to change the mailbox's ACL.

    + +
    +

    all

    + +
    + +

    lrswipcda

    + +
    +

    The user has all possible rights on the mailbox. This is usually granted to users only on the mailboxes they own.

    + +
    +

    +
    + + + + + + + + + + + + +
    + Host: {imap_server} +
    + {lang_create_subfolder} + +
    + +
    +   + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Name + + L + + R + + S + + W + + I + + P + + C + + D + + A +
    + + + + + + + + + + + + + + + + + + + +
    + + + {lang_setrecursively} + +
    + + diff --git a/felamimail/templates/default/selectprofile.tpl b/felamimail/templates/default/selectprofile.tpl new file mode 100755 index 0000000000..21c4e14d58 --- /dev/null +++ b/felamimail/templates/default/selectprofile.tpl @@ -0,0 +1,47 @@ + +
    + +
    + +
    + + + + + + + + +
    + {lang_site_configuration} + +   +
    + {lang_select_email_profile}: + + + {lang_go_emailadmin} +
    +

    + + + + + +
    + {lang_back} + + {lang_save} +
    + + +
    +
    + + + + + diff --git a/felamimail/templates/default/sieveEditForm.tpl b/felamimail/templates/default/sieveEditForm.tpl new file mode 100644 index 0000000000..9a6904bf3a --- /dev/null +++ b/felamimail/templates/default/sieveEditForm.tpl @@ -0,0 +1,136 @@ + + +
    {message}
    +
    + +
    {lang_condition} + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {lang_match}: + + +
    + {lang_if_from_contains}: + + +
    + {lang_if_to_contains}: + + +
    + {lang_if_subject_contains}: + + +
    + {lang_if_message_size} + + + {lang_kilobytes} +
    + {lang_if_mail_header}: + + + {lang_contains}: + +
    +
    +
    {lang_action} + + + + + + + + + + + + + + + + + +
    + + + + {lang_select_folder}... +
    + + + +
    + + + +
    + +  
    +
    +
    {lang_extended} + + + + +
    +
    +
    + +
    +
    + + + + +
    +   +   + +
    + +
    + diff --git a/felamimail/templates/default/sieveForm.tpl b/felamimail/templates/default/sieveForm.tpl new file mode 100644 index 0000000000..d565cb5ab7 --- /dev/null +++ b/felamimail/templates/default/sieveForm.tpl @@ -0,0 +1,363 @@ + + + +
    + + + + + + +
    {lang_filter_rules}{lang_vacation_notice}({lang_vacation_status})
    + + + +
    + +
    + + + + + +
    +{lang_rule}: {lang_enable} +{lang_disable} +{lang_delete} + +{lang_add_rule} +
    +
    + + + + + + + + + + + {filterrows} + + +
     Status{lang_rule}Order
    +
    +
    + + + + +
    +
    + + + + +
    +{lang_rule}: {lang_enable} +{lang_disable} +{lang_delete} +{lang_save} +
    +
    + + + + + + + + + + + + + + + + + + + + +
    + {lang_edit_vacation_settings} +
    + {lang_respond_to_mail_sent_to}: + + {multiSelectBox} +
    + {lang_every}: + + + {lang_days} +
    + {lang_with_message}: + + +
    +   +
    + +
    + +
    + + + + + + +
    + {lang_back} +
    +
    + + + + + + + + + {filter_status} + + + {filter_text} + + + Move rule up + Move rule down + + + + + + +
    +

    {validation_errors}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {lang_edit_vacation_settings} +
    + {lang_status}: + + + + {by_date} +
    + {lang_respond_to_mail_sent_to}: + + {multiSelectBox} +
    + {lang_every}: + + + {lang_days} +
    + {lang_with_message}:
    {set_as_default} +
    + + {lang_help_start_end_replacement} +
    + {lang_vacation_forwards} + + {vacation_forwards} +
    +   +
    + + + + + + + +
    + + + +   + +
    +
    +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    email notification settings
    Status: + {lang_active} + {lang_disabled} +
    External email:
    Display mail subject in notification: + {lang_yes} + {lang_no} +
    +   +
    + + + + + + + +
    + + + +   + +
    +
    +
    + diff --git a/felamimail/templates/default/sieveScriptList.tpl b/felamimail/templates/default/sieveScriptList.tpl new file mode 100644 index 0000000000..62b738572d --- /dev/null +++ b/felamimail/templates/default/sieveScriptList.tpl @@ -0,0 +1,56 @@ + + +
    +Scripts available for this account.
    +
    +
    + + + + + + + + + + {scriptrows} +
    + {lang_add_script} +
    + {lang_script_name} + + {lang_script_status} + + {lang_delete_script} +
    + +
    +
    + + + + + + {scriptname} (Script {scriptnumber}) + + + {lang_activate}{active} + + + {lang_delete} + + + + diff --git a/felamimail/templates/default/uiwidgets.tpl b/felamimail/templates/default/uiwidgets.tpl new file mode 100644 index 0000000000..53db712f6e --- /dev/null +++ b/felamimail/templates/default/uiwidgets.tpl @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + +
    + + + >> + + << + + +
    + << + + +
    + + + + + + + {tableView_Head} + + +{tableView_Rows} + +
    + + + +{tableHeadContent} + + + +
    + + + + + + + +
    + {folderTree} +
    +
    +

    + {lang_open_all} | {lang_close_all} +

    +
    +
    + diff --git a/felamimail/templates/default/vacationForm.tpl b/felamimail/templates/default/vacationForm.tpl new file mode 100644 index 0000000000..1f964a3a89 --- /dev/null +++ b/felamimail/templates/default/vacationForm.tpl @@ -0,0 +1,107 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + {lang_edit_vacation_settings} +
    + {lang_vacation_notice}: + + +
    + {lang_send_vacation_notice_every}: + + + {lang_days} +
    + {lang_local_email_address}: + + {multiSelectBox} +
    +   +
    + + + + + +
    + {lang_back} + + {lang_save_changes} +
    +
    + +
    + + + + + + \ No newline at end of file diff --git a/felamimail/templates/default/view_attachments.tpl b/felamimail/templates/default/view_attachments.tpl new file mode 100644 index 0000000000..20029e0e24 --- /dev/null +++ b/felamimail/templates/default/view_attachments.tpl @@ -0,0 +1,34 @@ + + +
    + {subject_data} +
    +
    + +{attachment_rows} +
    +
    + + + + + + + {filename} + + + {mimetype} + + + {size} + +   + + {url_img_save} + {vfs_save} + + + + diff --git a/felamimail/templates/default/view_message.tpl b/felamimail/templates/default/view_message.tpl new file mode 100644 index 0000000000..c1092df8e2 --- /dev/null +++ b/felamimail/templates/default/view_message.tpl @@ -0,0 +1,185 @@ + + + + +
    + {subject_data} +
    +
    + {header} +
    +
    + {mail_dataScript} + +
    + + + + + + + +
    + {subject_data} +
    +
    + {header} +
    +
    + {mail_dataScript} + +
    +
    + +{attachment_rows} +
    +
    + + + + + +
    {raw_header_data}
    + + + + + + + + + + + +
    + + + + + + + + + + + + {filename} + + + {mimetype} + + + {size} + +   + + {url_img_save} + {vfs_save} + + + + + + + + {lang_cc}: + + + {cc_data} + + + + + + + + {lang_bcc}: + + + {bcc_data} + + + + + + + + {lang_on_behalf_of}: + + + {onbehalfof_data} + + + + + + + + + + + + +{on_behalf_of_part} + + + + + + + + + + + +{cc_data_part} +{bcc_data_part} +
    + {lang_from}: + + {from_data} + + +
    + {lang_date}: + + {date_received} +
    + {lang_to}: + + {to_data} +
    + + + +{lang_previous_message} + + + +{lang_next_message} + diff --git a/felamimail/templates/default/view_message_printable.tpl b/felamimail/templates/default/view_message_printable.tpl new file mode 100644 index 0000000000..212cc13a1d --- /dev/null +++ b/felamimail/templates/default/view_message_printable.tpl @@ -0,0 +1,154 @@ + + + + + + + + +
    + {subject_data} +
    +
    + + + + + + + + + + +
    +   +
    +{header} +
    +
    +{body} +
    +
    + +{attachment_rows} +
    +
    + + + + + + + {filename} + + + {mimetype} + + + {size} + + + + + + + + {lang_cc}: + + + {cc_data} + + + + + + + + {lang_organisation}: + + + {organization_data} + + + + + + + + {lang_on_behalf_of}: + + + {onbehalfof_data} + + + + + + + +
    + + + + + +{on_behalf_of_part} + + + + + + +{cc_data_part} + + + + + + +
    + {lang_from}: + + {from_data} +
    + {lang_to}: + + {to_data} +
    + {lang_date}: + + {date_data} +
    +
    + + + +{lang_previous_message} + + + +{lang_next_message} + diff --git a/felamimail/templates/jerryr/app.css b/felamimail/templates/jerryr/app.css new file mode 100644 index 0000000000..b9e0be09be --- /dev/null +++ b/felamimail/templates/jerryr/app.css @@ -0,0 +1,440 @@ +.fmToggle +{ + background-color:#f6efe0; + border-top: 2px solid #f6efe0; + border-bottom: 1px solid #f6efe0; + border-left: 1px solid white; + border-right: 1px solid #9f9f9f; + font-size: 10px; +} + +.fmToggleOver +{ + background-color:#ede6d8; + border-top: 2px solid #ffc600; + border-bottom: 1px solid #ede6d8; + border-left: 1px solid white; + border-right: 1px solid #9f9f9f; + font-size: 10px; +} + +.fmTogglePush +{ + background-color:#dedcca; + border-top: 2px solid #dedcca; + border-bottom: 1px solid white; + border-left: 1px solid #9f9f9f; + border-right: 1px solid white; + font-size: 10px; +} + +th.activetab +{ + color:#000000; + background-color:#D3DCE3; + border-top : 1px solid Silver; + border-left : 1px solid Silver; + border-right : 1px solid Silver; +} + +th.inactivetab +{ + color:#000000; + background-color:#E8F0F0; + border-bottom : 1px solid Silver; +} + +.td_left +{ + border-left : 1px solid Gray; + border-top : 1px solid Gray; +} + +.input_text { + border : 1px solid Silver; +} + +.td_right +{ + border-right : 1px solid Gray; + border-top : 1px solid Gray; +} + +.text_small { font-size: 10px; } +.text_small_bold { font-size: 10px; font-weight : bold; } + +div.activetab{ display:inline; } +div.inactivetab{ display:none; } + +.quoted1 { color:#660066; } +.quoted2 { color:#007777; } +.quoted3 { color:#990000; } +.quoted4 { color:#000099; } +.quoted5 { color:#bb6600; } + + +tr.mail div { + cursor: default; + white-space: nowrap; +} + +tr.mail a { + cursor: pointer; + white-space: nowrap; +} + +tr.recent div, +tr.recent a, +tr.unseen div, +tr.unseen a { + color: #003075; + font-weight: bold; +} + +tr.flagged div, +tr.flagged a { + color: #ac0000 !important; +} + +tr.deleted div, +tr.deleted a { + color: silver; + text-decoration : line-through; +} + +span.status_img { + display: inline-block; + width: 12px; + height: 12px; + background-repeat: no-repeat; + background-image: url(../default/images/kmmsgread.png); +} + +tr.deleted span.status_img { + background-image: url(../default/images/kmmsgdel.png); +} + +tr.unseen span.status_img { + background-image: url(../default/images/kmmsgunseen.png); +} + +tr.recent span.status_img { + background-image: url(../default/images/kmmsgnew.png) !important; +} + +tr.replied span.status_img { + background-image: url(../default/images/kmmsgreplied.png) !important; +} + +tr.forwarded span.status_img { + background-image: url(../default/images/kmmsgforwarded.png) !important; +} + +.subjectBold +{ + FONT-SIZE: 12px; + font-weight : bold; + font-family : Arial; +} + +.subject +{ + FONT-SIZE: 12px; + font-family : Arial; +} + +/*body +{ + background-image:url(../default/images/body-background.png);; +} + +.body +{ + FONT-SIZE: 12px; + font-family : Arial; +}*/ + +TR.sieveRowActive +{ + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; +} + +A.sieveRowActive +{ + FONT-SIZE: 11px; + height : 14px; + padding: 0; +} + +TR.sieveRowInActive +{ + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; + color: Silver; +} + +A.sieveRowInActive +{ + FONT-SIZE: 11px; + height : 14px; + padding: 0; + color: Silver; +} + + +.dtree { + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 11px; + color: #666; + white-space: nowrap; +} +.dtree img { + border: 0px; + vertical-align: middle; +} +.dtree a { + color: #333; + text-decoration: none; +} +.dtree a.node, .dtree a.nodeSel { + white-space: nowrap; + padding: 1px 2px 1px 2px; +} +.dtree a.node:hover, .dtree a.nodeSel:hover { + color: #333; + text-decoration: underline; +} +.dtree a.nodeSel { + background-color: #c0d2ec; +} +.dtree .clip { + overflow: hidden; +} +.dtree table, .dtree tr, .dtree td { + border: none; +} + +tr.navbarBackground { + background-color:#dddddd; +} + +div.parentDIV { + background-color:#dddddd; + position: relative; + top: 0px; + left: 0px; +} + +div.navButton { + background-color:#dddddd; + float:left; + padding: 2px; + margin: 2px; + border: solid #dddddd 1px; +} + +div.navButton:hover, div.navButtonHover { + background-color:#eeeeee; + float:left; + padding: 2px; + margin: 2px; + border: solid white 1px; + border-right: solid black 1px; + border-bottom: solid black 1px; + position: relative; +} + +div.navButton:active, div.navButtonActive { + background-color:#dddddd; + float:left; + padding: 2px; + margin: 2px; + border: solid #9f9f9f 1px; + position: relative; +} + +div.navSeparator { + background-color:#dddddd; + float:left; + padding: 0px; + margin: 2px; + border: solid silver 1px; + height:24px; + position: relative; +} + +div.inactiveResultRow { + background-color: white; + text-align: left; +} + +div.activeResultRow { + background-color: silver; + text-align: left; +} + +div.resultBoxHidden { + width: 450px; + position: absolute; + display: none; +} + +div.resultBoxVisible { + border: solid 1px black; + width: 450px; + position: absolute; + display: block; + background: white; + max-height: 25%; + overflow: auto; +} + +button.menuButton { + float:left; + padding: 2px; + margin: 2px; + border: solid #dddddd 1px; + position: relative; + height: 25px; + width: 26px; + background-color:#dddddd; +} + +button.menuButton:hover { + background-color:#eeeeee; + float:left; + padding: 2px; + margin: 2px; + border: solid white 1px; + border-right: solid black 1px; + border-bottom: solid black 1px; + position: relative; + height: 25px; + width: 26px; +} + +button.menuButton:active { + background-color:#dddddd; + float:left; + padding: 2px; + margin: 2px; + border: solid white 1px; + border-left: solid black 1px; + border-top: solid black 1px; + position: relative; +} + +fieldset.bordertop { + border-left:0px; + border-right:0px; + border-bottom:0px; + border-top:1px solid silver; +} + +TD.mainscreenRow { + border-bottom:1px solid #CCCCEE; +} + +DIV.divButton { + width:16px; + height:16px; + border: 0px solid red; + background-repeat:no-repeat; + background-position: center center; +} + +#navbarDIV { + position:absolute; + top:0px; + height:30px; + left:0px; + right:0px; + border: solid white 1px; + border-right: solid black 1px; + border-bottom: solid black 1px; +} + +#subjectDIV { + position:fixed; + background-color:#ffffff; + top:32px; + min-height:20px; + width:100%; + font-weight:bold; + text-align:left; + line-height:20px; +} + +#headerDIV { + position:absolute; + background-color:#efefdf; + top:52px; + height:80px; + left:0px; + right:0px; + border-top: 1px solid silver; + border-bottom: 1px solid silver; + overflow:hidden; +} + +.bodyDIV { + position:absolute; + background-color:white; + top:134px; + bottom:0px; + width:100%; + border-top: 1px solid #efefdf; +} + +.bodyDIVAttachment { + bottom:80px; +} + +#messageIFRAME { + width:100%; + border:0px solid black; + height:99%; +} + +#attachmentDIV { + position:fixed; + background-color:#efefdf; + bottom:0px; + min-height:80px; + max-height:240px; + width:100%; + border-top: 1px solid silver; + overflow:auto; +} + +pre { + white-space: pre-wrap; /* Mozilla, since 1999 */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + width: 99%; +} + +/* +* new dialog style definitions +*/ +#contentdialog {padding:20px} +#dialog {position:absolute; width:425px; padding:10px; z-index:200; background:#fff} +#dialog-header {display:block; position:relative; width:411px; padding:3px 6px 7px; height:14px; font-size:14px; font-weight:bold} +#dialog-title {float:left} +#dialog-close {float:right; cursor:pointer; margin:3px 3px 0 0; height:11px; width:11px; background:url(../default/images/dialog_close.gif) no-repeat} +#dialog-content {display:block; height:160px; padding:6px; color:#666666; font-size:13px} +#dialog-mask {position:absolute; top:0; left:0; min-height:100%; width:100%; background:#FFF; opacity:.75; filter:alpha(opacity=75); z-index:100} +.error {background:#fff url(../default/images/error_bg.jpg) bottom right no-repeat; border:1px solid #924949; border-top:none} +.errorheader {background:url(../default/images/error_header.gif) repeat-x; color:#6f2c2c; border:1px solid #924949; border-bottom:none} +.warning {background:#fff url(../default/images/warning_bg.jpg) bottom right no-repeat; border:1px solid #c5a524; border-top:none} +.warningheader {background:url(../default/images/warning_header.gif) repeat-x; color:#957c17; border:1px solid #c5a524; border-bottom:none} +.success {background:#fff url(../default/images/success_bg.jpg) bottom right no-repeat; border:1px solid #60a174; border-top:none} +.successheader {background:url(../default/images/success_header.gif) repeat-x; color:#3c7f51; border:1px solid #60a174; border-bottom:none} +.prompt {background:#fff url(../default/images/prompt_bg.jpg) bottom right no-repeat; border:1px solid #4f6d81; border-top:none} +.promptheader {background:url(../default/images/prompt_header.gif) repeat-x; color:#355468; border:1px solid #4f6d81; border-bottom:none} + diff --git a/felamimail/templates/jerryr/images/mail_find.png b/felamimail/templates/jerryr/images/mail_find.png new file mode 100644 index 0000000000..156187d6e6 Binary files /dev/null and b/felamimail/templates/jerryr/images/mail_find.png differ diff --git a/felamimail/templates/jerryr/images/navbar-over.png b/felamimail/templates/jerryr/images/navbar-over.png new file mode 100644 index 0000000000..0ae28269d7 Binary files /dev/null and b/felamimail/templates/jerryr/images/navbar-over.png differ diff --git a/felamimail/templates/jerryr/images/navbar.png b/felamimail/templates/jerryr/images/navbar.png new file mode 100644 index 0000000000..fc980ab5bf Binary files /dev/null and b/felamimail/templates/jerryr/images/navbar.png differ diff --git a/felamimail/templates/jerryr/images/write_mail.png b/felamimail/templates/jerryr/images/write_mail.png new file mode 100644 index 0000000000..98713acb9f Binary files /dev/null and b/felamimail/templates/jerryr/images/write_mail.png differ diff --git a/felamimail/templates/jerryr/mainscreen.tpl b/felamimail/templates/jerryr/mainscreen.tpl new file mode 100644 index 0000000000..e05b0d5228 --- /dev/null +++ b/felamimail/templates/jerryr/mainscreen.tpl @@ -0,0 +1,217 @@ + + +
    + + + + + + + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + +
    + + + {message} + + {vacation_warning} + + {quota_display} +
    + + + +
    +
    + + {header_rows} + +
    +
    + + + +
    +
    + + + + +
    + +
    + + {IFrameForPreview} + + + + + + + + + + + + + +
    + {link_previous} +   + + + {message} + + {trash_link} + + {link_next} +
    + + + + + + + + + +
    + {lang_connection_failed}
    +
    {connection_error_message}

    +
    + + + + + + + + +
    +  {quotaUsage_left} + +  {quotaUsage_right} +
    + + + + + {header_subject} + + + + + + {header_subject} + + + + diff --git a/felamimail/testimapserver.php b/felamimail/testimapserver.php new file mode 100644 index 0000000000..2f341cbc5e --- /dev/null +++ b/felamimail/testimapserver.php @@ -0,0 +1,168 @@ +THIS SCRIPT IS DISABLED FOR SECURITY REASONS.

    PLEASE COMMENT OUT LINE ". __LINE__ ." TO ENABLE THIS SCRIPT."); + +######################################## +# SSL example +######################################## +#$host = 'ssl://127.0.0.1'; +#$port = 993; +#$username1 = 'username'; +#$password1 = 'password'; +#$username2 = 'username'; +#$password2 = 'password'; + +######################################## +# TLS example +######################################## +#$host = 'tls://127.0.0.1'; +#$port = 993; +#$username1 = 'username'; +#$password1 = 'password'; +#$username2 = 'username'; +#$password2 = 'password'; + +######################################## +# no encryption or STARTTLS +######################################## +$host = '127.0.0.1'; +$port = 143; +$username1 = 'username'; +$password1 = 'password'; +$username2 = ''; +$password2 = ''; + +# folder to use for testing the SORT feature +$testFolder = 'INBOX'; +$enableSTARTTLS = true; + +$startTime = microtime(true); + +print "
    ";
    +
    +set_include_path('../egw-pear'. PATH_SEPARATOR .'/usr/share/php'. PATH_SEPARATOR . get_include_path());
    +
    +require_once 'Net/IMAP.php';
    +
    +print "

    ATTENTION: THIS OUTPUT CONTAINS YOUR USERNAME AND PASSWORD!!!

    "; + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: Login as user $username1

    "; +$imapClient = new Net_IMAP($host, $port, $enableSTARTTLS); +$imapClient->setDebug(true); +$imapClient->login($username1, $password1, true, false); +$imapClient->selectMailbox($testFolder); + +if(!empty($username2) && !empty($password2)) { + $elapsedTime = microtime(true) - $startTime; + print "

    $elapsedTime :: Login as user $username2

    "; + $imapClient2 = new Net_IMAP($host); + $imapClient2->setDebug(true); + $imapClient2->login($username2, $password2, true, false); +} + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: Getting hierarchy delimiter

    "; +$delimiter = $imapClient->getHierarchyDelimiter(); +print "delimiter is: $delimiter
    "; + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: List all folders

    "; +$imapClient->getMailboxes(); + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: List all subscribed folders

    "; +$imapClient->listsubscribedMailboxes(); + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: Checking for ACL support: "; +if($imapClient->hasCapability('ACL')) { + print "supported

    "; + $imapClient->getMyRights($testFolder); + $imapClient->getACLRights($username1, $testFolder); + if(!empty($username2)) { + $imapClient->setACL($testFolder, $username2, 'lrswipcda'); + $imapClient->getACLRights($username2, $testFolder); + $imapClient->deleteACL($testFolder, $username2); + $imapClient->getACLRights($username2, $testFolder); + } + $imapClient->getACL($testFolder); +} else { + print "not supported"; +} + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: Checking for NAMESPACE support: "; +if($imapClient->hasCapability('NAMESPACE')) { + print "supported

    "; + $nameSpace = $imapClient->getNameSpace(); + #print "parsed NAMESPACE info:
    "; + #var_dump($nameSpace); +} else { + print "not supported"; +} + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: Checking for QUOTA support: "; +if($imapClient->hasCapability('QUOTA')) { + print "supported

    "; + $quota = $imapClient->getStorageQuotaRoot(); + print "parsed QUOTA info:
    "; + var_dump($quota); +} else { + print "not supported"; +} + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: Checking for SORT support: "; +if($imapClient->hasCapability('SORT')) { + print "supported

    "; + $elapsedTime = microtime(true) - $startTime; + print "

    $elapsedTime :: Sorting $testFolder by DATE:

    "; + $sortResult = $imapClient->sort('DATE'); + $elapsedTime = microtime(true) - $startTime; + print "

    $elapsedTime :: Sorting $testFolder by SUBJECT:

    "; + $sortResult = $imapClient->sort('SUBJECT'); +} else { + print "not supported"; +} + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: Logout

    "; + +$imapClient->disconnect(); +print "
    "; + + +?>