2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2003 Hiroyuki Yamamoto and the Sylpheed-Claws Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
33 #include "common/utils.h"
39 #include "prefs_gtk.h"
42 #include "spamassassin.h"
44 #ifdef HAVE_SYSEXITS_H
50 #ifdef HAVE_SYS_ERRNO_H
51 #include <sys/errno.h>
56 #ifdef HAVE_SYS_TIME_H
67 static int flags = SPAMC_RAW_MODE | SPAMC_SAFE_FALLBACK | SPAMC_CHECK_ONLY;
69 gboolean spamassassin_enable;
70 gchar *spamassassin_hostname;
71 int spamassassin_port;
72 int spamassassin_max_size;
73 gboolean spamassassin_receive_spam;
74 gchar *spamassassin_save_folder;
76 static PrefParam param[] = {
77 {"enable", "FALSE", &spamassassin_enable, P_BOOL,
79 {"hostname", "localhost", &spamassassin_hostname, P_STRING,
81 {"port", "783", &spamassassin_port, P_USHORT,
83 {"max_size", "250", &spamassassin_max_size, P_USHORT,
85 {"receive_spam", "TRUE", &spamassassin_receive_spam, P_BOOL,
87 {"save_folder", NULL, &spamassassin_save_folder, P_STRING,
90 {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
93 static gboolean mail_filtering_hook(gpointer source, gpointer data)
95 MailFilteringData *mail_filtering_data = (MailFilteringData *) source;
96 MsgInfo *msginfo = mail_filtering_data->msginfo;
97 gboolean is_spam = FALSE;
101 gchar *username = NULL, *oldlocale = NULL;
102 struct sockaddr addr;
104 if (!spamassassin_enable)
107 debug_print("Filtering message %d\n", msginfo->msgnum);
109 oldlocale = g_strdup(setlocale(LC_ALL, NULL));
110 if (oldlocale == NULL) {
111 debug_print("failed to get locale");
115 setlocale(LC_ALL, "C");
117 ret = lookup_host(spamassassin_hostname, spamassassin_port, &addr);
119 debug_print("failed to look up spamd host");
123 m.type = MESSAGE_NONE;
124 m.max_len = spamassassin_max_size * 1024;
126 username = g_get_user_name();
127 if (username == NULL) {
128 debug_print("failed to get username");
132 fp = procmsg_open_message(msginfo);
134 debug_print("failed to open message file");
138 ret = message_read(fileno(fp), flags, &m);
140 debug_print("failed to read message");
144 ret = message_filter(&addr, username, flags, &m);
145 if ((ret == EX_OK) && (m.is_spam == EX_ISSPAM))
152 if (oldlocale != NULL) {
153 setlocale(LC_ALL, oldlocale);
158 if (spamassassin_receive_spam) {
159 FolderItem *save_folder;
161 debug_print("message is spam\n");
163 if ((!spamassassin_save_folder) ||
164 (spamassassin_save_folder[0] == '\0') ||
165 ((save_folder = folder_find_item_from_identifier(spamassassin_save_folder)) == NULL))
166 save_folder = folder_get_default_trash();
168 procmsg_msginfo_unset_flags(msginfo, ~0, 0);
169 folder_item_move_msg(save_folder, msginfo);
171 folder_item_remove_msg(msginfo->folder, msginfo->msgnum);
180 void spamassassin_save_config()
185 debug_print("Saving SpamAssassin Page\n");
187 rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
188 pfile = prefs_write_open(rcpath);
190 if (!pfile || (prefs_set_block_label(pfile, "SpamAssassin") < 0))
193 if (prefs_write_param(param, pfile->fp) < 0) {
194 g_warning("failed to write SpamAssassin configuration to file\n");
195 prefs_file_close_revert(pfile);
198 fprintf(pfile->fp, "\n");
200 prefs_file_close(pfile);
203 gint plugin_init(gchar **error)
205 hook_id = hooks_register_hook(MAIL_FILTERING_HOOKLIST, mail_filtering_hook, NULL);
207 *error = g_strdup("Failed to register mail filtering hook");
211 prefs_set_default(param);
212 prefs_read_config(param, "SpamAssassin", COMMON_RC);
214 debug_print("Spamassassin plugin loaded\n");
222 hooks_unregister_hook(MAIL_FILTERING_HOOKLIST, hook_id);
223 g_free(spamassassin_hostname);
225 debug_print("Spamassassin plugin unloaded\n");
228 const gchar *plugin_name()
230 return "SpamAssassin";
233 const gchar *plugin_desc()
235 return "This plugin checks all messages that are received from a POP "
236 "account for spam using a SpamAssassin server. You will need "
237 "a SpamAssassin Server (spamd) running somewhere.\n"
239 "When a message is identified as spam it can be deleted or "
240 "saved into a special folder.\n"
242 "This plugin only contains the actual function for filtering "
243 "and deleting or moving the message. You probably want to load "
244 "a User Interface plugin too, otherwise you will have to "
245 "manually write the plugin configuration.\n";