Here is an AddOn which allows users to report mis-scored messages.
Reported messages will be copied to a spam/ham folder (also to remote folders via ftp).
After revision by the administrator just let run spamassassin sa-learn to train the bayes database of spamassassin.
For further instruction see the code ...
-Roland
<?php
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// RoundCube v0.1 - RC2
//
// AddOn: Report Spam/Ham - program/steps/mail/report_spam_ham.inc
// Purpose: Copies messages to specific folders $rcmail_config['report_spam_folder'] / $rcmail_config['report_ham_folder']
// or via FTP to remote folders $rcmail_config['report_spam_ftp_folder'] / $rcmail_config['report_ham_ftp_folder']
// Reported messages can be used to train a bayes database (f.e. spamassassin sa-learn)
//
// (c) [url]www.roland-liebl.de[/url]
//
// NO WARRANTY - USE AS IS AT YOUR OWN RISK
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// config/main.inc.php
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
//
// show "move to" selector on message list
$rcmail_config['move_to_select'] = TRUE;
//spam/ham report
$rcmail_config['report_spam_ham'] = TRUE;
$rcmail_config['report_spam_folder'] = "c:/sa/spam/";
$rcmail_config['report_ham_folder'] = "c:/sa/ham/";
$rcmail_config['report_spam_ham_ftp'] = TRUE; // if true, folders above will be ignored
$rcmail_config['ftp_server'] = "localhost";
$rcmail_config['ftp_port'] = 21;
$rcmail_config['ftp_passive_mode'] = TRUE;
$rcmail_config['ftp_user'] = "roundcube";
$rcmail_config['ftp_pass'] = "pass";
$rcmail_config['report_spam_ftp_folder'] = "spam/";
$rcmail_config['report_ham_ftp_folder'] = "ham/";
*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// program/include/main.inc
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
// add no-selection option
if ($type=='select' && $attrib['noselection'])
$out .= sprintf('<option value="0">%s</option>'."\n",
rcube_label('action') . "...");
// find me: report spam/ham, message flags, forward as attachment
if ($type=='select')
$out .= sprintf('<option value="-7">%s</option>'."\n",
rcube_label('forward_as_attachment'));
if($type == "select" && isset($CONFIG['report_spam_ham']) && $CONFIG['report_spam_ham'] === TRUE){
$out .= "<optgroup label=\"" . rcube_label("spam_actions") . "\">\r\n";
$out .= "<option value=-1>-- " . rcube_label("report_Spam") . " --</option>\r\n";
$out .= "<option value=-2>-- " . rcube_label("report_Legit") . " --</option>\r\n";
$out .= "</optgroup>\r\n";
}
// NOTICE: This is part of another AddOn message_flags
if($type == "select" && isset($CONFIG['message_flags']) && $CONFIG['message_flags'] === TRUE){
$out .= "<optgroup label=\"" . rcube_label("message_flags") . "\">\r\n";
$out .= "<option value=-3>-- " . rcube_label("mark_as_read") . " --</option>\r\n";
$out .= "<option value=-4>-- " . rcube_label("mark_as_unread") . " --</option>\r\n";
$out .= "<option value=-5>-- " . rcube_label("mark_as_flagged") . " --</option>\r\n";
$out .= "<option value=-6>-- " . rcube_label("mark_as_unflagged") . " --</option>\r\n";
$out .= "</optgroup>\r\n";
}
if(
$type == "select" &&
(isset($CONFIG['report_spam_ham']) && $CONFIG['report_spam_ham'] === TRUE ||
isset($CONFIG['message_flags']) && $CONFIG['message_flags'] === TRUE)
){
$out .= "<optgroup label=\"" . rcube_label("message_location") . "\">\r\n";
$out .= "<option value=0>" . rcube_label($attrib['noselection']) . "</option>\r\n";
}
// get mailbox list
$mbox_name = $IMAP->get_mailbox_name();
*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// index.php
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
if ($_action=='get')
include('program/steps/mail/get.inc');
// find me: report spam/ham
if ($_action=='moveto' && (trim($_POST['_target_mbox']) == -1 || trim($_POST['_target_mbox']) == -2))
include('program/steps/mail/report_spam_ham.inc');
*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// skins/default/templates/mail.html
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
<roundcube:if condition="config:move_to_select == true" />
<roundcube:object name="mailboxlist" type="select" noSelection="moveto" maxlength="25" onchange="rcmail.command('moveto', this.options[this.selectedIndex].value)" class="mboxlist" />
<roundcube:endif />
*/
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// CODE starts here ...
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if ($uid = get_input_value('_uid', RCUBE_INPUT_POST)){
$a_uid = explode(",",$uid);
$err_type = '';
if(get_input_value('_target_mbox', RCUBE_INPUT_POST) == -1){
$folder = $CONFIG['report_spam_folder'];
$ftp_folder = $CONFIG['report_spam_ftp_folder'];
}
else if(get_input_value('_target_mbox', RCUBE_INPUT_POST) == -2){
$folder = $CONFIG['report_ham_folder'];
$ftp_folder = $CONFIG['report_ham_ftp_folder'];
}
if(isset($CONFIG['report_spam_ham_ftp']) && $CONFIG['report_spam_ham_ftp'] === TRUE){
$conn_id = ftp_connect($CONFIG['ftp_server'], $CONFIG['ftp_port']);
$folder = $CONFIG['temp_dir'];
if(isset($CONFIG['ftp_passive_mode']) && $CONFIG['ftp_passive_mode'] === TRUE){
ftp_pasv ($conn_id , TRUE);
}
$login_result = ftp_login($conn_id, $CONFIG['ftp_user'], $CONFIG['ftp_pass']);
}
foreach($a_uid as $key => $uid){
if(isset($folder) && file_exists($folder)){
$file = str_makerand (16, 16, false, false, false) . ".eml";
while(file_exists($folder . $file)){
$file = str_makerand (16, 16, false, false, false) . ".eml";
}
$message = $IMAP->get_raw_body($uid);
if(!@file_put_contents($folder . $file ,$message)){
//failure
$err_type = 'error';
}
else{
if(isset($CONFIG['report_spam_ham_ftp']) && $CONFIG['report_spam_ham_ftp'] === TRUE){
if((!$conn_id) || (!$login_result)){
//failure
$err_type = 'error';
}
else{
//success
$ftp_file = $file;
while(ftp_size($conn_id, $ftp_folder.$ftp_file) > -1){
$ftp_file = str_makerand (16, 16, false, false, false) . ".eml";
}
$upload = ftp_put($conn_id, $ftp_folder.$ftp_file, $folder.$file, FTP_BINARY);
if(!$upload){
//failure
$err_type = 'error';
}
else{
//success
}
@unlink($folder.$ftp_file);
}
}
}
}
}
if($conn_id){
ftp_close($conn_id);
}
}
if($err_type == ""){
$message = rcube_label('message(s)_successfully_reported');
$err_type = 'confirmation';
}
else{
$message = rcube_label('there_was_an_error');
}
$OUTPUT->show_message($message, $err_type);
if(get_input_value('_target_mbox', RCUBE_INPUT_POST) == -1){
$_POST['_target_mbox'] = $CONFIG['junk_mbox'];
}
else if(get_input_value('_target_mbox', RCUBE_INPUT_POST) == -2){
$_POST['_target_mbox'] = "INBOX";
}
else{
$_POST['_target_mbox'] = $_POST['_mbox'];
}
?>