mailbox/0040775000567100000000000000000010452636156012063 5ustar jcameronrootmailbox/boxes-lib.pl0100644000567100000120000015261510452636135014432 0ustar jcameronwheel# boxes-lib.pl # Functions to parsing user mail files use POSIX; use Time::Local; # list_mails(user|file, [start], [end]) # Returns a subset of mail from a mbox format file sub list_mails { local (@rv, $h, $done); my (@index, %index, $itype); $itype = &index_type($_[0]); if ($itype == 0) { @index = &build_index($_[0]); } else { &build_dbm_index($_[0], \%index); } local ($start, $end); local $isize = $itype == 0 ? scalar(@index) : $index{'mailcount'}; if (@_ == 1 || !defined($_[1]) && !defined($_[2])) { $start = 0; $end = $isize-1; } elsif ($_[2] < 0) { $start = $isize+$_[2]-1; $end = $isize+$_[1]-1; $start = $start<0 ? 0 : $start; } else { $start = $_[1]; $end = $_[2]; $end = $isize-1 if ($end >= $isize); } $rv[$isize-1] = undef if ($isize); # force array to right size local $dash = &dash_mode($_[0]); open(MAIL, &user_mail_file($_[0])); $start = 0 if ($start < 0); for($i=$start; $i<=$end; $i++) { # Seek to mail position local $startline; if ($itype == 0) { seek(MAIL, $index[$i]->[0], 0); $startline = $index[$i]->[1]; } else { local @idx = split(/\0/, $index{$i}); seek(MAIL, $idx[0], 0); $startline = $idx[1]; } # Read the mail local $mail = &read_mail_fh(MAIL, $dash ? 2 : 1, 0); $mail->{'line'} = $startline; $mail->{'eline'} = $startline + $mail->{'lines'} - 1; $mail->{'idx'} = $i; $rv[$i] = $mail; } return @rv; } # select_mails(user|file, &indexes, headersonly) # Returns a list of messages with the given indexes sub select_mails { local (@rv); my (@index, %index, $itype); $itype = &index_type($_[0]); if ($itype == 0) { @index = &build_index($_[0]); } else { &build_dbm_index($_[0], \%index); } local $isize = $itype == 0 ? scalar(@index) : $index{'mailcount'}; open(MAIL, &user_mail_file($_[0])); foreach my $i (@{$_[1]}) { # Seek to mail position local $startline; if ($itype == 0) { seek(MAIL, $index[$i]->[0], 0); $startline = $index[$i]->[1]; } else { local @idx = split(/\0/, $index{$i}); seek(MAIL, $idx[0], 0); $startline = $idx[1]; } # Read the mail local $mail = &read_mail_fh(MAIL, $dash ? 2 : 1, $_[2]); $mail->{'line'} = $startline; $mail->{'eline'} = $startline + $mail->{'lines'} - 1; $mail->{'idx'} = $i; push(@rv, $mail); } close(MAIL); return @rv; } # search_mail(user, field, match) # Returns an array of messages matching some search sub search_mail { return &advanced_search_mail($_[0], [ [ $_[1], $_[2] ] ], 1); } # advanced_search_mail(user|file, &fields, andmode, [&limits]) # Returns an array of messages matching some search sub advanced_search_mail { local $itype = &index_type($_[0]); local (@index, %index, @rv, $i); local $dash = &dash_mode($_[0]); local @possible; # index positions of possible mails local $possible_certain = 0; # is possible list authoratative? local ($min, $max); if ($itype == 0) { # We have only a plain index .. @index = &build_index($_[0]); $min = 0; $max = scalar(@index)-1; if ($_[3] && $_[3]->{'latest'}) { $min = $max - $_[3]->{'latest'}; } @possible = ($min .. $max); } else { # We have a DBM index .. if the search includes the from and subject # fields, scan it first to cut down on the total time &build_dbm_index($_[0], \%index); # Check which fields are used in search local @dbmfields = grep { $_->[0] eq 'from' || $_->[0] eq 'subject' } @{$_[1]}; local $alldbm = (scalar(@dbmfields) == scalar(@{$_[1]})); $min = 0; $max = $index{'mailcount'}-1; if ($_[3] && $_[3]->{'latest'}) { $min = $max - $_[3]->{'latest'}; } # Only check DBM if it contains some fields, and if it contains all # fields when in 'or' mode. if (@dbmfields && ($alldbm || $_[2])) { # Scan the DBM to build up a list of 'possibles' for($i=$min; $i<=$max; $i++) { local @idx = split(/\0/, $index{$i}); local $fake = { 'header' => { 'from', $idx[2], 'subject', $idx[3] } }; local $m = &mail_matches(\@dbmfields, $_[2], $fake); push(@possible, $i) if ($m); } $possible_certain = $alldbm; } else { # None of the DBM fields are in the search .. have to scan all @possible = ($min .. $max); } } # Need to scan through possible messages to find those that match open(MAIL, &user_mail_file($_[0])); foreach $i (@possible) { # Seek to mail position local $startline; if ($itype == 0) { seek(MAIL, $index[$i]->[0], 0); $startline = $index[$i]->[1]; } else { local @idx = split(/\0/, $index{$i}); seek(MAIL, $idx[0], 0); $startline = $idx[1]; } # Read the mail local $mail = &read_mail_fh(MAIL, $dash ? 2 : 1, 0); $mail->{'line'} = $startline; $mail->{'eline'} = $startline + $mail->{'lines'} - 1; $mail->{'idx'} = $i; push(@rv, $mail) if ($possible_certain || &mail_matches($_[1], $_[2], $mail)); } return @rv; } # build_index(user|file) sub build_index { local @index; local $ifile = &user_index_file($_[0]); local $umf = &user_mail_file($_[0]); local @ist = stat($ifile); local @st = stat($umf); if (open(INDEX, $ifile)) { @index = map { /(\d+)\s+(\d+)/; [ $1, $2 ] } ; close(INDEX); } if (!@ist || !@st || $ist[9] < $st[9] || $st[7] < $config{'index_min'}) { # The mail file is newer than the index, or we are always re-indexing local $fromok = 1; local ($l, $ll); local $dash = &dash_mode($umf); if ($st[7] < $config{'index_min'}) { $fromok = 0; # Always re-index open(MAIL, $umf); } else { if (open(MAIL, $umf)) { local $il = $#index; local $i; for($i=($il>100 ? 100 : $il); $i>=0; $i--) { $l = $index[$il-$i]; seek(MAIL, $index[$il-$i]->[0], 0); $ll = ; $fromok = 0 if ($ll !~ /^From\s+(\S+).*\d+\r?\n/ || ($1 eq '-' && !$dash)); } } else { $fromok = 0; # No mail file yet } } local ($pos, $lnum); if (scalar(@index) && $fromok && $st[7] > $l->[0]) { # Mail file seems to have gotten bigger, most likely # because new mail has arrived ... only reindex the new mails $pos = $l->[0] + length($ll); $lnum = $l->[1] + 1; } else { # Mail file has changed in some other way ... do a rebuild $pos = 0; $lnum = 0; undef(@index); seek(MAIL, 0, 0); } while() { if (/^From\s+(\S+).*\d+\r?\n/ && ($1 ne '-' || $dash)) { push(@index, [ $pos, $lnum ]); } $pos += length($_); $lnum++; } close(MAIL); open(INDEX, ">$ifile"); print INDEX map { $_->[0]." ".$_->[1]."\n" } @index; close(INDEX); } return @index; } # build_dbm_index(user|file, &index) # Returns a reference to a DBM hash that indexes the given mail file. # Hash contains keys 0, 1, 2 .. each of which has a value containing the # position of the mail in the file, line number, subject and sender. # Special key lastchange = time index was last updated # mailcount = number of messages in index sub build_dbm_index { local $ifile = &user_index_file($_[0]); local $umf = &user_mail_file($_[0]); local @st = stat($umf); local $index = $_[1]; dbmopen(%$index, $ifile, 0600); if (!@st || $index->{'lastchange'} < $st[9] || $st[7] < $config{'index_min'}) { # The mail file is newer than the index, or we are always re-indexing local $fromok = 1; local ($ll, @idx); local $dash = &dash_mode($umf); if ($st[7] < $config{'index_min'}) { $fromok = 0; # Always re-index open(MAIL, $umf); } else { if (open(MAIL, $umf)) { # Check the last 100 messages (at most) local $il = $index->{'mailcount'}-1; local $i; for($i=($il>100 ? 100 : $il); $i>=0; $i--) { @idx = split(/\0/, $index->{$il-$i}); seek(MAIL, $idx[0], 0); $ll = ; $fromok = 0 if ($ll !~ /^From\s+(\S+).*\d+\r?\n/ || ($1 eq '-' && !$dash)); } } else { $fromok = 0; # No mail file yet } } local ($pos, $lnum, $istart); if ($index->{'mailcount'} && $fromok && $st[7] > $idx[0]) { # Mail file seems to have gotten bigger, most likely # because new mail has arrived ... only reindex the new mails $pos = $idx[0] + length($ll); $lnum = $idx[1] + 1; $istart = $index->{'mailcount'}; } else { # Mail file has changed in some other way ... do a rebuild $istart = 0; $pos = 0; $lnum = 0; seek(MAIL, 0, 0); } local ($doingheaders, @nidx); while() { if (/^From\s+(\S+).*\d+\r?\n/ && ($1 ne '-' || $dash)) { @nidx = ( $pos, $lnum ); $index->{$istart++} = join("\0", @nidx); $doingheaders = 1; } elsif ($_ eq "\n" || $_ eq "\r\n") { $doingheaders = 0; } elsif ($doingheaders && /^From:\s*(.{0,255})/i) { $nidx[2] = $1; $index->{$istart-1} = join("\0", @nidx); } elsif ($doingheaders && /^Subject:\s*(.{0,255})/i) { $nidx[3] = $1; $index->{$istart-1} = join("\0", @nidx); } $pos += length($_); $lnum++; } close(MAIL); $index->{'lastchange'} = time(); $index->{'mailcount'} = $istart; } } # index_type(user|file) # Returns 0 if an old-style index exists for some mailbox, 1 if not (indicating # that DBM indexing should be used) sub index_type { return 0 if (!$config{'index_dbm'}); return 1 if ($config{'index_dbm'} == 2); local $ifile = &user_index_file($_[0]); return -r $ifile ? 0 : 1; } # empty_mail(user|file) # Truncate a mail file to nothing sub empty_mail { local $umf = &user_mail_file($_[0]); local $itype = &index_type($_[0]); local $ifile = &user_index_file($_[0]); open(TRUNC, ">$umf"); close(TRUNC); if ($itype == 0) { # Truncate index too open(TRUNC, ">$ifile"); close(TRUNC); } else { # Set index size to 0 local %index; dbmopen(%index, $ifile, 0600); $index{'mailcount'} = 0; $index{'lastchange'} = time(); dbmclose(%index); } } # count_mail(user|file) # Returns the number of messages in some mail file sub count_mail { my (@index, %index, $itype); $itype = &index_type($_[0]); if ($itype == 0) { @index = &build_index($_[0]); return scalar(@index); } else { &build_dbm_index($_[0], \%index); return $index{'mailcount'}; } } # parse_mail(&mail, [&parent], [savebody]) # Extracts the attachments from the mail body sub parse_mail { return if ($_[0]->{'parsed'}++); local $ct = $_[0]->{'header'}->{'content-type'}; local (@attach, $h, $a); if ($ct =~ /multipart\/(\S+)/i && ($ct =~ /boundary="([^"]+)"/i || $ct =~ /boundary=([^;\s]+)/i)) { # Multipart MIME message local $bound = "--".$1; local @lines = split(/\r?\n/, $_[0]->{'body'}); local $l; local $max = @lines; while($l < $max && $lines[$l++] ne $bound) { # skip to first boundary } while(1) { # read attachment headers local (@headers, $attach); while($lines[$l]) { $attach->{'raw'} .= $lines[$l]."\n"; $attach->{'rawheaders'} .= $lines[$l]."\n"; if ($lines[$l] =~ /^(\S+):\s*(.*)/) { push(@headers, [ $1, $2 ]); } elsif ($lines[$l] =~ /^\s+(.*)/) { $headers[$#headers]->[1] .= $1 unless($#headers < 0); } $l++; } $attach->{'raw'} .= $lines[$l]."\n"; $l++; $attach->{'headers'} = \@headers; foreach $h (@headers) { $attach->{'header'}->{lc($h->[0])} = $h->[1]; } if ($attach->{'header'}->{'content-type'} =~ /^([^;]+)/) { $attach->{'type'} = lc($1); } else { $attach->{'type'} = 'text/plain'; } if ($attach->{'header'}->{'content-disposition'} =~ /filename\s*=\s*"([^"]+)"/i) { $attach->{'filename'} = $1; } elsif ($attach->{'header'}->{'content-disposition'} =~ /filename\s*=\s*([^;\s]+)/i) { $attach->{'filename'} = $1; } elsif ($attach->{'header'}->{'content-type'} =~ /name\s*=\s*"([^"]+)"/i) { $attach->{'filename'} = $1; } # read the attachment body while($l < $max && $lines[$l] ne $bound && $lines[$l] ne "$bound--") { $attach->{'data'} .= $lines[$l]."\n"; $attach->{'raw'} .= $lines[$l]."\n"; $l++; } $attach->{'data'} =~ s/\n\n$/\n/; # Lose trailing blank line $attach->{'raw'} =~ s/\n\n$/\n/; # decode if necessary if (lc($attach->{'header'}->{'content-transfer-encoding'}) eq 'base64') { # Standard base64 encoded attachment $attach->{'data'} = &b64decode($attach->{'data'}); } elsif (lc($attach->{'header'}->{'content-transfer-encoding'}) eq 'x-uue') { # UUencoded attachment $attach->{'data'} = &uudecode($attach->{'data'}); } elsif (lc($attach->{'header'}->{'content-transfer-encoding'}) eq 'quoted-printable') { # Quoted-printable text attachment $attach->{'data'} = "ed_decode($attach->{'data'}); } elsif (lc($attach->{'type'}) eq 'application/mac-binhex40' && &has_command("hexbin")) { # Macintosh binhex encoded attachment local $temp = &transname(); mkdir($temp, 0700); open(HEXBIN, "| (cd $temp ; hexbin -n attach -d 2>/dev/null)"); print HEXBIN $attach->{'data'}; close(HEXBIN); if (!$?) { open(HEXBIN, "$temp/attach.data"); local $/ = undef; $attach->{'data'} = ; close(HEXBIN); local $ct = &guess_mime_type($attach->{'filename'}); $attach->{'type'} = $ct; $attach->{'header'} = { 'content-type' => $ct }; $attach->{'headers'} = [ [ 'Content-Type', $ct ] ]; } unlink("$temp/attach.data"); rmdir($temp); } $attach->{'idx'} = scalar(@attach); $attach->{'parent'} = $_[1] ? $_[1] : $_[0]; push(@attach, $attach) if (@headers || $attach->{'data'}); if ($attach->{'type'} =~ /multipart\/(\S+)/i) { # This attachment contains more attachments .. # expand them. local $amail = { 'header' => $attach->{'header'}, 'body' => $attach->{'data'} }; &parse_mail($amail, $attach); $attach->{'attach'} = [ @{$amail->{'attach'}} ]; map { $_->{'idx'} += scalar(@attach) } @{$amail->{'attach'}}; push(@attach, @{$amail->{'attach'}}); } elsif (lc($attach->{'type'}) eq 'application/ms-tnef') { # This attachment is a winmail.dat file, which may # contain multiple other attachments! local ($opentnef, $tnef); if (!($opentnef = &has_command("opentnef")) && !($tnef = &has_command("tnef"))) { $attach->{'error'} = "tnef command not installed"; } else { # Can actually decode local $tempfile = &transname(); open(TEMPFILE, ">$tempfile"); print TEMPFILE $attach->{'data'}; close(TEMPFILE); local $tempdir = &transname(); mkdir($tempdir, 0700); if ($opentnef) { system("$opentnef -d $tempdir -i $tempfile >/dev/null 2>&1"); } else { system("$tnef -C $tempdir -f $tempfile >/dev/null 2>&1"); } pop(@attach); # lose winmail.dat opendir(DIR, $tempdir); while($f = readdir(DIR)) { next if ($f eq '.' || $f eq '..'); local $data; open(FILE, "$tempdir/$f"); while() { $data .= $_; } close(FILE); local $ct = &guess_mime_type($f); push(@attach, { 'type' => $ct, 'idx' => scalar(@attach), 'header' => { 'content-type' => $ct }, 'headers' => [ [ 'Content-Type', $ct ] ], 'filename' => $f, 'data' => $data }); } closedir(DIR); unlink(glob("$tempdir/*"), $tempfile); rmdir($tempdir); } } last if ($l >= $max || $lines[$l] eq "$bound--"); $l++; } $_[0]->{'attach'} = \@attach; } elsif ($_[0]->{'body'} =~ /begin\s+([0-7]+)\s+(.*)/i) { # Message contains uuencoded file(s) local @lines = split(/\n/, $_[0]->{'body'}); local ($attach, $rest); foreach $l (@lines) { if ($l =~ /^begin\s+([0-7]+)\s+(.*)/i) { $attach = { 'type' => &guess_mime_type($2), 'idx' => scalar(@{$_[0]->{'attach'}}), 'parent' => $_[1], 'filename' => $2 }; push(@{$_[0]->{'attach'}}, $attach); } elsif ($l =~ /^end/ && $attach) { $attach = undef; } elsif ($attach) { $attach->{'data'} .= unpack("u", $l); } else { $rest .= $l."\n"; } } if ($rest =~ /\S/) { # Some leftover text push(@{$_[0]->{'attach'}}, { 'type' => "text/plain", 'idx' => scalar(@{$_[0]->{'attach'}}), 'parent' => $_[1], 'data' => $rest }); } } elsif (lc($_[0]->{'header'}->{'content-transfer-encoding'}) eq 'base64') { # Signed body section $ct =~ s/;.*$//; $_[0]->{'attach'} = [ { 'type' => lc($ct), 'idx' => 0, 'parent' => $_[1], 'data' => &b64decode($_[0]->{'body'}) } ]; } elsif (lc($_[0]->{'header'}->{'content-type'}) eq 'x-sun-attachment') { # Sun attachment format, which can contain several sections local $sun; foreach $sun (split(/----------/, $_[0]->{'body'})) { local ($headers, $rest) = split(/\r?\n\r?\n/, $sun, 2); local $attach = { 'idx' => scalar(@{$_[0]->{'attach'}}), 'parent' => $_[1], 'data' => $rest }; if ($headers =~ /X-Sun-Data-Name:\s*(\S+)/) { $attach->{'filename'} = $1; } if ($headers =~ /X-Sun-Data-Type:\s*(\S+)/) { local $st = $1; $attach->{'type'} = $st eq "text" ? "text/plain" : $st eq "html" ? "text/html" : $st =~ /\// ? $st : "application/octet-stream"; } elsif ($attach->{'filename'}) { $attach->{'type'} = &guess_mime_type($attach->{'filename'}); } else { $attach->{'type'} = "text/plain"; # fallback } push(@{$_[0]->{'attach'}}, $attach); } } else { # One big attachment (probably text) local ($type, $body); ($type = $ct) =~ s/;.*$//; $type = 'text/plain' if (!$type); if (lc($_[0]->{'header'}->{'content-transfer-encoding'}) eq 'base64') { $body = &b64decode($_[0]->{'body'}); } elsif (lc($_[0]->{'header'}->{'content-transfer-encoding'}) eq 'quoted-printable') { $body = "ed_decode($_[0]->{'body'}); } else { $body = $_[0]->{'body'}; } $_[0]->{'attach'} = [ { 'type' => lc($type), 'idx' => 0, 'parent' => $_[1], 'data' => $body } ]; } delete($_[0]->{'body'}) if (!$_[2]); } # delete_mail(user|file, &mail, ...) # Delete mail messages from a user by copying the file and rebuilding the index sub delete_mail { local @m = sort { $a->{'line'} <=> $b->{'line'} } @_[1..@_-1]; local $i = 0; local $f = &user_mail_file($_[0]); local $ifile = &user_index_file($_[0]); local $itype = &index_type($_[0]); local $lnum = 0; local %dline; local ($dpos = 0, $dlnum = 0); local (@index, %index); if ($itype == 1) { &build_dbm_index($_[0], \%index); } local $tmpf = $< == 0 ? "$f.del" : $_[0] =~ /^\/.*\/([^\/]+)$/ ? "$user_module_config_directory/$1.del" : "$user_module_config_directory/$_[0].del"; open(SOURCE, $f) || &error("Read failed : $!"); open(DEST, ">$tmpf") || &error("Open of $tmpf failed : $!"); while() { if ($i >= @m || $lnum < $m[$i]->{'line'}) { if ($itype == 0 && /^From\s+(\S+).*\d+\r?\n/ && ($1 ne '-' || $dash)) { push(@index, [ $dpos, $dlnum ]); } $dpos += length($_); $dlnum++; local $w = (print DEST $_); if (!$w) { local $e = "$!"; close(DEST); close(SOURCE); unlink($tmpf); &error("Write to $tmpf failed : $e"); } } elsif ($lnum == $m[$i]->{'eline'}) { $dline{$m[$i]->{'line'}}++; $i++; } $lnum++; } close(SOURCE); close(DEST) || &error("Write to $tmpf failed : $?"); local @st = stat($f); unlink($f) if ($< == 0); if ($itype == 0) { open(INDEX, ">$ifile"); print INDEX map { $_->[0]." ".$_->[1]."\n" } @index; close(INDEX); } else { # Just force a total index re-build (XXX lazy!) $index{'mailcount'} = $in{'lastchange'} = 0; } if ($< == 0) { rename($tmpf, $f); } else { system("cat ".quotemeta($tmpf)." > ".quotemeta($f). " && rm -f ".quotemeta($tmpf)); } chown($st[4], $st[5], $f); chmod($st[2], $f); } # modify_mail(user|file, old, new, textonly) # Modify one email message in a mailbox by copying the file and rebuilding # the index. sub modify_mail { local $f = &user_mail_file($_[0]); local $ifile = &user_index_file($_[0]); local $itype = &index_type($_[0]); local $lnum = 0; local ($sizediff, $linesdiff); local (@index, %index); if ($itype == 0) { @index = &build_index($_[0]); } else { &build_dbm_index($_[0], \%index); } # Replace the email that gets modified local $tmpf = $< == 0 ? "$f.del" : $_[0] =~ /^\/.*\/([^\/]+)$/ ? "$user_module_config_directory/$1.del" : "$user_module_config_directory/$_[0].del"; open(SOURCE, $f); open(DEST, ">$tmpf"); while() { if ($lnum < $_[1]->{'line'} || $lnum > $_[1]->{'eline'}) { # before or after the message to change local $w = (print DEST $_); if (!$w) { local $e = "$?"; close(DEST); close(SOURCE); unlink($tmpf); &error("Write to $tmpf failed : $e"); } } elsif ($lnum == $_[1]->{'line'}) { # found start of message to change .. put in the new one close(DEST); local @ost = stat($tmpf); local $nlines = &send_mail($_[2], $tmpf, $_[3], 1); local @nst = stat($tmpf); local $newsize = $nst[7] - $ost[7]; $sizediff = $newsize - $_[1]->{'size'}; $linesdiff = $nlines - ($_[1]->{'eline'} - $_[1]->{'line'} + 1); open(DEST, ">>$tmpf"); } $lnum++; } close(SOURCE); close(DEST) || &error("Write failed : $!"); # Now update the index and delete the temp file if ($itype == 0) { # Update old-style index foreach $i (@index) { if ($i->[1] > $_[1]->{'line'}) { # Shift mails after the modified $i->[0] += $sizediff; $i->[1] += $linesdiff; } } } else { # Update DBM index for($i=0; $i<$index{'mailcount'}; $i++) { local @idx = split(/\0/, $index{$i}); if ($idx[1] > $_[1]->{'line'}) { $idx[0] += $sizediff; $idx[1] += $linesdiff; $index{$i} = join("\0", @idx); } } $index{'lastchange'} = time(); } local @st = stat($f); unlink($f); if ($itype == 0) { open(INDEX, ">$ifile"); print INDEX map { $_->[0]." ".$_->[1]."\n" } @index; close(INDEX); } if ($< == 0) { rename($tmpf, $f); } else { system("cat $tmpf >$f && rm -f $tmpf"); } chown($st[4], $st[5], $f); chmod($st[2], $f); } # send_mail(&mail, [file], [textonly], [nocr], [smtp-server], # [smtp-user], [smtp-pass], [smtp-auth-mode], # [¬ify-flags]) # Send out some email message or append it to a file. # Returns the number of lines written. sub send_mail { return 0 if (&is_readonly_mode()); local (%header, $h); local $lnum = 0; local $sm = $_[4] || $config{'send_mode'}; local $eol = $_[3] || !$sm ? "\n" : "\r\n"; foreach $h (@{$_[0]->{'headers'}}) { $header{lc($h->[0])} = $h->[1]; } local @tm = localtime(time()); push(@{$_[0]->{'headers'}}, [ 'Date', strftime("%a, %d %b %Y %H:%M:%S %z (%Z)", @tm) ]) if (!$header{'date'}); local @from = &address_parts($header{'from'}); local $esmtp = $_[8] ? 1 : 0; if ($_[1]) { # Just append the email to a file using mbox format open(MAIL, ">>$_[1]") || &error("Write failed : $!"); $lnum++; print MAIL $_[0]->{'fromline'} ? $_[0]->{'fromline'}."\n" : strftime("From $from[0] %a %b %e %H:%M:%S %Y\n", @tm); } elsif ($sm) { # Connect to SMTP server &open_socket($sm, 25, MAIL); &smtp_command(MAIL); if ($esmtp) { &smtp_command(MAIL, "ehlo ".&get_system_hostname()."\r\n"); } else { &smtp_command(MAIL, "helo ".&get_system_hostname()."\r\n"); } # Get username and password from parameters, or from module config local $user = $_[5] || $userconfig{'smtp_user'} || $config{'smtp_user'}; local $pass = $_[6] || $userconfig{'smtp_pass'} || $config{'smtp_pass'}; local $auth = $_[7] || $userconfig{'smtp_auth'} || $config{'smtp_auth'} || "Cram-MD5"; if ($user) { # Send authentication commands eval "use Authen::SASL"; if ($@) { &error("Perl module Authen::SASL is needed for SMTP authentication"); } my $sasl = Authen::SASL->new('mechanism' => uc($auth), 'callback' => { 'auth' => $user, 'user' => $user, 'pass' => $pass } ); &error("Failed to create Authen::SASL object") if (!$sasl); local $conn = $sasl->client_new("smtp", &get_system_hostname()); local $arv = &smtp_command(MAIL, "auth $auth\r\n", 1); if ($arv =~ /^(334)\s+(.*)/) { # Server says to go ahead $extra = $2; local $initial = $conn->client_start(); local $auth_ok; if ($initial) { local $enc = &encode_base64($initial); $enc =~ s/\r|\n//g; $arv = &smtp_command(MAIL, "$enc\r\n", 1); if ($arv =~ /^(\d+)\s+(.*)/) { if ($1 == 235) { $auth_ok = 1; } else { &error("Unknown SMTP authentication response : $arv"); } } $extra = $2; } while(!$auth_ok) { local $message = &decode_base64($extra); local $return = $conn->client_step($message); local $enc = &encode_base64($return); $enc =~ s/\r|\n//g; $arv = &smtp_command(MAIL, "$enc\r\n", 1); if ($arv =~ /^(\d+)\s+(.*)/) { if ($1 == 235) { $auth_ok = 1; } elsif ($1 == 535) { &error("SMTP authentication failed : $arv"); } $extra = $2; } else { &error("Unknown SMTP authentication response : $arv"); } } } } &smtp_command(MAIL, "mail from: <$from[0]>\r\n"); local $notify = $_[8] ? " NOTIFY=".join(",", @{$_[8]}) : ""; local $u; foreach $u (&address_parts($header{'to'}.",".$header{'cc'}. ",".$header{'bcc'})) { &smtp_command(MAIL, "rcpt to: <$u>$notify\r\n"); } &smtp_command(MAIL, "data\r\n"); } elsif (defined(&send_mail_program)) { # Use specified mail injector local $cmd = &send_mail_program($from[0]); $cmd || &error("No mail program was found on your system!"); open(MAIL, "| $cmd >/dev/null 2>&1"); } elsif ($config{'qmail_dir'}) { # Start qmail-inject open(MAIL, "| $config{'qmail_dir'}/bin/qmail-inject"); } elsif ($config{'postfix_control_command'}) { # Start postfix's sendmail wrapper local $cmd = -x "/usr/lib/sendmail" ? "/usr/lib/sendmail" : &has_command("sendmail"); $cmd || &error($text{'send_ewrapper'}); open(MAIL, "| $cmd -t -f$from[0] >/dev/null 2>&1"); } else { # Start sendmail &has_command($config{'sendmail_path'}) || &error(&text('send_epath', "$config{'sendmail_path'}")); open(MAIL, "| $config{'sendmail_path'} -t -f$from[0] >/dev/null 2>&1"); } local $ctype = "multipart/mixed"; local $msg_id; foreach $h (@{$_[0]->{'headers'}}) { if (defined($_[0]->{'body'}) || $_[2]) { print MAIL $h->[0],": ",$h->[1],$eol; $lnum++; } else { if ($h->[0] !~ /^(MIME-Version|Content-Type)$/i) { print MAIL $h->[0],": ",$h->[1],$eol; $lnum++; } elsif (lc($h->[0]) eq 'content-type') { $ctype = $h->[1]; } } if (lc($h->[0]) eq 'message-id') { $msg_id++; } } if (!$msg_id) { # Add a message-id header if missing print MAIL "Message-Id: <",time().".".$$."\@". &get_system_hostname(),">",$eol; } # Work out first attachment content type local $ftype; if (@{$_[0]->{'attach'}} >= 1) { local $first = $_[0]->{'attach'}->[0]; $ftype = "text/plain"; foreach my $h (@{$first->{'headers'}}) { if (lc($h->[0]) eq "content-type") { $ftype = $h->[1]; } } } if (defined($_[0]->{'body'})) { # Use original mail body print MAIL $eol; $lnum++; $_[0]->{'body'} =~ s/\r//g; $_[0]->{'body'} =~ s/\n\.\n/\n\. \n/g; $_[0]->{'body'} =~ s/\n/$eol/g; $_[0]->{'body'} .= $eol if ($_[0]->{'body'} !~ /\n$/); (print MAIL $_[0]->{'body'}) || &error("Write failed : $!"); $lnum += ($_[0]->{'body'} =~ tr/\n/\n/); } elsif (!$_[2] || $ftype !~ /text\/plain/i) { # Sending MIME-encoded email if ($ctype !~ /multipart\/report/i) { $ctype =~ s/;.*$//; } print MAIL "MIME-Version: 1.0",$eol; local $bound = "bound".time(); print MAIL "Content-Type: $ctype; boundary=\"$bound\"",$eol; print MAIL $eol; $lnum += 3; # Send attachments print MAIL "This is a multi-part message in MIME format.",$eol; $lnum++; foreach $a (@{$_[0]->{'attach'}}) { print MAIL $eol; print MAIL "--",$bound,$eol; $lnum += 2; local $enc; foreach $h (@{$a->{'headers'}}) { print MAIL $h->[0],": ",$h->[1],$eol; $enc = $h->[1] if (lc($h->[0]) eq 'content-transfer-encoding'); $lnum++; } print MAIL $eol; $lnum++; if (lc($enc) eq 'base64') { local $enc = &encode_base64($a->{'data'}); $enc =~ s/\r//g; $enc =~ s/\n/$eol/g; print MAIL $enc; $lnum += ($enc =~ tr/\n/\n/); } else { $a->{'data'} =~ s/\r//g; $a->{'data'} =~ s/\n\.\n/\n\. \n/g; $a->{'data'} =~ s/\n/$eol/g; print MAIL $a->{'data'}; $lnum += ($a->{'data'} =~ tr/\n/\n/); if ($a->{'data'} !~ /\n$/) { print MAIL $eol; $lnum++; } } } print MAIL $eol; (print MAIL "--",$bound,"--",$eol) || &error("Write failed : $!"); print MAIL $eol; $lnum += 3; } else { # Sending text-only mail from first attachment local $a = $_[0]->{'attach'}->[0]; print MAIL $eol; $lnum++; $a->{'data'} =~ s/\r//g; $a->{'data'} =~ s/\n/$eol/g; (print MAIL $a->{'data'}) || &error("Write failed : $!"); $lnum += ($a->{'data'} =~ tr/\n/\n/); if ($a->{'data'} !~ /\n$/) { print MAIL $eol; $lnum++; } } if ($sm && !$_[1]) { &smtp_command(MAIL, ".$eol"); &smtp_command(MAIL, "quit$eol"); } if (!close(MAIL)) { # Only bother to report an error on close if writing to a file if ($_[1]) { &error("Write failed : $!"); } } return $lnum; } # mail_size(&mail, [textonly]) # Returns the size of an email message in bytes sub mail_size { local ($mail, $textonly) = @_; local $temp = &transname(); &send_mail($mail, $temp, $textonly); local @st = stat($temp); unlink($temp); return $st[7]; } # b64decode(string) # Converts a string from base64 format to normal sub b64decode { local($str) = $_[0]; local($res); $str =~ tr|A-Za-z0-9+=/||cd; $str =~ s/=+$//; $str =~ tr|A-Za-z0-9+/| -_|; while ($str =~ /(.{1,60})/gs) { my $len = chr(32 + length($1)*3/4); $res .= unpack("u", $len . $1 ); } return $res; } # can_read_mail(user) sub can_read_mail { return 1 if ($_[0] && $access{'sent'} eq $_[0]); local @u = getpwnam($_[0]); return 0 if (!@u); return 0 if ($_[0] =~ /\.\./); return 0 if ($access{'mmode'} == 0); return 1 if ($access{'mmode'} == 1); local $u; if ($access{'mmode'} == 2) { foreach $u (split(/\s+/, $access{'musers'})) { return 1 if ($u eq $_[0]); } return 0; } elsif ($access{'mmode'} == 4) { return 1 if ($_[0] eq $remote_user); } elsif ($access{'mmode'} == 5) { return $u[3] eq $access{'musers'}; } elsif ($access{'mmode'} == 3) { foreach $u (split(/\s+/, $access{'musers'})) { return 0 if ($u eq $_[0]); } return 1; } elsif ($access{'mmode'} == 6) { return ($_[0] =~ /^$access{'musers'}$/); } elsif ($access{'mmode'} == 7) { return (!$access{'musers'} || $u[2] >= $access{'musers'}) && (!$access{'musers2'} || $u[2] <= $access{'musers2'}); } return 0; # can't happen! } # from_hostname() sub from_hostname { local ($d, $masq); local $conf = &get_sendmailcf(); foreach $d (&find_type("D", $conf)) { if ($d->{'value'} =~ /^M\s*(\S*)/) { $masq = $1; } } return $masq ? $masq : &get_system_hostname(); } # mail_from_queue(qfile, [dfile|"auto"]) # Reads a message from the Sendmail mail queue sub mail_from_queue { local $mail = { 'file' => $_[0] }; $mail->{'quar'} = $_[0] =~ /\/hf/; $mail->{'lost'} = $_[0] =~ /\/Qf/; if ($_[1] eq "auto") { $mail->{'dfile'} = $_[0]; $mail->{'dfile'} =~ s/\/(qf|hf|Qf)/\/df/; } elsif ($_[1]) { $mail->{'dfile'} = $_[1]; } $mail->{'lfile'} = $_[0]; $mail->{'lfile'} =~ s/\/(qf|hf|Qf)/\/xf/; local $_; local @headers; open(QF, $_[0]) || return undef; while() { s/\r|\n//g; if (/^M(.*)/) { $mail->{'status'} = $1; } elsif (/^H\?[^\?]*\?(\S+):\s+(.*)/ || /^H(\S+):\s+(.*)/) { push(@headers, [ $1, $2 ]); $mail->{'rawheaders'} .= "$1: $2\n"; } elsif (/^\s+(.*)/) { $headers[$#headers]->[1] .= $1 unless($#headers < 0); $mail->{'rawheaders'} .= $_."\n"; } } close(QF); $mail->{'headers'} = \@headers; foreach $h (@headers) { $mail->{'header'}->{lc($h->[0])} = $h->[1]; } if ($mail->{'dfile'}) { # Read the mail body open(DF, $mail->{'dfile'}); while() { $mail->{'body'} .= $_; } close(DF); } local $datafile = $mail->{'dfile'}; if (!$datafile) { ($datafile = $mail->{'file'}) =~ s/\/(qf|hf|Qf)/\/df/; } local @st0 = stat($mail->{'file'}); local @st1 = stat($datafile); $mail->{'size'} = $st0[7] + $st1[7]; return $mail; } # wrap_lines(text, width) # Given a multi-line string, return an array of lines wrapped to # the given width sub wrap_lines { local @rv; local $w = $_[1]; foreach $rest (split(/\n/, $_[0])) { if ($rest =~ /\S/) { while($rest =~ /^(.{1,$w}\S*)\s*([\0-\377]*)$/) { push(@rv, $1); $rest = $2; } } else { # Empty line .. keep as it is push(@rv, $rest); } } return @rv; } # smtp_command(handle, command, no-error) sub smtp_command { local ($m, $c) = @_; print $m $c; local $r = <$m>; if ($r !~ /^[23]\d+/ && !$_[2]) { &error(&text('send_esmtp', "".&html_escape($c)."", "".&html_escape($r)."")); } $r =~ s/\r|\n//g; if ($r =~ /^(\d+)\-/) { # multi-line ESMTP response! while(1) { local $nr = <$m>; $nr =~ s/\r|\n//g; if ($nr =~ /^(\d+)\-(.*)/) { $r .= "\n".$2; } elsif ($nr =~ /^(\d+)\s+(.*)/) { $r .= "\n".$2; last; } } } return $r; } # address_parts(string) # Returns the email addresses in a string sub address_parts { local @rv; local $rest = $_[0]; while($rest =~ /([^<>\s,'"\@]+\@[A-z0-9\-\.\!]+)(.*)/) { push(@rv, $1); $rest = $2; } return wantarray ? @rv : $rv[0]; } # link_urls(text, separate) sub link_urls { local $r = $_[0]; local $tar = $_[1] ? "target=link".int(rand()*100000) : ""; $r =~ s/((http|ftp|https|mailto):[^><"'\s]+[^><"'\s\.\)])/$1<\/a>/g; return $r; } # link_urls_and_escape(text, separate) # HTML escapes some text, as well as properly linking URLs in it sub link_urls_and_escape { local $l = $_[0]; local $rv; local $tar = $_[1] ? " target=link".int(rand()*100000) : ""; while($l =~ /^(.*?)((http|ftp|https|mailto):[^><"'\s]+[^><"'\s\.\)])(.*)/) { local ($before, $url, $after) = ($1, $2, $4); $rv .= &eucconv_and_escape($before)."". &html_escape($url).""; $l = $after; } $rv .= &eucconv_and_escape($l); return $rv; } # uudecode(text) sub uudecode { local @lines = split(/\n/, $_[0]); local ($l, $data); for($l=0; $lines[$l] !~ /begin\s+([0-7]+)\s/i; $l++) { } while($lines[++$l]) { $data .= unpack("u", $lines[$l]); } return $data; } sub simplify_date { local $u = &parse_mail_date($_[0]); if ($u) { local $fmt = $userconfig{'date_fmt'} || $config{'date_fmt'} || "dmy"; local $strf = $fmt eq "dmy" ? "%d/%m/%Y" : $fmt eq "mdy" ? "%m/%d/%Y" : "%Y/%m/%d"; local $ENV{'TZ'} = $userconfig{'date_tz'} || $config{'date_tz'} || $ENV{'TZ'}; delete($ENV{'TZ'}) if (!$ENV{'TZ'}); return strftime("$strf %H:%M", localtime($u)); } elsif ($_[0] =~ /^(\S+),\s+0*(\d+)\s+(\S+)\s+(\d+)\s+(\d+):(\d+)/) { return "$2/$3/$4 $5:$6"; } elsif ($_[0] =~ /^0*(\d+)\s+(\S+)\s+(\d+)\s+(\d+):(\d+)/) { return "$1/$2/$3 $4:$5"; } return $_[0]; } # simplify_from(from) # Simplifies a From: address for display in the mail list. Only the first # address is returned. sub simplify_from { local $rv = &eucconv(&decode_mimewords($_[0])); local @sp = &split_addresses($rv); if (!@sp) { return $text{'mail_nonefrom'}; } else { local $first = &html_escape($sp[0]->[1] ? $sp[0]->[1] : $sp[0]->[2]); if (length($first) > 80) { return substr($first, 0, 80)." .."; } else { return $first.(@sp > 1 ? " , ..." : ""); } } } # simplify_subject(subject) sub simplify_subject { local $rv = &eucconv(&decode_mimewords($_[0])); $rv = substr($rv, 0, 80)." .." if (length($rv) > 80); return $rv =~ /\S/ ? &html_escape($rv) : "
"; } # quoted_decode(text) sub quoted_decode { local $t = $_[0]; $t =~ s/=\n//g; $t =~ s/=([a-zA-Z0-9]{2})/pack("c",hex($1))/ge; return $t; } # quoted_encode(text) sub quoted_encode { local $t = $_[0]; $t =~ s/([=\177-\377])/sprintf("=%2.2X",ord($1))/ge; return $t; } sub decode_mimewords { my $encstr = shift; my %params = @_; my @tokens; $@ = ''; ### error-return ### Collapse boundaries between adjacent encoded words: $encstr =~ s{(\?\=)\r?\n[ \t](\=\?)}{$1$2}gs; pos($encstr) = 0; ### print STDOUT "ENC = [", $encstr, "]\n"; ### Decode: my ($charset, $encoding, $enc, $dec); while (1) { last if (pos($encstr) >= length($encstr)); my $pos = pos($encstr); ### save it ### Case 1: are we looking at "=?..?..?="? if ($encstr =~ m{\G # from where we left off.. =\?([^?]*) # "=?" + charset + \?([bq]) # "?" + encoding + \?([^?]+) # "?" + data maybe with spcs + \?= # "?=" }xgi) { ($charset, $encoding, $enc) = ($1, lc($2), $3); $dec = (($encoding eq 'q') ? _decode_Q($enc) : _decode_B($enc)); push @tokens, [$dec, $charset]; next; } ### Case 2: are we looking at a bad "=?..." prefix? ### We need this to detect problems for case 3, which stops at "=?": pos($encstr) = $pos; # reset the pointer. if ($encstr =~ m{\G=\?}xg) { $@ .= qq|unterminated "=?..?..?=" in "$encstr" (pos $pos)\n|; push @tokens, ['=?']; next; } ### Case 3: are we looking at ordinary text? pos($encstr) = $pos; # reset the pointer. if ($encstr =~ m{\G # from where we left off... ([\x00-\xFF]*? # shortest possible string, \n*) # followed by 0 or more NLs, (?=(\Z|=\?)) # terminated by "=?" or EOS }xg) { length($1) or die "MIME::Words: internal logic err: empty token\n"; push @tokens, [$1]; next; } ### Case 4: bug! die "MIME::Words: unexpected case:\n($encstr) pos $pos\n\t". "Please alert developer.\n"; } return join('',map {$_->[0]} @tokens); } # _decode_Q STRING # Private: used by _decode_header() to decode "Q" encoding, which is # almost, but not exactly, quoted-printable. :-P sub _decode_Q { my $str = shift; $str =~ s/_/\x20/g; # RFC-1522, Q rule 2 $str =~ s/=([\da-fA-F]{2})/pack("C", hex($1))/ge; # RFC-1522, Q rule 1 $str; } # _decode_B STRING # Private: used by _decode_header() to decode "B" encoding. sub _decode_B { my $str = shift; &decode_base64($str); } # user_mail_file(user|file, [other details]) sub user_mail_file { if ($_[0] =~ /^\//) { return $_[0]; } elsif ($config{'mail_dir'}) { return &mail_file_style($_[0], $config{'mail_dir'}, $config{'mail_style'}); } elsif (@_ > 1) { return "$_[7]/$config{'mail_file'}"; } else { local @u = getpwnam($_[0]); return "$u[7]/$config{'mail_file'}"; } } # mail_file_style(user, basedir, style) sub mail_file_style { if ($_[2] == 0) { return "$_[1]/$_[0]"; } elsif ($_[2] == 1) { return $_[1]."/".substr($_[0], 0, 1)."/".$_[0]; } elsif ($_[2] == 2) { return $_[1]."/".substr($_[0], 0, 1)."/". substr($_[0], 0, 2)."/".$_[0]; } else { return $_[1]."/".substr($_[0], 0, 1)."/". substr($_[0], 1, 1)."/".$_[0]; } } # user_index_file(user|file) sub user_index_file { local $us = $_[0]; $us =~ s/\//_/g; local $f; local $hn = &get_system_hostname(); if ($_[0] =~ /^\/.*\/([^\/]+)$/) { # A file .. the index file is in ~/.usermin/mailbox or # /etc/webmin/mailboxes if ($user_module_config_directory && $config{'shortindex'}) { # Use short name for index file $f = "$user_module_config_directory/$1.findex"; } else { $f = $user_module_config_directory ? "$user_module_config_directory/$us.findex" : "$module_config_directory/$us.findex"; } } else { # A username .. the index file is in /etc/webmin/mailboxes $f = $user_module_config_directory ? "$user_module_config_directory/$_[0].index" : "$module_config_directory/$_[0].index"; } return -r $f && !-r "$f.$hn" ? $f : "$f.$hn"; } # extract_mail(data) # Converts the text of a message into mail object. sub extract_mail { local $text = $_[0]; $text =~ s/^\s+//; local ($amail, @aheaders, $i); local @alines = split(/\n/, $text); while($i < @alines && $alines[$i]) { if ($alines[$i] =~ /^(\S+):\s*(.*)/) { push(@aheaders, [ $1, $2 ]); $amail->{'rawheaders'} .= $alines[$i]."\n"; } elsif ($alines[$i] =~ /^\s+(.*)/) { $aheaders[$#aheaders]->[1] .= $1 unless($#aheaders < 0); $amail->{'rawheaders'} .= $alines[$i]."\n"; } $i++; } $amail->{'headers'} = \@aheaders; foreach $h (@aheaders) { $amail->{'header'}->{lc($h->[0])} = $h->[1]; } splice(@alines, 0, $i); $amail->{'body'} = join("\n", @alines)."\n"; return $amail; } # split_addresses(string) # Splits a comma-separated list of addresses into [ email, real-name, original ] # triplets sub split_addresses { local (@rv, $str = $_[0]); while(1) { if ($str =~ /^[\s,]*(([^<>\(\)\s]+)\s+\(([^\(\)]+)\))(.*)$/) { # An address like foo@bar.com (Fooey Bar) push(@rv, [ $2, $3, $1 ]); $str = $4; } elsif ($str =~ /^[\s,]*("([^"]+)"\s*<([^\s<>,]+)>)(.*)$/ || $str =~ /^[\s,]*(([^<>]+)\s+<([^\s<>,]+)>)(.*)$/ || $str =~ /^[\s,]*(([^<>]+)<([^\s<>,]+)>)(.*)$/ || $str =~ /^[\s,]*(([^<>\[\]]+)\s+\[mailto:([^\s\[\]]+)\])(.*)$/|| $str =~ /^[\s,]*(()<([^<>,]+)>)(.*)/ || $str =~ /^[\s,]*(()([^\s<>,]+))(.*)/) { # Addresses like "Fooey Bar" # Fooey Bar # Fooey Bar [mailto:foo@bar.com] # # # foo@bar.com push(@rv, [ $3, $2, $1 ]); $str = $4; } else { last; } } return @rv; } $match_ascii = '\x1b\([BHJ]([\t\x20-\x7e]*)'; $match_jis = '\x1b\$[@B](([\x21-\x7e]{2})*)'; sub eucconv { local($_) = @_; if ($current_lang eq 'ja_JP.euc') { s/$match_jis/&j2e($1)/geo; s/$match_ascii/$1/go; } $_; } sub j2e { local($_) = @_; tr/\x21-\x7e/\xa1-\xfe/; $_; } # eucconv_and_escape(string) sub eucconv_and_escape { return &html_escape(&eucconv($_[0])); } # list_maildir(file, [start], [end]) # Returns a subset of mail from a maildir format directory sub list_maildir { local (@rv, $i, $f); local @files = &get_maildir_files($_[0]); local ($start, $end); if (!defined($_[1])) { $start = 0; $end = @files - 1; } elsif ($_[2] < 0) { $start = @files + $_[2] - 1; $end = @files + $_[1] - 1; $start = 0 if ($start < 0); } else { $start = $_[1]; $end = $_[2]; $end = @files-1 if ($end >= @files); } foreach $f (@files) { if ($i < $start || $i > $end) { # Skip files outside requested index range push(@rv, undef); $i++; next; } local $mail = &read_mail_file($f); $mail->{'idx'} = $i++; push(@rv, $mail); } return @rv; } # select_maildir(file, &indexes, headersonly) # Returns a list of messages with the given indexes, from a maildir directory sub select_maildir { local @files = &get_maildir_files($_[0]); local @rv; foreach my $i (@{$_[1]}) { local $mail = &read_mail_file($files[$i], $_[2]); $mail->{'idx'} = $i; push(@rv, $mail); } return @rv; } # Get ordered list of message files (with in-memory and on-disk caching, as # this can be slow) # get_maildir_files(directory) sub get_maildir_files { # Work out last modified time local $newest; foreach my $d ("$_[0]/cur", "$_[0]/new") { local @dst = stat($d); $newest = $dst[9] if ($dst[9] > $newest); } local @files; if (defined($main::list_maildir_cache{$_[0]}) && $main::list_maildir_cache_time{$_[0]} == $newest) { # Use the in-memory cache cache @files = @{$main::list_maildir_cache{$_[0]}}; } else { # Check the on-disk cache file local @cst = stat("$_[0]/maildircache"); if ($cst[9] >= $newest) { # Can read the cache open(CACHE, "$_[0]/maildircache"); while() { chop; push(@files, $_[0]."/".$_); } close(CACHE); } else { # Really read local @shorts; foreach my $d ("cur", "new") { opendir(DIR, "$_[0]/$d"); while(my $f = readdir(DIR)) { push(@shorts, "$d/$f") if ($f ne "." && $f ne ".."); } closedir(DIR); } @shorts = sort @shorts; @files = map { "$_[0]/$_" } @shorts; # Write out the on-disk cache &open_tempfile(CACHE, ">$_[0]/maildircache", 1); my $err; foreach my $f (@shorts) { my $ok = (print CACHE $f,"\n"); $err++ if (!$ok); } &close_tempfile(CACHE) if (!$err); } $main::list_maildir_cache{$_[0]} = \@files; $main::list_maildir_cache_time{$_[0]} = $st[7]; } return @files; } # search_maildir(file, field, what) # Search for messages in a maildir directory, and return the results sub search_maildir { return &advanced_search_maildir($_[0], [ [ $_[1], $_[2] ] ], 1); } # advanced_search_maildir(user|file, &fields, andmode, [&limit]) # Search for messages in a maildir directory, and return the results sub advanced_search_maildir { local @rv; local ($min, $max); if ($_[3] && $_[3]->{'latest'}) { $min = -1; $max = -$_[3]->{'latest'}; } foreach $mail (&list_maildir($_[0], $min, $max)) { push(@rv, $mail) if ($mail && &mail_matches($_[1], $_[2], $mail)); } return @rv; } # delete_maildir(&mail, ...) # Delete messages from a maildir directory sub delete_maildir { local $m; local %dirs; foreach $m (@_) { unlink($m->{'file'}); if ($m->{'file'} =~ /^(.*)\/(cur|new)\/([^\/]+)$/) { $dirs{$1}->{"$2/$3"} = 1; } } # Also update the cache, if any foreach my $dir (keys %dirs) { local $cachefile = "$dir/maildircache"; next if (!-r $cachefile); local $lref = &read_file_lines($cachefile); for(my $i=0; $i<@$lref; $i++) { if ($dirs{$dir}->{$lref->[$i]}) { # Found an entry to remove splice(@$lref, $i--, 1); } } &flush_file_lines($cachefile); } } # modify_maildir(&oldmail, &newmail, textonly) # Replaces a message in a maildir directory sub modify_maildir { unlink($_[0]->{'file'}); &send_mail($_[1], $_[0]->{'file'}, $_[2], 1); } # write_maildir(&mail, directory, textonly) # Adds some message in maildir format to a directory sub write_maildir { local $now = time(); local $hn = &get_system_hostname(); local $mf; mkdir($_[1], 0755); mkdir("$_[1]/cur", 0755); do { $mf = "$_[1]/cur/$now.$$.$hn"; $now++; } while(-r $mf); &send_mail($_[0], $mf, $_[2], 1); } # empty_maildir(file) # Delete all messages in an maildir directory sub empty_maildir { local $d; foreach $d ("$_[0]/cur", "$_[0]/new") { local $f; opendir(DIR, $d); while($f = readdir(DIR)) { unlink("$d/$f") if ($f ne '.' && $f ne '..'); } closedir(DIR); } } # count_maildir(dir) # Returns the number of messages in a maildir directory sub count_maildir { local $d; local $count = 0; foreach $d ("$_[0]/cur", "$_[0]/new") { opendir(DIR, $d); local @files = grep { $_ !~ /^\./ } readdir(DIR); $count += scalar(@files); closedir(DIR); } return $count; } # list_mhdir(file, [start], [end]) # Returns a subset of mail from an MH format directory sub list_mhdir { local ($start, $end, $f, $i, @rv); opendir(DIR, $_[0]); local @files = map { "$_[0]/$_" } sort { $a <=> $b } grep { /^\d+$/ } readdir(DIR); closedir(DIR); if (!defined($_[1])) { $start = 0; $end = @files - 1; } elsif ($_[2] < 0) { $start = @files + $_[2] - 1; $end = @files + $_[1] - 1; $start = 0 if ($start < 0); } else { $start = $_[1]; $end = $_[2]; $end = @files-1 if ($end >= @files); } foreach $f (@files) { if ($i < $start || $i > $end) { # Skip files outside requested index range push(@rv, undef); $i++; next; } local $mail = &read_mail_file($f); $mail->{'idx'} = $i++; push(@rv, $mail); } return @rv; } # select_mhdir(file, &indexes, headersonly) # Returns a list of messages with the given indexes, from an mhdir directory sub select_mhdir { local @rv; opendir(DIR, $_[0]); local @files = map { "$_[0]/$_" } sort { $a <=> $b } grep { /^\d+$/ } readdir(DIR); closedir(DIR); foreach my $i (@{$_[1]}) { local $mail = &read_mail_file($files[$i], $_[2]); $mail->{'idx'} = $i; push(@rv, $mail); } return @rv; } # search_mhdir(file|user, field, what) # Search for messages in an MH directory, and return the results sub search_mhdir { return &advanced_search_mhdir($_[0], [ [ $_[1], $_[2] ] ], 1); } # advanced_search_mhdir(file|user, &fields, andmode, &limit) # Search for messages in an MH directory, and return the results sub advanced_search_mhdir { local @rv; local ($min, $max); if ($_[3] && $_[3]->{'latest'}) { $min = -1; $max = -$_[3]->{'latest'}; } foreach $mail (&list_mhdir($_[0], $min, $max)) { push(@rv, $mail) if ($mail && &mail_matches($_[1], $_[2], $mail)); } return @rv; } # delete_mhdir(&mail, ...) # Delete messages from an MH directory sub delete_mhdir { local $m; foreach $m (@_) { unlink($m->{'file'}); } } # modify_mhdir(&oldmail, &newmail, textonly) # Replaces a message in a maildir directory sub modify_mhdir { unlink($_[0]->{'file'}); &send_mail($_[1], $_[0]->{'file'}, $_[2], 1); } # max_mhdir(dir) # Returns the maximum message ID in the directory sub max_mhdir { local $max = 1; opendir(DIR, $_[0]); foreach $f (readdir(DIR)) { $max = $f if ($f =~ /^\d+$/ && $f > $max); } closedir(DIR); return $max; } # empty_mhdir(file) # Delete all messages in an MH format directory sub empty_mhdir { local $f; opendir(DIR, $_[0]); foreach $f (readdir(DIR)) { unlink("$_[0]/$f") if ($f =~ /^\d+$/); } closedir(DIR); } # count_mhdir(file) # Returns the number of messages in an MH directory sub count_mhdir { opendir(DIR, $_[0]); local @files = grep { /^\d+$/ } readdir(DIR); closedir(DIR); return scalar(@files); } # read_mail_file(file, [headersonly]) # Read a single message from a file sub read_mail_file { local (@headers, $mail); # Open and read the mail file open(MAIL, $_[0]) || return undef; $mail = &read_mail_fh(MAIL, 0, $_[1]); $mail->{'file'} = $_[0]; close(MAIL); local @st = stat($_[0]); $mail->{'size'} = $st[7]; return $mail; } # read_mail_fh(handle, [end-mode], [headersonly]) # Reads an email message from the given file handle, either up to end of # the file, or a From line. End mode 0 = EOF, 1 = From without -, # 2 = From possibly with - sub read_mail_fh { local ($fh, $endmode, $headeronly) = @_; local (@headers, $mail); # Read the headers local $lnum = 0; while(1) { $lnum++; local $line = <$fh>; $mail->{'size'} += length($line); $line =~ s/\r|\n//g; last if ($line eq ''); if ($line =~ /^(\S+):\s*(.*)/) { push(@headers, [ $1, $2 ]); $mail->{'rawheaders'} .= $line."\n"; } elsif ($line =~ /^\s+(.*)/) { $headers[$#headers]->[1] .= $1 unless($#headers < 0); $mail->{'rawheaders'} .= $line."\n"; } elsif ($line =~ /^From\s+(\S+).*\d+/ && ($1 ne '-' || $endmode == 2)) { $mail->{'fromline'} = $line; } } $mail->{'headers'} = \@headers; foreach $h (@headers) { $mail->{'header'}->{lc($h->[0])} = $h->[1]; } if (!$headersonly) { # Read the mail body if ($endmode == 0) { # Till EOF while(read($fh, $buf, 1024) > 0) { $mail->{'size'} += length($buf); $mail->{'body'} .= $buf; } close(MAIL); } else { # Tell next From line while(1) { $line = <$fh>; last if (!$line || $line =~ /^From\s+(\S+).*\d+\r?\n/ && ($1 ne '-' || $endmode == 2)); $lnum++; $mail->{'size'} += length($line); $mail->{'body'} .= $line; } $mail->{'lines'} = $lnum; } } elsif ($endmode) { # Not reading the body, but we still need to search till the next # From: line in order to get the size while(1) { $line = <$fh>; last if (!$line || $line =~ /^From\s+(\S+).*\d+\r?\n/ && ($1 ne '-' || $endmode == 2)); $mail->{'size'} += length($line); } } return $mail; } # dash_mode(user|file) # Returns 1 if the messages in this folder are separated by lines like # From - instead of the usual From foo@bar.com sub dash_mode { open(DASH, &user_mail_file($_[0])) || return 0; # assume no local $line = ; close(DASH); return $line =~ /^From\s+(\S+).*\d/ && $1 eq '-'; } # mail_matches(&fields, andmode, &mail) # Returns 1 if some message matches a search sub mail_matches { local $count = 0; local $f; foreach $f (@{$_[0]}) { local $field = $f->[0]; local $what = $f->[1]; local $neg = ($field =~ s/^\!//); if ($field eq 'body') { $count++ if (!$neg && $_[2]->{'body'} =~ /\Q$what\E/i || $neg && $_[2]->{'body'} !~ /\Q$what\E/i); } elsif ($field eq 'size') { $count++ if (!$neg && $_[2]->{'size'} > $what || $neg && $_[2]->{'size'} < $what); } elsif ($field eq 'headers') { local $headers = $_[2]->{'rawheaders'} || join("", map { $_->[0].": ".$_->[1]."\n" } @{$_[2]->{'headers'}}); $count++ if (!$neg && $headers =~ /\Q$what\E/i || $neg && $headers !~ /\Q$what\E/i); } elsif ($field eq "status") { $count++ if (!$neg && $_[2]->{$field} =~ /\Q$what\E/i|| $neg && $_[2]->{$field} !~ /\Q$what\E/i); } else { $count++ if (!$neg && $_[2]->{'header'}->{$field} =~ /\Q$what\E/i|| $neg && $_[2]->{'header'}->{$field} !~ /\Q$what\E/i); } return 1 if ($count && !$_[1]); } return $count == @{$_[0]}; } # search_fields(&fields) # Returns an array of headers/fields from a search sub search_fields { local @rv; foreach $f (@{$_[0]}) { $f->[0] =~ /^\!?(.*)$/; push(@rv, $1); } return &unique(@rv); } # parse_delivery_status(text) # Returns the fields from a message/delivery-status attachment sub parse_delivery_status { local @lines = split(/[\r\n]+/, $_[0]); local (%rv, $l); foreach $l (@lines) { if ($l =~ /^(\S+):\s*(.*)/) { $rv{lc($1)} = $2; } } return \%rv; } # parse_mail_date(string) # Converts a mail Date: header into a unix time sub parse_mail_date { open(OLDSTDERR, ">&STDERR"); # suppress STDERR from Time::Local close(STDERR); my $rv = eval { if ($_[0] =~ /^\s*(\S+),\s+(\d+)\s+(\S+)\s+(\d+)\s+(\d+):\s?(\d+):\s?(\d+)\s+(\S+)/) { # Format like Mon, 13 Dec 2004 14:40:41 +0100 # or Mon, 13 Dec 2004 14:18:16 GMT # or Tue, 14 Sep 04 02:45:09 GMT local $tm = timegm($7, $6, $5, $2, &month_to_number($3), $4 < 50 ? $4+100 : $4 < 1000 ? $4 : $4-1900); local $tz = $8; if ($tz =~ /^(\-|\+)?\d+$/) { local $tz = int($tz); $tz = $tz/100 if ($tz >= 50 || $tz <= -50); $tm -= $tz*60*60; } return $tm; } elsif ($_[0] =~ /^\s*(\S+),\s+(\d+)\s+(\S+)\s+(\d+)\s+(\d+):\s?(\d+):\s?(\d+)/) { # Format like Mon, 13 Dec 2004 14:40:41 # No timezone, so assume local local $tm = timegm($7, $6, $5, $2, &month_to_number($3), $4 < 50 ? $4+100 : $4 < 1000 ? $4 : $4-1900); return $tm; } elsif ($_[0] =~ /^\s*(\S+)\s+(\S+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+(\d+)/) { # Format like Tue Dec 7 12:58:52 2004 local $tm = timelocal($6, $5, $4, $3, &month_to_number($2), $7 < 50 ? $7+100 : $7 < 1000 ? $7 : $7-1900); return $tm; } elsif ($_[0] =~ /^(\d{4})\-(\d+)\-(\d+)\s+(\d+):(\d+)/) { # Format like 2004-12-07 12:53 local $tm = timelocal(0, $4, $4, $3, $2-1, $1 < 50 ? $1+100 : $1 < 1000 ? $1 : $1-1900); } elsif ($_[0] =~ /^(\d+)\s+(\S+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+(\S+)/) { # Format like 30 Jun 2005 21:01:01 -0000 local $tm = timegm($6, $5, $4, $1, &month_to_number($2), $3 < 50 ? $3+100 : $3 < 1000 ? $3 : $3-1900); local $tz = $7; if ($tz =~ /^(\-|\+)?\d+$/) { $tz = int($tz); $tz = $tz/100 if ($tz >= 50 || $tz <= -50); $tm -= $tz*60*60; } return $tm; } else { return undef; } }; open(STDERR, ">&OLDSTDERR"); close(OLDSTDERR); if ($@) { return undef; } return $rv; } 1; mailbox/folders-lib.pl0100664000567100000120000017135210451037152014742 0ustar jcameronwheel# folders-lib.pl # Functions for dealing with mail folders in various formats $pop3_port = 110; $imap_port = 143; $cache_directory = $user_module_config_directory || $module_config_directory; # mailbox_list_mails(start, end, &folder, [headersonly], [&error]) # Returns an array whose size is that of the entire folder, with messages # in the specified range filled in. sub mailbox_list_mails { if ($_[2]->{'type'} == 0) { # List a single mbox formatted file return &list_mails($_[2]->{'file'}, $_[0], $_[1]); } elsif ($_[2]->{'type'} == 1) { # List a qmail maildir local $md = $_[2]->{'file'}; return &list_maildir($md, $_[0], $_[1]); } elsif ($_[2]->{'type'} == 2) { # Get mail headers/body from a remote POP3 server # Login first local @rv = &pop3_login($_[2]); if ($rv[0] != 1) { # Failed to connect or login if ($_[4]) { @{$_[4]} = @rv; return (); } elsif ($rv[0] == 0) { &error($rv[1]); } else { &error(&text('save_elogin', $rv[1])); } } local $h = $rv[1]; local @uidl = &pop3_uidl($h); local %onserver = map { &safe_uidl($_), 1 } @uidl; # Work out what range we want local ($start, $end) = &compute_start_end($_[0], $_[1], scalar(@uidl)); local @rv = map { undef } @uidl; # For each message in the range, get the headers or body local ($i, $f, %cached, %sizeneed); local $cd = "$cache_directory/$_[2]->{'id'}.cache"; if (opendir(CACHE, $cd)) { while($f = readdir(CACHE)) { if ($f =~ /^(\S+)\.body$/) { $cached{$1} = 2; } elsif ($f =~ /^(\S+)\.headers$/) { $cached{$1} = 1; } } closedir(CACHE); } else { mkdir($cd, 0700); } for($i=$start; $i<=$end; $i++) { local $u = &safe_uidl($uidl[$i]); if ($cached{$u} == 2 || $cached{$u} == 1 && $_[3]) { # We already have everything that we need } elsif ($cached{$u} == 1 || !$_[3]) { # We need to get the entire mail &pop3_command($h, "retr ".($i+1)); open(CACHE, ">$cd/$u.body"); while(<$h>) { s/\r//g; last if ($_ eq ".\n"); print CACHE $_; } close(CACHE); unlink("$cd/$u.headers"); $cached{$u} = 2; } else { # We just need the headers &pop3_command($h, "top ".($i+1)." 0"); open(CACHE, ">$cd/$u.headers"); while(<$h>) { s/\r//g; last if ($_ eq ".\n"); print CACHE $_; } close(CACHE); $cached{$u} = 1; } local $mail = &read_mail_file($cached{$u} == 2 ? "$cd/$u.body" : "$cd/$u.headers"); if ($cached{$u} == 1) { if ($mail->{'body'} ne "") { $mail->{'size'} = int($mail->{'body'}); } else { $sizeneed{$i} = 1; } } $mail->{'uidl'} = $uidl[$i]; $mail->{'idx'} = $i; $rv[$i] = $mail; } # Get sizes for mails if needed if (%sizeneed) { &pop3_command($h, "list"); while(<$h>) { s/\r//g; last if ($_ eq ".\n"); if (/^(\d+)\s+(\d+)/ && $sizeneed{$1-1}) { # Add size to the mail cache $rv[$1-1]->{'size'} = $2; local $u = &safe_uidl($uidl[$1-1]); open(CACHE, ">>$cd/$u.headers"); print CACHE $2,"\n"; close(CACHE); } } } # Clean up any cached mails that no longer exist on the server foreach $f (keys %cached) { if (!$onserver{$f}) { unlink($cached{$f} == 1 ? "$cd/$f.headers" : "$cd/$f.body"); } } return @rv; } elsif ($_[2]->{'type'} == 3) { # List an MH directory local $md = $_[2]->{'file'}; return &list_mhdir($md, $_[0], $_[1]); } elsif ($_[2]->{'type'} == 4) { # Get headers and possibly bodies from an IMAP server # Login and select the specified mailbox local @rv = &imap_login($_[2]); if ($rv[0] != 1) { # Something went wrong if ($_[4]) { @{$_[4]} = @rv; return (); } elsif ($rv[0] == 0) { &error($rv[1]); } elsif ($rv[0] == 3) { &error(&text('save_emailbox', $rv[1])); } elsif ($rv[0] == 2) { &error(&text('save_elogin2', $rv[1])); } } local $h = $rv[1]; local $count = $rv[2]; return () if (!$count); # Work out what range we want local ($start, $end) = &compute_start_end($_[0], $_[1], $count); local @mail = map { undef } (0 .. $count-1); # Get the headers or body of messages in the specified range local @rv; if ($_[3]) { # Just the headers @rv = &imap_command($h, sprintf "FETCH %d:%d (RFC822.SIZE RFC822.HEADER)", $start+1, $end+1); } else { # Whole messages @rv = &imap_command($h, sprintf "FETCH %d:%d RFC822", $start+1, $end+1); } # Parse the headers or whole messages that came back local $i; for($i=0; $i<@{$rv[1]}; $i++) { # Extract the actual mail part local $mail = &parse_imap_mail($rv[1]->[$i]); if ($mail) { $mail->{'idx'} = $start+$i; $mail[$start+$i] = $mail; } } return @mail; } elsif ($_[2]->{'type'} == 5) { # Just all of the constituent folders local @mail; # Work out exactly how big the total is local ($sf, %len, $count); foreach $sf (@{$_[2]->{'subfolders'}}) { $len{$sf} = &mailbox_folder_size($sf); $count += $len{$sf}; } # Work out what range we need local ($start, $end) = &compute_start_end($_[0], $_[1], $count); # Fetch the needed part of each sub-folder local $pos = 0; foreach $sf (@{$_[2]->{'subfolders'}}) { local ($sfstart, $sfend); $sfstart = $start - $pos; $sfend = $end - $pos; $sfstart = $sfstart < 0 ? 0 : $sfstart >= $len{$sf} ? $len{$sf}-1 : $sfstart; $sfend = $sfend < 0 ? 0 : $sfend >= $len{$sf} ? $len{$sf}-1 : $sfend; local @submail = &mailbox_list_mails($sfstart, $sfend, $sf, $_[3]); local $sm; foreach $sm (@submail) { if ($sm) { &push_index($sm, $sf, $sm->{'idx'}+$pos); } } push(@mail, @submail); $pos += $len{$sf}; } return @mail; } elsif ($_[2]->{'type'} == 6) { # A virtual folder, which just contains indexes into other folders local $mems = $folder->{'members'}; local ($start, $end) = &compute_start_end($_[0], $_[1], scalar(@$mems)); # Work out which folders we need, and how much local (%frange, %namemap); local $i; for($i=$start; $i<=$end; $i++) { local $sf = $mems->[$i]->[0]; local $sfn = &folder_name($sf); local $idx = $mems->[$i]->[1]; if ($frange{$sfn}) { $frange{$sfn}->[0] = $idx if ($idx < $frange{$sfn}->[0]); $frange{$sfn}->[1] = $idx if ($idx > $frange{$sfn}->[1]); } else { $frange{$sfn} = [ $idx, $idx ]; } $namemap{$sfn} = $sf; } # Get all the needed folders local %sfs; local $sfn; foreach $sfn (keys %frange) { local $sf = $namemap{$sfn}; local @submail = &mailbox_list_mails($frange{$sfn}->[0], $frange{$sfn}->[1], $sf, $_[3]); $sfs{$sfn} = \@submail; } # Construct the results local @mail = map { undef } (0 .. @$mems-1); local $need_save = 0; local @newmems = @$mems; for($i=$start; $i<=$end && $i<=@$mems; $i++) { local $sf = $mems->[$i]->[0]; local $sfn = &folder_name($sf); local $idx = $mems->[$i]->[1]; $mail[$i] = $sfs{$sfn}->[$idx]; if ($mems->[$i]->[2] && $mail[$i]->{'header'}->{'message-id'} ne $mems->[$i]->[2]) { # Argh .. index is wrong! Find message by ID local $real = &find_by_message_id($sf,$mems->[$i]->[2]); if ($real) { $mems->[$i]->[1] = $real->{'idx'}; $mail[$i] = $real; $need_save++; } else { # Doesn't exist! Lose from index.. @newmems = grep { $_ ne $mems->[$i] } @newmems; $need_save++; next; } } &push_index($mail[$i], $sf, $i); } if ($need_save) { $_[2]->{'members'} = \@newmems; &save_folder($_[2]); } return @mail; } } # mailbox_select_mails(&folder, &indexes, headersonly) # Returns only messages from a folder with indexes in the given array sub mailbox_select_mails { local ($folder, $indexes, $headersonly) = @_; if ($folder->{'type'} == 0) { # mbox folder return &select_mails($folder->{'file'}, $indexes, $headersonly); } elsif ($folder->{'type'} == 1) { # Maildir folder return &select_maildir($folder->{'file'}, $indexes, $headersonly); } elsif ($folder->{'type'} == 3) { # MH folder return &select_mhdir($folder->{'file'}, $indexes, $headersonly); } elsif ($folder->{'type'} == 2) { # POP folder # Login first local @rv = &pop3_login($folder); if ($rv[0] != 1) { # Failed to connect or login if ($_[4]) { @{$_[4]} = @rv; return (); } elsif ($rv[0] == 0) { &error($rv[1]); } else { &error(&text('save_elogin', $rv[1])); } } local $h = $rv[1]; local @uidl = &pop3_uidl($h); # For each message in the range, get the headers or body local ($i, $f, %cached, %sizeneed); local @rv; local $cd = "$cache_directory/$_[2]->{'id'}.cache"; if (opendir(CACHE, $cd)) { while($f = readdir(CACHE)) { if ($f =~ /^(\S+)\.body$/) { $cached{$1} = 2; } elsif ($f =~ /^(\S+)\.headers$/) { $cached{$1} = 1; } } closedir(CACHE); } else { mkdir($cd, 0700); } foreach my $i (@$indexes) { local $u = &safe_uidl($uidl[$i]); if ($cached{$u} == 2 || $cached{$u} == 1 && $headersonly) { # We already have everything that we need } elsif ($cached{$u} == 1 || !$headersonly) { # We need to get the entire mail &pop3_command($h, "retr ".($i+1)); open(CACHE, ">$cd/$u.body"); while(<$h>) { s/\r//g; last if ($_ eq ".\n"); print CACHE $_; } close(CACHE); unlink("$cd/$u.headers"); $cached{$u} = 2; } else { # We just need the headers &pop3_command($h, "top ".($i+1)." 0"); open(CACHE, ">$cd/$u.headers"); while(<$h>) { s/\r//g; last if ($_ eq ".\n"); print CACHE $_; } close(CACHE); $cached{$u} = 1; } local $mail = &read_mail_file($cached{$u} == 2 ? "$cd/$u.body" : "$cd/$u.headers"); if ($cached{$u} == 1) { if ($mail->{'body'} ne "") { $mail->{'size'} = int($mail->{'body'}); } else { $sizeneed{$i} = 1; } } $mail->{'uidl'} = $uidl[$i]; $mail->{'idx'} = $i; push(@rv, $mail); } # Get sizes for mails if needed if (%sizeneed) { &pop3_command($h, "list"); while(<$h>) { s/\r//g; last if ($_ eq ".\n"); if (/^(\d+)\s+(\d+)/ && $sizeneed{$1-1}) { # Find mail in results, and set its size local ($ns) = grep { $_->{'idx'} == $1-1 } @rv; next if (!$ns); $ns->{'size'} = $2; local $u = &safe_uidl($uidl[$1-1]); open(CACHE, ">>$cd/$u.headers"); print CACHE $2,"\n"; close(CACHE); } } } return @rv; } elsif ($folder->{'type'} == 4) { # IMAP folder # XXX } elsif ($folder->{'type'} == 5) { # Composite folder .. need to convert each index to a position # in a sub-folder # XXX could be faster my $pos = 0; my @ranges; foreach my $sf (@{$folder->{'subfolders'}}) { my $len = &mailbox_folder_size($sf); push(@ranges, [ $pos, $pos+$len, $sf ]); $pos += $len; } local @rv; foreach my $i (@$indexes) { # Find out which sub-folder this index is in foreach my $r (@ranges) { if ($i >= $r->[0] && $i < $r->[1]) { # Found it! local ($mail) = &mailbox_select_mails( $r->[2], [ $i - $r->[0] ], $headersonly); &push_index($mail, $r->[2], $i); push(@rv, $mail); last; } } } return @rv; } elsif ($folder->{'type'} == 6) { # Virtual folder .. translate each index to sub-folder index # XXX could be faster local $mems = $folder->{'members'}; local @rv; local $need_save = 0; local @newmems = @$mems; # Work out how many different sub-folders we have local $sf; foreach my $i (@$indexes) { $sf = $mems->[$i]->[0]; $sfcount{&folder_name($sf)} = 1; } if ((keys %sfcount) == 1) { # Just one, so we can do one big select local (@sfindexes, @sfmems); foreach my $i (@$indexes) { push(@sfindexes, $mems->[$i]->[1]); push(@sfmems, $i); } local $i = 0; foreach my $mail (&mailbox_select_mails($sf, \@sfindexes, $headersonly)) { $mail->{'mem'} = $mems->[$sfmems[$i]]; &push_index($mail, $sf, $sfmems[$i]); push(@rv, $mail); $i++; } } elsif ((keys %sfcount) > 0) { # Several sub-folders, so we need to select from each foreach my $i (@$indexes) { local $sf = $mems->[$i]->[0]; local $idx = $mems->[$i]->[1]; local ($mail) = &mailbox_select_mails($sf, [ $idx ], $headersonly); $mail->{'mem'} = $mems->[$i]; &push_index($mail, $sf, $i); push(@rv, $mail); } } # Fix up any mistmatches between indexes and message IDs foreach $mail (@rv) { local $mem = $mail->{'mem'}; if ($mem->[2] && $mail->{'header'}->{'message-id'} ne $mem->[2]) { # Message ID mismatch! Fix it.. local $real = &find_by_message_id( $mail->{'subfolder'}, $mem->[2]); if ($real) { $mem->[1] = $real->{'idx'}; $mail = $real; $need_save++; } else { # Doesn't exist! Lose from index.. @newmems = grep { $_ ne $mem } @newmems; $need_save++; } } } if ($need_save) { $folder->{'members'} = \@newmems; &save_folder($folder); } return @rv; } } # compute_start_end(start, end, count) # Given start and end indexes (which may be negative or undef), returns the # real mail file indexes. sub compute_start_end { local ($start, $end, $count) = @_; if (!defined($start)) { return (0, $count-1); } elsif ($end < 0) { local $rstart = $count+$_[1]-1; local $rend = $count+$_[0]-1; $rstart = $rstart < 0 ? 0 : $rstart; return ($rstart, $rend); } else { local $rend = $_[1]; $rend = $count - 1 if ($rend >= $count); return ($start, $rend); } } # mailbox_list_mails_sorted(start, end, &folder, [headeronly], [&error], # [sort-field, sort-dir]) # Returns messages in a folder within the given range, but sorted by the # given field and condition. sub mailbox_list_mails_sorted { local ($start, $end, $folder, $headers, $error, $field, $dir) = @_; if (!$field) { # Default to current ordering ($field, $dir) = &get_sort_field($folder); } if (!$field || !$folder->{'sortable'}) { # No sorting .. just return newest first local @rv = reverse(&mailbox_list_mails( -$start, -$end-1, $folder, $headers, $error)); local $i = 0; foreach my $m (@rv) { $m->{'sortidx'} = $i++; } return @rv; } # Build the appropriate sort index, if missing local %index; &build_sort_index($folder, $field, \%index); # Get message indexes, sorted by the field my @sorter; while(my ($k, $v) = each %index) { if ($k =~ /^(\d+)_\Q$field\E$/) { push(@sorter, [ $1, lc($v) ]); } } if ($field eq "size" || $field eq "date" || $field eq "x-spam-status") { # Numeric sort @sorter = sort { my $s = $a->[1] <=> $b->[1]; $dir ? $s : -$s } @sorter; } else { # Alpha sort @sorter = sort { my $s = $a->[1] cmp $b->[1]; $dir ? $s : -$s } @sorter; } # Find those mails within the requested range ($start, $end) = &compute_start_end($start, $end, scalar(@sorter)); local @rv = map { undef } (0 .. scalar(@sorter)-1); local @wantindexes = map { $sorter[$_]->[0] } ($start .. $end); local @mails = &mailbox_select_mails($folder, \@wantindexes, $headers); for(my $i=0; $i<@mails; $i++) { $rv[$start+$i] = $mails[$i]; $mails[$i]->{'sortidx'} = $start+$i; } return @rv; } # set_sort_indexes(&folder, &mails, [sort-field, sort-dir]) # Given a list of messages, sets the sortidx field based on their indexes # that would be used if the folder was sorted sub set_sort_indexes { local ($folder, $mails, $field, $dir) = @_; if (!$field) { # Default to current ordering ($field, $dir) = &get_sort_field($folder); } if (!$field || !$folder->{'sortable'}) { # Sort index is the same as the normal index reversed my $count = &mailbox_folder_size($folder); foreach my $m (@$mails) { $m->{'sortidx'} = $count-$m->{'idx'}-1; } return; } # Build the appropriate sort index, if missing local %index; &build_sort_index($folder, $field, \%index); # Get message indexes, sorted by the field my @sorter; while(my ($k, $v) = each %index) { if ($k =~ /^(\d+)_\Q$field\E$/) { push(@sorter, [ $1, lc($v) ]); } } if ($field eq "size" || $field eq "date") { # Numeric sort @sorter = sort { my $s = $a->[1] <=> $b->[1]; $dir ? $s : -$s } @sorter; } else { # Alpha sort @sorter = sort { my $s = $a->[1] cmp $b->[1]; $dir ? $s : -$s } @sorter; } # Update sort indexes for mails in list my $i = 0; my %idxmap = map { $_->{'idx'}, $_ } @$mails; foreach my $s (@sorter) { my $m = $idxmap{$s->[0]}; if ($m) { $m->{'sortidx'} = $i; } $i++; } } # build_sort_index(&folder, field, &index) # Builds and/or loads the index for sorting a folder on some field. The # index uses the mail number as the key, and the field value as the value. sub build_sort_index { local ($folder, $field, $index) = @_; return 0 if (!$folder->{'sortable'}); local $ifile = &folder_sort_index_file($folder); dbmopen(%$index, $ifile, 0600); if ($index->{'lastchange'} < $folder->{'lastchange'} || !$folder->{'lastchange'}) { # The mail file is newer than the index .. add messages not in the index # to it. local $realcount = $folder->{'type'} == 6 ? scalar(@{$folder->{'members'}}) : &mailbox_folder_size($folder); local $indexcount = int($index->{'mailcount'}); if ($realcount < $indexcount) { # Mail size has decreased! Need total rebuild $indexcount = 0; %$index = ( ); } local @mails = $realcount ? &mailbox_select_mails($folder, [ $indexcount .. $realcount-1 ], 1) : ( ); my @index_fields = ( "subject", "from", "to", "date", "size", "x-spam-status", "message-id" ); foreach my $mail (@mails) { foreach my $f (@index_fields) { if ($f eq "date") { # Convert date to Unix time $index->{$mail->{'idx'}."_date"} = &parse_mail_date($mail->{'header'}->{'date'}); } elsif ($f eq "size") { # Get mail size $index->{$mail->{'idx'}."_size"} = $mail->{'size'}; } elsif ($f eq "from" || $f eq "to") { # From: header .. convert to display version $index->{$mail->{'idx'}."_".$f} = &simplify_from($mail->{'header'}->{$f}); } elsif ($f eq "subject") { # Convert subject to display version $index->{$mail->{'idx'}."_".$f} = &simplify_subject($mail->{'header'}->{$f}); } elsif ($f eq "x-spam-status") { # Extract spam score $index->{$mail->{'idx'}."_".$f} = $mail->{'header'}->{$f} =~ /(hits|score)=([0-9\.]+)/ ? $2 : undef; } else { # Just a header $index->{$mail->{'idx'}."_".$f} = $mail->{'header'}->{$f}; } } } $index->{'lastchange'} = time(); $index->{'mailcount'} = $realcount; } return 1; } # delete_sort_index(&folder) # Trashes the sort index for a folder, to force a rebuild sub delete_sort_index { local ($folder) = @_; local $ifile = &folder_sort_index_file($folder); my %index; dbmopen(%index, $ifile, 0600); %index = ( ); } # folder_sort_index_file(&folder) # Returns the index file to use for some folder sub folder_sort_index_file { local ($folder) = @_; return &user_index_file(($folder->{'file'} || $folder->{'id'}).".sort"); } # find_by_message_id(&folder, id) # Finds a message by ID, and returns the mail object sub find_by_message_id { local ($folder, $mid) = @_; local %index; if (&build_sort_index($folder, undef, \%index)) { while(my ($k, $v) = each %index) { if ($k =~ /^(\d+)_message-id$/ && $v eq $mid) { # Got it! local ($rv) = &mailbox_select_mails($folder, [ $1 ]); &set_sort_indexes($folder, [ $rv ]); return $rv; } } } return undef; } # find_message_by_index(&mails, &folder, index, mid) # Finds a message by index (in a sorted folder) or message ID sub find_message_by_index { local ($mails, $folder, $idx, $mid) = @_; local $mail = $mails->[$idx]; if ($mid && (!$mail || $mail->{'header'}->{'message-id'} ne $mid)) { $mail = &find_by_message_id($folder, $mid); } return $mail; } # mailbox_search_mail(&fields, andmode, &folder, [&limit]) # Search a mailbox for multiple matching fields sub mailbox_search_mail { # For folders other than mbox and IMAP, build a sort index and use that for # the search, if it is simple enough (Subject, From and To only) local @idxfields = grep { $_->[0] eq 'from' || $_->[0] eq 'to' || $_->[0] eq 'subject' } @{$_[0]}; if ($_[2]->{'type'} != 0 && $_[2]->{'type'} != 4 && $_[2]->{'type'} != 5 && scalar(@idxfields) == scalar(@{$_[0]}) && @idxfields) { local %index; &build_sort_index($_[2], undef, \%index); local @rv; # Work out which mail indexes match the requested headers local %idxmatches = map { ("$_->[0]/$_->[1]", [ ]) } @idxfields; while(my ($k, $v) = each %index) { local ($ki, $kf) = split(/_/, $k, 2); next if (!$kf || $ki eq ''); # Check all of the fields to see which ones match foreach my $if (@idxfields) { local $iff = $if->[0]; local ($neg) = ($iff =~ s/^\!//); next if ($kf ne $iff); if (!$neg && $v =~ /\Q$if->[1]\E/i || $neg && $v !~ /\Q$if->[1]\E/i) { push(@{$idxmatches{"$if->[0]/$if->[1]"}}, $ki); } } } local @matches; if ($_[1]) { # Find indexes in all arrays local %icount; foreach my $if (keys %idxmatches) { foreach my $i (@{$idxmatches{$if}}) { $icount{$i}++; } } foreach my $i (keys %icount) { } local $fif = $idxfields[0]; @matches = grep { $icount{$_} == scalar(@idxfields) } @{$idxmatches{"$fif->[0]/$fif->[1]"}}; } else { # Find indexes in any array foreach my $if (keys %idxmatches) { push(@matches, @{$idxmatches{$if}}); } @matches = &unique(@matches); } @matches = sort { $a <=> $b } @matches; # Select the actual mails return &mailbox_select_mails($_[2], \@matches, 0); } if ($_[2]->{'type'} == 0) { # Just search an mbox format file (which will use its own special # field-level index) return &advanced_search_mail($_[2]->{'file'}, $_[0], $_[1], $_[3]); } elsif ($_[2]->{'type'} == 1) { # Search a maildir directory local $md = $_[2]->{'file'}; return &advanced_search_maildir($md, $_[0], $_[1], $_[3]); } elsif ($_[2]->{'type'} == 2) { # Get all of the mail from the POP3 server and search it local ($min, $max); if ($_[3] && $_[3]->{'latest'}) { $min = -1; $max = -$_[3]->{'latest'}; } local @mails = &mailbox_list_mails($min, $max, $_[2], &indexof('body', &search_fields($_[0])) >= 0 ? 0 : 1); local @rv = grep { $_ && &mail_matches($_[0], $_[1], $_) } @mails; } elsif ($_[2]->{'type'} == 3) { # Search an MH directory local $md = $_[2]->{'file'}; return &advanced_search_mhdir($md, $_[0], $_[1], $_[3]); } elsif ($_[2]->{'type'} == 4) { # Use IMAP's remote search feature # XXX broken! local @rv = &imap_login($_[2]); if ($rv[0] == 0) { &error($rv[1]); } elsif ($rv[0] == 3) { &error(&text('save_emailbox', $rv[1])); } elsif ($rv[0] == 2) { &error(&text('save_elogin2', $rv[1])); } local $h = $rv[1]; # Do the search to get back a list of matching numbers local @search; foreach $f (@{$_[0]}) { local $field = $f->[0]; local $neg = ($field =~ s/^\!//); local $what = $f->[1]; $what = "\"$what\"" if ($field ne "size"); $field = "LARGER" if ($field eq "size"); local $search = uc($field)." ".$what.""; $search = "NOT $search" if ($neg); push(@searches, $search); } local $searches; if (@searches == 1) { $searches = $searches[0]; } elsif ($_[1]) { $searches = join(" ", @searches); } else { $searches = $searches[$#searches]; for($i=$#searches-1; $i>=0; $i--) { $searches = "or $searches[$i] ($searches)"; } } @rv = &imap_command($h, "SEARCH $searches"); &error(&text('save_esearch', $rv[3])) if (!$rv[0]); # Get and parse those specific messages local ($srch) = grep { $_ =~ /^\*\s+SEARCH/i } @{$rv[1]}; local @ids = split(/\s+/, $srch); shift(@ids); shift(@ids); # lose * SEARCH local (@mail, $idx); foreach $idx (@ids) { local $realidx = $idx-1; if ($_[3] && $_[3]->{'latest'}) { # Don't get message if outside search range next if ($realidx < $rv[3]-$_[3]->{'latest'}); } local @rv = &imap_command($h, "FETCH $idx (RFC822.SIZE RFC822.HEADER)"); &error(&text('save_esearch', $rv[3])) if (!$rv[0]); local $mail = &parse_imap_mail($rv[1]->[0]); if ($mail) { $mail->{'idx'} = $realidx; push(@mail, $mail); } } return reverse(@mail); } elsif ($_[2]->{'type'} == 5) { # Search each sub-folder and combine the results - taking any count # limits into effect local $sf; local $pos = 0; local @mail; local (%start, %len); foreach $sf (@{$_[2]->{'subfolders'}}) { $len{$sf} = &mailbox_folder_size($sf); $start{$sf} = $pos; $pos += $len{$sf}; } local $limit = $_[3] ? { %{$_[3]} } : undef; foreach $sf (reverse(@{$_[2]->{'subfolders'}})) { local @submail = &mailbox_search_mail($_[0], $_[1], $sf, $limit); foreach $sm (@submail) { &push_index($sm, $sf, $sm->{'idx'}+$start{$sf}); } push(@mail, reverse(@submail)); if ($limit && $limit->{'latest'}) { # Adjust latest down by size of this folder $limit->{'latest'} -= $len{$sf}; last if ($limit->{'latest'} <= 0); } } return reverse(@mail); } elsif ($_[2]->{'type'} == 6) { # Just run a search on the sub-mails local @rv; local ($min, $max); if ($_[3] && $_[3]->{'latest'}) { $min = -1; $max = -$_[3]->{'latest'}; } local $mail; foreach $mail (&mailbox_list_mails($min, $max, $_[2])) { push(@rv, $mail) if ($mail && &mail_matches($_[0],$_[1],$mail)); } return @rv; } } # mailbox_delete_mail(&folder, mail, ...) # Delete multiple messages from some folder sub mailbox_delete_mail { return undef if (&is_readonly_mode()); local $f = shift(@_); if ($userconfig{'delete_mode'} == 1 && !$f->{'trash'} && !$f->{'spam'}) { # Copy to trash folder first local ($trash) = grep { $_->{'trash'} } &list_folders(); local $m; foreach $m (@_) { &write_mail_folder($m, $trash); } } if ($f->{'type'} == 0) { &delete_mail($f->{'file'}, @_); } elsif ($f->{'type'} == 1) { &delete_maildir(@_); } elsif ($f->{'type'} == 2) { # Login and delete from the POP3 server local @rv = &pop3_login($f); if ($rv[0] == 0) { &error($rv[1]); } elsif ($rv[0] == 2) { &error(&text('save_elogin', $rv[1])); } local $h = $rv[1]; local @uidl = &pop3_uidl($h); local $m; local $cd = "$cache_directory/$f->{'id'}.cache"; foreach $m (@_) { local $idx = &indexof($m->{'uidl'}, @uidl); if ($idx >= 0) { &pop3_command($h, "dele ".($idx+1)); local $u = &safe_uidl($m->{'uidl'}); unlink("$cd/$u.headers", "$cd/$u.body"); } } } elsif ($f->{'type'} == 3) { &delete_mhdir(@_); } elsif ($f->{'type'} == 4) { # Delete from the IMAP server local @rv = &imap_login($f); if ($rv[0] == 0) { &error($rv[1]); } elsif ($rv[0] == 3) { &error(&text('save_emailbox', $rv[1])); } elsif ($rv[0] == 2) { &error(&text('save_elogin2', $rv[1])); } local $h = $rv[1]; local $m; foreach $m (@_) { @rv = &imap_command($h, "STORE ".($m->{'idx'}+1). " +FLAGS (\\Deleted)"); &error(&text('save_edelete', $rv[3])) if (!$rv[0]); } @rv = &imap_command($h, "EXPUNGE"); &error(&text('save_edelete', $rv[3])) if (!$rv[0]); } elsif ($f->{'type'} == 5) { # Delete from underlying folder(s) local $sm; foreach $sm (@_) { local ($subfolder, $idx) = &pop_index($sm); &mailbox_delete_mail($subfolder, $sm); &push_index($sm, $subfolder, $idx); } } elsif ($f->{'type'} == 6) { local $sm; if ($f->{'delete'}) { # Delete the underlying messages, and remove from index local %folderdel; foreach $sm (sort { $b->{'subs'}->[0]->[1] <=> $a->{'subs'}->[0]->[1] } @_) { local ($subfolder, $idx) = &pop_index($sm); &mailbox_delete_mail($subfolder, $sm); &push_index($sm, $subfolder, $idx); # Adjust indexes in virtual list that refer to same # sub-folder, and have higher numbers for(my $i=0; $i<@{$f->{'members'}}; $i++) { my $m = $f->{'members'}->[$i]; my $subidx = $sm->{'subs'}->[0]->[1]; if ($m->[0] eq $sm->{'subfolder'}) { if ($m->[1] == $subidx) { splice(@{$f->{'members'}}, $i--, 1); } elsif ($m->[1] > $subidx) { $m->[1]--; } } } } } else { # Just take out of the virtual index foreach $sm (sort { $b->{'idx'} <=> $a->{'idx'} } @_) { splice(@{$f->{'members'}}, $sm->{'idx'}, 1); } } &save_folder($f, $f); } # Update folder index to remove indexes for deleted messages if ($f->{'sortable'}) { local %index; &build_sort_index($f, undef, \%index); foreach my $m (sort { $b->{'idx'} <=> $a->{'idx'} } @_) { foreach my $k (sort { $a <=> $b } (keys %index)) { local ($ki, $kf) = split(/_/, $k, 2); if ($m->{'idx'} == $ki) { # Delete this actual mail from the index delete($index{$k}); } elsif ($m->{'idx'} < $ki) { # Mail is after one being deleted .. shift down $index{($ki-1)."_".$kf} = $index{$k}; delete($index{$k}); } } } $index{'mailcount'} -= scalar(@_); $index{'lastchange'} = time(); dbmclose(%index); } } # mailbox_empty_folder(&folder) # Remove the entire contents of a mail folder sub mailbox_empty_folder { return undef if (&is_readonly_mode()); local $f = $_[0]; if ($f->{'type'} == 0) { # mbox format mail file &empty_mail($f->{'file'}); } elsif ($f->{'type'} == 1) { # qmail format maildir &empty_maildir($f->{'file'}); } elsif ($f->{'type'} == 2) { # POP3 server .. delete all messages local @rv = &pop3_login($f); if ($rv[0] == 0) { &error($rv[1]); } elsif ($rv[0] == 2) { &error(&text('save_elogin', $rv[1])); } local $h = $rv[1]; @rv = &pop3_command($h, "stat"); $rv[1] =~ /^(\d+)/ || return; local $count = $1; local $i; for($i=1; $i<=$count; $i++) { &pop3_command($h, "dele ".$i); } } elsif ($f->{'type'} == 3) { # mh format maildir &empty_mhdir($f->{'file'}); } elsif ($f->{'type'} == 4) { # IMAP server .. delete all messages local @rv = &imap_login($f); if ($rv[0] == 0) { &error($rv[1]); } elsif ($rv[0] == 3) { &error(&text('save_emailbox', $rv[1])); } elsif ($rv[0] == 2) { &error(&text('save_elogin2', $rv[1])); } local $h = $rv[1]; local $count = $rv[2]; local $i; for($i=1; $i<=$count; $i++) { @rv = &imap_command($h, "STORE ".$i. " +FLAGS (\\Deleted)"); &error(&text('save_edelete', $rv[3])) if (!$rv[0]); } @rv = &imap_command($h, "EXPUNGE"); &error(&text('save_edelete', $rv[3])) if (!$rv[0]); } elsif ($f->{'type'} == 5) { # Empty each sub-folder local $sf; foreach $sf (@{$f->{'subfolders'}}) { &mailbox_empty_folder($sf); } } elsif ($f->{'type'} == 6) { # Just clear the virtual index $f->{'members'} = [ ]; &save_folder($f); } # Trash the folder index if ($folder->{'sortable'}) { &delete_sort_index($folder); } } # mailbox_copy_folder(&source, &dest) # Copy all messages from one folder to another. This is done in an optimized # way if possible. sub mailbox_copy_folder { local ($src, $dest) = @_; if ($src->{'type'} == 0 && $dest->{'type'} == 0) { # mbox to mbox .. just read and write the files &open_readfile(SOURCE, $src->{'file'}); &open_tempfile(DEST, ">>$dest->{'file'}"); while(read(SOURCE, $buf, 1024) > 0) { &print_tempfile(DEST, $buf); } &close_tempfile(DEST); close(SOURCE); } elsif ($src->{'type'} == 1 && $dest->{'type'} == 1) { # maildir to maildir .. just copy the files local @files = &get_maildir_files($src->{'file'}); foreach my $f (@files) { local $fn = $f; $fn =~ s/^.*\///; ©_source_dest($f, "$dest->{'file'}/$fn"); } } elsif ($src->{'type'} == 1 && $dest->{'type'} == 0) { # maildir to mbox .. append all the files local @files = &get_maildir_files($src->{'file'}); &open_tempfile(DEST, ">>$dest->{'file'}"); foreach my $f (@files) { &open_readfile(SOURCE, $f); while(read(SOURCE, $buf, 1024) > 0) { &print_tempfile(DEST, $buf); } close(SOURCE); } &close_tempfile(DEST); } else { # read in all mail and write out, in 100 message blocks local $max = &mailbox_folder_size($src); for(my $s=0; $s<$max; $s+=100) { local $e = $s+99; $e = $max-1 if ($e >= $max); local @mail = &mailbox_list_mails($s, $e, $src); local @want = @mail[$s..$e]; &mailbox_copy_mail($src, $dest, @want); } } } # mailbox_move_mail(&source, &dest, mail, ...) # Move mail from one folder to another sub mailbox_move_mail { return undef if (&is_readonly_mode()); local $src = shift(@_); local $dst = shift(@_); local $now = time(); local $hn = &get_system_hostname(); &create_folder_maildir($dst); if (($src->{'type'} == 1 || $src->{'type'} == 3) && $dst->{'type'} == 1) { # Can just move mail files local $dd = $dst->{'file'}; &create_folder_maildir($dst); foreach $m (@_) { rename($m->{'file'}, "$dd/cur/$now.$$.$hn"); $now++; } } elsif (($src->{'type'} == 1 || $src->{'type'} == 3) && $dst->{'type'} == 3) { # Can move and rename to MH numbering local $dd = $dst->{'file'}; local $num = &max_mhdir($dst->{'file'}) + 1; foreach $m (@_) { rename($m->{'file'}, "$dd/$num"); $num++; } } else { # Append to new folder file, or create in folder directory local $m; foreach $m (@_) { &write_mail_folder($m, $dst); } &mailbox_delete_mail($src, @_); } # Force re-generation of source folder index if ($src->{'sortable'}) { &delete_sort_index($src); # XXX could be faster } } # mailbox_move_folder(&source, &dest) # Moves all mail from one folder to another, possibly converting the type sub mailbox_move_folder { return undef if (&is_readonly_mode()); local ($src, $dst) = @_; if ($src->{'type'} == $dst->{'type'}) { # Can just move the file or dir system("rm -rf ".quotemeta($dst->{'file'})); system("mv ".quotemeta($src->{'file'})." ".quotemeta($dst->{'file'})); } else { # Need to copy one by one :( local @mails = &mailbox_list_mails(undef, undef, $src); &mailbox_move_mail($src, $dst, @mails); } # Delete source folder index if ($src->{'sortable'}) { &delete_sort_index($src); } } # mailbox_copy_mail(&source, &dest, mail, ...) # Copy mail from one folder to another sub mailbox_copy_mail { return undef if (&is_readonly_mode()); local $src = shift(@_); local $dst = shift(@_); local $now = time(); &create_folder_maildir($dst); local $m; if ($src->{'type'} == 6 && $dst->{'type'} == 6) { # Copying from one virtual folder to another, so just copy the # reference foreach $m (@_) { push(@{$dst->{'members'}}, [ $m->{'subfolder'}, $m->{'subid'}, $m->{'header'}->{'message-id'} ]); } } elsif ($dst->{'type'} == 6) { # Add this mail to the index of the virtual folder foreach $m (@_) { push(@{$dst->{'members'}}, [ $src, $m->{'idx'}, $m->{'header'}->{'message-id'} ]); } &save_folder($dst); } else { # Just write to destination folder foreach $m (@_) { &write_mail_folder($m, $dst); } } } # folder_type(file_or_dir) sub folder_type { return -d "$_[0]/cur" ? 1 : -d $_[0] ? 3 : 0; } # create_folder_maildir(&folder) # Ensure that a maildir folder has the needed new, cur and tmp directories sub create_folder_maildir { mkdir($folders_dir, 0700); if ($_[0]->{'type'} == 1) { local $id = $_[0]->{'file'}; mkdir("$id/cur", 0700); mkdir("$id/new", 0700); mkdir("$id/tmp", 0700); } } # write_mail_folder(&mail, &folder, textonly) # Writes some mail message to a folder sub write_mail_folder { return undef if (&is_readonly_mode()); &create_folder_maildir($_[1]); if ($_[1]->{'type'} == 1) { # Add to a maildir directory local $md = $_[1]->{'file'}; &write_maildir($_[0], $md, $_[2]); } elsif ($_[1]->{'type'} == 3) { # Create a new MH file local $num = &max_mhdir($_[1]->{'file'}) + 1; local $md = $_[1]->{'file'}; &send_mail($_[0], "$md/$num", $_[2], 1); } elsif ($_[1]->{'type'} == 0) { # Just append to the folder file &send_mail($_[0], $_[1]->{'file'}, $_[2], 1); } elsif ($_[1]->{'type'} == 4) { # Upload to the IMAP server local @rv = &imap_login($_[1]); if ($rv[0] == 0) { &error($rv[1]); } elsif ($rv[0] == 3) { &error(&text('save_emailbox', $rv[1])); } elsif ($rv[0] == 2) { &error(&text('save_elogin2', $rv[1])); } local $h = $rv[1]; # Create a temp file and use it to create the IMAP command local $temp = &transname(); &send_mail($_[0], $temp, $_[2], 1); open(TEMP, $temp); local $text; while() { $text .= $_; } close(TEMP); unlink($temp); @rv = &imap_command($h, sprintf "APPEND %s {%d}\r\n%s", $_[1]->{'mailbox'} || "INBOX", length($text), $text); &error(&text('save_eappend', $rv[3])) if (!$rv[0]); } elsif ($_[1]->{'type'} == 5) { # Just append to the last subfolder local @sf = @{$_[1]->{'subfolders'}}; &write_mail_folder($_[0], $sf[$#sf], $_[2]); } elsif ($_[1]->{'type'} == 6) { # Add mail to first sub-folder, and to virtual index &error("Cannot add mail to virtual folders"); } } # mailbox_modify_mail(&oldmail, &newmail, &folder, textonly) # Replaces some mail message with a new one sub mailbox_modify_mail { return undef if (&is_readonly_mode()); if ($_[2]->{'type'} == 1) { # Just replace the existing file &modify_maildir($_[0], $_[1], $_[3]); } elsif ($_[2]->{'type'} == 3) { # Just replace the existing file &modify_mhdir($_[0], $_[1], $_[3]); } elsif ($_[2]->{'type'} == 0) { # Modify the mail file &modify_mail($_[2]->{'file'}, $_[0], $_[1], $_[3]); } elsif ($_[2]->{'type'} == 5 || $_[2]->{'type'} == 6) { # Modify in the appropriate folder local ($oldsubfolder, $oldidx) = &pop_index($_[0]); local ($newsubfolder, $newidx) = &pop_index($_[1]); &mailbox_modify_mail($_[0], $_[1], $oldsubfolder, $_[3]); &push_index($_[0], $oldsubfolder, $oldidx); &push_index($_[1], $newsubfolder, $newidx); } else { &error("Cannot modify mail in this type of folder!"); } # Force re-generation of folder index if ($_[2]->{'sortable'}) { &delete_sort_index($_[2]); # XXX could be faster } } # mailbox_folder_size(&folder, [estimate]) # Returns the number of messages in some folder sub mailbox_folder_size { if ($_[0]->{'type'} == 0) { # A mbox formatted file return &count_mail($_[0]->{'file'}); } elsif ($_[0]->{'type'} == 1) { # A qmail maildir return &count_maildir($_[0]->{'file'}); } elsif ($_[0]->{'type'} == 2) { # A POP3 server local @rv = &pop3_login($_[0]); if ($rv[0] != 1) { if ($rv[0] == 0) { &error($rv[1]); } else { &error(&text('save_elogin', $rv[1])); } } local @st = &pop3_command($rv[1], "stat"); if ($st[0] == 1) { local ($count, $size) = split(/\s+/, $st[1]); return $count; } else { &error($st[1]); } } elsif ($_[0]->{'type'} == 3) { # An MH directory return &count_mhdir($_[0]->{'file'}); } elsif ($_[0]->{'type'} == 4) { # An IMAP server local @rv = &imap_login($_[0]); if ($rv[0] != 1) { if ($rv[0] == 0) { &error($rv[1]); } elsif ($rv[0] == 3) { &error(&text('save_emailbox', $rv[1])); } elsif ($rv[0] == 2) { &error(&text('save_elogin2', $rv[1])); } } return $rv[2]; } elsif ($_[0]->{'type'} == 5) { # A composite folder - the size is just that of the sub-folders my $rv = 0; foreach my $sf (@{$_[0]->{'subfolders'}}) { $rv += &mailbox_folder_size($sf); } return $rv; } elsif ($_[0]->{'type'} == 6 && !$_[1]) { # A virtual folder .. we need to exclude messages that no longer # exist in the parent folders my $rv = 0; foreach my $msg (@{$_[0]->{'members'}}) { if (!$msg->[2] || &find_by_message_id($msg->[0], $msg->[2])) { $rv++; } } return $rv; } elsif ($_[0]->{'type'} == 6 && $_[1]) { # A virtual folder .. but we can just use the last member count return scalar(@{$_[0]->{'members'}}); } } # pop3_login(&folder) # Logs into a POP3 server and returns a status (1=ok, 0=connect failed, # 2=login failed) and handle or error message sub pop3_login { local $h = $pop3_login_handle{$_[0]->{'id'}}; return (1, $h) if ($h); $h = time().++$pop3_login_count; local $error; &open_socket($_[0]->{'server'}, $_[0]->{'port'} || 110, $h, \$error); return (0, $error) if ($error); local $os = select($h); $| = 1; select($os); local @rv = &pop3_command($h); return (0, $rv[1]) if (!$rv[0]); @rv = &pop3_command($h, "user $_[0]->{'user'}"); return (2, $rv[1]) if (!$rv[0]); @rv = &pop3_command($h, "pass $_[0]->{'pass'}"); return (2, $rv[1]) if (!$rv[0]); return (1, $pop3_login_handle{$_[0]->{'id'}} = $h); } # pop3_command(handle, command) # Executes a command and returns the status (1 or 0 for OK or ERR) and message sub pop3_command { local ($h, $c) = @_; print $h "$c\r\n" if ($c); local $rv = <$h>; $rv =~ s/\r|\n//g; return !$rv ? ( 0, "Connection closed" ) : $rv =~ /^\+OK\s*(.*)/ ? ( 1, $1 ) : $rv =~ /^\-ERR\s*(.*)/ ? ( 0, $1 ) : ( 0, $rv ); } # pop3_logout(handle, doquit) sub pop3_logout { local @rv = $_[1] ? &pop3_command($_[0], "quit") : (1, undef); local $f; foreach $f (keys %pop3_login_handle) { delete($pop3_login_handle{$f}) if ($pop3_login_handle{$f} eq $_[0]); } close($_[0]); return @rv; } # pop3_uidl(handle) # Returns the uidl list sub pop3_uidl { local @rv; local $h = $_[0]; local @urv = &pop3_command($h, "uidl"); if (!$urv[0] && $urv[1] =~ /not\s+implemented/i) { # UIDL is not available?! Use numeric list instead &pop3_command($h, "list"); while(<$h>) { s/\r//g; last if ($_ eq ".\n"); if (/^(\d+)\s+(\d+)/) { push(@rv, "size$2"); } } } elsif (!$urv[0]) { &error("uidl failed! $urv[1]") if (!$urv[0]); } else { # Can get normal UIDL list while(<$h>) { s/\r//g; last if ($_ eq ".\n"); if (/^(\d+)\s+(\S+)/) { push(@rv, $2); } } } return @rv; } # pop3_logout_all() # Properly closes all open POP3 and IMAP sessions sub pop3_logout_all { local $f; foreach $f (keys %pop3_login_handle) { &pop3_logout($pop3_login_handle{$f}, 1); } foreach $f (keys %imap_login_handle) { &imap_logout($imap_login_handle{$f}, 1); } } # imap_login(&folder) # Logs into a POP3 server, selects a mailbox and returns a status # (1=ok, 0=connect failed, 2=login failed, 3=mailbox error), a handle or error # message, and the number of messages in the mailbox. sub imap_login { local $h = $imap_login_handle{$_[0]->{'id'}}; return (1, $h) if ($h); $h = time().++$imap_login_count; local $error; &open_socket($_[0]->{'server'}, $_[0]->{'port'} || $imap_port, $h, \$error); return (0, $error) if ($error); local $os = select($h); $| = 1; select($os); # Login normally local @rv = &imap_command($h); return (0, $rv[3]) if (!$rv[0]); @rv = &imap_command($h, "login \"$_[0]->{'user'}\" \"$_[0]->{'pass'}\""); return (2, $rv[3]) if (!$rv[0]); # Select the right folder @rv = &imap_command($h, "select ".($_[0]->{'mailbox'} || "INBOX")); return (3, $rv[3]) if (!$rv[0]); return (1, $imap_login_handle{$_[0]->{'id'}} = $h, $rv[2] =~ /\*\s+(\d+)\s+EXISTS/i ? $1 : undef); } # imap_command(handle, command) # Executes an IMAP command and returns 1 for success or 0 for failure, and # a reference to an array of results (some of which may be multiline), and # all of the results joined together, and the stuff after OK/BAD sub imap_command { local ($h, $c) = @_; local @rv; # Send the command, and read lines until a non-* one is found local $id = $$."-".$imap_command_count++; if ($c) { print $h "$id $c\r\n"; } while(1) { local $l = <$h>; last if (!$l); if ($l =~ /^(\*|\+)/) { # Another response, and possibly the only one if no command # was sent. push(@rv, $l); last if (!$c); if ($l =~ /\{(\d+)\}\s*$/) { # Start of multi-line text .. read the specified size local $size = $1; local $got; local $err = "Error reading email"; while($got < $size) { local $buf; local $r = read($h, $buf, $size-$got); return (0, [ $err ], $err, $err) if ($r < 0); $rv[$#rv] .= $buf; $got += $r; } } } elsif ($l =~ /^(\S+)\s+/ && $1 eq $id) { # End of responses push(@rv, $l); last; } else { # Part of last response if (!@rv) { local $err = "Got unknown line $l"; return (0, [ $err ], $err, $err); } $rv[$#rv] .= $l; } } local $j = join("", @rv); local $lline = $rv[$#rv]; if ($lline =~ /^(\S+)\s+OK\s*(.*)/) { # Looks like the command worked return (1, \@rv, $j, $2); } else { # Command failed! return (0, \@rv, $j, $lline =~ /^(\S+)\s+(\S+)\s*(.*)/ ? $3 : undef); } } # imap_logout(handle, doquit) sub imap_logout { local @rv = $_[1] ? &imap_command($_[0], "close") : (1, undef); local $f; foreach $f (keys %imap_login_handle) { delete($imap_login_handle{$f}) if ($imap_login_handle{$f} eq $_[0]); } close($_[0]); return @rv; } # lock_folder(&folder) sub lock_folder { return if ($_[0]->{'remote'} || $_[0]->{'type'} == 5 || $_[0]->{'type'} == 6); local $f = $_[0]->{'file'} ? $_[0]->{'file'} : $_[0]->{'type'} == 0 ? &user_mail_file($remote_user) : $qmail_maildir; if (&lock_file($f)) { $_[0]->{'lock'} = $f; } else { # Cannot lock if in /var/mail local $ff = $f; $ff =~ s/\//_/g; $ff = "/tmp/$ff"; $_[0]->{'lock'} = $ff; &lock_file($ff); } # Also, check for a .filename.pop3 file if ($config{'pop_locks'} && $f =~ /^(\S+)\/([^\/]+)$/) { local $poplf = "$1/.$2.pop"; local $count = 0; while(-r $poplf) { sleep(1); if ($count++ > 5*60) { # Give up after 5 minutes &error(&text('epop3lock_tries', "$f", 5)); } } } } # unlock_folder(&folder) sub unlock_folder { return if ($_[0]->{'remote'}); &unlock_file($_[0]->{'lock'}); } # folder_file(&folder) # Returns the full path to the file or directory containing the folder's mail, # or undef if not appropriate (such as for POP3) sub folder_file { return $_[0]->{'remote'} ? undef : $_[0]->{'file'}; } # parse_imap_mail(response) # Parses a response from the IMAP server into a standard mail structure sub parse_imap_mail { # Extract the actual mail part local $mail = { }; local $realsize; local $imap = $_[0]; if ($imap =~ /RFC822.SIZE\s+(\d+)/) { $realsize = $1; } $imap =~ s/^\*\s+\d+\s+FETCH.*\{(\d+)\}\r?\n// || return undef; local $size = $1; local @lines = split(/\n/, substr($imap, 0, $size)); # Parse the headers local $lnum = 0; local @headers; while(1) { local $line = $lines[$lnum++]; $mail->{'size'} += length($line); $line =~ s/\r//g; last if ($line eq ''); if ($line =~ /^(\S+):\s*(.*)/) { push(@headers, [ $1, $2 ]); } elsif ($line =~ /^(\s+.*)/) { $headers[$#headers]->[1] .= $1 unless($#headers < 0); } } $mail->{'headers'} = \@headers; foreach $h (@headers) { $mail->{'header'}->{lc($h->[0])} = $h->[1]; } # Parse the body while($lnum < @lines) { $mail->{'size'} += length($lines[$lnum]+1); $mail->{'body'} .= $lines[$lnum]."\n"; $lnum++; } $mail->{'size'} = $realsize if ($realsize); return $mail; } # find_body(&mail, mode) # Returns the plain text body, html body and the one to use sub find_body { local ($a, $body, $textbody, $htmlbody); foreach $a (@{$_[0]->{'attach'}}) { if ($a->{'type'} =~ /^text\/plain/i || $a->{'type'} eq 'text') { $textbody = $a if (!$textbody && $a->{'data'} =~ /\S/); } elsif ($a->{'type'} =~ /^text\/html/i) { $htmlbody = $a if (!$htmlbody && $a->{'data'} =~ /\S/); } } if ($_[1] == 0) { $body = $textbody; } elsif ($_[1] == 1) { $body = $textbody || $htmlbody; } elsif ($_[1] == 2) { $body = $htmlbody || $textbody; } elsif ($_[1] == 3) { # Convert HTML to text if needed if ($textbody) { $body = $textbody; } else { local $text = &html_to_text($htmlbody->{'data'}); $body = $textbody = { 'data' => $text }; } } return ($textbody, $htmlbody, $body); } # safe_html(html) # Converts HTML to a form safe for inclusion in a page sub safe_html { local $html = $_[0]; local $bodystuff; if ($html =~ s/^[\000-\377]*]*)>//i) { $bodystuff = $1; } $html =~ s/<\/BODY>[\000-\377]*$//i; $html =~ s/]*>//i; $html = &filter_javascript($html); $html = &safe_urls($html); $bodystuff = &safe_html($bodystuff) if ($bodystuff); return wantarray ? ($html, $bodystuff) : $html; } # head_html(html) # Returns HTML in the section of a document sub head_html { local $html = $_[0]; return undef if ($html !~ /]*>/i || $html !~ /<\/HEAD[^>]*>/i); $html =~ s/^[\000-\377]*]*>//gi || &error("Failed to filter
".&html_escape($html)."
"); $html =~ s/<\/HEAD[^>]*>[\000-\377]*//gi || &error("Failed to filter
".&html_escape($html)."
"); $html =~ s/]*>//i; return &filter_javascript($html); } # safe_urls(html) # Replaces dangerous-looking URLs in HTML sub safe_urls { local $html = $_[0]; $html =~ s/((src|href|background)\s*=\s*)([^ '">]+)()/&safe_url($1, $3, $4)/gei; $html =~ s/((src|href|background)\s*=\s*')([^']+)(')/&safe_url($1, $3, $4)/gei; $html =~ s/((src|href|background)\s*=\s*")([^"]+)(")/&safe_url($1, $3, $4)/gei; return $html; } # safe_url(before, url, after) sub safe_url { local ($before, $url, $after) = @_; if ($url =~ /^#/) { # Relative link - harmless return $before.$url.$after; } elsif ($url =~ /^cid:/i) { # Definately safe (CIDs are harmless) return $before.$url.$after; } elsif ($url =~ /^(http:|https:)/) { # Possibly safe, unless refers to local local ($host, $port, $page, $ssl) = &parse_http_url($url); local ($hhost, $hport) = split(/:/, $ENV{'HTTP_HOST'}); $hport ||= $ENV{'SERVER_PORT'}; if ($host ne $hhost || $port != $hport || $ssl != (uc($ENV{'HTTPS'}) eq 'ON' ? 1 : 0)) { return $before.$url.$after; } else { return $before."_unsafe_link_".$after; } } else { # Relative URL like foo.cgi or /foo.cgi or ../foo.cgi - unsafe! return $before."_unsafe_link_".$after; } } # safe_uidl(string) sub safe_uidl { local $rv = $_[0]; $rv =~ s/\/|\./_/g; return $rv; } # html_to_text(html) # Attempts to convert some HTML to text form sub html_to_text { local ($h2, $lynx); if (($h2 = &has_command("html2text")) || ($lynx = &has_command("lynx"))) { # Can use a commonly available external program local $temp = &transname().".html"; open(TEMP, ">$temp"); print TEMP $_[0]; close(TEMP); open(OUT, ($lynx ? "$lynx -dump $temp" : "$h2 $temp")." 2>/dev/null |"); while() { if ($lynx && $_ =~ /^\s*References\s*$/) { # Start of Lynx references output $gotrefs++; } elsif ($lynx && $gotrefs && $_ =~ /^\s*(\d+)\.\s+(http|https|ftp|mailto)/) { # Skip this URL reference line } else { $text .= $_; } } close(OUT); unlink($temp); return $text; } else { # Do conversion manually :( local $html = $_[0]; $html =~ s/\s+/ /g; $html =~ s/

/\n\n/gi; $html =~ s/
/\n/gi; $html =~ s/<[^>]+>//g; $html = &entities_to_ascii($html); return $html; } } # folder_select(&folders, selected-folder, name, [extra-options]) # Returns HTML for selecting a folder sub folder_select { local $sel = "\n"; return $sel; } # folder_size(&folder, ...) # Sets the 'size' field of one or more folders, and returns the total sub folder_size { local ($f, $total); foreach $f (@_) { if ($f->{'type'} == 0) { # Single mail file - size is easy local @st = stat($f->{'file'}); $f->{'size'} = $st[7]; } elsif ($f->{'type'} == 1) { # Maildir folder size is that of all files in it $f->{'size'} = &recursive_disk_usage($f->{'file'}); } elsif ($f->{'type'} == 3) { # MH folder size is that of all mail files local $mf; $f->{'size'} = 0; opendir(MHDIR, $f->{'file'}); while($mf = readdir(MHDIR)) { next if ($mf eq "." || $mf eq ".."); local @st = stat("$f->{'file'}/$mf"); $f->{'size'} += $st[7]; } closedir(MHDIR); } elsif ($f->{'type'} == 5) { # Size of a combined folder is the size of all sub-folders return &folder_size(@{$f->{'subfolders'}}); } else { # Cannot get size of a remote folder $f->{'size'} = undef; } $total += $f->{'size'}; } return $total; } # parse_boolean(string) # Separates a string into a series of and/or separated values. Returns a # mode number (0=or, 1=and, 2=both) and a list of words sub parse_boolean { local @rv; local $str = $_[0]; local $mode = -1; local $lastandor = 0; while($str =~ /^\s*"([^"]*)"(.*)$/ || $str =~ /^\s*"([^"]*)"(.*)$/ || $str =~ /^\s*(\S+)(.*)$/) { local $word = $1; $str = $2; if (lc($word) eq "and") { if ($mode < 0) { $mode = 1; } elsif ($mode != 1) { $mode = 2; } $lastandor = 1; } elsif (lc($word) eq "or") { if ($mode < 0) { $mode = 0; } elsif ($mode != 0) { $mode = 2; } $lastandor = 1; } else { if (!$lastandor && @rv) { $rv[$#rv] .= " ".$word; } else { push(@rv, $word); } $lastandor = 0; } } $mode = 0 if ($mode < 0); return ($mode, \@rv); } # recursive_files(dir, treat-dirs-as-folders) sub recursive_files { local ($f, @rv); opendir(DIR, $_[0]); local @files = readdir(DIR); closedir(DIR); foreach $f (@files) { next if ($f eq "." || $f eq ".." || $f =~ /\.lock$/i || $f eq "cur" || $f eq "tmp" || $f eq "new" || $f =~ /^\.imap/i || $f eq ".customflags" || $f eq "dovecot-uidlist" || $f =~ /^courierimap/ || $f eq "maildirfolder" || $f eq "maildirsize" || $f eq "maildircache"); local $p = "$_[0]/$f"; local $added = 0; if ($_[1] || !-d $p || -d "$p/cur") { push(@rv, $p); $added = 1; } # If this directory wasn't a folder (or it it in Maildir format), # search it too. if (-d "$p/cur" || !$added) { push(@rv, &recursive_files($p)); } } return @rv; } # editable_mail(&mail) # Returns 0 if some mail message should not be editable (ie. internal folder) sub editable_mail { return $_[0]->{'header'}->{'subject'} !~ /DON'T DELETE THIS MESSAGE.*FOLDER INTERNAL DATA/; } # fix_cids(html, &attachments, url-prefix, &cid-list) # Replaces HTML like img src=cid:XXX with img src=detach.cgi?whatever sub fix_cids { local $rv = $_[0]; $rv =~ s/(src="|href=")cid:([^"]+)(")/$1.&fix_cid($2,$_[1],$_[2],$_[3]).$3/gei; $rv =~ s/(src='|href=')cid:([^']+)(')/$1.&fix_cid($2,$_[1],$_[2],$_[3]).$3/gei; $rv =~ s/(src=|href=)cid:([^\s>]+)()/$1.&fix_cid($2,$_[1],$_[2],$_[3]).$3/gei; return $rv; } # fix_cid(cid, &attachments, url-prefix, &cid-list) sub fix_cid { local ($cont) = grep { $_->{'header'}->{'content-id'} eq $_[0] || $_->{'header'}->{'content-id'} eq "<$_[0]>" } @{$_[1]}; return "cid:$_[0]" if (!$cont); push(@{$_[3]}, $cont) if ($_[3]); return "$_[2]&attach=$cont->{'idx'}"; } # quoted_message(&mail, quote-mode, sig, 0=any,1=text,2=html) # Returns the quoted text, html-flag and body attachment sub quoted_message { local ($mail, $qu, $sig, $bodymode) = @_; local $mode = $bodymode == 1 ? 1 : $bodymode == 2 ? 2 : defined(%userconfig) ? $userconfig{'view_html'} : $config{'view_html'}; local ($plainbody, $htmlbody) = &find_body($mail, $mode); local ($quote, $html_edit, $body); local $cfg = defined(%userconfig) ? \%userconfig : \%config; local @writers = &split_addresses($mail->{'header'}->{'from'}); local $writer = ($writers[0]->[1] || $writers[0]->[0])." wrote .."; local $tm; if ($cfg->{'reply_date'} && ($tm = &parse_mail_date($_[0]->{'header'}->{'date'}))) { local $tmstr = &make_date($tm); $writer = "On $tmstr $writer"; } local $qm = defined(%userconfig) ? $userconfig{'html_quote'} : $config{'html_quote'}; if (($cfg->{'html_edit'} == 2 || $cfg->{'html_edit'} == 1 && $htmlbody) && $bodymode != 1) { # Create quoted body HTML if ($htmlbody) { $body = $htmlbody; $sig =~ s/\n/
\n/g; if ($qu && $qm == 0) { # Quoted HTML as cite $quote = "$writer\n". "

\n". &safe_html($htmlbody->{'data'}). "
".$sig."
\n"; } elsif ($qu && $qm == 1) { # Quoted HTML below line $quote = "
$sig
". "$writer
\n". &safe_html($htmlbody->{'data'}); } else { # Un-quoted HTML $quote = &safe_html($htmlbody->{'data'}). $sig."
\n"; } } elsif ($plainbody) { $body = $plainbody; local $pd = $plainbody->{'data'}; $pd =~ s/^\s+//g; $pd =~ s/\s+$//g; if ($qu && $qm == 0) { # Quoted plain text as HTML as cite $quote = "$writer\n". "
\n". "
$pd
". "
".$sig."
\n"; } elsif ($qu && $qm == 1) { # Quoted plain text as HTML below line $quote = "
$sig
". "$writer
\n". "
$pd

\n"; } else { # Un-quoted plain text as HTML $quote = "
$pd
". $sig."
\n"; } } $html_edit = 1; } else { # Create quoted body text if ($plainbody) { $body = $plainbody; $quote = $plainbody->{'data'}; } elsif ($htmlbody) { $body = $htmlbody; $quote = &html_to_text($htmlbody->{'data'}); } if ($quote && $qu) { $quote = join("", map { "> $_\n" } &wrap_lines($quote, 70)); } $quote = $writer."\n".$quote if ($quote && $qu); $quote .= "$sig\n" if ($sig); } return ($quote, $html_edit, $body); } # modification_time(&folder) # Returns the unix time on which this folder was last modified, or 0 if unknown sub modification_time { if ($_[0]->{'type'} == 0) { # Modification time of file local @st = stat($_[0]->{'file'}); return $st[9]; } elsif ($_[0]->{'type'} == 1) { # Greatest modification time of cur/new directory local @stcur = stat("$_[0]->{'file'}/cur"); local @stnew = stat("$_[0]->{'file'}/new"); return $stcur[9] > $stnew[9] ? $stcur[9] : $stnew[9]; } elsif ($_[0]->{'type'} == 2 || $_[0]->{'type'} == 4) { # Cannot know for POP3 or IMAP folders return 0; } elsif ($_[0]->{'type'} == 3) { # Modification time of MH folder local @st = stat($_[0]->{'file'}); return $st[9]; } else { # Huh? return 0; } } # requires_delivery_notification(&mail) sub requires_delivery_notification { return $_[0]->{'header'}->{'disposition-notification-to'} || $_[0]->{'header'}->{'read-reciept-to'}; } # send_delivery_notification(&mail, [from-addr], manual) # Send an email containing delivery status information sub send_delivery_notification { local ($mail, $from) = @_; $from ||= $mail->{'header'}->{'to'}; local $host = &get_display_hostname(); local $to = &requires_delivery_notification($mail); local $product = &get_product_name(); $product = ucfirst($product); local $version = &get_webmin_version(); local ($taddr) = &split_addresses($mail->{'header'}->{'to'}); local $disp = $manual ? "manual-action/MDN-sent-manually" : "automatic-action/MDN-sent-automatically"; local $dsn = <[0] Final-Recipient: rfc822;$taddr->[0] Original-Message-ID: $mail->{'header'}->{'message-id'} Disposition: $disp; displayed EOF local $dmail = { 'headers' => [ [ 'From' => $from ], [ 'To' => $to ], [ 'Subject' => 'Delivery notification' ], [ 'Content-type' => 'multipart/report; report-type=disposition-notification' ], [ 'Content-Transfer-Encoding' => '7bit' ] ], 'attach' => [ { 'headers' => [ [ 'Content-type' => 'text/plain' ] ], 'data' => "This is a delivery status notification for the email sent to:\n$mail->{'header'}->{'to'}\non the date:\n$mail->{'header'}->{'date'}\nwith the subject:\n$mail->{'header'}->{'subject'}\n" }, { 'headers' => [ [ 'Content-type' => 'message/disposition-notification' ], [ 'Content-Transfer-Encoding' => '7bit' ] ], 'data' => $dsn } ] }; eval { local $main::errors_must_die = 1; &send_mail($dmail); }; return $to; } # find_named_folder(name, &folders, [&cache]) # Finds a folder by ID, filename, server name or displayed name sub find_named_folder { local $rv; if ($_[2] && exists($_[2]->{$_[0]})) { # In cache $rv = $_[2]->{$_[0]}; } else { # Need to lookup ($rv) = grep { $_->{'id'} eq $_[0] } @{$_[1]} if (!$rv); ($rv) = grep { my $escfile = $_->{'file'}; $escfile =~ s/\s/_/g; $escfile eq $_[0] || $_->{'file'} eq $_[0] || $_->{'server'} eq $_[0] } @{$_[1]} if (!$rv); ($rv) = grep { my $escname = $_->{'name'}; $escname =~ s/\s/_/g; $escname eq $_[0] || $_->{'name'} eq $_[0] } @{$_[1]} if (!$rv); $_[2]->{$_[0]} = $rv if ($_[2]); } return $rv; } # folder_name(&folder) # Returns a unique identifier for a folder, based on it's filename or ID sub folder_name { my $rv = $_[0]->{'id'} || $_[0]->{'file'} || $_[0]->{'server'} || $_[0]->{'name'}; $rv =~ s/\s/_/g; return $rv; } # set_folder_lastmodified(&folders) # Sets the last-modified time and sortable flag on all given folders sub set_folder_lastmodified { local ($folders) = @_; foreach my $folder (@$folders) { if ($folder->{'type'} == 0 || $folder->{'type'} == 3) { # For an mbox or MH folder, the last modified date is just that # of the file or directory itself local @st = stat($folder->{'file'}); $folder->{'lastchange'} = $st[9]; $folder->{'sortable'} = 1; } elsif ($folder->{'type'} == 1) { # For a Maildir folder, the date is that of the newest # sub-directory (cur, tmp or new) $folder->{'lastchange'} = 0; foreach my $sf ("cur", "tmp", "new") { local @st = stat("$folder->{'file'}/$sf"); $folder->{'lastchange'} = $st[9] if ($st[9] > $folder->{'lastchange'}); } $folder->{'sortable'} = 1; } elsif ($folder->{'type'} == 6) { # For a virtual folder, the date is that of the newest # sub-folder, OR the folder file itself local @st = stat($folder->{'folderfile'}); $folder->{'lastchange'} = $st[9]; my %done; foreach my $m (@{$folder->{'members'}}) { if (!$done{$m->[0]}++) { &set_folder_lastmodified([ $m->[0] ]); $folder->{'lastchange'} = $m->[0]->{'lastchange'} if ($m->[0]->{'lastchange'} > $folder->{'lastchange'}); } } $folder->{'sortable'} = 1; } else { # For POP3 and IMAP folders, we don't know the last change $folder->{'lastchange'} = undef; $folder->{'sortable'} = 1; } } } # push_index(&mail, &folder, new-index) # Adjusts the index of some email to the new one, and stores the old # index and folder sub push_index { local ($mail, $folder, $newidx) = @_; unshift(@{$mail->{'subs'}}, [ $mail->{'subfolder'}, $mail->{'idx'} ]); $mail->{'subidx'} = $mail->{'subs'}->[0]->[1]; $mail->{'subfolder'} = $folder; $mail->{'idx'} = $newidx; } # pop_index(&mail) # Removes the stored sub-folder and index, and restores the original index. # Returns the original sub-folder and index. sub pop_index { local ($mail) = @_; local $old = shift(@{$mail->{'subs'}}); $mail->{'subidx'} = $mail->{'subs'}->[0]->[1]; local @rv = ( $mail->{'subfolder'}, $mail->{'idx'} ); $mail->{'subfolder'} = $old->[0]; $mail->{'idx'} = $old->[1]; return @rv; } # mail_preview(&mail) # Returns a short text preview of a message body sub mail_preview { local ($textbody, $htmlbody, $body) = &find_body($_[0], 0); local $data = $body->{'data'}; $data =~ s/\r?\n/ /g; $data = substr($data, 0, 100); if ($data =~ /\S/) { return $data; } return undef; } 1; mailbox/htmlarea/0040755000567100000120000000000010374217006013772 5ustar jcameronwheelmailbox/htmlarea/dialog.js0100644000567100000120000000433410020710422015554 0ustar jcameronwheel// htmlArea v3.0 - Copyright (c) 2003-2004 interactivetools.com, inc. // This copyright notice MUST stay intact for use (see license.txt). // // Portions (c) dynarch.com, 2003-2004 // // A free WYSIWYG editor replacement for mailbox/htmlarea/popups/insert_image.html0100644000567100000120000001235010020710424020640 0ustar jcameronwheel Insert Image
Insert Image
Image URL:
Alternate text:

Layout
Alignment:

Border thickness:
Spacing
Horizontal:

Vertical:

Image Preview:

mailbox/htmlarea/popups/insert_table.html0100644000567100000120000001104110020710424020641 0ustar jcameronwheel Insert Table
Insert Table
Rows:
Cols: Width:

Layout
Alignment:

Border thickness:
Spacing
Cell spacing:

Cell padding:
mailbox/htmlarea/popups/link.html0100644000567100000120000000730110020710424017127 0ustar jcameronwheel Insert/Modify Link
Insert/Modify Link
URL:
Title (tooltip):
Target:
mailbox/htmlarea/popups/old-fullscreen.html0100644000567100000120000001064710020710424021117 0ustar jcameronwheel Fullscreen Editor

mailbox/htmlarea/popups/old_insert_image.html0100644000567100000120000002010210020710424021470 0ustar jcameronwheel Insert Image
Image URL:
Alternate Text:
Layout
Spacing
Alignment:
Horizontal:
Border Thickness:
Vertical:
mailbox/htmlarea/popups/select_color.html0100644000567100000120000007014210020710424020652 0ustar jcameronwheel Select Color
mailbox/htmlarea/images/0040755000567100000120000000000010020710424015225 5ustar jcameronwheelmailbox/htmlarea/images/ed_about.gif0100644000567100000120000000012710020710424017473 0ustar jcameronwheelGIF89a€˙˙˙!ů,.Œ‰ŔíLTtNšŹb[î{hXć-€’š–f×fŹř˘óě†x<†yoO=J;mailbox/htmlarea/images/ed_align_center.gif0100644000567100000120000000010510020710424021007 0ustar jcameronwheelGIF89a€˙˙˙!ů,ŒŠËí˘œóYHëušƒÍyȈYŠčĘśF;mailbox/htmlarea/images/ed_align_justify.gif0100644000567100000120000000010510020710424021224 0ustar jcameronwheelGIF89a€˙˙˙!ů,ŒŠËí˘œó=ŠĽu9ďÖaRăRVçĘśG;mailbox/htmlarea/images/ed_align_left.gif0100644000567100000120000000010510020710424020461 0ustar jcameronwheelGIF89a€˙˙˙!ů,ŒŠËí˘œó=J­†¸oÖIßfcRçĘśH;mailbox/htmlarea/images/ed_align_right.gif0100644000567100000120000000010410020710424020643 0ustar jcameronwheelGIF89a€˙˙˙!ů,ŒŠËí˘œóŮCémšƒmy¸ˆɉčĘś;mailbox/htmlarea/images/ed_blank.gif0100644000567100000120000000007010020710424017445 0ustar jcameronwheelGIF89a€˙˙˙!ů,„ŠËíٜ´Ú‹łŢœ;mailbox/htmlarea/images/ed_charmap.gif0100644000567100000120000000021710020710424017774 0ustar jcameronwheelGIF89a˘€€ŔŔŔ€€€˙˙˙˙˙˙˙˙!ů,TxşÜŢ">ƒ•ł†ÁŻ ĆĹ ‚|ŒzĽečŃžŚ ĹRD@ż@$'3f‘ ¸;ö|€§hYŽĐčPgíݒ"×ô Od%˜ůĚłßđ8<;mailbox/htmlarea/images/ed_color_bg.gif0100644000567100000120000000026510020710424020152 0ustar jcameronwheelGIF89ał „{„„„{{{˙˙˙˙˙˙˙˙˙˙˙˙˙˙!ů ,bpÉIŤ•JÝ­óśž÷MZ˘ÚXšËĽŐş(ƒP8Ž-I‚ †ŕ @`z$`P@,wœmzP4ľÓa+O’Ťľ= ž€0)*˜ş?„|@¨Ť+9BP'Ü)RT6#„…;mailbox/htmlarea/images/ed_color_fg.gif0100644000567100000120000000025310020710424020153 0ustar jcameronwheelGIF89ał „{„„„{{{˙˙˙˙˙˙˙˙˙˙˙!ů ,XPÉI+M8k+Óħx9Š—‰ŚŤpťŢ`ÜCĄ´bß]Wy 0$’2ĐPA rĐÀ °ZG°R€ ΂Ú[œ5Íƒď­ź^;mailbox/htmlarea/images/ed_copy.gif0100644000567100000120000000015610020710424017335 0ustar jcameronwheelGIF89a‘€˙˙˙˙˙˙!ů,?œŠËŰ ˘Š'ľ4ČŢâ¨l` b>čŠ"f…>*é\ЛĆyZƒPa€l!žň¤I‰™ŞőŠ(;mailbox/htmlarea/images/ed_custom.gif0100644000567100000120000000010310020710424017665 0ustar jcameronwheelGIF89a€˙˙˙!ů,ŒŠËíă@J%ŽqŰüqÖx‰IŚęj;mailbox/htmlarea/images/ed_cut.gif0100644000567100000120000000013310020710424017151 0ustar jcameronwheelGIF89a‘€˙˙˙!ů,,”ŠË÷œŇDqexťÎ\m`č!@”F ´UËŽM*Äő,Óô˘Ż;ăR ‡;mailbox/htmlarea/images/ed_delete.gif0100644000567100000120000000013210020710424017617 0ustar jcameronwheelGIF89a‘˙˙˙˙˙˙!ů,+”ŠËí`qžXSÖ؊˝tŸ×` #>ŸI†ŮÉI—ʤW ÁcˆŤTď  ;mailbox/htmlarea/images/ed_format_bold.gif0100644000567100000120000000011210020710424020643 0ustar jcameronwheelGIF89a€˙˙˙!ů,!ŒŠËí˙€œ2Ö0]ƗííQ]ŕňJZ’"ÇňL3;mailbox/htmlarea/images/ed_format_italic.gif0100644000567100000120000000011510020710424021173 0ustar jcameronwheelGIF89a‘{{{„„„˙˙˙!ů,œŠË퍘3Ž,¨vÍE(X—đAeśî G;mailbox/htmlarea/images/ed_format_strike.gif0100644000567100000120000000011610020710424021230 0ustar jcameronwheelGIF89a€˙˙˙!ů,%ŒŠËí "ÓĹsm5›IüPY#•fř=[J"َvËT†öçL;mailbox/htmlarea/images/ed_format_sub.gif0100644000567100000120000000011610020710424020520 0ustar jcameronwheelGIF89a‘€˙˙˙!ů,”ŠËíďB0 Yíó—U !dyjŠ:–î ÇM;mailbox/htmlarea/images/ed_format_sup.gif0100644000567100000120000000011510020710424020535 0ustar jcameronwheelGIF89a‘€˙˙˙!ů,”ŠËm‹Ńú°…,ăa^¨‘âx‚ŸĆśî ˇ;mailbox/htmlarea/images/ed_format_underline.gif0100644000567100000120000000012510020710424021714 0ustar jcameronwheelGIF89a‘{{{˙˙˙!ů,&”ŠËí˙‚ bŇ&Ovť^üuL'.ä7†¨P˛D#Ö]ç:];mailbox/htmlarea/images/ed_help.gif0100644000567100000120000000010610020710424017306 0ustar jcameronwheelGIF89a€˙˙˙!ů,ŒŠËí˜ Ns_ÎQÖÎAĄřuć1jĺÉśîR;mailbox/htmlarea/images/ed_hr.gif0100644000567100000120000000010610020710424016767 0ustar jcameronwheelGIF89a‘333™™™˙˙˙!ů,”ŠËíٜ´‹ł>ĄűVâH–ćŠ;mailbox/htmlarea/images/ed_html.gif0100644000567100000120000000011310020710424017320 0ustar jcameronwheelGIF89a€˙˙˙!ů,"ŒŠËí0ňŐsWĆSmô}IŘy%xR)Ę:—ĹňL×G;mailbox/htmlarea/images/ed_image.gif0100644000567100000120000000022410020710424017441 0ustar jcameronwheelGIF89a˘€€€€€€€˙˙˙˙˙˙˙!ů,YxşÜţP™AŤĽ† ¸ď`ś ‚ažh *[V/!ĽVžřA(ŞÖż˜°6ş‚”B°7ęYH"Ťô<)LV z!­ŽŔALˇ|€´z-ޝ/j>Řď;mailbox/htmlarea/images/ed_indent_less.gif0100644000567100000120000000012710020710424020670 0ustar jcameronwheelGIF89a‘„˙˙˙!ů,(”Š믂lłJˆ@ś°Ýd€fV†Fˇ¨‹bŢxĹËÜŘúş÷P;mailbox/htmlarea/images/ed_indent_more.gif0100644000567100000120000000012710020710424020664 0ustar jcameronwheelGIF89a‘„˙˙˙!ů,(”Š믂lłJˆ@ś"°Ýd€fv€Gˇ„˘…fŢxĹËÜŘş¸÷P;mailbox/htmlarea/images/ed_left_to_right.gif0100644000567100000120000000013110020710424021205 0ustar jcameronwheelGIF89a‘„˙˙˙!ů,*”ŠËíS˜  D^ŔŹUÝGmJ7j™™ WČyÇZ)t˛Ď÷ţ);mailbox/htmlarea/images/ed_link.gif0100644000567100000120000000014110020710424017312 0ustar jcameronwheelGIF89a‘€€€˙˙˙˙˙˙!ů,2œŠËíă˘Vc+84„Syŕ6_† ¨ćgPĺL§Ů:М†d~+e~’˘ńˆL2 ;mailbox/htmlarea/images/ed_list_bullet.gif0100644000567100000120000000012010020710424020674 0ustar jcameronwheelGIF89a‘„˙˙˙!ů,!”ŠËßÔ&Ř{ьźű´}!FjЇŚŕédv„ęLs;mailbox/htmlarea/images/ed_list_num.gif0100644000567100000120000000012210020710424020206 0ustar jcameronwheelGIF89a‘„˙˙˙!ů,#”ŠË˝Ŕ3ĄZ›&tr{Ř}u]™hHŠŞŹVš§˛śX;mailbox/htmlarea/images/ed_paste.gif0100644000567100000120000000021310020710424017471 0ustar jcameronwheelGIF89a˘€€€€€€˙˙˙˙˙˙˙˙!ů,PhşÜţЕY˘Ąs \YPlcb˘R˜^ Gěb‚ř‰żŸ.ü@OŽÇŸ'0" FýA*Śó™TQŻA¨ łĺJÁôŮÂn+;mailbox/htmlarea/images/ed_redo.gif0100644000567100000120000000012010020710424017303 0ustar jcameronwheelGIF89a‘€€€€˙˙˙!ů,!”ŠËíď@˜J4OM›‹ě-”Ňacr™'@î ÇňLż;mailbox/htmlarea/images/ed_right_to_left.gif0100644000567100000120000000013010020710424021204 0ustar jcameronwheelGIF89a‘„˙˙˙!ů,)”ŠËí˙‚ p ŠŔ˛Ř­pdžF–á5~Í™Š œ˝,dĐřÎ÷~R;mailbox/htmlarea/images/ed_save.gif0100644000567100000120000000021710020710424017317 0ustar jcameronwheelGIF89a˘ÜÜ܀€€€€˙˙˙˙˙˙!ů,TXşÜţP‘I+mDÁű 0ŮćqT,ĺ‰j*ŤšźJł[Ƹfe6™`H,ŠnĄáoěMÜQ(ŞJyI”œ*śË˛˜ĎhóXhťßíˆ<;mailbox/htmlarea/images/ed_show_border.gif0100644000567100000120000000015010020710424020672 0ustar jcameronwheelGIF89a‘3™˙˙˙!ů,9”ŠËíc˜´Ú`Řźw,h޸蔥íšg:Ÿ,­ć™éöŤŒŤĹx+]ŹU„ÝXÂÚňe;mailbox/htmlarea/images/ed_splitcel.gif0100644000567100000120000000021710020710424020200 0ustar jcameronwheelGIF89a˘€˙˙˙˙˙˙˙˙!ů,THşÜţ0ĘIŤ#ëÍÇ‚†áHzÎh–důupö•őŁj €_°Ćc¨Č¤P\l„PâL”ĂŮŹŚâ¸\j ŞŞŘöőՆŔ_9ť¸ßđx%;mailbox/htmlarea/images/ed_undo.gif0100644000567100000120000000012110020710424017320 0ustar jcameronwheelGIF89a‘€€€€˙˙˙!ů,"”ŠËíc 4€EVíěy&Ž ČU¨ŃIŔ*ĹňL×L;mailbox/htmlarea/images/fullscreen_maximize.gif0100644000567100000120000000014110020710424021752 0ustar jcameronwheelGIF89a€˙˙˙!ů,8ŒŠíßXgŚ ]°pgĚT—Ɖճ…އŠŞyŻ•ĆryŇ÷j_pô‰Ô„]ˆX”PVš qš,;mailbox/htmlarea/images/fullscreen_minimize.gif0100644000567100000120000000014110020710424021750 0ustar jcameronwheelGIF89a€˙˙˙!ů,8ŒŠíżˆsŐÓ¤yŽĺzmXŚ•ŘF–šŚŞtuŒČş˘öĺ Ik ń8+p'4YŒÄ]ä™(;mailbox/htmlarea/images/insert_table.gif0100644000567100000120000000017110020710424020363 0ustar jcameronwheelGIF89a˘3™˙˙˙ĚĚĚ˙˙˙!ů,>HşÜţ„IŤ *€Í{ǒ'r` BŠŞéYží Ťĺ`ß8ţĘ|źÇ@Z&GźýXHWfĆäՊÄŇe:‰XŻŘl;mailbox/images/0040775000567100000000000000000010155247071013322 5ustar jcameronrootmailbox/images/.xvpics/0040755000567100000000000000000007516703375014725 5ustar jcameronrootmailbox/images/.xvpics/error.gif0100664000567100000000000000450507516703375016550 0ustar jcameronrootP7 332 #IMGINFO:48x48 Indexed (457 bytes) #END_OF_COMMENTS 48 48 255 I$IIŰśśśIH%IŰśśÚ%HI%ŰśÚś%HIIˇÚśś%HIIŰśśśI$IIŰśśŰI$   ťśŰ$I$IŰśÚˇ$IH%ŰÚśˇ$IHIˇÚśˇH%HIŰśśŰ$I$Iۀ ŰI ŕŕŕ ťÖ$II$ۜۜ$IIHˇÚˇś(EIHŰśˇśH)EHŰśˇÚ$I)D€ŕŕ I ŕŕŕŕŕť$IDIťÖśť$IHEŰśşˇD)HI׺ś×$I(IŰśÖˇ(Eŕŕŕŕŕ Űś`ŕŕŕŕŔťśÖś)DI)ŰśÖş%HEIťÖşśE(IEŰśşśEH)I׺ŕŕŕŕ€)ŰśśŕŕŕŕŕŔťśśD)IIÖťśÖ(E)IÚˇÖş$IE)ÚˇÖş$IIEş€ŕŕŕ )DŰśśś ŕŕŕŕŕťÖ$I)H׺ל$I’ÚťÖrÖ(EIIş×śş$IEŕŕŕŕŕ )HIŰśśśI€ŕŕŕŕ Ű$ID)ŰśÖť$’Ú˙Ű˙ś‘%IHEťÚśˇD)Iŕŕŕŕ€)DIII$IIŰśŕŕŕŕŕ ŰśśśID)Iß˙˙˙˙ŰűLۡÖ(E)HŰś€ŕŕŕ )ÖťśÖI$IIŰśś ŕŕŕŕŕťśÖq×˙˙˙˙˙˙˙˙˙˙˙˙Úˇ‘%HIŕŕŕŕŕ )IÖťśÖI$IIŰśśś€ŕŕŕŕŔ„’ť˙˙˙˙˙˙˙˙˙˙˙˙˙úß×qD)ŕŕŕŕ€)IDۡşÖI$IIŰśśśIŕŕŕŕŕäßű˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ťˆ€ŕŕŕ )D)Iۜ֡ۜśśI$IIŰś ŕŕŕŕŕö˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŕŕŕŕŕ€IśŰśśD)IIŰśśśI$IIŰmöíŕŕŕŕĺő˙˙˙˙˙˙˙˙˙˙˙˙˙˙÷ŕŕŕŕ휎ş×śş$IEIŰśśśI$IIm˙˙öŕŕŕŕŕĺ˙˙˙˙˙˙˙˙˙˙˙˙˙úęŕŕŕíűÚßiŰśşD)EIŰśśś’Ú˙˙˙˙˙˙˙éŕŕŕŕŕö˙˙˙˙˙˙˙˙˙˙ŕŕŕŕŕé˙˙˙˙˙˙ťÖqEIHI$I’Űţ˙˙˙˙˙˙˙÷ěŕŕŕŕĺö˙˙˙˙˙˙˙˙÷ŕŕŕŕíű˙˙˙˙˙˙Ű˙śşÖˇI$IŰ˙Ú˙Ű˙ŰţŰ˙Űöŕŕŕŕŕäß˙űßţŰ˙öíŕŕŕÉ÷Ţűßűßúß˙űÚˇşśI$I˙˙˙˙˙˙˙˙˙˙˙˙˙éŕŕŕŕŕö˙˙˙˙ŕŕŕŕŕé˙˙˙˙˙˙˙˙˙˙˙˙’ÚˇI$I˙ś’˙ś’śŰڒŰÚ˙űčŕŕŕŕéň˙˙űŕŕŕŕíű˙˙˙˙]]}]ýž’֝ۜś˙ś’˙ś’śÚےÚŰ˙˙úŕŕŕŕŕĺ˙úéŕŕŕíű˙˙˙˙˙]\Xđ\}’$IŰśś˙’mmŰśmŰś˙˙˙˙˙˙˙éŕŕŕŕŕŕŕŕŕé˙˙˙˙˙˙˙]Tŕôý’DIŰśś˙ŰÚś˙˙ś˙Ű˙˙˙˙˙˙˙úéŕŕŕŕŕŕŕňö˙˙˙˙˙˙˙]\p\Ž(IŰśś˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŕŕŕŕŕŕéű˙˙˙˙˙˙˙˙\\]˛(EI$I˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŕŕŕŕŕŕ˙˙˙˙˙˙˙˙˙˙]}’ş×I$I˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙űŕŕŕŕŕŕéíň˙˙˙˙˙˙˙\}’ş×I$I˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙űčŕŕŕŕŕŕŕŕé˙˙˙˙˙˙˙ž\^|^|^’ŰśI$I˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙ŕŕŕŕŕé˙éŕŕŕŕ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙’ڡۜś˙˙˙˙˙˙˙˙˙˙˙˙˙˙öŕŕŕ੭ťÍŠŕŕŕéíň˙˙˙˙˙˙˙˙˙˙˙˙‘EIŰśś˙˙˙˙˙˙˙˙˙˙˙˙˙öíŕŕŕĹąˇ‘ˇąŕŕŕŕŕä˙˙˙˙˙˙˙˙˙˙˙˙’HIŰśś˙˙Ű˙ś‘ś’’’‘ŰŕŕŕŕŕÄ˙ś’˙śť­Éŕŕŕŕ’–‘˙˙˙’˛‘˙˙˙’(IŰśś˙˙Ű˙śśÚˇľŰśŽŕŕŕŕí×˙ľˇ˙śś’öíŕŕŕÄÉ͡ßúŰŰÚś˙˙rDII$I˙˙Ű˙śÚ˙śˇ˙ŃĽŕŕŕíűÚ˙ś×ږś’űúŕŕŕŕŕé–ŰÚ˙˙˙’Ű˙‘ŰśI$I˙˙Ű˙śÚ˙śˇŕŕŕŕŕé–Ű˙‘űť˙ś‘˙˙˙’äŕŕŕŕŕűÚ˙˙˙’Ű˙‘ˇÚI$I˙˙Ű˙śÚ˙śŽŕŕŕŕÉ­ß˙˙Űśśś’ś˙˙˙’ŃîŕŕŕŕčîťśśŰ˙˙‘ˇÚI$I˙˙Ű˙ÚŰ˙ŃĽŕŕŕíŇş˙˙˙˙׺śśˇ˙˙˙ľ˙÷ŕŕŕŕŕ麡ś˙˙˙‘ۜۜś˙ś’˙˙˙ŕŕŕŕŕé˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙éŕŕŕŕŕö˙˙˙˙’HIŰśś˙˙Ú˙˙÷ŕŕŕŕíű˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙öíŕŕŕŕĺö˙˙˙qEIŰśś˙˙˙˙úéŕŕŕí÷˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙úŕŕŕŕŕé˙˙˙’H)Űśś˙˙˙ŕŕŕŕŕé˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙éŕŕŕŕŕö˙’H)I$IŰśŃŕŕŕŕŠÎşśˇśśşÖˇśśśśťśÖśśˇśśşÖˇśśąĹŕŕŕŕéַ͖I$ImŽČŕŕŕ€imjmmMmjmmMmjmmMmnimMmnimmMn„ŕŕŕŕŕĹMŰśI$Iŕŕŕŕŕ )IDŰśťśD)IH׺ˇÖ(E)Hۜל(IE(ۜ׺ ŕŕŕŕŕťśI$Iŕŕŕŕ€)IDIŰśşˇD)HEŰśş×$I(I׺֡(EH)ŰśÖˇ( ŕŕŕ໶۶`ŕŕŕ )ÖťÖś$II)ÚˇÖś(EIIş×śşD)EIÚˇşśDI)EÚˇŕŕŕŕ€)ۀŕŕŕ )DŰśťÖ$I)H׺ˇÖ$II(ۜל(EIHťÖˇş$IEHŰśť ŕŕŕ€Ű€ŕŕ€)DIŰśśŰ$I(EŰśÚˇ$IH)׺֡$IHIťÖśˇH%HIŰśśť€ŕŕ Űś€ )DIIŰśśśI(EIŰśśÚ%H)EŰśÚś%HI)׺֜%HIIťÖśśI €Imailbox/images/attach.gif0100644000567100000120000000011510441731712015367 0ustar jcameronwheelGIF89a ĄŔŔŔç+˜˙˙˙!ů, \>Š#›zK4ƒŤËŞI1Չ '$&hg ;mailbox/images/boxes.gif0100644000567100000120000000055707244671136015267 0ustar jcameronwheelGIF89a00ăĚĚĚ˙˙˙™™™fff˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙!ţMade with GIMP!ů,00ţÉIŤ˝8ëÍť˙`(Ždiž¨Ź@ŽAŹ.Ë8][7îĎ­˘÷+ęPĢhJ.ŸÇóIevŚŐl”Čz—[I÷KV'Ź´zÍnťŁă˛Ü' tƒ>×Ďeuh^‚…‡bz}“‰8‚†v•U—„œO—›ˆŁKĽŚ§ĄŞŤE—‚Š‘˛_C¸š˘dÁż2ÁYşqš†żĹ†^Ç1ËÂÂĘĂŃÍŃŘÄĚśť×ĐĐĂŢŐÍŢßáŐžäŐáćÔăçäęéăĘÄíŰËöđÜcůęÔ8¤í›î\:^OžmCXäC*.‰(ąĄ3jܨQˆÇ CŠI˛¤É ;mailbox/images/p1.gif0100644000567100000120000000006707212006465014453 0ustar jcameronwheelGIF89a €˙˙˙˙!ů, Lf¨—Ęŕ[ÓľŘn;mailbox/images/p2.gif0100664000567100000120000000006707212006522014450 0ustar jcameronwheelGIF89a €ş˙˙˙!ů, Lf¨—Ęŕ[ÓľŘn;mailbox/images/read.gif0100664000567100000120000000007707305572775015070 0ustar jcameronwheelGIF89a €˙˙˙!ů, Œ€ şÖމ’7qsîîöA;mailbox/images/special.gif0100664000567100000120000000007607307026745015565 0ustar jcameronwheelGIF89a €˙˙˙˙˙!ů, „§šěN›TŇŚ.ś—ë5=ˆ,;mailbox/images/error.gif0100644000567100000000000000071107516703375015147 0ustar jcameronrootGIF89a00ăĚĚĚ˙˙˙™™™fff˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙!ů,00ţÉIŤ˝8SÍţ ŐIžZI–ęN,żč,Ť4ho;ü€P‡ťüČŔ/UİZ”crş53ωtĘUoŚÓsŰ-/‡Ÿgy=EëXěľ[sTÇŰ%ď‰lżĂ“U>e}ry]Qq…\k_Z@’“c“,–™ŠwŒŽqŠŁ¤ŁĽH}ŸHŽŽĄZœIjŹ­°˛´ƒŚĽ§„OkŻł›śŞĹlČą˝ÍΝšSČĚľÖχÇŰŰŽŢżŕ×ĐeČŻçƒÖĹ✾đň‡Řköń~% `´ŻţÎ"؅’„ŞăqÖB€ f|×Ϣǁwy>´¨FäHŽ#ýyü#2b8U~ÜdŇ•-e‚ ™'͏eÎr9˛äF‡_H7qiCEőqb„ô=Ś…Ş6eÚĺSUŠéěđ 4˘Ůłh#> heD&n+Ěy &̊¸táڝ›—H˜+}őŢ ě/áˇ;mailbox/images/box.gif0100664000567100000000000000007410177536434014607 0ustar jcameronrootGIF89a €˙˙˙!ů , ŒŠ űLd´Ę4CÖözć,b;mailbox/images/dsn.gif0100664000567100000000000000007410177536375014607 0ustar jcameronrootGIF89a €˙˙˙!ů , ŒŠ űLdg֛œĹawzK;mailbox/images/icon.gif0100644000567100000000000000047207431332656014746 0ustar jcameronrootGIF89a00ăĚĚĚ˙˙˙™™™fff˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙!ů,00çÉIŤ˝8ëÍť˙`(ŽdižhŞŽlëžptmßxŽëüŔ pH,˝Ŕ` \6•Ć(@ĽäÄ'íFŤƒŤ•ř–L'Ó+­ąl’MşŻäy˝N8Ür[{{}~y‚ƒtnUf@NChiŠBe\M“hš›“?ž›A—™”jjO˘ ŠŚŁzižšœ°˘”@¤]œ•Gzźƒšł§ŸŤÂťDÁOĆP§kËPEĘŇĐĐŐÂŮ×˝‰Ť´ÍąÍޑɾżuÔçtéę^ěíR¤óôőö÷řůř2üýţ˙ H° Áƒ7D;mailbox/images/red.gif0100664000567100000000000000007710155247071014564 0ustar jcameronrootGIF89a €˙˙˙˙!ů , Œ ÇŹŕJŇT 1zóÚżu VQI;mailbox/lang/0040775000567100000120000000000010443355731013125 5ustar jcameronwheelmailbox/lang/de0100664000567100000120000003677210354756772013467 0ustar jcameronwheelacl_all=Alle acl_any=Jede Adresse acl_apath=Beschränke Dateien und Programme auf Verzeichnis acl_asame=Verwende Benutzernamen acl_attach=Maximale Gesamtdateianhanggröße acl_canattach=Darf Dateien vom Serverdateisystem anhängen? acl_candetach=Darf Dateianhänge im Serverdateisystem speichern? acl_dir=Darf E-Mail-Dateien lesen in Verzeichnis acl_dirauto=Entscheide automatisch (überall, wenn alle Benutzer sichtbar sind, ansonsten nirgends) acl_faddrs=Aufgeführte Adressen acl_fdom=Jede Adresse @ Domain acl_fdoms=Mailbox @ Domains acl_from=Adressen, die für Absenderadressen (FROM) erlaubt sind acl_fromname=Realname für die Absenderadresse (FROM) acl_none=Kein acl_read=Benutzer, deren Post gelesen werden kann acl_same=Benutzer mit dem gleichen Namen acl_sec=Sekundäre Gruppen einbeziehen? acl_sent=Speichere versendete E-Mail in E-Mailbox acl_users=Nur diese Benutzer acl_userse=Alle, außer diese Benutzer acl_usersg=Mitglieder der Gruppen acl_usersm=Benutzer passend zu/auf acl_usersu=Mit UID im Bereich black_already=Die E-Mail-Adresse $1 befindet sich bereits auf der Liste der durch SpamAssassin abgewiesenen Adressen black_done=Die E-Mail-Adresse wurde der Liste der durch SpamAssassin abgewiesenen Adressen hinzugefügt. black_title=Absender verbieten compose_title=Schreibe E-Mail confirm_ok=Lösche jetzt confirm_title=Löschen bestätigen confirm_warn=Sind Sie sicher, daß Sie die ausgewählten $1 E-Mails löschen wollen? confirm_warn2=Aufgrund der Größe und des Formates Ihrer E-Mailbox wird dies ein wenig dauern. Während des Löschvorganges sollten keine anderen Aktionen stattfinden. Bitte ein wenig Geduld ... confirm_warn3=Sind Sie sicher, daß Sie diese E-Mail löschen wollen? confirm_warn4=Während des Löschvorganges sollten keine anderen Aktionen stattfinden. Bitte ein wenig Geduld ... confirm_warnall=Sind Sie sicher, daß Sie alle E-Mails in diesem Ordner löschen wollen? delete_ebnone=Es wurde keine E-Mail zum Ablehnen ausgewählt delete_ecannot=Sie dürfen keine E-Mails von diesem Benutzer löschen delete_ecopycannot=Sie dürfen keine E-Mails zu dem ausgewählten Benutzer kopieren delete_ecopynone=Es wurde keine E-Mail für den Kopiervorgang ausgewählt. delete_ecopyuser=Der Benutzer, zu dem Sie E-Mails kopieren wollen, existiert nicht delete_efnone=Es wurde keine E-Mail für den Weiterleitungsvorgang ausgewählt. delete_ehnone=Keine E-Mail wurde für den Report als Nicht-Spam ausgewählt delete_emnone=Es wurde keine E-Mail für den Markierungsvorgang ausgewählt. delete_emovecannot=Sie dürfen keine E-Mails zu dem ausgewählten Benutzer verschieben delete_emovenone=Es wurde keine E-Mail für den Verschiebevorgang ausgewählt. delete_emoveuser=Der Benutzer, zu dem Sie E-Mails verschieben wollen, existiert nicht delete_enone=Es wurde keine E-Mail für den Löschvorgang ausgewählt. delete_ereport=Konnte nicht als Spam melden : $1 delete_ernone=Es wurde keine E-Mail für den Spam-Report ausgewählt delete_errc=Konte E-Mail nicht kopieren delete_errm=Konnte E-Mail nicht verschieben delete_ewnone=Keine E-Mail wurde für die Whitelist ausgewählt delete_nobutton=Es wurde kein Button angeklickt delete_ok=Jetzt löschen delete_rusure=Sind Sie sicher, daß Sie die ausgewählten $1 E-Mails aus/von $2 löschen wollen? Aufgrund der Größe und des Formates dieser E-Mailbox wird dies ein wenig dauern. Während des Löschvorganges sollten keine anderen Aktionen stattfinden. Bitte ein wenig Geduld ... delete_rusure2=Sind Sie sicher, daß Sie diese E-Mail aus/von $1 löschen wollen? Aufgrund der Größe und des Formates dieser E-Mailbox wird dies ein wenig dauern. Während des Löschvorganges sollten keine anderen Aktionen stattfinden. Bitte ein wenig Geduld ... delete_title=E-Mail löschen detach_edir=Es wurden weder Datei noch ein Verzeichnis für den Speichervorgang ausgewählt. detach_eopen=Fehler beim Öffnen von $1 : $2 detach_err=Konnte Datei nicht abhängen/löschen detach_ewrite=Fehler beim Schreibvorgang zu $1 : $2 detach_ok=Der Dateianhang wurde auf dem Server in die folgende Datei gespeichert $1 ($2). detach_title=Dateianhang speichern emodified=Dieser Order wurde seit dem aktuellen Einlesen verändert! Kehren Sie zur Liste der E-Mails zurück und starten Sie erneut. enew_title=E-Mail bearbeiten find_enone=Es wurden keine Benutzer gefunden, die der Suchanfrage entsprechen find_group=Gruppe find_home=Heimatverzeichnis find_real=Realname find_results=Benutzer, die auf das Suchmuster $1 passen ... find_size=E-Mail-Größe find_title=Suchergebnisse find_user=Benutzername folder_drafts=Entwürfe folder_inbox=Posteingang folder_sent=Versendete E-Mail folder_trash=Papierkorb forward_title=E-Mail weiterleiten ham_report=Diese Nachricht wird als Nicht-Spam an Razor und andere SpamAssassin-Datenbanken gemeldet .. ham_title=Als Nicht-Spam melden index_contains=beinhaltet index_empty=Keine E-Mail index_eperl=Das Perl-Modul $1, welches für den ausgewählten SMTP-Authentisierungsmodus nötig ist, ist nicht installiert oder es fehlt ein zur Ausführung abhängiges Modul. Klicken Sie hier um dieses zu installieren. index_equals=ist gleich index_esystem=Keiner der unterstützten E-Mailserver (Qmail, Postfix und Sendmail) wurde auf Ihrem System gefunden. Sie müssen die Modulkonfiguration manuell anpassen und dort den E-Mailserver und die zugehörigen Serverpfade eintragen. index_esystem2=Der in der Modulkonfiguration gesetzte E-Mailserver wurde auf ihrem System nicht gefunden. Sie müssen dort die Konfiguration so anpassen, daß der richtige E-Mailserver benutzt wird. index_file=Lese E-Mail in Datei: index_find=Finde Benutzer deren Benutzername index_header=Benutzer-E-Mailboxen index_none=Sie dürfen die E-Mails der Benutzer auf diesem System nicht lesen. index_return=Benutzerliste index_system0=E-Mailserver: Postfix index_system1=E-Mailserver: Sendmail index_system2=E-Mailserver: Qmail index_title=Lese Benutzer-E-Mail index_toomany=Es gibt mehr Benutzer auf Ihrem System, als hier angezeigt werden können. ldap_econn=Fehler beim Verbinden zum LDAP-Server $1 Port $2 ldap_elogin=Konnte nicht zum LDAP-Server $1 als $2 verbinden : $3 ldap_emod=Das fehlende Perl-Modul $1 wird benötigt, um sich via LDAP zu verbinden log_copymail=Es wurden $1 E-Mails von $2 nach $3 kopiert log_delmail=Es wurden $1 E-Mails von $2 gelöscht log_movemail=Es wurden $1 E-Mails von $2 nach $3 kopiert log_read=Lese E-Mail für $1 log_send=Es wurde eine E-Mail nach $1 versandt. mail_addresses=Adressbuch bearbeiten mail_advanced=Erweiterte Suche mail_all=Alle auswählen mail_bcc=Bcc mail_black=Absender blockieren mail_body=Textkörper mail_cc=Cc mail_compose=Schreiben mail_copy=Kopieren nach: mail_crypt=GnuPG-Verschlüsselung für: mail_date=Datum mail_delall=Alle löschen mail_delete=Löschen mail_deleteall=Alles löschen mail_deltrash=Papierkorb leeren mail_ecannot=Sie dürfen die E-Mails von diesem Benutzer nicht lesen mail_eexists=Die E-Mail existiert nicht mehr. Eventuell wurde Sie in der Zwischenzeit via POP3 abgerufen oder anderweitig von einem berechtigtem Benutzer gelöscht/verschoben. mail_efile=Die E-Mail-Datei existiert nicht mail_err=Beim Auflisten der E-Mails in diesem Ordner ist ein Fehler aufgetreten : $1 mail_fchange=Ändern mail_folder=Ordner mail_folders=Ordner bearbeiten mail_for=In $1 mail_for2=Für Benutzer $1 mail_forward=Weiterleiten mail_from=Von mail_fromsrch=Gleicher Absender .. mail_high=Hoch mail_highest=Höchste mail_indexlink=Zurück zur E-Mailbox mail_invert=Auswahl umkehren mail_jump=Springe zu Seite : mail_login=Login mail_logindesc=Sie müssen Benutzername und Passwort eingeben,
um Ihren Posteingang auf dem E-Mailserver $1 einsehen zu können. mail_loginheader=POP3-Server-Login mail_loginmailbox=IMAP E-Mailbox mail_loginpass=Passwort mail_loginuser=Benutzername mail_logout=Ändere POP3-Login mail_logout2=Ändere IMAP-Login mail_low=Niedrig mail_lowest=Niedrigste mail_mark=Markiere als: mail_mark0=Ungelesen mail_mark1=Gelesen mail_mark2=Spezial mail_match=passt auf mail_move=Verschieben nach: mail_nocrypt=<Nicht verschlüsseln> mail_none=Dieser Benutzer hat keine E-Mails in $1 mail_nonefrom=Kein mail_normal=Normal mail_nosign=<Nicht signieren> mail_of=von mail_ok=Suche mail_pos=E-Mails $1 bis $2 von $3 in $4 mail_pri=Priorität mail_replyto=Antworten an mail_reset=Löschen mail_return=Benutzer-E-Mailbox mail_return2=Benutzer-E-Mail mail_rfc=From-Zeile mail_samecrypt=<Schlüssel der Zieladressen> mail_search=Finde E-Mails wo mail_search2=Suche nach: mail_sent=In <Versendete E-Mail<-Liste mail_sig=Bearbeite Signatur mail_sign=Unterschreibe mit GnuPG-Schlüssel mail_size=Größe mail_subject=Betreff mail_subsrch=Gleicher Betreff .. mail_title=Benutzer-E-Mail mail_to=An mail_tosrch=Gleicher Empfänger .. mail_white=Erlaube Absender razor_deleted=.. erledigt. Die E-Mail wurde gelöscht. razor_done=.. erledigt razor_err=.. gescheitert! Oben sehen Sie warum. razor_report=Diese Nachricht wird sowohl der Razor- als auch anderen durch SpamAssassin genutzten Anti-Spam-Datenbanken gemeldet. razor_title=Als Spam melden reply_attach=Weitergeleitete Anhänge reply_attach2=Client- und serverseitige Anhänge reply_body=E-Mail-Text reply_draft=Speichern als Entwurf reply_ecannot=Sie dürfen keine E-Mails im Namen dieses Benutzers versenden reply_errc=Konnte E-Mail nicht kopieren reply_errm=Konnte E-Mail nicht verschieben reply_headers=E-Mail-Header reply_mailforward=Weitergeleitete E-Mails reply_send=E-Mail versenden reply_spell=Auf Rechtschreibfehler prüfen? reply_title=Auf E-Mail antworten search_all=In allen Ordnern search_allstatus=Jede search_ecannot=Sie dürfen die E-Mail dieses Benutzers nicht durchsuchen search_efield=Sie müssen eine Such-/Abfrageart angeben. search_elatest=Fehlende oder ungültige Anzahl an E-Mails für die Suche search_ematch=Sie müssen einen Text für die Suche/Abfrage angeben. search_enone=Sie haben keinerlei Suchkriterien angegeben search_ewhat=Sie haben keinen Text für die Suche/Abfrage der Spalte $1 angeben. search_latest=Zu durchsuchende E-Mails search_latestnum=Nur die neuesten search_limit=(der letzten $1 E-Mails) search_local=In lokalen Ordnern search_nolatest=Alle im Ordner search_none=Es wurden keine E-Mails gefunden. search_onestatus=Nur Status search_results2=$1 E-Mails passen auf $2 search_results3=$1 E-Mails passen nicht auf $2 search_results4=$1 E-Mails passen auf Ihre Suchanfrage search_status=Mit Status search_title=Suchergebnisse search_withstatus=, mit Status $1 send_draft=Die E-Mail an $1 wurde als Entwurf gespeichert. send_eattach=Die Dateianhänge dürfen zusammen nicht mehr als $1 KiB groß sein. send_eattachsize=Die Dateianhänge überschreiten die maximal erlaubte Größe von $1 bytes. send_ecannot=Sie dürfen im Namen dieses Benutzers keine E-Mail versenden send_ecrypt=Konnte E-Mail nicht verschlüsseln : $1 send_efile=Konnte Dateianhänge nicht lesen $1 : $2 send_efrom=Fehlende Absenderadresse (FROM) send_ekey=Konnte den Schlüssel für die E-Mail-Adresse $1 nicht finden send_eline=In Zeile $1: send_epass=Sie können diese E-Mail nicht signieren, da Sie noch keine Passphrase im GnuPG-Modul hinterlegt haben. send_epath=Das Sendmail-Binary $1 existiert nicht. send_eperms=Benutzer $1 kann $2 nicht lesen send_eperms2=Sie dürfen die Datei $1 nicht versenden send_err=Konnte E-Mail nicht versenden send_esign=Konnte E-Mail nicht signieren : $1 send_esmtp=SMTP-Kommando $1 gescheitert : $2 send_espell=Die folgenden Rechtschreibefehler wurden in Ihrer E-Mail gefunden .. send_eto=Fehlende Empfängeradresse (TO) send_eword=Falsch geschriebenes Wort $1 send_eword2=Falsch geschriebenes Wort $1 - Mögliche Korrektur $2 send_ok=E-Mail erfolgreich versandt an $1 send_title=E-Mail versandt sform_all=<Alle Ordner> sform_and=Finde E-Mails bei denen folgende Kriterien zutreffen ... sform_body=E-Mail-Textkörper sform_cc=Cc:-Zeile sform_date=Datum:-Zeile sform_folder=in Ordner(n) sform_from=From:-Zeile sform_headers=Jegliche Header-Zeile sform_local=<Lokale Ordner> sform_neg0=beinhaltet sform_neg1=beinhaltet nicht sform_ok=Jetzt suchen sform_or=Finde E-Mails, wo irgendeine der folgenden Kritierien zutreffen .. sform_return=Erweitertes Suchformular sform_size=Nachrichtengröße sform_subject=Betreff:-Zeile sform_text=den Text sform_title=Erweiterte Suche sform_to=To:-Zeile sform_where=Wo view_allheaders=Zeige alle E-Mail-Header an view_ashtml=Zeige E-Mail als HTML an (Kann gefährlich sein!) view_astext=Zeige E-Mail als Text an (Explizit empfohlen) view_attach=Dateianhänge view_black=Diesen Absender in die Blacklist aufnehmen! view_body=E-Mail-Text view_crypt=GnuPG-E-Mail-Entschlüsselung view_crypt_1=Diese E-Mail ist verschlüsselt, jedoch wurde GnuPG nicht gefunden oder es ist nicht richtig installiert. view_crypt_2=Konnte E-Mail nicht entschlüsseln : $1 view_crypt_3=E-Mail erfolgreich entschlüsselt. view_crypt_4=Der verschlüsselte Anteil dieser E-Mail wurde erfolgreich entschlüsselt. view_dall=<Alle Dateien> view_delete=Löschen view_desc=E-Mail $1 in $2 view_desc2=E-Mail $1 des Benutzers $2 view_desc3=E-Mails $1 view_detach=Dateianhang speichern: view_diagnostic-code=Grund des Fehlers view_dir= in eine Serverdatei oder -Verzeichnis: view_dstatus=Status des gescheiterten Versands view_dstatusok=Erfolgreicher Übertragungsstatus view_ecannot=Sie dürfen die E-Mails dieses Benutzers nicht lesen view_egone=Die E-Mail existiert nicht mehr. Eventuell wurde Sie in der Zwischenzeit via POP3 abgerufen oder anderweitig von einem berechtigtem Benutzer gelöscht/verschoben. view_enew=Als neu bearbeiten view_final-recipient=Entgültiger Empfänger view_folder=Zurück zur E-Mailbox view_forward=Weiterleiten view_gnupg=GnuPG-Signatur-Überprüfung view_gnupg_0=Die Signatur von $1 ist gültig. view_gnupg_1=Die Signatur von $1 ist gültig, aber es konnte kein Vertrauensstatus erkannt werden. view_gnupg_2=Die Signatur von $1 ist NICHT gültig. view_gnupg_3=Die Schlüssel-ID $1 ist nicht in Ihrer Liste, ergo kann keine GnuPG-Signatur-Überprüfung statfinden. view_gnupg_4=Konnte Signatur nicht überprüfen : $1 view_ham=Als Nicht-Spam melden view_headers=E-Mail-Header view_mark=Markiere als: view_mark0=Ungelesen view_mark1=Gelesen view_mark2=Spezial view_noheaders=Einfache Headeranzeige view_print=Drucken view_qdesc=E-Mail $1 in Warteschlange view_raw=Zeige Nachricht im Rohformat an view_razor=Als Spam melden view_razordel=Spam-Report und Löschen view_recv=Hole Schlüssel-ID $1 vom Keyserver. view_remote-mta=Entfernter E-Mail-Server view_reply=Anworten view_reply2=Allen antworten view_reporting-mta=Berichtender E-Mail-Server view_return=Original-E-Mail view_sent=E-Mail $1 in "Versendete E-Mail"-Liste view_strip=Entferne Dateianhänge view_sub=Angehängte E-Mail(s) view_title=E-Mail lesen view_white=Erlaube Absender white_already=Die E-Mail-Adresse $1 befindet sich bereits in der Whitelist von SpamAssassin. white_done=Die E-Mail-Adresse $1 wurde der Whitelist von SpamAssassin hinzugefügt. white_title=Erlaube Absender mailbox/lang/en0100664000567100000120000003272010435240103013436 0ustar jcameronwheelindex_title=Read User Mail index_none=You are not allowed to read email for any users on this system. index_header=User mailboxes index_empty=No mail index_return=user list index_esystem=None of the supported mail servers (Qmail, Postfix and Sendmail) were detected on your system. You will need to adjust the module configuration to set the mail server and possibly mail paths manually. index_esystem2=The mail server set in the module configuration was not found on your system. You will need to adjust the configuration to use the correct server. index_esystem3=An error occurred contacting the mail system set in the module configuration : $2. index_system2=Mail server: Qmail index_system1=Mail server: Sendmail index_system0=Mail server: Postfix index_toomany=There are too many users on your system to display on one page. index_find=Find users where username index_equals=equals index_contains=contains index_eperl=The Perl module $1 needed for the selected SMTP authentication mode is not installed or is missing a dependent module. Click here to install it now. index_file=Read Mail in File: index_nousers=No users were found! index_nousersmail=No users with email were found. mail_title=User Email mail_from=From mail_date=Date mail_subject=Subject mail_to=To mail_cc=Cc mail_bcc=Bcc mail_pri=Priority mail_highest=Highest mail_high=High mail_normal=Normal mail_low=Low mail_lowest=Lowest mail_for=In $1 mail_for2=For user $1 mail_sent=In sent mail list mail_size=Size mail_level=Score mail_delete=Delete mail_compose=Compose mail_open=Open mail_return=user mailbox mail_pos=Messages $1 to $2 of $3 in $4 mail_none=This user has no messages in $1 mail_ecannot=You are not allowed to read this user's email mail_all=Select all. mail_invert=Invert selection. mail_nosort=Reset sorting. mail_search=Find messages where mail_body=Body mail_match=matches mail_ok=Search mail_nonefrom=None mail_mark=Mark as: mail_mark0=Unread mail_mark1=Read mail_mark2=Special mail_forward=Forward mail_move=Move to: mail_copy=Copy to: mail_rfc=From line mail_eexists=Message no longer exists! mail_fchange=Change mail_indexlink=Return to mailbox mail_deleteall=Delete All mail_black=Deny Senders mail_white=Allow Senders mail_efile=Mail file does not exist mail_fromsrch=Same sender.. mail_subsrch=Same subject.. mail_tosrch=Same recipient.. mail_unknown=Unknown mail_sign=Sign with key: mail_nosign=<Don't sign> mail_crypt=Encrypt for: mail_nocrypt=<Don't encrypt> mail_samecrypt=<Keys from destination addresses> mail_addresses=Manage Address Book mail_folders=Manage Folders mail_err=An error occurred listing mail in this folder : $1 mail_loginheader=POP3 server login mail_logindesc=You must enter a username and password to access mail
in your inbox on the mail server $1. mail_loginuser=Username mail_loginpass=Password mail_loginmailbox=IMAP mailbox mail_login=Login mail_reset=Clear mail_logout=Change POP3 login mail_logout2=Change IMAP login mail_sig=Edit Signature mail_jump=Jump to page : mail_of=of mail_replyto=Reply to mail_folder=Folder mail_delall=Delete All mail_deltrash=Empty Trash mail_search2=Search for: mail_search3=Find with score above: mail_advanced=Advanced Search mail_return2=User Email mail_esystem=An error occurred contacting the mail system : $1. This must be fixied by the system administrator. view_title=Read Email view_desc=Message $1 in $2 view_desc2=Message $1 for user $2 view_desc3=Message $1 view_sent=Message $1 in sent mail list view_qdesc=Queued message $1 view_headers=Mail headers view_body=Message text view_allheaders=View all headers view_noheaders=View basic headers view_attach=Attachments view_reply=Reply view_reply2=Reply to all view_enew=Edit as new view_forward=Forward view_delete=Delete view_print=Print view_strip=Remove Attachments view_ecannot=You are not allowed to read this user's email view_mark=Mark as: view_mark0=Unread view_mark1=Read view_mark2=Special view_return=original email view_sub=Attached Email view_egone=This message no longer exists view_eugone=This user does not exist view_gnupg=GnuPG signature verification view_gnupg_0=Signature by $1 is valid. view_gnupg_1=Signature by $1 is valid, but trust chain could not be established. view_gnupg_2=Signature by $1 is NOT valid. view_gnupg_3=Key ID $1 is not in your list, so signature could not be verified. view_gnupg_4=Failed to verify signature : $1 view_crypt=GnuPG mail decryption view_crypt_1=Message is encrypted, but GnuPG support is not installed. view_crypt_2=Failed to decrypt message : $1 view_crypt_3=Mail was successfully decrypted. view_crypt_4=Encrypted portion of message was successfully decrypted. view_recv=Fetch key ID $1 from keyserver. view_folder=Return to mailbox view_detach=Detach file: view_dall=<All files> view_dir=to server file or directory: view_black=Deny Sender view_white=Allow Sender view_razor=Report As Spam view_ham=Report As Ham view_razordel=Report and Delete view_dstatus=Failed delivery status view_dstatusok=Successful delivery status view_final-recipient=Final recipient view_diagnostic-code=Reason for failure view_remote-mta=Remote mail server view_reporting-mta=Reporting mail server view_astext=View as text view_ashtml=View as HTML view_raw=View raw message compose_title=Compose Email reply_title=Reply to Email forward_title=Forward Email enew_title=Edit Email reply_headers=Mail headers reply_attach=Forwarded attachments reply_mailforward=Forwarded messages reply_attach2=Client and server-side attachments reply_send=Send Mail reply_ecannot=You are not allowed to send mail as this user reply_body=Message text reply_errc=Failed to copy mail reply_errm=Failed to move mail reply_return=compose mail reply_efwdnone=None of the forwarded messages exist reply_spell=Check for spelling errors? reply_draft=Save as Draft send_err=Failed to send mail send_eto=Missing To address send_efrom=Missing From address send_esubject=Missing email subject send_title=Mail Sent send_ok=Mail sent successfully to $1 send_sending=Sending mail to $1 .. send_ecannot=You are not allowed to send mail as this user send_esmtp=SMTP command $1 failed : $2 send_eattach=Attachments cannot total more that $1 kB in size. send_eperms=User $1 cannot read $2 send_eperms2=You are not allowed to send file $1 send_epath=Sendmail executable $1 does not exist. send_efile=Failed to read attachment $1 : $2 send_done=.. done. send_epass=You cannot sign a message because your passphrase has not be setup yet in the GnuPG module. send_esign=Failed to sign message : $1 send_ekey=Couldn't find key for email address $1 send_ecrypt=Failed to encrypt message : $1 send_eword=Misspelt word $1 send_eword2=Misspelt word $1 - possible corrections $2 send_eline=In line $1 : send_espell=The following spelling errors were found in your message .. send_draft=Mail to $1 saved in drafts folder. send_drafting=Saving mail to $1 in drafts folder .. send_eattachsize=The mail attachment exceeded the maximum allowed size of $1 bytes delete_title=Delete Mail delete_rusure=Are you sure you want to delete the $1 selected messages from $2? This may take some time for a large mail file. Until the deletion has finished, no other action should be performed. delete_rusure2=Are you sure you want to delete this message from $1? This may take some time for a large mail file. Until the deletion has finished, no other action should be performed. delete_ok=Delete Now delete_ecannot=You are now allowed to delete mail from this user delete_enone=No mail selected to delete delete_emnone=No mail selected to mark delete_efnone=No mail selected to forward delete_ebnone=No mail selected to deny delete_ewnone=No mail selected to allow delete_ernone=No mail selected to report as spam delete_ehnone=No mail selected to report as ham delete_emoveuser=User to move mail to does not exist delete_ecopyuser=User to copy mail to does not exist delete_emovecannot=You are not allowed to move mail to the specified user delete_ecopycannot=You are not allowed to copy mail to the specified user delete_emovenone=No mail selected to move delete_ecopynone=No mail selected to copy delete_nobutton=No button clicked delete_ereport=Failed to report as spam : $1 delete_errc=Failed to copy mail delete_errm=Failed to move mail confirm_title=Confirm Delete confirm_warn=Are you sure you want to delete the $1 selected messages? confirm_warn2=Because of the size and format of your mailbox, this may take some time. Until the deletion has finished, no other action should be performed. confirm_warn3=Are you sure you want to delete this message? confirm_warn4=Until the deletion has finished, no other action should be performed. confirm_ok=Delete Now confirm_warnall=Are you sure you want to delete all of the messages in this folder? search_title=Search Results search_ecannot=You are not allowed to search this user's email search_ematch=You must enter text to match against. search_escore=Missing or invalid spam score search_efield=You must select a search type. search_ewhat=No text to match against entered for row $1 search_enone=No search criteria entered search_none=No messages found. search_results2=$1 mail messages matching $2 search_results3=$1 mail messages not matching $2 search_results4=$1 mail messages matching your search search_results5=$1 mail messages where $2 matches $3 search_msg2=Search results for $1 search_msg4=Search results search_msg5=Search results for spam with score $1 search_local=In local folders search_all=In all folders search_limit=(from last $1 messages) search_status=With status search_allstatus=Any search_onestatus=Only status search_latest=Messages to search search_nolatest=All in folder search_latestnum=Only latest search_elatest=Missing or invalid number of messages to search search_withstatus=, with status $1 folder_inbox=Inbox folder_sent=Sent mail folder_drafts=Drafts folder_trash=Trash detach_err=Failed to detach file detach_edir=No file or directory to save to entered detach_eopen=Failed to open $1 : $2 detach_ewrite=Failed to write to $1 : $2 detach_title=Detach File detach_ok=Wrote attachment to server-side file $1 ($2). sform_title=Advanced Search sform_and=Find messages matching all criteria below .. sform_or=Find messages matches any criteria below .. sform_neg0=contains sform_neg1=doesn't contain sform_ok=Search Now sform_folder=in folder(s) sform_all=<All folders> sform_local=<Local folders> sform_where=Where sform_text=the text sform_from=From: header sform_subject=Subject: header sform_to=To: header sform_cc=Cc: header sform_date=Date: header sform_body=message body sform_headers=any header sform_size=message size sform_return=advanced search form find_enone=No users matching your search were found find_title=Search Results find_results=Users matching search for $1 .. find_user=Username find_real=Real name find_group=Group find_home=Home directory find_size=Mail size find_incount=Emails find_sentcount=Sent acl_none=None acl_same=User with same name acl_all=All acl_read=Users whose mail can be read acl_users=Only users acl_userse=All except users acl_usersg=Members of groups acl_from=Allowable From addresses acl_any=Any address acl_fdoms=Mailbox @ domains acl_faddrs=Listed addresses acl_fdom=Any address @ domain acl_fromname=Real name for From address acl_apath=Limit files and program to directory acl_attach=Maximum total attachments size acl_unlimited=Unlimited acl_sent=Store sent mail in mailbox acl_canattach=Can attach server-side files? acl_candetach=Can detach files to server? acl_usersm=Users matching acl_asame=Same as username acl_usersu=With UID in range acl_sec=Include secondary groups? acl_dir=Can read mail files in directory acl_dirauto=Decide automatically (anywhere if all users are visible, nowhere otherwise) log_delmail=Deleted $1 messages from $2 log_movemail=Moved $1 messages from $2 to $3 log_copymail=Copied $1 messages from $2 to $3 log_send=Sent mail to $1 log_read=Read mail for $1 emodified=This folder has been modified since it was last viewed! Return to the mail list and try again. razor_title=Reporting As Spam razor_title2=Reporting As Ham razor_report=Reporting this message to Razor and other SpamAssassin spam-blocking databases .. razor_report2=Reporting the selected messages to Razor and other SpamAssassin spam-blocking databases .. razor_report3=Un-reporting the seleected messages to Razor and other SpamAssassin spam-blocking databases .. razor_done=.. done razor_err=.. failed! See the error message above for the reason why. razor_deleted=.. done, and deleted message too. ham_title=Reporting As Ham ham_report=Reporting this message as non-spam to Razor and other SpamAssassin databases .. black_title=Denying Sender black_done=Added the email address $1 to SpamAssassin's denied addresses list. black_already=The email address $1 is already on SpamAssassin's denied addresses list. white_title=Allowing Sender white_done=Added the email address $1 to SpamAssassin's allowed addresses list. white_already=The email address $1 is already on SpamAssassin's allowed addresses list. ldap_emod=Missing Perl module $1 needed for connecting to LDAP ldap_econn=Failed to connect to LDAP server $1 port $2 ldap_elogin=Failed to bind to LDAP server $1 as $2 : $3 ldap_ehost=No LDAP server set in module configuration ldap_eport=No valid LDAP server port set in module configuration ldap_euser=No LDAP login set in module configuration ldap_ebase=No LDAP base DN set in module configuration delall_title=Delete All Mail delall_rusure=Are you sure you want to delete all email from $1? $2 messages totalling $3 will be deleted forever. delall_ok=Delete Now mailbox/lang/ca0100664000567100000120000003610410424446674013442 0ustar jcameronwheelindex_title=Lectura del Correu d'Usuaris index_none=NO tens permís per llegir el correu de cap usuari d'aquest sistema. index_header=Bústies d'usuaris index_empty=No hi ha correu index_return=a la llista d'usuaris index_esystem=No s'ha detectat al sistema cap dels servidors de correu suportats (Qmail, Postfix i Sendmail). Haurŕs d'ajustar la configuració del mňdul per configurar manualment el servidor de correu i possiblement els camins del correu. index_esystem2=No s'ha trobat al sistema el servidor de correu establert a la configuració del mňdul. Haurŕs de modificar la configuració per que faci servir el servidor correcte. index_esystem3=S'ha produďt un error en contactar el sistema de correu establert a la configuració del mňdul: $2. index_system2=Servidor de correu: Qmail index_system1=Servidor de correu: Sendmail index_system0=Servidor de correu: Postfix index_toomany=Hi ha massa usuaris al sistema com per mostrar-los en una sola pŕgina. index_find=Busca usuaris tals que el nom d'usuari index_equals=sigui igual que index_contains=contingui index_eperl=El mňdul Perl $1 necessari per al mode d'autenticació SMTP seleccionat no estŕ instalˇlat o estŕ mancat d'un mňdul dependent. Fes clic aquí per instalˇlar-lo ara. index_file=Llegeix el Correu del Fitxer: index_nousers=No s'ha trobat cap usuari! index_nousersmail=No s'ha trobat cap usuari amb correu. mail_title=Correu de l'Usuari mail_from=De mail_date=Data mail_subject=Tema mail_to=A mail_cc=Cc mail_bcc=Bcc mail_pri=Prioritat mail_highest=Altíssima mail_high=Alta mail_normal=Normal mail_low=Baixa mail_lowest=Baixíssima mail_for=A $1 mail_for2=Per a l'usuari $1 mail_sent=A la llista de correu enviat mail_size=Mida mail_delete=Suprimeix mail_compose=Redacta mail_open=Obre mail_return=a la bústia de l'usuari mail_pos=Missatges $1 a $2 de $3 a $4 mail_none=Aquest usuari no té cap missatge a $1 mail_ecannot=No tens permís per llegir el correu d'aquest usuari mail_all=Selecciona-ho tot. mail_invert=Inverteix la selecció. mail_nosort=Reinicia l'ordenació. mail_search=Busca missatges tals que mail_body=El cos mail_match=coincideixi amb mail_ok=Busca mail_nonefrom=Cap mail_mark=Marca com: mail_mark0=No llegit mail_mark1=Llegit mail_mark2=Especial mail_forward=Reenvia mail_move=Desplaça a: mail_copy=Copia a: mail_rfc=Des de la línia mail_eexists=El missatge ja no existeix! mail_fchange=Canvia mail_indexlink=Torna a la bústia mail_deleteall=Suprimeix-los Tots mail_black=Denega els Remitents mail_white=Permet els Remitents mail_efile=El fitxer de correu no existeix mail_fromsrch=El mateix remitent... mail_subsrch=El mateix assumpte... mail_tosrch=El mateix destinatari... mail_sign=Signa amb la clau: mail_nosign=<No el signis> mail_crypt=Xifratge de: mail_nocrypt=<No el xifris> mail_samecrypt=<Claus de les adreces de destinació> mail_addresses=Gestiona la Llibreta d'Adreces mail_folders=Gestiona les Carpetes mail_err=S'ha produďt un error en llistar el correu d'aquesta carpeta: $1 mail_loginheader=Entrada al servidor POP3 mail_logindesc=Has d'introduir un usuari i una contrasenya per accedir al correu
d'entrada del servidor de correu $1. mail_loginuser=Usuari mail_loginpass=Contrasenya mail_loginmailbox=Bústia IMAP mail_login=Entrada mail_reset=Neteja mail_logout=Canvia l'entrada POP3 mail_logout2=Canvia l'entrada IMAP mail_sig=Edita la Signatura mail_jump=Salta a la pŕgina: mail_of=de mail_replyto=Respon a mail_folder=Carpeta mail_delall=Suprimeix-ho tot mail_deltrash=Buida la Paperera mail_search2=Busca: mail_advanced=Recerca Avançada mail_return2=al Correu de l'Usuari mail_esystem=S'ha produďt un error en contactar amb el sistema de correu: $1. Aixň ha de ser corregit per l'administrador del sistema. view_title=Lectura del Correu view_desc=Missatge $1 a $2 view_desc2=Missatge $1 per a l'usuari $2 view_desc3=Missatge $1 view_sent=Missatge $1 al la llista de correu enviat view_qdesc=Missatge $1 en cua view_headers=Capçaleres de correu view_body=Text del missatge view_allheaders=Mostra totes les capçaleres view_noheaders=Mostra les capçaleres bŕsiques view_attach=Adjuncions view_reply=Respon view_reply2=Respon a tots view_enew=Edita coma nou view_forward=Reenvia view_delete=Suprimeix view_print=Imprimeix view_strip=Treu les Adjuncions view_ecannot=No tens permís per llegir el correu d'aquest usuari view_mark=Marca com: view_mark0=No llegit view_mark1=Llegit view_mark2=Especial view_return=al correu original view_sub=Correu Adjunt view_egone=Aquest missatge ja no existeix view_eugone=Aquest usuari no existeix view_gnupg=Verificació de la signatura GnuPG view_gnupg_0=La signatura de $1 és vŕlida. view_gnupg_1=La signatura de $1 és vŕlida, perň no s'ha pogut establir la cadena de fiabilitat. view_gnupg_2=La signatura de $1 NO és vŕlida. view_gnupg_3=L'ID de clau $1 no és a la teva llista, així que no es pot verificar la signatura. view_gnupg_4=No he pogut verificar la signatura: $1 view_crypt=Desxifratge de correu GnuPG view_crypt_1=El missatge estŕ xifrat, perň el suport GnuPG no estŕ instalˇlat. view_crypt_2=No he pogut desxifrar el missatge: $1 view_crypt_3=El correu s'ha desxifrat correctament. view_crypt_4=La part xifrada del missatge s'ha desxifrat correctament. view_recv=Obtingues l'ID de clau $1 del servidor de claus. view_folder=Torna a la bústia view_detach=Separa el fitxer: view_dall=<Tots els fitxers> view_dir=al fitxer o directori del servidor: view_black=Denega el Remitent view_white=Permet el Remitent view_razor=Informa com a Spam view_ham=Informa com a Ham view_razordel=Informa i Suprimeix view_dstatus=L'estat del lliurament ha fallat view_dstatusok=Estat de lliurament correcte view_final-recipient=Destinatari final view_diagnostic-code=Motiu de l'error view_remote-mta=Servidor de correu remot view_reporting-mta=Servidor de correu d'informes view_astext=Mostra com a text view_ashtml=Mostra com a HTML view_raw=Mostra el missatge tal com és compose_title=Redacció de Correu reply_title=Resposta de Correu forward_title=Reenviament de Correu enew_title=Edició de Correu reply_headers=Capçaleres de correu reply_attach=Adjuncions reenviades reply_mailforward=Missatges reenviats reply_attach2=Adjuncions de la part del client i del servidor reply_send=Envia el Correu reply_ecannot=No tens permís per enviar correu amb aquest usuari reply_body=Text del missatge reply_errc=No he pogut copiar el correu reply_errm=No he pogut desplaçar el correu reply_return=a la redacció del correu reply_spell=Comprova l'ortografia reply_draft=Desa com a Esborrany send_err=No he pogut enviar el correu send_eto=Hi falta l'adreça To send_efrom=Hi falta l'adreça From send_esubject=Hi falta l'asssumpte del correu send_title=Correu Enviat send_ok=Correu enviat correctament a to $1 send_sending=Enviant el correu a $1... send_ecannot=No tens permís per enviar correu amb aquest usuari send_esmtp=L'ordre SMTP $1 ha fallat: $2 send_eattach=Les adjuncions no poden fer més de $1 Kb. send_eperms=L'usuari $1 no pot llegir $2 send_eperms2=No tens permís per enviar el fitxer $1 send_epath=L'executable de Sendmail $1 no existeix. send_efile=No he pogut llegir l'adjunció $1: $2 send_done=...fet. send_epass=No pots signar cap missatge perquč la teva frase de contrasenya encara no estŕ configurada al mňdul de GnuPG. send_esign=No he pogut signar el missatge: $1 send_ekey=No he pogut trobar la clau per a l'adreça de correu $1 send_ecrypt=No he pogut xifrar el missatge: $1 send_eword=Paraula '$1' incorrecta send_eword2=Paraula '$1' incorrecta - possible correcció: $2 send_eline=A la línia $1: send_espell=S'han trobat els error ortogrŕfics següents al missatge... send_draft=El correu per a $1 s'ha desat a la carpeta d'esborranys. send_drafting=Desant el correu per a $1 a la carpeta d'esborranys... send_eattachsize=L'adjunció de correu excedeix la mida mŕxima permesa de $1 bytes delete_title=Supressió de Correu delete_rusure=Segur que vols suprimir les $1 missatges seleccionats de $2? Aixň pot trigar una mica si el fitxer de correu és gros. No es podrŕ realitzar cap altra acció fins que no s'hagi acabat la supressió. delete_rusure2=Segur que voleu suprimir aquest missatge de $1? Aixň pot trigar una mica si el fitxer de correu és gros. No es podrŕ realitzar cap altra acció fins que no s'hagi acabat la supressió. delete_ok=Suprimeix Ara delete_ecannot=No tens permís per suprimir correus d'aquest usuari delete_enone=No has seleccionat cap correu per suprimir delete_emnone=No has seleccionat cap correu per marcar delete_efnone=No has seleccionat cap correu per reenviar delete_ebnone=No has seleccionat cap correu per denegar delete_ewnone=No has seleccionat cap correu per permetre delete_ernone=No has seleccionat cap correu per informar-lo com a spam delete_ehnone=No has seleccionat cap correu per informar-lo com a ham delete_emoveuser=L'usuari per desplaçar-hi el correu no existeix delete_ecopyuser=L'usuari per copiar-hi el correu no existeix delete_emovecannot=No tens permís per desplaçar els correus a l'usuari especificat delete_ecopycannot=No tens permís per copiar els correus a l'usuari especificat delete_emovenone=No has seleccionat cap correu per desplaçar delete_ecopynone=No has seleccionat cap correu per copiar delete_nobutton=No has fet clic a cap botó delete_ereport=No he pogut informar com a spam: $1 delete_errc=No he pogut copiar el correu delete_errm=No he pogut desplaçar el correu confirm_title=Confirmació de Supressió confirm_warn=Segur que vols suprimir els $1 missatges seleccionats? confirm_warn2=Degut a la mida i el format de la bústia, aixň pot trigar una mica. No es podrŕ realitzar cap altra acció fins que no s'hagi acabat la supressió. confirm_warn3=Segur que vols suprimir aquest missatge? confirm_warn4=No es podrŕ realitzar cap altra acció fins que no s'hagi acabat la supressió. confirm_ok=Suprimeix Ara confirm_warnall=Segur que vols suprimir tots els missatges d'aquesta carpeta? search_title=Resultats de la Recerca search_ecannot=No tens permís per buscar dins del correu d'aquest usuari search_ematch=Has d'introduir un text de recerca. search_efield=Has de seleccionar un tipus de recerca. search_ewhat=No has introduďt cap text de recerca per a la fila $1 search_enone=No has introduďt cap criteri de recerca search_none=No s'ha trobat cap missatge. search_results2=$1 missatges de correu que coincideixen amb $2 search_results3=$1 missatges de correu que no coincideixen amb $2 search_results4=$1 missatges de correu que coincideixen amb la teva recerca search_msg2=Resultats de la recerca per a $1 search_msg4=Resultats de la recerca search_local=A les carpetes locals search_all=A totes les carpetes search_limit=(dels darrers $1 missatges) search_status=Amb estat search_allstatus=Qualsevol search_onestatus=Només l'estat search_latest=Missatges a buscar search_nolatest=Tots els de la carpeta search_latestnum=Només els darrers search_elatest=Hi falta el nombre de missatges a buscar o bé és invŕlid search_withstatus=, amb estat $1 folder_inbox=Entrada folder_sent=Enviat folder_drafts=Drafts folder_trash=Trash detach_err=No he pogut separar el fitxer detach_edir=No has introduďt cap fitxer o directori per desar detach_eopen=No he pogut obrir $1: $2 detach_ewrite=No he pogut gravar a $1: $2 detach_title=Alliberament de Fitxer detach_ok=He gravat l'adjunció al fitxer del servidor $1 ($2). sform_title=Recerca Avançada sform_and=Busca missatges que coincideixin amb els criteris de recerca de sota... sform_or=Busca missatges que coincideixin amb qualsevol dels criteris de recerca de sota... sform_neg0=conté sform_neg1=no conté sform_ok=Busca Ara sform_folder=a les carpetes sform_all=<Totes les carpetes> sform_local=<Carpetes locals> sform_where=Tal que sform_text=el text sform_from=la capçalera From: sform_subject=la capçalera Subject: sform_to=la capçalera To: sform_cc=la capçalera Cc: sform_date=la capçalera Date: sform_body=el cos del missatge sform_headers=qualsevol capçalera sform_size=la mida del missatge sform_return=al formulari de recerca avançada find_enone=No s'ha trobat cap usuari que coincideixi amb la teva recerca find_title=Resultats de la Recerca find_results=Usuaris que coincideixin amb la recerca per a $1... find_user=Usuari find_real=Nom real find_group=Grup find_home=Director i arrel find_size=Mida del correu find_incount=Correus find_sentcount=Enviats acl_none=Cap acl_same=Usuari amb el mateix nom acl_all=Tots acl_read=Usuaris el correu dels quals es pot llegir acl_users=Només els usuaris acl_userse=Tots excepte els usuaris acl_usersg=Membres dels grups acl_from=Adreces From permissibles acl_any=Qualsevol adreça acl_fdoms=Dominis @ de bústies acl_faddrs=Adreces llistades acl_fdom=Qualsevol domini @ d'adreça acl_fromname=Nom real per a l'adreça From acl_apath=Limita els fitxers i el programa al directori acl_attach=Mida mŕxima total de les adjuncions acl_unlimited=Ilˇlimitada acl_sent=Emmagatzema el correu enviat a la bústia acl_canattach=Pot adjuntar fitxers del servidor acl_candetach=Pot separar fitxers al servidor acl_usersm=Usuaris que coincideixin amb acl_asame=Igual que el nom d'usuari acl_usersu=Amb UID en el rang acl_sec=Inclou grups secundaris acl_dir=Pot llegir els fitxer de correu del directori acl_dirauto=Decideix automŕticament (qualsevol lloc si tots els usuaris són visibles, enlloc altrament) log_delmail=He suprimit $1 missatges de $2 log_movemail=He desplaçat $1 missatges de $2 a $3 log_copymail=He copiat $1 missatges de $2 a $3 log_send=He enviat el correu a $1 log_read=He llegit el correu de $1 emodified=Aquesta carpeta s'ha modificat des de la darrera visualització! Torna a la llista de correu i torna-ho a provar. razor_title=Informant com a Spam razor_title2=Informant com a Ham razor_report=Informant aquest missatge a Razor i altres bases de dades de blocatge de spam de SpamAssassin... razor_report2=Informant dels missatges seleccionats a Razor i altres bases de dades SpamAssassin de blocatge de spam... razor_report3=Desinformant els missatges seleccionats a Razor i altres bases de dades SpamAssassin de blocatge de spam... razor_done=... fet. razor_err=... ha fallat! Mira el missatge d'error de sobre per saber-ne el motiu. razor_deleted=...fet, i també he suprimit el missatge. ham_title=Informant com a Ham ham_report=Informant aquest missatges com a no spam a Razor i altres base de dades SpamAssassin... black_title=Denegant el Remitent black_done=He afegit l'adreça de correu $1 a la llista d'adreces denegades de SpamAssassin. black_already=L'adreça de correu $1 ja és a la llista d'adreces denegades de SpamAssassin. white_title=Permetent Remitent white_done=He afegit l'adreça de correu $1 a la llista d'adreces permeses de SpamAssassin. white_already=L'adreça de correu $1 ja és a la llista d'adreces permeses de SpamAssassin. ldap_emod=Falta el mňdul Perl $1 necessari per connectar amb LDAP ldap_econn=No he pogut connectar amb el servidor LDAP $1 port $2 ldap_elogin=No he pogut lligar el servidor LDAP $1 com a $2: $3 ldap_ehost=No hi ha cap servidor LDAP establert a la configuració del mňdul ldap_eport=No hi ha cap port de servidor vŕlid LDAP establert a la configuració del mňdul ldap_euser=No hi ha cap entrada LDAP establerta a la configuració del mňdul ldap_ebase=No hi ha cap DN base establert a la configuració del mňdul mailbox/lang/es0100664000567100000120000000704410316102527013451 0ustar jcameronwheelmail_title=Correo de Usuario mail_from=Desde mail_date=Fecha mail_subject=Asunto mail_to=Para mail_pri=Prioridad mail_highest=La mayor mail_high=Alta mail_low=Baja mail_lowest=La más baja mail_for=En $1 mail_for2=Para usuario $1 mail_sent=En lista de correo enviado mail_size=Medida mail_delete=Borrar mensajes seleccionados mail_compose=Componer nuevo correo mail_return=correo de usuario mail_ecannot=No estás autorizado a leer el correo de este usuario mail_all=Seleccionar todos mail_invert=Invertir selección mail_search=Hallar mensajes donde mail_body=Cuerpo mail_match=que coincida con mail_ok=Buscar mail_nonefrom=Ninguno mail_mark=Marcar los seleccionados como: mail_mark0=No leídos mail_mark1=Leídos mail_mark2=Especiales mail_forward=Remitir seleccionado mail_rfc=Desde línea view_title=Leer Correo view_desc=Mensaje $1 en $2 view_desc2=Mensaje $1 para usuario $2 view_desc3=Mensaje $1 view_sent=Mensaje $1 en lista de corre enviado view_qdesc=Mensaje en cola $1 view_headers=Cabeceras de Correo view_allheaders=Ver todas las cabeceras view_noheaders=Ver cabeceras básicas view_attach=Adjuntados view_reply=Responder view_reply2=Reponder a todos view_enew=Editar como nuevo view_forward=Remitir a view_delete=Borrar view_strip=Quitar Adjuntados view_ecannot=No estás autorizado a leer el correo de este usuario view_mark0=No leído view_mark1=Leído view_mark2=Especial view_return=correo original view_sub=Correo Adjunto compose_title=Componer Correo reply_title=Responder a Correo forward_title=Remitir Correo reply_headers=Cabeceras de Correo reply_attach=Adjuntados remitidos reply_mailforward=Mensajes remitidos reply_attach2=Adjuntados desde cliente y servidor reply_send=Enviar Correo reply_ecannot=No estás autorizado a enviar correo a este usuario send_err=Error al enviar correo send_eto=Dirección 'A' sin poner send_efrom=Dirección 'De' sin poner send_title=Correo enviado send_ok=Correo enviado correctamente a $1 send_ecannot=No estás autorizado a enviar correo como este usuario send_esmtp=Ha fallado el comando SMTP $1 : $2 send_eattach=Los archivos incluídos no pueden exceder más de 1kB de medida send_eperms=El usuario $1 no puede leer $2 send_eperms2=No estás autorizado a enviar archivo $1 send_epath=El ejecutable de Sendmail $1 no existe. delete_ecannot=No estás autorizado a borrar correo de este usuario delete_enone=No se ha seleccionado correo para ser borrado delete_emnone=No hay correo seleccionado para marcar search_title=Resultados de la búsqueda search_ecannot=No estás autorizado a buscar en este correo de usuario search_ematch=Debes de digitar un texto que coincida con algo. search_none=No se han encontrado mensajes. search_results3=$1 mensajes de correo no coinciden con $2 acl_none=Ninguno acl_same=Usuario con mismo nombre acl_all=Todos acl_read=Usuarios cuyo correo puede ser leído acl_users=Usuarios acl_userse=Todos excepto los usuarios acl_usersg=Miembros de grupo acl_from=Direcciones 'desde' autorizadas acl_any=Cualquier dirección acl_fdoms=Buzones en dominios acl_faddrs=Direcciones listadas acl_fdom=Cualquier dirección en dominio acl_fromname=Nombre real para dirección remitente acl_apath=Limitar archivos y programa a directorio acl_attach=Medida máxima total de archivos a incluir acl_sent=Almacenar correo enviado en buzón acl_canattach=¿Puede adjuntar archivos del lado servidor? acl_usersm=Usuarios que coincidan acl_asame=Igual que nombre de usuario log_delmail=Borrados $1 mensajes de $2 log_send=Enviado correo a $1 mailbox/lang/fr0100664000567100000120000000756410176143320013460 0ustar jcameronwheelacl_all=Tous acl_any=De toutes les adresses acl_faddrs=Adresses listées acl_fdom=Toutes les adresses d'un domaines acl_fdoms=Boîte aux lettres des domaines acl_from=Des adresses acl_none=Aucun acl_read=Usagers dont les courriers peuvent être lu acl_users=Seulement les usagers acl_userse=Tous compose_title=Écrire un Courrier confirm_ok=Effacer maintenant confirm_title=Confirmer la suppression confirm_warn=Etes vous sur de vouloir supprimer les $1 messages sélectionnées? confirm_warn3=Etes vous sur de vouloir supprimer ce message? confirm_warn4=Jusqu'à la fin de l'effacement, aucune autre action ne peut êtes faite. confirm_warnall=Etes vous sûr de vouloir supprimer tous les messages de ce dossier? delete_ecannot=Vous n'êtes pas autorisé à supprimer les courriers de cet usager delete_ecopynone=Aucun message à copier sélectionner delete_efnone=Aucun message à transmettre sélectionné delete_emnone=Aucun message à marquer sélectionné delete_emovenone=Aucun message à déplacer sélectionné delete_enone=Aucun mail à effacer sélectionné delete_ernone=Aucun mail à raporter comme spam sélectionné delete_ok=Effacer maintenant delete_title=Effacer le message detach_title=Sauver les fichiers enew_title=Editer le message find_size=Taille du message forward_title=Rediriger un Courrier index_header=Boîtes aux lettres des usagers index_return=liste des utilisateurs index_system0=Serveur mail : Postfix index_system1=Serveur mail : Sendmail index_system2=Serveur mail : Qmail index_title=Lire les mails des usagers mail_all=Selectionner tout mail_cc=Copie carbone mail_compose=Écrire un nouveau courrier mail_copy=Copier vers: mail_delall=Tout supprimer mail_delete=Supprimer les messages sélectionnés mail_deleteall=Tout supprimer mail_ecannot=Vous n'êtes pas autorisé à lire les courriers des usagers mail_for=Dans $1 mail_forward=Transmettre mail_from=De mail_invert=Selectioner l'inverse mail_mark=Marqué comme: mail_mark0=Non lu mail_mark1=Lu mail_mark2=Spécial mail_move=Déplacer vers: mail_of=sur mail_ok=Chercher mail_pri=Priorité mail_replyto=Répondre à mail_reset=Effacer mail_return=courrier de l'usager mail_size=Taille mail_subject=Sujet mail_title=Courrier de l'Usager mail_to=À razor_done=.. fait razor_title=Rapporter comme Spam reply_attach=Attachement envoyé reply_attach2=Attachements reply_body=Corps du message reply_draft=Sauver comme brouillon reply_ecannot=Vous n'êtes pas autorisé à envoyer un courrier de cet usager reply_headers=Entêtes du courrier reply_send=Envoyer reply_title=Répondre au Courrier send_ecannot=Vous n'êtes pas autorisé à envoyer un courrier de cet usager send_efrom=Adresse de l'émetteur manquant send_err=Impossible d'envoyer le courrier send_esmtp=Impossible d'exécuter la commande SMTP $1 : $2 send_eto=Adresse du destinataire manquante send_ok=Courrier envoyé avec succès à $1 send_title=Courrier Envoyé view_allheaders=Voir toutes les entêtes view_ashtml=Voir en HTML view_astext=Voir en Texte view_attach=Attachements view_black=Refuser l'expéditeur view_delete=Supprimer view_desc=Courrier $1 dans $2 view_detach=Sauver les fichiers: view_dir=dans le répertoire: view_ecannot=Vous n'êtes pas autorisé à lire les courriers des usagers view_forward=Renvoyer view_headers=Entêtes du courrier view_mark=Marqué comme: view_mark0=Non lu view_mark1=Lu view_mark2=Spécial view_print=Imprimer view_qdesc=Courrier $1 de la file d'attente view_razor=Rapporter comme Spam view_razordel=Rapporter et Supprimer view_reply=Répondre view_reply2=Répondre à tous view_return=email original view_strip=Supprimer les pièces jointes view_title=Lire un Courrier mailbox/lang/ja_JP.euc0100664000567100000120000000452710067670055014614 0ustar jcameronwheelmail_title=ĽćĄźĽś E ĽáĄźĽë mail_from=Á÷żŽ¸ľ mail_date=ĆüÉŐ mail_subject=ˇďĚž mail_to=°¸Ŕč mail_pri=ÍĽŔčĹŮ mail_highest=şÇÍĽŔč mail_high=šâ mail_normal=ɸ˝ŕ mail_low=Äă mail_lowest=şÇ¸ĺ mail_for=$1 Ćâ mail_sent=Á÷żŽşŃ¤ßĽáĄźĽë ĽęĽšĽČĆâ mail_size=ĽľĽ¤Ľş mail_delete=ÁŞÂň¤ľ¤ě¤żĽáĽĂĽťĄźĽ¸¤ňşď˝ü mail_compose=żˇľŹĽáĄźĽë¤ňşîŔŽ mail_return=ĽćĄźĽś E ĽáĄźĽë mail_ecannot=¤ł¤ÎĽćĄźĽśĄź¤ÎĽáĄźĽë¤ĎĆɤá¤Ţ¤ť¤ó mail_all=¤š¤Ů¤ĆÁŞÂň mail_invert=ÁŞÂň¤ÎȿŞ mail_search=ĽáĽĂĽťĄźĽ¸¤Î¸Ąş÷ mail_body=ËÜʸ mail_match=°ěĂ× mail_ok=¸Ąş÷ mail_nonefrom=¤Ę¤ˇ view_title=E ĽáĄźĽë¤ňĆɤŕ view_desc=$2¤ÎĽáĽĂĽťĄźĽ¸ $1 view_sent=Á÷żŽşŃ¤ßĽáĄźĽë ĽęĽšĽČ¤ÎĽáĽĂĽťĄźĽ¸ $1 view_qdesc=Ľ­ĽĺĄź¤ľ¤ě¤żĽáĽĂĽťĄźĽ¸ $1 view_headers=ĽáĄźĽë ĽŘĽĂĽŔ view_attach=ĹşÉŐĽŐĽĄĽ¤Ľë view_reply=ĘÖżŽ view_reply2=Á´°÷¤ËĘÖżŽ view_enew=żˇľŹ¤Č¤ˇ¤ĆĘÔ˝¸ view_forward=ĹžÁ÷ view_delete=şď˝ü view_ecannot=¤ł¤ÎĽćĄźĽśĄź¤ÎĽáĄźĽë¤ĎĆɤá¤Ţ¤ť¤ó compose_title=E ĽáĄźĽë¤ÎşîŔŽ reply_title=E ĽáĄźĽë¤Ř¤ÎĘÖżŽ forward_title=E ĽáĄźĽë¤ÎĹžÁ÷ reply_headers=ĽáĄźĽë ĽŘĽĂĽŔ reply_attach=ĹžÁ÷¤ľ¤ě¤żĹşÉŐĽŐĽĄĽ¤Ľë reply_attach2=ĹşÉŐĽŐĽĄĽ¤Ľë reply_send=Á÷żŽ reply_ecannot=¤ł¤ÎĽćĄźĽś¤Č¤ˇ¤Ć¤ĎĽáĄźĽë¤ňÁ÷żŽ¤Ç¤­¤Ţ¤ť¤ó send_err=ĽáĄźĽë¤ňÁ÷żŽ¤Ç¤­¤Ţ¤ť¤ó¤Ç¤ˇ¤ż send_eto=To ĄĘ°¸ŔčĄËĽ˘ĽÉĽěĽš¤Ź¤˘¤ę¤Ţ¤ť¤ó send_efrom=From (Á÷żŽźÔ) Ľ˘ĽÉĽěĽš¤Ź¤˘¤ę¤Ţ¤ť¤ó send_title=Á÷żŽ¤ľ¤ě¤żĽáĄźĽë send_ok=$1 ¤Ř¤ÎĽáĄźĽë¤ÎÁ÷żŽ¤ň´°Îť¤ˇ¤Ţ¤ˇ¤ż send_ecannot=¤ł¤ÎĽćĄźĽś¤Č¤ˇ¤Ć¤ĎĽáĄźĽë¤ňÁ÷żŽ¤Ç¤­¤Ţ¤ť¤ó send_esmtp=SMTP ĽłĽŢĽóĽÉ $1 ¤ŹźşÇÔ¤ˇ¤Ţ¤ˇ¤ż: $2 send_eattach=ĹşÉŐĽŐĽĄĽ¤Ľë¤ÎĽľĽ¤Ľş¤Ď $1 KB ¤ňąŰ¤¨¤é¤ě¤Ţ¤ť¤óĄŁ send_eperms=ĽćĄźĽś $1 ¤Ď $2 ¤ňĆɤߟč¤ě¤Ţ¤ť¤ó send_eperms2=ĽŐĽĄĽ¤Ľë $1 ¤ĎÁ÷żŽ¤Ç¤­¤Ţ¤ť¤ó delete_ecannot=¤ł¤ÎĽćĄźĽś¤Ť¤é¤ÎĽáĄźĽë¤ňşď˝ü¤Ç¤­¤Ţ¤š delete_enone=şď˝ü¤š¤ëĽáĽĂĽťĄźĽ¸¤ŹÁŞÂň¤ľ¤ě¤Ć¤¤¤Ţ¤ť¤ó search_title=¸Ąş÷ˇë˛Ě search_ecannot=¤ł¤ÎĽćĄźĽś¤ÎĽáĄźĽë¤Ď¸Ąş÷¤Ç¤­¤Ţ¤ť¤ó search_ematch=¸Ąş÷¤š¤ë¤Ë¤ĎĽĆĽ­ĽšĽČ¤ňĆţÎϤš¤ëÉŹÍפʤ˘¤ę¤Ţ¤šĄŁ search_none=ĽáĽĂĽťĄźĽ¸¤Ź¸Ť¤Ä¤Ť¤ę¤Ţ¤ť¤ó¤Ç¤ˇ¤żĄŁ acl_none=¤Ę¤ˇ acl_same=ƹ̞¤ÎĽćĄźĽś acl_all=¤š¤Ů¤Ć acl_read=ĽáĄźĽë¤ňĆɤߟč¤ě¤ëĽćĄźĽś acl_users=źĄ¤ÎĽćĄźĽś¤Î¤ß acl_userse=źĄ¤ÎĽćĄźĽś°Ęł°¤š¤Ů¤Ć acl_usersg=Ľ°ĽëĄźĽ×¤ÎĽáĽóĽĐĄź acl_from=Ľ˘ĽÉĽěĽš¤Ť¤éľö˛Ä acl_any=Ǥ°Ő¤ÎĽ˘ĽÉĽěĽš acl_fdoms=ĽáĄźĽëĽÜĽĂĽŻĽš @ ĽÉĽáĽ¤Ľó acl_faddrs=ĽęĽšĽČ¤ľ¤ě¤żĽ˘ĽÉĽěĽš acl_fdom=Ǥ°Ő¤ÎĽ˘ĽÉĽěĽš @ ĽÉĽáĽ¤Ľó acl_apath=ĽÇĽŁĽěĽŻĽČĽę¤Ř¤ÎĽŐĽĄĽ¤Ľë¤ČĽ×ĽíĽ°ĽéĽŕ¤ňŔŠ¸Â acl_attach=ĹşÉŐĽŐĽĄĽ¤Ľë¤Îšçˇ×ĽľĽ¤Ľş¤ÎşÇÂçĂÍ acl_sent=Á÷żŽşŃ¤ßĽáĄźĽë¤ňĽáĄźĽëĽÜĽĂĽŻĽš¤ËĘݸ log_delmail=$1 ĽáĽĂĽťĄźĽ¸¤ň $2 ¤Ť¤éşď˝ü¤ˇ¤Ţ¤ˇ¤ż log_send=$1 ¤ËĽáĄźĽë¤ňÁ÷żŽ¤ˇ¤Ţ¤ˇ¤ż mailbox/lang/ja_JP.jis0100664000567100000120000000452710032203513014604 0ustar jcameronwheelmail_title=ƒ†[ƒU E ƒ[ƒ‹ mail_from=‘—MŒł mail_date=“ú•t mail_subject=Œ–ź mail_to=ˆść mail_pri=—Dć“x mail_highest=Ĺ—Dć mail_high=‚ mail_normal=•W€ mail_low=’á mail_lowest=ĹŒă mail_for=$1 “ŕ mail_sent=‘—MĎ‚݃[ƒ‹ ƒŠƒXƒg“ŕ mail_size=ƒTƒCƒY mail_delete=‘I‘đ‚ł‚ę‚˝ƒƒbƒZ[ƒW‚đíœ mail_compose=V‹Kƒ[ƒ‹‚đěŹ mail_return=ƒ†[ƒU E ƒ[ƒ‹ mail_ecannot=‚ą‚Ěƒ†[ƒU[‚Ěƒ[ƒ‹‚͓ǂ߂܂š‚ń mail_all=‚ˇ‚ׂđI‘đ mail_invert=‘I‘đ‚Ě”˝“] mail_search=ƒƒbƒZ[ƒW‚ĚŒŸő mail_body=–{•ś mail_match=ˆę’v mail_ok=ŒŸő mail_nonefrom=‚Č‚ľ view_title=E ƒ[ƒ‹‚đ“Ç‚Ţ view_desc=$2‚ĚƒƒbƒZ[ƒW $1 view_sent=‘—MĎ‚݃[ƒ‹ ƒŠƒXƒg‚ĚƒƒbƒZ[ƒW $1 view_qdesc=ƒLƒ…[‚ł‚ę‚˝ƒƒbƒZ[ƒW $1 view_headers=ƒ[ƒ‹ ƒwƒbƒ_ view_attach=“Y•tƒtƒ@ƒCƒ‹ view_reply=•ԐM view_reply2=‘Sˆő‚ɕԐM view_enew=V‹K‚Ć‚ľ‚Ä•ŇW view_forward=“]‘— view_delete=íœ view_ecannot=‚ą‚Ěƒ†[ƒU[‚Ěƒ[ƒ‹‚͓ǂ߂܂š‚ń compose_title=E ƒ[ƒ‹‚̍쐬 reply_title=E ƒ[ƒ‹‚ւ̕ԐM forward_title=E ƒ[ƒ‹‚Ě“]‘— reply_headers=ƒ[ƒ‹ ƒwƒbƒ_ reply_attach=“]‘—‚ł‚ę‚˝“Y•tƒtƒ@ƒCƒ‹ reply_attach2=“Y•tƒtƒ@ƒCƒ‹ reply_send=‘—M reply_ecannot=‚ą‚Ěƒ†[ƒU‚Ć‚ľ‚Ă̓[ƒ‹‚𑗐M‚Ĺ‚Ť‚Ü‚š‚ń send_err=ƒ[ƒ‹‚𑗐M‚Ĺ‚Ť‚Ü‚š‚ń‚Ĺ‚ľ‚˝ send_eto=To iˆśćjƒAƒhƒŒƒX‚Ş‚ ‚č‚Ü‚š‚ń send_efrom=From (‘—MŽŇ) ƒAƒhƒŒƒX‚Ş‚ ‚č‚Ü‚š‚ń send_title=‘—M‚ł‚ę‚˝ƒ[ƒ‹ send_ok=$1 ‚Ö‚Ěƒ[ƒ‹‚Ě‘—M‚đŠŽ—š‚ľ‚Ü‚ľ‚˝ send_ecannot=‚ą‚Ěƒ†[ƒU‚Ć‚ľ‚Ă̓[ƒ‹‚𑗐M‚Ĺ‚Ť‚Ü‚š‚ń send_esmtp=SMTP ƒRƒ}ƒ“ƒh $1 ‚ŞŽ¸”s‚ľ‚Ü‚ľ‚˝: $2 send_eattach=“Y•tƒtƒ@ƒCƒ‹‚ĚƒTƒCƒY‚Í $1 KB ‚đ‰z‚Ś‚ç‚ę‚Ü‚š‚ńB send_eperms=ƒ†[ƒU $1 ‚Í $2 ‚đ“ǂݎć‚ę‚Ü‚š‚ń send_eperms2=ƒtƒ@ƒCƒ‹ $1 ‚Í‘—M‚Ĺ‚Ť‚Ü‚š‚ń delete_ecannot=‚ą‚Ěƒ†[ƒU‚Š‚ç‚Ěƒ[ƒ‹‚đíœ‚Ĺ‚Ť‚Ü‚ˇ delete_enone=íœ‚ˇ‚郁ƒbƒZ[ƒW‚Ş‘I‘đ‚ł‚ę‚Ä‚˘‚Ü‚š‚ń search_title=ŒŸőŒ‹‰Ę search_ecannot=‚ą‚Ěƒ†[ƒU‚Ěƒ[ƒ‹‚ÍŒŸő‚Ĺ‚Ť‚Ü‚š‚ń search_ematch=ŒŸő‚ˇ‚é‚ɂ̓eƒLƒXƒg‚đ“ü—Í‚ˇ‚é•K—v‚Ş‚ ‚č‚Ü‚ˇB search_none=ƒƒbƒZ[ƒW‚ŞŒŠ‚Â‚Š‚č‚Ü‚š‚ń‚Ĺ‚ľ‚˝B acl_none=‚Č‚ľ acl_same=“Ż–ź‚Ěƒ†[ƒU acl_all=‚ˇ‚×‚Ä acl_read=ƒ[ƒ‹‚đ“ǂݎć‚ę‚郆[ƒU acl_users=ŽŸ‚Ěƒ†[ƒU‚Ě‚Ý acl_userse=ŽŸ‚Ěƒ†[ƒUˆČŠO‚ˇ‚×‚Ä acl_usersg=ƒOƒ‹[ƒv‚Ěƒƒ“ƒo[ acl_from=ƒAƒhƒŒƒX‚Š‚ç‹–‰Â acl_any=”CˆÓ‚ĚƒAƒhƒŒƒX acl_fdoms=ƒ[ƒ‹ƒ{ƒbƒNƒX @ ƒhƒƒCƒ“ acl_faddrs=ƒŠƒXƒg‚ł‚ę‚˝ƒAƒhƒŒƒX acl_fdom=”CˆÓ‚ĚƒAƒhƒŒƒX @ ƒhƒƒCƒ“ acl_apath=ƒfƒBƒŒƒNƒgƒŠ‚Ö‚Ěƒtƒ@ƒCƒ‹‚ĆƒvƒƒOƒ‰ƒ€‚đ§ŒŔ acl_attach=“Y•tƒtƒ@ƒCƒ‹‚̍‡ŒvƒTƒCƒY‚ĚĹ‘ĺ’l acl_sent=‘—MĎ‚݃[ƒ‹‚đƒ[ƒ‹ƒ{ƒbƒNƒX‚ɕۑś log_delmail=$1 ƒƒbƒZ[ƒW‚đ $2 ‚Š‚çíœ‚ľ‚Ü‚ľ‚˝ log_send=$1 ‚Ƀ[ƒ‹‚𑗐M‚ľ‚Ü‚ľ‚˝ mailbox/lang/ko_KR.euc0100664000567100000120000000434610032203523014615 0ustar jcameronwheelmail_title=ťçżëŔÚ ŔüŔÚ ¸ŢŔĎ mail_from=šß˝ĹŔÚ mail_date=łŻÂĽ mail_subject=Áڏń mail_to=źö˝ĹŔÚ mail_cc=ÂüÁś mail_bcc=źűŔş ÂüÁś mail_pri=żěźą źřŔ§ mail_highest=°ĄŔĺ łôŔ˝ mail_high=łôŔ˝ mail_normal=ş¸Ĺë mail_low=łˇŔ˝ mail_lowest=°ĄŔĺ łˇŔ˝ mail_for=$1 mail_sent=šß˝Ĺ ¸ŢŔĎ ¸ńˇĎ mail_size=ĹŠąâ mail_delete=źąĹĂÇŃ ¸Ţ˝ĂÁö ťčÁŚ mail_compose=ťő ¸ŢŔĎ ŔŰźş mail_return=ťçżëŔÚ ŔüŔÚ ¸ŢŔĎ mail_ecannot=ŔĚ ťçżëŔÚŔÇ ŔüŔÚ ¸ŢŔĎŔť ŔĐŔť źö žř˝Ŕ´Ď´Ů mail_all=¸đľÎ źąĹĂ mail_invert=šÝ´ëˇÎ źąĹĂ mail_search=¸Ţ˝ĂÁö °Ëťö Ŕ§ÄĄ mail_body=şťšŽ mail_match=ŔĎÄĄ mail_ok=°Ëťö mail_nonefrom=žřŔ˝ view_title=ŔüŔÚ ¸ŢŔĎ ŔĐąâ view_desc=$2żĄ ŔÖ´Â ¸Ţ˝ĂÁö $1 view_sent=šß˝Ĺ ¸ŢŔĎ ¸ńˇĎżĄ ŔÖ´Â ¸Ţ˝ĂÁö $1 view_qdesc=´ëąâż­żĄ ŔÖ´Â ¸Ţ˝ĂÁö $1 view_headers=¸ŢŔĎ Çě´ő view_attach=áşÎ ĆÄŔĎ view_reply=ȸ˝Ĺ view_reply2=ŔüĂź ȸ˝Ĺ view_enew=ťő ¸ŢŔϡΠĆíÁý view_forward=Ŕü´Ţ view_delete=ťčÁŚ view_ecannot=ŔĚ ťçżëŔÚŔÇ ŔüŔÚ ¸ŢŔĎŔť ŔĐŔť źö žř˝Ŕ´Ď´Ů compose_title=ŔüŔÚ ¸ŢŔĎ ŔŰźş reply_title=ŔüŔÚ ¸ŢŔĎżĄ ȸ˝Ĺ forward_title=ŔüŔÚ ¸ŢŔĎ Ŕü´Ţ reply_headers=¸ŢŔĎ Çě´ő reply_attach=Ŕü´ŢľČ áşÎ ĆÄŔĎ reply_attach2=áşÎ ĆÄŔĎ reply_send=ŔüźŰ reply_ecannot=ŔĚ ťçżëŔڡΠ¸ŢŔĎŔť ŔüźŰÇŇ źö žř˝Ŕ´Ď´Ů send_err=¸ŢŔĎŔť ŔüźŰÇĎÁö ¸řÇß˝Ŕ´Ď´Ů send_eto=žř´Â źö˝ĹŔÚ ÁÖźŇ send_efrom=žř´Â šß˝ĹŔÚ ÁÖźŇ send_title=¸ŢŔĎ ŔüźŰ żĎˇá send_ok=$1żĄ ¸ŢŔĎŔť ŔüźŰÇß˝Ŕ´Ď´Ů. send_ecannot=ŔĚ ťçżëŔڡΠ¸ŢŔĎŔť ŔüźŰÇŇ źö žř˝Ŕ´Ď´Ů send_esmtp=SMTP ¸íˇÉ $1 ˝ÇĆĐ: $2 send_eattach=áşÎ ĆÄŔĎŔÇ ĂŃ ĹŠąâ´Â $1KB¸Ś ĂʰúÇŇ źö žř˝Ŕ´Ď´Ů. send_eperms=ťçżëŔÚ $1Ŕş(´Â) $2Ŕť(¸Ś) ŔĐŔť źö žř˝Ŕ´Ď´Ů send_eperms2=ĆÄŔĎ $1Ŕť(¸Ś) ş¸łž źö žř˝Ŕ´Ď´Ů delete_ecannot=ŔĚ ťçżëŔڡκÎĹÍ šŢŔş ¸ŢŔĎŔť ťčÁŚÇŇ źö žř˝Ŕ´Ď´Ů delete_enone=ťčÁŚÇŇ ¸ŢŔĎŔť źąĹĂÇĎÁö žĘžŇ˝Ŕ´Ď´Ů search_title=°Ëťö °á°ú search_ecannot=ŔĚ ťçżëŔÚŔÇ ŔüŔÚ ¸ŢŔĎŔť °ËťöÇŇ źö žř˝Ŕ´Ď´Ů search_ematch=°ËťöÇŇ ĹŘ˝şĆŽ¸Ś ŔÔˇÂÇŘžß ÇŐ´Ď´Ů. search_none=¸Ţ˝ĂÁö°Ą žř˝Ŕ´Ď´Ů. acl_none=žřŔ˝ acl_same=Ŕ̸§ŔĚ ľżŔĎÇŃ ťçżëŔÚ acl_all=¸đľÎ acl_read=ŔĐŔť źö ŔÖ´Â ¸ŢŔĎŔť ş¸łť´Â ťçżëŔÚ acl_users=ťçżëŔÚ¸¸ acl_userse=ťçżëŔÚ¸Ś ÁŚżÜÇŃ ¸đľÎ acl_usersg=ą×ˇě ą¸źşżř acl_from=Çăżë °Ą´ÉÇŃ šß˝ĹŔÚ ÁÖźŇ acl_any=ŔÓŔÇŔÇ ÁÖźŇ acl_fdoms=ťçź­ÇÔ@ľľ¸ŢŔÎ acl_faddrs=łŞż­ľČ ÁÖźŇ acl_fdom=ŔÓŔÇŔÇ ÁÖźŇ@ľľ¸ŢŔÎ acl_apath=ľđˇşĹ与żĄ ´ëÇŃ ĆÄŔĎ š× ÇÁˇÎą×ˇĽ ÁŚÇŃ acl_attach=ŔüĂź áşÎ ĆÄŔĎŔÇ ĂÖ´ë ĹŠąâ acl_sent=ťçź­ÇÔżĄ šß˝Ĺ ¸ŢŔĎ ŔúŔĺ log_delmail=$2żĄź­ $1°ł ¸Ţ˝ĂÁö ťčÁŚľĘ log_send=$1żĄ°Ô ¸ŢŔĎ ŔüźŰ żĎˇá mailbox/lang/it0100775000567100000120000003201710336063277013471 0ustar jcameronwheelindex_title=Read Utente Mail index_none=You are not allowed to read email for any utenti on questo system. index_header=Utente mailboxes index_empty=No mail index_return=utente list index_esystem=None of the supported mail servers (Qmail, Postfix and Sendmail) were detected on your system. You will need to adjust the module configuration to set the mail server and possibly mail paths manually. index_esystem2=The mail server set in the module configuration was not found on your system. You will need to adjust the configuration to use the correct server. index_system2=Mail server: Qmail index_system1=Mail server: Sendmail index_system0=Mail server: Postfix index_toomany=There are too many utenti on your system to display on one pagina. index_find=Cerca utenti where nome utente index_equals=uguale index_contains=contiene index_eperl=The Perl module $1 needed for the selected SMTP authentication mode is not installed or is missing a dependent module. Click here to install it now. index_file=Leggi posta nel file: mail_title=Utente Email mail_from=Da mail_date=Data mail_subject=Oggetto mail_to=To mail_cc=Cc mail_bcc=Bcc mail_pri=Priorità mail_highest=PiĂš alta mail_high=Alta mail_normal=Normale mail_low=Bassa mail_lowest=PiĂš bassa mail_for=In $1 mail_for2=For utente $1 mail_sent=Nella lista inviate mail_size=Dimensione mail_delete=Elimina mail_compose=Scrivi mail_open=Apri mail_return=utente mailbox mail_pos=Messaggi da $1 a $2 di $3 in $4 mail_none=questo utente non ha messaggi in $1 mail_ecannot=non hai i permessi per leggere la posta di questo utente mail_all=Seleziona tutti mail_invert=Selezione invertita mail_nosort=Annulla ordinamento mail_search=Cerca messaggi dove mail_body=Corpo mail_match=corrisponde mail_ok=Cerca mail_nonefrom=nessuno mail_mark=Segna come: mail_mark0=Non letto mail_mark1=Letto mail_mark2=Speciale mail_forward=inoltra mail_move=sposta in: mail_copy=copia in : mail_rfc=da linea mail_eexists=il messaggio non esiste piĂš! mail_fchange=cambia mail_indexlink=torna alla casella di posta mail_deleteall=elimina tutto mail_black=blocca mittenti mail_white=accetta mittenti mail_efile=il file di Mail non esiste mail_fromsrch=stesso mittente.. mail_subsrch=stesso oggetto.. mail_tosrch=stesso destinatario mail_sign=firma con chiave: mail_nosign=<non firmare> mail_crypt=crpita per: mail_nocrypt=<non criptare> mail_samecrypt=<chiave per destinatari> mail_addresses=gestione Rubrica mail_folders=gestione cartelle mail_err=errore elencando i mesaggi in questa cartella : $1 mail_loginheader=POP3 server login mail_logindesc=inserisci nome utente e password per accedere alla posta
nella tua casella del server mail $1. mail_loginuser=nome utente mail_loginpass=password mail_loginmailbox=casella di posta IMAP mail_login=login mail_reset=pulisci mail_logout=cambia POP3 login mail_logout2=cambia IMAP login mail_sig=modifica firma mail_jump=vai a pagina: mail_of=of mail_replyto=rispondi a mail_folder=cartella mail_delall=elimina tutti mail_deltrash=svuota cestino mail_search2=cerca : mail_advanced=ricerca Avanzata mail_return2=utente Email view_title=leggi email view_desc=messaggio $1 di $2 view_desc2=messaggio $1 per utente $2 view_desc3=messaggio $1 view_sent=messaggio $1 in elenco posta inviata view_qdesc=messaggio accodato $1 view_headers=intestazione mail view_body=testo del messaggio view_allheaders=vedi tutte le intestazioni view_noheaders=vedi intestazioni base view_attach=allegati view_reply=rispondi view_reply2=rispondi a tutti view_enew=modifica come nuovo view_forward=inoltra view_delete=elimina view_print=stampa view_strip=elimina allegati view_ecannot=non hai i permessi di leggere la posta di questo utente view_mark=segna come view_mark0=non letto view_mark1=letto view_mark2=speciale view_return=email originale view_sub=email allegata view_egone=questo messaggio non esiste piĂš view_gnupg=verifica firma GnuPG view_gnupg_0=la firma di $1 è valida view_gnupg_1=la firma di $1 è valida, ma il trust chain no è stato stabilito view_gnupg_2=la firma di $1 NON È valida view_gnupg_3=Key ID $1 is not in your list, so signature could not be verified. view_gnupg_4=Failed to verify signature : $1 view_crypt=GnuPG mail decryption view_crypt_1=Message is encrypted, but GnuPG support is not installed. view_crypt_2=Failed to decrypt messaggio : $1 view_crypt_3=Mail was successfully decrypted. view_crypt_4=Encrypted portion of messaggio was successfully decrypted. view_recv=Fetch key ID $1 da keyserver. view_folder=torna a mailbox view_detach=Detach file: view_dall=<All files> view_dir=a file server o directory view_black=blocca mittente view_white=sblocca mittente view_razor=segnala come spam view_ham=seganana come ham view_razordel=segnana ed elimina view_dstatus=errore stato di consegna view_dstatusok=stato di consegna ok view_final-recipient=Final recipient view_diagnostic-code=dettagli errore view_remote-mta=mail server remoto view_reporting-mta=segnalazione a mail server view_astext=vedi messaggio formato raw testo view_ashtml=vedi messaggio formato HTML view_raw=vedi messaggio formato raw compose_title=scrivi Email reply_title=rispondi a email forward_title=inoltra email enew_title=Modifica Email reply_headers=intestazioni Mail reply_attach=Inoltrato allegati reply_mailforward=Inoltrato messaggi reply_attach2=Client and server-side allegati reply_send=invia email reply_ecannot=non hai i permessi per inviare messaggi come questo utente reply_body=testo del messaggio reply_errc=errore nella copia reply_errm=errore nello spostare il messaggio reply_return=scrivi mail reply_spell=controllo ortografico? reply_draft=salva come bozza send_err=errore nell'invio email send_eto=inserire il destinatario send_efrom=inserire il mittente send_title=Mail inviata send_ok=Mail inviata a $1 send_sending=invio posta a $1 .. send_ecannot=Non hai i permessi per inviare mail a questo utente send_esmtp=SMTP command $1 failed : $2 send_eattach=gli allegati non possono essere superiori a $1 kB in dimensione. send_eperms=utente $1 non può leggere $2 send_eperms2=non hai i permessi per inviare file $1 send_epath=Sendmail executable $1 does not exist. send_efile=errore nel leggere allegato $1 : $2 send_done=.. fatto send_epass=non è possibile firmare il messaggio perchè la tua passphrase non risulta imposta nel modulo GnuPG send_esign=errore nella firma del messaggio : $1 send_ekey=Couldn't find key for email indirizzo $1 send_ecrypt=Failed to encrypt messaggio : $1 send_eword=errore grammaticale $1 send_eword2=errore grammaticale $1 - correzioni possibili $2 send_eline=a riga $1 : send_espell=i seguenti errori grammaticali sono stati trovati nel messaggio .. send_draft=messaggio a $1 salvato nella cartella bozze send_drafting=salvataggio mail to $1 nella cartella bozze send_eattachsize=l'allegato di posta supera il limite massimo consentito di $1 bytes delete_title=elimina Mail delete_rusure=confermi eliminazione dei $1 messaggi selezionati da $2? Questa operazione potrebbe richiedere tempo. Non eseguire altre operazioni fino al messaggio di conferma. delete_rusure2=confermi eliminazione di questo messaggio da $1? Questa operazione potrebbe richiedere tempo. Non eseguire altre operazioni fino al messaggio di conferma. delete_ok=elimina ora delete_ecannot=non hai i permessi per eliminare da questo utente delete_enone=non risultano selezionate email da eliminare delete_emnone=non risultano selezionate email da segnare delete_efnone=non risultano selezionate email da inoltrare delete_ebnone=non risultano selezionate email da bloccare delete_ewnone=non risultano selezionate email da sbloccare delete_ernone=non risultano selezionate email da segnalare come span delete_ehnone=non risultano selezionate email da segnalare come ham delete_emoveuser=utente a cui spostare mail non esiste delete_ecopyuser=utente a cui copiare mail non esiste delete_emovecannot=non hai i permessi per spostare mail all'utente indicato delete_ecopycannot=non hai i permessi per copiare mail all'utente indicato delete_emovenone=non risultano selezionate email da spostare delete_ecopynone=non risultano selezionate email da copiare delete_nobutton=nessun bottone clicked delete_ereport=errore nella segnalazione spam : $1 delete_errc=errore nella copia mail delete_errm=errore nello spostamento mail confirm_title=conferma elimina confirm_warn=confermi eliminazione dei $1 messaggi selezionati? confirm_warn2=Because of the dimensione and format of your mailbox, questo may take some time. Until the deletion has finished, no other action should be performed. confirm_warn3=Are you sure you want to delete questo messaggio? confirm_warn4=Until the deletion has finished, no other action should be performed. confirm_ok=Elimina Now confirm_warnall=Are you sure you want to delete all of the messaggi in questo cartella? search_title=esito ricerca search_ecannot=non hai i permessi per cercare mail di questo utente search_ematch=inserisci un testo per il confronto search_efield=seleziona tipo di ricerca search_ewhat=No text to match against entered for row $1 search_enone=inserisci un criterio di ricerca search_none=nessun messaggio trovato search_results2=$1 messaggi corrispondenti a $2 search_results3=$1 messaggi non corrispondenti $2 search_results4=$1 messaggi corrispondenti alla ricerca search_msg2=esito ricerca per $1 search_msg4=esito ricerca search_local=nella cartelle locali search_all=in tutte le cartelle search_limit=(da last $1 messaggi) search_status=con status search_allstatus=tutti search_onestatus=solo status search_latest=Messaggi da cercare search_nolatest=tutto in cartella search_latestnum=piĂš recenti search_elatest=inserisci un numero valido di messaggio da cercare search_withstatus=, con status $1 folder_inbox=arrivo folder_sent=inviata folder_drafts=bozze folder_trash=cestino detach_err=errore in detach file detach_edir=No file or directory to save to entered detach_eopen=errore di lettura $1 : $2 detach_ewrite=erroe di scrittura su $1 : $2 detach_title=Detach File detach_ok=scritto allegato al file server-side $1 ($2). sform_title=Ricerca avanzata sform_and=Cerca messaggi con tutti i criteri sotto sform_or=Cerca messaggi con ogni criterio sotto sform_neg0=contiene sform_neg1=non contiene sform_ok=Cerca ora sform_folder=in cartella(s) sform_all=<tuttel el cartelle> sform_local=<cartelle locali> sform_where=Dove sform_text=il testo sform_from=Da: intestazione sform_subject=Oggetto: intestazione sform_to=To: intestazione sform_cc=Cc: intestazione sform_date=Date: intestazione sform_body=messaggio corpo sform_headers=ogni intestazione sform_size=messaggio dimensione sform_return=form ricerca avanzata find_enone=Nessun utente corrisponde alla ricerca effettuata find_title=Cerca risultati find_results=utenti corrispondenti alla ricerca per $1 .. find_user=Nome utente find_real=Nome reale find_group=Gruppo find_home=Home directory find_size=dimensione mail find_incount=Messaggi find_sentcount=Inviati acl_none=Nessuno acl_same=Utente con stesso nome acl_all=tutti acl_read=utenti ai quali la posta può essere letta acl_users=Solo utenti acl_userse=Tutto tranne utenti acl_usersg=Membri dei gruppi acl_from=Disponibile da indirizzi acl_any=Ogni indirizzo acl_fdoms=Mailbox @ domini acl_faddrs=indirizzi elencati acl_fdom=ogni indirizzo @ dominio acl_fromname=Nome reale per Da indirizzo acl_apath=Limite file e programi per directory acl_attach=dimesione totale massima degli allegati acl_sent=archivia posta inviata in cartella mailbox acl_canattach=puoi/può allegare file server-side? acl_candetach=puoi/può detach files al server? acl_usersm=corrispondenza utente acl_asame=Stesso come nome utente acl_usersu=With UID in range acl_sec=Include secondary gruppi? acl_dir=puoi/può leggere mail nella directory acl_dirauto=scelta automatica (ovunque se tutti gli utenti sono visibili, al contrario da nessuna parte) log_delmail=eliminati $1 messaggi da $2 log_movemail=spostati $1 messaggi da $2 a $3 log_copymail=copiati $1 messaggi da $2 a $3 log_send=mail inviata a to $1 log_read=leggi/letta mail per $1 emodified=questa cartella è stata modificata dall'ultima visita! torna a lista mail e riprova razor_title=segnala come spam razor_report=sto segnalando questo messaggio a Razor o altri SpamAssassin spam-blocking databases .. razor_done=.. fatto razor_err=.. errore! vedi dettagli sopra razor_deleted=.. fatto , il messaggio è stato eliminato ham_title=Reporting As Ham ham_report=Reporting questo messaggio as non-spam to Razor and other SpamAssassin databases .. black_title=Denying Sender black_done=Added the email indirizzo $1 to SpamAssassin's denied indirizzi list. black_already=The email indirizzo $1 is already on SpamAssassin's denied indirizzi list. white_title=Allowing Sender white_done=Added the email indirizzo $1 to SpamAssassin's allowed indirizzi list. white_already=The email indirizzo $1 is already on SpamAssassin's allowed indirizzi list. ldap_emod=Missing Perl module $1 needed for connecting to LDAP ldap_econn=Failed to connect to LDAP server $1 port $2 ldap_elogin=Failed to bind to LDAP server $1 as $2 : $3 mailbox/lang/pl0100664000567100000120000000625210032203535013451 0ustar jcameronwheelmail_title=Poczta użytkownika mail_from=Od mail_date=Wysłano mail_subject=Temat mail_to=Do mail_cc=DW mail_bcc=UDW mail_pri=Priorytet mail_highest=Najwyższy mail_high=Wysoki mail_normal=Zwykły mail_low=Niski mail_lowest=Najniższy mail_for=W $1 mail_for2=Dla użytkownika $1 mail_sent=Na liście poczty wysłanej mail_size=Rozmiar mail_delete=Skasuj wybrane wiadomości mail_compose=Utwórz nową wiadomość mail_return=skrzynki użytkownika mail_ecannot=Nie masz uprawnień do czytania poczty tego użytkownika mail_all=Wybierz wszystko mail_invert=Odwróć zaznaczenia mail_search=Znajdź wiadomości, w których mail_body=Treść mail_match=zawiera mail_ok=Szukaj mail_nonefrom=Brak mail_mark=Zaznacz wybrane jako: mail_mark0=Nie przeczytane mail_mark1=Przeczytane mail_mark2=Specjalne view_title=Czytaj pocztę view_desc=Wiadomość $1 w $2 view_desc2=Wiadomość $1 dla użytkownika $2 view_desc3=Wiadomość $1 view_sent=Wiadomość $1 na liście poczty wysłanej view_qdesc=Wiadomość w kolejce $1 view_headers=Nagłówki wiadomości view_attach=Załączniki view_reply=Odpowiedz view_reply2=Odpowiedz wszystkim view_enew=Edytuj jako nową view_forward=Przekaż dalej view_delete=Skasuj view_strip=Usuń załączniki view_ecannot=Nie masz uprawnień do czytania poczty tego użytkownika view_mark0=Nie przeczytaną view_mark1=Przeczytaną view_mark2=Specjalną view_return=pierwotnego adresu e-mail compose_title=Utwórz wiadomość reply_title=Odpowiedz na wiadomość forward_title=Przekaż dalej reply_headers=Nagłówki wiadomości reply_attach=Przekazywane załączniki reply_attach2=Załączniki reply_send=Wyślij reply_ecannot=Nie masz uprawnień do czytania poczty jako ten użytkownik send_err=Nie udało się wysłać wiadomości send_eto=Brak adresu docelowego send_efrom=Brak adresu źródłowego send_title=Wiadomość wysłana send_ok=Wiadomość pomyślnie wysłana do $1 send_ecannot=Nie masz uprawnień do wysyłania poczty jako ten użytkownik send_esmtp=Polecenie SMTP $1 zakończyło sie błędem : $2 send_eattach=Łączny rozmiar załączników nie może przekraczać $1 kB. send_eperms=Użytkownik $1 nie ma uprawnień do czytania $2 send_eperms2=Nie masz uprawnień do wysłania pliku $1 delete_ecannot=Nie masz uprawnień do kasowania poczty tego użytkownika delete_enone=Nie wybrano wiadomości do skasowania delete_emnone=Nie wybrano wiadomości do zaznaczenia search_title=Wyniki poszukiwania search_ecannot=Nie masz uprawnień do przeszukiwania poczty tego użytkownika search_ematch=Musisz wprowadzić poszukiwany tekst search_none=Nie znaleziono żadnej wiadomości acl_none=Żadne acl_same=Użytkownika o tej samej nazwie acl_all=Wszystkie acl_read=Użytkownicy, których poczta może być czytana acl_users=Tylko użytkownicy acl_userse=Oprócz użytkowników acl_usersg=Członkowie grupy acl_from=Dozwolone adresy źródłowe acl_any=Dowolny adres acl_fdoms=Skrzynka @ domeny acl_faddrs=Wymienione adresy acl_fdom=Dowolny adres @ domena acl_fromname=Rzeczywista nazwa dla adresu źródłowego acl_apath=Ograniczyć pliki i&npsp;programy do umieszczonych w&npsp;katalogu acl_attach=Maksymalny łączny rozmiar załączników acl_sent=Przechowywać wysłaną pocztę w skrzynce acl_canattach=Może dołączać pliki z serwera? log_delmail=Usunięto $1 wiadomości z $2 log_send=Wysłano wiadomość do $1 mailbox/lang/pt0100664000567100000120000000224210032203541013451 0ustar jcameronwheelmail_title=Email do Utilizador mail_from=De mail_date=Data mail_subject=Assunto mail_to=Para mail_for=Em $1 mail_compose=Compor novo correio mail_return=email do utilizador mail_ecannot=Vocę năo está autorizado para ler o correio deste utilizador view_title=Ler Correio view_desc=Mensagem $1 em $2 view_qdesc=Mensagem em lista de espera $1 view_headers=Cabaçalhos de correio view_attach=Anexos view_reply=Responder ao autor view_reply2=Responder a todos view_forward=Reenviar view_delete=Apagar view_ecannot=Vocę năo está autorizado para ler o correio deste utilizador compose_title=Compor Email reply_title=Responder ao Email forward_title=Reenviar Email reply_headers=Cabeçalhos de Correio reply_attach=Anexos Reenviados reply_attach2=Anexos reply_send=Enviar reply_ecannot=Vocę năo está autorizado para enviar correio como sendo este utilizador send_err=Erro ao enviar correio send_eto=Falta o endereço do destinatário send_title=Correio enviado send_ok=O correio foi enviado com sucesso para $1 send_ecannot=Vocę năo está autorizado para enviar correio como sendo este utilizador acl_none=Nenhum acl_all=Todos acl_read=Utilizadores cujo correio pode ser lido acl_users=Utilizadores mailbox/lang/zh_TW.UTF-80100664000567100000120000002175510420075004014677 0ustar jcameronwheelacl_all=全部 acl_any=任何郵件位址 acl_apath=限制檔案和程式到目錄 acl_asame=與使用者相同 acl_attach=最大附件總大小 acl_canattach=可以附加伺服器檔嗎? acl_candetach=可以附帶檔案到伺服器? acl_faddrs=列出的郵件位址 acl_fdom=任何郵件位址在網域 acl_fdoms=信箱在網域 acl_from=依據郵件位址允許 acl_fromname=來源地址的真實名稱 acl_none=無 acl_read=可以讀取哪些使用者的郵件 acl_same=同名的使用者 acl_sent=在郵箱中儲存已發送的郵件 acl_users=只有使用者 acl_userse=全部, 除了使用者 acl_usersg=組的成員 acl_usersm=符合的使用者 acl_usersu=在UID範圍內 compose_title=寫作電子郵件 confirm_ok=現在刪除 confirm_title=確認刪除 confirm_warn=您確定要刪除 $1 封選取的訊息? confirm_warn2=因為您的信箱大小與格式,需要一點時間,直到刪除完成後,不會執行其他動作 confirm_warn3=您確定要刪除訊息 confirm_warn4=直到刪除完成,不會執行其他動作。 confirm_warnall=您確定要刪除資料夾中所有訊息? delete_ecannot=您不被允許刪除這個使用者的郵件 delete_ecopycannot=您不被允許複製郵件到特定的使用者 delete_ecopynone=未選取複製郵件 delete_ecopyuser=複製郵件使用者不存在 delete_efnone=未選取轉寄郵件 delete_emnone=沒有選擇要標記的郵件 delete_emovecannot=您不被允許移動郵件到特定的使用者 delete_emovenone=未選移動寄郵件 delete_emoveuser=使用者移動郵件不存在 delete_enone=沒有選擇要刪除的郵件 delete_nobutton=未按按鈕 delete_ok=現在刪除 delete_rusure=您確定要從$2刪除 $1 封選取的訊息?大檔案的郵件需要一些時間,直到刪除完成,不會執行其他動作。 delete_rusure2=您確定要刪除 $1 封選取的訊息?大檔案的郵件需要一些時間,直到刪除完成,不會執行其他動作。 delete_title=刪除郵件 detach_edir=沒有輸入儲存的檔案或目錄 detach_eopen=開始$1失敗:$2 detach_err=附加檔案失敗 detach_ewrite=寍羌$1失敗:$2 detach_ok=從伺服端附加檔案$1($2) detach_title=附加檔案 enew_title=硨蟯郾䝜 find_enone=沒有您搜尋所符合的使用者 find_group=群組 find_home=家目錄 find_real=真實名稱 find_results=搜尋$1符合的使用者.. find_size=郵件大小 find_title=搜尋結果 find_user=使用者名稱 folder_drafts=草稿 folder_inbox=收件夾 folder_sent=傳送郵件 folder_trash=垃圾桶 forward_title=轉寄到電子郵件 index_contains=包含 index_empty=無郵件 index_equals=等於 index_esystem=在您的系統上找不到支援的郵件伺服器(Qmail, Postfix 和 Sendmail),您可以手動調整模組組態來設定郵件伺服器和郵件路徑 index_esystem2=在您的系統上找不到模組組態中設定的郵件伺服器,您需要調整正確的伺服器組態。 index_find=在使用者名稱中找尋使用者 index_header=使用者信箱 index_none=您不被允許任何此系統上使用者讀取郵件 index_return=Sendmail 組態 index_system0=郵件伺服器:Postfix index_system1=郵件伺服器:Sendmail index_system2=郵件伺服器:Qmail index_title=Sendmail 組態 index_toomany=在您的系統上有太多的使用者,所以無法同時顯示在一頁上 log_copymail=從 $2 到 $3 複製$1封訊息 log_delmail=已從 $2 刪除 $1郾䝜 log_movemail=從 $2 到 $3 移動$1封訊息 log_send=已發送郵件到 $1 mail_addresses=管理聯絡人 mail_advanced=進階搜尋 mail_all=選擇全部 mail_bcc=隱藏副本 mail_body=本體 mail_cc=副本抄送 mail_compose=寫作新郵件 mail_copy=複製到: mail_crypt=GnuPG加密給: mail_date=日期 mail_delall=全部刪除 mail_delete=刪除選擇的郵件 mail_deltrash=空垃圾桶 mail_ecannot=您不被允許讀取這個使用者的郵件 mail_eexists=訊息不存在了! mail_err=此資料夾中郵件列表發生一個錯誤 : $1 mail_fchange=變更 mail_folder=資料夾 mail_folders=管理資料夾 mail_for=在 $1 mail_for2=用於使用者$1 mail_forward=轉寄已選擇的 mail_from=寄件人 mail_high=鍘 mail_highest=最高 mail_invert=反向選取 mail_jump=跳至頁面: mail_login=登入 mail_logindesc=您必須在郵件主機$1上
輸入使用者名稱和密碼來進入信箱 mail_loginheader=POP3登入伺服器 mail_loginmailbox=IMAP俥玹 mail_loginpass=密碼 mail_loginuser=使用者名稱 mail_logout=變更POP3登入 mail_logout2=變更IMAP登入 mail_low=低 mail_lowest=最低 mail_mark=將選取的郵件標記為: mail_mark0=未閱讀 mail_mark1=閱讀 mail_mark2=特別 mail_match=珌合 mail_move=移至: mail_nocrypt=<不編碼> mail_none=信箱中沒有郵件 mail_nonefrom=無 mail_normal=一般 mail_nosign=<不簽證> mail_of=的 mail_ok=搜尋 mail_pos=郾䝜 $1 到 $2 共 $3 mail_pri=優先值 mail_replyto=回至 mail_reset=清除 mail_return=使用者電子郵件 mail_return2=使用者郵件 mail_rfc=寄件人 mail_samecrypt=<金鑰從目的位置> mail_search=找尋郵件, 其中 mail_search2=搜尋: mail_sent=在發送郵件列表中 mail_sig=編輯簽名 mail_sign=GnuPG加密: mail_size=大小 mail_subject=主題 mail_title=使用者電子郵件 mail_to=收件人 reply_attach=轉寄附件夾帶 reply_attach2=附件夾帶 reply_body=訊息文字 reply_draft=存至草稿 reply_ecannot=您不被允許以這個使用者名稱送出郵件 reply_headers=郵件標頭 reply_mailforward=已轉寄的郵件 reply_send=送出 reply_spell=拼字檢查? reply_title=回覆到電子郵件 search_all=在所有資料夾 search_ecannot=您不被允許搜尋這個使用者的郵件 search_efield=您必須選取搜尋類型 search_ematch=您必須輸入搜尋的條件 search_enone=未輸入條件 search_ewhat=未輸入列$1符合文字 search_local=在本地資料夾 search_none=找不到符合的郵件. search_results2=$1郾䝜珌合$2 search_results3=$1郵件不符合$2 search_results4=$1封郵件訊息符合您的搜尋 search_title=搜尋結果 send_draft=寄給$1儲存到草稿資料夾 send_eattach=附件大小總合不能超過 $1 kB。 send_eattachsize=郵件附加檔超過允許最大的大小$1 位元組 send_ecannot=您不被允許以這個使用者名稱送出郵件 send_ecrypt=訊息編碼失敗:$1 send_efile=閱讀附帶檔$1失敗 : $2 send_efrom=遺失寄件人郵件位址 send_ekey=在郵件$1找不到金鑰 send_eline=在線$1上: send_epass=您不能對訊息作數位簽章,因為您尚未設定GunPG模組裡的通行碼 send_epath=Sendmail程式 $1不存在。 send_eperms=使用者 $1 不能閱讀 $2 send_eperms2=您不被允許發送檔$1 send_err=郵件送出失敗 send_esign=數位簽章訊息失敗: $1 send_esmtp=SMTP 命令 $1 失敗: $2 send_espell=在您的訊息中找到下列拼字錯誤 .. send_eto=遺失收件人郵件位址 send_eword=錯字$1 send_eword2=錯字$1 - 可能正確的是 $2 send_ok=郵件成功的送給 $1 send_title=送出郵件 sform_all=<所有資料夾> sform_and=找到下列符合所有條件訊息 .. sform_body=訊息內容 sform_cc=副本: 檔頭 sform_date=日期:檔頭 sform_folder=在資料夾 sform_from=從:檔頭 sform_headers=任何檔頭 sform_local=<本地資料夾> sform_neg0=包含 sform_neg1=不包含 sform_ok=接受 sform_or=找到下列符合任一條件訊息 .. sform_return=進階搜尋 sform_size=訊息大小 sform_subject=主旨: 檔頭 sform_text=在文字 sform_title=進階搜尋 sform_to=收件人: 檔頭 sform_where=哪裡 view_allheaders=查看所有郵件檔頭 view_ashtml=檢視HTML view_astext=檢視文字 view_attach=附件夾帶 view_black=封鎖寄件者 view_body=訊息文字 view_crypt=GnuPG郵件解密 view_crypt_1=訊息已加密,但GnuPG支援尚未安裝 view_crypt_2=解密訊息失敗: $1 view_crypt_3=郵件成功解密 view_crypt_4=加密保護郵件成功解密 view_dall=<所有檔案> view_delete=刪除 view_desc=郾䝜 $1 在 $2 view_desc2=使用者$2的郵件$1 view_desc3=郾䝜$1 view_detach=附加檔案: view_diagnostic-code=失敗原因 view_dir=到伺服器檔案或目錄 view_dstatus=傳送狀態失敗 view_ecannot=您不被允許讀取這個使用者的郵件 view_egone=訊息不存在 view_enew=編輯新郵件 view_final-recipient=最後收件者 view_folder=返回信箱 view_forward=轉寄 view_gnupg=GnuPG認證簽章 view_gnupg_0=$1簽章確認 view_gnupg_1=$1簽章有效,但無法建立垃圾桶 view_gnupg_2=$1簽章尚未確認 view_gnupg_3=您的清單中無金鑰$1,所以簽章無效 view_gnupg_4=確認簽章 view_headers=郵件標頭 view_mark=標記為: view_mark0=未閱讀 view_mark1=閱讀 view_mark2=特別 view_noheaders=察看基本郵件檔頭 view_print=列印 view_qdesc=佇列中的郵件 $1 view_raw=檢視原始訊息 view_razor=回報給Razor view_recv=從金鑰主機取得金鑰$1. view_remote-mta=遠端郵件伺服器 view_reply=回覆 view_reply2=回覆給全部 view_reporting-mta=回報郵件伺服器 view_return=原始郵件 view_sent=已發送郵件列表中的郵件$1 view_strip=移除附件 view_sub=附帶的郵件 view_title=讀取電子郵件 mailbox/lang/sv0100664000567100000120000000441110032203565013464 0ustar jcameronwheelmail_title=Användar-e-post mail_from=Frĺn mail_date=Datum mail_subject=Ärende mail_to=Till mail_cc=Kopia till mail_bcc=Osynlig kopia till mail_pri=Prioritet mail_highest=Högsta mail_high=Hög mail_low=Lĺg mail_lowest=Lägsta mail_for=I $1 mail_size=Storlek mail_delete=Radera angivna brev mail_compose=Skriv nytt brev mail_return=användarpost mail_ecannot=Du fĺr inte läsa e-post till denna användare mail_all=Välj allt mail_invert=Välj allt utom redan valt mail_search=Sök meddelanden där mail_body=Brevkroppen mail_match=innehĺller mail_ok=Sök mail_nonefrom=Ingen view_title=Läs e-post view_desc=Brev $1 i $2 view_qdesc=Köad e-post $1 view_headers=Rubriker view_attach=Bilagor view_reply=Svara view_reply2=Svara till alla view_forward=Skicka vidare view_delete=Radera view_ecannot=Du fĺr inte läsa e-post till denna användare compose_title=Skriv brev reply_title=Svara pĺ brev forward_title=Skicka vidare brev reply_headers=Rubriker reply_attach=Vidaresända bilagor reply_attach2=Bilagor reply_send=Skicka reply_ecannot=Du fĺr inte skicka e-post som denna användare send_err=Det gick inte att skicka brevet send_eto=Mottagaradress saknas send_efrom=Avsändaradress saknas send_title=Skickat brev send_ok=Brevet skickat till $1 send_ecannot=Du fĺr inte skicka e-post som denna användare send_esmtp=SMTP-kommando $1 misslyckades: $2 send_eattach=Den sammanlagda storleken pĺ bilagorna fĺr inte vara större än $1 kB send_eperms=Användare $1 kan inte läsa $2 send_eperms2=Du fĺr inte skicka filen $1 delete_ecannot=Du fĺr inte radera e-post frĺn denna användare delete_enone=Du har inte angivit vilket meddelande som ska tas bort search_title=Sökresultat search_ecannot=Du fĺr inte söka i denna användares e-post search_ematch=Du mĺste ange en text som brevet ska innehĺlla search_none=Inget brev passade in pĺ angivna villkor acl_none=Inga acl_same=Användare med samma namn acl_all=Alla acl_read=Användare vars e-post fĺr läsas acl_users=Endast användare acl_userse=Alla utom användare acl_usersg=Medlemmar i grupp acl_from=Tillĺtna avsändaradresser acl_any=Alla acl_fdoms=brevlĺda@domäner acl_faddrs=Angivna adresser acl_fdom=valfri adress@domän acl_apath=Begränsa filer och program till katalog acl_attach=Maximal sammanlagd storlek pĺ bilagor log_delmail=Tog bort $1 brev frĺn $2 log_send=Skickade e-post till $1 mailbox/lang/tr0100664000567100000120000000433510032203570013462 0ustar jcameronwheelmail_title=Kullanýcý E-Posta mail_from=Nereden mail_date=Tarih mail_subject=Konu mail_to=Nereye mail_pri=Öncelik mail_highest=En yüksek mail_high=Yüksek mail_low=Düţük mail_lowest=en düţük mail_for=$1'de mail_size=Boyut mail_delete=Seçilen mesajlarý sil mail_compose=Yeni posta oluţtur mail_return=Kullanýcý e-posta mail_ecannot=Bu kullanýcýnýn e-postasýný okumak için izininiz yoktur mail_all=Hepsini seç mail_invert=Seçimi ters çevir mail_search=Mesajlarýn aranýlacađý yer mail_body=Mesaj içeriđi mail_ok=Ara view_title=E-posta oku view_desc=Mesaj $1, $2'de view_qdesc=Kuyruđa konulmuţ mesaj $1 view_headers=Posta baţlýklarý view_attach=Ekler view_reply=Geri gönder view_reply2=Hepsine geri gönder view_forward=Döndür view_delete=Sil view_ecannot=Bu kullanýcýnýn e-postasýný okumak için izininiz yoktur compose_title=E-posta Gönder reply_title=E-postayý Geri Gönder forward_title=E-postayý Döndür reply_headers=Posta baţlýklarý reply_attach=Döndürülmüţ ekler reply_attach2=Ekler reply_send=Gönder reply_ecannot=Bu kullanýcý olarak e-posta göndermek için izininiz yoktur send_err=Postanýn gönderilmesinde hata oluţtu send_eto=Nereye adresini girmelisiniz send_efrom=Nereden adresini girmelisiniz send_title=Posta Gönder send_ok=Posta $1'e baţarýyla gönderildi send_ecannot=Bu kullanýcý olarak e-posta göndermek için izininiz yoktur send_esmtp=SMTP komutu $1'de hata oluţtu : $2 send_eattach=Ek dosyalarýn boyutu $1 KB'den daha büyük olmamalýdýrlar. send_eperms=$1 kullanýcýsý $2'yi okuyamaz delete_ecannot=Bu kullanýcý olarak e-posta silmek için izininiz yoktur delete_enone=Silmek için posta silinmedi search_title=Arama sonuçlarý search_ecannot=Bu kullanýcý e-postalarýný aramak için izininiz yoktur search_ematch=Takip eden kutuya bir yazý girmelisiniz search_none=Mesaj bulunamadý. acl_none=Hiçbiri acl_all=Hepsi acl_read=Kullanýcýlarýn okuyabilecekleri postalar acl_users=Sadece kullanýcýlar acl_userse=Kullanýcýlardan baţka herkes acl_from=Ýzin verilebilir From: adresleri acl_any=Herhangi bir adres acl_fdoms=Posta kutusu @ alanlar acl_faddrs=Listelenmiţ alanlar acl_fdom=Herhangi adres @ alan acl_apath=Dizin için program ve dosya limitleri acl_attach=En çok toplam posta ek dosyalarý boyutu log_delmail=$2'den $1 mesajý silindi log_send=$1'e posta gönderildi mailbox/lang/zh_CN0100664000567100000120000000476510153206061014047 0ustar jcameronwheelmail_title=ÓĂť§ÓĘźţ mail_from=Ŕ´×Ô mail_date=ČŐĆÚ mail_subject=Ö÷Ěâ mail_to=ˇ˘Íů mail_cc=תËÍ mail_bcc=ĂÜËÍ mail_pri=ÓĹĎČźś mail_highest=×î¸ß mail_high=¸ß mail_normal=Ňť°ă mail_low=ľÍ mail_lowest=×îľÍ mail_for=ÔÚ $1 mail_for2=ÓĂÓÚÓĂť§$1 mail_sent=ÔÚˇ˘ËÍÓĘźţÁĐąíÖĐ mail_size=´óĐĄ mail_delete=ÉžłýŃĄś¨ľÄÓĘźţ mail_compose=ąŕĐ´ĐÂÓĘźţ mail_return=ÓĂť§ÓĘĎä mail_ecannot=ÄúĂťÓĐÔÄśÁ¸ĂÓĂť§ľÄÓĘźţľÄȨĎŢ mail_all=ČŤ˛żŃĄÖĐ mail_invert=ÄćĎňŃĄČĄ mail_search=ѰŐŇÓĘźţŁŹĆäÖĐ mail_body=ŐýÎÄ mail_match=ĆĽĹä mail_ok=ËŃË÷ mail_nonefrom=ÎŢ mail_mark=˝ŤŇŃŃĄÖĐľÄÓĘźţąęźÇÎŞŁş mail_mark0=δÔÄśÁ mail_mark1=ÔÄśÁ mail_mark2=ĚŘąđ mail_forward=תˇ˘ŇŃŃĄÔńľÄ mail_rfc=źÄźţČËĐĐ view_title=ÔÄśÁÓĘźţ view_desc=$2ÖĐľÄÓĘźţ$1 view_desc2=ÓĂť§$2ľÄÓĘźţ$1 view_desc3=ÓĘźţ$1 view_sent=Ňѡ˘ËÍÓĘźţÁĐąíÖĐľÄÓĘźţ$1 view_qdesc=´ýˇ˘ľÄÓĘźţ $1 view_headers=ÓĘźţ͡ view_allheaders=˛éż´ËůÓĐÓĘźţ͡ view_noheaders=˛ěż´ťůąžÓĘźţ͡ view_attach=¸˝źţ view_reply=ťŘ¸´ view_reply2=ťŘ¸´¸řËůÓĐ view_enew=ąŕź­ĐÂÓĘźţ view_forward=תˇ˘ view_delete=Éžłý view_strip=ŇĆłý¸˝źţ view_ecannot=ÄúĂťÓĐÔÄśÁ¸ĂÓĂť§ľÄÓĘźţľÄȨĎŢ view_mark0=δÔÄśÁ view_mark1=ÔÄśÁ view_mark2=ĚŘąđ view_return=Ô­źţ view_sub=´řÓи˝źţľÄÓĘźţ compose_title=ąŕĐ´ÓĘźţ reply_title=ťŘ¸´ÓĘźţ forward_title=תˇ˘ÓĘźţ reply_headers=ÓĘźţ͡ reply_attach=תˇ˘ľÄ¸˝źţ reply_mailforward=ŇŃתˇ˘ľÄÓĘźţ reply_attach2=żÍť§śËşÍˇţÎńĆ÷ľÄ¸˝źţ reply_send=ˇ˘ËÍ reply_ecannot=ÄúĂťÓĐŇÔŐâ¸öÓĂť§ľÄÉíˇÝˇ˘ËÍÓĘźţľÄȨĎŢ send_err=Îޡ¨ˇ˘ËÍÓĘźţ send_eto=δĘäČ륰ˇ˘ÍůĄąľŘÖˇ send_efrom=śŞĘ§Ą°Ŕ´×ÔĄąľŘÖˇ send_title=Ňѡ˘ËÍľÄÓĘźţ send_ok=ÓĘźţŇŃłÉšŚˇ˘ËÍľ˝ $1 send_ecannot=ÄúĂťÓĐŇÔŐâ¸öÓĂť§ľÄÉíˇÝˇ˘ËÍÓĘźţľÄȨĎŢ send_esmtp=SMTP ĂüÁî $1 ʧ°ÜŁş$2 send_eattach=¸˝źţ´óĐĄ×ÜÁż˛ťÄÜłŹšý $1 kBĄŁ send_eperms=ÓĂť§ $1 ˛ťÄÜÔÄśÁ $2 send_eperms2=ÄúĂťÓС˘ËÍÎÄźţ$1ľÄȨĎŢ send_epath=SendmailłĚĐň $1˛ť´ćÔÚĄŁ delete_ecannot=ÄúĂťÓĐÉžłýŐâ¸öÓĂť§ľÄÓĘźţľÄȨĎŢ delete_enone=ÝѥÔńŇŞÉžłýľÄÓĘźţ delete_emnone=ĂťÓĐŃĄÔńŇŞąęźÇľÄÓĘźţ search_title=ËŃË÷˝ášű search_ecannot=ÄúĂťÓĐËŃË÷¸ĂÓĂť§ľÄÓĘźţľÄȨĎŢ search_ematch=ÄúąŘĐëÔŮ´ÎĘäČëĆĽĹäľÄÎÄąžĄŁ search_none=ŐҲťľ˝ÓĘźţĄŁ search_results2=$1ÓĘźţĆĽĹä$2 search_results3=$1ÓĘźţ˛ťĆĽĹä$2 acl_none=ÎŢ acl_same=ÍŹĂűľÄÓĂť§ acl_all=ËůÓĐ acl_read=żÉÔÄśÁĆäÓĘźţľÄÓĂť§ acl_users=˝öĎŢÓĂť§ acl_userse=ËůÓĐÓĂť§łýÁË acl_usersg=×éľÄłÉÔą acl_from=ÔĘĐíĄ°Ŕ´×ÔĄąľŘÖˇ acl_any=ČκξŘÖˇ acl_fdoms=ÓĘĎä @ Óň acl_faddrs=ÁĐłöľÄľŘÖˇ acl_fdom=ČκξŘÖˇ @ Óň acl_fromname=Ŕ´Ô´ľŘÖˇľÄŐćĂű acl_apath=ĎŢÖĆÎÄźţşÍłĚĐňľ˝ÄżÂź acl_attach=×î´ó¸˝źţ×Ü´óĐĄ acl_sent=ÔÚÓĘĎäÖĐ´˘´ćŇѡ˘ËÍľÄÓĘźţ acl_canattach=żÉŇÔŐł¸˝ˇţÎńĆ÷ÎÄźţÂ𣿠acl_usersm=ĆĽĹäľÄÓĂť§ acl_asame=ÓëÓĂť§ĎŕÍŹ log_delmail=ŇŃ´Ó $2 Éžłý $1ÓĘźţ log_send=Ňѡ˘ËÍÓĘźţľ˝ $1 mailbox/lang/zh_TW.Big50100664000567100000120000001642710153206067014672 0ustar jcameronwheelacl_all=ĽţłĄ acl_any=ĽôŚóślĽóŚě§} acl_apath=­­¨îŔɎ׊Mľ{ŚĄ¨ěĽŘżý acl_asame=ťP¨ĎĽÎŞĚŹŰŚP acl_attach=łĚ¤jŞţĽóÁ`¤j¤p acl_canattach=ĽiĽHŞţĽ[ŚřŞAžšŔɜܥH acl_candetach=ĽiĽHŞţąaŔɎרěŚřŞAžš? acl_faddrs=ŚCĽXŞşślĽóŚě§} acl_fdom=ĽôŚóślĽóŚě§}Śbşô°ě acl_fdoms=ŤH˝cŚbşô°ě acl_from=¨ĚžÚślĽóŚě§}¤šł\ acl_fromname=¨Óˇ˝Śa§}ŞşŻušęŚWşŮ acl_none=ľL acl_read=ĽiĽHĹŞ¨ú­ţ¨Ç¨ĎĽÎŞĚŞşślĽó acl_same=ŚPŚWŞş¨ĎĽÎŞĚ acl_sent=Śbśl˝c¤¤ŔxŚs¤wľo°eŞşślĽó acl_users=ĽuŚł¨ĎĽÎŞĚ acl_userse=ĽţłĄ, °Ł¤F¨ĎĽÎŞĚ acl_usersg=˛ŐŞşŚ¨­ű acl_usersm=˛ĹŚXŞş¨ĎĽÎŞĚ acl_usersu=ŚbUID˝dłň¤ş compose_title=źg§@šq¤lślĽó confirm_ok=˛{Śb§R°Ł confirm_title=˝Tť{§R°Ł confirm_warn=ąz˝TŠw­n§R°Ł $1 ŤĘżď¨úŞş°Tާ? confirm_warn2=Ś]ʰązŞşŤH˝c¤j¤pťPŽćŚĄĄAťÝ­n¤@ÂIŽÉśĄĄAŞ˝¨ě§R°Ł§šŚ¨ŤáĄA¤Łˇ|°őŚć¨äĽL°Ę§@ confirm_warn3=ąz˝TŠw­n§R°Ł°Tާ confirm_warn4=Ş˝¨ě§R°Ł§šŚ¨ĄA¤Łˇ|°őŚć¨äĽL°Ę§@ĄC confirm_warnall=ąz˝TŠw­n§R°Ł¸ęŽĆ§¨¤¤ŠŇŚł°Tާ? delete_ecannot=ąz¤ŁłQ¤šł\§R°Łło­Ó¨ĎĽÎŞĚŞşślĽó delete_ecopycannot=ąz¤ŁłQ¤šł\˝ĆťsślĽó¨ěŻSŠwŞş¨ĎĽÎŞĚ delete_ecopynone=Ľźżď¨ú˝ĆťsślĽó delete_ecopyuser=˝ĆťsślĽó¨ĎĽÎŞĚ¤ŁŚsŚb delete_efnone=Ľźżď¨úÂŕąHślĽó delete_emnone=¨SŚłżďžÜ­nźĐ°OŞşślĽó delete_emovecannot=ąz¤ŁłQ¤šł\˛ž°ĘślĽó¨ěŻSŠwŞş¨ĎĽÎŞĚ delete_emovenone=Ľźżď˛ž°ĘąHślĽó delete_emoveuser=¨ĎĽÎŞĚ˛ž°ĘślĽó¤ŁŚsŚb delete_enone=¨SŚłżďžÜ­n§R°ŁŞşślĽó delete_nobutton=ĽźŤöŤöśs delete_ok=˛{Śb§R°Ł delete_rusure=ąz˝TŠw­nąq$2§R°Ł $1 ŤĘżď¨úŞş°Tާ?¤jŔɎתşślĽóťÝ­n¤@¨ÇŽÉśĄĄAŞ˝¨ě§R°Ł§šŚ¨ĄA¤Łˇ|°őŚć¨äĽL°Ę§@ĄC delete_rusure2=ąz˝TŠw­n§R°Ł $1 ŤĘżď¨úŞş°Tާ?¤jŔɎתşślĽóťÝ­n¤@¨ÇŽÉśĄĄAŞ˝¨ě§R°Ł§šŚ¨ĄA¤Łˇ|°őŚć¨äĽL°Ę§@ĄC delete_title=§R°ŁślĽó detach_edir=¨SŚłżé¤JŔxŚsŞşŔɎ׊μؿý detach_eopen=ś}Šl$1Ľ˘ąŃ:$2 detach_err=ŞţĽ[ŔɎ׼˘ąŃ detach_ewrite=źgľš$1Ľ˘ąŃ:$2 detach_ok=ąqŚřŞAşÝŞţĽ[ŔÉŽ×$1($2) detach_title=ŞţĽ[ŔÉŽ× enew_title=˝sżčślĽó find_enone=¨SŚłązˇj´MŠŇ˛ĹŚXŞş¨ĎĽÎŞĚ find_group=¸s˛Ő find_home=ŽaĽŘżý find_real=ŻušęŚWşŮ find_results=ˇj´M$1˛ĹŚXŞş¨ĎĽÎŞĚ.. find_size=ślĽó¤j¤p find_title=ˇj´Mľ˛ŞG find_user=¨ĎĽÎŞĚŚWşŮ folder_drafts=Żó˝Z folder_inbox=ŚŹĽó§¨ folder_sent=śÇ°eślĽó folder_trash=ŠU§Łąí forward_title=ÂŕąH¨ěšq¤lślĽó index_contains=Ľ]§t index_empty=ľLślĽó index_equals=ľĽŠó index_esystem=ŚbązŞş¨t˛Î¤W§ä¤Ł¨ě¤ä´ŠŞşślĽóŚřŞAžš(Qmail, Postfix ŠM Sendmail)ĄAązĽiĽH¤â°Ę˝ŐžăźŇ˛Ő˛ŐşA¨Ół]ŠwślĽóŚřŞAžšŠMślĽó¸ôŽ| index_esystem2=ŚbązŞş¨t˛Î¤W§ä¤Ł¨ěźŇ˛Ő˛ŐşA¤¤ł]ŠwŞşślĽóŚřŞAžšĄAązťÝ­n˝ŐžăĽż˝TŞşŚřŞAžš˛ŐşAĄC index_find=Śb¨ĎĽÎŞĚŚWşŮ¤¤§ä´M¨ĎĽÎŞĚ index_header=¨ĎĽÎŞĚŤH˝c index_none=ąz¤ŁłQ¤šł\ĽôŚóŚš¨t˛Î¤W¨ĎĽÎŞĚĹŞ¨úślĽó index_return=Sendmail ˛ŐşA index_system0=ślĽóŚřŞAžš:Postfix index_system1=ślĽóŚřŞAžš:Sendmail index_system2=ślĽóŚřŞAžš:Qmail index_title=Sendmail ˛ŐşA index_toomany=ŚbązŞş¨t˛Î¤WŚł¤ÓŚhŞş¨ĎĽÎŞĚĄAŠŇĽHľLŞkŚPŽÉĹăĽÜŚb¤@­ś¤W log_copymail=ąq $2 ¨ě $3 ˝Ćťs$1ŤĘ°Tާ log_delmail=¤wąq $2 §R°Ł $1ślĽó log_movemail=ąq $2 ¨ě $3 ˛ž°Ę$1ŤĘ°Tާ log_send=¤wľo°eślĽó¨ě $1 mail_addresses=şŢ˛zÁpľ¸¤H mail_advanced=śiśĽˇj´M mail_all=żďžÜĽţłĄ mail_bcc=ÁôÂðƼť mail_body=ĽťĹé mail_cc=°ĆĽť§Ű°e mail_compose=źg§@ˇsślĽó mail_copy=˝Ćťs¨ě: mail_crypt=GnuPGĽ[ąKľš: mail_date=¤é´Á mail_delall=ĽţłĄ§R°Ł mail_delete=§R°ŁżďžÜŞşślĽó mail_deltrash=ŞĹŠU§Łąí mail_ecannot=ąz¤ŁłQ¤šł\ĹŞ¨úło­Ó¨ĎĽÎŞĚŞşślĽó mail_eexists=°Tާ¤ŁŚsŚb¤F! mail_err=Śš¸ęŽĆ§¨¤¤ślĽóŚCŞíľoĽÍ¤@­Óżůť~ : $1 mail_fchange=Ĺܧó mail_folder=¸ęŽĆ§¨ mail_folders=şŢ˛z¸ęŽĆ§¨ mail_for=Śb $1 mail_for2=ĽÎŠó¨ĎĽÎŞĚ$1 mail_forward=ÂŕąH¤wżďžÜŞş mail_from=ąHĽó¤H mail_high=°Ş mail_highest=łĚ°Ş mail_invert=¤ĎŚVżď¨ú mail_jump=¸őŚÜ­ś­ą: mail_login=ľn¤J mail_logindesc=ązĽ˛śˇŚbślĽóĽDž÷$1¤W
żé¤J¨ĎĽÎŞĚŚWşŮŠMąK˝X¨Óśi¤JŤH˝c mail_loginheader=POP3ľn¤JŚřŞAžš mail_loginmailbox=IMAPŤH˝c mail_loginpass=ąK˝X mail_loginuser=¨ĎĽÎŞĚŚWşŮ mail_logout=ĹܧóPOP3ľn¤J mail_logout2=ĹܧóIMAPľn¤J mail_low=§C mail_lowest=łĚ§C mail_mark=ąNżď¨úŞşślĽóźĐ°OʰĄG mail_mark0=Ľźž\ĹŞ mail_mark1=ž\ĹŞ mail_mark2=ŻS§O mail_match=˛ĹŚX mail_move=˛žŚÜ: mail_nocrypt=<¤Ł˝s˝X> mail_none=ŤH˝c¤¤¨SŚłślĽó mail_nonefrom=ľL mail_normal=¤@Żë mail_nosign=<¤ŁĂąĂŇ> mail_of=Şş mail_ok=ˇj´M mail_pos=ślĽó $1 ¨ě $2 Ś@ $3 mail_pri=ŔuĽý­Č mail_replyto=Ś^ŚÜ mail_reset=˛M°Ł mail_return=¨ĎĽÎŞĚšq¤lślĽó mail_return2=¨ĎĽÎŞĚślĽó mail_rfc=ąHĽó¤H mail_samecrypt=<Ş÷Ć_ąqĽŘŞşŚě¸m> mail_search=§ä´MślĽó, ¨ä¤¤ mail_search2=ˇj´M: mail_sent=Śbľo°eślĽóŚCŞí¤¤ mail_sig=˝sżčĂąŚW mail_sign=GnuPGĽ[ąK: mail_size=¤j¤p mail_subject=ĽDĂD mail_title=¨ĎĽÎŞĚšq¤lślĽó mail_to=ŚŹĽó¤H reply_attach=ÂŕąHŞţĽó§¨ąa reply_attach2=ŞţĽó§¨ąa reply_body=°Tާ¤ĺŚr reply_draft=ŚsŚÜŻó˝Z reply_ecannot=ąz¤ŁłQ¤šł\ĽHło­Ó¨ĎĽÎŞĚŚWşŮ°eĽXślĽó reply_headers=ślĽóźĐŔY reply_mailforward=¤wÂŕąHŞşślĽó reply_send=°eĽX reply_spell=Ť÷ŚrŔËŹd? reply_title=Ś^ÂШěšq¤lślĽó search_all=ŚbŠŇŚł¸ęŽĆ§¨ search_ecannot=ąz¤ŁłQ¤šł\ˇj´Mło­Ó¨ĎĽÎŞĚŞşślĽó search_efield=ązĽ˛śˇżď¨úˇj´MĂţŤŹ search_ematch=ązĽ˛śˇżé¤Jˇj´MŞşąřĽó search_enone=Ľźżé¤JąřĽó search_ewhat=Ľźżé¤JŚC$1˛ĹŚX¤ĺŚr search_local=ŚbĽťŚa¸ęŽĆ§¨ search_none=§ä¤Ł¨ě˛ĹŚXŞşślĽó. search_results2=$1ślĽó˛ĹŚX$2 search_results3=$1ślĽó¤Ł˛ĹŚX$2 search_results4=$1ŤĘślĽó°Tާ˛ĹŚXązŞşˇj´M search_title=ˇj´Mľ˛ŞG send_draft=ąHľš$1ŔxŚs¨ěŻó˝Z¸ęŽĆ§¨ send_eattach=ŞţĽó¤j¤pÁ`ŚX¤ŁŻŕśWšL $1 kBĄC send_eattachsize=ślĽóŞţĽ[ŔÉśWšL¤šł\łĚ¤jŞş¤j¤p$1 Śě¤¸˛Ő send_ecannot=ąz¤ŁłQ¤šł\ĽHło­Ó¨ĎĽÎŞĚŚWşŮ°eĽXślĽó send_ecrypt=°Tާ˝s˝XĽ˘ąŃ:$1 send_efile=ž\ĹŞŞţąaŔÉ$1Ľ˘ąŃ : $2 send_efrom=żňĽ˘ąHĽó¤HślĽóŚě§} send_ekey=ŚbślĽó$1§ä¤Ł¨ěŞ÷Ć_ send_eline=Śb˝u$1¤W: send_epass=ąz¤ŁŻŕšď°Tާ§@źĆŚěĂąłšĄAŚ]ʰązŠ|Ľźł]ŠwGunPGźŇ˛Ő¸ĚŞşłqŚć˝X send_epath=Sendmailľ{ŚĄ $1¤ŁŚsŚbĄC send_eperms=¨ĎĽÎŞĚ $1 ¤ŁŻŕž\ĹŞ $2 send_eperms2=ąz¤ŁłQ¤šł\ľo°eŔÉ$1 send_err=ślĽó°eĽXĽ˘ąŃ send_esign=źĆŚěĂąłš°TާĽ˘ąŃ: $1 send_esmtp=SMTP ŠRĽO $1 Ľ˘ąŃ: $2 send_espell=ŚbązŞş°Tާ¤¤§ä¨ě¤UŚCŤ÷Śrżůť~ .. send_eto=żňĽ˘ŚŹĽó¤HślĽóŚě§} send_eword=żůŚr$1 send_eword2=żůŚr$1 - ĽiŻŕĽż˝TŞşŹO $2 send_ok=ślĽóڍĽ\Şş°eľš $1 send_title=°eĽXślĽó sform_all=<ŠŇŚł¸ęŽĆ§¨> sform_and=§ä¨ě¤UŚC˛ĹŚXŠŇŚłąřĽó°Tާ .. sform_body=°Tާ¤şŽe sform_cc=°ĆĽť: ŔÉŔY sform_date=¤é´Á:ŔÉŔY sform_folder=Śb¸ęŽĆ§¨ sform_from=ąq:ŔÉŔY sform_headers=ĽôŚóŔÉŔY sform_local=<ĽťŚa¸ęŽĆ§¨> sform_neg0=Ľ]§t sform_neg1=¤ŁĽ]§t sform_ok=ąľ¨ü sform_or=§ä¨ě¤UŚC˛ĹŚXĽô¤@ąřĽó°Tާ .. sform_return=śiśĽˇj´M sform_size=°Tާ¤j¤p sform_subject=ĽDŚŽ: ŔÉŔY sform_text=Śb¤ĺŚr sform_title=śiśĽˇj´M sform_to=ŚŹĽó¤H: ŔÉŔY sform_where=­ţ¸Ě view_allheaders=ŹdŹÝŠŇŚłślĽóŔÉŔY view_ashtml=ŔËľřHTML view_astext=ŔËľř¤ĺŚr view_attach=ŞţĽó§¨ąa view_black=ŤĘÂęąHĽóŞĚ view_body=°Tާ¤ĺŚr view_crypt=GnuPGślĽó¸ŃąK view_crypt_1=°Tާ¤wĽ[ąKĄAŚýGnuPG¤ä´ŠŠ|ĽźŚw¸Ë view_crypt_2=¸ŃąK°TާĽ˘ąŃ: $1 view_crypt_3=ślĽóڍĽ\¸ŃąK view_crypt_4=Ľ[ąKŤOĹ@ślĽóڍĽ\¸ŃąK view_dall=<ŠŇŚłŔÉŽ×> view_delete=§R°Ł view_desc=ślĽó $1 Śb $2 view_desc2=¨ĎĽÎŞĚ$2ŞşślĽó$1 view_desc3=ślĽó$1 view_detach=ŞţĽ[ŔÉŽ×: view_diagnostic-code=Ľ˘ąŃ­ěŚ] view_dir=¨ěŚřŞAžšŔɎ׊μؿý view_dstatus=śÇ°eŞŹşAĽ˘ąŃ view_ecannot=ąz¤ŁłQ¤šł\ĹŞ¨úło­Ó¨ĎĽÎŞĚŞşślĽó view_egone=°Tާ¤ŁŚsŚb view_enew=˝sżčˇsślĽó view_final-recipient=łĚŤáŚŹĽóŞĚ view_folder=ŞđŚ^ŤH˝c view_forward=ÂŕąH view_gnupg=GnuPGť{ĂŇĂąłš view_gnupg_0=$1Ăąłš˝Tť{ view_gnupg_1=$1ĂąłšŚłŽÄĄAŚýľLŞkŤŘĽßŠU§Łąí view_gnupg_2=$1ĂąłšŠ|Ľź˝Tť{ view_gnupg_3=ązŞş˛Młć¤¤ľLŞ÷Ć_$1ĄAŠŇĽHĂąłšľLŽÄ view_gnupg_4=˝Tť{Ăąłš view_headers=ślĽóźĐŔY view_mark=źĐ°Oʰ: view_mark0=Ľźž\ĹŞ view_mark1=ž\ĹŞ view_mark2=ŻS§O view_noheaders=šîŹÝ°ňĽťślĽóŔÉŔY view_print=ŚCŚL view_qdesc=ŚîŚC¤¤ŞşślĽó $1 view_raw=ŔËľř­ěŠl°Tާ view_razor=Ś^łřľšRazor view_recv=ąqŞ÷Ć_ĽDž÷¨úąoŞ÷Ć_$1. view_remote-mta=ťˇşÝślĽóŚřŞAžš view_reply=Ś^ÂĐ view_reply2=Ś^ÂĐľšĽţłĄ view_reporting-mta=Ś^łřślĽóŚřŞAžš view_return=­ěŠlślĽó view_sent=¤wľo°eślĽóŚCŞí¤¤ŞşślĽó$1 view_strip=˛ž°ŁŞţĽó view_sub=ŞţąaŞşślĽó view_title=ĹŞ¨úšq¤lślĽó mailbox/lang/zh_CN.UTF-80100664000567100000120000000606510420075004014642 0ustar jcameronwheelmail_title=用户邮件 mail_from=来自 mail_date=日期 mail_subject=丝题 mail_to=发往 mail_cc=转送 mail_bcc=密送 mail_pri=优先级 mail_highest=最高 mail_high=鍘 mail_normal=一般 mail_low=低 mail_lowest=最低 mail_for=在 $1 mail_for2=用于用户$1 mail_sent=在发送邮件列表中 mail_size=大小 mail_delete=删除选定的邮件 mail_compose=编写新邮件 mail_return=用户邮箱 mail_ecannot=您没有阅读该用户的邮件的权限 mail_all=全部选中 mail_invert=逆向选取 mail_search=寻找邮件,其中 mail_body=正文 mail_match=匹配 mail_ok=搜索 mail_nonefrom=无 mail_mark=将已选中的邮件标记为: mail_mark0=未阅读 mail_mark1=阅读 mail_mark2=特别 mail_forward=转发已选择的 mail_rfc=寄件人行 view_title=阅读邮件 view_desc=$2中的邮件$1 view_desc2=用户$2的邮件$1 view_desc3=邮件$1 view_sent=已发送邮件列表中的邮件$1 view_qdesc=待发的邮件 $1 view_headers=邮件头 view_allheaders=查看所有邮件头 view_noheaders=察看基本邮件头 view_attach=附件 view_reply=回复 view_reply2=回复给所有 view_enew=编辑新邮件 view_forward=转发 view_delete=删除 view_strip=移除附件 view_ecannot=您没有阅读该用户的邮件的权限 view_mark0=未阅读 view_mark1=阅读 view_mark2=特别 view_return=原件 view_sub=带有附件的邮件 compose_title=编写邮件 reply_title=回复邮件 forward_title=转发邮件 reply_headers=邮件头 reply_attach=转发的附件 reply_mailforward=已转发的邮件 reply_attach2=客户端和服务器的附件 reply_send=发送 reply_ecannot=您没有以这个用户的身份发送邮件的权限 send_err=无法发送邮件 send_eto=未输入“发往”地址 send_efrom=丢失“来自”地址 send_title=已发送的邮件 send_ok=邮件已成功发送到 $1 send_ecannot=您没有以这个用户的身份发送邮件的权限 send_esmtp=SMTP 命令 $1 失败:$2 send_eattach=附件大小总量不能超过 $1 kB。 send_eperms=用户 $1 不能阅读 $2 send_eperms2=您没有发送文件$1的权限 send_epath=Sendmail程序 $1不存在。 delete_ecannot=您没有删除这个用户的邮件的权限 delete_enone=没选择要删除的邮件 delete_emnone=没有选择要标记的邮件 search_title=搜索结果 search_ecannot=您没有搜索该用户的邮件的权限 search_ematch=您必须再次输入匹配的文本。 search_none=找不到邮件。 search_results2=$1邮件匹配$2 search_results3=$1邮件不匹配$2 acl_none=无 acl_same=同名的用户 acl_all=所有 acl_read=可阅读其邮件的用户 acl_users=仅限用户 acl_userse=所有用户除了 acl_usersg=组的成员 acl_from=允许“来自”地址 acl_any=任何地址 acl_fdoms=邮箱 @ 域 acl_faddrs=列出的地址 acl_fdom=任何地址 @ 域 acl_fromname=来源地址的真名 acl_apath=限制文件和程序到目录 acl_attach=最大附件总大小 acl_sent=在邮箱中储存已发送的邮件 acl_canattach=可以粘附服务器文件吗? acl_usersm=匹配的用户 acl_asame=与用户相同 log_delmail=已从 $2 删除 $1邮件 log_send=已发送邮件到 $1 mailbox/lang/ja_JP.UTF-80100664000567100000120000000577010420075004014626 0ustar jcameronwheelmail_title=ユーザ E ュミネ mail_from=送信元 mail_date=日付 mail_subject=件名 mail_to=宛先 mail_pri=優先度 mail_highest=最優先 mail_high=鍘 mail_normal=標準 mail_low=低 mail_lowest=最後 mail_for=$1 内 mail_sent=送信済みメール リスト内 mail_size=サイズ mail_delete=選択されたメッセージを削除 mail_compose=新規メールを作成 mail_return=ユーザ E ュミネ mail_ecannot=このユーザーのメールは読めません mail_all=すべて選択 mail_invert=選択の反転 mail_search=メッセージの検索 mail_body=本文 mail_match=一致 mail_ok=検索 mail_nonefrom=なし view_title=E メールを読む view_desc=$2のメッセージ $1 view_sent=送信済みメール リストのメッセージ $1 view_qdesc=キューされたメッセージ $1 view_headers=ュミネ ヘッダ view_attach=添付ファイル view_reply=返信 view_reply2=全員に返信 view_enew=新規として編集 view_forward=転送 view_delete=削除 view_ecannot=このユーザーのメールは読めません compose_title=E メールの作成 reply_title=E メールへの返信 forward_title=E メールの転送 reply_headers=ュミネ ヘッダ reply_attach=転送された添付ファイル reply_attach2=添付ファイル reply_send=送信 reply_ecannot=このユーザとしてはメールを送信できません send_err=メールを送信できませんでした send_eto=To (宛先)アドレスがありません send_efrom=From (送信者) アドレスがありません send_title=送信されたメール send_ok=$1 へのメールの送信を完了しました send_ecannot=このユーザとしてはメールを送信できません send_esmtp=SMTP コマンド $1 が失敗しました: $2 send_eattach=添付ファイルのサイズは $1 KB を越えられません。 send_eperms=ユーザ $1 は $2 を読み取れません send_eperms2=ファイル $1 は送信できません delete_ecannot=このユーザからのメールを削除できます delete_enone=削除するメッセージが選択されていません search_title=検索結果 search_ecannot=このユーザのメールは検索できません search_ematch=検索するにはテキストを入力する必要があります。 search_none=メッセージが見つかりませんでした。 acl_none=なし acl_same=同名のユーザ acl_all=すべて acl_read=メールを読み取れるユーザ acl_users=次のユーザのみ acl_userse=次のユーザ以外すべて acl_usersg=グループのメンバー acl_from=アドレスから許可 acl_any=任意のアドレス acl_fdoms=メールボックス @ ドメイン acl_faddrs=リストされたアドレス acl_fdom=任意のアドレス @ ドメイン acl_apath=ディレクトリへのファイルとプログラムを制限 acl_attach=添付ファイルの合計サイズの最大値 acl_sent=送信済みメールをメールボックスに保存 log_delmail=$1 メッセージを $2 から削除しました log_send=$1 にメールを送信しました mailbox/lang/ko_KR.UTF-80100664000567100000120000000541710420075004014646 0ustar jcameronwheelmail_title=紫遂切 穿切 五析 mail_from=降重切 mail_date=劾促 mail_subject=薦鯉 mail_to=呪重切 mail_cc=凧繕 mail_bcc=需精 凧繕 mail_pri=酔識 授是 mail_highest=亜舌 株製 mail_high=株製 mail_normal=塌搭 mail_low=碍製 mail_lowest=亜舌 碍製 mail_for=$1 mail_sent=降重 五析 鯉系 mail_size=滴奄 mail_delete=識枹坃 五獣走 肢薦 mail_compose=ć­Ż 五析 拙失 mail_return=紫遂切 穿切 五析 mail_ecannot=㈚ 紫遂切税 穿切 五析聖 石聖 呪 蒸柔艦陥 mail_all=䚞砧 識枹 mail_invert=鋼企稽 識枹 mail_search=五獣走 伊事 是帖 mail_body=沙庚 mail_match=析帖 mail_ok=伊事 mail_nonefrom=蒸製 view_title=穿切 五析 石奄 view_desc=$2拭 赤澗 五獣走 $1 view_sent=降重 五析 鯉系拭 赤澗 五獣走 $1 view_qdesc=企奄伸拭 赤澗 五獣走 $1 view_headers=五析 伯希 view_attach=歎採 督析 view_reply=噺重 view_reply2=犿獯 噺重 view_enew=ć­Ż 五析稽 畷増 view_forward=犿名 view_delete=肢薦 view_ecannot=㈚ 紫遂切税 穿切 五析聖 石聖 呪 蒸柔艦陥 compose_title=穿切 五析 拙失 reply_title=穿切 五析拭 噺重 forward_title=穿切 五析 犿名 reply_headers=五析 伯希 reply_attach=穿含吉 歎採 督析 reply_attach2=歎採 督析 reply_send=穿勺 reply_ecannot=㈚ 紫遂切稽 五析聖 穿勺拝 呪 蒸柔艦陥 send_err=五析聖 穿勺馬走 公梅柔艦陥 send_eto=蒸澗 呪重切 爽礞 send_efrom=蒸澗 降重切 爽礞 send_title=五析 穿勺 刃戟 send_ok=$1拭 五析聖 穿勺梅柔艦陥. send_ecannot=㈚ 紫遂切稽 五析聖 穿勺拝 呪 蒸柔艦陥 send_esmtp=SMTP 誤敬 $1 叔鳶: $2 send_eattach=歎採 督析税 恼 滴奄澗 $1KB研 段引拝 呪 蒸柔艦陥. send_eperms=紫遂切 $1粞(澗) $2聖(研) 石聖 呪 蒸柔艦陥 send_eperms2=督析 $1聖(研) 塌錨 呪 蒸柔艦陥 delete_ecannot=㈚ 紫遂切稽採斗 閤精 五析聖 肢薦拝 呪 蒸柔艦陥 delete_enone=肢薦拝 五析聖 識枹錏辰 省紹柔艦陥 search_title=伊事 衣引 search_ecannot=㈚ 紫遂切税 穿切 五析聖 伊事拝 呪 蒸柔艦陥 search_ematch=伊事拝 努什闘研 脊径背醤 杯艦陥. search_none=五獣走亜 蒸柔艦陥. acl_none=蒸製 acl_same=戚硯戚 疑析廃 紫遂切 acl_all=䚞砧 acl_read=石聖 呪 赤澗 五析聖 左鎧澗 紫遂切 acl_users=紫遂切幻 acl_userse=紫遂切研 薦須廃 䚞砧 acl_usersg=益血 姥失据 acl_from=買遂 亜管廃 降重切 爽礞 acl_any=績税税 爽礞 acl_fdoms=紫辞敗@亀五昔 acl_faddrs=蟹伸吉 爽礞 acl_fdom=績税税 爽礞@亀五昔 acl_apath=巨刑塘軒拭 䟁坃 督析 貢 覗稽益轡 薦廃 acl_attach=犿獯 歎採 督析税 罎䟁 滴奄 acl_sent=紫辞敗拭 降重 五析 煽舌 log_delmail=$2拭辞 $1鯾 五獣走 肢薦喫 log_send=$1拭惟 五析 穿勺 刃戟 mailbox/ulang/0040775000567100000000000000000010443356044013164 5ustar jcameronrootmailbox/ulang/en.old0100664000567100000000000002066410026751271014271 0ustar jcameronrootview_gnupg=GnuPG signature verification view_gnupg_0=Signature by $1 is valid. view_gnupg_1=Signature by $1 is valid, but trust chain could not be established. view_gnupg_2=Signature by $1 is NOT valid. view_gnupg_3=Key ID $1 is not in your list, so signature could not be verified. view_gnupg_4=Failed to verify signature : $1 view_crypt=GnuPG mail decryption view_crypt_1=Message is encrypted, but GnuPG support is not installed. view_crypt_2=Failed to decrypt message : $1 view_crypt_3=Mail was successfully decrypted. view_recv=Fetch key ID $1 from keyserver. view_folder=Return to mailbox view_detach=Detach file: view_dall=<All files> view_dir=to server file or directory: view_black=Deny Sender view_razor=Report to Razor view_dstatus=Failed delivery status view_final-recipient=Final recipient view_diagnostic-code=Reason for failure view_remote-mta=Remote mail server view_reporting-mta=Reporting mail server view_astext=View as text view_ashtml=View as HTML view_mark=Mark as: view_raw=View raw message mail_title=Read Mail mail_sign=Sign with GnuPG key: mail_nosign=<Don't sign> mail_crypt=GnuPG encrypt for: mail_nocrypt=<Don't encrypt> mail_samecrypt=<Keys from destination addresses> mail_addresses=Manage Address Book mail_none=There are no messages in folder $1 mail_pos=Messages $1 to $2 of $3 in folder $4 mail_fchange=Change mail_move=Move to: mail_return=mailbox mail_folders=Manage Folders mail_err=An error occurred listing mail in this folder : $1 mail_loginheader=POP3 server login mail_logindesc=You must enter a username and password to access mail
in your inbox on the mail server $1. mail_loginuser=Username mail_loginpass=Password mail_loginmailbox=IMAP mailbox mail_login=Login mail_reset=Clear mail_logout=Change POP3 login mail_logout2=Change IMAP login mail_sig=Edit Signature mail_jump=Jump to page : mail_of=of mail_replyto=Reply to mail_folder=Folder mail_delall=Delete All mail_deltrash=Empty Trash send_efile=Attached file $1 is not readable or does not exist send_epass=You cannot sign a message because your passphrase has not be setup yet in the GnuPG module. send_esign=Failed to sign message : $1 send_ekey=Couldn't find key for email address $1 send_ecrypt=Failed to encrypt message : $1 send_eword=Misspelt word $1 send_eword2=Misspelt word $1 - possible corrections $2 send_eline=In line $1 : send_espell=The following spelling errors were found in your message .. send_draft=Mail to $1 saved in drafts folder. send_eattachsize=The mail attachment exceeded the maximum allowed size of $1 bytes address_chooser=Select Address.. address_addr=Email address address_name=Real name address_none=Your address book is empty. address_title=Address Book address_desc=The table below lists addresses that you can select from when composing a new email. Addresses can also be added by clicking on them when viewing an email message. address_edit=Edit.. address_delete=Delete address_add=Add new address entry. address_err=Failed to save address address_eaddr=Missing or invalid email address address_from=From address? address_yd=Yes, default address_gdesc=This section lists groups of addresses that you can define for sending email to several people at once. address_gadd=Add a new group entry. address_gnone=Your group list is empty. address_group=Group address_members=Email addresses address_m=$1 members group_err=Failed to save address group group_egroup=Missing or invalid group name group_emembers=No member email addresses entered reply_spell=Check for spelling errors? reply_draft=Save as Draft folder_inbox=Inbox folder_sent=Sent mail folder_drafts=Drafts folder_trash=Trash delete_emnone=No mail selected to move folders_title=Manage Folders folders_desc=Each of the folders listed below can contain mail that you move into it, or mail that is placed into it automatically. There are four kinds of folders :
  • System folders like Inbox, Drafts and Sent Mail that always exist
  • Folders under the $1 directory that can be created or deleted by Usermin
  • Other files or directories that can be managed as folders by Usermin
  • POP3 accounts on other servers that can be treated as folders
folders_name=Folder name folders_path=Location folders_type=Type folders_size=Size folders_maildir=Directory folders_mbox=File folders_mhdir=MH directory folders_create=Create a new folder folders_add=Add an existing file or directory as a folder folders_return=folders list folders_serv=$1 on server $2 folders_servp=$1 on server $2 port $3 folders_padd=Add a POP3 account as a folder folders_iadd=Add an IMAP mailbox as a folder edit_title1=Create Folder edit_title2=Edit Folder edit_header=Mail folder details edit_mode=Folder type edit_mode0=File under $1 edit_mode1=External mail file edit_mode2=Sent mail file edit_name=Folder name edit_type=Storage type edit_type0=Single file (mbox) edit_type1=Qmail mail directory (Maildir) edit_type3=MH directory (MH) edit_file=External mail file or directory edit_sent=Sent mail file or directory edit_sent1=Usermin default edit_sent0=External mail file or directory edit_perpage=Messages to display per page edit_sentview=Show To: address instead of From: ? edit_pop3=POP3 account edit_imap=IMAP mailbox edit_server=POP3 server edit_port=Port number edit_iserver=IMAP server edit_user=Username on server edit_pass=Password on server edit_mailbox=IMAP mailbox edit_imapinbox=User's inbox edit_imapother=Other mailbox edit_fromaddr=From: address for messages sent from folder save_err=Failed to save folder save_ecannot=You are not allowed to use this type of folder save_ename=Missing or invalid folder name save_esys=Folder name clashes with one of the system folders save_eclash=A folder with the same name already exists save_embox='$1' does not appear to be a valid mailbox file save_emaildir='$1' does not appear to be a valid Qmail or MH mail directory save_efile='$1' does not exist or is not accessible save_eindir=External mail files cannot be under the folders directory $1 save_title=Delete Folder save_rusure=Are you sure you want to delete the folder $1 in $2? $3 kB of email will be deleted forever. save_delete=Delete Now save_eserver=Missing or invalid POP3 server save_euser=Missing username save_elogin=Failed to login to POP3 server : $1 save_elogin2=Failed to login to IMAP server : $1 save_eperpage=Missing or invalid number of messages per page save_eport=Missing or invalid port number save_efromaddr=Missing or invalid From: address save_emailbox=Failed to open IMAP mailbox : $1 save_emailbox2=Missing or invalid IMAP mailbox save_edelete=Failed to delete mail : $1 save_eappend=Failed to add mail to IMAP mailbox : $1 save_esearch=Failed to search IMAP mailbox : $1 confirm_title=Confirm Delete confirm_warn=Are you sure you want to delete the $1 selected messages? confirm_warn2=Because of the size and format of your mailbox, this may take some time. Until the deletion has finished, no other action should be performed. confirm_warn3=Are you sure you want to delete this message? confirm_warn4=Until the deletion has finished, no other action should be performed. confirm_ok=Delete Now confirm_warnall=Are you sure you want to delete all of the messages in this folder? detach_err=Failed to detach file detach_edir=No file or directory to save to entered detach_eopen=Failed to open $1 : $2 detach_ewrite=Failed to write to $1 : $2 detach_title=Detach File detach_ok=Wrote attachment to server-side file $1 ($2). razor_title=Reporting To Razor razor_report=Reporting this message to Razor and other SpamAssassin spam-blocking databases .. razor_done=.. done razor_err=.. failed! See the error message above for the reason why. black_title=Denying Sender black_done=Added the email address $1 to SpamAssassin's denied addresses list. black_already=The email address $1 is already on SpamAssassin's denied addresses list. mail_search2=Search for: mail_advanced=Advanced Search sform_title=Advanced Search sform_and=Find messages matching all criteria below .. sform_or=Find messages matches any criteria below .. sform_neg0=contains sform_neg1=doesn't contain sform_ok=Search Now sform_folder=in folder(s) sform_all=<All folders> sform_local=<Local folders> sform_where=Where sform_text=the text sform_from=From: header sform_subject=Subject: header sform_to=To: header sform_cc=Cc: header sform_date=Date: header sform_body=message body sform_headers=any header sform_size=message size sform_return=advanced search form epop3lock_tries=Failed to lock mail file $1 after trying for $2 minutes, due to a POP3 lock file. mailbox/ulang/de0100644000567100000000000001417010162115141013462 0ustar jcameronrootaddress_add=Einen neuen Adressbucheintrag hinzufügen. address_addr=E-Mail-Adresse address_chooser=Adresse auswählen address_delete=Löschen address_desc=Die unten stehende Tabelle listet die Adressen auf, die Sie auswählen können, wenn Sie eine neue E-Mail schreiben. Adressen können auch durch Anklicken einer Adresse beim Lesen einer E-Mail zum Adressbuch hinzugefügt werden. address_eaddr=Fehlende oder ungültige E-Mail-Adresse address_edit=Bearbeiten .. address_err=Fehler beim Speichern der Adresse address_from=From:-E-Mail-Addresse? address_gadd=Einen neuen Gruppeneintrag hinzufügen address_gdesc=Diese Auswahl listet Gruppen von Adressen auf, die Sie für den gleichzeitigen Versand an mehrere E-Mail-Empfänger definieren können. address_gnone=Ihre Gruppenliste ist leer. address_group=Gruppe address_m=$1 Mitglieder address_members=E-Mail-Adressen address_name=Real- oder Spitzname address_none=Ihr Adressbuch ist leer. address_title=Adressbuch address_yd=Ja, standardmäßig edit_file=Externe E-Maildatei oder Verzeichnis edit_fromaddr=From:-E-Mail-Adresse für E-Mails, die aus dem Verzeichnis gesendet werden. edit_header=E-Mailverzeichnis-Eigenschaften edit_imap=IMAP-E-Mailbox edit_imapinbox=Posteingang des Benutzers edit_imapother=Andere E-Mailbox edit_iserver=IMAP-Server edit_mailbox=IMAP-E-Mailbox edit_mode=Verzeichnistyp edit_mode0=Datei in $1 edit_mode1=Externe E-Maildatei edit_mode2=Datei für "Gesendete Nachrichten" edit_name=Verzeichnisname edit_pass=Passwort auf dem Server edit_perpage=Anzahl der E-Mails, die pro Seite angezeigt werden edit_pop3=POP3-Account edit_port=Portnummer edit_sent=Datei oder Verzeichnis für "Gesendete Nachrichten" edit_sent0=Externe E-Maildatei oder Verzeichnis edit_sent1=Usermin-Standard edit_sentview=Zeige To:-E-Mail-Adressen anstelle der From:-E-Mail-Adresse? edit_server=POP3-Server edit_title1=Verzeichnis erstellen edit_title2=Verzeichnis bearbeiten edit_type=Speichertyp edit_type0=Einzelne Datei (mbox) edit_type1=Qmail-E-Mailverzeichnis (Maildir) edit_type3=MH-Verzeichnis (MH) edit_user=Benutzername auf dem Server epop3lock_tries=Konnte die E-Mail-Speicherdatei $1 nach entsprechenden Versuchen in den letzten $2 Minuten nicht sperren, da eine POP3-Sperrdatei vorlag. folders_add=Eine existierende Datei oder Verzeichnis als Ordner hinzufügen folders_create=Neues Verzeichnis erstellen folders_desc=Jede der unten aufgelisteten Verzeichnisse kann E-Mails enthalten, die Sie manuell verschoben haben oder die über eine Regel bereits automatisch dorthin verschoben wurde. Es gibt vier Arten von Verzeichnissen:
  • System-Verzeichnisse wie "Posteingang", "Entwürfe" oder "Gesendete Nachrichten", die immer existieren und bei Löschung automatisch neu erstellt werden.
  • Verzeichnisse unterhalb dem $1 Verzeichnis, welche von Usermin erstellt oder gelöscht werden können.
  • Andere Dateien oder Verzeichnisse, welche von Usermin wie Verzeichnisse behandelt werden können.
  • POP3-Accounts auf anderen Servern, die von Usermin als Verzeichnisse behandelt werden können.
  • folders_iadd=Eine IMAP-E-Mailbox als Verzeichnis hinzufügen folders_maildir=Verzeichnis folders_mbox=Datei folders_mhdir=MH-Verzeichnis folders_name=Verzeichnisname folders_padd=Einen POP3-Account als Verzeichnis hinzufügen folders_path=Standort folders_return=Verzeichnisliste folders_serv=$1 auf Server $2 folders_servp=$1 auf Server $2 Port $3 folders_size=Größe folders_title=Verzeichnisse verwalten folders_type=Typ group_egroup=Fehlender oder ungültiger Gruppenname group_emembers=Es wurden keine Mitglieds-E-Mail-Adressen eingegeben group_err=Konnte die E-Mail-Gruppe nicht speichern mail_fromsrch=Gleicher Absender.. mail_none=Es gibt keine E-Mails im Verzeichnis $1 mail_pos=E-Mail $1 bis $2 von $3 im Ordner $4 mail_return=E-Mailbox mail_subsrch=Gleicher Betreff.. mail_title=E-Mail lesen reply_dsn=Eine Übermittlungsbestätigung anfordern? save_delete=Jetzt löschen save_eappend=Konnte diese E-Mail(s) nicht der IMAP-E-Mailbox zustellen : $1 save_ecannot=Sie dürfen diese Art der Verzeichnisse nicht benutzen. save_eclash=Ein anderes Verzeichnis mit dem gleichen Namen existiert bereits. save_edelete=Konnte die E-Mail nicht löschen : $1 save_efile='$1' existiert nicht oder ist nicht erreichbar save_efromaddr=Fehlende oder ungültige From:-E-Mail-Adresse save_eindir=Externe E-Maildateien können nicht unter dem Verzeichnis $1 liegen. save_elogin=Konnte nicht in den POP3-Server einloggen : $1 save_elogin2=Konnte nicht in den IMAP-Server einloggen : $1 save_emailbox=Konnte IMAP-E-Mailbox nicht öffnen : §1 save_emailbox2=Fehlende oder ungültige IMAP-E-Mailbox save_emaildir='$1' scheint kein gültiges Qmail- oder MH-E-Mail-Verzeichnis zu sein. save_embox='$1' scheint keine gültige E-Mailboxdatei zu sein save_ename=Fehlender oder ungültiger Verzeichnisname save_eperpage=Fehlende oder ungültige Anzahl von anzuzeigenden E-Mails pro Seite save_eport=Fehlende oder ungültige Portnummer save_err=Konnte Verzeichnis nicht speichern save_esearch=Fehler beim Suchen der IMAP-E-Mailbox : $1 save_eserver=Fehlender oder ungültiger POP3-Server save_esys=Der Verzeichnisname ist mit einem Systemverzeichnisnamen identisch oder ähnlich und wird zurückgewiesen. save_euser=Fehlender Benutzername save_rusure=Sind Sie sicher, daß Sie das Verzeichnis $1 in $2 löschen wollen? $3 KiB an E-Mails werden für immer gelöscht. save_title=Verzeichnis löschen send_efile=Die anghängte Datei $1 ist nicht lesbar oder existiert nicht. send_nobody=niemandem view_dnsnow=Eine Übermittlungsbestätigung wurde gerade an $1 verschickt. view_dsn=Übermittlungsbestätigung view_dsnbefore=Eine Übermittlungsbestätigung wurde gerade an $1 auf $2 geschickt. view_dsngot=Diese Nachricht wurde von $1 auf $2 gelesen. view_dsnreq=Eine Übermittlungsbestätigung für diese Nachricht wurde von $1 angefordert. view_dsnsend=Sende Übermittlungsbestätigung jetzt mailbox/ulang/el0100755000567100000000000001465707671622220013523 0ustar jcameronrootsend_efile=Ôď ĺđéóőíáđôüěĺíď áń÷ĺßď $1 äĺí ĺßíáé áíáăíţóéěď Ţ äĺí őđÜń÷ĺé view_gnupg=ĹđáëŢčĺőóç őđďăńáöŢň GnuPG view_gnupg_0=Ç őđďăńáöŢ áđü $1 ĺßíáé Ýăęőńç. view_gnupg_1=Ç őđďăńáöŢ áđü $1 ĺßíáé Ýăęőńç, üěůň äĺí Ţôáí ĺöéęôŢ ç áđďęáôÜóôáóç ôçň trust chain. view_gnupg_2=Ç őđďăńáöŢ áđü $1 ÄĹÍ ĹÉÍÁÉ Ýăęőńç. view_gnupg_3=Ôď Key ID $1 äĺí âńßóęĺôáé óôç ëßóôá óáň ęáé äĺí Ţôáí äőíáôŢ ç ĺđáëŢčĺőóç ôçň őđďăńáöŢň. view_gnupg_4=Áđďôő÷ßá ĺđáëŢčĺőóçň őđďăńáöŢň : $1 view_crypt=ÁđďęńőđôďăńÜöçóç GnuPG çëĺęôńďíéęďý ěçíýěáôďň view_crypt_1=Message is encrypted, but GnuPG support is not installed. view_crypt_2=Áđďôő÷ßá áđďęńőđôďăńÜöçóçň ěçíýěáôďň : $1 view_crypt_3=Ôď ěŢíőěá áđďęńőđôďăńáöŢčçęĺ ĺđéôő÷ţň. view_recv=ËŢřç key ID $1 áđü keyserver. view_folder=ĹđéóôńďöŢ óôď ăńáěěáôďęéâţôéď mail_sign=ŐđďăńáöŢ ěĺ ęëĺéäß GnuPG : mail_nosign=<Íá ěçí őđďăńáöĺß> mail_crypt=ĘńőđôďăńÜöçóç GnuPG ăéá: mail_nocrypt=<Íá ěçí ăßíĺé ęńőđôďăńÜöçóç> mail_samecrypt=<ĘëĺéäéÜ áđü äéĺőčýíóĺéň đáńáëçđôţí> mail_addresses=Äéá÷ĺßńéóç Ĺőńĺôçńßďő Äéĺőčýíóĺůí mail_none=Äĺí őđÜń÷ďőí ěçíýěáôá óôď öÜęĺëď $1 mail_pos=Ěçíýěáôá $1 Ýůň $2 áđü $3 óôď öÜęĺëď $4 mail_fchange=ÁëëáăŢ mail_move=Ěĺôáęßíçóç óĺ: mail_return=ăńáěěáôďęéâţôéď mail_folders=Äéá÷ĺßńéóç ÖáęÝëůí mail_err=ĐáńďőóéÜóčçęĺ ëÜčďň ęáôÜ ôçí ĺěöÜíéóç ěçíőěÜôůí óĺ áőôü ôď öÜęĺëď : $1 mail_loginheader=Óýíäĺóç ěĺ äéáęďěéóôŢ POP3 mail_logindesc=ĐńÝđĺé íá ĺéóÜăĺôĺ Ýíá üíďěá ÷ńŢóôç ęáé Ýíá ęůäéęü ăéá
    íá Ý÷ĺôĺ đńüóâáóç óôď ăńáěěáôéęéâţôéü óáň óôď äéáęďěéóôŢ $1. mail_loginuser=źíďěá ÷ńŢóôç mail_loginpass=Ęůäéęüň mail_loginmailbox=Ăńáěěáôďęéâţôéď IMAP mail_login=Óýíäĺóç mail_reset=ĹđáíáöďńÜ mail_logout=ÁëëáăŢ óýíäĺóçň POP3 mail_logout2=ÁëëáăŢ óýíäĺóçň IMAP send_epass=Äĺí ěđďńĺßôĺ íá őđďăńÜřĺôĺ ěçíýěáôá äéüôé äĺí Ý÷ĺôĺ ďńßóĺé óőíčçěáôéęü áęüěç óôçí ĺíüôçôá GnuPG. send_esign=Áđďôő÷ßá őđďăńáöŢň ěçíýěáôďň : $1 send_ekey=Äĺí âńÝčçęĺ ęëĺéäß ăéá ôç äéĺýčőíóç $1 send_ecrypt=Áđďôő÷ßá ęńőđôďăńÜöçóçň ěçíýěáôďň : $1 send_eword=Ç ëÝîç $1 đëçęôńďëďăŢčçęĺ ëÜčďň send_eword2=Ç ëÝîç $1 đëçęôńďëďăŢčçęĺ ëÜčďň - đéčáíÝň äéďńčţóĺéň $2 send_eline=Óôç ăńáěěŢ $1 : send_espell=Óôď ěŢíőěÜ óáň âńÝčçęáí ôá đáńáęÜôů ďńčďăńáöéęÜ ëÜčç .. send_draft=Ôď ěŢíőěá ăéá $1 áđďčçęĺýčçęĺ óôď öÜęĺëď Đńü÷ĺéńá. address_chooser=ĹđéëďăŢ Äéĺýčőíóçň.. address_addr=ÇëĺęôńďíéęŢ Äéĺýčőíóç address_name=Ďíďěáôĺđţíőěď address_none=Ôď ĺőńĺôŢńéď äéĺőčýíóĺţí óáň ĺßíáé ęĺíü. address_title=ĹőńĺôŢńéď Äéĺőčýíóĺůí address_desc=Ď đáńáęÜôů đßíáęáň ĺěöáíßćĺé äéĺőčýíóĺéň đďő ěđďńĺßôĺ íá ĺđéëÝîĺôĺ ęáôÜ ôç óýíôáîç íÝďő ěçíýěáôďň. Ěđďńĺßôĺ íá đńďóčÝóĺôĺ äéĺőčýíóĺéň óĺ áőôüí, ęÜíďíôáň ęëéę đÜíů ôďőň üôáí äéáâÜćĺôĺ Ýíá çëĺęôńďíéęü ěŢíőěá. address_edit=Ĺđĺîĺńăáóßá.. address_delete=ÄéáăńáöŢ address_add=ĐńďóčŢęç íÝáň äéĺýčőíóçň. address_err=Áđďôő÷ßá áđďčŢęĺőóçň äéĺýčőíóçň address_eaddr=ĹëëéđŢň Ţ Üęőńç äéĺýčőíóç çëĺęôńďíéęďý ôá÷őäńďěĺßďő address_from=Äéĺýčőíóç áđďóôďëÝá; reply_spell=¸Ëĺă÷ďň ăéá ďńčďăńáöéęÜ ëÜčç; reply_draft=ÁđďčŢęĺőóç óôá Đńü÷ĺéńá folder_inbox=Ĺéóĺń÷üěĺíá folder_sent=ÁđĺóôáëěÝíá folder_drafts=Đńü÷ĺéńá delete_emnone=Äĺí ĺđéëÝîáôĺ ěçíýěáôá ăéá ěĺôáęßíçóç folders_title=Äéá÷ĺßńéóç ÖáęÝëůí folders_desc=ĘáčÝíáň áđü ôďőň đáńáęÜôů öáęÝëďőň ěđďńĺß íá đĺńéÝ÷ĺé ěçíýěáôá đďő ěĺôáęéíĺßôĺ óĺ áőôüí, Ţ ěçíýěáôá đďő ôďđďčĺôďýíôáé áőôüěáôá óĺ áőôüí. ŐđÜń÷ďőí ôÝóóĺńá Ţäç öáęÝëůí :
    • ÖÜęĺëďé óőóôŢěáôďň üđůň ôá Ĺéóĺń÷üěĺíá, Đńü÷ĺéńá ęáé ÁđĺóôáëěÝíá đďő őđÜń÷ďőí đÜíôá
    • ÖÜęĺëďé ęÜôů áđü ôďí ęáôÜëďăď $1 ďé ďđďßďé äçěéďőńăďýíôáé ęáé äéáăńÜöďíôáé áđü ôď Usermin
    • ˘ëëďé öÜęĺëďé Ţ ęáôÜëďăďé ôďőň ďđďßďőň ěđďńĺß íá äéá÷ĺéńéóčĺß ôď Usermin
    • Ëďăáńéáóěďß POP3 óĺ Üëëďőň äéáęďěéóôÝň đďő ěđďńďýí íá ĺęëçöčďýí ůň öÜęĺëďé
    folders_name=źíďěá öáęÝëďő folders_path=Ôďđďčĺóßá folders_type=Ôýđďň folders_size=ĚÝăĺčďň folders_maildir=ĘáôÜëďăďň folders_mbox=Áń÷ĺßď folders_mhdir=ĘáôÜëďăďň MH folders_create=Äçěéďőńăßá íÝďő öáęÝëďő folders_add=ĐńďóčŢęç őđÜń÷ďíôďň áń÷ĺßďő Ţ ęáôáëüăďő ůň öáęÝëďő folders_return=ëßóôá öáęÝëůí folders_serv=$1 óôď äéáęďěéóôŢ $2 folders_padd=ĐńďóčŢęç ëďăáńéáóěďý POP3 ůň öáęÝëďő folders_iadd=ĐńďóčŢęç ëďăáńéáóěďý IMAP ůň öáęÝëďő edit_title1=Äçěéďőńăßá ÖáęÝëďő edit_title2=Ĺđĺîĺńăáóßá ÖáęÝëďő edit_header=Óôďé÷ĺßá öáęÝëďő edit_mode=Ôýđďň öáęÝëďő edit_mode0=Áń÷ĺßď ęÜôů áđü $1 edit_mode1=Ĺîůôĺńéęü áń÷ĺßď ěçíőěÜôůí edit_mode2=Áń÷ĺßď áđĺóôáëěÝíůí ěçíőěÜôůí edit_name=źíďěá öáęÝëďő edit_type=Ôýđďň áđďčŢęĺőóçň edit_type0=Ĺíéáßď áń÷ĺßď (mbox) edit_type1=ĘáôÜëďăďň ěçíőěÜôůí Qmail (Maildir) edit_type3=ĘáôÜëďăďň MH (MH) edit_file=Ĺîůôĺńéęü áń÷ĺßď Ţ ęáôÜëďăďň ěçíőěÜôůí edit_sent=Áń÷ĺßď Ţ ęáôÜëďăďň áđĺóôáëěÝíůí ěçíőěÜôůí edit_sent1=ĐńďĺđéëďăŢ Usermin edit_sent0=Ĺîůôĺńéęü áń÷ĺßď Ţ ęáôÜëďăďň ěçíőěÜôůí edit_perpage=Ěçíýěáôá đńďň ĺěöÜíéóç áíÜ óĺëßäá edit_pop3=Ëďăáńéáóěüň POP3 edit_imap=Ëďăáńéáóěüň IMAP edit_server=ÄéáęďěéóôŢň POP3 edit_iserver=ÄéáęďěéóôŢň IMAP edit_user=źíďěá ÷ńŢóôç óôď äéáęďěéóôŢ edit_pass=Ęůäéęüň óôď äéáęďěéóôŢ edit_mailbox=Ăńáěěáôďęéâţôéď IMAP edit_imapinbox=Ĺéóĺń÷üěĺíá ÷ńŢóôç edit_imapother=˘ëëď ăńáěěáôďęéâţôéď save_err=Áđďôő÷ßá áđďčŢęĺőóçň öáęÝëďő save_ename=ĹëéđÝň Ţ Üęőńď üíďěá öáęÝëďő save_esys=Ôď üíďěá ôďő öáęÝëďő óőěđßđôĺé ěĺ ęÜđďéďí áđü ôďőň öáęÝëďőň óőóôŢěáôďň save_eclash=ŐđÜń÷ĺé Ţäç Ýíáň öÜęĺëďň ěĺ ßäéď üíďěá save_embox='$1' äĺí öáßíĺôáé íá ĺßíáé Ýăęőńď áń÷ĺßď ěçíőěÜôůí save_emaildir='$1' äĺí öáßíĺôáé íá ĺßíáé Ýăęőńďň ęáôÜëďăďň ěçíőěÜôůí Qmail Ţ MH save_efile='$1' äĺí őđÜń÷ĺé Ţ äĺí ĺßíáé đńďóâÜóéěď save_eindir=Ôá ĺîůôĺńéęÜ áń÷ĺßá ěçíőěÜôůí äĺí ěđďńďýí íá âńßóęďíôáé ęÜôů áđü ôďí ęáôÜëďăď öáęÝëůí $1 save_title=ÄéáăńáöŢ ÖáęÝëďő save_rusure=ČÝëĺôĺ óßăďőńá íá äéáăńÜřĺôĺ ôď öÜęĺëď $1 óôď $2; $3 kB ěçíőěÜôůí čá äéáăńáöďýí ďńéóôéęÜ. save_delete=ÄéáăńáöŢ Ôţńá save_eserver=ĹëéđŢň Ţ Üęőńç äŢëůóç äéáęďěéóôŢ POP3 save_euser=ĹëéđÝň üíďěá ÷ńŢóôç save_elogin=Áđďôő÷ßá óýíäĺóçň óôď äéáęďěéóôŢ POP3 : $1 save_elogin2=Áđďôő÷ßá óýíäĺóçň óôď äéáęďěéóôŢ IMAP : $1 save_eperpage=ĹëéđŢň Ţ Üęőńďň áńéčěüň ěçíőěÜôůí áíÜ óĺëßäá save_emailbox=Áđďôő÷ßá áíÜăíůóçň ăńáěěáôďęéâůôßďő IMAP : $1 save_emailbox2=ĹëéđŢň Ţ Üęőńç äŢëůóç ăńáěěáôďęéâůôßďő IMAP save_edelete=Áđďôő÷ßá äéáăńáöŢň ěçíőěÜôůí : $1 save_eappend=Áđďôő÷ßá đńďóčŢęçň ěçíőěÜôůí óôď ăńáěěáôďęéâţôéď IMAP : $1 save_esearch=Áđďôő÷ßá áíáćŢôçóçň óôď ăńáěěáôďęéâţôéď IMAP : $1 confirm_title=Ĺđéâĺâáßůóç ÄéáăńáöŢň confirm_warn=ČÝëĺôĺ óßăďőńá íá äéáăńÜřĺôĺ ôá $1 ĺđéëĺăěÝíá ěçíýěáôá; confirm_warn2=Ĺîáéôßáň ôďő ěĺăÝčďőň ęáé ôďő ôýđďő ôďő ăńáěěáôďęéâůôßďő óáň ěđďńĺß íá áđéôçčĺß ęÜđďéďň ÷ńüíďň. ĚÝ÷ńé íá ďëďęëçńůčĺß ç äéáăńáöŢ, ęáěěßá Üëëç ĺíÝńăĺéá äĺí đńÝđĺé íá ăßíĺé. confirm_warn3=ČÝëĺôĺ óßăďőńá íá äéáăńÜřĺôĺ áőôü ôď ěŢíőěá; confirm_ok=ÄéáăńáöŢ Ôţńá mailbox/ulang/en0100664000567100000000000001715210443356044013514 0ustar jcameronrootindex_title=Mail In $1 mail_title=Read Mail mail_none=There are no messages in folder $1 mail_pos=Messages $1 to $2 of $3 in folder $4 mail_return=mailbox mail_quota=Using $1 out of $2 send_efile=Attached file $1 is not readable or does not exist send_nobody=nobody address_chooser=Select Address.. address_addr=Email address address_name=Real name address_none=Your address book is empty. address_title=Address Book address_desc=The table below lists addresses that you can select from when composing a new email. Addresses can also be added by clicking on them when viewing an email message. address_edit=Edit.. address_delete=Delete address_add=Add new address entry. address_err=Failed to save address address_eaddr=Missing or invalid email address (must be like foo@bar.com) address_from=From address? address_yd=Yes, default address_gdesc=This section lists nicknames that you can use to easily send email to individuals or groups of addresses, without needing to enter the full address. address_gadd=Add a new nickname or group. address_gnone=Your nickname list is empty. address_group=Nickname address_members=Email addresses address_m=$1 members group_err=Failed to save address group group_egroup=Missing or invalid group name group_emembers=No member email addresses entered folders_title=Manage Folders folders_desc2=Each of the folders listed below can contain mail that you move into it, or mail that is placed into it automatically. The following folder types are available : folders_descsys=System folders like Inbox, Drafts and Sent Mail that always exist. folders_desclocal=Folders in in the mail directory that can be created or deleted by Usermin. folders_descext=Other files or directories that can be managed as folders by Usermin. folders_descpop3=POP3 accounts on other servers that can be treated as folders. folders_descimap=IMAP accounts on other servers. folders_desccomp=Composite folders, which combine two or more other folders into a single list. folders_descvirt=Virtual folders, which contain a selection of mail from others. folders_name=Folder name folders_path=Location folders_type=Type folders_size=Size folders_maildir=Directory folders_mbox=File folders_mhdir=MH directory folders_create=Create a new folder. folders_add=Add an existing file or directory as a folder. folders_return=folders list folders_serv=$1 on server $2 folders_servp=$1 on server $2 port $3 folders_padd=Add a POP3 account as a folder. folders_iadd=Add an IMAP mailbox as a folder. folders_cadd=Create a new composite folder. folders_num=Contains $2 messages in $1 folders folders_vnum=Contains $1 messages folders_vtype=Virtual folders_comp=Composite folders_virt=Virtual folders_newfolder=Add A Folder Of Type: folders_type_local=Local mail file folders_type_ext=External mail file folders_type_pop3=POP3 account folders_type_imap=IMAP account folders_type_comp=Composite of folders folders_type_virt=Virtual folder folders_action=Actions.. folders_view=View folders_copy=Copy folders_auto=Auto-Clearing folders_delete=Delete Selected Folders edit_title1=Create Folder edit_title2=Edit Folder edit_header=Mail folder details edit_mode=Folder type edit_mode0=File under $1 edit_mode1=External mail file edit_mode2=Sent mail file edit_name=Folder name edit_type=Storage type edit_type0=Single file (mbox) edit_type1=Qmail mail directory (Maildir) edit_type3=MH directory (MH) edit_file=External mail file or directory edit_sent=Sent mail file or directory edit_sent1=Usermin default edit_sent0=External mail file or directory edit_perpage=Messages to display per page edit_sentview=Show To: address instead of From: ? edit_pop3=POP3 account edit_imap=IMAP mailbox edit_server=POP3 server edit_port=Port number edit_iserver=IMAP server edit_user=Username on server edit_pass=Password on server edit_mailbox=IMAP mailbox edit_imapinbox=User's inbox edit_imapother=Other mailbox edit_fromaddr=From: address for messages sent from folder edit_hide=Hide from folder menu? edit_comps=Sub-folders, oldest first edit_comp=Composite edit_virt=Virtual edit_delete=Delete real message when deleting from folder? save_err=Failed to save folder save_ecannot=You are not allowed to use this type of folder save_ename=Missing or invalid folder name save_ename2=Folder names cannot contain .. save_esys=Folder name clashes with one of the system folders save_eclash=A folder with the same name already exists save_embox='$1' does not appear to be a valid mailbox file save_emaildir='$1' does not appear to be a valid Qmail or MH mail directory save_efile='$1' does not exist or is not accessible save_eindir=External mail files cannot be under the folders directory $1 save_title=Delete Folder save_rusure=Are you sure you want to delete the folder $1 in $2? $3 kB of email will be deleted forever. save_delete=Delete Now save_eserver=Missing or invalid POP3 server save_euser=Missing username save_elogin=Failed to login to POP3 server : $1 save_elogin2=Failed to login to IMAP server : $1 save_eperpage=Missing or invalid number of messages per page save_eport=Missing or invalid port number save_efromaddr=Missing or invalid From: address save_emailbox=Failed to open IMAP mailbox : $1 save_emailbox2=Missing or invalid IMAP mailbox save_edelete=Failed to delete mail : $1 save_eappend=Failed to add mail to IMAP mailbox : $1 save_esearch=Failed to search IMAP mailbox : $1 epop3lock_tries=Failed to lock mail file $1 after trying for $2 minutes, due to a POP3 lock file. view_dsn=Delivery Status Notification view_dnsnow=A delivery status notification message has just been sent to $1. view_dsnbefore=A delivery status notification message was sent to $1 on $2. view_dsnreq=A delivery status notification for this message has been requested by $1. view_dsnsend=Send Notification Now view_dsngot=This message was read by $1 on $2. view_delfailed=This message could not be delivered to $1 on $2. view_delok=This message was delivered to $1 on $2. reply_dsn=Request read status notification? reply_del=Request delivery status notification? reply_aboot=Add recipients to address book? search_virtualize=Create Virtual Folder Named: search_dest=Store results in search_dest1=Search Results folder search_dest0=New virtual folder named search_edest=Missing virtual folder name for results virtualize_ename=Missing virtual folder name delete_enoadd=Messages cannot be moved into virtual folders, only copied sig_title=Edit Signature sig_desc=Use this form to edit your email signature in the file $1. sig_undo=Undo sig_enone=No signature file defined sig_eopen=Failed to open signature file : $1 quota_inbox=Quota for mail of $1 exceeded quota_inbox2=Quota of $1 mail messages exceeded auto_title=Automatic Folder Clearing auto_header=Scheduled folder clearing options auto_enabled=Automatically delete old messages? auto_mode=Deletion criteria auto_days=Messages older than $1 days auto_size=Messages that make folder larger than $1 auto_err=Failed to setup automatic folder clearing auto_edays=Missing or invalid number of days auto_esize=Missing or invalid maximum folder size auto_name=Folder to clear auto_invalid=Delete messages with invalid date auto_all=Delete all messages in mailbox? copy_title=Copy All Mail copy_header=Copy all messages in folder copy_source=Source folder copy_dest=Destination folder copy_move=Delete from source? copy_ok=Copy Now copy_doing=Copying all messages from $1 to $2 .. copy_done=.. done copy_deleting=Emptying folder $1 .. fdelete_title=Delete Folders fdelete_err=Failed to delete folders fdelete_enone=None selected fdelete_rusure=Are you sure you want to delete the $1 selected folders? $2 of email will be deleted forever. fdelete_rusure2=Are you sure you want to delete the $1 selected folders? fdelete_delete=Delete Now mailbox/ulang/ru_RU0100644000567100000000000001214110320214556014130 0ustar jcameronrootmail_title=×ňĺíčĺ ďî÷ňű mail_none= íŕńňî˙ůčé ěîěĺíň â ďŕďęĺ $1 ďčńĺě íĺň mail_pos=Ďčńüěŕ ń $1 ďî $2 čç $3 â ďŕďęĺ $4 mail_return=ďŕďęĺ mail_fromsrch=Ýňîň ćĺ îňďđŕâčňĺëü.. mail_subsrch=Ýňŕ ćĺ ňĺěŕ.. send_efile=Ďđčńîĺäčíĺííűé ôŕéë $1 íĺ ěîćĺň áűňü ďđî÷čňŕí, ëčáî íĺ ńóůĺńňâóĺň address_chooser=Âűáĺđčňĺ ŕäđĺń.. address_addr=Ŕäđĺń email address_name=ÔČÎ ŕäđĺńŕňŕ address_none=Âŕřŕ ŕäđĺńíŕ˙ ęíčăŕ ďóńňŕ. address_title=Ŕäđĺńíŕ˙ ęíčăŕ address_desc=Ńďčńîę ŕäđĺńŕňîâ, ęîňîđűě âű ěîćĺňĺ ďîëüçîâŕňüń˙ ďđč íŕďčńŕíčč ďčńĺě. Ęđîěĺ ďđ˙ěîăî çŕďîëíĺíč˙, ŕäđĺńŕ â ýňîň ńďčńîę ěîăóň áűňü äîáŕâëĺíű íŕćŕňčĺě íŕ íčő ďđč ÷ňĺíčč ďî÷ňű. address_edit=Ďđŕâęŕ.. address_delete=Óäŕëčňü address_add=Äîáŕâčňü íîâűé ŕäđĺń address_err=Íĺâîçěîćíî ńîőđŕíčňü ŕäđĺń address_eaddr=Îňńóňńňâóĺň, ëčáî íĺďđŕâčëüíűé email address_from=Ń ŕäđĺńŕ? address_yd=Äŕ, âńĺăäŕ address_gdesc=Ńďčńîę ăđóďď ŕäđĺńîâ, ęîňîđűě âű ěîćĺňĺ ďîëüçîâŕňüń˙ äë˙ îňďđŕâęč ďčńĺě ńđŕçó íĺńęîëüęčě ŕäđĺńŕňŕě. address_gadd=Äîáŕâčňü íîâóţ ăđóďďó address_gnone=Âŕř ńďčńîę ăđóďď ďóńň. address_group=Ăđóďďŕ address_members=Ŕäđĺńŕ email address_m=$1 ÷ëĺíîâ group_err=Íĺâîçěîćíî ńîőđŕíčňü ăđóďďó group_egroup=Îňńóňńňâóĺň, ëčáî íĺďđŕâčëüíîĺ čě˙ ăđóďďű group_emembers=Íĺ äîáŕâëĺíî íč îäíîăî ÷ëĺíŕ folders_title=Óďđŕâëĺíčĺ ďŕďęŕěč folders_desc=Ęŕćäŕ˙ ďŕďęŕ ěîćĺň ńîäĺđćŕňü ďĺđĺěĺůĺííűĺ â íĺĺ ďčńüěŕ, ëčáî ďčńüěŕ, ďîěĺůĺííűĺ â íĺĺ ŕâňîěŕňč÷ĺńęč.  çŕâčńčěîńňč îň ďîëíîěî÷čé, äŕííűő ŕäěčíčńňđŕňîđîě, âű ěîćĺňĺ đŕáîňŕňü ń ďŕďęŕěč ÷ĺňűđĺő ňčďîâ :
    • Ńčńňĺěíűĺ (ńóůĺńňâóţň âńĺăäŕ) — Âőîä˙ůčĺ, ×ĺđíîâčęč č Îňďđŕâëĺííűĺ
    • Ďŕďęč â äčđĺęňîđčč $1, ńîçäŕâŕĺěűĺ č óäŕë˙ĺěűĺ ÷ĺđĺç Usermin
    • Äđóăčĺ ôŕéëű č äčđĺęňîđčč, ęîňîđűĺ ěîăóň ˙âë˙ňüń˙ ďŕďęŕěč Usermin
    • Ó÷ĺňíűĺ çŕďčńč íŕ âíĺříčő POP3 č IMAP ńĺđâĺđŕő, äîáŕâëĺííűĺ ęŕę ďŕďęč
    folders_name=Čě˙ ďŕďęč folders_path=Đŕçěĺůĺíčĺ folders_type=Ňčď folders_size=Đŕçěĺđ folders_maildir=Äčđĺęňîđč˙ folders_mbox=Ôŕéë folders_mhdir=MH äčđĺęňîđč˙ folders_create=Ńîçäŕňü íîâóţ ďŕďęó folders_add=Äîáŕâčňü ńóůĺńňâóţůčĺ ôŕéë čëč äčđĺęňîđčţ ęŕę ďŕďęó folders_return=ńďčńîę ďŕďîę folders_serv=$1 íŕ ńĺđâĺđĺ $2 folders_servp=$1 íŕ ńĺđâĺđĺ $2, ďîđň $3 folders_padd=Äîáŕâčňü ˙ůčę POP3 ęŕę ďŕďęó folders_iadd=Äîáŕâčňü ˙ůčę IMAP ęŕę ďŕďęó edit_title1=Ńîçäŕíčĺ ďŕďęč edit_title2=Đĺäŕęňčđîâŕíčĺ ďŕďęč edit_header=Íŕńňđîéęč ďŕďęč edit_mode=Ňčď ďŕďęč edit_mode0=Ôŕéë â $1 edit_mode1=Âíĺříčé ďî÷ňîâűé ôŕéë edit_mode2=Ôŕéë îňďđŕâëĺííîé ďî÷ňű edit_name=Čě˙ ďŕďęč edit_type=Ńďîńîá őđŕíĺíč˙ edit_type0=Îäčíî÷íűé ôŕéë (mbox) edit_type1=Ďî÷ňîâŕ˙ äčđĺęňîđč˙ Qmail (Maildir) edit_type3=MH äčđĺęňîđč˙ (MH) edit_file=Âíĺříčé ďî÷ňîâűé ôŕéë čëč äčđĺęňîđč˙ edit_sent=Ôŕéë čëč äčđĺęňîđč˙ îňďđŕâëĺííîé ďî÷ňű edit_sent1=Usermin ďî óěîë÷ŕíčţ edit_sent0=Âíĺříčé ôŕéë čëč äčđĺęňîđč˙ edit_perpage=Ďîęŕçűâŕňü ďčńĺě íŕ ńňđŕíčöó edit_sentview=Ďîęŕçűâŕňü Ęîěó: âěĺńňî Îň: ? edit_pop3=ßůčę POP3 edit_imap=ßůčę IMAP edit_server=Ńĺđâĺđ POP3 edit_port=Íîěĺđ ďîđňŕ edit_iserver=Ńĺđâĺđ IMAP edit_user=Čě˙ ďîëüçîâŕňĺë˙ íŕ ńĺđâĺđĺ edit_pass=Ďŕđîëü íŕ ńĺđâĺđĺ edit_mailbox=Ďŕďęŕ íŕ ńĺđâĺđĺ IMAP edit_imapinbox=Âőîä˙ůčĺ edit_imapother=Äđóăŕ˙ ďŕďęŕ edit_fromaddr=Ďîäńňŕâë˙ňü Îň: â ďčńüěŕ, îňďđŕâëĺííűĺ čç ďŕďęč save_err=Îřčáęŕ ďđč ńîőđŕíĺíčč íŕńňđîĺę ďŕďęč save_ecannot=Âŕřčő ďđŕâ íĺäîńňŕňî÷íî äë˙ čńďîëüçîâŕíč˙ ďŕďîę äŕííîăî ňčďŕ save_ename=Îňńóňńňâóĺň, ëčáî íĺďđŕâčëüíîĺ čě˙ ďŕďęč save_esys=Čě˙ ďŕďęč ęîíôëčęňóĺň ń îäíîé čç ńčńňĺěíűő ďŕďîę save_eclash=Ďŕďęŕ ń ňŕęčě čěĺíĺě óćĺ ńóůĺńňâóĺň save_embox='$1' ˙âë˙ĺňń˙ íĺďđŕâčëüíűě čěĺíĺě ôŕéëŕ ďŕďęč save_emaildir='$1' íĺ ˙âë˙ĺňń˙ ďđŕâčëüíîé Qmail čëč MH ďî÷ňîâîé äčđĺęňîđčĺé save_efile='$1' íĺ ńóůĺńňâóĺň, ëčáî íĺäîńňóďĺí save_eindir=Âíĺříčé ďî÷ňîâűé ôŕéë íĺ ěîćĺň íŕőîäčňüń˙ â äčđĺęňîđčč ďŕďęč $1 save_title=Óäŕëčňü ďŕďęó save_rusure=Âű óâĺđĺíű â ňîě, ÷ňî őîňčňĺ óäŕëčňü ďŕďęó $1 â $2? $3 kB ďčńĺě áóäóň óäŕëĺíű íŕâńĺăäŕ. save_delete=Óäŕëčňü save_eserver=Íĺäîńňóďĺí, ëčáî íĺďđŕâčëüíűé ńĺđâĺđ POP3 save_euser=Îňńóňńňâóĺň čě˙ ďîëüçîâŕňĺë˙ save_elogin=Íĺâîçěîćíî ďîäęëţ÷čňüń˙ ę ńĺđâĺđó POP3 : $1 save_elogin2=Íĺâîçěîćíî ďîäęëţ÷čňüń˙ ę ńĺđâĺđó IMAP : $1 save_eperpage=Îňńóňńňâóĺň ëčáî íĺďđŕâčëüíîĺ ęîëč÷ĺńňâî ďčńĺě, ďîęŕçűâŕĺěűő íŕ ńňđŕíčöó save_eport=Îňńóňńňâóĺň, ëčáî íĺďđŕâčëüíűé íîěĺđ ďîđňŕ save_efromaddr=Îňńóňńňâóĺň, ëčáî íĺďđŕâčëüíűé ŕäđĺń Îň: save_emailbox=Íĺâîçěîćíî îňęđűňü ďŕďęó íŕ ńĺđâĺđĺ IMAP : $1 save_emailbox2=Îňńóňńňâóĺň, ëčáî íĺďđŕâčëüíîĺ čě˙ ďŕďęč íŕ ńĺđâĺđĺ IMAP save_edelete=Íĺâîçěîćíî óäŕëčňü ďčńüěî : $1 save_eappend=Íĺâîçěîćíî äîáŕâčňü ďčńüěî â ďŕďęó íŕ ńĺđâĺđĺ IMAP : $1 save_esearch=Ďîčńę â ďŕďęĺ íŕ ńĺđâĺđĺ IMAP íĺâîçěîćĺí : $1 razor_title=Ďîćŕëîâŕňüń˙ íŕ Ńďŕě razor_report=Ďîěĺńňčňü ýňî ďčńüěî â Razor č äđóăčĺ áëîęčđóţůčĺ Ńďŕě áŕçű äŕííűő ďđîăđŕěěű SpamAssassin .. razor_done=.. ăîňîâî razor_err=.. îřčáęŕ! Âűřĺ ďđčâĺäĺíŕ ďđč÷číŕ, ďî ęîňîđîé îďĺđŕöč˙ çŕâĺđřčëŕńü íĺóäŕ÷íî. black_title=Áëîęčđîâęŕ ŕäđĺńŕ îňďđŕâčňĺë˙ black_done=Ŕäđĺń $1 äîáŕâëĺí â ńďčńîę çŕďđĺůĺííűő ŕäđĺńîâ ďđîăđŕěěű SpamAssassin. black_already=Ŕäđĺń $1 óćĺ íŕőîäčňń˙ â ńďčńęĺ çŕďđĺůĺííűő ŕäđĺńîâ ďđîăđŕěěű SpamAssassin. epop3lock_tries=Failed to lock mail file $1 after trying for $2 minutes, due to a POP3 lock file. mailbox/ulang/fr0100744000567100000000000001647707777077316013553 0ustar jcameronrootsend_efile=Le fichier attaché $1 ne peut ętre lu ou n'existe pas view_gnupg=vérification signature GnuPG view_gnupg_0=La signature par $1 est invalide. view_gnupg_1=La signature par $1 est valide, mais la chaine de confiance n'a pu etre établie. view_gnupg_2=LA signature par $1 n'est PAS valide. view_gnupg_3=La clé ID $1 n'est pas dans votre liste, aussi la signature n'a pu ętre vérifiée. view_gnupg_4=Echec de la vérification de la signature : $1 view_crypt=Décryptage mail GnuPG view_crypt_1=Le message est crypté, mais le support GnuPG n'est pas installé. view_crypt_2=Echec du décryptage dy message : $1 view_crypt_3=Le mail a été décrypté avec succés. view_recv=Fetch key ID $1 from keyserver. view_folder=Retour boite aux lettres view_detach=Detacher le fichier: view_dir=Vers le fichier ou répertoire: view_black=Emetteur non autorisé view_razor=Reporté ŕ Razor mail_title=Lecture des Mails mail_sign=Signer avec la clé GnuPG: mail_nosign=<Ne pas signer> mail_crypt=GnuPG cryptage pour: mail_nocrypt=<Ne pas décrypter> mail_samecrypt=<Clés pour les adresses destination> mail_addresses=Gérer le carnet adresse mail_none=Il n'y a pas de mail dans le dossier $1 mail_pos=Mails $1 ŕ $2 (sur $3) du dossier $4 mail_fchange=Modifier mail_move=Déplacer vers: mail_return=mailbox mail_folders=Gérer les dossier mail_err=Une erreur a eu lieu en listant les mails du dossier : $1 mail_loginheader=Login serveur POP3 mail_logindesc=Vous devez entrer un login et mot de passe pour accéder aux mails
    du dossier Inbox sur le serveur mail $1. mail_loginuser=Nom utilisateur mail_loginpass=Mot de passe mail_loginmailbox=IMAP mailbox mail_login=Login mail_reset=Reset mail_logout=Change POP3 login mail_logout2=Change IMAP login mail_sig=Editer la Signature mail_jump=Saut ŕ la page : mail_of=de mail_replyto=Répondre ŕ send_epass=Vous ne pouvez pas signer un message cat votre phrase de passeur passphrase has not be setup yet in the GnuPG module. send_esign=Echec de la signature du message : $1 send_ekey=Ne pas pas trouver de clé pour l'adresse email $1 send_ecrypt=Echec du cryptage du message : $1 send_eword=Mot mal épelé $1 send_eword2=Mot mal épelé $1 - Corrections possible $2 send_eline=Line $1 : send_espell=Les erreurs d'orthographe suivante ont été trouvé dans votre message .. send_draft=Mail ŕ $1 sauvé dans le dossier Brouillon (drafts). send_eattachsize=L'attachement au mail dépasse la taille maximum autorisée de $1 octets address_chooser=Choisir Adresse.. address_addr=Adresse Email address_name=Nom réel address_none=Votre carnet d adresse est vide. address_title=Carnet d adresse address_desc=La table suivante liste les adresses que vous pouvez sélectionner comme émetteur quand vous composez un nouveau mail. Ces adresses peuvent ętre ajoutées en cliquant dessus quand vous consulter un email. address_edit=Editer.. address_delete=Effacer address_add=Ajouter une nouvelle adresse. address_err=Echec de la sauvegarde de l'adresse address_eaddr=Adresse Email manquante ou invalide address_from=Adresse émetteur? address_yd=Oui, defaut reply_spell=Vérifier les erreurs d'orthographe? reply_draft=Sauver en Brouillon folder_inbox=Messages reçus folder_sent=Messages envoyés folder_drafts=Brouillons delete_emnone=Aucun mail ŕ déplacer selectionné folders_title=Gérer les dossiers folders_desc=Each of the folders listed below can contain mail that you move into it, or mail that is placed into it automatically. There are four kinds of folders :
    • System folders like Inbox, Drafts and Sent Mail that always exist
    • Folders under the $1 directory that can be created or deleted by Usermin
    • Other files or directories that can be managed as folders by Usermin
    • POP3 accounts on other servers that can be treated as folders
    folders_name=Folder name folders_path=Location folders_type=Type folders_size=Size folders_maildir=Directory folders_mbox=File folders_mhdir=MH directory folders_create=Create a new folder folders_add=Add an existing file or directory as a folder folders_return=folders list folders_serv=$1 on server $2 folders_padd=Add a POP3 account as a folder folders_iadd=Add an IMAP mailbox as a folder edit_title1=Create Folder edit_title2=Edit Folder edit_header=Mail folder details edit_mode=Folder type edit_mode0=File under $1 edit_mode1=External mail file edit_mode2=Sent mail file edit_name=Folder name edit_type=Storage type edit_type0=Single file (mbox) edit_type1=Qmail mail directory (Maildir) edit_type3=MH directory (MH) edit_file=External mail file or directory edit_sent=Sent mail file or directory edit_sent1=Usermin default edit_sent0=External mail file or directory edit_perpage=Messages to display per page edit_sentview=Show To: address instead of From: ? edit_pop3=POP3 account edit_imap=IMAP mailbox edit_server=POP3 server edit_iserver=IMAP server edit_user=Username on server edit_pass=Password on server edit_mailbox=IMAP mailbox edit_imapinbox=User's inbox edit_imapother=Other mailbox edit_fromaddr=From: address for messages sent from folder save_err=Failed to save folder save_ecannot=You are not allowed to use this type of folder save_ename=Missing or invalid folder name save_esys=Folder name clashes with one of the system folders save_eclash=A folder with the same name already exists save_embox='$1' does not appear to be a valid mailbox file save_emaildir='$1' does not appear to be a valid Qmail or MH mail directory save_efile='$1' does not exist or is not accessible save_eindir=External mail files cannot be under the folders directory $1 save_title=Delete Folder save_rusure=Are you sure you want to delete the folder $1 in $2? $3 kB of email will be deleted forever. save_delete=Delete Now save_eserver=Missing or invalid POP3 server save_euser=Missing username save_elogin=Failed to login to POP3 server : $1 save_elogin2=Failed to login to IMAP server : $1 save_eperpage=Missing or invalid number of messages per page save_efromaddr=Missing or invalid From: address save_emailbox=Failed to open IMAP mailbox : $1 save_emailbox2=Missing or invalid IMAP mailbox save_edelete=Failed to delete mail : $1 save_eappend=Failed to add mail to IMAP mailbox : $1 save_esearch=Failed to search IMAP mailbox : $1 confirm_title=Confirmer la suppression confirm_warn=Etes-vous sur de vouloir supprimer les $1 messages sélectionnés? confirm_warn2=Compte tenu de la taille et format de votre boite aux lettres, l'opération peut ętre longue. Jusqu'ŕ ce que la suppression soit complčte, aucune autre action ne doit ętre entreprise. confirm_warn3=Etes-vous sur de vouloir supprimer le message? confirm_warn4=Jusqu'ŕ ce que la suppression soit complčte, aucune autre action ne doit ętre entreprise. confirm_ok=Effacer maintenant detach_err=Echec du détachement detach_edir=Fichier ou répertoire pour sauvegarde non renseigné detach_eopen=Echec ŕ l'ouverture de $1 : $2 detach_ewrite=Echec ŕ l'écriture de $1 : $2 detach_title=Detacher Fichier detach_ok=Ecrire l'attachement sur le serveur comme fichier $1 ($2). razor_title=Reporter ŕ SpamAssassin razor_report=Reporter ce mail ŕ la base de donnée anti-spam de SpamAssassin .. razor_done=.. terminé razor_err=.. échec! Consultez le message d'erreur ci-dessous pour plus d'info. black_title=Interdire l'émetteur black_done=Ajouter l'adresse email $1 ŕ la liste des adresses interdites de SpamAssassin. black_already=Cet adresse email $1 est déjŕ dans la liste des adresses interdites de SpamAssassin. mailbox/ulang/it0100775000567100000000000001554410336470025013531 0ustar jcameronrootmail_title=leggi Mail mail_none=nessun messaggio nella cartella $1 mail_pos=messaggi da $1 a $2 di $3 nella cartella $4 mail_return=mailbox mail_quota=in uso $1 di $2 send_efile=Attached file $1 is not readable or does not exist send_nobody=nobody address_chooser=Seleziona indirizzo.. address_addr=Email indirizzo address_name=Real name address_none=la tua rubrica è vuota address_title=rubrica address_desc=The table below lists addresses that you can select from when composing a new email. Addresses can also be added by clicking on them when viewing an email message. address_edit=Edit.. address_delete=Elimina address_add=crea nuovo indirizzo address_err=errore nel salvataggio indirizzo address_eaddr=indirizzo email mancante o non valido (deve essere nel formato nome@dominio.it) address_from=da indirizzo? address_yd=si, default address_gdesc=questa sezione elenca i nickname ai quali puoi facilmente inviare email individualmente o per gruppi, senza scrivere l'intero indirizzo email. address_gadd=crea nuovo nickname o gruppo address_gnone=elenco nickname vuoto address_group=Nickname address_members=indirizzi email address_m=$1 membri group_err=errore nel salvataggio del nome gruppo group_egroup=nome grupop mancante o non valido group_emembers=nessun indirizzo email inserito folders_title=gestione cartelle folders_desc2=ogni cartella in elenco può contenere email che puoi spostare dentro, o email archiviata qui automaticamente . Sono disponibili i seguenti tipi di cartella: folders_descsys=le cartelle di sistema come In arrivo, bozze, o posta inviata che sono sempre presenti folders_desclocal=le cartelle nella directory mail che possono essere create o eliminate da Usermin folders_descext=altri file or directory che possono essere gestiti come cartelle da Usermin folders_descpop3=account POP3 su altri server che possono essere gestiti come cartelle folders_descimap=account IMAP su altri server folders_desccomp=cartelle composite, che raggruppano insieme due o più cartelle in una lista unica. folders_descvirt=cartelle virtuali, che contengono selezioni di mail in altre cartelle folders_name=nome cartella folders_path=percorso folders_type=Tipo folders_size=Dimensione folders_maildir=Directory folders_mbox=File folders_mhdir=MH directory folders_create=crea nouva cartella folders_add=aggiungi un file o directory esistente come cartella folders_return=elenco cartelle folders_serv=$1 on server $2 folders_servp=$1 on server $2 port $3 folders_padd=crea un account POP3 come cartella folders_iadd=crea un account IMAP come cartella folders_cadd=crea nuova cartella del tipo composite folders_num=contiene $2 messaggi in $1 cartelle folders_vnum=contiene $1 messaggi folders_comp=Composite folders_virt=Virtual folders_newfolder=crea una cartella del tipo: folders_type_local=file locale di posta folders_type_ext=file di posta esterno folders_type_pop3=account POP3 folders_type_imap=account IMAP folders_type_comp=Composite di cartella folders_type_virt=cartella virtuale edit_title1=crea cartella edit_title2=modifica cartella edit_header=dettagli cartella posta edit_mode=tipo cartella edit_mode0=file sotto $1 edit_mode1=file di posta esterno edit_mode2=file di posta inviata edit_name=nome cartella edit_type=tipo archivio edit_type0=file singolo (mbox) edit_type1=directory di posta Qmail (Maildir) edit_type3=directory MH (MH) edit_file=file o directory esterno di posta edit_sent=file o directory di posta inviata edit_sent1=default Usermin edit_sent0=file o directory esterno di posta edit_perpage=Messaggi da visualizzare per pagina edit_sentview=mostra a: indirizzo invece di From: ? edit_pop3=account POP3 edit_imap= mailbox IMAP edit_server=server POP3 edit_port=numero porta edit_iserver=server IMAP edit_user=Username sul server edit_pass=Password sul server edit_mailbox=mailbox IMAP edit_imapinbox=inbox utente edit_imapother=altre mailbox edit_fromaddr=Da: indirizzo per messaggi inviata dalla cartella edit_hide=Nascondi dal menu cartella? edit_comps=Sub-cartella, la più vecchia prima edit_comp=Composite edit_virt=virtuale edit_delete=Elimina messaggio reale quando elimini dalla cartella? save_err=errore nel salvataggio della cartella save_ecannot=non hai i permessi per usare questo tipo di cartella save_ename=nome cartella mancante o non valido save_ename2=i nomi di cartella non possono contenere: save_esys=il nome della cartella in conflitto con una delle cartelle di sistema save_eclash=una cartella con lo stesso nome già esiste save_embox='$1' non sembra essere un file di posta valido save_emaildir='$1' non sembra essere una directory di posta Qmail or MH valida save_efile='$1' no esiste o non è accessibile save_eindir=file di posta esterni non possono essere sotto le cartelle directory $1 save_title=elimina cartella save_rusure=confermi l'eliminazione la cartella $1 in $2? $3 kB di posta verranno eliminati. save_delete=elimina ora save_eserver=inserire server POP3 mancante save_euser=inserire nome utente save_elogin=errore di login al server POP3: $1 save_elogin2=errore di login al server IMAP: $1 save_eperpage=inserire numeri di messaggi per pagina valido save_eport=inserire un numero di porta valido save_efromaddr=inserire From: indirizzo valido save_emailbox=errore di apertura della mailbox IMAP: $1 save_emailbox2=inserire mailbox IMAP valida save_edelete=errore nella eliminazione posta : $1 save_eappend=errere di inserimento posta alla mailbox IMAP: $1 save_esearch=errore di ricerca nella mailbox IMAP: $1 epop3lock_tries=errore del lock del file di posta $1 dopo aver provato per $2 minuti, causato dal lock del file POP3 view_dsn=notifica delle stato di consegna view_dnsnow=inviata notifica dello stato di consegna a $1. view_dsnbefore=notifica dello stato di consegna inviato a $1 su $2. view_dsnreq=notifica dello stato di consegna per questo messaggio richiesto da $1. view_dsnsend=invia notifica ora view_dsngot=questo messaggio è stato letto da $1 su $2. view_delfailed=questo messaggio non è stato consegnato a $1 su $2. view_delok=messaggio inviato a $1 su $2. reply_dsn=richiedi notifica stato lettura? reply_del=richiedi notifica dello stato di consegna? reply_aboot=aggiungi destinatari a rubrica? search_virtualize=crea cartella con il nome: search_dest=archivia risultato in search_dest1=cartella cerca risultati search_dest0=nuova virtuale cartella dcon il nome: search_edest=nome della cartella virtuale mancante per risultati virtualize_ename=nome cartella virtuale mancante delete_enoadd=i messaggi non possono essre spostati nella cartelle vituali, solo copiati sig_title=modifica firma sig_desc=usa questo modulo per modificare la firma di messaggi nel file $1. sig_undo=annulla sig_enone=inserisci un file per la firma dei messaggi sig_eopen=errore aprendo il file di firma dei messaggi: $1 quota_inbox=Quota per la posta di $1 superata quota_inbox2=Quota per $1 messaggi di posta superata mailbox/ulang/nl0100644000567100000000000001124207561615107013520 0ustar jcameronrootsend_efile=Bijlage file $1 is niet leesbaar of bestaat niet view_gnupg=GnuPG ondertekening verificatie view_gnupg_0=Ondertekening door $1 is geldig. view_gnupg_1=Ondertekening door $1 is geldig, maar er was geen geldige vertrouwensketen. view_gnupg_2=Ontertekening door $1 is ONGELDIG. view_gnupg_3=Key ID $1 is niet in uw lijst, ondertekening kon niet worden geverifieerd. view_gnupg_4=Kon ondertekening niet verifieren: $1 view_crypt=GnuPG mail decodering view_crypt_1=E-mail is gecodeerd, maar GnuPG support is niet geinstalleerd. view_crypt_2=Kon e-mail niet decoderen: $1 view_crypt_3=E-mail is gedecodeerd. view_recv=Ophalen van key ID $1 van keyserver. view_folder=Terug naar mailbox mail_sign=Teken met GnuPG key: mail_nosign=<Teken niet> mail_crypt=GnuPG codering voor: mail_nocrypt=<codeer niet> mail_samecrypt=<Key van To: address> mail_addresses=Beheer adresboek mail_none= Er zijn geen berichten in map $1 mail_pos=Berichten $1 tot $2 van $3 in map $4 mail_fchange=Ga naar mail_move=Verplaats naar: mail_return=mailbox mail_folders=Beheer mappen mail_err=Er is een fout opgetreden tijdens het openen van map : $1 mail_loginheader=POP3 server login mail_logindesc=U moet over een wachtwoord beschikken om de e-mail
    in uw inbox op server $1 te lezen. mail_loginuser=Gebruikersnaam mail_loginpass=Wachtwoord mail_login=Login mail_reset=Opnieuw send_epass=U kunt nog geen berichten ondertekenen omdat U nog geen passphrase heeft opgegeven in de GnuPG module. send_esign=Kon e-mail $1 niet ondertekenen send_ekey=Kon geen key vinden voor e-mailadres $1 send_ecrypt=Kon e-mail $1 niet coderen send_eword=Spelfout in woord $1 send_eword2=Spelfout in woord $1 - mogelijke correctie $2 send_eline=In regel $1 : send_espell=De volgende spelfouten zijn gevonden in uw bericht.. send_draft=E-mail aan $1 opgeslagen in concepten map. address_chooser=Kies Adres.. address_addr=E-mail adres address_name=Volledige naam address_none=Uw adresboek is leeg. address_title=Adresboek address_desc=De tabel hieronder bevat e-mailadressen die U kunt gebruiken bij het aanmaken van e-mails. U kunt adressen toevoegen door op het adres te klikken tijdens het lezen van e-mail. address_edit=Bewerk.. address_delete=Verwijder address_add=Voeg nieuw adres toe. address_err=Kon adres niet opslaan address_eaddr=Ontbrekend of ongeldig e-mailadres reply_spell=Spellingscontrole? reply_draft=Bewaar als concept folder_inbox=Inbox folder_sent=Verzonden mail folder_drafts=Concepten delete_emnone=Geen e-mail geselecteerd voor verplaatsen folders_title=Beheer mappen folders_desc=De mappen die hieronder staan afgebeeld kunnen elk e-mail bevatten die u daarin plaatst, of daarin automatisch terecht komt. Er zijn vier soorten mappen:
    • Systeem mappen zoals Inbox, Concepten en Verzonden mail, deze mappen bestaan altijd.
    • Mappen onder de $1 directory die door Usermin gemaakt of verwijderd kunnen worden.
    • Andere files of directories die als mappen beheerd kunnen worden door Usermin
    • POP3 accounts op andere servers die als mappen gezien worden.
    folders_name=Naam map folders_path=Locatie folders_type=Type folders_size=Grootte folders_maildir=Directory folders_mbox=File folders_mhdir=MH directory folders_create=Maak een nieuwe map folders_add=Voeg een bestaande file of directory toe als folder folders_return=mappenlijst folders_serv=$1 op server $2 folders_padd=Voeg een POP3 account als folder edit_title1=Nieuwe Map edit_title2=Bewerk Map edit_header=E-mail map details edit_mode=Map type edit_mode0=Bewaar in $1 edit_mode1=Externe mail file edit_mode2=Verzonden mail file edit_name=Mapnaam edit_type=Opslag type edit_type0=Enkele file (mbox) edit_type1=Qmail mail directory (Maildir) edit_type3=MH directory (MH) edit_file=Externe mail file or directory edit_sent=Verzonden mail file of directory edit_sent1=Usermin default edit_sent0=Externe mail file of directory edit_pop3=POP3 account edit_server=POP3 server edit_user=Gebruikersnaam op server edit_pass=Wachtwoord op server save_err=Kon map niet opslaan save_ename=Ontbrekende of ongeldige mapnaam save_esys=Mapnaam conflicteert met een van de systeem mappen save_eclash=Een map met deze naam bestaat reeds save_embox='$1' is niet in een leesbaar mailbox formaat save_emaildir='$1' is niet in een leesbaar Qmail of MH mail directoryformaat save_efile='$1' Bestaat niet, of is onleesbaar save_eindir=Externe mail files kunnen niet onder de mappen directory $1 staan save_title=Verwijder Map save_rusure= Wilt U map $1 in $2 verwijderen? $3 kB aan e-mail zal voorgoed worden verwijderd. save_delete=Verwijder Nu save_eserver=Onbekende of ongeldige POP3 server save_euser=Onbekende gebruikersnaam save_elogin= Kon niet inloggen op POP3 server : $1 mailbox/ulang/ru_SU0100755000567100000000000001175410135042553014145 0ustar jcameronrootmail_title=ţÔĹÎÉĹ ĐĎŢÔŮ mail_none=÷ ÎÁÓÔĎŃÝÉĘ ÍĎÍĹÎÔ × ĐÁĐËĹ $1 ĐÉÓĹÍ ÎĹÔ mail_pos=đÉÓŘÍÁ Ó $1 ĐĎ $2 ÉÚ $3 × ĐÁĐËĹ $4 mail_return=ĐÁĐËĹ mail_fromsrch=üÔĎÔ ÖĹ ĎÔĐŇÁ×ÉÔĹĚŘ.. mail_subsrch=üÔÁ ÖĹ ÔĹÍÁ.. send_efile=đŇÉÓĎĹÄÉÎĹÎÎŮĘ ĆÁĘĚ $1 ÎĹ ÍĎÖĹÔ ÂŮÔŘ ĐŇĎŢÉÔÁÎ, ĚÉÂĎ ÎĹ ÓŐÝĹÓÔ×ŐĹÔ address_chooser=÷ŮÂĹŇÉÔĹ ÁÄŇĹÓ.. address_addr=áÄŇĹÓ email address_name=ćéď ÁÄŇĹÓÁÔÁ address_none=÷ÁŰÁ ÁÄŇĹÓÎÁŃ ËÎÉÇÁ ĐŐÓÔÁ. address_title=áÄŇĹÓÎÁŃ ËÎÉÇÁ address_desc=óĐÉÓĎË ÁÄŇĹÓÁÔĎ×, ËĎÔĎŇŮÍ ×Ů ÍĎÖĹÔĹ ĐĎĚŘÚĎ×ÁÔŘÓŃ ĐŇÉ ÎÁĐÉÓÁÎÉÉ ĐÉÓĹÍ. ëŇĎÍĹ ĐŇŃÍĎÇĎ ÚÁĐĎĚÎĹÎÉŃ, ÁÄŇĹÓÁ × ÜÔĎÔ ÓĐÉÓĎË ÍĎÇŐÔ ÂŮÔŘ ÄĎÂÁ×ĚĹÎŮ ÎÁÖÁÔÉĹÍ ÎÁ ÎÉČ ĐŇÉ ŢÔĹÎÉÉ ĐĎŢÔŮ. address_edit=đŇÁ×ËÁ.. address_delete=őÄÁĚÉÔŘ address_add=äĎÂÁ×ÉÔŘ ÎĎ×ŮĘ ÁÄŇĹÓ address_err=îĹ×ĎÚÍĎÖÎĎ ÓĎČŇÁÎÉÔŘ ÁÄŇĹÓ address_eaddr=ďÔÓŐÔÓÔ×ŐĹÔ, ĚÉÂĎ ÎĹĐŇÁ×ÉĚŘÎŮĘ email address_from=ó ÁÄŇĹÓÁ? address_yd=äÁ, ×ÓĹÇÄÁ address_gdesc=óĐÉÓĎË ÇŇŐĐĐ ÁÄŇĹÓĎ×, ËĎÔĎŇŮÍ ×Ů ÍĎÖĹÔĹ ĐĎĚŘÚĎ×ÁÔŘÓŃ ÄĚŃ ĎÔĐŇÁ×ËÉ ĐÉÓĹÍ ÓŇÁÚŐ ÎĹÓËĎĚŘËÉÍ ÁÄŇĹÓÁÔÁÍ. address_gadd=äĎÂÁ×ÉÔŘ ÎĎ×ŐŔ ÇŇŐĐĐŐ address_gnone=÷ÁŰ ÓĐÉÓĎË ÇŇŐĐĐ ĐŐÓÔ. address_group=çŇŐĐĐÁ address_members=áÄŇĹÓÁ email address_m=$1 ŢĚĹÎĎ× group_err=îĹ×ĎÚÍĎÖÎĎ ÓĎČŇÁÎÉÔŘ ÇŇŐĐĐŐ group_egroup=ďÔÓŐÔÓÔ×ŐĹÔ, ĚÉÂĎ ÎĹĐŇÁ×ÉĚŘÎĎĹ ÉÍŃ ÇŇŐĐĐŮ group_emembers=îĹ ÄĎÂÁ×ĚĹÎĎ ÎÉ ĎÄÎĎÇĎ ŢĚĹÎÁ folders_title=őĐŇÁ×ĚĹÎÉĹ ĐÁĐËÁÍÉ folders_desc=ëÁÖÄÁŃ ĐÁĐËÁ ÍĎÖĹÔ ÓĎÄĹŇÖÁÔŘ ĐĹŇĹÍĹÝĹÎÎŮĹ × ÎĹĹ ĐÉÓŘÍÁ, ĚÉÂĎ ĐÉÓŘÍÁ, ĐĎÍĹÝĹÎÎŮĹ × ÎĹĹ Á×ÔĎÍÁÔÉŢĹÓËÉ. ÷ ÚÁ×ÉÓÉÍĎÓÔÉ ĎÔ ĐĎĚÎĎÍĎŢÉĘ, ÄÁÎÎŮČ ÁÄÍÉÎÉÓÔŇÁÔĎŇĎÍ, ×Ů ÍĎÖĹÔĹ ŇÁÂĎÔÁÔŘ Ó ĐÁĐËÁÍÉ ŢĹÔŮŇĹČ ÔÉĐĎ× :
    • óÉÓÔĹÍÎŮĹ (ÓŐÝĹÓÔ×ŐŔÔ ×ÓĹÇÄÁ) — ÷ČĎÄŃÝÉĹ, ţĹŇÎĎ×ÉËÉ É ďÔĐŇÁ×ĚĹÎÎŮĹ
    • đÁĐËÉ × ÄÉŇĹËÔĎŇÉÉ $1, ÓĎÚÄÁ×ÁĹÍŮĹ É ŐÄÁĚŃĹÍŮĹ ŢĹŇĹÚ Usermin
    • äŇŐÇÉĹ ĆÁĘĚŮ É ÄÉŇĹËÔĎŇÉÉ, ËĎÔĎŇŮĹ ÍĎÇŐÔ Ń×ĚŃÔŘÓŃ ĐÁĐËÁÍÉ Usermin
    • őŢĹÔÎŮĹ ÚÁĐÉÓÉ ÎÁ ×ÎĹŰÎÉČ POP3 É IMAP ÓĹŇ×ĹŇÁČ, ÄĎÂÁ×ĚĹÎÎŮĹ ËÁË ĐÁĐËÉ
    folders_name=éÍŃ ĐÁĐËÉ folders_path=ňÁÚÍĹÝĹÎÉĹ folders_type=ôÉĐ folders_size=ňÁÚÍĹŇ folders_maildir=äÉŇĹËÔĎŇÉŃ folders_mbox=ćÁĘĚ folders_mhdir=MH ÄÉŇĹËÔĎŇÉŃ folders_create=óĎÚÄÁÔŘ ÎĎ×ŐŔ ĐÁĐËŐ folders_add=äĎÂÁ×ÉÔŘ ÓŐÝĹÓÔ×ŐŔÝÉĹ ĆÁĘĚ ÉĚÉ ÄÉŇĹËÔĎŇÉŔ ËÁË ĐÁĐËŐ folders_return=ÓĐÉÓĎË ĐÁĐĎË folders_serv=$1 ÎÁ ÓĹŇ×ĹŇĹ $2 folders_servp=$1 ÎÁ ÓĹŇ×ĹŇĹ $2, ĐĎŇÔ $3 folders_padd=äĎÂÁ×ÉÔŘ ŃÝÉË POP3 ËÁË ĐÁĐËŐ folders_iadd=äĎÂÁ×ÉÔŘ ŃÝÉË IMAP ËÁË ĐÁĐËŐ edit_title1=óĎÚÄÁÎÉĹ ĐÁĐËÉ edit_title2=ňĹÄÁËÔÉŇĎ×ÁÎÉĹ ĐÁĐËÉ edit_header=îÁÓÔŇĎĘËÉ ĐÁĐËÉ edit_mode=ôÉĐ ĐÁĐËÉ edit_mode0=ćÁĘĚ × $1 edit_mode1=÷ÎĹŰÎÉĘ ĐĎŢÔĎ×ŮĘ ĆÁĘĚ edit_mode2=ćÁĘĚ ĎÔĐŇÁ×ĚĹÎÎĎĘ ĐĎŢÔŮ edit_name=éÍŃ ĐÁĐËÉ edit_type=óĐĎÓĎ ČŇÁÎĹÎÉŃ edit_type0=ďÄÉÎĎŢÎŮĘ ĆÁĘĚ (mbox) edit_type1=đĎŢÔĎ×ÁŃ ÄÉŇĹËÔĎŇÉŃ Qmail (Maildir) edit_type3=MH ÄÉŇĹËÔĎŇÉŃ (MH) edit_file=÷ÎĹŰÎÉĘ ĐĎŢÔĎ×ŮĘ ĆÁĘĚ ÉĚÉ ÄÉŇĹËÔĎŇÉŃ edit_sent=ćÁĘĚ ÉĚÉ ÄÉŇĹËÔĎŇÉŃ ĎÔĐŇÁ×ĚĹÎÎĎĘ ĐĎŢÔŮ edit_sent1=Usermin ĐĎ ŐÍĎĚŢÁÎÉŔ edit_sent0=÷ÎĹŰÎÉĘ ĆÁĘĚ ÉĚÉ ÄÉŇĹËÔĎŇÉŃ edit_perpage=đĎËÁÚŮ×ÁÔŘ ĐÉÓĹÍ ÎÁ ÓÔŇÁÎÉĂŐ edit_sentview=đĎËÁÚŮ×ÁÔŘ ëĎÍŐ: ×ÍĹÓÔĎ ďÔ: ? edit_pop3=ńÝÉË POP3 edit_imap=ńÝÉË IMAP edit_server=óĹŇ×ĹŇ POP3 edit_port=îĎÍĹŇ ĐĎŇÔÁ edit_iserver=óĹŇ×ĹŇ IMAP edit_user=éÍŃ ĐĎĚŘÚĎ×ÁÔĹĚŃ ÎÁ ÓĹŇ×ĹŇĹ edit_pass=đÁŇĎĚŘ ÎÁ ÓĹŇ×ĹŇĹ edit_mailbox=đÁĐËÁ ÎÁ ÓĹŇ×ĹŇĹ IMAP edit_imapinbox=÷ČĎÄŃÝÉĹ edit_imapother=äŇŐÇÁŃ ĐÁĐËÁ edit_fromaddr=đĎÄÓÔÁ×ĚŃÔŘ ďÔ: × ĐÉÓŘÍÁ, ĎÔĐŇÁ×ĚĹÎÎŮĹ ÉÚ ĐÁĐËÉ save_err=ďŰÉÂËÁ ĐŇÉ ÓĎČŇÁÎĹÎÉÉ ÎÁÓÔŇĎĹË ĐÁĐËÉ save_ecannot=÷ÁŰÉČ ĐŇÁ× ÎĹÄĎÓÔÁÔĎŢÎĎ ÄĚŃ ÉÓĐĎĚŘÚĎ×ÁÎÉŃ ĐÁĐĎË ÄÁÎÎĎÇĎ ÔÉĐÁ save_ename=ďÔÓŐÔÓÔ×ŐĹÔ, ĚÉÂĎ ÎĹĐŇÁ×ÉĚŘÎĎĹ ÉÍŃ ĐÁĐËÉ save_esys=éÍŃ ĐÁĐËÉ ËĎÎĆĚÉËÔŐĹÔ Ó ĎÄÎĎĘ ÉÚ ÓÉÓÔĹÍÎŮČ ĐÁĐĎË save_eclash=đÁĐËÁ Ó ÔÁËÉÍ ÉÍĹÎĹÍ ŐÖĹ ÓŐÝĹÓÔ×ŐĹÔ save_embox='$1' Ń×ĚŃĹÔÓŃ ÎĹĐŇÁ×ÉĚŘÎŮÍ ÉÍĹÎĹÍ ĆÁĘĚÁ ĐÁĐËÉ save_emaildir='$1' ÎĹ Ń×ĚŃĹÔÓŃ ĐŇÁ×ÉĚŘÎĎĘ Qmail ÉĚÉ MH ĐĎŢÔĎ×ĎĘ ÄÉŇĹËÔĎŇÉĹĘ save_efile='$1' ÎĹ ÓŐÝĹÓÔ×ŐĹÔ, ĚÉÂĎ ÎĹÄĎÓÔŐĐĹÎ save_eindir=÷ÎĹŰÎÉĘ ĐĎŢÔĎ×ŮĘ ĆÁĘĚ ÎĹ ÍĎÖĹÔ ÎÁČĎÄÉÔŘÓŃ × ÄÉŇĹËÔĎŇÉÉ ĐÁĐËÉ $1 save_title=őÄÁĚÉÔŘ ĐÁĐËŐ save_rusure=÷Ů Ő×ĹŇĹÎŮ × ÔĎÍ, ŢÔĎ ČĎÔÉÔĹ ŐÄÁĚÉÔŘ ĐÁĐËŐ $1 × $2? $3 kB ĐÉÓĹÍ ÂŐÄŐÔ ŐÄÁĚĹÎŮ ÎÁ×ÓĹÇÄÁ. save_delete=őÄÁĚÉÔŘ save_eserver=îĹÄĎÓÔŐĐĹÎ, ĚÉÂĎ ÎĹĐŇÁ×ÉĚŘÎŮĘ ÓĹŇ×ĹŇ POP3 save_euser=ďÔÓŐÔÓÔ×ŐĹÔ ÉÍŃ ĐĎĚŘÚĎ×ÁÔĹĚŃ save_elogin=îĹ×ĎÚÍĎÖÎĎ ĐĎÄËĚŔŢÉÔŘÓŃ Ë ÓĹŇ×ĹŇŐ POP3 : $1 save_elogin2=îĹ×ĎÚÍĎÖÎĎ ĐĎÄËĚŔŢÉÔŘÓŃ Ë ÓĹŇ×ĹŇŐ IMAP : $1 save_eperpage=ďÔÓŐÔÓÔ×ŐĹÔ ĚÉÂĎ ÎĹĐŇÁ×ÉĚŘÎĎĹ ËĎĚÉŢĹÓÔ×Ď ĐÉÓĹÍ, ĐĎËÁÚŮ×ÁĹÍŮČ ÎÁ ÓÔŇÁÎÉĂŐ save_eport=ďÔÓŐÔÓÔ×ŐĹÔ, ĚÉÂĎ ÎĹĐŇÁ×ÉĚŘÎŮĘ ÎĎÍĹŇ ĐĎŇÔÁ save_efromaddr=ďÔÓŐÔÓÔ×ŐĹÔ, ĚÉÂĎ ÎĹĐŇÁ×ÉĚŘÎŮĘ ÁÄŇĹÓ ďÔ: save_emailbox=îĹ×ĎÚÍĎÖÎĎ ĎÔËŇŮÔŘ ĐÁĐËŐ ÎÁ ÓĹŇ×ĹŇĹ IMAP : $1 save_emailbox2=ďÔÓŐÔÓÔ×ŐĹÔ, ĚÉÂĎ ÎĹĐŇÁ×ÉĚŘÎĎĹ ÉÍŃ ĐÁĐËÉ ÎÁ ÓĹŇ×ĹŇĹ IMAP save_edelete=îĹ×ĎÚÍĎÖÎĎ ŐÄÁĚÉÔŘ ĐÉÓŘÍĎ : $1 save_eappend=îĹ×ĎÚÍĎÖÎĎ ÄĎÂÁ×ÉÔŘ ĐÉÓŘÍĎ × ĐÁĐËŐ ÎÁ ÓĹŇ×ĹŇĹ IMAP : $1 save_esearch=đĎÉÓË × ĐÁĐËĹ ÎÁ ÓĹŇ×ĹŇĹ IMAP ÎĹ×ĎÚÍĎÖĹÎ : $1 razor_title=đĎÖÁĚĎ×ÁÔŘÓŃ ÎÁ óĐÁÍ razor_report=đĎÍĹÓÔÉÔŘ ÜÔĎ ĐÉÓŘÍĎ × Razor É ÄŇŐÇÉĹ ÂĚĎËÉŇŐŔÝÉĹ óĐÁÍ ÂÁÚŮ ÄÁÎÎŮČ ĐŇĎÇŇÁÍÍŮ SpamAssassin .. razor_done=.. ÇĎÔĎ×Ď razor_err=.. ĎŰÉÂËÁ! ÷ŮŰĹ ĐŇÉ×ĹÄĹÎÁ ĐŇÉŢÉÎÁ, ĐĎ ËĎÔĎŇĎĘ ĎĐĹŇÁĂÉŃ ÚÁ×ĹŇŰÉĚÁÓŘ ÎĹŐÄÁŢÎĎ. black_title=âĚĎËÉŇĎ×ËÁ ÁÄŇĹÓÁ ĎÔĐŇÁ×ÉÔĹĚŃ black_done=áÄŇĹÓ $1 ÄĎÂÁ×ĚĹÎ × ÓĐÉÓĎË ÚÁĐŇĹÝĹÎÎŮČ ÁÄŇĹÓĎ× ĐŇĎÇŇÁÍÍŮ SpamAssassin. black_already=áÄŇĹÓ $1 ŐÖĹ ÎÁČĎÄÉÔÓŃ × ÓĐÉÓËĹ ÚÁĐŇĹÝĹÎÎŮČ ÁÄŇĹÓĎ× ĐŇĎÇŇÁÍÍŮ SpamAssassin. epop3lock_tries=Failed to lock mail file $1 after trying for $2 minutes, due to a POP3 lock file. mailbox/ulang/tr0100644000567100000000000001122610142003225013513 0ustar jcameronrootmail_title=Maili oku mail_none= $1 dosyasýnda hiçbir mesaj bulunmamakta mail_pos= $3 deki $1 $2 arasý mesajlar $4 klasöründe mail_return=mailkutusu mail_fromsrch=Benzer göndericiler.. mail_subsrch=Benzer konular .. send_efile=Eklenen $1 dosyasý okunamýyor veya mevcut deđil send_nobody=Hiçkimse address_chooser=Adresleri seç.. address_addr=Email Adresi address_name=Gerçek adý address_none=Adres defterin boţ. address_title=Adres defteri address_desc=Aţađýdaki tabloda maili gönderirken kayýtlý olan kiţilerin mail adreslerini görebilirsin.Gelen maillere týklayarakta adres ekleyebilirsin. address_edit=Ekle.. address_delete=Sil address_add=Yeni mail adresi ekle. address_err=Adresi kaydedilmedi address_eaddr=Eksik veya hatalý mail adresi address_from=Adreslerden mi ? address_yd=Evet, varsayýlan address_gdesc=Bu liste ayný maili birden çok kiţiye gönderme olanađýda sađlar address_gadd=Yeni gurup ekle. address_gnone=Grup listeniz boţ. address_group=Gurup address_members=Email Adresleri address_m=$1 Üyeleri group_err=Grup adresleri kaydedilemedi group_egroup=Eksik veya hatalý gurup ismi group_emembers=Guruba hiçbir mail adresi eklenmemiţtir. folders_title=Klasörleri yönet folders_desc=Bu klasörlere mailleri kendinde ayýrabilirsin yada otomatik olarak ayrýlýr.Dört tip dosya bulunmakta :
    • Gelen , gönderilen ve taslak klasörleri sistem tarafýndan koyulup her sistemde vardýr.
    • $1 dizini altýndaki klasörler kullaný tarafýndan düzenlenebilir.
    • Diđer dosyalar veya dizinler de kullanýcý tarafýndan klasör haline getirilebilir.
    • Diđer serverda POP3 hesaplarýndaki klasör gibi davranýr.
    folders_name=Dosya ismi folders_path=Konum folders_type=Tip folders_size=Büyüklük folders_maildir=Dizin folders_mbox=Dosya folders_mhdir=MH dizini folders_create=Yeni bir dosya yarat folders_add=Var dosya veya dizini klasör gibi ekle folders_return=Dosya listesi folders_serv=$2 serverendaki $1 folders_servp= $2 port $3 deki $1 serverý folders_padd=Klasör olarak POP3 hesabý ekle folders_iadd=Klasör olarak IMAP mailkutusu ekle edit_title1=Dosya yarat edit_title2=Dosya ekle edit_header=Mail dosyasý detaylarý edit_mode=Dosya tipi edit_mode0= $1 içindeki dosya edit_mode1=Harici mail dosyasý edit_mode2=Mail dosyasý gönder edit_name=Dosya ismi edit_type=Kaydetme ţekli edit_type0=Tek dosya (mbox) edit_type1=Qmail mail dizini (Maildir) edit_type3=MH dizini (MH) edit_file=Harici mail dosya veya dizini edit_sent=Mail dosyasý veya dizini gönder edit_sent1=Kullanýcý varsayýlan ayarlarý edit_sent0=Harici mail dosya veya dizini edit_perpage=Bir sayfada gösterilecek mail sayýsý edit_sentview=Adrese göre sýrala : ? edit_pop3=POP3 Hesabý edit_imap=IMAP mailkutusu edit_server=POP3 servýr edit_port=Port numarasý edit_iserver=IMAP server edit_user=Servýrdaki kullanýcý adý edit_pass=Serverdeki ţifre edit_mailbox=IMAP mailkutusu edit_imapinbox=Kullanýcý gelen kutusu edit_imapother=Diđer mailkutusu edit_fromaddr=From: Klasörden mailler için gönderim adresleri save_err=Dosya kaydedilemedi save_ecannot=Bu tip bir klasör kullanmaya yetkili deđilsiniz save_ename=Eksik veya hatalý dosya adý save_esys=Klasör ismi sistem klasörleriyle çakýţmakta save_eclash=Ayný isimli bir klasör ţu anda var save_embox='$1' mail kutusu bulunamadý save_emaildir='$1' Qmail veya MH mail dizini bulunamadý save_efile='$1' bulunamadý veya giriţ izni yok save_eindir=harici mail dosyalarý $1 klasörü altýnda bulunamaz save_title=Dosyayý sil save_rusure= $2 deki $1 klasörünü silmek istediđinize emin misiniz? $3 kB büyüklüđündeki mailler silinecektir. save_delete=Ţimdi sil save_eserver=Eksik veya hatalý POP3 serverý save_euser=Eksik kullanýcý adý save_elogin= POP3 servera giriţ baţarýsýz : $1 save_elogin2=IMAP servera giriţ baţarýsýz : $1 save_eperpage= sayfada bulunan hatalý vaya eksik mesaj sayýsý save_eport=Hatalý veya eksik port numarasý save_efromaddr=Eksik veya hatlý : adresi save_emailbox=IMAP mailkutusunu açma baţarýsýz : $1 save_emailbox2=Eksik veya hatalý IMAP mailkutusu save_edelete=Mail silme baţarýsýz: $1 save_eappend= IMAP mailkutusuna mail ekleme baţarýsýz : $1 save_esearch= IMAP mailkutusundaki arama baţarýsýz : $1 razor_title=Spam olarak bildirildi razor_report= Razor ve diđer SpamAssassin spam-blocking veritabanýna bildirildi. .. razor_done=.. Yapýldý razor_err=.. Baţarýsýz! Bu hatanýn sebebini aţađýdaki mesaj kutusundan öđren . black_title=Kullanýcý reddedildi black_done= $1 mail adreslerinin SpamAssassin'ye eklenmesi engellendi. black_already= $1 mail adresleri SpamAssassin'daki engellendi. epop3lock_tries=$1 $2 dakika denendi fakat engelleme POP3 için baţarýsýz. mailbox/add_address.cgi0100775000567100000000000000051010115203122014753 0ustar jcameronroot#!/usr/local/bin/perl # add_address.cgi # Add an address from an email to the user's address book require './mailbox-lib.pl'; &ReadParse(); &create_address($in{'addr'}, $in{'name'}); @sub = split(/\0/, $in{'sub'}); $subs = join("", map { "&sub=$_" } @sub); &redirect("view_mail.cgi?idx=$in{'idx'}&folder=$in{'folder'}$subs"); mailbox/CHANGELOG0100664000567100000000000001147610452636156013303 0ustar jcameronroot---- Changes since 1.060 ---- Added links for switching between HTML and plain text view, and for showing the raw mail message. Improved the simple search function to accept 'and' and 'or' separated boolean expressions. ---- Changes since 1.070 ---- Added links to find all messages by the same sender or with the same subject when reading email. Image references like cid: in HTML email are now replaced with correct paths for other attachments in the email. ---- Changes since 1.080 ---- Added a basic HTML editor for sending and replying to email in HTML format. Requires Java 1.4+ in the browser. Must be enabled on the Preferences page, as it is still rather unstable. Included support for SMTP authentication when sending email, configurable in Webmin's Usermin Configuration module. Added a check for attempting to delete the same messages twice by using the browser Back button. If the mail file has been modified since the message list was loaded, the deletion will fail. ---- Changes since 1.090 ---- Replaced the Java HTML editor with HTMLArea, which uses DHTML and is much more reliable. ---- Changes since 1.100 ---- Added a preference option and field on the advanced search form for limiting the number of messages to search. Useful for users who have massive mailboxes and don't need to search way back into the past. Added support for requesting, sending and handling disposition status notifications. This is mostly disabled by default, but can be activated on the Preferences page. Added support for handling delivery status notifications. Created a new type of folder - the composite, which can combine multiple other folders into one. Useful if you have several separate mail files and want to make them appear as one folder. ---- Changes since 1.110 ---- Added a Preferences option to delete spam when reporting it, and one to control if the spam report/blacklist buttons appear on the mail list, mail page or both. On the advanced search form, you can now find messages with a particular status (read, unread or special). ---- Changes since 1.130 ---- Added a Preferences page option to enable buttons for reporting mail as ham (non-spam) on the mail list and individual message page. ---- Changes since 1.140 ---- Added a Preferences option to show a preview of message bodies in the mail list. All local folders are now sortable, by clicking on headers in the mail list. When searching, the results are now turned into a virtual folder, instead of simply being displayed. This allows them to be more easily navigated, and for search results to be kept around for a while. Added a Preferences option to view and compose email messages in a separate window. When Courier IMAP puts sub-folders inside the ~/Maildir/ directory, they will now automatically appear as mail folders in this module too. ---- Changes since 1.150 ---- Added a folder option to hide it from the menu above the mail list. Added a Preferences option to open links in emails in separate windows. ---- Changes since 1.170 ---- Spell checking is now possible for HTML email too. Output from sa-learn or spamassassin is now show when reporting multiple messages as spam. ---- Changes since 1.190 ---- Added a Preferences option to specify MIME types for attachments that should always be downloaded by the browser, not displayed inline. ---- Changes since 1.200 ---- Added a Preferences option for setting the date format. Improved support for Maildir++ sub-folders. Added a link on the Manage Folders page for setting up automatic scheduled deletion of messages older than some number of days, or those that cause the mailbox to exceed some size. Links to messages from the mail list now include a unique message ID, which ensures that changes to the mailbox (such as receiving new mail) between the time it is displayed and the time you click will not break the links. Messages in the mail list can be selected by clicking on the subject, date or size, rather than just on the checkbox. Searches on folder types other than mbox and IMAP now use the sort index, which speeds them up significantly for large folders (mbox folders already have their own indexes, and IMAP supports remote searching). Deleting messages from a folder properly updates the sort index, avoiding the need to totally rebuild it. Made the From/To/Subject fields for new emails larger and dynamically sized. Added highlighting for selected messages (when supported by the theme). Added a Preferences option for choosing the timezone for message dates (for when your browser is in a different timezone from the server). Added checkboxes and a button on the Manage Folders page for deleting several at once. Added a link on the Manage Folders page for copying all email from one folder to another. ---- Changes since 1.210 ---- Added caching to speed up large Maildir-format folders. ---- Changes since 1.220 ---- Improved cache speed for Maildir-format folders. mailbox/uconfig.info.da0100644000567100000120000000000010446027155015056 0ustar jcameronwheelmailbox/address_chooser.cgi0100775000567100000000000000754310262503347015721 0ustar jcameronroot#!/usr/local/bin/perl # address_chooser.cgi # Display a list of entries from the address book # XXX fix up ifield problem require './mailbox-lib.pl'; &ReadParse(); &popup_header($text{'address_choose'}); print < function makeaddress(a, n) { if (n == "") { // An address without a name return "<"+a+">"; } else if (n.indexOf(",") != -1) { // A name with a comma in it return "\\""+n+"\\" <"+a+">"; } else { // A name without a comma return n+" <"+a+">"; } } // Add an address to the list function newaddress(a, n) { av = makeaddress(a, n); if (top.opener.ifield.value == "") { top.opener.ifield.value = av; } else { top.opener.ifield.value += ","+av; } } // Remove an address from the list function oldaddress(a, n) { av = makeaddress(a, n); curr = top.opener.ifield.value; idx1 = curr.indexOf(av+","); idx2 = curr.indexOf(","+av); if (curr == av) { // Address only! curr = ""; } else if (idx1 != -1) { // Found the address, in string curr = curr.substring(0, idx1)+curr.substring(idx1+av.length+1); } else if (idx2 != -1) { // Found the ,address in string curr = curr.substring(0, idx2)+curr.substring(idx2+av.length+1); } else { // Look for address only sp = curr.split(","); curr = ""; for(j=0; j 0) a = a.substr(0, at); } if (top.opener.rfield != null) { // Put real name in separate field top.opener.ifield.value = a; top.opener.rfield.value = n; } else { // Combine to single field if (n == "") { av = "<"+a+">"; } else { av = n+" <"+a+">"; } top.opener.ifield.value = av; } window.close(); } EOF @addrs = &list_addresses(); if ($in{'mode'}) { @addrs = grep { $_->[3] } @addrs; $addrs_count = scalar(@addrs); } else { if (!$uconfig{'from_in_to'}) { @addrs = grep { !$_->[3] } @addrs; } $addrs_count = scalar(@addrs); foreach $a (&list_address_groups()) { push(@addrs, [ $a->[0] ]); $mems{$a->[0]} = [ &split_addresses($a->[1]) ]; } } if (@addrs) { local @sp = &split_addresses(&decode_mimewords($in{'addr'})); for($i=0; $i<@sp; $i++) { $infield{$sp[$i]->[0]} = $i; } print "
    \n"; print "\n"; print "\n" if (!$in{'mode'}); print "\n"; print "\n"; $i = 0; foreach $a (@addrs) { if ($i == $addrs_count && $i) { print "\n"; print "\n"; print "\n"; } print "\n"; if ($in{'mode'} == 0) { printf "\n"; local $m = @{$mems{$a->[0]}}; print "\n"; } else { print "\n"; print "\n"; } print "\n"; $i++; } print "

    $text{'address_addr'}$text{'address_name'}

    $text{'address_group'}$text{'address_members'}
    ", &html_escape($a->[1]), &html_escape($a->[0]), &html_escape($a->[1]), defined($infield{$a->[0]}) ? "checked" : ""; $href = ""; } else { $href = ""; } if ($i >= $addrs_count) { print "$href",$a->[0],"$href",&text('address_m', $m),"$href$a->[0]$href",($a->[1] ? $a->[1] : "
    "),"
    \n"; } else { print "$text{'address_none'}

    \n"; } &popup_footer(); mailbox/auto.pl0100775000567100000000000000250410432415163013360 0ustar jcameronroot#!/usr/local/bin/perl # Scan through all folders, and apply the scheduled deletion policy for each $no_acl_check++; $ENV{'REMOTE_USER'} = getpwuid($<); require './mailbox-lib.pl'; @folders = &list_folders(); &open_read_hash(); # hack to force correct DBM mode foreach $f (@folders) { # Skip folders for which clearing isn't active next if ($f->{'nowrite'}); $auto = &get_auto_schedule($f); next if (!$auto || !$auto->{'enabled'}); @delmails = ( ); if ($auto->{'mode'} == 0) { # Find messages that are too old @mails = &mailbox_list_mails(undef, undef, $f, 1); $cutoff = time() - $auto->{'days'}*24*60*60; foreach $m (@mails) { $time = &parse_mail_date($m->{'header'}->{'date'}); if ($time && $time < $cutoff || !$time && $auto->{'invalid'}) { push(@delmails, $m); } } } else { # Cut folder down to size, by deleting oldest first $size = &folder_size($f); @mails = &mailbox_list_mails(undef, undef, $f, 1); while($size > $auto->{'size'}) { last if (!@mails); # empty! $oldmail = shift(@mails); push(@delmails, $oldmail); $size -= $oldmail->{'size'}; } } if (@delmails) { if ($auto->{'all'}) { # Clear the whole folder &mailbox_empty_folder($f); } else { # Just delete mails that are over the limit &mailbox_delete_mail($f, reverse(@delmails)); } } } mailbox/classlinks.sh0100775000567100000000000000024010070471357014555 0ustar jcameronroot#!/bin/sh classes=`cd /usr/local/webadmin/mailboxes ; ls *.class` for c in $classes; do ln -s ../../webadmin/mailboxes/$c /usr/local/useradmin/mailbox/$c done mailbox/config-*-linux0100664000567100000000000000060510432465371014532 0ustar jcameronrootedit_from=1 mail_system=0 mail_dir=/var/spool/mail perpage=20 wrap_width=80 top_buttons=1 show_to=0 sendmail_path=/usr/lib/sendmail server_attach=1 mail_style=0 mail_file=mbox mail_dir_qmail=Maildir from_map=/etc/mail/generics index_min=1000000 index_dbm=0 folder_types=local,ext,pop3,imap pop_locks=1 no_crlf=0 from_format=0 spam_report= spam_always=0 folder_virts=virt,comp shortindex=0 mailbox/config-aix0100664000567100000000000000060610432465372014027 0ustar jcameronrootedit_from=1 mail_system=0 mail_dir=/var/spool/mail perpage=20 wrap_width=80 top_buttons=1 show_to=0 sendmail_path=/usr/sbin/sendmail server_attach=1 mail_style=0 mail_file=mbox mail_dir_qmail=Maildir from_map=/etc/mail/generics index_min=1000000 index_dbm=0 folder_types=local,ext,pop3,imap pop_locks=1 no_crlf=0 from_format=0 spam_report= spam_always=0 folder_virts=virt,comp shortindex=0 mailbox/config-freebsd0100664000567100000000000000060010432465373014653 0ustar jcameronrootedit_from=1 mail_system=0 mail_dir=/var/mail perpage=20 wrap_width=80 top_buttons=1 show_to=0 sendmail_path=/usr/sbin/sendmail server_attach=1 mail_style=0 mail_file=mbox mail_dir_qmail=Maildir from_map=/etc/mail/generics index_min=1000000 index_dbm=0 folder_types=local,ext,pop3,imap pop_locks=1 no_crlf=0 from_format=0 spam_report= spam_always=0 folder_virts=virt,comp shortindex=0 mailbox/config-hpux0100664000567100000000000000060010432465376014230 0ustar jcameronrootedit_from=1 mail_system=0 mail_dir=/var/mail perpage=20 wrap_width=80 top_buttons=1 show_to=0 sendmail_path=/usr/sbin/sendmail server_attach=1 mail_style=0 mail_file=mbox mail_dir_qmail=Maildir from_map=/etc/mail/generics index_min=1000000 index_dbm=0 folder_types=local,ext,pop3,imap pop_locks=1 no_crlf=0 from_format=0 spam_report= spam_always=0 folder_virts=virt,comp shortindex=0 mailbox/config-irix0100664000567100000000000000057710432465377014235 0ustar jcameronrootedit_from=1 mail_system=0 mail_dir=/var/mail perpage=20 wrap_width=80 top_buttons=1 show_to=0 sendmail_path=/usr/lib/sendmail server_attach=1 mail_style=0 mail_file=mbox mail_dir_qmail=Maildir from_map=/etc/mail/generics index_min=1000000 index_dbm=0 folder_types=local,ext,pop3,imap pop_locks=1 no_crlf=0 from_format=0 spam_report= spam_always=0 folder_virts=virt,comp shortindex=0 mailbox/config-macos0100664000567100000000000000060010432465402014334 0ustar jcameronrootedit_from=1 mail_system=0 mail_dir=/var/mail perpage=20 wrap_width=80 top_buttons=1 show_to=0 sendmail_path=/usr/sbin/sendmail server_attach=1 mail_style=0 mail_file=mbox mail_dir_qmail=Maildir from_map=/etc/mail/generics index_min=1000000 index_dbm=0 folder_types=local,ext,pop3,imap pop_locks=1 no_crlf=0 from_format=0 spam_report= spam_always=0 folder_virts=virt,comp shortindex=0 mailbox/config-msc-linux0100664000567100000000000000062110432465405015157 0ustar jcameronrootedit_from=1 mail_system=1 mail_dir=/var/spool/mail perpage=20 wrap_width=80 top_buttons=1 show_to=0 sendmail_path=/usr/lib/sendmail server_attach=1 mail_style=0 mail_file=mbox mail_dir_qmail=Maildir from_map=/etc/mail/generics index_min=1000000 index_dbm=0 folder_types=local,ext,pop3,imap pop_locks=1 pop_locks=1 no_crlf=0 from_format=0 spam_report= spam_always=0 folder_virts=virt,comp shortindex=0 mailbox/config-netbsd0100664000567100000000000000060010432465406014515 0ustar jcameronrootedit_from=1 mail_system=0 mail_dir=/var/mail perpage=20 wrap_width=80 top_buttons=1 show_to=0 sendmail_path=/usr/sbin/sendmail server_attach=1 mail_style=0 mail_file=mbox mail_dir_qmail=Maildir from_map=/etc/mail/generics index_min=1000000 index_dbm=0 folder_types=local,ext,pop3,imap pop_locks=1 no_crlf=0 from_format=0 spam_report= spam_always=0 folder_virts=virt,comp shortindex=0 mailbox/config-openbsd0100664000567100000000000000060010432465407014671 0ustar jcameronrootedit_from=1 mail_system=0 mail_dir=/var/mail perpage=20 wrap_width=80 top_buttons=1 show_to=0 sendmail_path=/usr/sbin/sendmail server_attach=1 mail_style=0 mail_file=mbox mail_dir_qmail=Maildir from_map=/etc/mail/generics index_min=1000000 index_dbm=0 folder_types=local,ext,pop3,imap pop_locks=1 no_crlf=0 from_format=0 spam_report= spam_always=0 folder_virts=virt,comp shortindex=0 mailbox/config-openserver0100664000567100000000000000060510432465411015427 0ustar jcameronrootedit_from=1 mail_system=0 mail_dir=/usr/spool/mail perpage=20 wrap_width=80 top_buttons=1 show_to=0 sendmail_path=/usr/lib/sendmail server_attach=1 mail_style=0 mail_file=mbox mail_dir_qmail=Maildir from_map=/etc/mail/generics index_min=1000000 index_dbm=0 folder_types=local,ext,pop3,imap pop_locks=1 no_crlf=0 from_format=0 spam_report= spam_always=0 folder_virts=virt,comp shortindex=0 mailbox/config-osf10100664000567100000000000000060610432465412014111 0ustar jcameronrootedit_from=1 mail_system=0 mail_dir=/var/spool/mail perpage=20 wrap_width=80 top_buttons=1 show_to=0 sendmail_path=/usr/sbin/sendmail server_attach=1 mail_style=0 mail_file=mbox mail_dir_qmail=Maildir from_map=/etc/mail/generics index_min=1000000 index_dbm=0 folder_types=local,ext,pop3,imap pop_locks=1 no_crlf=0 from_format=0 spam_report= spam_always=0 folder_virts=virt,comp shortindex=0 mailbox/config-qnx0100664000567100000000000000060010432465414014043 0ustar jcameronrootedit_from=1 mail_system=0 mail_dir=/var/mail perpage=20 wrap_width=80 top_buttons=1 show_to=0 sendmail_path=/usr/sbin/sendmail server_attach=1 mail_style=0 mail_file=mbox mail_dir_qmail=Maildir from_map=/etc/mail/generics index_min=1000000 index_dbm=0 folder_types=local,ext,pop3,imap pop_locks=1 no_crlf=0 from_format=0 spam_report= spam_always=0 folder_virts=virt,comp shortindex=0 mailbox/config-solaris0100664000567100000000000000057710432465415014727 0ustar jcameronrootedit_from=1 mail_system=0 mail_dir=/var/mail perpage=20 wrap_width=80 top_buttons=1 show_to=0 sendmail_path=/usr/lib/sendmail server_attach=1 mail_style=0 mail_file=mbox mail_dir_qmail=Maildir from_map=/etc/mail/generics index_min=1000000 index_dbm=0 folder_types=local,ext,pop3,imap pop_locks=1 no_crlf=0 from_format=0 spam_report= spam_always=0 folder_virts=virt,comp shortindex=0 mailbox/config-unixware0100664000567100000000000000057710432465417015117 0ustar jcameronrootedit_from=1 mail_system=0 mail_dir=/var/mail perpage=20 wrap_width=80 top_buttons=1 show_to=0 sendmail_path=/usr/lib/sendmail server_attach=1 mail_style=0 mail_file=mbox mail_dir_qmail=Maildir from_map=/etc/mail/generics index_min=1000000 index_dbm=0 folder_types=local,ext,pop3,imap pop_locks=1 no_crlf=0 from_format=0 spam_report= spam_always=0 folder_virts=virt,comp shortindex=0 mailbox/config.info0100664000567100000000000000531110432465332014174 0ustar jcameronrootline1=Inbox format and location,11 mail_system=Mail storage format for Inbox,4,0-Sendmail style single file (mbox),1-Qmail style directory (Maildir),3-MH style directory (MH),2-Remote POP3 server,4-Remote IMAP server mail_dir=Sendmail mail file location,3,File under home directory mail_file=Sendmail mail file in home directory,0 mail_qmail=Qmail or MH directory location,3,Subdirectory under home directory mail_dir_qmail=Qmail or MH directory in home directory,0 mail_style=Mail subdirectory style,4,0-mail/username,1-mail/u/username,2-mail/u/us/username,3-mail/u/s/username pop3_server=POP3 or IMAP server name,3,localhost line2=Sending email,11 send_mode=Send mail via connection to,3,Sendmail executable no_crlf=Add carriage return ( \r ) to each line?,1,0-Yes,1-No smtp_user=SMTP login name for mail server,3,None smtp_pass=SMTP password for mail server,3,None smtp_auth=SMTP authentication method,4,-Default,Cram-MD5-Cram-MD5,Digest-MD5-Digest-MD5,Plain-Plain,Login-Login sendmail_path=Sendmail command,0 line3=User From addresses,11 server_name=Default hostname for From: addresses,10,-From real hostname,*-From URL,ldap-Lookup in LDAP edit_from=Allow editing of From: address,1,1-Yes,0-No (always username@hostname),2-Only the username part from_map=From: address mapping file,3,None from_format=Address mapping file format,1,0-Username to address (genericstable),1-Address to username (virtusertable) line3.5=Qmail+LDAP options,11 ldap_host=LDAP server,3,Not used ldap_port=LDAP port,3,Default ldap_login=Login for LDAP server,0 ldap_pass=Password for LDAP server,0 ldap_base=Base for mail users,0 line3.6=Spam options,11 spam_report=Report spam using,1,sa_learn-sa&$45;learn --spam,spamassassin-spamassasin -r,-Decide automatically spam_always=Show spam options if SpamAssassin module is,1,1-Installed,0-Installed and available line3.7=Mail quota options,11 max_quota=Maximum allowed size for all folders (bytes),3,Unlimited ldap_quotas=Enforce LDAP quotas?,1,1-Yes,0-No line4=Other settings and restrictions,11 server_attach=Allow access to server-side files?,1,2-Attach and detach,1-Attach only,0-Niether max_attach=Maximum total attachments size,3,Unlimited index_min=Minimum mail file size to index,3,Always index index_dbm=Use DBM files for indexes?,1,2-Always,1-Only for new indexes,0-Never global_address=Global address book file,3,None global_address_group=Global address group book file,3,None folder_types=Allowed real folder types,2,local-File under ~/mail,ext-External file,pop3-POP3 server,imap-IMAP server folder_virts=Allowed virtual folder types,2,virt-Virtual,comp-Composite pop_locks=Check for POP3 lock files?,1,1-Yes,0-No shortindex=Base filename for index files,1,1-Last part of filename,0-Full filename mailbox/config.info.de0100755000567100000000000000357510054477713014604 0ustar jcameronroot edit_from=Erlaube das Editieren der FROM-Adresse?,1,1-Ja,0-Nein (immer benutzername@host),2-Nur den Benutzernamen folder_types=Erlaubte Verzeichnisarten,2,local-Datei unterhalb ~/mail,ext-Externe Datei,pop3-POP3 Server,imap-IMAP Server from_map=FROM-Adressen Umschreibungsdatei,3,Keine global_address=Datei für das Globale Adressbuch,3,Keine global_address_group=Datei für das Globale Adressbuch für Verteilerlisten,3,Keine index_dbm=Indexierungsart,1,2-DBM,0-Textdatei index_min=Minimale Maildateigröße zum Indexieren,3,Immer indexieren line1=Systemkonfiguration,11 line2=Benutzersynchronisation,11 line3=Benutzer-FROM-Adressen,11 line4=Andere Einstellungen und Beschränkungen,11 mail_dir=Benutzer-E-Mail-Dateiverzeichnis,3,Kein mail_dir_qmail=QMail- oder MH-Verzeichnis im Heimatverzeichnis,0 mail_file=E-Mail-Datei in Benutzer-Heimatverzeichnis,3,Kein mail_qmail=QMail- oder MH-Verzeichnisort,3,Unterverzeichnis im Heimatverzeichnis mail_style=E-Mail-Dateiverzeichnisart,4,0-mail/benutzername,1-mail/u/benutzername,2-mail/u/us/benutzername,3-mail/u/s/benutzername mail_system=Installierter Mail-Server,1,1-Sendmail,0-Postfix,2-Qmail,3-Automatisch herausfinden max_attach=Maximale Gesamtgröße für Dateianhänge an einer E-Mail,3,Unbegrenzt no_crlf=Einen Wagenrücklauf ( \r ) jeder Zeile hinzufügen,1,0-Ja,1-Nein pop3_server=POP3- oder IMAP-Servername,3,localhost pop_locks=Prüfe auf POP3-Lockdateien?,1,1-Ja,0-Nein sendmail_path=Pfad zu Sendmail,0 send_mode=Versende E-Mails unter Benutzung von,10,-Ausführbare Datei des Mailservers,SMTP Server server_attach=Erlaube den Zugriff auf Dateien auf dem Server?,1,2-Änhängen und Entfernen,1-Nur Änhängen,0-Weder noch server_name=Standard Hostname für die FROM-Adressen,10,-Den realen Hostnamen verwenden,*-Aus der URL extrahieren mailbox/defaultuconfig0100664000567100000000000000104710430202502014760 0ustar jcameronrootperpage=20 wrap_width=80 top_buttons=1 show_to=0 no_mime=0 save_sent=1 mailbox_dir=mail auto_mark=1 thumbnails=0 sort_addrs=1 real_name=1 mailbox_recur=0 charset=iso-8859-1 delete_warn=y sig_file=* self_crypt=1 fwd_mode=0 from_in_to=1 reply_to=x delete_mode=0 folder_sort=1 arrows=0 related_search=0 view_html=0 html_edit=0 html_quote=0 check_mod=1 req_dsn=0 send_dsn=2 req_del=0 spam_del=0 spam_buttons=mail reply_date=0 add_abook=0 real_expand=0 show_body=0 open_mode=0 link_mode=0 show_delall=0 spell_check=0 head_html=0 date_fmt=dmy send_return=0 mailbox/delete_mail.cgi0100755000567100000000000001422510451531410014777 0ustar jcameronroot#!/usr/local/bin/perl # delete_mail.cgi # Delete, mark, move or copy multiple messages require './mailbox-lib.pl'; &ReadParse(); @deleteboth = sort { $a <=> $b } split(/\0/, $in{'d'}); @folders = &list_folders(); $folder = $folders[$in{'folder'}]; if (!$in{'new'} && !$in{'mark1'} && !$in{'mark2'}) { # Get the messages @delmail = &messages_from_indexes($folder, \@deleteboth); } if ($in{'mark1'} || $in{'mark2'}) { # Marking emails with some status @deleteboth || &error($text{'delete_emnone'}); &open_read_hash(); local $m = $in{'mark1'} ? $in{'mode1'} : $in{'mode2'}; foreach $h (@deleteboth) { local ($hi, $hid) = split(/\//, $h); if ($m) { $read{$hid} = $m; } else { delete($read{$hid}); } } dbmclose(%read); $perpage = $folder->{'perpage'} || $userconfig{'perpage'}; #$s = int((@mail - $delete[0] - 1) / $perpage) * $perpage; &redirect("index.cgi?start=$in{'start'}&folder=$in{'folder'}"); } elsif ($in{'move1'} || $in{'move2'}) { # Moving mails to some other folder &error_setup($text{'delete_errm'}); @delmail || &error($text{'delete_emnone'}); $mfolder = $folders[$in{'move1'} ? $in{'mfolder1'} : $in{'mfolder2'}]; $mfolder->{'noadd'} && &error($text{'delete_enoadd'}); &lock_folder($folder); &lock_folder($mfolder); &mailbox_move_mail($folder, $mfolder, @delmail); &unlock_folder($mfolder); &unlock_folder($folder); &redirect("index.cgi?start=$in{'start'}&folder=$in{'folder'}"); } elsif ($in{'copy1'} || $in{'copy2'}) { # Copying mails to some other folder &error_setup($text{'delete_errc'}); @delmail || &error($text{'delete_emnone'}); $cfolder = $folders[$in{'copy1'} ? $in{'mfolder1'} : $in{'mfolder2'}]; $qerr = &would_exceed_quota($cfolder, @delmail); &error($qerr) if ($qerr); &lock_folder($cfolder); &mailbox_copy_mail($folder, $cfolder, @delmail); &unlock_folder($cfolder); &redirect("index.cgi?start=$in{'start'}&folder=$in{'folder'}"); } elsif ($in{'forward'}) { # Forwarding selected mails .. redirect @delmail || &error($text{'delete_efnone'}); &redirect("reply_mail.cgi?folder=$in{'folder'}&". join("&", map { "mailforward=".&urlize($_) } @deleteboth)); } elsif ($in{'new'}) { # Need to redirect to compose form &redirect("reply_mail.cgi?new=1&folder=$in{'folder'}"); } elsif ($in{'black'} || $in{'white'}) { # Deny or allow all senders $dir = $in{'black'} ? "blacklist_from" : "whitelist_from"; @delmail || &error($in{'black'} ? $text{'delete_ebnone'} : $text{'delete_ewnone'}); foreach $mail (@delmail) { push(@addrs, map { $_->[0] } &split_addresses($mail->{'header'}->{'from'})); } &foreign_require("spam", "spam-lib.pl"); local $conf = &spam::get_config(); local @from = map { @{$_->{'words'}} } &spam::find($dir, $conf); local %already = map { $_, 1 } @from; @newaddrs = grep { !$already{$_} } &unique(@addrs); push(@from, @newaddrs); &spam::save_directives($conf, $dir, \@from, 1); &flush_file_lines(); &redirect("index.cgi?folder=$in{'folder'}"); } elsif ($in{'razor'} || $in{'ham'}) { # Report as ham or spam all messages @delmail || &error($in{'razor'} ? $text{'delete_ebnone'} : $text{'delete_ehnone'}); &ui_print_header(undef, $in{'razor'} ? $text{'razor_title'} : $text{'razor_title2'}, ""); if ($in{'razor'}) { print "$text{'razor_report2'}\n"; } else { print "$text{'razor_report3'}\n"; } print "

    ";
    
    	# Write all messages to a temp file
    	$temp = &transname();
    	$cmd = $in{'razor'} ? &spam_report_cmd() : &ham_report_cmd();
    	foreach $mail (@delmail) {
    		&send_mail($mail, $temp);
    		}
    
    	# Call reporting command on them
    	&open_execute_command(OUT, "$cmd <$temp 2>&1", 1);
    	local $error;
    	while() {
    		print &html_escape($_);
    		$error++ if (/failed/i);
    		}
    	close(OUT);
    	unlink($temp);
    	print "
    \n"; if ($? || $error) { print "$text{'razor_err'}

    \n"; } else { if ($userconfig{'spam_del'} && $in{'razor'}) { # Delete spam too &lock_folder($folder); &mailbox_delete_mail($folder, @delmail); &unlock_folder($folder); print "$text{'razor_deleted'}

    \n"; } else { print "$text{'razor_done'}

    \n"; } } &ui_print_footer("index.cgi?folder=$in{'folder'}", $text{'mail_return'}); } elsif ($in{'delete'}) { # Just deleting emails @delmail || $in{'all'} || &error($text{'delete_enone'}); if (!$in{'confirm'} && &need_delete_warn($folder)) { # Need to ask for confirmation before deleting &ui_print_header(undef, $text{'confirm_title'}, ""); print &check_clicks_function(); print "

    \n"; foreach $i (keys %in) { foreach $v (split(/\0/, $in{$i})) { print &ui_hidden($i, $v),"\n"; } } print "
    \n"; if ($in{'all'}) { print &text('confirm_warnall'),"
    \n"; } else { print &text('confirm_warn', scalar(@delmail)),"
    \n"; } if ($userconfig{'delete_warn'} ne 'y') { # Only show a warning about not touching mailbox if # folder is too large print "$text{'confirm_warn2'}

    \n" } elsif ($folder->{'type'} == 0) { # For mbox format folders, show a warning about not # touching the mailbox print "$text{'confirm_warn4'}

    \n" } print "

    \n"; &ui_print_footer("index.cgi?start=$in{'start'}&folder=$in{'folder'}", $text{'index'}); } else { # Go ahead and delete $gconfig{'logfiles'} = 0; &lock_folder($folder); if ($in{'all'}) { # Clear the whole folder, unless the first email # is non-editable @mail = &mailbox_list_mails_sorted(0, 0, $folder); if (&editable_mail($mail[0])) { # Trash the lot &mailbox_empty_folder($folder); } else { # Delete all mail except the first local $fsz = &mailbox_folder_size($folder); @mail = &mailbox_list_mails_sorted(1, $fsz-1, $folder); @delmailrest = @mail[0..$#mail]; &mailbox_delete_mail($folder, @delmailrest); } } else { # Just delete selected messages &mailbox_delete_mail($folder, @delmail); } &unlock_folder($folder); &redirect("index.cgi?start=$in{'start'}&folder=$in{'folder'}"); } } else { &error("No button clicked!"); } &pop3_logout_all(); mailbox/detach.cgi0100755000567100000000000000550610421265441013772 0ustar jcameronroot#!/usr/local/bin/perl # detach.cgi # View one attachment from a message use Socket; require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); $folder = $folders[$in{'folder'}]; @mail = &mailbox_list_mails_sorted($in{'idx'}, $in{'idx'}, $folder); $mail = &find_message_by_index(\@mail, $folder, $in{'idx'}, $in{'mid'}); $mail || &error($text{'view_egone'}); &parse_mail($mail); @sub = split(/\0/, $in{'sub'}); foreach $s (@sub) { # We are looking at a mail within a mail .. &decrypt_attachments($mail); local $amail = &extract_mail($mail->{'attach'}->[$s]->{'data'}); &parse_mail($amail); $mail = $amail; } &decrypt_attachments($mail); $attach = $mail->{'attach'}->[$in{'attach'}]; if ($in{'scale'}) { # Scale the gif or jpeg image to 48 pixels high local $temp = &transname(); open(TEMP, ">$temp"); print TEMP $attach->{'data'}; close(TEMP); $SIG{'CHLD'} = sub { wait; }; if ($attach->{'type'} eq 'image/gif') { ($pnmin, $pnmout) = &pipeopen("giftopnm $temp"); } elsif ($attach->{'type'} eq 'image/jpeg') { ($pnmin, $pnmout) = &pipeopen("djpeg -fast $temp"); } else { &dump_erroricon(); } close($pnmin); $type = <$pnmout>; $size = <$pnmout>; unlink($temp); $type =~ /^P[0-9]/ || &dump_erroricon(); $size =~ /(\d+)\s+(\d+)/ || &dump_erroricon(); ($w, $h) = ($1, $2); if ($w > 48) { $scale = 48.0 / $w; } else { $scale = 48.0 / $h; } ($jpegin, $jpegout) = &pipeopen("pnmscale $scale 2>/dev/null | cjpeg"); print $jpegin $type; print $jpegin $size; while(read($pnmout, $buf, 1024)) { print $jpegin $buf; } close($jpegin); close($pnmout); print "Content-type: image/jpeg\n\n"; while(read($jpegout, $buf, 1024)) { print $buf; } close($jpegout); } else { # Just output the attachment print "X-no-links: 1\n"; @download = split(/\t+/, $userconfig{'download'}); if (&indexof($attach->{'type'}, @download) >= 0) { # Force download in IE print "Content-Disposition: Attachment\n"; } if ($attach->{'type'} eq 'message/delivery-status') { print "Content-type: text/plain\n\n"; } else { print "Content-type: $attach->{'type'}\n\n"; } if ($attach->{'type'} =~ /^text\/html/i) { print &safe_urls(&filter_javascript($attach->{'data'})); } else { print $attach->{'data'}; } } &pop3_logout_all(); sub dump_erroricon { print "Content-type: image/gif\n\n"; open(ICON, "images/error.gif"); while() { print; } close(ICON); exit; } # pipeopen(command) sub pipeopen { $pipe++; local $inr = "INr$pipe"; local $inw = "INw$pipe"; local $outr = "OUTr$pipe"; local $outw = "OUTw$pipe"; pipe($inr, $inw); pipe($outr, $outw); if (!fork()) { untie(*STDIN); untie(*STDOUT); open(STDIN, "<&$inr"); open(STDOUT, ">&$outw"); close($inw); close($outr); exec($_[0]); print STDERR "exec failed : $!\n"; exit 1; } close($inr); close($outw); return ($inw, $outr); } mailbox/edit_auto.cgi0100775000567100000000000000245210432414604014515 0ustar jcameronroot#!/usr/local/bin/perl # Show a form for setting up scheduled folder clearing require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); $folder = $folders[$in{'idx'}]; &ui_print_header(undef, $text{'auto_title'}, ""); print &ui_form_start("save_auto.cgi"); print &ui_hidden("idx", $in{'idx'}); print &ui_table_start($text{'auto_header'}, undef, 2); # Folder name print &ui_table_row($text{'auto_name'}, $folder->{'name'}); # Auto-clearing enabled $auto = &get_auto_schedule($folder); $auto ||= { 'enabled' => 0, 'mode' => 0, 'days' => 30 }; print &ui_table_row($text{'auto_enabled'}, &ui_yesno_radio("enabled", int($auto->{'enabled'}))); # Deletion criteria print &ui_table_row($text{'auto_mode'}, &ui_radio("mode", int($auto->{'mode'}), [ [ 0, &text('auto_days', &ui_textbox("days", $auto->{'days'}, 5))."
    ". (" " x 4).&ui_checkbox("invalid", 1, $text{'auto_invalid'}, $auto->{'invalid'})."
    " ], [ 1, &text('auto_size', &ui_bytesbox("size", $auto->{'size'}, 5)) ] ])); # Delete whole mailbox, or just infringing mails print &ui_table_row($text{'auto_all'}, &ui_yesno_radio("all", int($auto->{'all'}))); print &ui_table_end(); print &ui_form_end([ [ "save", $text{'save'} ] ]); &ui_print_footer("list_folders.cgi", $text{'folders_return'}); mailbox/edit_comp.cgi0100775000567100000000000000312610202477741014510 0ustar jcameronroot#!/usr/local/bin/perl # edit_comp.cgi # Display a form for creating or editing a composite folder require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); if ($in{'new'}) { &ui_print_header(undef, $text{'edit_title1'}, ""); } else { &ui_print_header(undef, $text{'edit_title2'}, ""); $folder = $folders[$in{'idx'}]; } print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
    $text{'edit_header'}
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; @names = split(/\t+/, $folder->{'subfoldernames'}); print "\n"; &show_folder_options($folder); print "
    $text{'edit_mode'}$text{'edit_comp'}
    $text{'edit_name'}",&ui_textbox("name", $folder->{'name'}, 40),"
    $text{'edit_comps'}\n"; for($i=0; $i<10; $i++) { print &ui_select("comp_$i", $names[$i], [ [ "", " " ], map { [ $_->{'id'} || $_->{'file'} || $_->{'name'}, $_->{'name'} ] } grep { $_->{'type'} != 5 && !$_->{'file'} || -e $_->{'file'} } @folders ]),"
    \n"; } print "
    \n"; if ($in{'new'}) { print "\n"; } else { print "\n"; print "\n"; } print "
    \n"; &ui_print_footer("list_folders.cgi", $text{'folders_return'}); mailbox/edit_folder.cgi0100775000567100000000000000620110416566716015032 0ustar jcameronroot#!/usr/local/bin/perl # edit_folder.cgi # Display a form for creating or editing a folder of some kind require './mailbox-lib.pl'; &ReadParse(); if ($in{'new'}) { &ui_print_header(undef, $text{'edit_title1'}, ""); $mode = $in{'mode'}; } else { &ui_print_header(undef, $text{'edit_title2'}, ""); @folders = &list_folders(); $folder = $folders[$in{'idx'}]; $mode = $folder->{'mode'}; } print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
    $text{'edit_header'}
    \n"; print "\n"; print "\n"; if ($mode == 0) { # Adding/editing a new file or directory to ~/mail print "\n"; printf "\n", $folder->{'name'}; print "\n"; if ($in{'new'} && $folders_dir eq "$remote_user_info[7]/Maildir") { # A new folder, but under a Maildir .. so it must be maildir too print "\n"; print &ui_hidden("type", 1),"\n"; } elsif ($in{'new'}) { # Can choose the type of a new folder print "\n"; } else { # Show type of existing folder print "\n"; } } elsif ($mode == 1) { # Adding/editing an external file or directory print "\n"; printf "\n", $folder->{'name'}; print "\n"; printf "\n", $folder->{'file'}, &file_chooser_button("file"); } elsif ($mode == 2) { # Selecting the sent mail folder local $sf = "$folders_dir/sentmail"; print "\n", $folder->{'file'} eq $sf ? "" : $folder->{'file'}, &file_chooser_button("sent"); } &show_folder_options($folder, $mode); print "
    $text{'edit_mode'}",&text("edit_mode$mode", "$folders_dir"),"
    $text{'edit_name'}
    $text{'edit_type'}",$text{'edit_type1'},"
    ", "$text{'edit_type0'}\n"; print " ", "$text{'edit_type1'}\n"; print " ", "$text{'edit_type3'}\n" if ($userconfig{'mailbox_recur'}); print "
    ",$text{'edit_type'.$folder->{'type'}}, "
    $text{'edit_name'}
    $text{'edit_file'} %s
    $text{'edit_sent'} \n"; printf " %s
    \n", $folder->{'file'} eq $sf ? "checked" : "", $text{'edit_sent1'}; printf " %s\n", $folder->{'file'} eq $sf ? "" : "checked", $text{'edit_sent0'}; printf " %s
    \n"; if ($in{'new'}) { print "\n"; } else { print "\n"; print "\n" if ($mode != 2); } print "
    \n"; &ui_print_footer("list_folders.cgi", $text{'folders_return'}); mailbox/edit_imap.cgi0100775000567100000000000000471010157743557014512 0ustar jcameronroot#!/usr/local/bin/perl # edit_imap.cgi # Display a form for creating or editing an IMAP folder require './mailbox-lib.pl'; &ReadParse(); if ($in{'new'}) { &ui_print_header(undef, $text{'edit_title1'}, ""); $mode = $in{'mode'}; } else { &ui_print_header(undef, $text{'edit_title2'}, ""); @folders = &list_folders(); $folder = $folders[$in{'idx'}]; $mode = $folder->{'mode'}; } print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
    $text{'edit_header'}
    \n"; print "\n"; print "\n"; print "\n"; printf "\n", $folder->{'name'}; print "\n"; printf "\n", $folder->{'server'}; print "\n", $folder->{'port'}; print "\n"; printf "\n", $folder->{'user'}; print "\n"; printf "\n", $folder->{'pass'}; print "\n"; printf "\n", $folder->{'mailbox'}; &show_folder_options($folder); print "
    $text{'edit_mode'}$text{'edit_imap'}
    $text{'edit_name'}
    $text{'edit_iserver'}
    $text{'edit_port'} \n"; printf " %s (%d)\n", $folder->{'port'} ? "" : "checked", $text{'default'}, $imap_port; printf "\n", $folder->{'port'} ? "checked" : ""; printf "
    $text{'edit_user'}
    $text{'edit_pass'}
    $text{'edit_mailbox'} %s\n", $folder->{'mailbox'} ? "" : "checked", $text{'edit_imapinbox'}; printf " %s\n", $folder->{'mailbox'} ? "checked" : "", $text{'edit_imapother'}; printf "
    \n"; if ($in{'new'}) { print "\n"; } else { print "\n"; print "\n"; } print "
    \n"; &ui_print_footer("list_folders.cgi", $text{'folders_return'}); mailbox/edit_pop3.cgi0100775000567100000000000000406710157743550014443 0ustar jcameronroot#!/usr/local/bin/perl # edit_pop3.cgi # Display a form for creating or editing a POP3 folder require './mailbox-lib.pl'; &ReadParse(); if ($in{'new'}) { &ui_print_header(undef, $text{'edit_title1'}, ""); $mode = $in{'mode'}; } else { &ui_print_header(undef, $text{'edit_title2'}, ""); @folders = &list_folders(); $folder = $folders[$in{'idx'}]; $mode = $folder->{'mode'}; } print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
    $text{'edit_header'}
    \n"; print "\n"; print "\n"; print "\n"; printf "\n", $folder->{'name'}; print "\n"; printf "\n", $folder->{'server'}; print "\n", $folder->{'port'}; print "\n"; printf "\n", $folder->{'user'}; print "\n"; printf "\n", $folder->{'pass'}; &show_folder_options($folder); print "
    $text{'edit_mode'}$text{'edit_pop3'}
    $text{'edit_name'}
    $text{'edit_server'}
    $text{'edit_port'} \n"; printf " %s (%d)\n", $folder->{'port'} ? "" : "checked", $text{'default'}, $pop3_port; printf "\n", $folder->{'port'} ? "checked" : ""; printf "
    $text{'edit_user'}
    $text{'edit_pass'}
    \n"; if ($in{'new'}) { print "\n"; } else { print "\n"; print "\n"; } print "
    \n"; &ui_print_footer("list_folders.cgi", $text{'folders_return'}); mailbox/edit_sig.cgi0100775000567100000000000000115010115203153014312 0ustar jcameronroot#!/usr/local/bin/perl # edit_sig.cgi # Display the user's .signature file for editing require './mailbox-lib.pl'; $sf = &get_signature_file(); $sf || &error($text{'sig_enone'}); &ui_print_header(undef, $text{'sig_title'}, ""); print &text('sig_desc', "$sf"),"

    \n"; print "

    \n"; print "
    \n"; print "\n"; print "\n"; print "
    \n"; &ui_print_footer("", $text{'mail_return'}); mailbox/edit_virt.cgi0100775000567100000000000000245010261667342014540 0ustar jcameronroot#!/usr/local/bin/perl # Display a form for creating or editing a virtual folder require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); if ($in{'new'}) { &ui_print_header(undef, $text{'edit_title1'}, ""); } else { &ui_print_header(undef, $text{'edit_title2'}, ""); $folder = $folders[$in{'idx'}]; } print "
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "
    $text{'edit_header'}
    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; &show_folder_options($folder); print "
    $text{'edit_mode'}$text{'edit_virt'}
    $text{'edit_name'}",&ui_textbox("name", $folder->{'name'}, 40),"
    $text{'edit_delete'}",&ui_yesno_radio("delete", int($folder->{'delete'})),"
    \n"; if ($in{'new'}) { print "\n"; } else { print "\n"; print "\n"; } print "
    \n"; &ui_print_footer("list_folders.cgi", $text{'folders_return'}); mailbox/inbox_login.cgi0100775000567100000000000000262610115203122015037 0ustar jcameronroot#!/usr/local/bin/perl # inbox_login.cgi # Save inbox POP3 login and password require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); $folder = $folders[$in{'folder'}]; # Validate inputs &error_setup($text{'mail_loginerr'}); $in{'user'} =~ /\S/ || &error($text{'save_euser'}); $folder->{'user'} = $pop3{'user'} = $in{'user'}; $folder->{'pass'} = $pop3{'pass'} = $in{'pass'}; if ($folder->{'type'} == 2) { # Try POP3 login @err = &pop3_login($folder); if ($err[0] == 0) { &error($err[1]); } elsif ($err[0] == 2) { &error(&text('save_elogin', $err[1])); } else { &pop3_logout($err[1], 1); } # Save inbox .pop3 file &write_file("$user_module_config_directory/inbox.pop3", \%pop3); chmod(0700, "$user_module_config_directory/inbox.pop3"); } else { # Try IMAP login $in{'mailbox_def'} || $in{'mailbox'} =~ /^\S+$/ || &error($text{'save_emailbox2'}); $folder->{'mailbox'} = $pop3{'mailbox'} = $in{'mailbox_def'} ? undef : $in{'mailbox'}; @err = &imap_login($folder); if ($err[0] == 0) { &error($err[1]); } elsif ($err[0] == 2) { &error(&text('save_elogin2', $err[1])); } elsif ($err[0] == 3) { &error(&text('save_emailbox', $err[1])); } else { &imap_logout($err[1], 1); } # Save inbox .imap file &write_file("$user_module_config_directory/inbox.imap", \%pop3); chmod(0700, "$user_module_config_directory/inbox.imap"); } &redirect("index.cgi?folder=$in{'folder'}"); mailbox/inbox_logout.cgi0100775000567100000000000000057510115203122015241 0ustar jcameronroot#!/usr/local/bin/perl # inbox_logout.cgi # Clear inbox POP3 login and password require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); $folder = $folders[$in{'folder'}]; if ($folder->{'type'} == 2) { unlink("$user_module_config_directory/inbox.pop3"); } else { unlink("$user_module_config_directory/inbox.imap"); } &redirect("index.cgi?folder=$in{'folder'}"); mailbox/index.cgi0100755000567100000000000003072710437372214013660 0ustar jcameronroot#!/usr/local/bin/perl # index.cgi # List the mail messages for the user require './mailbox-lib.pl'; &ReadParse(); &open_read_hash(); &open_dsn_hash(); @folders = &list_folders_sorted(); if (defined($in{'id'})) { # Folder ID specified $idf = &find_named_folder($in{'id'}, \@folders); $in{'folder'} = $idf->{'index'} if ($idf); } elsif (!defined($in{'folder'}) && $userconfig{'default_folder'}) { # No folder specified .. find the default by preferences $df = &find_named_folder($userconfig{'default_folder'}, \@folders); $in{'folder'} = $df->{'index'} if ($df); } ($folder) = grep { $_->{'index'} == $in{'folder'} } @folders; print "Refresh: $userconfig{'refresh'}\r\n" if ($userconfig{'refresh'}); ($qtotal, $qcount, $totalquota, $countquota) = &get_user_quota(); if ($totalquota) { $qmesg = &text('mail_quota', &nice_size($qtotal), &nice_size($totalquota)); } &ui_print_header(undef, &text('index_title', $folder->{'name'}), "", undef, 1, 1, 0, $qmesg); print &check_clicks_function(); # Check if this is a POP3 or IMAP inbox with no login set if (($folder->{'type'} == 2 || $folder->{'type'} == 4) && $folder->{'mode'} == 3 && !defined($folder->{'user'})) { print "
    \n"; print "\n"; print "
    \n"; print "\n"; print "
    $text{'mail_loginheader'}
    ",&text('mail_logindesc', "$folder->{'server'}"),"\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; if ($folder->{'type'} == 4) { print "\n"; } print "\n"; print "
    $text{'mail_loginuser'}
    $text{'mail_loginpass'}
    $text{'mail_loginmailbox'}", " \n"; printf" %s
    \n", "checked", $text{'edit_imapinbox'}; printf" %s\n", $text{'edit_imapother'}; print "
    \n"; print "\n"; print "
    \n"; &ui_print_footer("/", $text{'index'}); exit; } # Get folder-selection HTML $sel = &folder_select(\@folders, $folder, "folder"); # Work out start from jump page $perpage = $folder->{'perpage'} || $userconfig{'perpage'} || 20; if ($in{'jump'} =~ /^\d+$/ && $in{'jump'} > 0) { $in{'start'} = ($in{'jump'}-1)*$perpage; } # View mail in sort order @mail = &mailbox_list_mails_sorted( int($in{'start'}), int($in{'start'})+$perpage-1, $folder, 1, \@error); if ($in{'start'} >= @mail && $in{'jump'}) { # Jumped too far! $in{'start'} = @mail - $perpage; @mail = &mailbox_list_mails_sorted(int($in{'start'}), int($in{'start'})+$perpage-1, $folder, 1, \@error); } # Show page flipping arrows &show_arrows(); print "
    \n"; print "\n"; print "\n"; print "\n"; if ($userconfig{'top_buttons'} && @mail) { &show_mailbox_buttons(1, \@folders, $folder, \@mail); print &select_all_link("d", 1, $text{'mail_all'})," \n"; print &select_invert_link("d", 1, $text{'mail_invert'})," \n"; ($sortfield, $sortdir) = &get_sort_field($folder); if ($sortfield) { # Show un-sort link print "$text{'mail_nosort'} \n"; } } # Generate mail list headers $showto = $folder->{'show_to'}; $showfrom = $folder->{'show_from'}; if (@mail) { @cols = ( "" ); @tds = ( "width=5" ); push(@cols, &field_sort_link($text{'mail_from'}, "from", $folder, $in{'start'})) if ($showfrom); push(@tds, "nowrap width=30%") if ($showfrom); push(@cols, &field_sort_link($text{'mail_to'}, "to", $folder, $in{'start'})) if ($showto); push(@tds, "nowrap width=30%") if ($showto); push(@cols, &field_sort_link($text{'mail_date'}, "date", $folder, $in{'start'})); push(@tds, "nowrap width=15%"); push(@cols, &field_sort_link($text{'mail_size'}, "size", $folder, $in{'start'})); push(@tds, "nowrap width=15%"); if ($folder->{'spam'}) { push(@cols, &field_sort_link($text{'mail_level'}, "x-spam-status", $folder, $in{'start'})); push(@tds, "width=2%"); } push(@cols, &field_sort_link($text{'mail_subject'}, "subject", $folder, $in{'start'})); push(@tds, "width=45%"); print &ui_columns_start(\@cols, "100", 0, \@tds); } if (@error) { print "
    \n"; print &text('mail_err', $error[0] == 0 ? $error[1] : &text('save_elogin', $error[1])),"\n"; print "
    \n"; } # Show the actual email for($i=int($in{'start'}); $i<@mail && $i<$in{'start'}+$perpage; $i++) { local ($bs, $be); $m = $mail[$i]; $mid = $m->{'header'}->{'message-id'}; if ($read{$mid} == 2) { # Special ($bs, $be) = ("", ""); } elsif ($read{$mid} == 0) { # Unread ($bs, $be) = ("", ""); } ¬es_decode($m, $folder); local $idx = $m->{'idx'}; local @cols; # From and To columns, with links if ($showfrom) { push(@cols, $bs.&view_mail_link($folder, $i, $in{'start'}, $m->{'header'}->{'from'}, $mid).$be); } if ($showto) { push(@cols, $bs.&view_mail_link($folder, $i, $in{'start'}, $m->{'header'}->{'to'}, $mid).$be); } # Date and size columns push(@cols, $bs.&simplify_date($m->{'header'}->{'date'}).$be); push(@cols, $bs.&nice_size($m->{'size'}, 1024).$be); # Spam score if ($folder->{'spam'}) { if ($m->{'header'}->{'x-spam-status'} =~ /(hits|score)=([0-9\.]+)/) { push(@cols, $bs.$2.$be); } else { push(@cols, ""); } } # Subject column, with read/special icons $stable = "". "
    ". "". " "; local @icons = &message_icons($m, $folder->{'sent'}); $stable .= join(" ", @icons); $stable .= "
    \n"; push(@cols, $stable); if (&editable_mail($m)) { print &ui_checked_columns_row(\@cols, \@tds, "d", "$i/$mid"); } else { print &ui_columns_row([ "", @cols ], \@tds); } &update_delivery_notification($mail[$i], $folder); # Show part of the body too if ($userconfig{'show_body'}) { &parse_mail($m); local $data = &mail_preview($m); if ($data) { print " ", &html_escape($data)," \n"; } } } if (@mail) { print &ui_columns_end(); print &select_all_link("d", 1, $text{'mail_all'})," \n"; print &select_invert_link("d", 1, $text{'mail_invert'})," \n"; if ($sortfield) { # Show un-sort link print "$text{'mail_nosort'} \n"; } print "
    \n"; } &show_mailbox_buttons(2, \@folders, $folder, \@mail); print "
    \n"; if ($userconfig{'arrows'}) { # Show page flipping arrows print "
    \n"; &show_arrows(); } # Show search form print "
    \n"; print "\n"; if ($folder->{'searchable'}) { # Simple search print "\n"; # Advanced search $jumpform = (@mail > $perpage); print "\n"; print "\n"; print "\n"; print "\n"; } if ($folder->{'spam'}) { # Spam level search print "\n"; } elsif ($jumpform) { # Show page jump form print "\n"; print "\n"; print "\n"; } else { print "\n"; } print "\n"; # Show various buttons for the address book, folders, sig and logging out $logout = ($folder->{'type'} == 2 || $folder->{'type'} == 4) && $folder->{'mode'} == 3 && defined($folder->{'user'}); print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; if (&get_signature_file()) { print "\n"; print "\n"; print "\n"; } else { print "\n"; } print "\n"; print "\n"; if ($folder->{'trash'} || $userconfig{'show_delall'}) { # Show button to delete all mail in folder print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } else { print "\n"; } print "\n"; if ($logout) { # Add button for logging out of inbox print "\n"; print "\n"; print "\n"; print "\n"; } print "\n"; print "
    \n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print "\n"; print "\n"; print "\n"; print "
    \n"; print "\n"; printf " %s %s\n", int($in{'start'} / $perpage)+1, $text{'mail_of'}, int(@mail / $perpage)+1; print "
    ", "
    \n"; &ui_print_footer("/", $text{'index'}); &pop3_logout(); # show_arrows() # Prints HTML for previous/next page arrows sub show_arrows { print "
    \n"; print "
    \n"; # Show left arrow to go to start of folder if ($in{'start'}) { printf "%s\n", 0, $in{'folder'}, ''; } else { print "\n"; } # Show left arrow to decrease start if ($in{'start'}) { printf "%s\n", $in{'start'}-$perpage, $in{'folder'}, ''; } else { print "\n"; } local $s = $in{'start'}+1; local $e = $in{'start'}+$perpage; $e = scalar(@mail) if ($e > @mail); if (@mail) { print &text('mail_pos', $s, $e, scalar(@mail), $sel); } else { print &text('mail_none', $sel); } print "\n"; # Show right arrow to increase start if ($in{'start'}+$perpage < @mail) { printf "%s\n", $in{'start'}+$perpage, $in{'folder'}, ''; } else { print "\n"; } # Show right arrow to go to end if ($in{'start'}+$perpage < @mail) { printf "%s\n", int((scalar(@mail)-$perpage-1)/$perpage + 1)*$perpage, $in{'folder'}, ''; } else { print "\n"; } if ($folder->{'msg'}) { print "
    $folder->{'msg'}\n"; } print "
    \n"; } mailbox/list_addresses.cgi0100775000567100000000000001214210245245475015557 0ustar jcameronroot#!/usr/local/bin/perl # list_addresses.cgi # Display contents of the user's address book require './mailbox-lib.pl'; &ReadParse(); &ui_print_header(undef, $text{'address_title'}, ""); @addrs = &list_addresses(); print "$text{'address_desc'}

    \n"; if (@addrs || $in{'add'}) { if ($in{'add'} || $in{'edit'} ne '') { print "

    \n"; print "\n"; print "\n"; } print "\n"; print " ", " ", " ", $config{'edit_from'} ? " " : "", "\n"; foreach $a (@addrs) { next if (!defined($a->[2])); print "\n"; if ($in{'edit'} eq $a->[2]) { # Editing this row print "\n"; print "\n"; if ($config{'edit_from'}) { &from_sel($a->[3]); } else { print "\n"; } print "\n"; } else { # Just showing this row print "\n"; print "\n"; print "\n" if ($config{'edit_from'}); } print "\n"; } if ($in{'add'}) { print "\n"; print "\n"; print "\n"; print "\n"; print &from_sel() if ($config{'edit_from'}); print "\n"; print "\n"; } print "
    $text{'address_addr'}$text{'address_name'}$text{'address_from'}
    \n"; if ($in{'edit'} ne $a->[2]) { print "", "$text{'address_edit'}\n"; } else { print "$text{'cancel'}\n"; } print " \n"; print "", "$text{'address_delete'}$a->[0]",$a->[1] ? $a->[1] : "
    ","
    ",$a->[3] == 1 ? $text{'yes'} : $a->[3] == 2 ? $text{'address_yd'} : $text{'no'},"
    $text{'cancel'}
    \n"; if ($in{'add'} || $in{'edit'} ne '') { print "
    \n"; } } else { print "$text{'address_none'}

    \n"; } print "$text{'address_add'}
    \n" if (!$in{'add'}); print "


    \n"; print "\n"; @gaddrs = &list_address_groups(); print "$text{'address_gdesc'}

    \n"; if (@gaddrs || $in{'gadd'}) { if ($in{'gadd'} || $in{'gedit'} ne '') { print "

    \n"; print "\n"; print "\n"; } print "\n"; print " ", " ", " ", "\n"; foreach $a (@gaddrs) { next if (!defined($a->[2])); print "\n"; if ($in{'gedit'} eq $a->[2]) { print "\n"; print "\n"; } else { print "\n"; print "\n"; } print "\n"; } if ($in{'gadd'}) { print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } print "
    $text{'address_group'}$text{'address_members'}
    \n"; if ($in{'gedit'} ne $a->[2]) { print "", "$text{'address_edit'}\n"; } else { print "$text{'cancel'}\n"; } print " \n"; print "", "$text{'address_delete'} ", &address_button("members", 0, 0, 0, 1),"\n"; print "$a->[0]",&html_escape($a->[1]),"
    $text{'cancel'} ", &address_button("members", 0, 0, 0, 1),"\n"; print "
    \n"; if ($in{'gadd'} || $in{'gedit'} ne '') { print "
    \n"; } } else { print "$text{'address_gnone'}

    \n"; } print "$text{'address_gadd'}
    \n" if (!$in{'gadd'}); &ui_print_footer("", $text{'mail_return'}); sub from_sel { print "\n"; } mailbox/list_folders.cgi0100775000567100000000000001057410443361420015234 0ustar jcameronroot#!/usr/local/bin/perl # list_folders.cgi # Display a list of all folders and allows additional and deletion require './mailbox-lib.pl'; &ui_print_header(undef, $text{'folders_title'}, ""); print "$text{'folders_desc2'}
    \n"; print "

      \n"; foreach $ft ('sys', 'local', 'ext', 'pop3', 'imap', 'comp', 'virt') { print "
    • ",$text{'folders_desc'.$ft},"\n" if ($ft eq "sys" || $folder_types{$ft}); } print "
    \n"; print &ui_form_start("delete_folders.cgi", "post"); @tds = ( "width=5" ); @folders = &list_folders_sorted(); print &ui_columns_start([ "", $text{'folders_name'}, $text{'folders_path'}, $text{'folders_type'}, $text{'folders_size'}, $text{'folders_action'} ], undef, 0, \@tds); foreach $f (@folders) { local @cols; local $deletable = 0; if ($f->{'inbox'} || $f->{'drafts'}) { # Inbox or drafs folder which cannot be edited push(@cols, $f->{'name'}); } elsif ($f->{'type'} == 2) { # Link for editing POP3 folder push(@cols, "". "$f->{'name'}"); $deletable = 1; } elsif ($f->{'type'} == 4) { # Link for editing IMAP folder push(@cols, "". "$f->{'name'}"); $deletable = 1; } elsif ($f->{'mode'} == 2 && !$folder_types{'ext'}) { # Sent mail folder can only be changed if external folders # are allowed push(@cols, $f->{'name'}); } elsif ($f->{'type'} == 5) { # Link for editing composite folder push(@cols, "". "$f->{'name'}"); $deletable = 1; } elsif ($f->{'type'} == 6) { # Link for editing virtual folder push(@cols, "". "$f->{'name'}"); $deletable = 1; } else { # Link for editing local or external folder push(@cols, "". "$f->{'name'}"); $deletable = 1; } if ($f->{'type'} == 2 || $f->{'type'} == 4) { # Show mail server push(@cols, &text( $f->{'port'} ? 'folders_servp' : 'folders_serv', "$f->{'user'}", "$f->{'server'}", "$f->{'port'}")); push(@cols, $f->{'type'} == 2 ? "POP3" : "IMAP"); push(@cols, undef); } elsif ($f->{'type'} == 5) { # Show number of sub-folders and total size push(@cols, &text('folders_num', scalar(@{$f->{'subfolders'}}), &mailbox_folder_size($f, 1))); push(@cols, $text{'folders_comp'}); push(@cols, &nice_size(&folder_size($f))); } elsif ($f->{'type'} == 6) { # Show number of messages push(@cols, &text('folders_vnum', &mailbox_folder_size($f, 1))); push(@cols, $text{'folders_virt'}); push(@cols, undef); } else { # Show folder directory and size local $mf = &folder_file($f); push(@cols, $mf); push(@cols, $f->{'type'} == 1 ? $text{'folders_maildir'} : $f->{'type'} == 3 ? $text{'folders_mhdir'} : $text{'folders_mbox'}); push(@cols, &nice_size(&folder_size($f))); } # Action links local @acts; push(@acts, "". "$text{'folders_view'}"); if (!$f->{'nowrite'}) { local ($is, $ie); $auto = &get_auto_schedule($f); if ($auto && $auto->{'enabled'}) { ($is, $ie) = ("", ""); } push(@acts, $is."". "$text{'folders_auto'}".$ie); } push(@acts, "". "$text{'folders_copy'}"); push(@cols, join(" | ", @acts)); if ($deletable) { print &ui_checked_columns_row(\@cols, \@tds, "d", $f->{'index'}); } else { print &ui_columns_row([ "", @cols ], \@tds); } } print &ui_columns_end(); print &ui_form_end([ [ "delete", $text{'folders_delete'} ] ]); # Show form for adding a folder print &ui_form_start("newfolder.cgi"); @folder_progs = ( [ "edit_folder.cgi?new=1&mode=0", "local" ], [ "edit_folder.cgi?new=1&mode=1", "ext" ], [ "edit_pop3.cgi?new=1", "pop3" ], [ "edit_imap.cgi?new=1", "imap" ], [ "edit_comp.cgi?new=1", "comp" ], [ "edit_virt.cgi?new=1", "virt" ] ); @can_folder_progs = grep { $folder_types{$_->[1]} } @folder_progs; if (@can_folder_progs) { print &ui_submit($text{'folders_newfolder'}),"\n"; print &ui_select("prog", $can_folder_progs[0]->[0], [ map { [ $_->[0], $text{'folders_type_'.$_->[1]} ] } @can_folder_progs ]),"\n"; print "
    \n"; } print &ui_form_end(); &ui_print_footer("", $text{'index'}); mailbox/mail_search.cgi0100775000567100000000000001054610432264575015024 0ustar jcameronroot#!/usr/local/bin/perl # mail_search.cgi # Find mail messages matching some pattern require './mailbox-lib.pl'; &ReadParse(); $limit = { }; if (!$in{'status_def'} && defined($in{'status'})) { $statusmsg = &text('search_withstatus', $text{'view_mark'.$in{'status'}}); } if ($in{'simple'}) { # Make sure a search was entered $in{'search'} || &error($text{'search_ematch'}); if ($userconfig{'search_latest'}) { $limit->{'latest'} = $userconfig{'search_latest'}; } } elsif ($in{'spam'}) { # Make sure a spam score was entered $in{'score'} =~ /^\d+$/ || &error($text{'search_escore'}); } else { # Validate search fields for($i=0; defined($in{"field_$i"}); $i++) { if ($in{"field_$i"}) { $in{"what_$i"} || &error(&text('search_ewhat', $i+1)); $neg = $in{"neg_$i"} ? "!" : ""; push(@fields, [ $neg.$in{"field_$i"}, $in{"what_$i"} ]); } } @fields || $statusmsg || &error($text{'search_enone'}); if (!defined($in{'limit'})) { if ($userconfig{'search_latest'}) { $limit = { 'latest' => $userconfig{'search_latest'} }; } } elsif (!$in{'limit_def'}) { $in{'limit'} =~ /^\d+$/ || &error($text{'search_elatest'}); $limit->{'latest'} = $in{'limit'}; } } if ($limit && $limit->{'latest'}) { $limitmsg = &text('search_limit', $limit->{'latest'}); } @folders = &list_folders(); if ($in{'folder'} >= 0) { $folder = $folders[$in{'folder'}]; } if ($in{'simple'}) { # Just search by Subject and From (or To) in one folder ($mode, $words) = &parse_boolean($in{'search'}); local $who = $folder->{'sent'} ? 'to' : 'from'; if ($mode == 0) { # Search was like 'foo' or 'foo bar' # Can just do a single 'or' search @searchlist = map { ( [ 'subject', $_ ], [ $who, $_ ] ) } @$words; @rv = &mailbox_search_mail(\@searchlist, 0, $folder, $limit); } elsif ($mode == 1) { # Search was like 'foo and bar' # Need to do two 'and' searches and combine @searchlist1 = map { ( [ 'subject', $_ ] ) } @$words; @rv1 = &mailbox_search_mail(\@searchlist1, 1, $folder, $limit); @searchlist2 = map { ( [ $who, $_ ] ) } @$words; @rv2 = &mailbox_search_mail(\@searchlist2, 1, $folder, $limit); @rv = @rv1; %gotidx = map { $_->{'idx'}, 1 } @rv; foreach $mail (@rv2) { push(@rv, $mail) if (!$gotidx{$mail->{'idx'}}); } } else { &error($text{'search_eboolean'}); } foreach $mail (@rv) { $mail->{'folder'} = $folder; } if ($statusmsg) { @rv = &filter_by_status(\@rv, $in{'status'}); } $msg = &text('search_msg2', $in{'search'}); } elsif ($in{'spam'}) { # Search by spam score, using X-Spam-Level header $stars = "*" x $in{'score'}; @rv = &mailbox_search_mail([ [ "x-spam-level", $stars ] ], 0, $folder, $limit); foreach $mail (@rv) { $mail->{'folder'} = $folder; } $msg = &text('search_msg5', $in{'score'}); } else { # Complex search, perhaps over multiple folders! if ($in{'folder'} == -2) { @sfolders = grep { !$_->{'remote'} } @folders; $multi_folder = 1; } elsif ($in{'folder'} == -1) { @sfolders = @folders; $multi_folder = 1; } else { @sfolders = ( $folder ); } foreach $sf (@sfolders) { local @frv = &mailbox_search_mail(\@fields, $in{'and'}, $sf, $limit); foreach $mail (@frv) { $mail->{'folder'} = $sf; } push(@rv, @frv); } if ($statusmsg) { @rv = &filter_by_status(\@rv, $in{'status'}); } $msg = $text{'search_msg4'}; } $msg .= " $limitmsg" if ($limitmsg); $msg .= " $statusmsg" if ($statusmsg); # Create a virtual folder for the search results if ($in{'dest_def'} || !defined($in{'dest'})) { # Use the default search results folder ($virt) = grep { $_->{'type'} == 6 && $_->{'id'} == 1 } @folders; if (!$virt) { $virt = { 'id' => $search_folder_id, 'type' => 6, }; } $virt->{'name'} = $text{'search_title'}; } else { # Create a new virtual folder $in{'dest'} || &error($text{'search_edest'}); $virt = { 'type' => 6, 'name' => $in{'dest'} }; } $virt->{'delete'} = 1; $virt->{'members'} = [ map { [ $_->{'folder'}, $_->{'idx'}, $_->{'header'}->{'message-id'} ] } @rv ]; $virt->{'msg'} = $msg; if ($folder) { # Use same From/To display mode as original folder $virt->{'show_to'} = $folder->{'show_to'}; $virt->{'show_from'} = $folder->{'show_from'}; } else { # Use default From/To mode delete($virt->{'show_to'}); delete($virt->{'show_from'}); } &delete_sort_index($virt); &save_folder($virt, $virt); # Redirect to it &redirect("index.cgi?id=$virt->{'id'}"); &pop3_logout_all(); mailbox/mailbox-lib.pl0100664000567100000000000013450610446630145014620 0ustar jcameronroot# mailbox-lib.pl # XXX don't reply-to our address # # XXX folder sorting # XXX what about imap/pop3 # XXX update mailboxes module too # XXX mailbox_list_mails should call mailbox_select_mails for type 6 # # XXX mid in links # XXX display should use sort index # XXX folder list doens't need to really count virtual folder size # (or it should be faster!) # XXX highlight checked mails with CSS? # XXX update as many other Webmin / Usermin modules as possible # XXX include in new theme # # XXX return to mail list after sending (preference) do '../web-lib.pl'; &init_config(); require '../ui-lib.pl'; &switch_to_remote_user(); &create_user_config_dirs(); do 'boxes-lib.pl'; do 'folders-lib.pl'; if ($config{'mail_qmail'}) { $qmail_maildir = &mail_file_style($remote_user, $config{'mail_qmail'}, $config{'mail_style'}); } else { $qmail_maildir = "$remote_user_info[7]/$config{'mail_dir_qmail'}"; } $address_book = "$user_module_config_directory/address_book"; $address_group_book = "$user_module_config_directory/address_group_book"; $folders_dir = "$remote_user_info[7]/$userconfig{'mailbox_dir'}"; %folder_types = map { $_, 1 } (split(/,/, $config{'folder_types'}), split(/,/, $config{'folder_virts'})); $search_folder_id = 1; $auto_cmd = "$user_module_config_directory/auto.pl"; # mailbox_file() sub mailbox_file { if ($config{'mail_system'} == 0) { return &user_mail_file(@remote_user_info); } else { return "$qmail_maildir/"; } } # decrypt_attachments(&mail) # If the attachments on a mail are encrypted, converts them into unencrypted # form. Returns a code and message, valid codes being: 0 = not encrypted, # 1 = encrypted but cannot decrypt, 2 = failed to decrypt, 3 = decrypted OK sub decrypt_attachments { # Check requirements for decryption local $first = $_[0]->{'attach'}->[0]; local ($body) = grep { $_->{'type'} eq 'text/plain' || $_->{'type'} eq 'text' } @{$_[0]->{'attach'}}; local $hasgpg = &has_command("gpg") && &foreign_check("gnupg"); if ($_[0]->{'header'}->{'content-type'} =~ /^multipart\/encrypted/ && $first->{'type'} =~ /^application\/pgp-encrypted/ && $first->{'data'} =~ /Version:\s+1/i) { # RFC 2015 PGP encryption of entire message return (1) if (!$hasgpg); &foreign_require("gnupg", "gnupg-lib.pl"); local $plain; local $enc = $_[0]->{'attach'}->[1]; local $rv = &foreign_call("gnupg", "decrypt_data", $enc->{'data'}, \$plain); return (2, $rv) if ($rv); $plain =~ s/\r//g; local $amail = &extract_mail($plain); &parse_mail($amail); $_[0]->{'attach'} = $amail->{'attach'}; return (3); } # Check individual attachments for text-only encryption local $a; local $cc = 0; local $ok = 3; foreach $a (@{$_[0]->{'attach'}}) { if ($a->{'type'} =~ /^(text|application\/pgp-encrypted)/i && $a->{'data'} =~ /BEGIN PGP MESSAGE/ && $a->{'data'} =~ /([\000-\377]*)(-----BEGIN PGP MESSAGE-+\n([\000-\377]+)-+END PGP MESSAGE-+\n)([\000-\377]*)/i) { local ($before, $enc, $after) = ($1, $2, $4); return (1) if (!$hasgpg); &foreign_require("gnupg", "gnupg-lib.pl"); $cc++; local $pass = &foreign_call("gnupg", "get_passphrase"); local $plain; local $rv = &foreign_call("gnupg", "decrypt_data", $enc, \$plain, $pass); return (2, $rv) if ($rv); $ok = 4 if ($before =~ /\S/ || $after =~ /\S/); if ($a->{'type'} !~ /^text/) { $a->{'type'} = "text/plain"; } $a->{'data'} = $before.$plain.$after; } } return $cc ? ( $ok ) : ( 0 ); } # list_addresses() # Returns a list of address book entries, each an array reference containing # the email address, real name, index (if editable) and From: flag sub list_addresses { local @rv; local $i = 0; open(ADDRESS, $address_book); while(
    ) { s/\r|\n//g; local @sp = split(/\t/, $_); if (@sp >= 1) { push(@rv, [ $sp[0], $sp[1], $i, $sp[2] ]); } $i++; } close(ADDRESS); if ($config{'global_address'}) { local $gab = &group_subs($config{'global_address'}); open(ADDRESS, $gab); while(
    ) { s/\r|\n//g; local @sp = split(/\t+/, $_); if (@sp >= 2) { push(@rv, [ $sp[0], $sp[1] ]); } } close(ADDRESS); } if ($userconfig{'sort_addrs'} == 2) { return sort { lc($a->[0]) cmp lc($b->[0]) } @rv; } elsif ($userconfig{'sort_addrs'} == 1) { return sort { lc($a->[1]) cmp lc($b->[1]) } @rv; } else { return @rv; } } # create_address(email, real name, forfrom) # Adds an entry to the address book sub create_address { &open_tempfile(ADDRESS, ">>$address_book"); &print_tempfile(ADDRESS, "$_[0]\t$_[1]\t$_[2]\n"); &close_tempfile(ADDRESS); } # modify_address(index, email, real name, forfrom) # Updates some entry in the address book sub modify_address { &replace_file_line($address_book, $_[0], "$_[1]\t$_[2]\t$_[3]\n"); } # delete_address(index) # Deletes some entry from the address book sub delete_address { &replace_file_line($address_book, $_[0]); } # address_button(field, [form], [frommode], [realfield], [nogroups]) # Returns HTML for an address-book popup button sub address_button { local $form = @_ > 1 ? $_[1] : 0; local $mode = @_ > 2 ? $_[2] : 0; local $nogroups = @_ > 4 ? $_[4] : 0; local ($rfield1, $rfield2); if ($_[3]) { return "\n"; } else { return "\n"; } } # list_folders() # Returns a list of all folders for this user # folder types: 0 = mbox, 1 = maildir, 2 = pop3, 3 = mh, 4 = imap, 5 = combined, # 6 = virtual # folder modes: 0 = ~/mail, 1 = external folder, 2 = sent mail, # 3 = inbox/drafts/trash sub list_folders { local (@rv, $f, $o, %done); if ($config{'mail_system'} == 2) { # POP3 inbox push(@rv, { 'name' => $text{'folder_inbox'}, 'type' => 2, 'server' => $config{'pop3_server'} || "localhost", 'mode' => 3, 'remote' => 1, 'nowrite' => 1, 'inbox' => 1, 'index' => 0 }); &read_file("$user_module_config_directory/inbox.pop3", $rv[$#rv]); } elsif ($config{'mail_system'} == 4) { # IMAP inbox push(@rv, { 'name' => $text{'folder_inbox'}, 'type' => 4, 'server' => $config{'pop3_server'} || "localhost", 'mode' => 3, 'remote' => 1, 'inbox' => 1, 'index' => 0 }); &read_file("$user_module_config_directory/inbox.imap", $rv[$#rv]); } else { # Local mail file inbox push(@rv, { 'name' => $text{'folder_inbox'}, 'type' => $config{'mail_system'}, 'mode' => 3, 'inbox' => 1, 'file' => $config{'mail_system'} == 0 ? &user_mail_file(@remote_user_info) : $qmail_maildir, 'index' => 0 }); $done{$rv[$#rv]->{'file'}}++; } local $inbox = $rv[$#rv]; # Add sent mail file local $sf; if ($folder_types{'ext'} && $userconfig{'sent_mail'}) { $sf = $userconfig{'sent_mail'}; $done{$userconfig{'sent_mail'}}++; } else { $sf = "$folders_dir/sentmail"; } $done{"$folders_dir/sentmail"}++; push(@rv, { 'name' => $text{'folder_sent'}, 'type' => &folder_type($sf), 'file' => $sf, 'perpage' => $userconfig{'perpage_sent_mail'}, 'fromaddr' => $userconfig{'fromaddr_sent_mail'}, 'hide' => $userconfig{'hide_sent_mail'}, 'mode' => 2, 'sent' => 1, 'index' => scalar(@rv) }); # Add drafts file local $df = -r "$folders_dir/Drafts" ? "$folders_dir/Drafts" : -r "$folders_dir/.Drafts" ? "$folders_dir/.Drafts" : -r "$folders_dir/.drafts" ? "$folders_dir/.drafts" : "$folders_dir/drafts"; $done{$df}++; push(@rv, { 'name' => $text{'folder_drafts'}, 'type' => &folder_type($df), 'file' => $df, 'mode' => 3, 'drafts' => 1, 'index' => scalar(@rv) }); # If using a trash folder, add it if ($userconfig{'delete_mode'} == 1) { local $tf = "$folders_dir/trash"; $done{$tf}++; push(@rv, { 'name' => $text{'folder_trash'}, 'type' => &folder_type($df), 'file' => $tf, 'mode' => 3, 'trash' => 1, 'index' => scalar(@rv) }); } # Add local folders, usually under ~/mail if ($folder_types{'local'}) { foreach $p (&recursive_files($folders_dir, $userconfig{'mailbox_recur'})) { local $f = $p; $f =~ s/^\Q$folders_dir\E\///; local $name = $f; if ($folders_dir eq "$remote_user_info[7]/Maildir") { # A sub-folder under Maildir .. remove the . at the # start of the sub-folder name $name =~ s/^\.// || $name =~ s/\/\./\// || next; # When in Maildir++ mode, any non-subdirectory # is ignored next if (!-d $p); } push(@rv, { 'name' => $name, 'file' => $p, 'type' => &folder_type($p), 'perpage' => $userconfig{"perpage_$f"}, 'fromaddr' => $userconfig{"fromaddr_$f"}, 'sent' => $userconfig{"sent_$f"}, 'hide' => $userconfig{"hide_$f"}, 'mode' => 0, 'index' => scalar(@rv) } ) if (!$done{$p}); $done{$p}++; } } # Add sub-folders in ~/Maildir/ , as used by Courier if ($inbox->{'type'} == 1) { foreach $p (&recursive_files($inbox->{'file'}, 0)) { local $f = $p; $f =~ s/^\Q$inbox->{'file'}\E\///; local $name = $f; $name =~ s/^\.// || $name =~ s/\/\./\//; push(@rv, { 'name' => "$name (Courier)", 'file' => $p, 'type' => &folder_type($p), 'perpage' => $userconfig{"perpage_$f"}, 'fromaddr' => $userconfig{"fromaddr_$f"}, 'sent' => $userconfig{"sent_$f"}, 'hide' => $userconfig{"hide_$f"}, 'mode' => 0, 'index' => scalar(@rv) } ) if (!$done{$p}); $done{$p}++; } } # Add user-defined external mail file folders if ($folder_types{'ext'}) { foreach $o (split(/\t+/, $userconfig{'mailboxes'})) { $o =~ /\/([^\/]+)$/ || next; push(@rv, { 'name' => $userconfig{"folder_$o"} || $1, 'file' => $o, 'perpage' => $userconfig{"perpage_$o"}, 'fromaddr' => $userconfig{"fromaddr_$o"}, 'sent' => $userconfig{"sent_$o"}, 'hide' => $userconfig{"hide_$o"}, 'type' => &folder_type($o), 'mode' => 1, 'index' => scalar(@rv) } ) if (!$done{$o}); $done{$o}++; } } # Add user-defined POP3 and IMAP folders opendir(DIR, $user_module_config_directory); foreach $f (readdir(DIR)) { if ($f =~ /^(\d+)\.pop3$/ && $folder_types{'pop3'}) { local %pop3 = ( 'id' => $1 ); &read_file("$user_module_config_directory/$f", \%pop3); $pop3{'type'} = 2; $pop3{'mode'} = 0; $pop3{'remote'} = 1; $pop3{'nowrite'} = 1; $pop3{'index'} = scalar(@rv); push(@rv, \%pop3); } elsif ($f =~ /^(\d+)\.imap$/ && $folder_types{'imap'}) { local %imap = ( 'id' => $1 ); &read_file("$user_module_config_directory/$f", \%imap); $imap{'type'} = 4; $imap{'mode'} = 0; $imap{'remote'} = 1; $imap{'index'} = scalar(@rv); push(@rv, \%imap); } } closedir(DIR); # Add user-defined composite folders local %fcache; opendir(DIR, $user_module_config_directory); foreach $f (readdir(DIR)) { if ($f =~ /^(\d+)\.comp$/) { local %comp = ( 'id' => $1 ); &read_file("$user_module_config_directory/$f", \%comp); $comp{'folderfile'} = "$user_module_config_directory/$f"; $comp{'type'} = 5; $comp{'mode'} = 0; $comp{'index'} = scalar(@rv); local $sfn; foreach $sfn (split(/\t+/, $comp{'subfoldernames'})) { local $sf = &find_named_folder($sfn, \@rv, \%fcache); push(@{$comp{'subfolders'}}, $sf) if ($sf); } push(@rv, \%comp); } } closedir(DIR); # Add virtual folders opendir(DIR, $user_module_config_directory); foreach $f (readdir(DIR)) { if ($f =~ /^(\d+)\.virt$/) { local %virt = ( 'id' => $1 ); &read_file("$user_module_config_directory/$f", \%virt); $virt{'folderfile'} = "$user_module_config_directory/$f"; $virt{'type'} = 6; $virt{'mode'} = 0; $virt{'index'} = scalar(@rv); $virt{'noadd'} = 1; $virt{'members'} = [ ]; local $k; foreach $k (keys %virt) { next if ($k !~ /^\d+$/); local ($idx, $sfn, $mid) = split(/\s+/, $virt{$k}, 3); local $sf = &find_named_folder($sfn, \@rv, \%fcache); $virt{'members'}->[$k] = [ $sf, $idx, $mid ] if ($sf); delete($virt{$k}); } push(@rv, \%virt); } } closedir(DIR); # Mark folders are using Notes mail encoding foreach $f (@rv) { if ($f->{'file'} && $userconfig{"notes_".$f->{'file'}}) { $f->{'notes_decode'} = 1; } } # Work out last-modified time of all folders, and set sortable flag &set_folder_lastmodified(\@rv); # Set searchable flag foreach my $f (@rv) { $f->{'searchable'} = 1 if ($f->{'type'} != 6 || $f->{'id'} != $search_folder_id); } # Set show to/from flags foreach my $f (@rv) { if (!defined($f->{'show_to'})) { $f->{'show_to'} = $f->{'sent'} || $f->{'drafts'} || $userconfig{'show_to'}; } if (!defined($f->{'show_from'})) { $f->{'show_from'} = !($f->{'sent'} || $f->{'drafts'}) || $userconfig{'show_to'}; } } # Work out which one is the spam folder if (&foreign_check("spam")) { local %suserconfig = &foreign_config("spam", 1); local $file = $suserconfig{'spam_file'}; $file =~ s/\.$//; $file =~ s/\/$//; $file = "$remote_user_info[7]/$file" if ($file !~ /^\//); $file =~ s/\~/$remote_user_info[7]/; local ($sf) = grep { $_->{'file'} eq $file } @rv; if ($sf) { $sf->{'spam'} = 1; } } return @rv; } # save_folder(&folder, [&old]) # Creates or updates a folder sub save_folder { local ($folder, $old) = @_; mkdir($folders_dir, 0700) if (!-d $folders_dir); if ($folder->{'type'} == 2) { # A POP3 folder $folder->{'id'} ||= time(); local %pop3; foreach $k (keys %$folder) { if ($k ne "type" && $k ne "mode" && $k ne "remote" && $k ne "nowrite" && $k ne "index") { $pop3{$k} = $folder->{$k}; } } &write_file("$user_module_config_directory/$folder->{'id'}.pop3", \%pop3); chmod(0700, "$user_module_config_directory/$folder->{'id'}.pop3"); } elsif ($folder->{'type'} == 4) { # An IMAP folder $folder->{'id'} ||= time(); local %imap; foreach $k (keys %$folder) { if ($k ne "type" && $k ne "mode" && $k ne "remote" && $k ne "nowrite" && $k ne "index") { $imap{$k} = $folder->{$k}; } } &write_file("$user_module_config_directory/$folder->{'id'}.imap", \%imap); chmod(0700, "$user_module_config_directory/$folder->{'id'}.imap"); } elsif ($folder->{'type'} == 5) { # A composite $folder->{'id'} ||= time(); local %comp; foreach $k (keys %$folder) { if ($k ne "type" && $k ne "mode" && $k ne "index" && $k ne "subfolders") { $comp{$k} = $folder->{$k}; } } local ($sf, @sfns); foreach $sf (@{$folder->{'subfolders'}}) { local $sfn = &folder_name($sf); push(@sfns, $sfn); } $comp{'subfoldernames'} = join("\t", @sfns); &write_file("$user_module_config_directory/$folder->{'id'}.comp", \%comp); chmod(0700, "$user_module_config_directory/$folder->{'id'}.comp"); &delete_sort_index($folder); } elsif ($folder->{'type'} == 6) { # A virtual folder $folder->{'id'} ||= time(); local %virt; foreach $k (keys %$folder) { if ($k ne "type" && $k ne "mode" && $k ne "index" && $k ne "members") { $virt{$k} = $folder->{$k}; } } local $i; local $mems = $folder->{'members'}; for($i=0; $i<@$mems; $i++) { $virt{$i} = $mems->[$i]->[1]." ". &folder_name($mems->[$i]->[0])." ". $mems->[$i]->[2]; } &write_file("$user_module_config_directory/$folder->{'id'}.virt", \%virt); chmod(0700, "$user_module_config_directory/$folder->{'id'}.virt"); &delete_sort_index($folder); } elsif ($folder->{'mode'} == 0) { # Updating a folder in ~/mail .. need to manage file, and config options local $path = "$folders_dir/$folder->{'name'}"; if ($folders_dir eq "$remote_user_info[7]/Maildir") { # Maildir sub-folder .. put a . in the name $path =~ s/([^\/]+)$/.$1/; } if ($folder->{'name'} =~ /\//) { local $pp = $path; $pp =~ s/\/[^\/]+$//; system("mkdir -p ".quotemeta($pp)); } if (!$old) { # Create the mailbox/maildir/MH dir if ($folder->{'type'} == 0) { open(FOLDER, ">>$path"); close(FOLDER); chmod(0700, $path); } elsif ($folder->{'type'} == 1) { mkdir($path, 0700); mkdir("$path/cur", 0700); mkdir("$path/new", 0700); mkdir("$path/tmp", 0700); } elsif ($folder->{'type'} == 3) { mkdir($path, 0700); } } elsif ($old->{'name'} ne $folder->{'name'}) { # Just rename rename($old->{'file'}, $path); } if ($old) { delete($userconfig{'perpage_'.$old->{'name'}}); delete($userconfig{'sent_'.$old->{'name'}}); delete($userconfig{'hide_'.$old->{'name'}}); delete($userconfig{'fromaddr_'.$old->{'name'}}); } $userconfig{'perpage_'.$folder->{'name'}} = $folder->{'perpage'} if ($folder->{'perpage'}); $userconfig{'sent_'.$folder->{'name'}} = $folder->{'sent'} if ($folder->{'sent'}); $userconfig{'hide_'.$folder->{'name'}} = $folder->{'hide'} if ($folder->{'hide'}); $userconfig{'fromaddr_'.$folder->{'name'}} = $folder->{'fromaddr'} if ($folder->{'fromaddr'}); &save_user_module_config(); } elsif ($folder->{'mode'} == 1) { # Updating or adding an external file folder local @mailboxes = split(/\t+/, $userconfig{'mailboxes'}); if (!$old) { push(@mailboxes, $folder->{'file'}); } else { delete($userconfig{'folder_'.$folder->{'file'}}); delete($userconfig{'perpage_'.$folder->{'file'}}); delete($userconfig{'sent_'.$folder->{'file'}}); delete($userconfig{'hide_'.$folder->{'file'}}); delete($userconfig{'fromaddr_'.$folder->{'file'}}); local $idx = &indexof($folder->{'file'}, @mailboxes); $mailboxes[$idx] = $folder->{'file'}; } $userconfig{'folder_'.$folder->{'file'}} = $folder->{'name'}; $userconfig{'perpage_'.$folder->{'file'}} = $folder->{'perpage'} if ($folder->{'perpage'}); $userconfig{'sent_'.$folder->{'file'}} = $folder->{'sent'}; $userconfig{'hide_'.$folder->{'file'}} = $folder->{'hide'} if ($folder->{'hide'}); $userconfig{'fromaddr_'.$folder->{'file'}} = $folder->{'fromaddr'} if ($folder->{'fromaddr'}); $userconfig{'mailboxes'} = join("\t", @mailboxes); &save_user_module_config(); } elsif ($folder->{'mode'} == 2) { # The sent mail folder delete($userconfig{'perpage_sent_mail'}); delete($userconfig{'hide_sent_mail'}); delete($userconfig{'fromaddr_sent_mail'}); local $sf = "$folders_dir/sentmail"; if ($folder->{'file'} eq $sf) { delete($userconfig{'sent_mail'}); } else { $userconfig{'sent_mail'} = $folder->{'file'}; } $userconfig{'perpage_sent_mail'} = $folder->{'perpage'} if ($folder->{'perpage'}); $userconfig{'hide_sent_mail'} = $folder->{'hide'} if ($folder->{'hide'}); $userconfig{'fromaddr_sent_mail'} = $folder->{'fromaddr'} if ($folder->{'fromaddr'}); &save_user_module_config(); } } # delete_folder(&folder) # Removes some folder sub delete_folder { local ($folder) = @_; if ($folder->{'type'} == 2) { # A POP3 folder unlink("$user_module_config_directory/$folder->{'id'}.pop3"); system("rm -rf $user_module_config_directory/$folder->{'id'}.cache"); } elsif ($folder->{'type'} == 4) { # An IMAP folder unlink("$user_module_config_directory/$folder->{'id'}.imap"); system("rm -rf $user_module_config_directory/$folder->{'id'}.cache"); } elsif ($folder->{'type'} == 5) { # A composite folder unlink("$user_module_config_directory/$folder->{'id'}.comp"); } elsif ($folder->{'type'} == 6) { # A virtual folder unlink("$user_module_config_directory/$folder->{'id'}.virt"); } elsif ($folder->{'mode'} == 0) { # Deleting a folder within ~/mail if ($folder->{'type'} == 0) { unlink($folder->{'file'}); } else { system("rm -rf ".quotemeta($folder->{'file'})); } delete($userconfig{'perpage_'.$folder->{'name'}}); delete($userconfig{'sent_'.$folder->{'name'}}); delete($userconfig{'hide_'.$folder->{'name'}}); delete($userconfig{'fromaddr_'.$folder->{'name'}}); &save_user_module_config(); } elsif ($folder->{'mode'} == 1) { # Remove from list of external folders local @mailboxes = split(/\t+/, $userconfig{'mailboxes'}); @mailboxes = grep { $_ ne $folder->{'file'} } @mailboxes; delete($userconfig{'folder_'.$folder->{'file'}}); delete($userconfig{'perpage_'.$folder->{'file'}}); delete($userconfig{'sent_'.$folder->{'file'}}); delete($userconfig{'hide_'.$folder->{'file'}}); delete($userconfig{'fromaddr_'.$folder->{'file'}}); $userconfig{'mailboxes'} = join("\t", @mailboxes); &save_user_module_config(); } } # notes_decode(&mail, &folder) # Given a message forwarded by lotus notes, extra the real from and subject # lines from the body sub notes_decode { return if (!$_[1]->{'notes_decode'}); local ($from, $subject, $h); if ($_[0]->{'body'} =~ /(^|Content-type:.*)\n\s*\nFrom: +(.*)/) { $from = $2; } elsif ($_[0]->{'body'} =~ /(^|Content-type:.*)\n\s*\n(\([^\)]+\)\s*)?(\S.*)/) { $from = $3; } $from =~ s/\s+on.*//; $from =~ s/\d+\/\d+\/\d+\s+\d+:\d+\s*//; $from = undef if ($from =~ /:/); if ($_[0]->{'body'} =~ /\nSubject: +(.*)/) { $subject = $1; } local ($ofrom) = &address_parts($_[0]->{'header'}->{'from'}); if ($from && $from !~ /\@\S+\.\S+/) { $from = "\"$from\" <$ofrom>"; } foreach $h ([ 'From', $from ], [ 'Subject', $subject ]) { next if (!$h->[1]); local ($eh) = grep { lc($_->[0]) eq lc($h->[0]) } @{$_[0]->{'headers'}}; if ($eh) { $eh->[1] = $h->[1]; } else { push(@{$_[0]->{'headers'}}, $h); } $_[0]->{'header'}->{lc($h->[0])} = $h->[1]; } } # need_delete_warn(&folder) sub need_delete_warn { return 0 if ($_[0]->{'type'} == 6 && !$_[0]->{'delete'}); return 1 if ($userconfig{'delete_warn'} eq 'y'); return 0 if ($userconfig{'delete_warn'} eq 'n'); local $mf; return $_[0]->{'type'} == 0 && ($mf = &folder_file($_[0])) && &disk_usage_kb($mf)*1024 > $userconfig{'delete_warn'}; } # get_signature() # Returns the users signature, if any sub get_signature { local $sf = &get_signature_file(); $sf || return undef; local $sig; open(SIG, $sf) || return undef; while() { $sig .= $_; } close(SIG); return $sig; } # get_signature_file() # Returns the full path to the file that should contain the user's signature, # or undef if none is defined sub get_signature_file { return undef if ($userconfig{'sig_file'} eq '*'); local $sf = $userconfig{'sig_file'}; $sf = "$remote_user_info[7]/$sf" if ($sf !~ /^\//); return &group_subs($sf); } # movecopy_select(number, &folders, &folder-to-exclude, copy-only) # Returns HTML for selecting a folder to move or copy to sub movecopy_select { local $rv; if (!$_[3]) { $rv .=""; } $rv .= ""; local @mfolders = grep { $_ ne $_[2] && !$_->{'nowrite'} } @{$_[1]}; $rv .= &folder_select(\@mfolders, undef, "mfolder$_[0]"); return $rv; } # show_folder_options(&folder, mode) # Print HTML for editing the options for some folder sub show_folder_options { print " $text{'edit_perpage'}\n"; printf " %s\n", $_[0]->{'perpage'} ? "" : "checked", $text{'default'}; printf " %s\n", $_[0]->{'perpage'} ? "checked" : ""; printf " \n", $_[0]->{'perpage'}; if ($_[1] != 2) { print " $text{'edit_sentview'}\n"; printf " %s\n", $_[0]->{'sent'} ? "checked" : "", $text{'yes'}; printf " %s \n", $_[0]->{'sent'} ? "" : "checked", $text{'no'}; } print " $text{'edit_fromaddr'}\n"; printf " %s\n", $_[0]->{'fromaddr'} ? "" : "checked", $text{'default'}; printf " %s\n", $_[0]->{'fromaddr'} ? "checked" : ""; printf " %s \n", $_[0]->{'fromaddr'}, &address_button("fromaddr", 0, 1); print " $text{'edit_hide'}\n"; print "",&ui_yesno_radio("hide", int($_[0]->{'hide'}))," \n"; } # parse_folder_options(&folder, mode, &in) sub parse_folder_options { local ($folder, $mode, $in) = @_; if (!$in->{'perpage_def'}) { $in->{'perpage'} =~ /^\d+$/ || &error($text{'save_eperpage'}); $folder->{'perpage'} = $in->{'perpage'}; } else { delete($folder->{'perpage'}); } if ($mode != 2) { $folder->{'sent'} = $in->{'sent'}; } if (!$in->{'fromaddr_def'}) { $in->{'fromaddr'} =~ /\S/ || &error($text{'save_efromaddr'}); $folder->{'fromaddr'} = $in->{'fromaddr'}; } $folder->{'hide'} = $in->{'hide'}; } # list_address_groups() # Returns a list of address book entries, each an array reference containing # the group name, members and index sub list_address_groups { local @rv; local $i = 0; open(ADDRESS, $address_group_book); while(
    ) { s/\r|\n//g; local @sp = split(/\t+/, $_); if (@sp == 2) { push(@rv, [ $sp[0], $sp[1], $i ]); } $i++; } close(ADDRESS); if ($config{'global_address_group'}) { local $gab = &group_subs($config{'global_address_group'}); open(ADDRESS, $gab); while(
    ) { s/\r|\n//g; local @sp = split(/\t+/, $_); if (@sp == 2) { push(@rv, [ $sp[0], $sp[1] ]); } } close(ADDRESS); } if ($userconfig{'sort_addrs'} == 1) { return sort { lc($a->[0]) cmp lc($b->[0]) } @rv; } elsif ($userconfig{'sort_addrs'} == 2) { return sort { lc($a->[1]) cmp lc($b->[1]) } @rv; } else { return @rv; } } # create_address_group(name, members) # Adds an entry to the address group book sub create_address_group { &open_tempfile(ADDRESS, ">>$address_group_book"); &print_tempfile(ADDRESS, "$_[0]\t$_[1]\n"); &close_tempfile(ADDRESS); } # modify_address_group(index, name, members) # Updates some entry in the address group book sub modify_address_group { &replace_file_line($address_group_book, $_[0], "$_[1]\t$_[2]\n"); } # delete_address_group(index) # Deletes some entry from the address group book sub delete_address_group { &replace_file_line($address_group_book, $_[0]); } # list_folders_sorted() # Like list_folders(), but applies the chosen sort sub list_folders_sorted { local @folders = &list_folders(); if ($userconfig{'folder_sort'} == 0) { local @builtin = grep { $_->{'mode'} >= 2 } @folders; local @local = grep { $_->{'mode'} == 0 } @folders; local @external = grep { $_->{'mode'} == 1 } @folders; return (@builtin, (sort { lc($a->{'name'}) cmp lc($b->{'name'}) } @local), (sort { lc($a->{'name'}) cmp lc($b->{'name'}) } @external)); } elsif ($userconfig{'folder_sort'} == 1) { local @builtin = grep { $_->{'mode'} >= 2 } @folders; local @extra = grep { $_->{'mode'} < 2 } @folders; return (@builtin, sort { lc($a->{'name'}) cmp lc($b->{'name'}) } @extra); } elsif ($userconfig{'folder_sort'} == 2) { return sort { lc($a->{'name'}) cmp lc($b->{'name'}) } @folders; } } # group_subs(filename) # Replaces $group in a filename with the first valid primary or secondary # that matches a file sub group_subs { local @ginfo = getgrgid($remote_user_info[3]); local $rv = $_[0]; $rv =~ s/\$group/$ginfo[0]/g; if ($rv =~ /\$sgroup/) { # Try all secondary groups, and stop at the first one setgrent(); while(@ginfo = getgrent()) { local @m = split(/\s+/, $ginfo[3]); if (&indexof($remote_user, @m) >= 0) { local $rv2 = $rv; $rv2 =~ s/\$sgroup/$ginfo[0]/g; if (-r $rv2) { $rv = $rv2; last; } } } endgrent() if ($gconfig{'os_type'} ne 'hpux'); } return $rv; } # set_module_index(folder-num) sub set_module_index { $module_index_link = "/$module_name/index.cgi?folder=$_[0]&start=$in{'start'}"; $module_index_name = $text{'mail_indexlink'}; } # check_modification(&folder) # Display an error message if a folder has been modified since the time # in $in{'mod'} sub check_modification { local $newmod = &modification_time($_[0]); if ($in{'mod'} && $in{'mod'} != $newmod && $userconfig{'check_mod'}) { # Changed! &error(&text('emodified', "index.cgi?folder=$_[0]->{'index'}")); } } # list_from_addresses() # Returns a list of allowed From: addresses for the current user sub list_from_addresses { local $http_host = $ENV{'HTTP_HOST'}; $http_host =~ s/:\d+$//; if (&check_ipaddress($http_host)) { # Try to reverse-lookup IP local $rev = gethostbyaddr(inet_aton($acptip), AF_INET); $http_host = $rev if ($rev); } $http_host =~ s/^(www|ftp|mail)\.//; local @froms; if ($config{'server_name'} eq 'ldap') { # Special mode - the From: addresses just come from LDAP local $entry = &get_user_ldap(); push(@froms, $entry->get_value("mail")); push(@froms, $entry->get_value("mailAlternateAddress")); } elsif ($remote_user =~ /\@/) { # From: address comes from username, which has an @ in it @froms = ( $remote_user ); } else { # Work out From: addresses from hostname local $hostname = $config{'server_name'} eq '*' ? $http_host : $config{'server_name'} eq '' ? &get_system_hostname() : $config{'server_name'}; local @doms = split(/\s+/, $hostname); local $ru = $remote_user; $ru =~ s/\.\Q$http_host\E$//; if ($http_host =~ /^([^\.]+)/) { $ru =~ s/\.\Q$1\E//; } @froms = map { $ru.'@'.$_ } @doms; } local @mfroms; if ($config{'from_map'}) { open(MAP, $config{'from_map'}); while() { s/\r|\n//g; s/#.*$//; if (/^\s*(\S+)\s+(\S+)/ && ($1 eq $remote_user || &indexof($1, @froms) >= 0) && $config{'from_format'} == 0) { # Username on LHS matches push(@mfroms, $2); } elsif (/^\s*(\S+)\s+(\S+)/ && ($2 eq $remote_user || &indexof($2, @froms) >= 0) && $config{'from_format'} == 1) { # Username on RHS matches push(@mfroms, $1); } } close(MAP); } @froms = @mfroms if (@mfroms > 0); local $ureal = $remote_user_info[6]; $ureal =~ s/,.*$//; foreach $f (@froms) { $f = "\"$ureal\" <$f>" if ($ureal && $userconfig{'real_name'}); } return (\@froms, \@doms); } # update_delivery_notification(&mail, &folder) # If the given mail is a DSN, update the original email so we know it has # been read sub update_delivery_notification { local ($mail, $folder) = @_; return 0 if ($mail->{'header'}->{'content-type'} !~ /multipart\/report/i); local $mid = $mail->{'header'}->{'message-id'}; &open_dsn_hash(); if ($dsnreplies{$mid} || $delreplies{$mid}) { # We have already done this DSN return 0; } if (!defined($mail->{'body'}) && !$mail->{'parsed'} && defined($mail->{'idx'})) { # This message has no body, perhaps because one wasn't fetched .. local @mail = &mailbox_list_mails($mail->{'idx'}, $mail->{'idx'}, $folder); $mail = $mail[$mail->{'idx'}]; } $dsnreplies{$mid} = $delreplies{$mid} = 1; # Find the delivery or disposition status attachment &parse_mail($mail); local ($dsnattach) = grep { $_->{'header'}->{'content-type'} =~ /message\/disposition-notification/i } @{$mail->{'attach'}}; local ($delattach) = grep { $_->{'header'}->{'content-type'} =~ /message\/delivery-status/i } @{$mail->{'attach'}}; if ($dsnattach) { # Update the read status for the original message if ($dsnattach->{'data'} =~ /Original-Message-ID:\s*(.*)/) { $omid = $1; } else { return 0; } local ($faddr) = &split_addresses($mail->{'header'}->{'from'}); &add_address_to_hash(\%dsnreplies, $omid, $faddr->[0]); return 1; } elsif ($delattach) { # Update the delivery status for the original message, which will be # in a separate attachment local ($origattach) = grep { $_->{'header'}->{'content-type'} =~ /text\/rfc822-headers|message\/rfc822/i } @{$mail->{'attach'}}; return 0 if (!$origattach); local $origmail = &extract_mail($origattach->{'data'}); local $omid = $origmail->{'header'}->{'message-id'}; return 0 if (!$omid); local ($faddr) = &split_addresses($origmail->{'header'}->{'from'}); local $ds = &parse_delivery_status($delattach->{'data'}); if ($ds->{'status'} =~ /^2\./) { &add_address_to_hash(\%delreplies, $omid, $faddr->[0]); } elsif ($ds->{'status'} =~ /^5\./) { &add_address_to_hash(\%delreplies, $omid, "!".$faddr->[0]); } } else { return 0; } } # add_address_to_hash(&hash, messageid, address) sub add_address_to_hash { local @cv = split(/\s+/, $_[0]->{$_[1]}); local $idx = &indexof($_[2], @cv); if ($idx < 0) { $_[0]->{$_[1]} .= " " if (@cv); $_[0]->{$_[1]} .= time()." ".$_[2]; } } # open_dsn_hash() # Ensure the %dsnreplies and %delreplies hashes are tied sub open_dsn_hash { if (!defined(%dsnreplies)) { &open_dbm_db(\%dsnreplies, "$user_module_config_directory/dsnreplies", 0600); } if (!defined(%delreplies)) { &open_dbm_db(\%delreplies, "$user_module_config_directory/delreplies", 0600); } } # open_read_hash() # Ensure the %read hash is tied sub open_read_hash { if (!defined(%read)) { &open_dbm_db(\%read, "$user_module_config_directory/read", 0600); } } # open_dbm_db(&hash, file, mode) # Attempts to open a DBM, first using SDBM_File, and then NDBM_File sub open_dbm_db { local ($hash, $file, $mode) = @_; eval "use SDBM_File"; dbmopen(%$hash, $file, $mode); eval { $hash->{'1111111111'} = 'foo bar' }; if ($@) { dbmclose(%$hash); eval "use NDBM_File"; dbmopen(%$hash, $file, $mode); } } # spam_report_cmd() # Returns a command for reporting spam, or undef if none sub spam_report_cmd { local %sconfig = &foreign_config("spam"); if ($config{'spam_report'} eq 'sa_learn') { return &has_command($sconfig{'sa_learn'}) ? "$sconfig{'sa_learn'} --spam --mbox" : undef; } elsif ($config{'spam_report'} eq 'spamassassin') { return &has_command($sconfig{'spamassassin'}) ? "$sconfig{'spamassassin'} --r" : undef; } else { return &has_command($sconfig{'sa_learn'}) ? "$sconfig{'sa_learn'} --spam --mbox" : &has_command($sconfig{'spamassassin'}) ? "$sconfig{'spamassassin'} --r" : undef; } } # ham_report_cmd() # Returns a command for reporting ham, or undef if none sub ham_report_cmd { local %sconfig = &foreign_config("spam"); return &has_command($sconfig{'sa_learn'}) ? "$sconfig{'sa_learn'} --ham --mbox" : undef; } # can_report_spam(&folder) sub can_report_spam { return (&foreign_available("spam") || $config{'spam_always'}) && &foreign_installed("spam") && !$_[0]->{'sent'} && !$_[0]->{'drafts'} && &spam_report_cmd(); } # can_report_ham(&folder) sub can_report_ham { return (&foreign_available("spam") || $config{'spam_always'}) && &foreign_installed("spam") && !$_[0]->{'sent'} && !$_[0]->{'drafts'} && &ham_report_cmd(); } # filter_by_status(&messages, status) # Returns only messages with a particular status sub filter_by_status { local %read; dbmopen(%read, "$user_module_config_directory/read", 0600); local (@rv, $mail); foreach $mail (@{$_[0]}) { local $mid = $mail->{'header'}->{'message-id'}; if ($read{$mid} == $_[1]) { push(@rv, $mail); } } dbmclose(%read); return @rv; } # message_icons(&mail, showto) # Returns a list of icon images for some mail sub message_icons { &open_dsn_hash(); &open_read_hash(); local @rv; if ($_[0]->{'header'}->{'content-type'} =~ /multipart\/\S+/i) { push(@rv, ""); } local $p = int($_[0]->{'header'}->{'x-priority'}); if ($p == 1) { push(@rv, ""); } elsif ($p == 2) { push(@rv, ""); } local $mid = $_[0]->{'header'}->{'message-id'}; if (!$_[1]) { # Show icon if special if ($read{$mid} == 2) { push(@rv, ""); } #elsif ($read{$mid} == 1) { # push(@rv, ""); # } } else { # Show icons if DSNs received if ($dsnreplies{$mid}) { push(@rv, ""); } if ($delreplies{$mid}) { local ($bounce) = grep { /^\!/ } split(/\s+/, $delreplies{$mid}); local $img = $bounce ? "red.gif" : "box.gif"; push(@rv, ""); } } return @rv; } # show_mailbox_buttons(number, &folders, current-folder, &mail) # Prints HTML for buttons to appear above or below a mail list sub show_mailbox_buttons { local ($num, $folders, $folder, $mail) = @_; local $spacer = " \n"; if (@$mail) { print ""; print ""; print $spacer; if (@$folders > 1) { print &movecopy_select($_[0], $folders, $folder); print $spacer; } if ($userconfig{'open_mode'}) { print ""; } else { # Forward button can just be a normal submit print ""; } print $spacer; print ""; print $spacer; if (&can_report_spam($folder) && $userconfig{'spam_buttons'} =~ /list/ || $folder->{'spam'}) { print ""; if ($userconfig{'spam_del'}) { print ""; } else { print ""; } print $spacer; } if (&can_report_ham($folder) && $userconfig{'ham_buttons'} =~ /list/ || $folder->{'spam'}) { print ""; print ""; print $spacer; } } if ($userconfig{'open_mode'}) { # Show mass open button print ""; print $spacer; } if ($userconfig{'open_mode'}) { # Compose button needs to pop up a window print ""; } else { # Compose button can just submit and redirect print ""; } print "
    \n"; } # expand_to(list) # Given a string containing multiple email addresses and group names, # expand out the group names (if any) # XXX strip out my address when doing reply-to-all sub expand_to { %address_groups = map { $_->[0], $_->[1] } &list_address_groups() if (!defined(%address_groups)); if ($userconfig{'real_expand'}) { %real_expand_names = map { $_->[1], $_->[0] } grep { $_->[1] } &list_addresses() if (!defined(%real_expand_names)); } local @addrs = &split_addresses($_[0]); local (@alladdrs, $a, $expanded); foreach $a (@addrs) { if (defined($address_groups{$a->[0]})) { push(@alladdrs, &split_addresses($address_groups{$a->[0]})); $expanded++; } elsif (defined($real_expand_names{$a->[0]})) { push(@alladdrs, &split_addresses($real_expand_names{$a->[0]})); $expanded++; } else { push(@alladdrs, $a); } } return $expanded ? join(", ", map { $_->[2] } @alladdrs) : $_[0]; } # connect_qmail_ldap([return-error]) # Connect to the LDAP server used for Qmail. Returns an LDAP handle on success, # or an error message on failure. sub connect_qmail_ldap { eval "use Net::LDAP"; if ($@) { local $err = &text('ldap_emod', "Net::LDAP"); if ($_[0]) { return $err; } else { &error($err); } } # Connect to server local $port = $config{'ldap_port'} || 389; local $ldap = Net::LDAP->new($config{'ldap_host'}, port => $port); if (!$ldap) { local $err = &text('ldap_econn', "$config{'ldap_host'}","$port"); if ($_[0]) { return $err; } else { &error($err); } } # Start TLS if configured if ($config{'ldap_tls'}) { $ldap->start_tls(); } # Login local $mesg; if ($config{'ldap_login'}) { $mesg = $ldap->bind(dn => $config{'ldap_login'}, password => $config{'ldap_pass'}); } else { $mesg = $ldap->bind(anonymous => 1); } if (!$mesg || $mesg->code) { local $err = &text('ldap_elogin', "$config{'ldap_host'}", $dn, $mesg ? $mesg->error : "Unknown error"); if ($_[0]) { return $err; } else { &error($err); } } return $ldap; } # get_user_ldap() # Looks up the LDAP information for the current mailbox user, and returns a # Net::LDAP::Entry object. sub get_user_ldap { local $ldap = &connect_qmail_ldap(); local $rv = $ldap->search(base => $config{'ldap_base'}, filter => "(uid=$remote_user)"); &error("Failed to get LDAP entry : ",$rv->error) if ($rv->code); local ($u) = $rv->all_entries(); &error("Could not find LDAP entry") if (!$u); $ldap->unbind(); return $u; } # would_exceed_quota(&folder, &mail, ...) # Checks if the addition of a given email messages # exceed any quotas. Called when saving a draft or copying an email. # Returns undef if OK, or an error message sub would_exceed_quota { local ($folder, @mail) = @_; # Get quotas in force local ($total, $count, $totalquota, $countquota) = &get_user_quota(); return undef if (!$totalquota && !$countquota); # Work out how much we are adding local $m; local $adding = 0; foreach $m (@mail) { $adding += ($m->{'size'} || &mail_size($m)); } # Check against size limit if ($totalquota && $total + $adding > $totalquota) { return &text('quota_inbox', &nice_size($totalquota)); } # Check against count limit if ($countquota && $count + scalar(@mail) > $countquota) { return &text('quota_inbox2', $countquota); } return undef; } # get_user_quota() # If any quotas are in force, returns the total size of all folders, the total # number of messages, the maximum size, and the maximum number of messages sub get_user_quota { return ( ) if (!$config{'ldap_quotas'} && !$config{'max_quota'}); # Work out current size of all local folders local $f; local $total = 0; local $count = 0; foreach $f (&list_folders()) { if ($f->{'type'} == 0 || $f->{'type'} == 1 || $f->{'type'} == 3) { $total += &folder_size($f); $count += &mailbox_folder_size($f); } } # Get the configured quota local $configquota = $config{'max_quota'}; # Get the LDAP limit local $ldapquota; local $ldapcount; if ($config{'ldap_host'} && $config{'ldap_quotas'}) { local $entry = &get_user_ldap(); $ldapquota = $entry->get_value("mailQuotaSize"); $ldapcount = $entry->get_value("mailQuotaCount"); } local $quota = defined($configquota) && defined($ldapquota) ? min($configquota, $ldapquota) : defined($configquota) ? $configquota : defined($ldapquota) ? $ldapquota : undef; return ($total, $count, $quota, $ldapcount); } sub min { return $_[0] < $_[1] ? $_[0] : $_[1]; } # get_sort_field(&folder) # Returns the field and direction on which sorting is done for the current user sub get_sort_field { local ($folder) = @_; return ( ) if (!$folder->{'sortable'}); local $file = &folder_name($folder); $file =~ s/\//_/g; my %sort; if (&read_file("$user_module_config_directory/sort.$file", \%sort)) { return ($sort{'field'}, $sort{'dir'}); } return ( ); } # save_sort_field(&folder, field, dir) sub save_sort_field { local $file = &folder_name($_[0]); $file =~ s/\//_/g; my %sort = ( 'field' => $_[1], 'dir' => $_[2] ); &write_file("$user_module_config_directory/sort.$file", \%sort); } # field_sort_link(title, field, folder-idx, start) # Returns HTML for a link to switch sorting mode sub field_sort_link { local ($title, $field, $folder, $start) = @_; local ($sortfield, $sortdir) = &get_sort_field($folder); local $dir = $sortfield eq $field ? !$sortdir : 0; local $img = $sortfield eq $field && $dir ? "sortascgrey.gif" : $sortfield eq $field && !$dir ? "sortdescgrey.gif" : $dir ? "sortasc.gif" : "sortdesc.gif"; if ($folder->{'sortable'}) { return "
    $title
    "; } else { return "$title"; } } # view_mail_link(&folder, index, start, from-to-text, message-id) sub view_mail_link { local ($folder, $idx, $start, $txt, $mid) = @_; local $qmid = &urlize($mid); local $url = "view_mail.cgi?start=$start&idx=$idx&folder=$folder->{'index'}&mid=$qmid"; if ($userconfig{'open_mode'}) { return "". &simplify_from($txt).""; } else { return "".&simplify_from($txt).""; } } # mail_page_header(title, headstuff, bodystuff) sub mail_page_header { if ($userconfig{'open_mode'}) { &popup_header(@_); } else { &ui_print_header(undef, $_[0], "", undef, 0, 0, 0, undef, $_[1], $_[2]); } } # mail_page_footer(link, text, ...) sub mail_page_footer { if ($userconfig{'open_mode'}) { &popup_footer(); } else { &ui_print_footer(@_); } } # messages_from_indexes(&folder, &pairs) # Given a list of strings in idx/message-id format, returns the actual emails sub messages_from_indexes { local ($folder, $both) = @_; local (@idxs, @mids, @rv); foreach my $d (@$both) { local ($di, $dmid) = split(/\//, $d); push(@idxs, $di); push(@mids, $dmid); } return ( ) if (!@idxs); local @mails = &mailbox_list_mails_sorted($idxs[0], $idxs[@idxs-1], $folder); for(my $i=0; $i<@idxs; $i++) { local $mail = &find_message_by_index(\@mails, $folder, $idxs[$i], $mids[$i]); push(@rv, $mail) if ($mail); } return @rv; } # get_auto_schedule(&folder) # Returns the automatic schedule structure for the given folder sub get_auto_schedule { local ($folder) = @_; local $id = $folder->{'id'} || &urlize($folder->{'file'}); local %rv; &read_file("$user_module_config_directory/$id.sched", \%rv) || return undef; return \%rv; } # save_auto_schedule(&folder, &sched) # Updates the automatic schedule structure for the given folder sub save_auto_schedule { local ($folder, $sched) = @_; local $id = $folder->{'id'} || &urlize($folder->{'file'}); if ($sched) { &write_file("$user_module_config_directory/$id.sched", $sched); } else { unlink("$user_module_config_directory/$id.sched"); } } # setup_auto_cron() # Creates the Cron job that runs auto.pl sub setup_auto_cron { &foreign_require("cron", "cron-lib.pl"); local @jobs = &cron::list_cron_jobs(); local ($job) = grep { $_->{'command'} eq $auto_cmd && $_->{'user'} eq $remote_user } @jobs; if (!$job) { $job = { 'command' => $auto_cmd, 'active' => 1, 'user' => $remote_user, 'mins' => int(rand()*60), 'hours' => '*', 'days' => '*', 'months' => '*', 'weekdays' => '*' }; &cron::create_cron_job($job); } &cron::create_wrapper($auto_cmd, $module_name, "auto.pl"); } 1; mailbox/module.info0100664000567100000000000000077410453244206014222 0ustar jcameronrootdesc=Read Mail desc_de=E-Mail lesen und versenden category=mail os_support=solaris *-linux freebsd hpux irix macos openserver unixware openbsd aix netbsd osf1 qnx usermin=1 desc_nl=Lees en Verzend Mail desc_el=ÁíÜăíůóç ĚçíőěÜôůí longdesc=Read, compose, forward and reply to email. Supports multiple folders, GnuPG encryption, attachments and an address book. desc_fr=Lecture des mails version=1.221 desc_ru_RU=Íŕďčńŕňü/ďđî÷čňŕňü ďî÷ňó desc_ru_SU=îÁĐÉÓÁÔŘ/ĐŇĎŢÉÔÁÔŘ ĐĎŢÔŐ desc_cz=Čtení pošty a práce s poštou mailbox/newfolder.cgi0100775000567100000000000000021610200575667014533 0ustar jcameronroot#!/usr/local/bin/perl # Just re-directs to the appropriate folder creator require './mailbox-lib.pl'; &ReadParse(); &redirect($in{'prog'}); mailbox/old_mail_search.cgi0100775000567100000000000001451610261654731015660 0ustar jcameronroot#!/usr/local/bin/perl # mail_search.cgi # Find mail messages matching some pattern require './mailbox-lib.pl'; &ReadParse(); $limit = { }; if (!$in{'status_def'} && defined($in{'status'})) { $statusmsg = &text('search_withstatus', $text{'view_mark'.$in{'status'}}); } if ($in{'simple'}) { # Make sure a search was entered $in{'search'} || &error($text{'search_ematch'}); if ($userconfig{'search_latest'}) { $limit->{'latest'} = $userconfig{'search_latest'}; } } else { # Validate search fields for($i=0; defined($in{"field_$i"}); $i++) { if ($in{"field_$i"}) { $in{"what_$i"} || &error(&text('search_ewhat', $i+1)); $neg = $in{"neg_$i"} ? "!" : ""; push(@fields, [ $neg.$in{"field_$i"}, $in{"what_$i"} ]); } } @fields || $statusmsg || &error($text{'search_enone'}); if (!defined($in{'limit'})) { if ($userconfig{'search_latest'}) { $limit = { 'latest' => $userconfig{'search_latest'} }; } } elsif (!$in{'limit_def'}) { $in{'limit'} =~ /^\d+$/ || &error($text{'search_elatest'}); $limit->{'latest'} = $in{'limit'}; } } if ($limit && $limit->{'latest'}) { $limitmsg = &text('search_limit', $limit->{'latest'}); } &set_module_index($in{'folder'} < 0 ? 0 : $in{'folder'}); &ui_print_header(undef, $text{'search_title'}, ""); @folders = &list_folders(); if ($in{'folder'} == -2) { print "
    $text{'search_local'}
    \n"; } elsif ($in{'folder'} == -1) { print "
    $text{'search_all'}
    \n"; } else { $folder = $folders[$in{'folder'}]; print "
    ", &text('mail_for', $folder->{'name'}),"
    \n"; } if ($in{'simple'}) { # Just search by Subject and From (or To) in one folder ($mode, $words) = &parse_boolean($in{'search'}); local $who = $folder->{'sent'} ? 'to' : 'from'; if ($mode == 0) { # Can just do a single 'or' search @searchlist = map { ( [ 'subject', $_ ], [ $who, $_ ] ) } @$words; @rv = &mailbox_search_mail(\@searchlist, 0, $folder, $limit); } elsif ($mode == 1) { # Need to do two 'and' searches and combine @searchlist1 = map { ( [ 'subject', $_ ] ) } @$words; @rv1 = &mailbox_search_mail(\@searchlist1, 1, $folder, $limit); @searchlist2 = map { ( [ $who, $_ ] ) } @$words; @rv2 = &mailbox_search_mail(\@searchlist2, 1, $folder, $limit); @rv = @rv1; %gotidx = map { $_->{'idx'}, 1 } @rv; foreach $mail (@rv2) { push(@rv, $mail) if (!$gotidx{$mail->{'idx'}}); } } else { &error($text{'search_eboolean'}); } foreach $mail (@rv) { $mail->{'folder'} = $folder; } if ($statusmsg) { @rv = &filter_by_status(\@rv, $in{'status'}); } print "

    ",&text('search_results2', scalar(@rv), "$in{'search'}")," ",$limitmsg," ",$statusmsg, " ..

    \n"; } else { # Complex search, perhaps over multiple folders! if ($in{'folder'} == -2) { @sfolders = grep { !$_->{'remote'} } @folders; $multi_folder = 1; } elsif ($in{'folder'} == -1) { @sfolders = @folders; $multi_folder = 1; } else { @sfolders = ( $folder ); } foreach $sf (@sfolders) { local @frv = &mailbox_search_mail(\@fields, $in{'and'}, $sf, $limit); foreach $mail (@frv) { $mail->{'folder'} = $sf; } push(@rv, @frv); } if ($statusmsg) { @rv = &filter_by_status(\@rv, $in{'status'}); } print "

    ",&text('search_results4', scalar(@rv)), " ",$limitmsg," ",$statusmsg," ..

    \n"; } @rv = reverse(@rv); $showto = $folder->{'sent'} || $folder->{'drafts'} || $userconfig{'show_to'}; $showfrom = !($folder->{'sent'} || $folder->{'drafts'}) || $userconfig{'show_to'}; if (@rv) { print "

    \n"; print "\n"; if ($userconfig{'top_buttons'}) { if (!$multi_folder) { &show_mailbox_buttons(1, \@folders, $folder, \@rv); print &select_all_link("d", 0, $text{'mail_all'}),"\n"; print &select_invert_link("d", 0, $text{'mail_invert'}); print "
    \n"; } } print "\n"; print " ", $multi_folder ? "" : " ", ($showfrom ? " " : ""), ($showto ? " " : ""), " ", " ", "\n"; } foreach $m (@rv) { local $idx = $m->{'idx'}; local $mf = $m->{'folder'}; print "\n"; if ($multi_folder) { print "\n"; } else { print "\n"; } if ($showfrom) { print "\n"; } if ($showto) { print "\n"; } print "\n"; print "\n"; print "\n"; &update_delivery_notification($m, $m->{'folder'}); $anyvirt++ if ($m->{'folder'}->{'type'} == 6); } if (@rv) { print "
    $text{'mail_folder'} $text{'mail_from'}$text{'mail_to'}$text{'mail_date'}$text{'mail_size'}$text{'mail_subject'}
    $mf->{'name'}", &simplify_from($m->{'header'}->{'from'}),"", &simplify_from($m->{'header'}->{'to'}),"",&simplify_date($m->{'header'}->{'date'}),"",int($m->{'size'}/1000)+1," kB","", "
    ",&simplify_subject($m->{'header'}->{'subject'}), " "; local @icons = &message_icons($m, $mf->{'drafts'} || $mf->{'sent'}); print join(" ", @icons); print "
    \n"; if (!$multi_folder) { print &select_all_link("d", 0, $text{'mail_all'}),"\n"; print &select_invert_link("d", 0, $text{'mail_invert'}); print "
    \n"; &show_mailbox_buttons(2, \@folders, $folder, \@rv); } print "

    \n"; if (!$anyvirt) { # Show button to turn into virtual folder print "


    \n"; print &ui_form_start("virtualize.cgi"); $i = 0; foreach $m (reverse(@rv)) { print &ui_hidden("idx_$i", $m->{'idx'}." ".$m->{'folder'}->{'index'}),"\n"; $i++; } print &ui_submit($text{'search_virtualize'}),"\n"; print &ui_textbox("virtual", "", 40),"\n"; print &ui_form_end(); } } else { print "$text{'search_none'}

    \n"; } &ui_print_footer($in{'simple'} ? ( ) : ( "search_form.cgi?folder=$in{'folder'}", $text{'sform_return'} ), "index.cgi?folder=$in{'folder'}", $text{'mail_return'}); &pop3_logout_all(); mailbox/quotacheck.pl0100775000567100000000000000612310242315336014540 0ustar jcameronroot#!/usr/bin/perl # Called from Procmail to check if some user is over his LDAP quota, and if # so bounces it. Exits with 0 if OK, 100 if over quota, or 111 if a temporary # error occurred use Net::LDAP; @ARGV == 6 || temperr("usage: quotacheck.pl "); ($email, $host, $port, $base, $login, $pass) = @ARGV; # Read in email $size = 0; while() { $size += length($_); } # Connect to LDAP $ldap = Net::LDAP->new($host, port => $port); $ldap || temperr("Failed to connect to LDAP server $host:$port"); $mesg = $ldap->bind(dn => $login, password => $pass); if (!$mesg || $mesg->code) { temperr("Failed to login to LDAP server as $login : ", $mesg ? $mesg->error : "Unknown error"); } # Lookup the email address $rv = $ldap->search(base => $base, filter => "(|(mail=$email)(mailAlternateAddress=$email))"); if ($rv->code) { temperr("Failed to lookup user in LDAP : ",$rv->error); } ($user) = $rv->all_entries(); exit(0) if (!$user); # Non-LDAP, so no quota # Check the current size of all the user's folders $mms = $user->get_value('mailMessageStore'); $inbox = { 'type' => &folder_type($mms), 'file' => $mms }; @folders = ( $inbox ); $fdir = $user->get_value('homeDirectory')."/mail"; opendir(DIR, $fdir); while($f = readdir(DIR)) { next if ($f eq "." || $f eq ".."); $path = "$fdir/$f"; $folder = { 'type' => &folder_type($path), 'file' => $path }; push(@folders, $folder); } closedir(DIR); $total = &folder_size(@folders); print "Current size: $total\n"; print "Extra size: $size\n"; # Compare to quota $quota = $user->get_value('mailQuotaSize'); print "Allowed quota: $quota\n"; if ($quota && $total + $size > $quota) { print STDERR "Quota exceeded\n"; exit(100); } exit(0); sub temperr { print STDERR @_,"\n"; exit(111); } # folder_size(&folder, ...) # Sets the 'size' field of one or more folders, and returns the total sub folder_size { local ($f, $total); foreach $f (@_) { if ($f->{'type'} == 0) { # Single mail file - size is easy local @st = stat($f->{'file'}); $f->{'size'} = $st[7]; } elsif ($f->{'type'} == 1) { # Maildir folder size is that of all mail files local $qd; $f->{'size'} = 0; foreach $qd ('cur', 'new') { local $mf; opendir(QDIR, "$f->{'file'}/$qd"); while($mf = readdir(QDIR)) { next if ($mf eq "." || $mf eq ".."); local @st = stat("$f->{'file'}/$qd/$mf"); $f->{'size'} += $st[7]; } closedir(QDIR); } } elsif ($f->{'type'} == 3) { # MH folder size is that of all mail files local $mf; $f->{'size'} = 0; opendir(MHDIR, $f->{'file'}); while($mf = readdir(MHDIR)) { next if ($mf eq "." || $mf eq ".."); local @st = stat("$f->{'file'}/$mf"); $f->{'size'} += $st[7]; } closedir(MHDIR); } elsif ($f->{'type'} == 5) { # Size of a combined folder is the size of all sub-folders return &folder_size(@{$f->{'subfolders'}}); } else { # Cannot get size of a remote folder $f->{'size'} = undef; } $total += $f->{'size'}; } return $total; } # folder_type(file_or_dir) sub folder_type { return -d "$_[0]/cur" ? 1 : -d $_[0] ? 3 : 0; } mailbox/reply_mail.cgi0100755000567100000000000005342110440471236014700 0ustar jcameronroot#!/usr/local/bin/perl # Display a form for replying to or composing an email require './mailbox-lib.pl'; &ReadParse(); &set_module_index($in{'folder'}); @folders = &list_folders(); $folder = $folders[$in{'folder'}]; if ($in{'new'}) { # Composing a new email $html_edit = 1 if ($userconfig{'html_edit'} == 2); $sig = &get_signature(); if ($html_edit) { $sig =~ s/\n/
    \n/g; $quote = "$sig"; } else { $quote = "\n\n$sig" if ($sig); } &mail_page_header($text{'compose_title'}, undef, $html_edit ? "onload='initEditor()'" : ""); } else { # Replying or forwarding if ($in{'mailforward'} ne '') { # Forwarding multiple .. get the messages @mailforwardboth = split(/\0/, $in{'mailforward'}); @fwdmail = &messages_from_indexes($folder, \@mailforwardboth); @fwdmail || &error($text{'reply_efwdnone'}); $mail = $fwdmail[0]; } else { # Replying or forwarding one .. get it @mail = &mailbox_list_mails_sorted( $in{'idx'}, $in{'idx'}, $folder, 0, undef); $mail = &find_message_by_index(\@mail, $folder, $in{'idx'}, $in{'mid'}); $mail || &error($text{'view_egone'}); &decode_and_sub(); } $viewlink = "view_mail.cgi?idx=$in{'idx'}&folder=$in{'folder'}&mid=". &urlize($in{'mid'}); $mail || &error($text{'mail_eexists'}); if ($in{'delete'}) { # Just delete the email if (!$in{'confirm'} && &need_delete_warn($folder)) { # Need to ask for confirmation before deleting &mail_page_header($text{'confirm_title'}); print &check_clicks_function(); print "

    \n"; foreach $i (keys %in) { foreach $v (split(/\0/, $in{$i})) { print &ui_hidden($i, $v),"\n"; } } print "
    $text{'confirm_warn3'}
    \n"; if ($userconfig{'delete_warn'} ne 'y') { print "$text{'confirm_warn2'}

    \n" } elsif ($folder->{'type'} == 0) { print "$text{'confirm_warn4'}

    \n" } print "

    \n"; &mail_page_footer( $viewlink, $text{'view_return'}, "index.cgi?folder=$in{'folder'}", $text{'index'}); exit; } &lock_folder($folder); &mailbox_delete_mail($folder, $mail); &unlock_folder($folder); &pop3_logout_all(); &redirect_to_previous(); exit; } elsif ($in{'print'}) { # Extract the mail body ($textbody, $htmlbody, $body) = &find_body($mail, $userconfig{'view_html'}); # Output HTML header &PrintHeader(); print "\n"; print "",&html_escape(&decode_mimewords( $mail->{'header'}->{'subject'})),"\n"; print "\n"; # Display the headers print "\n"; print "\n"; print "
    $text{'view_headers'}
    \n"; print " ", "\n"; print " ", "\n"; print " ", "\n" if ($mail->{'header'}->{'cc'}); print " ", "\n"; print " ", "\n"; print "
    $text{'mail_from'}",&eucconv_and_escape($mail->{'header'}->{'from'}),"
    $text{'mail_to'}",&eucconv_and_escape($mail->{'header'}->{'to'}),"
    $text{'mail_cc'}",&eucconv_and_escape($mail->{'header'}->{'cc'}),"
    $text{'mail_date'}",&eucconv_and_escape(&html_escape($mail->{'header'}->{'date'})), "
    $text{'mail_subject'}",&eucconv_and_escape(&decode_mimewords( $mail->{'header'}->{'subject'})),"

    \n"; # Just display the mail body for printing if ($body eq $textbody) { print "
    ";
    			foreach $l (&wrap_lines($body->{'data'},
    						$userconfig{'wrap_width'})) {
    				print &eucconv_and_escape($l),"\n";
    				}
    			print "
    \n"; } elsif ($body eq $htmlbody) { print "
    \n"; print &safe_html($body->{'data'}); print "
    \n"; } print "\n"; exit; } elsif ($in{'mark1'} || $in{'mark2'}) { # Just mark the message &open_read_hash(); $mode = $in{'mark1'} ? $in{'mode1'} : $in{'mode2'}; if ($mode) { $read{$mail->{'header'}->{'message-id'}} = $mode; } else { delete($read{$mail->{'header'}->{'message-id'}}); } &redirect_to_previous(); exit; } elsif ($in{'move1'} || $in{'move2'}) { # Move to another folder &error_setup($text{'reply_errm'}); $mfolder = $folders[$in{'move1'} ? $in{'mfolder1'} : $in{'mfolder2'}]; $mfolder->{'noadd'} && &error($text{'delete_enoadd'}); &lock_folder($folder); &lock_folder($mfolder); &mailbox_move_mail($folder, $mfolder, $mail); &unlock_folder($mfolder); &unlock_folder($folder); &redirect_to_previous(); exit; } elsif ($in{'copy1'} || $in{'copy2'}) { # Copy to another folder &error_setup($text{'reply_errc'}); $mfolder = $folders[$in{'copy1'} ? $in{'mfolder1'} : $in{'mfolder2'}]; $qerr = &would_exceed_quota($mfolder, $mail); &error($qerr) if ($qerr); &lock_folder($folder); &lock_folder($mfolder); &mailbox_copy_mail($folder, $mfolder, $mail); &unlock_folder($mfolder); &unlock_folder($folder); &redirect_to_previous(); exit; } elsif ($in{'detach'} && $config{'server_attach'} == 2) { # Detach some attachment to a directory on the server &error_setup($text{'detach_err'}); $in{'dir'} || &error($text{'detach_edir'}); $in{'dir'} = "$remote_user_info[7]/$in{'dir'}" if ($in{'dir'} !~ /^\//); if ($in{'attach'} eq '*') { # Detaching all attachments (except the body and any # signature) under their filenames @dattach = grep { $_->{'idx'} ne $in{'bindex'} && $_->{'header'}->{'content-type'} !~ /^multipart\//i } @{$mail->{'attach'}}; if (defined($in{'sindex'})) { @dattach = grep { $_->{'idx'} ne $in{'sindex'} } @dattach; } } else { # Just one attachment @dattach = ( $mail->{'attach'}->[$in{'attach'}] ); } local @paths; foreach $attach (@dattach) { local $path; if (-d $in{'dir'}) { # Just write to the filename in the directory local $fn; if ($attach->{'filename'}) { $fn = &decode_mimewords( $attach->{'filename'}); $fn =~ s/^.*[\/\\]//; } else { $attach->{'type'} =~ /\/(\S+)$/; $fn = "file.$1"; } $path = "$in{'dir'}/$fn"; } else { # Assume a full path was given $path = $in{'dir'}; } push(@paths, $path); } for($i=0; $i<@dattach; $i++) { # Try to write the files open(FILE, ">$paths[$i]") || &error(&text('detach_eopen', "$paths[$i]", $!)); (print FILE $dattach[$i]->{'data'}) || &error(&text('detach_ewrite', "$paths[$i]", $!)); close(FILE) || &error(&text('detach_ewrite', "$paths[$i]", $!)); } # Show a message about the new files &mail_page_header($text{'detach_title'}); for($i=0; $i<@dattach; $i++) { local $sz = (int(length($dattach[$i]->{'data'}) / 1000)+1)." Kb"; print "

    ",&text('detach_ok', "$paths[$i]", $sz),"

    \n"; } &mail_page_footer( $viewlink, $text{'view_return'}, "index.cgi?folder=$in{'folder'}", $text{'mail_return'}); exit; } elsif ($in{'black'} || $in{'white'}) { # Add sender to SpamAssassin black/write list, and tell user $mode = $in{'black'} ? "black" : "white"; &mail_page_header($text{$mode.'_title'}); &foreign_require("spam", "spam-lib.pl"); local $conf = &spam::get_config(); local @from = map { @{$_->{'words'}} } &spam::find($mode."list_from", $conf); local %already = map { $_, 1 } @from; local ($spamfrom) = &address_parts($mail->{'header'}->{'from'}); if ($already{$spamfrom}) { print &text($mode.'_already', "$spamfrom"),"

    \n"; } else { push(@from, $spamfrom); &spam::save_directives($conf, $mode.'list_from', \@from, 1); &flush_file_lines(); print &text($mode.'_done', "$spamfrom"),"

    \n"; } &mail_page_footer( $viewlink, $text{'view_return'}, "index.cgi?folder=$in{'folder'}", $text{'mail_return'}); exit; } elsif ($in{'razor'} || $in{'ham'}) { # Report message to Razor as spam/ham and tell user $mode = $in{'razor'} ? "razor" : "ham"; &mail_page_header($text{$mode.'_title'}); print "",$text{$mode.'_report'},"\n"; print "

    ";
    		local $temp = &transname();
    		&send_mail($mail, $temp, 0, 1);
    		local $cmd = $mode eq "razor" ? &spam_report_cmd() 
    					      : &ham_report_cmd();
    		open(OUT, "$cmd <$temp 2>&1 |");
    		local $error;
    		while() {
    			print &html_escape($_);
    			$error++ if (/failed/i);
    			}
    		close(OUT);
    		unlink($temp);
    		print "
    \n"; $deleted = 0; if ($? || $error) { print "",$text{'razor_err'},"

    \n"; } else { if ($userconfig{'spam_del'} && $mode eq "razor") { # Delete message too &lock_folder($folder); &mailbox_delete_mail($folder, $mail); &unlock_folder($folder); print "$text{'razor_deleted'}

    \n"; $deleted = 1; } else { print "",$text{'razor_done'},"

    \n"; } } &mail_page_footer( $deleted ? ( ) : ( $viewlink, $text{'view_return'} ), "index.cgi?folder=$in{'folder'}", $text{'mail_return'}); exit; } elsif ($in{'dsn'}) { # Send DSN to sender dbmopen(%dsn, "$user_module_config_directory/dsn", 0600); $dsnaddr = &send_delivery_notification($mail, undef, 1); if ($dsnaddr) { $mid = $mail->{'header'}->{'message-id'}; $dsn{$mid} = time()." ".$dsnaddr; } dbmclose(%dsn); &redirect_to_previous(); exit; } if (!@fwdmail) { &parse_mail($mail); &decrypt_attachments($mail); @attach = @{$mail->{'attach'}}; } if ($in{'enew'}) { # Editing an existing message, so keep same fields $to = $mail->{'header'}->{'to'}; $rto = $mail->{'header'}->{'reply-to'}; $from = $mail->{'header'}->{'from'}; $cc = $mail->{'header'}->{'cc'}; $ouser = $1 if ($from =~ /^(\S+)\@/); } else { if (!$in{'forward'} && !@fwdmail) { # Replying to a message, so set To: field $to = $mail->{'header'}->{'reply-to'}; $to = $mail->{'header'}->{'from'} if (!$to); } if ($in{'rall'}) { # If replying to all, add any addresses in the original # To: or Cc: to our new Cc: address. # XXX should strip own addresses $cc = $mail->{'header'}->{'to'}; $cc .= ", ".$mail->{'header'}->{'cc'} if ($mail->{'header'}->{'cc'}); } } # Work out new subject, depending on whether we are replying # our forwarding a message (or neither) local $qu = !$in{'enew'} && (!$in{'forward'} || !$userconfig{'fwd_mode'}); $subject = &html_escape(&decode_mimewords( $mail->{'header'}->{'subject'})); $subject = "Re: ".$subject if ($subject !~ /^Re/i && !$in{'forward'} && !@fwdmail && !$in{'enew'}); $subject = "Fwd: ".$subject if ($subject !~ /^Fwd/i && ($in{'forward'} || @fwdmail)); # Construct the initial mail text $sig = &get_signature(); ($quote, $html_edit, $body) = "ed_message($mail, $qu, $sig, $in{'body'}); if ($in{'forward'} || $in{'enew'}) { @attach = grep { $_ ne $body } @attach; } else { undef(@attach); } &mail_page_header( $in{'forward'} || @fwdmail ? $text{'forward_title'} : $in{'enew'} ? $text{'enew_title'} : $text{'reply_title'}, undef, $html_edit ? "onload='initEditor()'" : ""); } print "

    \n"; # Output various hidden fields print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; foreach $s (@sub) { print "\n"; } if ($in{'reply'}) { print "{'message-id'})."'>\n"; } print "\n"; print "\n"; print "
    $text{'reply_headers'}
    \n"; print "\n"; if ($from) { # Got From address @froms = ( $from ); } else { # Work out From: address local ($froms, $doms) = &list_from_addresses(); @froms = @$froms; } @faddrs = grep { $_->[3] } &list_addresses(); ($defaddr) = grep { $_->[3] == 2 } @faddrs; if ($folder->{'fromaddr'}) { # Folder has a specified From: address ($defaddr) = &split_addresses($folder->{'fromaddr'}); } if ($config{'edit_from'} == 1) { # User can enter any from address he wants if ($defaddr) { # Address book contains a default from address $froms[0] = $defaddr->[1] ? "\"$defaddr->[1]\" <$defaddr->[0]>" : $defaddr->[0]; } print "\n"; } elsif ($config{'edit_from'} == 2) { # Only the real name and username part is editable local ($real, $user, $dom); local ($sp) = $defaddr || &split_addresses($froms[0]); $real = $sp->[1]; if ($sp->[0] =~ /^(\S+)\@(\S+)$/) { $user = $1; $dom = $2; } else { $user = $sp->[0]; } print "\n"; } else { # A fixed From address, or a choice of fixed options if (@froms > 1) { print "\n"; } else { print "\n"; print "\n"; } } $to = &html_escape($to); if ($userconfig{'reply_to'} ne 'x') { # Show Reply-To: and To: fields $rto = &html_escape($userconfig{'reply_to'}) if ($userconfig{'reply_to'} ne '*'); print "\n"; print "\n"; } else { # Just show To: field print "\n"; } $cc = &html_escape($cc); print "\n"; print "\n"; print "\n"; print " ", "\n"; # Ask for signing and encryption if (&has_command("gpg") && &foreign_check("gnupg")) { &foreign_require("gnupg", "gnupg-lib.pl"); local @keys = &foreign_call("gnupg", "list_keys"); if (@keys) { print "\n"; print "\n"; } } print "\n"; if ($userconfig{'req_dsn'} == 2) { # Ask for a disposition (read) status print "\n"; } if ($userconfig{'req_del'} == 2) { # Ask for a delivery status print "\n"; } print "\n"; # Ask if should add to address book print "\n"; print "\n"; print "\n"; print "
    $text{'mail_from'} ", @faddrs ? &address_button("from", 0, 1) : "","\n"; print "<\@"; if (@$doms > 1) { print ">\n"; } else { print "$dom>\n"; print "\n"; } print &address_button("user", 0, 2, "real") if (@faddrs); print "",&html_escape($froms[0]),"$text{'mail_replyto'} ", " ", @faddrs ? &address_button("replyto", 0, 1) : "","
    $text{'mail_to'} ", " ", &address_button("to"),"
    $text{'mail_to'} ", " ", &address_button("to"),"
    $text{'mail_cc'} ", " ", &address_button("cc"),"$text{'mail_bcc'} ", " ", &address_button("bcc"),"
    $text{'mail_subject'} ", "$text{'mail_pri'}\n", "\n", "\n", "
    \n", "  ", "
    $text{'mail_sign'}\n"; print "$text{'mail_crypt'}\n"; print "
    \n"; print "$text{'reply_dsn'}\n"; print &ui_radio("dsn", 0, [ [ 1, $text{'yes'} ], [ 0, $text{'no'} ] ]); print "\n"; print "$text{'reply_del'}\n"; print &ui_radio("del", 0, [ [ 1, $text{'yes'} ], [ 0, $text{'no'} ] ]); print "
    \n"; print "$text{'reply_aboot'}\n"; print &ui_radio("abook", $userconfig{'add_abook'}, [ [ 1, $text{'yes'} ], [ 0, $text{'no'} ] ]); print "

    \n"; # Output message body input print "\n", "", "
    $text{'reply_body'}
    "; if ($html_edit) { # Output HTML editor textarea print < _editor_url = "/$module_name/htmlarea/"; _editor_lang = "en"; EOF print "\n"; } else { # Show text editing area print "\n"; } if (&has_command("ispell") && !$userconfig{'nospell'}) { print "
    \n"; print &ui_checkbox("spell", 1, $text{'reply_spell'}, $userconfig{'spell_check'}),"\n"; } print "

    \n"; print "\n"; # Display forwarded attachments if (@attach) { print "\n"; print "\n"; print "
    $text{'reply_attach'}
    \n"; foreach $a (@attach) { push(@titles, "{'idx'} checked> ".($a->{'filename'} ? $a->{'filename'} : $a->{'type'})); push(@links, "detach.cgi?idx=$in{'idx'}&mid=".&urlize($in{'mid'})."&folder=$in{'folder'}&attach=$a->{'idx'}$subs"); push(@icons, "images/boxes.gif"); } &icons_table(\@links, \@titles, \@icons, 8); print "

    \n"; } # Display forwarded mails if (@fwdmail) { print "\n"; print "\n"; print "
    $text{'reply_mailforward'}
    \n"; foreach $f (@fwdmail) { push(@titles, &simplify_subject($f->{'header'}->{'subject'})); push(@links, "view_mail.cgi?idx=$f->{'sortidx'}&folder=$in{'folder'}&mid=".&urlize($f->{'header'}->{'message-id'})); push(@icons, "images/boxes.gif"); print &ui_hidden("mailforward", "$f->{'sortidx'}/$f->{'header'}->{'message-id'}"); } &icons_table(\@links, \@titles, \@icons, 8); print "

    \n"; } # Add form for more attachments print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; if ($config{'server_attach'}) { print "\n"; print "\n"; print "\n"; } print "
    $text{'reply_attach2'}
    ", &file_chooser_button("file0")," ", &file_chooser_button("file1")," ", &file_chooser_button("file2"),"

    \n"; print "  \n"; print "
    \n"; print "

    \n"; &mail_page_footer("index.cgi?folder=$in{'folder'}", $text{'mail_return'}); &pop3_logout_all(); sub decode_and_sub { return if (!$mail); ¬es_decode($mail, $folder); &parse_mail($mail); @sub = split(/\0/, $in{'sub'}); $subs = join("", map { "&sub=$_" } @sub); foreach $s (@sub) { # We are looking at a mail within a mail .. &decrypt_attachments($mail); local $amail = &extract_mail( $mail->{'attach'}->[$s]->{'data'}); &parse_mail($amail); $mail = $amail; } ($deccode, $decmessage) = &decrypt_attachments($mail); } sub redirect_to_previous { local $perpage = $folder->{'perpage'} || $userconfig{'perpage'}; local $s = int($in{'idx'} / $perpage) * $perpage; if ($userconfig{'open_mode'}) { &redirect($viewlink); } else { &redirect("index.cgi?folder=$in{'folder'}&start=$s"); } } mailbox/save_address.cgi0100775000567100000000000000131710243574357015216 0ustar jcameronroot#!/usr/local/bin/perl # save_address.cgi # Save, add or delete an address book entry require './mailbox-lib.pl'; &ReadParse(); if ($in{'delete'} ne '') { &delete_address($in{'delete'}); } else { &error_setup($text{'address_err'}); $in{'addr'} =~ /^\S+\@\S+$/ || &error($text{'address_eaddr'}); if ($in{'from'} == 2) { # Turn off default for all others foreach $a (&list_addresses()) { if ($a->[3] == 2 && $a->[2] != $in{'edit'}) { &modify_address($a->[2], $a->[0], $a->[1], 1); } } } if ($in{'add'}) { &create_address($in{'addr'}, $in{'name'}, $in{'from'}); } else { &modify_address($in{'edit'}, $in{'addr'}, $in{'name'}, $in{'from'}); } } &redirect("list_addresses.cgi"); mailbox/save_auto.cgi0100775000567100000000000000140010432414645014523 0ustar jcameronroot#!/usr/local/bin/perl # Show a form for setting up scheduled folder clearing require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); $folder = $folders[$in{'idx'}]; # Validate inputs $auto = &get_auto_schedule($folder); $auto ||= { }; $auto->{'enabled'} = $in{'enabled'}; $auto->{'mode'} = $in{'mode'}; if ($in{'mode'} == 0) { $in{'days'} =~ /^\d+$/ || &error($text{'auto_edays'}); $auto->{'days'} = $in{'days'}; $auto->{'invalid'} = $in{'invalid'}; } else { $in{'size'} =~ /^\d+$/ || &error($text{'auto_esize'}); $auto->{'size'} = $in{'size'}*$in{'size_units'}; } $auto->{'all'} = $in{'all'}; # Save schedule, and setup cron job &save_auto_schedule($folder, $auto); &setup_auto_cron() if ($auto->{'enabled'}); &redirect("list_folders.cgi"); mailbox/save_comp.cgi0100775000567100000000000000165610275562304014527 0ustar jcameronroot#!/usr/local/bin/perl # save_comp.cgi # Create, modify or delete a composite folder require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); if (!$in{'new'}) { $folder = $folders[$in{'idx'}]; $old = { %$folder }; } &error_setup($text{'save_err'}); if ($in{'delete'}) { # Just delete this folder file &delete_folder($old); } else { # Validate inputs $in{'name'} =~ /\S/ || &error($text{'save_ename'}); for($i=0; defined($n = $in{"comp_$i"}); $i++) { push(@subfolders, &find_named_folder($n, \@folders)) if ($n); } &parse_folder_options($folder, 0, \%in); # Save the folder $folder->{'type'} = 5; $folder->{'name'} = $in{'name'}; $folder->{'subfolders'} = \@subfolders; $folder->{'perpage'} = $in{'perpage_def'} ? undef : $in{'perpage'}; $folder->{'fromaddr'} = $in{'fromaddr_def'} ? undef : $in{'fromaddr'}; $folder->{'sent'} = $in{'sent'}; &save_folder($folder, $old); } &redirect("list_folders.cgi"); mailbox/save_folder.cgi0100775000567100000000000000720410416567714015046 0ustar jcameronroot#!/usr/local/bin/perl # save_folder.cgi # Create, modify or delete a folder # XXX check for external clash require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); if (!$in{'new'}) { $folder = $folders[$in{'idx'}]; $old = { %$folder }; } else { $folder->{'mode'} = $in{'mode'}; } &error_setup($text{'save_err'}); # Validate inputs if (!$in{'delete'}) { &parse_folder_options($folder, $in{'mode'}, \%in); } # Can this type of folder be edited? if ($in{'mode'} == 0) { $folder_types{'local'} || &error($text{'save_ecannot'}); } elsif ($in{'mode'} == 1) { $folder_types{'ext'} || &error($text{'save_ecannot'}); } if ($in{'mode'} == 0) { if ($in{'delete'} && $in{'confirm'}) { # Deleting a folder within ~/mail &delete_folder($folder); } elsif ($in{'delete'} && !$in{'confirm'}) { # Confirming a delete &ui_print_header(undef, $text{'save_title'}, ""); print "
    \n"; print "\n"; print "\n"; print "\n"; if ($folder->{'type'} == 0) { @st = stat($folder->{'file'}); $sz = int($st[7]/1024); } else { $sz = &disk_usage_kb($folder->{'file'}); } print "
    ",&text('save_rusure', $folder->{'name'}, "$folder->{'file'}", $sz),"

    \n"; print "\n"; print "

    \n"; &ui_print_footer("list_folders.cgi", $text{'folders_return'}); exit; } else { # Creating or renaming a folder within ~/mail $in{'name'} =~ /^\S+$/ || &error($text{'save_ename'}); $in{'name'} =~ /\.\./ && &error($text{'save_ename2'}); $in{'name'} ne 'sentmail' && $in{'name'} ne 'drafts' || &error($text{'save_esys'}); $path = "$folders_dir/$in{'name'}"; if ($folders_dir eq "$remote_user_info[7]/Maildir") { # Maildir sub-folder .. put a . in the name $path =~ s/([^\/]+)$/.$1/; } if ($old && $old->{'name'} ne $in{'name'}) { ($clash) = grep { $_->{'file'} eq $path } @folders; $clash && &error($text{'save_eclash'}); } $folder->{'type'} = $in{'type'}; $folder->{'name'} = $in{'name'}; &save_folder($folder, $old); } } elsif ($in{'mode'} == 1) { if ($in{'delete'}) { # Just remove from list of external folders &delete_folder($folder); } else { # Adding or updating an external folder &verify_external($in{'file'}); if ($old && $in{'file'} ne $old->{'file'}) { ($clash) = grep { $_->{'file'} eq $in{'file'} } @folders; $clash && &error($text{'save_eclash'}); } $in{'name'} || &error($text{'save_ename'}); $folder->{'name'} = $in{'name'}; $folder->{'file'} = $in{'file'}; &save_folder($folder, $old); } } elsif ($in{'mode'} == 2) { # Changing the path to the sent mail folder if ($in{'sent_def'}) { $folder->{'file'} = "$folders_dir/sentmail"; } else { &verify_external($in{'sent'}); $folder->{'file'} = $in{'sent'}; } &save_folder($folder); } &redirect("list_folders.cgi"); sub verify_external { if (-d $_[0]) { local ($f, %isdir); opendir(DIR, $_[0]); foreach $f (readdir(DIR)) { $isdir{$f}++ if (-d "$_[0]/$f" && $f ne "." && $f ne ".."); } closedir(DIR); if (keys(%isdir)) { $isdir{'cur'} && $isdir{'new'} && $isdir{'tmp'} && keys(%isdir) == 3 || &error(&text('save_emaildir', $_[0])); } } elsif (-r $_[0]) { open(FOLDER, $_[0]); local $line = ; close(FOLDER); !$line || $line =~ /^From\s+(\S+).*\d+/ || &error(&text('save_embox', $_[0])); } else { &error(&text('save_efile', $_[0])); } $_[0] =~ /^\Q$folders_dir\E\// && &error(&text('save_eindir', $folders_dir)); } mailbox/save_group.cgi0100775000567100000000000000106210115203122014673 0ustar jcameronroot#!/usr/local/bin/perl # save_group.cgi # Save, add or delete an address group entry require './mailbox-lib.pl'; &ReadParse(); if ($in{'gdelete'} ne '') { &delete_address_group($in{'gdelete'}); } else { &error_setup($text{'group_err'}); $in{'group'} =~ /\S/ || &error($text{'group_egroup'}); $in{'members'} =~ /\S/ || &error($text{'group_emembers'}); if ($in{'gadd'}) { &create_address_group($in{'group'}, $in{'members'}); } else { &modify_address_group($in{'gedit'}, $in{'group'}, $in{'members'}); } } &redirect("list_addresses.cgi#groups"); mailbox/save_imap.cgi0100775000567100000000000000312610275562563014520 0ustar jcameronroot#!/usr/local/bin/perl # save_imap.cgi # Create, modify or delete an IMAP folder require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); if (!$in{'new'}) { $folder = $folders[$in{'idx'}]; $old = { %$folder }; } else { $folder = { 'type' => 4, 'mode' => 0 }; } &error_setup($text{'save_err'}); $folder_types{'imap'} || &error($text{'save_ecannot'}); if ($in{'delete'}) { # Just delete this folder and cache &delete_folder($folder); } else { # Validate inputs $in{'name'} =~ /\S/ || &error($text{'save_ename'}); gethostbyname($in{'server'}) || &check_ipaddress($in{'server'}) || &error($text{'save_eserver'}); $in{'port_def'} || $in{'port'} =~ /^\d+$/ || &error($text{'save_eport'}); $in{'user'} =~ /\S/ || &error($text{'save_euser'}); $in{'mailbox_def'} || $in{'mailbox'} =~ /^\S+$/ || &error($text{'save_emailbox2'}); &parse_folder_options($folder, 0, \%in); # Save the folder $folder->{'name'} = $in{'name'}; $folder->{'server'} = $in{'server'}; $folder->{'port'} = $in{'port_def'} ? undef : $in{'port'}; $folder->{'user'} = $in{'user'}; $folder->{'pass'} = $in{'pass'}; $folder->{'perpage'} = $in{'perpage_def'} ? undef : $in{'perpage'}; $folder->{'fromaddr'} = $in{'fromaddr_def'} ? undef : $in{'fromaddr'}; $folder->{'sent'} = $in{'sent'}; local @err = &imap_login($folder); if ($err[0] == 0) { &error($err[1]); } elsif ($err[0] == 2) { &error(&text('save_elogin2', $err[1])); } elsif ($err[0] == 3) { &error(&text('save_emailbox', $err[1])); } else { &imap_logout($err[1], 1); } &save_folder($folder, $old); } &redirect("list_folders.cgi"); mailbox/save_pop3.cgi0100775000567100000000000000266310275562633014456 0ustar jcameronroot#!/usr/local/bin/perl # save_pop3.cgi # Create, modify or delete a POP3 folder require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); if (!$in{'new'}) { $folder = $folders[$in{'idx'}]; $old = { %$folder }; } else { $folder = { 'type' => 2, 'mode' => 0 }; } &error_setup($text{'save_err'}); $folder_types{'pop3'} || &error($text{'save_ecannot'}); if ($in{'delete'}) { # Just delete this folder and cache &delete_folder($folder); } else { # Validate inputs $in{'name'} =~ /\S/ || &error($text{'save_ename'}); gethostbyname($in{'server'}) || &check_ipaddress($in{'server'}) || &error($text{'save_eserver'}); $in{'port_def'} || $in{'port'} =~ /^\d+$/ || &error($text{'save_eport'}); $in{'user'} =~ /\S/ || &error($text{'save_euser'}); &parse_folder_options($folder, 0, \%in); # Save the folder $folder->{'name'} = $in{'name'}; $folder->{'server'} = $in{'server'}; $folder->{'port'} = $in{'port_def'} ? undef : $in{'port'}; $folder->{'user'} = $in{'user'}; $folder->{'pass'} = $in{'pass'}; $folder->{'perpage'} = $in{'perpage_def'} ? undef : $in{'perpage'}; $folder->{'fromaddr'} = $in{'fromaddr_def'} ? undef : $in{'fromaddr'}; $folder->{'sent'} = $in{'sent'}; local @err = &pop3_login($folder); if ($err[0] == 0) { &error($err[1]); } elsif ($err[0] == 2) { &error(&text('save_elogin', $err[1])); } else { &pop3_logout($err[1]); } &save_folder($folder, $old); } &redirect("list_folders.cgi"); mailbox/save_sig.cgi0100775000567100000000000000056010206546360014342 0ustar jcameronroot#!/usr/local/bin/perl # save_sig.cgi # Update the user's signature file require './mailbox-lib.pl'; $sf = &get_signature_file(); $sf || &error($text{'sig_enone'}); &ReadParseMime(); $in{'sig'} =~ s/\r//g; $in{'sig'} =~ s/\n*$/\n/; &open_tempfile(SIG, ">$sf") || &error(&text('sig_eopen', $!)); &print_tempfile(SIG, $in{'sig'}); &close_tempfile(SIG); &redirect(""); mailbox/save_virt.cgi0100775000567100000000000000144410275562664014561 0ustar jcameronroot#!/usr/local/bin/perl # Create, modify or delete a virtual folder require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); if (!$in{'new'}) { $folder = $folders[$in{'idx'}]; $old = { %$folder }; } &error_setup($text{'save_err'}); if ($in{'delete'}) { # Just delete this folder file &delete_folder($old); } else { # Validate inputs $in{'name'} =~ /\S/ || &error($text{'save_ename'}); &parse_folder_options($folder, 0, \%in); # Save the folder $folder->{'type'} = 6; $folder->{'name'} = $in{'name'}; $folder->{'delete'} = $in{'delete'}; $folder->{'perpage'} = $in{'perpage_def'} ? undef : $in{'perpage'}; $folder->{'fromaddr'} = $in{'fromaddr_def'} ? undef : $in{'fromaddr'}; $folder->{'sent'} = $in{'sent'}; &save_folder($folder, $old); } &redirect("list_folders.cgi"); mailbox/search_form.cgi0100775000567100000000000000470610263106223015031 0ustar jcameronroot#!/usr/local/bin/perl # search_form.cgi # Display a form for searching a mailbox require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders_sorted(); ($folder) = grep { $_->{'index'} == $in{'folder'} } @folders; &set_module_index($in{'folder'}); &ui_print_header(undef, $text{'sform_title'}, ""); print "
    \n"; print " $text{'sform_and'}\n"; print " $text{'sform_or'}

    \n"; print "\n"; #print " ", # " ", # "\n"; for($i=0; $i<=9; $i++) { print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } print "
    $text{'sform_field'}$text{'sform_mode'}$text{'sform_for'}
    $text{'sform_where'}$text{'sform_text'}
    \n"; # Status to find print "\n"; print "\n"; print "\n"; # Limit on number of messages to search print "\n"; print "\n"; # Destination for search print "\n"; print "\n"; print "
    $text{'search_status'}",&ui_radio("status_def", 1, [ [ 1, $text{'search_allstatus'} ], [ 0, $text{'search_onestatus'} ] ]),"\n", &ui_select("status", 2, [ [ 0, $text{'view_mark0'} ], [ 1, $text{'view_mark1'} ], [ 2, $text{'view_mark2'} ] ]),"
    $text{'search_latest'}",&ui_opt_textbox("limit", $userconfig{'search_latest'}, 10, $text{'search_nolatest'}, $text{'search_latestnum'}),"
    $text{'search_dest'}",&ui_opt_textbox("dest", undef, 30, $text{'search_dest1'}, $text{'search_dest0'}),"
    \n"; $extra = <$text{'sform_all'} \n"; &ui_print_footer("index.cgi?folder=$in{'folder'}", $text{'mail_return'}); mailbox/send_mail.cgi0100755000567100000000000003402010441151264014465 0ustar jcameronroot#!/usr/local/bin/perl # send_mail.cgi # Send off an email message require './mailbox-lib.pl'; # Check inputs &ReadParseMime(); &set_module_index($in{'folder'}); @folders = &list_folders(); $folder = $folders[$in{'folder'}]; &error_setup($text{'send_err'}); $in{'draft'} || $in{'to'} || &error($text{'send_eto'}); if (!$in{'subject'}) { if ($userconfig{'force_subject'} eq 'error') { &error($text{'send_esubject'}); } elsif ($userconfig{'force_subject'}) { $in{'subject'} = $userconfig{'force_subject'}; } } @sub = split(/\0/, $in{'sub'}); $subs = join("", map { "&sub=$_" } @sub); # Construct the email if ($config{'edit_from'} == 2) { $in{'user'} || &error($text{'send_efrom'}); $in{'from'} = $in{'dom'} ? "$in{'user'}\@$in{'dom'}" : $in{'user'}; if ($in{'real'}) { $in{'from'} = "\"$in{'real'}\" <$in{'from'}>"; } } else { $in{'from'} || &error($text{'send_efrom'}); } $in{'to'} = &expand_to($in{'to'}); $in{'cc'} = &expand_to($in{'cc'}); $in{'bcc'} = &expand_to($in{'bcc'}); $newmid = "<".time().".".$$."\@".&get_system_hostname().">"; $mail->{'headers'} = [ [ 'From', $in{'from'} ], [ 'Subject', $in{'subject'} ], [ 'To', $in{'to'} ], [ 'Cc', $in{'cc'} ], [ 'Bcc', $in{'bcc'} ], [ 'X-Originating-IP', $ENV{'REMOTE_ADDR'} ], [ 'X-Mailer', "Usermin ".&get_webmin_version() ], [ 'Message-Id', $newmid ] ]; push(@{$mail->{'headers'}}, [ 'X-Priority', $in{'pri'} ]) if ($in{'pri'}); push(@{$mail->{'headers'}}, [ 'In-Reply-To', $in{'rid'} ]) if ($in{'rid'}); if ($userconfig{'req_dsn'} == 1 || $userconfig{'req_dsn'} == 2 && $in{'dsn'}) { push(@{$mail->{'headers'}}, [ 'Disposition-Notification-To', $in{'from'} ]); push(@{$mail->{'headers'}}, [ 'Read-Receipt-To', $in{'from'} ]); } if ($in{'replyto'}) { # Add real name to reply-to address, if not given and if possible local $r2 = $in{'replyto'}; local ($r2parts) = &split_addresses($r2); $r2 = $r2parts->[1] || !$userconfig{'real_name'} || !$remote_user_info[6] ? $in{'replyto'} : "\"$remote_user_info[6]\" <$r2parts->[0]>"; push(@{$mail->{'headers'}}, [ 'Reply-To', $r2 ]); } $in{'body'} =~ s/\r//g; if ($in{'body'} =~ /\S/) { # Perform spell check if requested local $plainbody = $in{'html_edit'} ? &html_to_text($in{'body'}) : $in{'body'}; if ($in{'spell'}) { pipe(INr, INw); pipe(OUTr, OUTw); select(INw); $| = 1; select(OUTr); $| = 1; select(STDOUT); if (!fork()) { close(INw); close(OUTr); untie(*STDIN); untie(*STDOUT); untie(*STDERR); open(STDOUT, ">&OUTw"); open(STDERR, ">/dev/null"); open(STDIN, "<&INr"); exec("ispell -a"); exit; } close(INr); close(OUTw); local $indent = " " x 4; local @errs; foreach $line (split(/\n+/, $plainbody)) { next if ($line !~ /\S/); print INw $line,"\n"; local @lerrs; while(1) { ($spell = ) =~ s/\r|\n//g; last if (!$spell); if ($spell =~ /^#\s+(\S+)/) { # Totally unknown word push(@lerrs, $indent.&text('send_eword', "".&html_escape($1)."")); } elsif ($spell =~ /^&\s+(\S+)\s+(\d+)\s+(\d+):\s+(.*)/) { # Maybe possible word, with options push(@lerrs, $indent.&text('send_eword2', "".&html_escape($1)."", "".&html_escape($4)."")); } elsif ($spell =~ /^\?\s+(\S+)/) { # Maybe possible word push(@lerrs, $indent.&text('send_eword', "".&html_escape($1)."")); } } if (@lerrs) { push(@errs, &text('send_eline', "".&html_escape($line)."")."
    ".join("
    ", @lerrs)."

    \n"); } } close(INw); close(OUTr); if (@errs) { # Spelling errors found! &mail_page_header($text{'compose_title'}); print "$text{'send_espell'}

    \n"; print @errs; &ui_print_footer( "javascript:back()", $text{'reply_return'}, "index.cgi?folder=$in{'folder'}", $text{'mail_return'}); exit; } } local $mt = $in{'html_edit'} ? "text/html" : "text/plain"; $mt .= "; charset=$userconfig{'charset'}"; if ($in{'body'} =~ /[\177-\377]/) { # Contains 8-bit characters .. need to make quoted-printable $quoted_printable++; @attach = ( { 'headers' => [ [ 'Content-Type', $mt ], [ 'Content-Transfer-Encoding', 'quoted-printable' ] ], 'data' => quoted_encode($in{'body'}) } ); } else { # Plain 7-bit ascii text @attach = ( { 'headers' => [ [ 'Content-Type', $mt ], [ 'Content-Transfer-Encoding', '7bit' ] ], 'data' => $in{'body'} } ); } $bodyattach = $attach[0]; } $attachsize = 0; foreach $i (0 .. 5) { # Add uploaded attachment next if (!$in{"attach$i"}); &test_max_attach($attachsize); if ($config{'max_attach'} && $attachsize > $config{'max_attach'}) { &error(&text('send_eattachsize', $config{'max_attach'})); } local $filename = $in{"attach${i}_filename"}; $filename =~ s/^.*(\\|\/)//; local $type = $in{"attach${i}_content_type"}."; name=\"". $filename."\""; local $disp = "inline; filename=\"".$filename."\""; push(@attach, { 'data' => $in{"attach${i}"}, 'headers' => [ [ 'Content-type', $type ], [ 'Content-Disposition', $disp ], [ 'Content-Transfer-Encoding', 'base64' ] ] }); } foreach $i (0 .. 2) { # Add server-side attachment next if (!$in{"file$i"} || !$config{'server_attach'}); if ($in{"file$i"} !~ /^\//) { $in{"file$i"} = $remote_user_info[7]."/".$in{"file$i"}; } -r $in{"file$i"} && !-d $in{"file$i"} || &error(&text('send_efile', $in{"file$i"})); local @st = stat($in{"file$i"}); &test_max_attach($st[7]); local $data; open(DATA, "<".$in{"file$i"}) || &error(&text('send_efile', $in{"file$i"})); while() { $data .= $_; } close(DATA); $in{"file$i"} =~ s/^.*\///; local $type = &guess_mime_type($in{"file$i"}). "; name=\"".$in{"file$i"}."\""; local $disp = "inline; filename=\"".$in{"file$i"}."\""; push(@attach, { 'data' => $data, 'headers' => [ [ 'Content-type', $type ], [ 'Content-Disposition', $disp ], [ 'Content-Transfer-Encoding', 'base64' ] ] }); } # Add forwarded attachments @fwd = split(/\0/, $in{'forward'}); ($sortfield, $sortdir) = &get_sort_field($folder); if (@fwd) { @mail = &mailbox_list_mails_sorted($in{'idx'}, $in{'idx'}, $folder, 0, undef, $sortfield, $sortdir); $fwdmail = $mail[$in{'idx'}]; &parse_mail($fwdmail); &decrypt_attachments($fwdmail); foreach $s (@sub) { # We are looking at a mail within a mail .. &decrypt_attachments($fwdmail); local $amail = &extract_mail($fwdmail->{'attach'}->[$s]->{'data'}); &parse_mail($amail); $fwdmail = $amail; } foreach $f (@fwd) { &test_max_attach(length($fwdmail->{'attach'}->[$f]->{'data'})); push(@attach, $fwdmail->{'attach'}->[$f]); } } # Add forwarded emails @mailfwdboth = split(/\0/, $in{'mailforward'}); if (@mailfwdboth) { @mailfwd = &messages_from_indexes($folder, \@mailfwdboth); foreach $fwdmail (@mailfwd) { local $headertext; foreach $h (@{$fwdmail->{'headers'}}) { $headertext .= $h->[0].": ".$h->[1]."\n"; } push(@attach, { 'data' => $headertext."\n".$fwdmail->{'body'}, 'headers' => [ [ 'Content-type', 'message/rfc822' ], [ 'Content-Description', $fwdmail->{'header'}->{'subject'} ] ] }); } } if ($in{'sign'} ne '' && !$in{'draft'}) { # Put all the attachments into a single attachment, with the signature # as the second attachment &foreign_require("gnupg", "gnupg-lib.pl"); local @keys = &foreign_call("gnupg", "list_keys"); $key = $keys[$in{'sign'}]; # Create the new attachment push(@{$mail->{'headers'}}, [ 'Content-Type', 'multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"' ] ); local ($tempdata, $tempbody); if (@attach == 1) { # Just use one part $tempdata = &write_attachment($attach[0]); $tempheaders = $attach[0]->{'headers'}; $tempbody = $attach[0]->{'data'}; } else { # Create new attachment containing all the parts local $bound = "sign".time(); foreach $a (@attach) { $tempbody .= "\r\n"; $tempbody .= "--".$bound."\r\n"; $tempbody .= &write_attachment($a); } $tempbody .= "\r\n"; $tempbody .= "--".$bound."--\r\n"; $tempdata ="Content-Type: multipart/mixed; boundary=\"$bound\"\r\n". "\r\n". $tempbody; $tempheaders = [ [ "Content-Type", "multipart/mixed; boundary=\"$bound\"" ] ]; } # Sign the file local $sigdata; local $rv = &foreign_call("gnupg", "sign_data", $tempdata, \$sigdata, $key, 2); if ($rv) { &error(&text('send_esign', $rv)); } @attach = ( { 'data' => $tempbody, 'headers' => $tempheaders }, { 'data' => $sigdata, 'headers' => [ [ "Content-Type", "application/pgp-signature; name=signature.asc" ] ] } ); } $mail->{'attach'} = \@attach; if ($in{'crypt'} ne '' && !$in{'draft'}) { # Encrypt the entire mail &foreign_require("gnupg", "gnupg-lib.pl"); local @keys = &foreign_call("gnupg", "list_keys"); local @ekeys; local $key; if ($in{'crypt'} == -1) { # Find the keys for the To:, Cc: and Bcc: address local @addrs = ( &address_parts($in{'to'}), &address_parts($in{'cc'}), &address_parts($in{'bcc'}) ); local $a; foreach $a (@addrs) { local $found; foreach $k (@keys) { if (&indexof($a, @{$k->{'email'}}) >= 0) { push(@ekeys, $k); $found++; last; } } &error(&text('send_ekey', $a)) if (!$found); } } else { @ekeys = ( $keys[$in{'crypt'}] ); } if ($userconfig{'self_crypt'}) { local ($skey) = grep { $_->{'secret'} } @keys; push(@ekeys, $skey); } local $temp = &transname(); &send_mail($mail, $temp); local ($tempdata, $buf); open(TEMP, $temp); local $dummy = ; # skip From line while(read(TEMP, $buf, 1024) > 0) { $tempdata .= $buf; } close(TEMP); unlink($temp); local $crypted; local $rv = &foreign_call("gnupg", "encrypt_data", $tempdata, \$crypted, \@ekeys, 1); $rv && &error(&text('send_ecrypt', $rv)); # Put into new attachments format $mail->{'headers'} = [ ( grep { lc($_->[0]) ne 'content-type' } @{$mail->{'headers'}} ), [ 'Content-Type', 'multipart/encrypted; protocol="application/pgp-encrypted"' ] ]; $mail->{'attach'} = [ { 'headers' => [ [ 'Content-Transfer-Encoding', '7bit' ], [ 'Content-Type', 'application/pgp-encrypted'] ], 'data' => "Version: 1\n" }, { 'headers' => [ [ 'Content-Transfer-Encoding', '7bit' ], [ 'Content-Type', 'application/octet-stream' ] ], 'data' => $crypted } ]; } # Check for text-only email $textonly = $userconfig{'no_mime'} && !$quoted_printable && @{$mail->{'attach'}} == 1 && $mail->{'attach'}->[0] eq $bodyattach && !$in{'html_edit'}; if (!$userconfig{'send_return'}) { # Tell the user what is happening &mail_page_header($text{'send_title'}); @tos = ( split(/,/, $in{'to'}), split(/,/, $in{'cc'}), split(/,/, $in{'bcc'}) ); $tos = join(" , ", map { "".&html_escape($_)."" } @tos); print &text($in{'draft'} ? 'send_draft' : 'send_sending', $tos || $text{'send_nobody'}),"

    \n"; } if ($in{'draft'}) { # Save in the drafts folder ($dfolder) = grep { $_->{'drafts'} } @folders; $qerr = &would_exceed_quota($dfolder, $mail); &error($qerr) if ($qerr); &lock_folder($dfolder); if ($in{'enew'} && $folder eq $dfolder) { # Update existing draft mail ($dsortfield, $dsortdir) = &get_sort_field($dfolder); @oldmail = &mailbox_list_mails_sorted($in{'idx'}, $in{'idx'}, $dfolder, 0, undef, $dsortfield, $dsortdir); $oldmail = &find_message_by_index(\@oldmail, $dfolder, $in{'idx'}, $in{'mid'}); $oldmail || &error($text{'view_egone'}); &mailbox_modify_mail($oldmail, $mail, $dfolder, $textonly); } else { # Save as a new draft &write_mail_folder($mail, $dfolder, $textonly); } &unlock_folder($dfolder); } else { # Send it off and optionally save in sent mail if ($userconfig{'save_sent'}) { local ($sfolder) = grep { $_->{'sent'} } @folders; $qerr = &would_exceed_quota($sfolder, $mail); &error($qerr) if ($qerr); } $notify = $userconfig{'req_del'} == 1 || $userconfig{'req_del'} == 2 && $in{'del'} ? [ "SUCCESS","FAILURE" ] : undef; &send_mail($mail, undef, $textonly, $config{'no_crlf'}, undef, undef, undef, undef, $notify); if ($userconfig{'save_sent'}) { local ($sfolder) = grep { $_->{'sent'} } @folders; &lock_folder($sfolder); &write_mail_folder($mail, $sfolder, $textonly) if ($sfolder); &unlock_folder($sfolder); } } # Mark the new message as read &open_read_hash(); if ($userconfig{'auto_mark'}) { $read{$newmid} ||= 1; } if ($in{'abook'}) { # Add all recipients to the address book, if missing local @recips = ( &split_addresses($in{'to'}), &split_addresses($in{'cc'}), &split_addresses($in{'bcc'}) ); local @addrs = &list_addresses(); foreach $r (@recips) { local ($already) = grep { $_->[0] eq $r->[0] } @addrs; if (!$already) { &create_address($r->[0], $r->[1]); push(@addrs, [ $r->[0], $r->[1] ]); } } } if ($userconfig{'send_return'}) { # Return to mail list &redirect("index.cgi?folder=$in{'folder'}"); } else { # Print footer print "$text{'send_done'}

    \n"; if ($in{'idx'} ne '') { &mail_page_footer( "view_mail.cgi?idx=$in{'idx'}&folder=$in{'folder'}&mid=". &urlize($in{'mid'})."$subs", $text{'view_return'}, "index.cgi?folder=$in{'folder'}", $text{'mail_return'}); } else { &mail_page_footer( "reply_mail.cgi?new=1&folder=$in{'folder'}", $text{'reply_return'}, "index.cgi?folder=$in{'folder'}", $text{'mail_return'}); } } # write_attachment(&attach) sub write_attachment { local ($a) = @_; local ($enc, $rv); foreach $h (@{$a->{'headers'}}) { $rv .= $h->[0].": ".$h->[1]."\r\n"; $enc = $h->[1] if (lc($h->[0]) eq 'content-transfer-encoding'); } $rv .= "\r\n"; if (lc($enc) eq 'base64') { local $encoded = &encode_base64($a->{'data'}); $encoded =~ s/\r//g; $encoded =~ s/\n/\r\n/g; $rv .= $encoded; } else { $a->{'data'} =~ s/\r//g; $a->{'data'} =~ s/\n/\r\n/g; $rv .= $a->{'data'}; if ($a->{'data'} !~ /\n$/) { $rv .= "\r\n"; } } return $rv; } sub test_max_attach { $attachsize += $_[0]; if ($config{'max_attach'} && $attachsize > $config{'max_attach'}) { &error(&text('send_eattachsize', $config{'max_attach'})); } } mailbox/sort.cgi0100775000567100000000000000051410261642571013532 0ustar jcameronroot#!/usr/local/bin/perl # Adjust the sort order and field, and return to the index require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); ($folder) = grep { $_->{'index'} == $in{'folder'} } @folders; &save_sort_field($folder, $in{'field'}, $in{'dir'}); &redirect("index.cgi?folder=$in{'folder'}&start=$in{'start'}"); mailbox/uconfig.info0100664000567100000000000000722510432464230014363 0ustar jcameronrootline0=User interface,11 perpage=Mail messages to display per page,0,5 wrap_width=Width to wrap mail messages at,0,5 top_buttons=Show buttons at top for,1,2-Mailboxes and mails,1-Mailboxes only,0-Never arrows=Show pager arrows at bottom for,1,2-Mailboxes and mails,1-Mailboxes only,0-Never show_to=Show To: address in mailboxes?,1,1-Yes,0-No auto_mark=Automatically mark read messages?,1,1-Yes,0-No refresh=Seconds between automatic mailbox refreshes,3,Don't refresh view_html=Show message body as,4,0-Always plain text,1-Text if possible, HTML otherwise,2-HTML if possible, text otherwise,3-Convert HTML to plain text head_html=Include HTML from message section on page?,1,1-Yes,0-No html_edit=Use HTML editor for composing?,1,2-Always,1-When replying to HTML email,0-Never html_quote=HTML quoting mode,1,1-Message below <hr>,0-Message inside <blockquote> reply_date=Include date when quoting email,1,1-Yes,0-No check_mod=Check for mailbox modification when deleting mail?,1,1-Yes,0-No open_mode=Open messages in,1,1-New window,0-List window link_mode=Open links in,1,1-New window,0-Same window spell_check=Enable spell checking by default?,1,1-Yes,0-No date_fmt=Date format in mail list,1,dmy-DD/MM/YYYY,mdy-MM/DD/YYYY,ymd-YYYY/MM/DD date_tz=Timezone for date displays,3,System default line1=Sending email,11 no_mime=Send text-only messages when possible?,1,1-Yes,0-No save_sent=Save sent mail?,1,1-Yes,0-No real_name=Include real name in From: address?,1,1-Yes,0-No charset=Character set for sent mail,0,15 sig_file=Signature file,10,*-None,.signature-~/.signature,Other file self_crypt=Encrypt email with your secret key too?,1,1-Yes,0-No fwd_mode=Forward messages with quoting?,1,0-Yes,1-No from_in_to=Show From: addresses when selecting a To: address?,1,1-Yes,0-No sort_addrs=Sort address book by,1,0-Order added,1-Real name,2-Email address reply_to=Reply-to: address,10,x-None,*-Choose when sending,Address.. req_dsn=Request read status notifications?,1,1-Always,2-Optionally,0-No send_dsn=Respond to read status notifications?,1,1-Automatically,2-Manually,0-No req_del=Request delivery status notifications?,1,1-Always,2-Optionally,0-No bcc_to=Bcc: sent messages to,0 add_abook=Add email recipients to address book?,1,1-Yes,0-No real_expand=Lookup real names when sending?,1,1-Yes,0-No force_subject=Action if email subject is missing,10,-Do nothing,error-Display error,Set to send_return=After sending mail, show,1,1-Mail list,0-Mail Sent page line3=Mail folders,11 mailbox_dir=Mailboxes directory under home directory,0,30 mailbox_recur=Treat mailbox subdirectories as,1,1-Folders,0-Subdirectories default_folder=Default folder file,3,Inbox delete_warn=Ask for confirmation before deleting?,10,y-Yes,n-No,For mbox files larger than delete_mode=When deleting mail,1,0-Just delete from mail file,1-Move to Trash folder folder_sort=Folder sort mode,4,0-Builtin, then ~/mail, then external,1-Builtin, then rest sorted by name,2-All sorted by name related_search=Search for same subject or sender in,1,1-All folders,2-All local folders,0-Current folder search_latest=Messages to search,10,-All messages,Only latest show_body=Show message body previews in list?,1,1-Yes,0-No show_delall=Show button to delete entire mailbox?,1,1-Yes,0-No line4=Spam options,11 spam_buttons=Show spam reporting buttons for,2,list-Mailboxes,mail-Messages ham_buttons=Show ham reporting buttons for,2,list-Mailboxes,mail-Messages spam_del=Delete spam when reporting?,1,1-Yes,0-No line5=Attachment options,11 thumbnails=Show image attachments as thumbnails
    (Requires cjpeg, djpeg and PNM library commands),1,1-Yes,0-No download=Attachment MIME types to always download,9,20,4,\t mailbox/uconfig.info.cz0100644000567100000000000000646410370226636015007 0ustar jcameronrootline0=Uživatelské rozhraní,11 perpage=Počet zpráv zobrazených na jedné stránce,0,5 wrap_width=Šířka pro automatické odřádkování,0,5 top_buttons=Zobrazovat tlačítka v záhlaví,1,2-Složek i zpráv,1-Jen ve složkách,0-Nikde arrows=Stránkovací šipky zobrazovat pro,1,2-Seznamy zpráv i jednotlivé zprávy,1-Jen v seznamech zpráv,0-Nikdy show_to=Zobrazovat v seznamech zpráv adresu příjemce?,1,1-Ano,0-Ne auto_mark=Automaticky označovat zprávy jako přečtené?,1,1-Ano,0-Ne thumbnails=Zobrazit obrázky z příloh jako náhledy
    (Vyžaduje knihovny příkazů cjpeg, djpeg a PNM),1,1-Ano,0-Ne refresh=Interval automatického obnovení schránky,3,Neobnovovat view_html=Tělo zprávy zobrazovat jako,4,0-Vždy čistý text,1-Čistý text pokud to jde, jinak HTML ,2-HTML pokud tom jde, jinak text,3-Převádět HTML na čistý text html_edit=Pro psaní zpráv používat HTML editor?,1,2-Vždy,1-Při odpovědi na maily v HTML,0-Nikdy html_quote=Způsob označení citování v HTML,1,1-Zprávy pod <hr>,0-Zprávy uvnitř <blockquote> reply_date=Při citování emailu doplňovat datum?,1,1-Ano,0-Ne check_mod=Při mazání mailu kontrolovat modifikace schránky?,1,1-Ano,0-Ne open_mode=Zprávy otevírat v,1,1-Novém okně,0-Okně seznamu link_mode=Odkazy otevirat v,1,1-Novém okně,0-Původním okně line1=Odesílání zpráv,11 no_mime=Posílat pokud možno zprávy pouze v textovém tvaru?,1,1-Ano,0-Ne save_sent=Ukládat odesílané zprávy:,1,1-Ano,0-Ne real_name=Vkládat skutečná jména do pole odesilatele?,1,1-Ano,0-Ne charset=Znaková sada pro odeslání mailu,0,15 sig_file=Soubor s textovým podpisem,10,*-Žádný,.signature-~/.signature,Jiný soubor self_crypt=Zašifrovat zprávu rovněž Vaším neveřejným klíčem?,1,1-Ano,0-Ne fwd_mode=Uvozovat přeposílané zprávy?,1,0-Ano,1-Ne from_in_to=Zobrazovat adresu odesilatele při výběru adresy příjemce?,1,1-Ano,0-Ne sort_addrs=Adresář řadit podle,1,0-Pořadí vložení,1-Skutečného jména,2-Emailové adresy reply_to=Adresa pro odpověď,10,x-Není,*-Zvolit při odesílání,Adresa.. req_dsn=Požadovat potvrzení o přečtení?,1,1-Vždy,2-Volitelně,0-Nikdy send_dsn=Odpověď na požadavek předání upozornění,1,1-Automaticky,2-Ručně,0-Nikdy req_del=Požadovat potvrzení o doručení?,1,1-Vždy,2-Volitelně,0-Nikdy bcc_to=Bcc: skryté kopie zpráv zasílat na,0 add_abook=Přidat příjemce do adresáře?,1,1-Ano,0-Ne real_expand=Při odesílání hledat skutečná jména?,1,1-Ano,0-Ne line3=Složky zpráv mailbox_dir=Adresář se schránkami pod domovským adresářem,0,30 mailbox_recur=Podadresáře schránek chápatjako,1,1-Složky,0-Podadresáře default_folder=Implicitní soubor složky,3,Přijatá delete_warn=Potvrzovat mazání?,10,y-Ano,n-Ne,Pro soubory schránek větší než delete_mode=Smazané zprávy,1,0-Prostě odstranit ze složky,1-Přesunout do koše folder_sort=Způsob řazení složek,4,0-Vestavěné, pak ~/mail, nakonec externí,1-Vestavěné, potom ostatní řazené podle jména,2-Seřadit všechny podle jmen related_search=Stejný předmět či odesilatele hledat ,1,1-Ve všech složkách,2-V lokálních složkách,0-V aktuální složce search_latest=Prohledávané zprávy,10,-Všechny zprávy,Jen posledních show_body=V seznamu ukazovat náhledy zpráv?,1,1-Ano,0-Ne line4=Volby pro Spam spam_buttons=Tlačítka pro hlášení SPAMu zobrazovat,2,list-Seznamech zpráv,mail-Zprávách ham_buttons=Tlačítka pro označení za platné (HAM) zobrazovat pro,2,list-Seznamy zpráv,mail-Zprávy spam_del=Smazat SPAM po nahlášení?,1,1-Ano,0-Ne mailbox/uconfig.info.de0100644000567100000000000001137010451253201014737 0ustar jcameronrootline0=Benutzeroptionen,11 perpage=Anzahl von anzuzeigenden Nachrichten pro Seite,0,5 wrap_width=Zeilenumbruch bei Zeichen (70 empfohlen),0,5 top_buttons=Zeige Buttons oben an für,1,2-Mailboxen und Mails,1-Nur für Mailboxen,0-Niemals arrows=Zeige Verlaufsknöpfe unten an für,1,2-Mailboxen und Mails,1-Nur für Mailboxen,0-Niemals show_to=Zeige Empfängeradressen in Mailboxen?,1,1-Ja,0-Nein (empfohlen) auto_mark=Markiere gelesene Mails automatisch als gelesen?,1,1-Ja,0-Nein refresh=Neueinlesen der Mailbox in Sekunden,3,Nicht aktualisieren view_html=Zeige Nachrichten an als,4,0-Immer text/plain (empfohlen),1-Text wenn möglich (ansonsten HTML),2-HTML wenn möglich (ansonsten text/plain),3-Konvertiere HTML nach text/plain (geht nicht immer) head_html=Füge HTML aus dem -Anteil für Nachricht ein?,1,1-Ja,0-Nein html_edit=Benutze den HTML-Editor beim Mailversand,1,2-Immer,1-Nur beim Antworten auf HTML-Mails,0-Niemals (empfohlen) html_quote=Zitierverhalten bei HTML-Mails,1,1-Nachricht unterhalb <hr>,0-Nachricht innerhalb <blockquote> reply_date=Datum einfügen beim zitierten Antworten auf eine Mail,1,1-Ja,0-Nein check_mod=Achte auf Mailboxänderungen, wenn Mails gelöscht werden?,1,1-Ja (empfohlen),0-Nein open_mode=Öffne Nachrichten in,1,1-Neuem Fenster,0-Listenanzeige link_mode=Öffne Links in,1,1-Neuem Fenster,0-Gleichen Fenster spell_check=Rechtschreibprüfung standardmäßig aktivieren?,1,1-Ja,0-Nein date_fmt=Datumsformat für Nachrichtenliste,1,dmy-TT/MM/JJJJ,mdy-MM/TT/JJJJ,ymd-JJJJ/MM/TT date_tz=Zeitzone für Datumsanzeige,3,Systemstandard line1=Mailversand,11 no_mime=Versende Nur Text-Nachrichten, wenn möglich?,1,1-Ja (Sehr empfohlen),0-Nein save_sent=Versendete Mails speichern?,1,1-Ja,0-Nein real_name=Realnamen in Absendadressen einfügen?,1,1-Ja (Sehr empfohlen),0-Nein charset=Kodierung für zu versendene Mails (iso-8859-1 empfohlen),0,15 sig_file=Signaturvorlage,10,*-Keine,.signature-~/.signature,Andere Datei self_crypt=Jede Mail mit Ihrem geheimen Schlüssel zusätzlich verschlüsseln?,1,1-Ja,0-Nein (empfohlen) fwd_mode=Zitierte Weiterleitung von Mails?,1,0-Ja (empfohlen),1-Nein from_in_to=Zeige Absenderadressen, wenn eine Empfängeradresse ausgewählt wird?,1,1-Ja,0-Nein sort_addrs=Sortiere das Adressbuch nach,1,0-Einstellungsreihenfolge,1-Realname,2-Mailadresse reply_to=Beantwortadresse,10,x-Keine,*-Beim Versenden auswählen,Diese .. req_dsn=Eine Lesebestätigung anfordern?,1,1-Immer,2-Optional,0-Nein (empfohlen) send_dsn=Auf Übermittlungsbestätigungen antworten?,1,1-Automatisch,2-Manuell,0-Nein (empfohlen) req_del=Immer eine Übermittlungsbestätigung abfordern,1,1-Immer,2-Optional,0-Nein (empfohlen) bcc_to=Sende Nachrichten via BCC an,0 add_abook=Empfänger zum Adressbuch hinzufügen?,1,1-Ja,0-Nein real_expand=Realnamen beim Versand nachschlagen?,1,1-Ja,0-Nein force_subject=Wenn die Betreffzeile leer ist,10,-Nichts machen,error-Fehler anzeigen,Setzen auf send_return=Nach dem Nachrichtenversand zeige,1,1-Nachrichtenliste,0-Statusseite line3=Mailordner,11 mailbox_dir=Mailboxverzeichnis unterhalb Heimatverzeichnis,0,30 mailbox_recur=Verwende Mailboxunterverzeichnisse als,1,1-Ordner,0-Unterverzeichnisse default_folder=Standardordner für eingehende Mails,3,Posteingang delete_warn=Bestätigungsabfrage vor dem Löschen von Mails?,10,y-Ja (empfohlen),n-Nein,Für mbox-Dateien größer als delete_mode=Wenn Mails gelöscht werden,1,0-Aus der Maildatei löschen,1-In den Papierkorb verschieben folder_sort=Sortiermodus,4,0-Eingebaut, dann ~/mail, dann externe,1-Eingebaut, dann den Rest nach Name,2-Alles nach Name sortiert related_search=Suche nach gleichen Betreffzeilen und Versendern in,1,1-Allen Ordnen (Deaktiviert die Löschmöglichkeit),2-Alle lokalen Ordner (Deaktiviert die Löschmöglichkeit),0-Momentaner Ordner (Löschen möglich) search_latest=Zu durchsuchende Nachrichten,10,-Alle Nachrichten,Nur die neuesten show_body=Zeige Nachrichtenvorschau in der Liste an?,1,1-Ja,0-Nein show_delall=Zeige Knopf an, um die ganze Mailbox auf einmal zu löschen?,1,1-Ja,0-Nein line4=Spamoptionen,11 spam_buttons=Zeige Spamreport-Buttons an für,2,list-Mailboxen,mail-Nachrichten ham_buttons=Zeige HAM-Reporting-Buttons an für,2,list-Mailboxen,mail-Nachrichten spam_del=Lösche Spam nach dem Report?,1,1-Ja,0-Nein line5=Optionen für Anhänge,11 thumbnails=Zeige Vorschaubilder an
    (Benötigt die cjpeg, djpeg und PNM-Bibliotheken),1,1-Ja,0-Nein download=MIME-Arten für Anhänge, die immer heruntergeladen werden sollen,9,20,4,\t mailbox/uconfig.info.it0100664000567100000000000000643310335733264015006 0ustar jcameronrootline0=interfaccia utente,11 perpage=messaggi mail da esporre per pagina,0,5 wrap_width=larghezza in colonne del messaggio,0,5 top_buttons=mostra bottoni in alto per ,1,2-caselle e messaggi,1-solo cartella,0-mai arrows=mostra frecce pager in fondo per ,1,2-caselle e messaggi,1-colo caselle,0-mai show_to=mostra A: indirizzo nelle caselle?,1,1-si,0-no auto_mark=segna automaticamente i messaggi come letti?,1,1-si,0-no thumbnails=mostral immagini allegate come miniature
    (richiede cjpeg, djpeg e comandi libreria PNM ),1,1-si,0-no refresh=ogni quanti secondi ricaricare la pagina?,3,mai view_html=mostra il messaggio come ,4,0-sempre testo,1-testo se possibile, altrimenti HTML,2-HTML se possibile, testo altrimenti,3-converti HTML in testo html_edit=usa editor HTML per la compisizione?,1,2-sempre,1-quando rispondi a messaggi HTML ,0-mai html_quote=modalitĂ  risposta HTML ,1,1-messaggio sotto<hr>,0-messaggio dentro <blockquote> reply_date=includi data nella risposta email ,1,1-si,0-no check_mod=controlla modifica casella prima di eliminare messaggi?,1,1-si,0-no open_mode=apri messaggi in ,1,1-nuova finestra,0-finestra lista link_mode=apri link in ,1,1-nuova finestra,0-stessa finestra line1=invio messaggi,11 no_mime=invia formato testo se possibile?,1,1-si,0-no save_sent=salva messaggi inviati?,1,1-si,0-no real_name=includi nome reale nell'indirizzo Da: ?,1,1-si,0-no charset=set di carattere impostato per invio messaggi,0,15 sig_file=file di firma,10,*-nessuna,.signature-~/.signature,altro file self_crypt=cripta messaggi con la tua chiave segreta?,1,1-si,0-no fwd_mode=inoltra messaggi con quoting?,1,0-si,1-no from_in_to=mostra indirizzi Da: quando selezioni indirizzi A:?,1,1-si,0-no sort_addrs=ordina rubrica per ,1,0-ordine aggiunto,1-nome reale,2-indirizzo email reply_to=indirizzo a cui ricevere le risposte ,10,x-none,*-scegli in fase di invio,indirizzo.. req_dsn=richiedi notifica dello status lettura?,1,1-sempre,2-opzionale,0-no send_dsn=rispondi alla notifica di status lettura?,1,1-automaticamente,2-manualmente,0-no req_del=richiedi notifica stato consegna?,1,1-sempre,2-opzionale,0-no bcc_to=Bcc: messaggi inviato a ,0 add_abook=aggiungi destinatari email alla rubrica?,1,1-si,0-no real_expand=cerca nomi reali durante la spedizione?,1,1-si,0-no line3=cartelle di posta,11 mailbox_dir=directory di mailbox sotto la home directory,0,30 mailbox_recur=gestisci subdirectories mailbox come,1,1-cartelle,0-subdirectories default_folder=cartella default,3,arrivo delete_warn=chiedi conferma prima di eliminare?,10,y-si,n-no,per cartelle con dimesione maggiore di delete_mode=quando elimini messaggi,1,0-elimina definitivamente messaggio,1-sposta nel cestino folder_sort=ordinamento cartelle,4,0-Builtin, then ~/mail, poi external,1-Builtin, then le rimanenti in ordine di nome,2-tutte in ordine di nome related_search=cerca stesso oggetto o mittente in,1,1-tutte le cartelle,2-tutte le cartelle locali,0-cartela corrente search_latest=messaggi da cercare,10,-tutti,solo ultimi show_body=mostra anteprima messaggio in lista??,1,1-si,0-no line4=Spam options,11 spam_buttons=mostra pulsante segnalazione spam per ,2,list-cartelle,mail-messaggi ham_buttons=mostra pulsante segnalazione ham per,2,list-cartelle,mail-messaggi spam_del=elimina spam segnalato?,1,1-si,0-nomailbox/uconfig.info.nl0100644000567100000000000000153007561615074014777 0ustar jcameronrootperpage=Aantal berichten per pagina in lijst,0 wrap_width=Maximale regellengte voor e-mail bericht,0 top_buttons=Toon knoppen bovenaan voor,1,2-Folders en berichten,1-Alleen berichten,0-Nooit show_to=Toon ontvangeradres in folders,1,1-Ja,0-Nee no_mime=Codeer berichten met alleen tekst niet met MIME?,1,1-Ja,0-Nee mailbox_dir=Folder directory onder home directory,0 mailbox_recur=Behandel folder subdirectories als,1,1-Folders,0-Subdirectories save_sent=Bewaar verzonden e-mail?,1,1-Ja,0-Nee auto_mark=Markeer gelezen bericht automatisch?,1,1-Ja,0-Nee default_folder=Standaard folder,3,Inbox thumbnails=Toon bijlage als pasfoto's
    (Vereist cjpeg, djpeg en PNM library commando's),1,1-Ja,0-Nee sort_addrs=Sorteer adresboek op,1,0-Als toegevoegd,1-Persoonsnaam,2-E-mailadres real_name=Toon persoonsnaam in afzenderadres?,1,1-Ja,0-Nee mailbox/view_mail.cgi0100755000567100000000000004565710441151261014525 0ustar jcameronroot#!/usr/local/bin/perl # view_mail.cgi # View a single email message require './mailbox-lib.pl'; $force_charset = ''; &ReadParse(); foreach $a (&list_addresses()) { $inbook{$a->[0]}++; } @folders = &list_folders_sorted(); ($folder) = grep { $_->{'index'} == $in{'folder'} } @folders; $qmid = &urlize($in{'mid'}); if ($in{'idx'} =~ /^(\d+)\/(.*)$/) { # Fix links where idx contains index and message ID (when in open_mode) $in{'idx'} = $1; $in{'mid'} = $2; } @mail = &mailbox_list_mails_sorted($in{'idx'}, $in{'idx'}, $folder, 0, undef); $mail = &find_message_by_index(\@mail, $folder, $in{'idx'}, $in{'mid'}); $mail || &error($text{'view_egone'}); ¬es_decode($mail, $folder); &parse_mail($mail, undef, $in{'raw'}); @sub = split(/\0/, $in{'sub'}); $subs = join("", map { "&sub=$_" } @sub); foreach $s (@sub) { # We are looking at a mail within a mail .. &decrypt_attachments($mail); local $amail = &extract_mail($mail->{'attach'}->[$s]->{'data'}); &parse_mail($amail, undef, $in{'raw'}); $mail = $amail; } # Mark this mail as read &open_read_hash(); $mid = $mail->{'header'}->{'message-id'}; if ($userconfig{'auto_mark'}) { eval { $read{$mid} = 1 } if (!$read{$mid}); } # Possibly send a DSN, or check if one is needed $dsn_req = &requires_delivery_notification($mail); if (!@sub && $dsn_req && !$folder->{'sent'} && !$folder->{'drafts'}) { dbmopen(%dsn, "$user_module_config_directory/dsn", 0600); if ($userconfig{'send_dsn'} == 1 && !$dsn{$mid}) { # Send a DSN for this mail now local $dsnaddr = &send_delivery_notification($mail, undef, 0); if ($dsnaddr) { $dsn{$mid} = time()." ".$dsnaddr; $sent_dsn = 1; } } elsif ($userconfig{'send_dsn'} == 2 && !$dsn{$mid}) { # User may want to send one $send_dsn_button = 1; } ($sent_dsn_at, $sent_dsn_to) = split(/\s+/, $dsn{$mid}, 2); dbmclose(%dsn); } # Check if we have gotten back a DSN for *this* email &update_delivery_notification($mail, $folder); &open_dsn_hash(); if (defined($dsnreplies{$mid}) && $dsnreplies{$mid} != 1) { ($got_dsn, $got_dsn_from) = split(/\s+/, $dsnreplies{$mid}, 2); } if (defined($delreplies{$mid}) && $delreplies{$mid} != 1) { local @del = split(/\s+/, $delreplies{$mid}); local $i; for($i=0; $i<@del; $i+=2) { local $tm = localtime($del[$i]); if ($del[$i+1] =~ /^\!(.*)$/) { push(@delmsgs, &text('view_delfailed', "$1", $tm)); } else { push(@delmsgs, &text('view_delok', $del[$i+1], $tm)); } } } if ($in{'raw'}) { # Special mode - viewing whole raw message print "Content-type: text/plain\n\n"; if ($mail->{'fromline'}) { print $mail->{'fromline'},"\n"; } if (defined($mail->{'rawheaders'})) { #$mail->{'rawheaders'} =~ s/(\S)\t/$1\n\t/g; print $mail->{'rawheaders'}; } else { foreach $h (@{$mail->{'headers'}}) { #$h->[1] =~ s/(\S)\t/$1\n\t/g; print "$h->[0]: $h->[1]\n"; } } print "\n"; print $mail->{'body'}; exit; } # Check for encryption ($deccode, $decmessage) = &decrypt_attachments($mail); @attach = @{$mail->{'attach'}}; # Find body attachment and type ($textbody, $htmlbody, $body) = &find_body($mail, $userconfig{'view_html'}); $body = $htmlbody if ($in{'body'} == 2); $body = $textbody if ($in{'body'} == 1); # Show pre-body HTML if ($body && $body eq $htmlbody && $userconfig{'head_html'}) { $headstuff = &head_html($body->{'data'}); } &set_module_index($in{'folder'}); &mail_page_header($text{'view_title'}, $headstuff); print &check_clicks_function(); &show_arrows(); print "
    \n"; print "

    \n"; print "\n"; print "\n"; print "\n"; print "\n"; print &ui_hidden("body", $in{'body'}),"\n"; foreach $s (@sub) { print "\n"; } # Find any delivery status attachment ($dstatus) = grep { $_->{'type'} eq 'message/delivery-status' } @attach; # XXX look for text/calendar body # Check for signing if (&has_command("gpg") && &foreign_check("gnupg")) { # Check for GnuPG signatures local $sig; foreach $a (@attach) { $sig = $a if ($a->{'type'} =~ /^application\/pgp-signature/); } if ($sig) { # Verify the signature against the rest of the attachment &foreign_require("gnupg", "gnupg-lib.pl"); local $rest = $sig->{'parent'}->{'attach'}->[0]; $rest->{'raw'} =~ s/\r//g; $rest->{'raw'} =~ s/\n/\r\n/g; ($sigcode, $sigmessage) = &foreign_call("gnupg", "verify_data", $rest->{'raw'}, $sig->{'data'}); @attach = grep { $_ ne $sig } @attach; $sindex = $sig->{'idx'}; } elsif ($textbody && $textbody->{'data'} =~ /(-+BEGIN PGP SIGNED MESSAGE-+\n(Hash:\s+(\S+)\n\n)?([\000-\377]+\n)-+BEGIN PGP SIGNATURE-+\n([\000-\377]+)-+END PGP SIGNATURE-+\n)/i) { # Signature is in body text! local $sig = $1; local $text = $4; &foreign_require("gnupg", "gnupg-lib.pl"); ($sigcode, $sigmessage) = &foreign_call("gnupg", "verify_data", $sig); $body = $textbody; if ($sigcode == 0 || $sigcode == 1) { # XXX what about replying? $body->{'data'} = $text; } } } # Strip out attachments not to display as icons @attach = grep { $_ ne $body && $_ ne $dstatus } @attach; @attach = grep { !$_->{'attach'} } @attach; if ($userconfig{'top_buttons'} == 2 && &editable_mail($mail)) { &show_buttons(1, scalar(@sub)); print "

    \n"; } print "\n"; print "\n"; print "
    ", "\n"; print "
    $text{'view_headers'} \n"; if ($in{'headers'}) { print "$text{'view_noheaders'}\n"; } else { print "$text{'view_allheaders'}\n"; } print "  $text{'view_raw'}
    \n"; if ($in{'headers'}) { # Show all the headers if ($mail->{'fromline'}) { print "", "\n"; } foreach $h (@{$mail->{'headers'}}) { print " ", "\n"; } } else { # Just show the most useful headers local @addrs = &split_addresses(&decode_mimewords( $mail->{'header'}->{'from'})); local @toaddrs = &split_addresses(&decode_mimewords( $mail->{'header'}->{'to'})); print " ", "", "\n"; print " ", "", "\n"; print " ", "\n" if ($mail->{'header'}->{'cc'}); print " ", "\n"; local $subj = $mail->{'header'}->{'subject'}; $subj =~ s/^((Re:|Fwd:|\[\S+\])\s*)+//g; print " ", " ", "\n"; } print "
    $text{'mail_rfc'}",&eucconv_and_escape($mail->{'fromline'}), "
    $h->[0]:",&eucconv_and_escape(&decode_mimewords($h->[1])), "
    $text{'mail_from'}",&address_link($mail->{'header'}->{'from'}),"",&search_link("from", $addrs[0]->[0], $text{'mail_fromsrch'}),"
    $text{'mail_to'}",&address_link($mail->{'header'}->{'to'}),"",&search_link("to", $toaddrs[0]->[0], $text{'mail_tosrch'}),"
    $text{'mail_cc'}",&address_link($mail->{'header'}->{'cc'}),"
    $text{'mail_date'}",&eucconv_and_escape($mail->{'header'}->{'date'}), "
    $text{'mail_subject'}",&eucconv_and_escape(&decode_mimewords( $mail->{'header'}->{'subject'})),"",&search_link("subject", $subj, $text{'mail_subsrch'}),"

    \n"; # Show body attachment, with properly linked URLs if ($body && $body->{'data'} =~ /\S/) { if ($body eq $textbody) { # Show plain text $bodycontents = "

    ";
    		foreach $l (&wrap_lines(&eucconv($body->{'data'}),
    					$userconfig{'wrap_width'})) {
    			$bodycontents .= &link_urls_and_escape($l,
    						$userconfig{'link_mode'})."\n";
    			}
    		$bodycontents .= "
    "; if ($htmlbody) { $bodyright = "$text{'view_ashtml'}"; } } elsif ($body eq $htmlbody) { # Attempt to show HTML ($bodycontents, $bodystuff) = &safe_html($body->{'data'}); $bodycontents = &fix_cids($bodycontents, \@attach, "detach.cgi?idx=$in{'idx'}&folder=$in{'folder'}$subs", \@cidattach); if ($textbody) { $bodyright = "$text{'view_astext'}"; } %ciddone = map { $_->{'index'}, 1 } @cidattach; @attach = grep { !$ciddone{$_->{'index'}} } @attach; } } if ($bodycontents) { print "\n"; print "\n"; print "
    ", " ", "
    $text{'view_body'}$bodyright
    \n"; print $bodycontents; print "

    \n"; } # If *this* message is a delivery status, display it if ($dstatus) { local $ds = &parse_delivery_status($dstatus->{'data'}); $dtxt = $ds->{'status'} =~ /^2\./ ? $text{'view_dstatusok'} : $text{'view_dstatus'}; print "\n"; print "\n"; print "
    $dtxt
    \n"; foreach $dsh ('final-recipient', 'diagnostic-code', 'remote-mta', 'reporting-mta') { if ($ds->{$dsh}) { $ds->{$dsh} =~ s/^\S+;//; print "\n"; print "\n"; } } print "
    ", $text{'view_'.$dsh},"",&html_escape($ds->{$dsh}),"

    \n"; } # Display other attachments if (@attach) { print "\n"; print "\n"; print "
    $text{'view_attach'}
    \n"; foreach $a (@attach) { local $fn; $size = (int(length($a->{'data'})/1000)+1)." Kb"; local $cb; if ($a->{'type'} eq 'message/rfc822') { push(@titles, "$text{'view_sub'}
    $size"); } elsif ($a->{'filename'}) { push(@titles, &decode_mimewords($a->{'filename'}). "
    $size"); $fn = &decode_mimewords($a->{'filename'}); push(@detach, [ $a->{'idx'}, $fn ]); } else { push(@titles, "$a->{'type'}
    $size"); $a->{'type'} =~ /\/(\S+)$/; $fn = "file.$1"; push(@detach, [ $a->{'idx'}, $fn ]); } if ($a->{'error'}) { $titles[$#titles] .= "
    ($a->{'error'})"; } $fn =~ s/ /_/g; $fn =~ s/\#/_/g; $fn = &html_escape($fn); if ($a->{'type'} eq 'message/rfc822') { push(@links, "view_mail.cgi?idx=$in{'idx'}&mid=$qmid&folder=$in{'folder'}$subs&sub=$a->{'idx'}"); } else { push(@links, "detach.cgi/$fn?idx=$in{'idx'}&mid=$qmid&folder=$in{'folder'}&attach=$a->{'idx'}$subs"); } if ($userconfig{'thumbnails'} && ($a->{'type'} =~ /image\/gif/i && &has_command("giftopnm")&& &has_command("pnmscale") && &has_command("cjpeg") || $a->{'type'} =~ /image\/jpeg/i && &has_command("djpeg") && &has_command("pnmscale") && &has_command("cjpeg"))) { # Can show an image icon push(@icons, "detach.cgi?scale=1&idx=$in{'idx'}&folder=$in{'folder'}&attach=$a->{'idx'}$subs"); $imgicons++; } else { push(@icons, "images/boxes.gif"); } } &icons_table(\@links, \@titles, \@icons, 6, undef, $imgicons ? ( 0, 0 ) : ( )); if ($config{'server_attach'} == 2 && @detach) { print "\n"; print "\n" if ($body); print "\n" if (defined($sindex)); print "\n"; print "$text{'view_dir'}\n"; print " ", &file_chooser_button("dir", 1),"\n"; } print "

    \n"; } # Display GnuPG results if (defined($sigcode)) { print "\n"; print "\n"; print "
    $text{'view_gnupg'}
    "; $sigmessage = &html_escape($sigmessage); $sigmessage = $sigmessage if ($sigcode == 4); print &text('view_gnupg_'.$sigcode, $sigmessage),"\n"; if ($sigcode == 3) { local $url = "/$module_name/view_mail.cgi?idx=$in{'idx'}&mid=$qmid&folder=$in{'folder'}$subs"; print "

    ",&text('view_recv', $sigmessage, "/gnupg/recv.cgi?id=$sigmessage&return=".&urlize($url)."&returnmsg=".&urlize($text{'view_return'})),"\n"; } print "

    \n"; } if ($deccode) { print "\n"; print "\n"; print "
    $text{'view_crypt'}
    "; print &text('view_crypt_'.$deccode, "
    $decmessage
    "); print "

    \n"; } # Display DSN status if ($sent_dsn_to || $send_dsn_button || $got_dsn || @delmsgs) { print "\n"; print "\n"; print "
    $text{'view_dsn'}
    "; if ($sent_dsn_to) { print &text($sent_dsn ? 'view_dnsnow' : 'view_dsnbefore', &html_escape($sent_dsn_to), ($dsntm = localtime($sent_dsn_at))); } elsif ($send_dsn_button) { print &text('view_dsnreq', &html_escape($dsn_req)),"
    \n"; print &ui_submit($text{'view_dsnsend'}, "dsn"); } elsif ($got_dsn) { print &text('view_dsngot', &html_escape($got_dsn_from), ($dsntm = localtime($got_dsn))),"
    \n"; } elsif (@delmsgs) { print join("
    \n", @delmsgs),"
    \n"; } print "

    \n"; } &show_buttons(2, scalar(@sub)) if (&editable_mail($mail)); if ($userconfig{'arrows'} == 2 && !@sub) { print "
    \n"; &show_arrows(); } print "

    \n"; dbmclose(%read); # Show footer links local @sr = !@sub ? ( ) : ( "view_mail.cgi?idx=$in{'idx'}", $text{'view_return'} ), $s = int((@mail - $in{'idx'} - 1) / $userconfig{'perpage'}) * $userconfig{'perpage'}; &mail_page_footer(@sub ? ( "view_mail.cgi?idx=$in{'idx'}&folder=$in{'folder'}", $text{'view_return'} ) : ( ), "index.cgi?folder=$in{'folder'}&start=$in{'start'}", $text{'mail_return'}); &pop3_logout_all(); # show_buttons(pos, submode) sub show_buttons { local $spacer = " \n"; if ($folder->{'sent'} || $folder->{'drafts'}) { print ""; } else { print ""; print ""; } print $spacer; print ""; print $spacer; if ($userconfig{'open_mode'}) { # Compose button needs to pop up a window print ""; } else { # Compose button can just submit and redirect print ""; } print $spacer; if (!$_[1]) { if (!$folder->{'sent'} && !$folder->{'drafts'}) { $m = $read{$mail->{'header'}->{'message-id'}}; print ""; print ""; print $spacer; } if (@folders > 1) { print &movecopy_select($_[0], \@folders, $folder); print $spacer; } print ""; print $spacer; } else { if (@folders > 1) { print &movecopy_select($_[0], \@folders, $folder, 1); print $spacer; } } print ""; print $spacer; if (!$_[1]) { # Show spam and/or ham report buttons if (&can_report_spam($folder) && $userconfig{'spam_buttons'} =~ /mail/) { print ""; if ($userconfig{'spam_del'}) { print ""; } else { print ""; } print $spacer; } if (&can_report_ham($folder) && $userconfig{'ham_buttons'} =~ /mail/) { print ""; print ""; print $spacer; } } print "
    \n"; } # address_link(address) sub address_link { local @addrs = &split_addresses(&decode_mimewords($_[0])); local @rv; foreach $a (@addrs) { if ($inbook{$a->[0]}) { push(@rv, &eucconv_and_escape($a->[2])); } else { push(@rv, "". &eucconv_and_escape($a->[2]).""); } } return join(" , ", @rv); } sub show_arrows { print "
    \n"; if (!@sub) { # Get next and previous emails, where they exist local $c = scalar(@mail); local $prv = $mail->{'sortidx'} == 0 ? 0 : $mail->{'sortidx'}-1; local $nxt = $mail->{'sortidx'} == $c-1 ? $c-1 : $mail->{'sortidx'}+1; local @beside = &mailbox_list_mails_sorted($prv, $nxt, $folder, 1); if ($mail->{'sortidx'} != 0) { local $mailprv = $beside[$prv]; print "", "\n"; } else { print "\n"; } print "",&text('view_desc', $mail->{'sortidx'}+1, $folder->{'name'}),"\n"; if ($mail->{'sortidx'} < $c-1) { local $mailnxt = $beside[$nxt]; print "", "\n"; } else { print "\n"; } } else { print "$text{'view_sub'}\n"; } print "
    \n"; } # search_link(field, what, text) sub search_link { local $fid; if ($userconfig{'related_search'}) { # Search is across all folders $fid = -$userconfig{'related_search'}; } elsif (!$folder->{'searchable'}) { # Search is source folder if ($mail->{'subfolder'}) { $fid = $mail->{'subfolder'}->{'index'}; } else { return undef; } } else { # Search is in this folder $fid = $in{'folder'}; } if ($_[1]) { return "$_[2]"; } else { return undef; } } mailbox/virtualize.cgi0100775000567100000000000000105410200301206014715 0ustar jcameronroot#!/usr/local/bin/perl # Create a new virtual folder from some search results require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); $in{'virtual'} || &error($text{'virtualize_ename'}); $folder = { 'type' => 6, 'mode' => 0, 'name' => $in{'virtual'}, 'virtual' => 1, 'members' => [ ] }; foreach $k (keys %in) { if ($k =~ /^idx_(\d+)$/) { ($idx, $fidx) = split(/\s+/, $in{$k}, 2); $folder->{'members'}->[$1] = [ $folders[$fidx], $idx ]; } } &save_folder($folder); &redirect("index.cgi?folder=".scalar(@folders)); mailbox/delete_folders.cgi0100775000567100000120000000212410443333455015646 0ustar jcameronwheel#!/usr/local/bin/perl # Delete a bunch of folders require './mailbox-lib.pl'; &ReadParse(); &error_setup($text{'fdelete_err'}); # Get the folders @folders = &list_folders(); @d = split(/\0/, $in{'d'}); @d || &error($text{'fdelete_enone'}); foreach $d (@d) { push(@dfolders, $folders[$d]); } if ($in{'confirm'}) { # Do the deletion foreach $f (@dfolders) { &delete_folder($f); } &redirect("list_folders.cgi"); } else { # Ask the user if he is sure &ui_print_header(undef, $text{'fdelete_title'}, ""); # Get the total folder size, where mail will actually be lost local $sz = 0; foreach $f (@dfolders) { if ($d->{'type'} == 0) { $sz += &folder_size($f); } } print &ui_form_start("delete_folders.cgi"); foreach $d (@d) { print &ui_hidden("d", $d),"\n"; } print "
    ", &text($sz ? 'fdelete_rusure' : 'fdelete_rusure2', scalar(@dfolders), &nice_size($sz)),"
    \n"; print "
    ",&ui_submit($text{'fdelete_delete'}, "confirm"), "
    \n"; print &ui_form_end(); &ui_print_footer("list_folders.cgi", $text{'folders_return'}); } mailbox/copy_form.cgi0100775000567100000120000000166110443361522014664 0ustar jcameronwheel#!/usr/local/bin/perl # Show a form for copying or moving all email to another folder require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); $folder = $folders[$in{'idx'}]; &ui_print_header(undef, $text{'copy_title'}, ""); print &ui_form_start("copy.cgi"); print &ui_hidden("idx", $in{'idx'}); print &ui_table_start($text{'copy_header'}, undef, 2); # Source folder print &ui_table_row($text{'copy_source'}, $folder->{'name'}); # Destination folder @dfolders = grep { !$_->{'nowrite'} && $_->{'index'} != $folder->{'index'} } &list_folders_sorted(); print &ui_table_row($text{'copy_dest'}, &ui_select("dest", undef, [ map { [ $_->{'index'}, $_->{'name'} ] } @dfolders ])); # Move or copy print &ui_table_row($text{'copy_move'}, &ui_yesno_radio("move", 0)); print &ui_table_end(); print &ui_form_end([ [ "copy", $text{'copy_ok'} ] ]); &ui_print_footer("list_folders.cgi", $text{'folders_return'}); mailbox/copy.cgi0100775000567100000120000000117010443356043013636 0ustar jcameronwheel#!/usr/local/bin/perl # Copy (or move) all messages from one folder to another require './mailbox-lib.pl'; &ReadParse(); @folders = &list_folders(); $folder = $folders[$in{'idx'}]; $dest = $folders[$in{'dest'}]; &ui_print_unbuffered_header(undef, $text{'copy_title'}, ""); print &text('copy_doing', $folder->{'name'}, $dest->{'name'}),"

    \n"; &mailbox_copy_folder($folder, $dest); print $text{'copy_done'},"

    \n"; if ($in{'move'}) { print &text('copy_deleting', $folder->{'name'}),"

    \n"; &mailbox_empty_folder($folder); print $text{'copy_done'},"

    \n"; } &ui_print_footer("list_folders.cgi", $text{'folders_return'});