You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by km...@apache.org on 2020/01/29 19:06:00 UTC

svn commit: r1873332 [6/17] - in /spamassassin/site/full/3.4.x: ./ doc/

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_LDAP.html
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_LDAP.html?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_LDAP.html (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_LDAP.html Wed Jan 29 19:05:59 2020
@@ -0,0 +1,52 @@
+<?xml version="1.0" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title></title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+
+
+<ul id="index">
+  <li><a href="#NAME">NAME</a></li>
+  <li><a href="#SYNOPSIS">SYNOPSIS</a></li>
+  <li><a href="#DESCRIPTION">DESCRIPTION</a></li>
+  <li><a href="#METHODS">METHODS</a></li>
+</ul>
+
+<h1 id="NAME">NAME</h1>
+
+<p>Mail::SpamAssassin::Conf::LDAP - load SpamAssassin scores from LDAP database</p>
+
+<h1 id="SYNOPSIS">SYNOPSIS</h1>
+
+<pre><code>  (see Mail::SpamAssassin)</code></pre>
+
+<h1 id="DESCRIPTION">DESCRIPTION</h1>
+
+<p>Mail::SpamAssassin is a module to identify spam using text analysis and several internet-based realtime blacklists.</p>
+
+<p>This class is used internally by SpamAssassin to load scores from an LDAP database. Please refer to the <code>Mail::SpamAssassin</code> documentation for public interfaces.</p>
+
+<h1 id="METHODS">METHODS</h1>
+
+<dl>
+
+<dt id="f-load-username">$f-&gt;load ($username)</dt>
+<dd>
+
+<p>Read configuration parameters from LDAP server and parse scores from it.</p>
+
+</dd>
+</dl>
+
+
+</body>
+
+</html>
+
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_LDAP.txt
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_LDAP.txt?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_LDAP.txt (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_LDAP.txt Wed Jan 29 19:05:59 2020
@@ -0,0 +1,20 @@
+NAME
+    Mail::SpamAssassin::Conf::LDAP - load SpamAssassin scores from LDAP
+    database
+
+SYNOPSIS
+      (see Mail::SpamAssassin)
+
+DESCRIPTION
+    Mail::SpamAssassin is a module to identify spam using text analysis and
+    several internet-based realtime blacklists.
+
+    This class is used internally by SpamAssassin to load scores from an
+    LDAP database. Please refer to the "Mail::SpamAssassin" documentation
+    for public interfaces.
+
+METHODS
+    $f->load ($username)
+        Read configuration parameters from LDAP server and parse scores from
+        it.
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_Parser.html
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_Parser.html?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_Parser.html (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_Parser.html Wed Jan 29 19:05:59 2020
@@ -0,0 +1,133 @@
+<?xml version="1.0" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title></title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+
+
+<ul id="index">
+  <li><a href="#NAME">NAME</a></li>
+  <li><a href="#SYNOPSIS">SYNOPSIS</a></li>
+  <li><a href="#DESCRIPTION">DESCRIPTION</a></li>
+  <li><a href="#STRUCTURE-OF-A-CONFIG-BLOCK">STRUCTURE OF A CONFIG BLOCK</a></li>
+</ul>
+
+<h1 id="NAME">NAME</h1>
+
+<p>Mail::SpamAssassin::Conf::Parser - parse SpamAssassin configuration</p>
+
+<h1 id="SYNOPSIS">SYNOPSIS</h1>
+
+<pre><code>  (see Mail::SpamAssassin)</code></pre>
+
+<h1 id="DESCRIPTION">DESCRIPTION</h1>
+
+<p>Mail::SpamAssassin is a module to identify spam using text analysis and several internet-based realtime blacklists.</p>
+
+<p>This class is used internally by SpamAssassin to parse its configuration files. Please refer to the <code>Mail::SpamAssassin</code> documentation for public interfaces.</p>
+
+<h1 id="STRUCTURE-OF-A-CONFIG-BLOCK">STRUCTURE OF A CONFIG BLOCK</h1>
+
+<p>This is the structure of a config-setting block. Each is a hashref which may contain these keys:</p>
+
+<dl>
+
+<dt id="setting">setting</dt>
+<dd>
+
+<p>the name of the setting it modifies, e.g. &quot;required_score&quot;. this also doubles as the default for &#39;command&#39; (below). THIS IS REQUIRED.</p>
+
+</dd>
+<dt id="command">command</dt>
+<dd>
+
+<p>The command string used in the config file for this setting. Optional; &#39;setting&#39; will be used for the command if this is omitted.</p>
+
+</dd>
+<dt id="aliases">aliases</dt>
+<dd>
+
+<p>An [aryref] of other aliases for the same command. optional.</p>
+
+</dd>
+<dt id="type">type</dt>
+<dd>
+
+<p>The type of this setting:</p>
+
+<pre><code> - $CONF_TYPE_NOARGS: must not have any argument, like &quot;clear_headers&quot;
+ - $CONF_TYPE_STRING: string
+ - $CONF_TYPE_NUMERIC: numeric value (float or int)
+ - $CONF_TYPE_BOOL: boolean (0/no or 1/yes)
+ - $CONF_TYPE_TEMPLATE: template, like &quot;report&quot;
+ - $CONF_TYPE_ADDRLIST: list of mail addresses, like &quot;whitelist_from&quot;
+ - $CONF_TYPE_HASH_KEY_VALUE: hash key/value pair, like &quot;describe&quot; or tflags
+ - $CONF_TYPE_STRINGLIST list of strings, stored as an array
+ - $CONF_TYPE_IPADDRLIST list of IP addresses, stored as an array of SA::NetSet
+ - $CONF_TYPE_DURATION a nonnegative time interval in seconds - a numeric value
+                      (float or int), optionally suffixed by a time unit (s, m,
+                      h, d, w), seconds are implied if unit is missing</code></pre>
+
+<p>If this is set, and a &#39;code&#39; block does not already exist, a &#39;code&#39; block is assigned based on the type.</p>
+
+<p>In addition, the SpamAssassin test suite will validate that the settings do not &#39;leak&#39; between users.</p>
+
+<p>Note that <code>$CONF_TYPE_HASH_KEY_VALUE</code>-type settings require that the value be non-empty, otherwise they&#39;ll produce a warning message.</p>
+
+</dd>
+<dt id="code">code</dt>
+<dd>
+
+<p>A subroutine to deal with the setting. ONE OF <b>code</b> OR <b>type</b> IS REQUIRED. The arguments passed to the function are <code>($self, $key, $value, $line)</code>, where $key is the setting (*not* the command), $value is the value string, and $line is the entire line.</p>
+
+<p>There are two special return values that the <b>code</b> subroutine may return to signal that there is an error in the configuration:</p>
+
+<p><code>$Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE</code> -- this setting requires that a value be set, but one was not provided.</p>
+
+<p><code>$Mail::SpamAssassin::Conf::INVALID_VALUE</code> -- this setting requires a value from a set of &#39;valid&#39; values, but the user provided an invalid one.</p>
+
+<p><code>$Mail::SpamAssassin::Conf::INVALID_HEADER_FIELD_NAME</code> -- this setting requires a syntactically valid header field name, but the user provided an invalid one.</p>
+
+<p>Any other values -- including <code>undef</code> -- returned from the subroutine are considered to mean &#39;success&#39;.</p>
+
+<p>It is good practice to set a &#39;type&#39;, if possible, describing how your settings are stored on the Conf object; this allows the SpamAssassin test suite to validate that the settings do not &#39;leak&#39; between users.</p>
+
+</dd>
+<dt id="default">default</dt>
+<dd>
+
+<p>The default value for the setting. may be omitted if the default value is a non-scalar type, which should be set in the Conf ctor. note for path types: using &quot;__userstate__&quot; is recommended for defaults, as it allows Mail::SpamAssassin module users who set that configuration setting, to receive the correct values.</p>
+
+</dd>
+<dt id="is_priv">is_priv</dt>
+<dd>
+
+<p>Set to 1 if this setting requires &#39;allow_user_rules&#39; when run from spamd.</p>
+
+</dd>
+<dt id="is_admin">is_admin</dt>
+<dd>
+
+<p>Set to 1 if this setting can only be set in the system-wide config when run from spamd. (All settings can be used by local programs run directly by the user.)</p>
+
+</dd>
+<dt id="is_frequent">is_frequent</dt>
+<dd>
+
+<p>Set to 1 if this value occurs frequently in the config. this means it&#39;s looked up first for speed.</p>
+
+</dd>
+</dl>
+
+
+</body>
+
+</html>
+
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_Parser.txt
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_Parser.txt?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_Parser.txt (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_Parser.txt Wed Jan 29 19:05:59 2020
@@ -0,0 +1,102 @@
+NAME
+    Mail::SpamAssassin::Conf::Parser - parse SpamAssassin configuration
+
+SYNOPSIS
+      (see Mail::SpamAssassin)
+
+DESCRIPTION
+    Mail::SpamAssassin is a module to identify spam using text analysis and
+    several internet-based realtime blacklists.
+
+    This class is used internally by SpamAssassin to parse its configuration
+    files. Please refer to the "Mail::SpamAssassin" documentation for public
+    interfaces.
+
+STRUCTURE OF A CONFIG BLOCK
+    This is the structure of a config-setting block. Each is a hashref which
+    may contain these keys:
+
+    setting
+        the name of the setting it modifies, e.g. "required_score". this
+        also doubles as the default for 'command' (below). THIS IS REQUIRED.
+
+    command
+        The command string used in the config file for this setting.
+        Optional; 'setting' will be used for the command if this is omitted.
+
+    aliases
+        An [aryref] of other aliases for the same command. optional.
+
+    type
+        The type of this setting:
+
+         - $CONF_TYPE_NOARGS: must not have any argument, like "clear_headers"
+         - $CONF_TYPE_STRING: string
+         - $CONF_TYPE_NUMERIC: numeric value (float or int)
+         - $CONF_TYPE_BOOL: boolean (0/no or 1/yes)
+         - $CONF_TYPE_TEMPLATE: template, like "report"
+         - $CONF_TYPE_ADDRLIST: list of mail addresses, like "whitelist_from"
+         - $CONF_TYPE_HASH_KEY_VALUE: hash key/value pair, like "describe" or tflags
+         - $CONF_TYPE_STRINGLIST list of strings, stored as an array
+         - $CONF_TYPE_IPADDRLIST list of IP addresses, stored as an array of SA::NetSet
+         - $CONF_TYPE_DURATION a nonnegative time interval in seconds - a numeric value
+                              (float or int), optionally suffixed by a time unit (s, m,
+                              h, d, w), seconds are implied if unit is missing
+
+        If this is set, and a 'code' block does not already exist, a 'code'
+        block is assigned based on the type.
+
+        In addition, the SpamAssassin test suite will validate that the
+        settings do not 'leak' between users.
+
+        Note that $CONF_TYPE_HASH_KEY_VALUE-type settings require that the
+        value be non-empty, otherwise they'll produce a warning message.
+
+    code
+        A subroutine to deal with the setting. ONE OF code OR type IS
+        REQUIRED. The arguments passed to the function are "($self, $key,
+        $value, $line)", where $key is the setting (*not* the command),
+        $value is the value string, and $line is the entire line.
+
+        There are two special return values that the code subroutine may
+        return to signal that there is an error in the configuration:
+
+        $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE -- this setting
+        requires that a value be set, but one was not provided.
+
+        $Mail::SpamAssassin::Conf::INVALID_VALUE -- this setting requires a
+        value from a set of 'valid' values, but the user provided an invalid
+        one.
+
+        $Mail::SpamAssassin::Conf::INVALID_HEADER_FIELD_NAME -- this setting
+        requires a syntactically valid header field name, but the user
+        provided an invalid one.
+
+        Any other values -- including "undef" -- returned from the
+        subroutine are considered to mean 'success'.
+
+        It is good practice to set a 'type', if possible, describing how
+        your settings are stored on the Conf object; this allows the
+        SpamAssassin test suite to validate that the settings do not 'leak'
+        between users.
+
+    default
+        The default value for the setting. may be omitted if the default
+        value is a non-scalar type, which should be set in the Conf ctor.
+        note for path types: using "__userstate__" is recommended for
+        defaults, as it allows Mail::SpamAssassin module users who set that
+        configuration setting, to receive the correct values.
+
+    is_priv
+        Set to 1 if this setting requires 'allow_user_rules' when run from
+        spamd.
+
+    is_admin
+        Set to 1 if this setting can only be set in the system-wide config
+        when run from spamd. (All settings can be used by local programs run
+        directly by the user.)
+
+    is_frequent
+        Set to 1 if this value occurs frequently in the config. this means
+        it's looked up first for speed.
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_SQL.html
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_SQL.html?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_SQL.html (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_SQL.html Wed Jan 29 19:05:59 2020
@@ -0,0 +1,53 @@
+<?xml version="1.0" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title></title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+
+
+<ul id="index">
+  <li><a href="#NAME">NAME</a></li>
+  <li><a href="#SYNOPSIS">SYNOPSIS</a></li>
+  <li><a href="#DESCRIPTION">DESCRIPTION</a></li>
+  <li><a href="#METHODS">METHODS</a></li>
+</ul>
+
+<h1 id="NAME">NAME</h1>
+
+<p>Mail::SpamAssassin::Conf::SQL - load SpamAssassin scores from SQL database</p>
+
+<h1 id="SYNOPSIS">SYNOPSIS</h1>
+
+<pre><code>  (see Mail::SpamAssassin)
+  </code></pre>
+
+<h1 id="DESCRIPTION">DESCRIPTION</h1>
+
+<p>Mail::SpamAssassin is a module to identify spam using text analysis and several internet-based realtime blacklists.</p>
+
+<p>This class is used internally by SpamAssassin to load scores from an SQL database. Please refer to the <code>Mail::SpamAssassin</code> documentation for public interfaces.</p>
+
+<h1 id="METHODS">METHODS</h1>
+
+<dl>
+
+<dt id="f-load-username">$f-&gt;load ($username)</dt>
+<dd>
+
+<p>Read configuration parameters from SQL database and parse scores from it.</p>
+
+</dd>
+</dl>
+
+
+</body>
+
+</html>
+
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_SQL.txt
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_SQL.txt?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_SQL.txt (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Conf_SQL.txt Wed Jan 29 19:05:59 2020
@@ -0,0 +1,20 @@
+NAME
+    Mail::SpamAssassin::Conf::SQL - load SpamAssassin scores from SQL
+    database
+
+SYNOPSIS
+      (see Mail::SpamAssassin)
+
+DESCRIPTION
+    Mail::SpamAssassin is a module to identify spam using text analysis and
+    several internet-based realtime blacklists.
+
+    This class is used internally by SpamAssassin to load scores from an SQL
+    database. Please refer to the "Mail::SpamAssassin" documentation for
+    public interfaces.
+
+METHODS
+    $f->load ($username)
+        Read configuration parameters from SQL database and parse scores
+        from it.
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_DnsResolver.html
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_DnsResolver.html?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_DnsResolver.html (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_DnsResolver.html Wed Jan 29 19:05:59 2020
@@ -0,0 +1,154 @@
+<?xml version="1.0" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title></title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+
+
+<ul id="index">
+  <li><a href="#NAME">NAME</a></li>
+  <li><a href="#DESCRIPTION">DESCRIPTION</a></li>
+  <li><a href="#METHODS">METHODS</a></li>
+</ul>
+
+<h1 id="NAME">NAME</h1>
+
+<p>Mail::SpamAssassin::DnsResolver - DNS resolution engine</p>
+
+<h1 id="DESCRIPTION">DESCRIPTION</h1>
+
+<p>This is a DNS resolution engine for SpamAssassin, implemented in order to reduce file descriptor usage by Net::DNS and avoid a response collision bug in that module.</p>
+
+<h1 id="METHODS">METHODS</h1>
+
+<dl>
+
+<dt id="res-load_resolver">$res-&gt;load_resolver()</dt>
+<dd>
+
+<p>Load the <code>Net::DNS::Resolver</code> object. Returns 0 if Net::DNS cannot be used, 1 if it is available.</p>
+
+</dd>
+<dt id="resolver-res-get_resolver">$resolver = $res-&gt;get_resolver()</dt>
+<dd>
+
+<p>Return the <code>Net::DNS::Resolver</code> object.</p>
+
+</dd>
+<dt id="res-configured_nameservers">$res-&gt;configured_nameservers()</dt>
+<dd>
+
+<p>Get a list of nameservers as configured by dns_server directives or as provided by Net::DNS, typically from /etc/resolv.conf</p>
+
+</dd>
+<dt id="res-available_nameservers">$res-&gt;available_nameservers()</dt>
+<dd>
+
+<p>Get or set a list of currently available nameservers, which is typically a known-to-be-good subset of configured nameservers</p>
+
+</dd>
+<dt id="res-connect_sock">$res-&gt;connect_sock()</dt>
+<dd>
+
+<p>Re-connect to the first nameserver listed in <code>/etc/resolv.conf</code> or similar platform-dependent source, as provided by <code>Net::DNS</code>.</p>
+
+</dd>
+<dt id="res-get_sock">$res-&gt;get_sock()</dt>
+<dd>
+
+<p>Return the <code>IO::Socket::INET</code> object used to communicate with the nameserver.</p>
+
+</dd>
+<dt id="packet-new_dns_packet-domain-type-class">$packet = new_dns_packet ($domain, $type, $class)</dt>
+<dd>
+
+<p>A wrapper for <code>Net::DNS::Packet::new()</code> which traps a die thrown by it.</p>
+
+<p>To use this, change calls to <code>Net::DNS::Resolver::bgsend</code> from:</p>
+
+<pre><code>    $res-&gt;bgsend($domain, $type);</code></pre>
+
+<p>to:</p>
+
+<pre><code>    $res-&gt;bgsend(Mail::SpamAssassin::DnsResolver::new_dns_packet($domain, $type, $class));</code></pre>
+
+</dd>
+<dt id="id-res-bgsend-domain-type-class-cb">$id = $res-&gt;bgsend($domain, $type, $class, $cb)</dt>
+<dd>
+
+<p>Quite similar to <code>Net::DNS::Resolver::bgsend</code>, except that when a reply packet eventually arrives, and <code>poll_responses</code> is called, the callback sub reference <code>$cb</code> will be called.</p>
+
+<p>Note that <code>$type</code> and <code>$class</code> may be <code>undef</code>, in which case they will default to <code>A</code> and <code>IN</code>, respectively.</p>
+
+<p>The callback sub will be called with three arguments -- the packet that was delivered, and an id string that fingerprints the query packet and the expected reply. The third argument is a timestamp (Unix time, floating point), captured at the time the packet was collected. It is expected that a closure callback be used, like so:</p>
+
+<pre><code>  my $id = $self-&gt;{resolver}-&gt;bgsend($domain, $type, undef, sub {
+        my ($reply, $reply_id, $timestamp) = @_;
+        $self-&gt;got_a_reply ($reply, $reply_id);
+      });</code></pre>
+
+<p>The callback can ignore the reply as an invalid packet sent to the listening port if the reply id does not match the return value from bgsend.</p>
+
+</dd>
+<dt id="id-res-bgread">$id = $res-&gt;bgread()</dt>
+<dd>
+
+<p>Similar to <code>Net::DNS::Resolver::bgread</code>. Reads a DNS packet from a supplied socket, decodes it, and returns a Net::DNS::Packet object if successful. Dies on error.</p>
+
+</dd>
+<dt id="nfound-res-poll_responses">$nfound = $res-&gt;poll_responses()</dt>
+<dd>
+
+<p>See if there are any <code>bgsend</code> reply packets ready, and return the number of such packets delivered to their callbacks.</p>
+
+</dd>
+<dt id="res-bgabort">$res-&gt;bgabort()</dt>
+<dd>
+
+<p>Call this to release pending requests from memory, when aborting backgrounded requests, or when the scan is complete. <code>Mail::SpamAssassin::PerMsgStatus::check</code> calls this before returning.</p>
+
+</dd>
+<dt id="packet-res-send-name-type-class">$packet = $res-&gt;send($name, $type, $class)</dt>
+<dd>
+
+<p>Emulates <code>Net::DNS::Resolver::send()</code>.</p>
+
+<p>This subroutine is a simple synchronous leftover from SpamAssassin version 3.3 and does not participate in packet query caching and callback grouping as implemented by AsyncLoop::bgsend_and_start_lookup(). As such it should be avoided for mainstream usage. Currently used through Mail::SPF::Server by the SPF plugin.</p>
+
+</dd>
+<dt id="res-errorstring">$res-&gt;errorstring()</dt>
+<dd>
+
+<p>Little more than a stub for callers expecting this from <code>Net::DNS::Resolver</code>.</p>
+
+<p>If called immediately after a call to $res-&gt;send this will return <code>query timed out</code> if the $res-&gt;send DNS query timed out. Otherwise <code>unknown error or no error</code> will be returned.</p>
+
+<p>No other errors are reported.</p>
+
+</dd>
+<dt id="res-finish_socket">$res-&gt;finish_socket()</dt>
+<dd>
+
+<p>Reset socket when done with it.</p>
+
+</dd>
+<dt id="res-finish">$res-&gt;finish()</dt>
+<dd>
+
+<p>Clean up for destruction.</p>
+
+</dd>
+</dl>
+
+
+</body>
+
+</html>
+
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_DnsResolver.txt
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_DnsResolver.txt?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_DnsResolver.txt (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_DnsResolver.txt Wed Jan 29 19:05:59 2020
@@ -0,0 +1,108 @@
+NAME
+    Mail::SpamAssassin::DnsResolver - DNS resolution engine
+
+DESCRIPTION
+    This is a DNS resolution engine for SpamAssassin, implemented in order
+    to reduce file descriptor usage by Net::DNS and avoid a response
+    collision bug in that module.
+
+METHODS
+    $res->load_resolver()
+        Load the "Net::DNS::Resolver" object. Returns 0 if Net::DNS cannot
+        be used, 1 if it is available.
+
+    $resolver = $res->get_resolver()
+        Return the "Net::DNS::Resolver" object.
+
+    $res->configured_nameservers()
+        Get a list of nameservers as configured by dns_server directives or
+        as provided by Net::DNS, typically from /etc/resolv.conf
+
+    $res->available_nameservers()
+        Get or set a list of currently available nameservers, which is
+        typically a known-to-be-good subset of configured nameservers
+
+    $res->connect_sock()
+        Re-connect to the first nameserver listed in "/etc/resolv.conf" or
+        similar platform-dependent source, as provided by "Net::DNS".
+
+    $res->get_sock()
+        Return the "IO::Socket::INET" object used to communicate with the
+        nameserver.
+
+    $packet = new_dns_packet ($domain, $type, $class)
+        A wrapper for "Net::DNS::Packet::new()" which traps a die thrown by
+        it.
+
+        To use this, change calls to "Net::DNS::Resolver::bgsend" from:
+
+            $res->bgsend($domain, $type);
+
+        to:
+
+            $res->bgsend(Mail::SpamAssassin::DnsResolver::new_dns_packet($domain, $type, $class));
+
+    $id = $res->bgsend($domain, $type, $class, $cb)
+        Quite similar to "Net::DNS::Resolver::bgsend", except that when a
+        reply packet eventually arrives, and "poll_responses" is called, the
+        callback sub reference $cb will be called.
+
+        Note that $type and $class may be "undef", in which case they will
+        default to "A" and "IN", respectively.
+
+        The callback sub will be called with three arguments -- the packet
+        that was delivered, and an id string that fingerprints the query
+        packet and the expected reply. The third argument is a timestamp
+        (Unix time, floating point), captured at the time the packet was
+        collected. It is expected that a closure callback be used, like so:
+
+          my $id = $self->{resolver}->bgsend($domain, $type, undef, sub {
+                my ($reply, $reply_id, $timestamp) = @_;
+                $self->got_a_reply ($reply, $reply_id);
+              });
+
+        The callback can ignore the reply as an invalid packet sent to the
+        listening port if the reply id does not match the return value from
+        bgsend.
+
+    $id = $res->bgread()
+        Similar to "Net::DNS::Resolver::bgread". Reads a DNS packet from a
+        supplied socket, decodes it, and returns a Net::DNS::Packet object
+        if successful. Dies on error.
+
+    $nfound = $res->poll_responses()
+        See if there are any "bgsend" reply packets ready, and return the
+        number of such packets delivered to their callbacks.
+
+    $res->bgabort()
+        Call this to release pending requests from memory, when aborting
+        backgrounded requests, or when the scan is complete.
+        "Mail::SpamAssassin::PerMsgStatus::check" calls this before
+        returning.
+
+    $packet = $res->send($name, $type, $class)
+        Emulates "Net::DNS::Resolver::send()".
+
+        This subroutine is a simple synchronous leftover from SpamAssassin
+        version 3.3 and does not participate in packet query caching and
+        callback grouping as implemented by
+        AsyncLoop::bgsend_and_start_lookup(). As such it should be avoided
+        for mainstream usage. Currently used through Mail::SPF::Server by
+        the SPF plugin.
+
+    $res->errorstring()
+        Little more than a stub for callers expecting this from
+        "Net::DNS::Resolver".
+
+        If called immediately after a call to $res->send this will return
+        "query timed out" if the $res->send DNS query timed out. Otherwise
+        "unknown error or no error" will be returned.
+
+        No other errors are reported.
+
+    $res->finish_socket()
+        Reset socket when done with it.
+
+    $res->finish()
+        Clean up for destruction.
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger.html
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger.html?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger.html (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger.html Wed Jan 29 19:05:59 2020
@@ -0,0 +1,113 @@
+<?xml version="1.0" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title></title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+
+
+<ul id="index">
+  <li><a href="#NAME">NAME</a></li>
+  <li><a href="#SYNOPSIS">SYNOPSIS</a></li>
+  <li><a href="#METHODS">METHODS</a></li>
+</ul>
+
+<h1 id="NAME">NAME</h1>
+
+<p>Mail::SpamAssassin::Logger - SpamAssassin logging module</p>
+
+<h1 id="SYNOPSIS">SYNOPSIS</h1>
+
+<pre><code>  use Mail::SpamAssassin::Logger;
+
+  $SIG{__WARN__} = sub {
+    log_message(&quot;warn&quot;, $_[0]);
+  };
+
+  $SIG{__DIE__} = sub {
+    log_message(&quot;error&quot;, $_[0])  if !$^S;
+  };</code></pre>
+
+<h1 id="METHODS">METHODS</h1>
+
+<dl>
+
+<dt id="add_facilities-facilities">add_facilities(facilities)</dt>
+<dd>
+
+<p>Enable debug logging for specific facilities. Each facility is the area of code to debug. Facilities can be specified as a hash reference (the key names are used), an array reference, an array, or a comma-separated scalar string. Facility names are case-sensitive.</p>
+
+<p>If &quot;all&quot; is listed, then all debug facilities are implicitly enabled, except for those explicitly disabled. A facility name may be preceded by a &quot;no&quot; (case-insensitive), which explicitly disables it, overriding the &quot;all&quot;. For example: all,norules,noconfig,nodcc. When facility names are given as an ordered list (array or scalar, not a hash), the last entry applies, e.g. &#39;nodcc,dcc,dcc,noddc&#39; is equivalent to &#39;nodcc&#39;. Note that currently no facility name starts with a &quot;no&quot;, it is advised to keep this practice with newly added facility names to make life easier.</p>
+
+<p>Higher priority informational messages that are suitable for logging in normal circumstances are available with an area of &quot;info&quot;. Some very verbose messages require the facility to be specifically enabled (see <code>would_log</code> below).</p>
+
+</dd>
+<dt id="log_message-level-message">log_message($level, @message)</dt>
+<dd>
+
+<p>Log a message at a specific level. Levels are specified as strings: &quot;warn&quot;, &quot;error&quot;, &quot;info&quot;, and &quot;dbg&quot;. The first element of the message must be prefixed with a facility name followed directly by a colon.</p>
+
+</dd>
+<dt id="dbg-facility:-message">dbg(&quot;facility: message&quot;)</dt>
+<dd>
+
+<p>This is used for all low priority debugging messages.</p>
+
+</dd>
+<dt id="info-facility:-message">info(&quot;facility: message&quot;)</dt>
+<dd>
+
+<p>This is used for informational messages indicating a normal, but significant, condition. This should be infrequently called. These messages are typically logged when SpamAssassin is run as a daemon.</p>
+
+</dd>
+<dt id="add-method-syslog-socket-socket-facility-facility">add(method =&gt; &#39;syslog&#39;, socket =&gt; $socket, facility =&gt; $facility)</dt>
+<dd>
+
+<p><code>socket</code> is the type the syslog (&quot;unix&quot; or &quot;inet&quot;). <code>facility</code> is the syslog facility (typically &quot;mail&quot;).</p>
+
+</dd>
+<dt id="add-method-file-filename-file">add(method =&gt; &#39;file&#39;, filename =&gt; $file)</dt>
+<dd>
+
+<p><code>filename</code> is the name of the log file.</p>
+
+</dd>
+<dt id="add-method-stderr">add(method =&gt; &#39;stderr&#39;)</dt>
+<dd>
+
+<p>No options are needed for stderr logging, just don&#39;t close stderr first.</p>
+
+</dd>
+<dt id="remove-method">remove(method)</dt>
+<dd>
+
+<p>Remove a logging method. Only the method name needs to be passed as a scalar.</p>
+
+</dd>
+<dt id="would_log-level-facility">would_log($level, $facility)</dt>
+<dd>
+
+<p>Returns false if a message at the given level and with the given facility would not be logged. Returns 1 if a message at a given level and facility would be logged normally. Returns 2 if the facility was specifically enabled.</p>
+
+<p>The facility argument is optional.</p>
+
+</dd>
+<dt id="close_log">close_log()</dt>
+<dd>
+
+<p>Close all logs.</p>
+
+</dd>
+</dl>
+
+
+</body>
+
+</html>
+
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger.txt
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger.txt?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger.txt (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger.txt Wed Jan 29 19:05:59 2020
@@ -0,0 +1,75 @@
+NAME
+    Mail::SpamAssassin::Logger - SpamAssassin logging module
+
+SYNOPSIS
+      use Mail::SpamAssassin::Logger;
+
+      $SIG{__WARN__} = sub {
+        log_message("warn", $_[0]);
+      };
+
+      $SIG{__DIE__} = sub {
+        log_message("error", $_[0])  if !$^S;
+      };
+
+METHODS
+    add_facilities(facilities)
+        Enable debug logging for specific facilities. Each facility is the
+        area of code to debug. Facilities can be specified as a hash
+        reference (the key names are used), an array reference, an array, or
+        a comma-separated scalar string. Facility names are case-sensitive.
+
+        If "all" is listed, then all debug facilities are implicitly
+        enabled, except for those explicitly disabled. A facility name may
+        be preceded by a "no" (case-insensitive), which explicitly disables
+        it, overriding the "all". For example: all,norules,noconfig,nodcc.
+        When facility names are given as an ordered list (array or scalar,
+        not a hash), the last entry applies, e.g. 'nodcc,dcc,dcc,noddc' is
+        equivalent to 'nodcc'. Note that currently no facility name starts
+        with a "no", it is advised to keep this practice with newly added
+        facility names to make life easier.
+
+        Higher priority informational messages that are suitable for logging
+        in normal circumstances are available with an area of "info". Some
+        very verbose messages require the facility to be specifically
+        enabled (see "would_log" below).
+
+    log_message($level, @message)
+        Log a message at a specific level. Levels are specified as strings:
+        "warn", "error", "info", and "dbg". The first element of the message
+        must be prefixed with a facility name followed directly by a colon.
+
+    dbg("facility: message")
+        This is used for all low priority debugging messages.
+
+    info("facility: message")
+        This is used for informational messages indicating a normal, but
+        significant, condition. This should be infrequently called. These
+        messages are typically logged when SpamAssassin is run as a daemon.
+
+    add(method => 'syslog', socket => $socket, facility => $facility)
+        "socket" is the type the syslog ("unix" or "inet"). "facility" is
+        the syslog facility (typically "mail").
+
+    add(method => 'file', filename => $file)
+        "filename" is the name of the log file.
+
+    add(method => 'stderr')
+        No options are needed for stderr logging, just don't close stderr
+        first.
+
+    remove(method)
+        Remove a logging method. Only the method name needs to be passed as
+        a scalar.
+
+    would_log($level, $facility)
+        Returns false if a message at the given level and with the given
+        facility would not be logged. Returns 1 if a message at a given
+        level and facility would be logged normally. Returns 2 if the
+        facility was specifically enabled.
+
+        The facility argument is optional.
+
+    close_log()
+        Close all logs.
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_File.html
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_File.html?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_File.html (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_File.html Wed Jan 29 19:05:59 2020
@@ -0,0 +1,35 @@
+<?xml version="1.0" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title></title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+
+
+<ul id="index">
+  <li><a href="#NAME">NAME</a></li>
+  <li><a href="#SYNOPSIS">SYNOPSIS</a></li>
+  <li><a href="#DESCRIPTION">DESCRIPTION</a></li>
+</ul>
+
+<h1 id="NAME">NAME</h1>
+
+<p>Mail::SpamAssassin::Logger::File - log to file</p>
+
+<h1 id="SYNOPSIS">SYNOPSIS</h1>
+
+<pre><code>  loadplugin     Mail::SpamAssassin::Logger::File</code></pre>
+
+<h1 id="DESCRIPTION">DESCRIPTION</h1>
+
+
+</body>
+
+</html>
+
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_File.txt
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_File.txt?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_File.txt (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_File.txt Wed Jan 29 19:05:59 2020
@@ -0,0 +1,7 @@
+NAME
+    Mail::SpamAssassin::Logger::File - log to file
+
+SYNOPSIS
+      loadplugin     Mail::SpamAssassin::Logger::File
+
+DESCRIPTION

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Stderr.html
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Stderr.html?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Stderr.html (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Stderr.html Wed Jan 29 19:05:59 2020
@@ -0,0 +1,35 @@
+<?xml version="1.0" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title></title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+
+
+<ul id="index">
+  <li><a href="#NAME">NAME</a></li>
+  <li><a href="#SYNOPSIS">SYNOPSIS</a></li>
+  <li><a href="#DESCRIPTION">DESCRIPTION</a></li>
+</ul>
+
+<h1 id="NAME">NAME</h1>
+
+<p>Mail::SpamAssassin::Logger::Stderr - log to standard error</p>
+
+<h1 id="SYNOPSIS">SYNOPSIS</h1>
+
+<pre><code>  loadplugin     Mail::SpamAssassin::Logger::Stderr</code></pre>
+
+<h1 id="DESCRIPTION">DESCRIPTION</h1>
+
+
+</body>
+
+</html>
+
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Stderr.txt
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Stderr.txt?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Stderr.txt (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Stderr.txt Wed Jan 29 19:05:59 2020
@@ -0,0 +1,7 @@
+NAME
+    Mail::SpamAssassin::Logger::Stderr - log to standard error
+
+SYNOPSIS
+      loadplugin     Mail::SpamAssassin::Logger::Stderr
+
+DESCRIPTION

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Syslog.html
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Syslog.html?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Syslog.html (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Syslog.html Wed Jan 29 19:05:59 2020
@@ -0,0 +1,35 @@
+<?xml version="1.0" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title></title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+
+
+<ul id="index">
+  <li><a href="#NAME">NAME</a></li>
+  <li><a href="#SYNOPSIS">SYNOPSIS</a></li>
+  <li><a href="#DESCRIPTION">DESCRIPTION</a></li>
+</ul>
+
+<h1 id="NAME">NAME</h1>
+
+<p>Mail::SpamAssassin::Logger::Syslog - log to syslog</p>
+
+<h1 id="SYNOPSIS">SYNOPSIS</h1>
+
+<pre><code>  loadplugin     Mail::SpamAssassin::Logger::Syslog</code></pre>
+
+<h1 id="DESCRIPTION">DESCRIPTION</h1>
+
+
+</body>
+
+</html>
+
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Syslog.txt
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Syslog.txt?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Syslog.txt (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Logger_Syslog.txt Wed Jan 29 19:05:59 2020
@@ -0,0 +1,7 @@
+NAME
+    Mail::SpamAssassin::Logger::Syslog - log to syslog
+
+SYNOPSIS
+      loadplugin     Mail::SpamAssassin::Logger::Syslog
+
+DESCRIPTION

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message.html
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message.html?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message.html (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message.html Wed Jan 29 19:05:59 2020
@@ -0,0 +1,176 @@
+<?xml version="1.0" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title></title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+
+
+<ul id="index">
+  <li><a href="#NAME">NAME</a></li>
+  <li><a href="#DESCRIPTION">DESCRIPTION</a></li>
+  <li><a href="#PUBLIC-METHODS">PUBLIC METHODS</a></li>
+  <li><a href="#PARSING-METHODS-NON-PUBLIC">PARSING METHODS, NON-PUBLIC</a></li>
+</ul>
+
+<h1 id="NAME">NAME</h1>
+
+<p>Mail::SpamAssassin::Message - decode, render, and hold an RFC-2822 message</p>
+
+<h1 id="DESCRIPTION">DESCRIPTION</h1>
+
+<p>This module encapsulates an email message and allows access to the various MIME message parts and message metadata.</p>
+
+<p>The message structure, after initiating a parse() cycle, looks like this:</p>
+
+<pre><code>  Message object, also top-level node in Message::Node tree
+     |
+     +---&gt; Message::Node for other parts in MIME structure
+     |       |---&gt; [ more Message::Node parts ... ]
+     |       [ others ... ]
+     |
+     +---&gt; Message::Metadata object to hold metadata</code></pre>
+
+<h1 id="PUBLIC-METHODS">PUBLIC METHODS</h1>
+
+<dl>
+
+<dt id="new">new()</dt>
+<dd>
+
+<p>Creates a Mail::SpamAssassin::Message object. Takes a hash reference as a parameter. The used hash key/value pairs are as follows:</p>
+
+<p><code>message</code> is either undef (which will use STDIN), a scalar - a string containing an entire message, a reference to such string, an array reference of the message with one line per array element, or either a file glob or an IO::File object which holds the entire contents of the message.</p>
+
+<p>Note: The message is expected to generally be in RFC 2822 format, optionally including an mbox message separator line (the &quot;From &quot; line) as the first line.</p>
+
+<p><code>parse_now</code> specifies whether or not to create the MIME tree at object-creation time or later as necessary.</p>
+
+<p>The <i>parse_now</i> option, by default, is set to false (0). This allows SpamAssassin to not have to generate the tree of Mail::SpamAssassin::Message::Node objects and their related data if the tree is not going to be used. This is handy, for instance, when running <code>spamassassin -d</code>, which only needs the pristine header and body which is always handled when the object is created.</p>
+
+<p><code>subparse</code> specifies how many MIME recursion levels should be parsed. Defaults to 20.</p>
+
+</dd>
+<dt id="find_parts">find_parts()</dt>
+<dd>
+
+<p>Used to search the tree for specific MIME parts. See <i>Mail::SpamAssassin::Message::Node</i> for more details.</p>
+
+</dd>
+<dt id="get_pristine_header">get_pristine_header()</dt>
+<dd>
+
+<p>Returns pristine headers of the message. If no specific header name is given as a parameter (case-insensitive), then all headers will be returned as a scalar, including the blank line at the end of the headers.</p>
+
+<p>If called in an array context, an array will be returned with each specific header in a different element. In a scalar context, the last specific header is returned.</p>
+
+<p>ie: If &#39;Subject&#39; is specified as the header, and there are 2 Subject headers in a message, the last/bottom one in the message is returned in scalar context or both are returned in array context.</p>
+
+<p>Btw, returning the last header field (not the first) happens to be consistent with DKIM signatures, which search for and cover multiple header fields bottom-up according to the &#39;h&#39; tag. Let&#39;s keep it this way.</p>
+
+<p>Note: the returned header will include the ending newline and any embedded whitespace folding.</p>
+
+</dd>
+<dt id="get_mbox_separator">get_mbox_separator()</dt>
+<dd>
+
+<p>Returns the mbox separator found in the message, or undef if there wasn&#39;t one.</p>
+
+</dd>
+<dt id="get_body">get_body()</dt>
+<dd>
+
+<p>Returns an array of the pristine message body, one line per array element.</p>
+
+</dd>
+<dt id="get_pristine">get_pristine()</dt>
+<dd>
+
+<p>Returns a scalar of the entire pristine message.</p>
+
+</dd>
+<dt id="get_pristine_body">get_pristine_body()</dt>
+<dd>
+
+<p>Returns a scalar of the pristine message body.</p>
+
+</dd>
+<dt id="extract_message_metadata-permsgstatus">extract_message_metadata($permsgstatus)</dt>
+<dd>
+
+</dd>
+<dt id="str-get_metadata-hdr">$str = get_metadata($hdr)</dt>
+<dd>
+
+</dd>
+<dt id="put_metadata-hdr-text">put_metadata($hdr, $text)</dt>
+<dd>
+
+</dd>
+<dt id="delete_metadata-hdr">delete_metadata($hdr)</dt>
+<dd>
+
+</dd>
+<dt id="str-get_all_metadata">$str = get_all_metadata()</dt>
+<dd>
+
+</dd>
+<dt id="finish_metadata">finish_metadata()</dt>
+<dd>
+
+<p>Destroys the metadata for this message. Once a message has been scanned fully, the metadata is no longer required. Destroying this will free up some memory.</p>
+
+</dd>
+<dt id="finish">finish()</dt>
+<dd>
+
+<p>Clean up an object so that it can be destroyed.</p>
+
+</dd>
+<dt id="receive_date">receive_date()</dt>
+<dd>
+
+<p>Return a time_t value with the received date of the current message, or current time if received time couldn&#39;t be determined.</p>
+
+</dd>
+</dl>
+
+<h1 id="PARSING-METHODS-NON-PUBLIC">PARSING METHODS, NON-PUBLIC</h1>
+
+<p>These methods take a RFC2822-esque formatted message and create a tree with all of the MIME body parts included. Those parts will be decoded as necessary, and text/html parts will be rendered into a standard text format, suitable for use in SpamAssassin.</p>
+
+<dl>
+
+<dt id="parse_body">parse_body()</dt>
+<dd>
+
+<p>parse_body() passes the body part that was passed in onto the correct part parser, either _parse_multipart() for multipart/* parts, or _parse_normal() for everything else. Multipart sections become the root of sub-trees, while everything else becomes a leaf in the tree.</p>
+
+<p>For multipart messages, the first call to parse_body() doesn&#39;t create a new sub-tree and just uses the parent node to contain children. All other calls to parse_body() will cause a new sub-tree root to be created and children will exist underneath that root. (this is just so the tree doesn&#39;t have a root node which points at the actual root node ...)</p>
+
+</dd>
+<dt id="parse_multipart">_parse_multipart()</dt>
+<dd>
+
+<p>Generate a root node, and for each child part call parse_body() to generate the tree.</p>
+
+</dd>
+<dt id="parse_normal">_parse_normal()</dt>
+<dd>
+
+<p>Generate a leaf node and add it to the parent.</p>
+
+</dd>
+</dl>
+
+
+</body>
+
+</html>
+
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message.txt
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message.txt?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message.txt (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message.txt Wed Jan 29 19:05:59 2020
@@ -0,0 +1,131 @@
+NAME
+    Mail::SpamAssassin::Message - decode, render, and hold an RFC-2822
+    message
+
+DESCRIPTION
+    This module encapsulates an email message and allows access to the
+    various MIME message parts and message metadata.
+
+    The message structure, after initiating a parse() cycle, looks like
+    this:
+
+      Message object, also top-level node in Message::Node tree
+         |
+         +---> Message::Node for other parts in MIME structure
+         |       |---> [ more Message::Node parts ... ]
+         |       [ others ... ]
+         |
+         +---> Message::Metadata object to hold metadata
+
+PUBLIC METHODS
+    new()
+        Creates a Mail::SpamAssassin::Message object. Takes a hash reference
+        as a parameter. The used hash key/value pairs are as follows:
+
+        "message" is either undef (which will use STDIN), a scalar - a
+        string containing an entire message, a reference to such string, an
+        array reference of the message with one line per array element, or
+        either a file glob or an IO::File object which holds the entire
+        contents of the message.
+
+        Note: The message is expected to generally be in RFC 2822 format,
+        optionally including an mbox message separator line (the "From "
+        line) as the first line.
+
+        "parse_now" specifies whether or not to create the MIME tree at
+        object-creation time or later as necessary.
+
+        The *parse_now* option, by default, is set to false (0). This allows
+        SpamAssassin to not have to generate the tree of
+        Mail::SpamAssassin::Message::Node objects and their related data if
+        the tree is not going to be used. This is handy, for instance, when
+        running "spamassassin -d", which only needs the pristine header and
+        body which is always handled when the object is created.
+
+        "subparse" specifies how many MIME recursion levels should be
+        parsed. Defaults to 20.
+
+    find_parts()
+        Used to search the tree for specific MIME parts. See
+        *Mail::SpamAssassin::Message::Node* for more details.
+
+    get_pristine_header()
+        Returns pristine headers of the message. If no specific header name
+        is given as a parameter (case-insensitive), then all headers will be
+        returned as a scalar, including the blank line at the end of the
+        headers.
+
+        If called in an array context, an array will be returned with each
+        specific header in a different element. In a scalar context, the
+        last specific header is returned.
+
+        ie: If 'Subject' is specified as the header, and there are 2 Subject
+        headers in a message, the last/bottom one in the message is returned
+        in scalar context or both are returned in array context.
+
+        Btw, returning the last header field (not the first) happens to be
+        consistent with DKIM signatures, which search for and cover multiple
+        header fields bottom-up according to the 'h' tag. Let's keep it this
+        way.
+
+        Note: the returned header will include the ending newline and any
+        embedded whitespace folding.
+
+    get_mbox_separator()
+        Returns the mbox separator found in the message, or undef if there
+        wasn't one.
+
+    get_body()
+        Returns an array of the pristine message body, one line per array
+        element.
+
+    get_pristine()
+        Returns a scalar of the entire pristine message.
+
+    get_pristine_body()
+        Returns a scalar of the pristine message body.
+
+    extract_message_metadata($permsgstatus)
+    $str = get_metadata($hdr)
+    put_metadata($hdr, $text)
+    delete_metadata($hdr)
+    $str = get_all_metadata()
+    finish_metadata()
+        Destroys the metadata for this message. Once a message has been
+        scanned fully, the metadata is no longer required. Destroying this
+        will free up some memory.
+
+    finish()
+        Clean up an object so that it can be destroyed.
+
+    receive_date()
+        Return a time_t value with the received date of the current message,
+        or current time if received time couldn't be determined.
+
+PARSING METHODS, NON-PUBLIC
+    These methods take a RFC2822-esque formatted message and create a tree
+    with all of the MIME body parts included. Those parts will be decoded as
+    necessary, and text/html parts will be rendered into a standard text
+    format, suitable for use in SpamAssassin.
+
+    parse_body()
+        parse_body() passes the body part that was passed in onto the
+        correct part parser, either _parse_multipart() for multipart/*
+        parts, or _parse_normal() for everything else. Multipart sections
+        become the root of sub-trees, while everything else becomes a leaf
+        in the tree.
+
+        For multipart messages, the first call to parse_body() doesn't
+        create a new sub-tree and just uses the parent node to contain
+        children. All other calls to parse_body() will cause a new sub-tree
+        root to be created and children will exist underneath that root.
+        (this is just so the tree doesn't have a root node which points at
+        the actual root node ...)
+
+    _parse_multipart()
+        Generate a root node, and for each child part call parse_body() to
+        generate the tree.
+
+    _parse_normal()
+        Generate a leaf node and add it to the parent.
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Metadata.html
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Metadata.html?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Metadata.html (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Metadata.html Wed Jan 29 19:05:59 2020
@@ -0,0 +1,49 @@
+<?xml version="1.0" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title></title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+
+
+<ul id="index">
+  <li><a href="#NAME">NAME</a></li>
+  <li><a href="#DESCRIPTION">DESCRIPTION</a></li>
+  <li><a href="#PUBLIC-METHODS">PUBLIC METHODS</a></li>
+</ul>
+
+<h1 id="NAME">NAME</h1>
+
+<p>Mail::SpamAssassin::Message::Metadata - extract metadata from a message</p>
+
+<h1 id="DESCRIPTION">DESCRIPTION</h1>
+
+<p>This class is tasked with extracting &quot;metadata&quot; from messages for use as Bayes tokens, fodder for eval tests, or other rules. Metadata is supplemental data inferred from the message, like the examples below.</p>
+
+<p>It is held in two forms:</p>
+
+<p>1. as name-value pairs of strings, presented in mail header format. For example, &quot;X-Languages&quot; =&gt; &quot;en&quot;. This is the general form for simple metadata that&#39;s useful as Bayes tokens, can be added to marked-up messages using &quot;add_header&quot;, etc., such as the trusted-relay inference and language detection.</p>
+
+<p>2. as more complex data structures on the $msg-&gt;{metadata} object. This is the form used for metadata like the HTML parse data, which is stored there for access by eval rule code. Because it&#39;s not simple strings, it&#39;s not added as a Bayes token by default (Bayes needs simple strings).</p>
+
+<h1 id="PUBLIC-METHODS">PUBLIC METHODS</h1>
+
+<dl>
+
+<dt id="new">new()</dt>
+<dd>
+
+</dd>
+</dl>
+
+
+</body>
+
+</html>
+
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Metadata.txt
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Metadata.txt?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Metadata.txt (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Metadata.txt Wed Jan 29 19:05:59 2020
@@ -0,0 +1,24 @@
+NAME
+    Mail::SpamAssassin::Message::Metadata - extract metadata from a message
+
+DESCRIPTION
+    This class is tasked with extracting "metadata" from messages for use as
+    Bayes tokens, fodder for eval tests, or other rules. Metadata is
+    supplemental data inferred from the message, like the examples below.
+
+    It is held in two forms:
+
+    1. as name-value pairs of strings, presented in mail header format. For
+    example, "X-Languages" => "en". This is the general form for simple
+    metadata that's useful as Bayes tokens, can be added to marked-up
+    messages using "add_header", etc., such as the trusted-relay inference
+    and language detection.
+
+    2. as more complex data structures on the $msg->{metadata} object. This
+    is the form used for metadata like the HTML parse data, which is stored
+    there for access by eval rule code. Because it's not simple strings,
+    it's not added as a Bayes token by default (Bayes needs simple strings).
+
+PUBLIC METHODS
+    new()
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Node.html
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Node.html?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Node.html (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Node.html Wed Jan 29 19:05:59 2020
@@ -0,0 +1,159 @@
+<?xml version="1.0" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title></title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+
+
+<ul id="index">
+  <li><a href="#NAME">NAME</a></li>
+  <li><a href="#DESCRIPTION">DESCRIPTION</a></li>
+  <li><a href="#PUBLIC-METHODS">PUBLIC METHODS</a></li>
+</ul>
+
+<h1 id="NAME">NAME</h1>
+
+<p>Mail::SpamAssassin::Message::Node - decode, render, and make available MIME message parts</p>
+
+<h1 id="DESCRIPTION">DESCRIPTION</h1>
+
+<p>This module will encapsulate an email message and allow access to the various MIME message parts.</p>
+
+<h1 id="PUBLIC-METHODS">PUBLIC METHODS</h1>
+
+<dl>
+
+<dt id="new">new()</dt>
+<dd>
+
+<p>Generates an empty Node object and returns it. Typically only called by functions in Message.</p>
+
+</dd>
+<dt id="find_parts">find_parts()</dt>
+<dd>
+
+<p>Used to search the tree for specific MIME parts. An array of matching Node objects (pointers into the tree) is returned. The parameters that can be passed in are (in order, all scalars):</p>
+
+<p>Regexp - Used to match against each part&#39;s Content-Type header, specifically the type and not the rest of the header. ie: &quot;Content-type: text/html; encoding=quoted-printable&quot; has a type of &quot;text/html&quot;. If no regexp is specified, find_parts() will return an empty array.</p>
+
+<p>Only_leaves - By default, find_parts() will return any part that matches the regexp, including multipart. If you only want to see leaves of the tree (ie: parts that aren&#39;t multipart), set this to true (1).</p>
+
+<p>Recursive - By default, when find_parts() finds a multipart which has parts underneath it, it will recurse through all sub-children. If set to 0, only look at the part and any direct children of the part.</p>
+
+</dd>
+<dt id="header">header()</dt>
+<dd>
+
+<p>Stores and retrieves headers from a specific MIME part. The first parameter is the header name. If there is no other parameter, the header is retrieved. If there is a second parameter, the header is stored.</p>
+
+<p>Header names are case-insensitive and are stored in both raw and decoded form. Using header(), only the decoded form is retrievable.</p>
+
+<p>For retrieval, if header() is called in an array context, an array will be returned with each header entry in a different element. In a scalar context, the last specific header is returned.</p>
+
+<p>ie: If &#39;Subject&#39; is specified as the header, and there are 2 Subject headers in a message, the last/bottom one in the message is returned in scalar context or both are returned in array context.</p>
+
+</dd>
+<dt id="raw_header">raw_header()</dt>
+<dd>
+
+<p>Retrieves the raw version of headers from a specific MIME part. The only parameter is the header name. Header names are case-insensitive.</p>
+
+<p>For retrieval, if raw_header() is called in an array context, an array will be returned with each header entry in a different element. In a scalar context, the last specific header is returned.</p>
+
+<p>ie: If &#39;Subject&#39; is specified as the header, and there are 2 Subject headers in a message, the last/bottom one in the message is returned in scalar context or both are returned in array context.</p>
+
+</dd>
+<dt id="add_body_part">add_body_part()</dt>
+<dd>
+
+<p>Adds a Node child object to the current node object.</p>
+
+</dd>
+<dt id="is_leaf">is_leaf()</dt>
+<dd>
+
+<p>Returns true if the tree node in question is a leaf of the tree (ie: has no children of its own). Note: This function may return odd results unless the message has been mime parsed via _do_parse()!</p>
+
+</dd>
+<dt id="raw">raw()</dt>
+<dd>
+
+<p>Return a reference to the the raw array. Treat this as READ ONLY.</p>
+
+</dd>
+<dt id="decode">decode()</dt>
+<dd>
+
+<p>If necessary, decode the part text as base64 or quoted-printable. The decoded text will be returned as a scalar string. An optional length parameter can be passed in which limits how much decoded data is returned. If the scalar isn&#39;t needed, call with &quot;0&quot; as a parameter.</p>
+
+</dd>
+<dt id="rendered">rendered()</dt>
+<dd>
+
+<p>render_text() takes the given text/* type MIME part, and attempts to render it into a text scalar. It will always render text/html, and will use a heuristic to determine if other text/* parts should be considered text/html. Two scalars are returned: the rendered type (either text/html or whatever the original type was), and the rendered text.</p>
+
+</dd>
+<dt id="set_rendered-text-type">set_rendered($text, $type)</dt>
+<dd>
+
+<p>Set the rendered text and type for the given part. If type is not specified, and text is a defined value, a default of &#39;text/plain&#39; is used. This can be used, for instance, to render non-text parts using plugins.</p>
+
+</dd>
+<dt id="visible_rendered">visible_rendered()</dt>
+<dd>
+
+<p>Render and return the visible text in this part.</p>
+
+</dd>
+<dt id="invisible_rendered">invisible_rendered()</dt>
+<dd>
+
+<p>Render and return the invisible text in this part.</p>
+
+</dd>
+<dt id="content_summary">content_summary()</dt>
+<dd>
+
+<p>Returns an array of scalars describing the mime parts of the message. Note: This function requires that the message be parsed first!</p>
+
+</dd>
+<dt id="delete_header">delete_header()</dt>
+<dd>
+
+<p>Delete the specified header (decoded and raw) from the Node information.</p>
+
+</dd>
+<dt id="get_header">get_header()</dt>
+<dd>
+
+<p>Retrieve a specific header. Will have a newline at the end and will be unfolded. The first parameter is the header name (case-insensitive), and the second parameter (optional) is whether or not to return the raw header.</p>
+
+<p>If get_header() is called in an array context, an array will be returned with each header entry in a different element. In a scalar context, the last specific header is returned.</p>
+
+<p>ie: If &#39;Subject&#39; is specified as the header, and there are 2 Subject headers in a message, the last/bottom one in the message is returned in scalar context or both are returned in array context.</p>
+
+<p>Btw, returning the last header field (not the first) happens to be consistent with DKIM signatures, which search for and cover multiple header fields bottom-up according to the &#39;h&#39; tag. Let&#39;s keep it this way.</p>
+
+</dd>
+<dt id="get_all_headers">get_all_headers()</dt>
+<dd>
+
+<p>Retrieve all headers. Each header will have a newline at the end and will be unfolded. The first parameter (optional) is whether or not to return the raw headers, and the second parameter (optional) is whether or not to include the mbox separator.</p>
+
+<p>If get_all_header() is called in an array context, an array will be returned with each header entry in a different element. In a scalar context, the headers are returned in a single scalar.</p>
+
+</dd>
+</dl>
+
+
+</body>
+
+</html>
+
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Node.txt
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Node.txt?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Node.txt (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_Message_Node.txt Wed Jan 29 19:05:59 2020
@@ -0,0 +1,140 @@
+NAME
+    Mail::SpamAssassin::Message::Node - decode, render, and make available
+    MIME message parts
+
+DESCRIPTION
+    This module will encapsulate an email message and allow access to the
+    various MIME message parts.
+
+PUBLIC METHODS
+    new()
+        Generates an empty Node object and returns it. Typically only called
+        by functions in Message.
+
+    find_parts()
+        Used to search the tree for specific MIME parts. An array of
+        matching Node objects (pointers into the tree) is returned. The
+        parameters that can be passed in are (in order, all scalars):
+
+        Regexp - Used to match against each part's Content-Type header,
+        specifically the type and not the rest of the header. ie:
+        "Content-type: text/html; encoding=quoted-printable" has a type of
+        "text/html". If no regexp is specified, find_parts() will return an
+        empty array.
+
+        Only_leaves - By default, find_parts() will return any part that
+        matches the regexp, including multipart. If you only want to see
+        leaves of the tree (ie: parts that aren't multipart), set this to
+        true (1).
+
+        Recursive - By default, when find_parts() finds a multipart which
+        has parts underneath it, it will recurse through all sub-children.
+        If set to 0, only look at the part and any direct children of the
+        part.
+
+    header()
+        Stores and retrieves headers from a specific MIME part. The first
+        parameter is the header name. If there is no other parameter, the
+        header is retrieved. If there is a second parameter, the header is
+        stored.
+
+        Header names are case-insensitive and are stored in both raw and
+        decoded form. Using header(), only the decoded form is retrievable.
+
+        For retrieval, if header() is called in an array context, an array
+        will be returned with each header entry in a different element. In a
+        scalar context, the last specific header is returned.
+
+        ie: If 'Subject' is specified as the header, and there are 2 Subject
+        headers in a message, the last/bottom one in the message is returned
+        in scalar context or both are returned in array context.
+
+    raw_header()
+        Retrieves the raw version of headers from a specific MIME part. The
+        only parameter is the header name. Header names are
+        case-insensitive.
+
+        For retrieval, if raw_header() is called in an array context, an
+        array will be returned with each header entry in a different
+        element. In a scalar context, the last specific header is returned.
+
+        ie: If 'Subject' is specified as the header, and there are 2 Subject
+        headers in a message, the last/bottom one in the message is returned
+        in scalar context or both are returned in array context.
+
+    add_body_part()
+        Adds a Node child object to the current node object.
+
+    is_leaf()
+        Returns true if the tree node in question is a leaf of the tree (ie:
+        has no children of its own). Note: This function may return odd
+        results unless the message has been mime parsed via _do_parse()!
+
+    raw()
+        Return a reference to the the raw array. Treat this as READ ONLY.
+
+    decode()
+        If necessary, decode the part text as base64 or quoted-printable.
+        The decoded text will be returned as a scalar string. An optional
+        length parameter can be passed in which limits how much decoded data
+        is returned. If the scalar isn't needed, call with "0" as a
+        parameter.
+
+    rendered()
+        render_text() takes the given text/* type MIME part, and attempts to
+        render it into a text scalar. It will always render text/html, and
+        will use a heuristic to determine if other text/* parts should be
+        considered text/html. Two scalars are returned: the rendered type
+        (either text/html or whatever the original type was), and the
+        rendered text.
+
+    set_rendered($text, $type)
+        Set the rendered text and type for the given part. If type is not
+        specified, and text is a defined value, a default of 'text/plain' is
+        used. This can be used, for instance, to render non-text parts using
+        plugins.
+
+    visible_rendered()
+        Render and return the visible text in this part.
+
+    invisible_rendered()
+        Render and return the invisible text in this part.
+
+    content_summary()
+        Returns an array of scalars describing the mime parts of the
+        message. Note: This function requires that the message be parsed
+        first!
+
+    delete_header()
+        Delete the specified header (decoded and raw) from the Node
+        information.
+
+    get_header()
+        Retrieve a specific header. Will have a newline at the end and will
+        be unfolded. The first parameter is the header name
+        (case-insensitive), and the second parameter (optional) is whether
+        or not to return the raw header.
+
+        If get_header() is called in an array context, an array will be
+        returned with each header entry in a different element. In a scalar
+        context, the last specific header is returned.
+
+        ie: If 'Subject' is specified as the header, and there are 2 Subject
+        headers in a message, the last/bottom one in the message is returned
+        in scalar context or both are returned in array context.
+
+        Btw, returning the last header field (not the first) happens to be
+        consistent with DKIM signatures, which search for and cover multiple
+        header fields bottom-up according to the 'h' tag. Let's keep it this
+        way.
+
+    get_all_headers()
+        Retrieve all headers. Each header will have a newline at the end and
+        will be unfolded. The first parameter (optional) is whether or not
+        to return the raw headers, and the second parameter (optional) is
+        whether or not to include the mbox separator.
+
+        If get_all_header() is called in an array context, an array will be
+        returned with each header entry in a different element. In a scalar
+        context, the headers are returned in a single scalar.
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_PerMsgLearner.html
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_PerMsgLearner.html?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_PerMsgLearner.html (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_PerMsgLearner.html Wed Jan 29 19:05:59 2020
@@ -0,0 +1,69 @@
+<?xml version="1.0" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title></title>
+<meta http-equiv="content-type" content="text/html; charset=utf-8" />
+<link rev="made" href="mailto:root@localhost" />
+</head>
+
+<body style="background-color: white">
+
+
+
+<ul id="index">
+  <li><a href="#NAME">NAME</a></li>
+  <li><a href="#SYNOPSIS">SYNOPSIS</a></li>
+  <li><a href="#DESCRIPTION">DESCRIPTION</a></li>
+  <li><a href="#METHODS">METHODS</a></li>
+  <li><a href="#SEE-ALSO">SEE ALSO</a></li>
+</ul>
+
+<h1 id="NAME">NAME</h1>
+
+<p>Mail::SpamAssassin::PerMsgLearner - per-message status (spam or not-spam)</p>
+
+<h1 id="SYNOPSIS">SYNOPSIS</h1>
+
+<pre><code>  my $spamtest = new Mail::SpamAssassin ({
+    &#39;rules_filename&#39;      =&gt; &#39;/etc/spamassassin.rules&#39;,
+    &#39;userprefs_filename&#39;  =&gt; $ENV{HOME}.&#39;/.spamassassin/user_prefs&#39;
+  });
+  my $mail = $spamtest-&gt;parse();
+
+  my $status = $spamtest-&gt;learn($mail,$id,$isspam,$forget);
+  my $didlearn = $status-&gt;did_learn();
+  $status-&gt;finish();</code></pre>
+
+<h1 id="DESCRIPTION">DESCRIPTION</h1>
+
+<p>The Mail::SpamAssassin <code>learn()</code> method returns an object of this class. This object encapsulates all the per-message state for the learning process.</p>
+
+<h1 id="METHODS">METHODS</h1>
+
+<dl>
+
+<dt id="didlearn-status-did_learn">$didlearn = $status-&gt;did_learn()</dt>
+<dd>
+
+<p>Returns <code>1</code> if the message was learned from or forgotten successfully.</p>
+
+</dd>
+<dt id="status-finish">$status-&gt;finish()</dt>
+<dd>
+
+<p>Finish with the object.</p>
+
+</dd>
+</dl>
+
+<h1 id="SEE-ALSO">SEE ALSO</h1>
+
+<p>Mail::SpamAssassin(3) spamassassin(1)</p>
+
+
+</body>
+
+</html>
+
+

Added: spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_PerMsgLearner.txt
URL: http://svn.apache.org/viewvc/spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_PerMsgLearner.txt?rev=1873332&view=auto
==============================================================================
--- spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_PerMsgLearner.txt (added)
+++ spamassassin/site/full/3.4.x/doc/Mail_SpamAssassin_PerMsgLearner.txt Wed Jan 29 19:05:59 2020
@@ -0,0 +1,30 @@
+NAME
+    Mail::SpamAssassin::PerMsgLearner - per-message status (spam or
+    not-spam)
+
+SYNOPSIS
+      my $spamtest = new Mail::SpamAssassin ({
+        'rules_filename'      => '/etc/spamassassin.rules',
+        'userprefs_filename'  => $ENV{HOME}.'/.spamassassin/user_prefs'
+      });
+      my $mail = $spamtest->parse();
+
+      my $status = $spamtest->learn($mail,$id,$isspam,$forget);
+      my $didlearn = $status->did_learn();
+      $status->finish();
+
+DESCRIPTION
+    The Mail::SpamAssassin "learn()" method returns an object of this class.
+    This object encapsulates all the per-message state for the learning
+    process.
+
+METHODS
+    $didlearn = $status->did_learn()
+        Returns 1 if the message was learned from or forgotten successfully.
+
+    $status->finish()
+        Finish with the object.
+
+SEE ALSO
+    Mail::SpamAssassin(3) spamassassin(1)
+