X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=plugins%2Fmail_fetch%2Ffetch.php;h=95bb9b57354e8e2a77ffdc4e80da3c0d9ba99125;hp=ecfdad68e06f9ca6f574aaa329db3751e1895116;hb=3d8a60fb4803e3d965716b04e60a8733aeca4a71;hpb=47ccfad452e8d345542d09e59112cac317cffed8 diff --git a/plugins/mail_fetch/fetch.php b/plugins/mail_fetch/fetch.php index ecfdad68..95bb9b57 100644 --- a/plugins/mail_fetch/fetch.php +++ b/plugins/mail_fetch/fetch.php @@ -5,28 +5,33 @@ * * Fetch code. * - * @copyright © 1999-2006 The SquirrelMail Project Team + * @copyright © 1999-2009 The SquirrelMail Project Team * @license http://opensource.org/licenses/gpl-license.php GNU Public License * @version $Id$ * @package plugins * @subpackage mail_fetch */ -/** @ignore */ -define('SM_PATH','../../'); +/** + * Include the SquirrelMail initialization file. + */ +require('../../include/init.php'); -require_once(SM_PATH . 'include/validate.php'); -include_once(SM_PATH . 'functions/imap.php'); -include_once(SM_PATH . 'plugins/mail_fetch/class.POP3.php'); +include_once(SM_PATH . 'functions/imap_general.php'); include_once(SM_PATH . 'plugins/mail_fetch/functions.php' ); +// don't load this page if this plugin is not enabled +// +global $plugins; +if (!in_array('mail_fetch', $plugins)) exit; + /* globals */ -sqgetGlobalVar('username', $username, SQ_SESSION); -sqgetGlobalVar('key', $key, SQ_COOKIE); -sqgetGlobalVar('onetimepad', $onetimepad, SQ_SESSION); sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION); /* end globals */ +/** + * @param string $msg mail + */ function Mail_Fetch_Status($msg) { echo html_tag( 'table', html_tag( 'tr', @@ -36,14 +41,19 @@ function Mail_Fetch_Status($msg) { flush(); } +/** + * @return array + */ function Mail_Fetch_Servers() { global $data_dir, $username; + $mailfetch = array(); $mailfetch['server_number'] = getPref($data_dir, $username, "mailfetch_server_number"); if (!isset($mailfetch['server_number']) || ($mailfetch['server_number'] < 1)) { $mailfetch['server_number'] = 0; } $mailfetch['cypher'] = getPref($data_dir, $username, "mailfetch_cypher"); + for ($i = 0; $i < $mailfetch['server_number']; $i++) { $mailfetch[$i]['server'] = getPref($data_dir, $username, "mailfetch_server_$i"); $mailfetch[$i]['port'] = getPref($data_dir, $username, "mailfetch_port_$i"); @@ -63,10 +73,17 @@ function Mail_Fetch_Servers() { if($mailfetch[$i]['alias'] == '') { $mailfetch[$i]['alias'] == $mailfetch[$i]['server']; } + // Authentication type (added in 1.5.2) + $mailfetch[$i]['auth'] = getPref($data_dir, $username, "mailfetch_auth_$i",MAIL_FETCH_AUTH_USER); + // Connection type (added in 1.5.2) + $mailfetch[$i]['type'] = getPref($data_dir, $username, "mailfetch_type_$i",MAIL_FETCH_USE_PLAIN); } - return $mailfetch; + return $mailfetch; } +/** + * @param array $mailfetch + */ function Mail_Fetch_Select_Server($mailfetch) { global $PHP_SELF; @@ -107,9 +124,9 @@ function Mail_Fetch_Select_Server($mailfetch) { } $mailfetch = Mail_Fetch_Servers(); -displayPageHeader($color, 'None'); +displayPageHeader($color); -echo '
'; +echo '
'; echo html_tag( 'table', html_tag( 'tr', @@ -120,16 +137,18 @@ echo html_tag( 'table', /* there are no servers defined yet... */ if($mailfetch['server_number'] == 0) { +//FIXME: do not echo directly to browser -- use templates only echo '

' . _("No POP3 servers configured yet.") . '

'; - displayInternalLink('plugins/mail_fetch/options.php', + echo makeInternalLink('plugins/mail_fetch/options.php', _("Click here to go to the options page.") ); - echo ''; + $oTemplate->display('footer.tpl'); exit(); } // get $server_to_fetch from globals, if not set display a choice to the user if (! sqgetGlobalVar('server_to_fetch', $server_to_fetch, SQ_POST) ) { Mail_Fetch_Select_Server($mailfetch); + $oTemplate->display('footer.tpl'); exit(); } @@ -150,14 +169,15 @@ for ($i_loop=$i_start;$i_loop<$i_stop;$i_loop++) { $mailfetch_login = $mailfetch[$i_loop]['login']; $mailfetch_uidl = $mailfetch[$i_loop]['uidl']; $mailfetch_subfolder = $mailfetch[$i_loop]['subfolder']; - - $pop3 = new POP3($mailfetch_server, 60); + $mailfetch_auth = $mailfetch[$i_loop]['auth']; + $mailfetch_type = $mailfetch[$i_loop]['type']; echo '
' . html_tag( 'table', html_tag( 'tr', - html_tag( 'td', '' . _("Fetching from ") . - htmlspecialchars($mailfetch[$i_loop]['alias']) . + html_tag( 'td', '' . + sprintf(_("Fetching from %s"), + htmlspecialchars($mailfetch[$i_loop]['alias'])) . '', 'center' ) , '', $color[9] ) , @@ -165,13 +185,19 @@ for ($i_loop=$i_start;$i_loop<$i_stop;$i_loop++) { flush(); - if (!$pop3->connect($mailfetch_server,$mailfetch_port)) { - Mail_Fetch_Status(_("Oops, ") . $pop3->ERROR ); + $pop3 = new mail_fetch(array('host' => $mailfetch_server, + 'port' => $mailfetch_port, + 'auth' => $mailfetch_auth, + 'tls' => $mailfetch_type, + 'timeout' => 60)); + + if (!empty($pop3->error)) { + Mail_Fetch_Status($pop3->error); continue; } Mail_Fetch_Status(_("Opening IMAP server")); - $imap_stream = sqimap_login($username, $key, $imapServerAddress, $imapPort, 10); + $imap_stream = sqimap_login($username, false, $imapServerAddress, $imapPort, 10); // check if destination folder is not set, is not subscribed and is not \noselect folder if($mailfetch_subfolder == '' || @@ -180,88 +206,86 @@ for ($i_loop=$i_start;$i_loop<$i_stop;$i_loop++) { } Mail_Fetch_Status(_("Opening POP server")); - $Count = $pop3->login($mailfetch_user, $mailfetch_pass); - if (($Count == false || $Count == -1) && $pop3->ERROR != '') { - Mail_Fetch_Status(_("Login Failed:") . ' ' . htmlspecialchars($pop3->ERROR) ); + + /* log into pop server*/ + if (! $pop3->login($mailfetch_user, $mailfetch_pass)) { + Mail_Fetch_Status(_("Login Failed:") . ' ' . htmlspecialchars($pop3->error)); continue; } - // register_shutdown_function($pop3->quit()); + $aMsgStat = $pop3->command_stat(); + if (is_bool($aMsgStat)) { + Mail_Fetch_Status(_("Can't get mailbox status:") . ' ' . htmlspecialchars($pop3->error) ); + continue; + } - $msglist = $pop3->uidl(); + $Count = $aMsgStat['count']; $i = 1; - for ($j = 1; $j < sizeof($msglist); $j++) { - if ($msglist[$j] == $mailfetch_uidl) { - $i = $j+1; - break; + + if ($Count>0) { + // If we leave mails on server, try using UIDL + if ($mailfetch_lmos == 'on') { + Mail_Fetch_Status(_("Fetching UIDL...")); + $msglist = $pop3->command_uidl(); + if (is_bool($msglist)) { + Mail_Fetch_Status(_("Server does not support UIDL.") . ' '.htmlspecialchars($pop3->error)); + // User asked to leave mails on server, but we can't do that. + $pop3->command_quit(); + continue; + // $mailfetch_lmos = 'off'; + } else { + // calculate number of new mails + for ($j = 1; $j <= sizeof($msglist); $j++) { + // do strict comparison ('1111.10' should not be equal to '1111.100') + if ($msglist[$j] === $mailfetch_uidl) { + $i = $j+1; + break; + } + } + } + } + // fetch list of mails with LIST + // we can use else control, but we can also set $mailfetch_lmos + // to off if server does not support UIDL. + if ($mailfetch_lmos != 'on') { + Mail_Fetch_Status(_("Fetching list of mails...")); + $msglist = $pop3->command_list(); } } if ($Count < $i) { - Mail_Fetch_Status(_("Login OK: No new messages")); - $pop3->quit(); + Mail_Fetch_Status(_("Login OK: No new mails")); + $pop3->command_quit(); continue; } if ($Count == 0) { Mail_Fetch_Status(_("Login OK: Inbox EMPTY")); - $pop3->quit(); + $pop3->command_quit(); continue; } else { $newmsgcount = $Count - $i + 1; - Mail_Fetch_Status(sprintf(ngettext("Login OK: Inbox contains %s message", - "Login OK: Inbox contains %s messages",$newmsgcount), $newmsgcount)); + Mail_Fetch_Status(sprintf(ngettext("Login OK: Inbox contains %s mail", + "Login OK: Inbox contains %s mails",$newmsgcount), $newmsgcount)); } - Mail_Fetch_Status(_("Fetching UIDL...")); - // Faster to get them all at once - $mailfetch_uidl = $pop3->uidl(); - - if (! is_array($mailfetch_uidl) && $mailfetch_lmos == 'on') - Mail_Fetch_Status(_("Server does not support UIDL.")); - if ($mailfetch_lmos == 'on') { - Mail_Fetch_Status(_("Leaving mail on server...")); + Mail_Fetch_Status(_("Leaving mails on server...")); } else { - Mail_Fetch_Status(_("Deleting messages from server...")); + Mail_Fetch_Status(_("Deleting mails from server...")); } for (; $i <= $Count; $i++) { - Mail_Fetch_Status(_("Fetching message ") . "$i" ); + Mail_Fetch_Status(sprintf(_("Fetching mail %s."), $i)); if (!ini_get('safe_mode')) - set_time_limit(20); // 20 seconds per message max - $Message = ''; - $MessArray = $pop3->get($i); - - while ( (!$MessArray) or (gettype($MessArray) != "array")) { - Mail_Fetch_Status(_("Oops, ") . $pop3->ERROR); - // re-connect pop3 - Mail_Fetch_Status(_("Server error. Disconnect")); - $pop3->quit(); - Mail_Fetch_Status(_("Reconnect from dead connection")); - if (!$pop3->connect($mailfetch_server)) { - Mail_Fetch_Status(_("Oops, ") . $pop3->ERROR ); - Mail_Fetch_Status(_("Saving UIDL")); - setPref($data_dir,$username,"mailfetch_uidl_$i_loop", $mailfetch_uidl[$i-1]); - - continue; - } - $Count = $pop3->login($mailfetch_user, $mailfetch_pass); - if (($Count == false || $Count == -1) && $pop3->ERROR != '') { - Mail_Fetch_Status(_("Login Failed:") . ' ' . $pop3->ERROR ); - Mail_Fetch_Status(_("Saving UIDL")); - setPref($data_dir,$username,"mailfetch_uidl_$i_loop", $mailfetch_uidl[$i-1]); + set_time_limit(20); // 20 seconds per mail max - continue; - } - Mail_Fetch_Status(_("Refetching message ") . "$i" ); - $MessArray = $pop3->get($i); + $Message = $pop3->command_retr($i); - } // end while - - while (list($lineNum, $line) = each ($MessArray)) { - $Message .= $line; + if (is_bool($Message)) { + Mail_Fetch_Status(htmlspecialchars($pop3->error)); + continue; } fputs($imap_stream, "A3$i APPEND \"$mailfetch_subfolder\" {" . strlen($Message) . "}\r\n"); @@ -273,53 +297,55 @@ for ($i_loop=$i_start;$i_loop<$i_stop;$i_loop++) { $response=(implode('',$response)); $message=(implode('',$message)); if ($response != 'OK') { - Mail_Fetch_Status(_("Error Appending Message!")." ".htmlspecialchars($message) ); + Mail_Fetch_Status(_("Error Appending Mail!")." ".htmlspecialchars($message) ); Mail_Fetch_Status(_("Closing POP")); - $pop3->quit(); + $pop3->command_quit(); Mail_Fetch_Status(_("Logging out from IMAP")); sqimap_logout($imap_stream); - Mail_Fetch_Status(_("Saving UIDL")); - setPref($data_dir,$username,"mailfetch_uidl_$i_loop", $mailfetch_uidl[$i-1]); + if ($mailfetch_lmos == 'on') { + Mail_Fetch_Status(_("Saving UIDL")); + setPref($data_dir,$username,"mailfetch_uidl_$i_loop", $msglist[$i-1]); + } exit; } else { - Mail_Fetch_Status(_("Message appended to mailbox")); + Mail_Fetch_Status(_("Mail appended to mailbox")); } if ($mailfetch_lmos != 'on') { - if( $pop3->delete($i) ) { - Mail_Fetch_Status(sprintf(_("Message %d deleted from remote server!"), $i)); + if( $pop3->command_dele($i) ) { + Mail_Fetch_Status(sprintf(_("Mail %d deleted from remote server!"), $i)); } else { - Mail_Fetch_Status(_("Delete failed:") . htmlspecialchars($pop3->ERROR) ); + Mail_Fetch_Status(_("Delete failed:") . htmlspecialchars($pop3->error) ); } } } else { echo $Line; - Mail_Fetch_Status(_("Error Appending Message!")); + Mail_Fetch_Status(_("Error Appending Mail!")); Mail_Fetch_Status(_("Closing POP")); - $pop3->quit(); + $pop3->command_quit(); Mail_Fetch_Status(_("Logging out from IMAP")); sqimap_logout($imap_stream); // not gurantee corect! - Mail_Fetch_Status(_("Saving UIDL")); - setPref($data_dir,$username,"mailfetch_uidl_$i_loop", $mailfetch_uidl[$i-1]); + if ($mailfetch_lmos == 'on') { + Mail_Fetch_Status(_("Saving UIDL")); + setPref($data_dir,$username,"mailfetch_uidl_$i_loop", $msglist[$i-1]); + } exit; } } Mail_Fetch_Status(_("Closing POP")); - $pop3->quit(); + $pop3->command_quit(); Mail_Fetch_Status(_("Logging out from IMAP")); sqimap_logout($imap_stream); - if (is_array($mailfetch_uidl)) { + if ($mailfetch_lmos == 'on' && is_array($msglist)) { Mail_Fetch_Status(_("Saving UIDL")); - setPref($data_dir,$username,"mailfetch_uidl_$i_loop", array_pop($mailfetch_uidl)); + setPref($data_dir,$username,"mailfetch_uidl_$i_loop", array_pop($msglist)); } Mail_Fetch_Status(_("Done")); } -?> -
- - \ No newline at end of file + +$oTemplate->display('footer.tpl');