.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man v6.0.2 (Pod::Simple 3.45) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Required to disable full justification in groff 1.23.0. .if n .ds AD l .\" ======================================================================== .\" .IX Title "Mail::SpamAssassin::SQLBasedAddrList 3" .TH Mail::SpamAssassin::SQLBasedAddrList 3 2026-07-23 "perl v5.42.2" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH NAME Mail::SpamAssassin::SQLBasedAddrList \- SpamAssassin SQL Based Auto Welcomelist .SH SYNOPSIS .IX Header "SYNOPSIS" .Vb 3 \& my $factory = Mail::SpamAssassin::SQLBasedAddrList\->new() \& $spamtest\->set_persistent_addr_list_factory ($factory); \& ... call into SpamAssassin classes... .Ve .PP SpamAssassin will call: .PP .Vb 3 \& my $addrlist = $factory\->new_checker($spamtest); \& $entry = $addrlist\->get_addr_entry ($addr, $origip); \& ... .Ve .SH DESCRIPTION .IX Header "DESCRIPTION" A SQL based persistent address list implementation. .PP See \f(CW\*(C`Mail::SpamAssassin::PersistentAddrList\*(C'\fR for more information. .PP Uses DBI::DBD module access to your favorite database (tested with MySQL, SQLite and PostgreSQL) to store user auto\-welcomelists. .PP The default table structure looks like this: CREATE TABLE awl ( username varchar(100) NOT NULL default \*(Aq\*(Aq, email varchar(255) NOT NULL default \*(Aq\*(Aq, ip varchar(40) NOT NULL default \*(Aq\*(Aq, msgcount int(11) NOT NULL default \*(Aq0\*(Aq, totscore float NOT NULL default \*(Aq0\*(Aq, signedby varchar(255) NOT NULL default \*(Aq\*(Aq, last_hit timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (username,email,signedby,ip) ) TYPE=MyISAM; .PP Your table definition may change depending on which database driver you choose. There is a config option to override the table name. .PP This module introduces several new config variables: .PP user_awl_dsn .PP user_awl_sql_username .PP user_awl_sql_password .PP user_awl_sql_table .PP user_awl_sql_override_username .PP see \f(CW\*(C`Mail::SpamAssassin::Conf\*(C'\fR for more information. .SS new .IX Subsection "new" public class (Mail::SpamAssassin::SQLBasedAddrList) new () .PP Description: This method creates a new instance of the SQLBasedAddrList factory and calls the parent\*(Aqs (PersistentAddrList) new method. .SS new_checker .IX Subsection "new_checker" public instance (Mail::SpamAssassin::SQLBasedAddrList) new_checker (\e% \f(CW$main\fR) .PP Description: This method is called to setup a new checker interface and return a blessed copy of itself. Here is where we setup the SQL database connection based on the config values. .SS get_addr_entry .IX Subsection "get_addr_entry" public instance (\e%) get_addr_entry (String \f(CW$addr\fR, String \f(CW$signedby\fR) .PP Description: This method takes a given \f(CW$addr\fR and splits it between the email address component and the ip component and performs a lookup in the database. If nothing is found in the database then a blank entry hash is created and returned, otherwise an entry containing the found information is returned. If a with_awl_signer configuration option is enabled only addresses signed by the given signing identity are taken into account, or, if \f(CW$signedby\fR is undefined (or empty) only unsigned entries are considered. .PP A key, \f(CW\*(C`exists_p\*(C'\fR, is set to 1 if an entry already exists in the database, otherwise it is set to 0. .SS add_score .IX Subsection "add_score" public instance (\e%) add_score (\e% \f(CW$entry\fR, Integer \f(CW$score\fR) .PP Description: This method adds a given \f(CW$score\fR to a given \f(CW$entry\fR. If the entry was marked as not existing in the database then an entry will be inserted, otherwise a simple update will be performed. .PP NOTE: This code uses a self referential SQL call (ie set foo = foo + 1) which is supported by most modern database backends, but not everything calling itself a SQL database. .SS remove_entry .IX Subsection "remove_entry" public instance () remove_entry (\e% \f(CW$entry\fR) .PP Description: This method removes a given \f(CW$entry\fR from the database. If the ip portion of the entry address is equal to "none" then remove any perl\-IP entries for this address as well. .SS finish .IX Subsection "finish" public instance () finish () .PP Description: This method provides the necessary cleanup for the address list. .SS _unpack_addr .IX Subsection "_unpack_addr" private instance (String, String) _unpack_addr(string \f(CW$addr\fR) .PP Description: This method splits an autowelcomelist address into it\*(Aqs two components, email and ip address.