PROCMAIL(1)
๐ NAME ๐
procmail โ autonomous mail processor. This is the PROCMAIL(1) page from the General Commands Manual, bestie. It's giving โyour mail is about to get organized,โ no cap. ๐
โจ SYNOPSIS โจ
okay so here's the invocation menu, literally exactly:
procmail [-ptoY] [-f fromwhom]
[parameter=value | rcfile] ...
procmail [-toY] [-f fromwhom] [-a argument] ...
-d recipient ...
procmail [-ptY] -m [parameter=value] ... rcfile
[argument] ...
procmail [-toY] [-a argument] -z
procmail -v
๐ธ DESCRIPTION ๐ธ
For a quick start, see NOTES at the end. ๐ซถ
Procmail should be invoked automatically over the .forward file mechanism as soon as mail arrives. Alternatively, when installed by a system administrator, it can be invoked from within the mailer immediately. When invoked, it first sets some environment variables to default values, reads the mail message from stdin until an EOF, separates the body from the header, and then, if no command line arguments are present, it starts to look for a file named $HOME/.procmailrc. According to the processing recipes in this file, the mail message that just arrived gets distributed into the right folder (and more). If no rcfile is found, or processing of the rcfile falls off the end, procmail will store the mail in the default system mailbox.
If no rcfiles and no -p have been specified on the command line, procmail will, prior to reading $HOME/.procmailrc, interpret commands from /etc/procmailrc (if present).
โ ๏ธ Care must be taken when creating/etc/procmailrc, because, if circumstances permit, it will be executed with root privileges (contrary to the$HOME/.procmailrcfile of course). ๐
If running suid root or with root privileges, procmail will be able to perform as a functionally enhanced, backwards compatible mail delivery agent.
Procmail can also be used as a general purpose mail filter, i.e., provisions have been made to enable procmail to be invoked in a special sendmail rule.
The rcfile format is described in detail in the procmailrc(5) man page.
The weighted scoring technique is described in detail in the procmailsc(5) man page.
Examples for rcfile recipes can be looked up in the procmailex(5) man page.
๐ฆ Signals ๐ฆ
- TERMINATE โ Terminate prematurely and requeue the mail.
- HANGUP โ Terminate prematurely and bounce the mail.
- INTERRUPT โ Terminate prematurely and bounce the mail.
- QUIT โ Terminate prematurely and silently lose the mail.
- ALARM โ Force a timeout (see TIMEOUT).
- USR1 โ Equivalent to a
VERBOSE=off. - USR2 โ Equivalent to a
VERBOSE=on.
๐ OPTIONS ๐
bestie, every flag is here, do not skip a single one:
-vโ Procmail will print its version number, display its compile time configuration and exit.-pโ Preserve any old environment. Normally procmail clears the environment upon startup, except for the value ofTZ. However, in any case: any default values will override any preexisting environment variables, i.e., procmail will not pay any attention to any predefined environment variables, it will happily overwrite them with its own defaults. For the list of environment variables that procmail will preset see theprocmailrc(5)man page. If both-pand-mare specified, the list of preset environment variables shrinks to just:LOGNAME,HOME,SHELL,USER_SHELL,ORGMAILandMAILDIR.-tโ Make procmail fail softly, i.e., if procmail cannot deliver the mail to any of the destinations you gave, the mail will not bounce, but will return to the mailqueue. Another delivery-attempt will be made at some time in the future.-f fromwhomโ Causes procmail to regenerate the leadingFromline with fromwhom as the sender (instead of-fone could use the alternate and obsolete-r). If fromwhom consists merely of a single-, then procmail will only update the timestamp on theFromline (if present, if not, it will generate a new one).-oโ Instead of allowing anyone to generateFromlines, simply override the fakes.-Yโ Assume traditional Berkeley mailbox format, ignore anyContent-Length:fields.-a argumentโ This will set$1to be equal to argument. Each succeeding-aargument will set the next number variable ($2,$3, etc). It can be used to pass meta information along to procmail. This is typically done by passing along the$@xinformation from the sendmail mailer rule.-d recipient ...โ This turns on explicit delivery mode, delivery will be to the local user recipient. This, of course, only is possible if procmail has root privileges (or if procmail is already running with the recipient's euid and egid). Procmail will setuid to the intended recipients and delivers the mail as if it were invoked by the recipient with no arguments (i.e., if no rcfile is found, delivery is like ordinary mail). This option is incompatible with-p.-mโ Turns procmail into a general purpose mail filter. In this mode one rcfile must be specified on the command line. After the rcfile, procmail will accept an unlimited number of arguments. If the rcfile is an absolute path starting with/etc/procmailrcs/without backward references (i.e. the parent directory cannot be mentioned) procmail will, only if no security violations are found, take on the identity of the owner of the rcfile (or symbolic link). For some advanced usage of this option you should look in the EXAMPLES section below.-zโ This turns on LMTP mode, wherein procmail acts as an RFC2033 LMTP server. Delivery takes place in the same manner and under the same restrictions as the delivery mode enabled with-d. This option is incompatible with-pand-f.
๐ ARGUMENTS ๐
Any arguments containing an '=' are considered to be environment variable assignments, they will all be evaluated after the default values have been assigned and before the first rcfile is opened.
Any other arguments are presumed to be rcfile paths (either absolute, or if they start with ./ relative to the current directory; any other relative path is relative to $HOME, unless the -m option has been given, in which case all relative paths are relative to the current directory); procmail will start with the first one it finds on the command line. The following ones will only be parsed if the preceding ones have a not matching HOST-directive entry, or in case they should not exist.
If no rcfiles are specified, it looks for $HOME/.procmailrc. If not even that can be found, processing will continue according to the default settings of the environment variables and the ones specified on the command line.
๐ง EXAMPLES ๐ง
Examples for rcfile recipes can be looked up in the procmailex(5) man page. A small sample rcfile can be found in the NOTES section below.
Skip the rest of this EXAMPLES section unless you are a system administrator who is vaguely familiar with sendmail.cf syntax.
The -m option is typically used when procmail is called from within a rule in the sendmail.cf file. In order to be able to do this it is convenient to create an extra procmail mailer in your sendmail.cf file (in addition to the perhaps already present local mailer that starts up procmail). To create such a procmail mailer I'd suggest something like:
Mprocmail, P=/usr/bin/procmail, F=mSDFMhun, S=11, R=21,
A=procmail -m $h $g $u
This enables you to use rules like the following (most likely in ruleset 0) to filter mail through the procmail mailer (please note the leading tab to continue the rule, and the tab to separate the comments):
R$*<@some.where>$*
$#procmail $@/etc/procmailrcs/some.rc $:$1@some.where.procmail$2
R$*<@$*.procmail>$*
$1<@$2>$3 Already filtered, map back
And /etc/procmailrcs/some.rc could be as simple as:
SENDER = "<$1>" # fix for empty sender addresses
SHIFT = 1 # remove it from $@
:0 # sink all junk mail
* ^Subject:.*junk
/dev/null
:0 w # pass along all other mail
! -oi -f "$SENDER" "$@"
Do watch out when sending mail from within the /etc/procmailrcs/some.rc file, if you send mail to addresses which match the first rule again, you could be creating an endless mail loop. ๐ญ
๐ FILES ๐
/etc/passwdโ to set the recipient'sLOGNAME,HOMEandUSER_SHELLvariable defaults/var/spool/mail/$LOGNAMEโ system mailbox; both the system mailbox and the immediate directory it is in will be created every time procmail starts and either one is not present/etc/procmailrcโ initial global rcfile/etc/procmailrcs/โ special privileges path for rcfiles$HOME/.procmailrcโ default rcfile/var/spool/mail/$LOGNAME.lockโ lockfile for the system mailbox (not automatically used by procmail, unless$DEFAULTequals/var/spool/mail/$LOGNAMEand procmail is delivering to$DEFAULT)/usr/sbin/sendmailโ default mail forwarder_????`hostname`โ temporaryuniquezero-length files created by procmail
๐ SEE ALSO ๐
procmailrc(5), procmailsc(5), procmailex(5), sh(1), csh(1), mail(1), mailx(1), uucp(1), aliases(5), sendmail(8), egrep(1), grep(1), biff(1), comsat(8), lockfile(1), formail(1), cron(1)
๐ DIAGNOSTICS ๐
okay so bestie, procmail has a lot of little messages it can throw at you, and each one is basically a tiny vibe check on what just went sideways. hereโs the full decoder ring ๐
Autoforwarding mailbox foundโ the system mailbox had itssuidorsgidbit set, so procmail terminates withEX_NOUSER, assuming this mailbox must not be delivered to. do not pass go ๐Bad substitution of "x"โ"x"is not a valid environment variable name.Closing brace unexpectedโ there was no corresponding opening brace for this nesting block, so the braces are giving โwho invited you?โ energy ๐ญConflicting optionsโ not all option combinations are useful, bestie. some combos just do not slay together.Conflicting x suppressedโ flagxis not compatible with some other flag on this recipe.Couldn't create "x"โ the system mailbox was missing and could not/will not be created.Couldn't create maildir part "x"โ the maildir folder"x"is missing one or more required subdirectories, and procmail could not create them.Couldn't create or rename temp file "x"โ an error happened in the mechanics of delivering to the directory folder"x".Couldn't determine implicit lockfile from "x"โ there were no>>redirectors to be found, so itโs using simply$LOCKEXTaslocallockfile.Couldn't read "x"โ procmail was unable to open an rcfile, or it was not a regular file, or procmail couldnโt open an MH directory to find the highest numbered file.Couldn't unlock "x"โ the lockfile was already gone, or write permission to the directory where the lockfile is has been denied.Deadlock attempted on "x"โ thelocallockfilespecified on this recipe is equal to a still active$LOCKFILE. deadlock behavior, not cute ๐Denying special privileges for "x"โ procmail will not take on the identity that comes with the rcfile because a security violation was found (e.g.-por variable assignments on the command line), or procmail had insufficient privileges to do so.Descriptor "x" was not openโ as procmail was started,stdin,stdoutorstderrwas not connected. possibly an attempt to subvert security ๐Enforcing stricter permissions on "x"โ the system mailbox of the recipient was found to be unsecured, so procmail secured it.Error while writing to "x"โ nonexistent subdirectory, no write permission, pipe died, or disk full. classic chaos combo ๐ญExceeded LINEBUFโ buffer overflow detected,LINEBUFwas too small, andPROCMAIL_OVERFLOWhas been set.MAILDIR is not an absolute pathMAILDIR path too longORGMAIL is not an absolute pathORGMAIL path too longdefault rcfile is not an absolute pathdefault rcfile path too long
all six of those mean the specified itemโs full path, when expanded, was longer than LINEBUF or didnโt start with a file separator. path drama, literally ๐ซถ
Excessive output quenched from "x"โ the backquoted expression"x"tried to produce too much output for the currentLINEBUF; the rest was discarded andPROCMAIL_OVERFLOWhas been set.Extraneous x ignoredโ the action line or other flags on this recipe makexmeaningless.Failed forking "x"โ process table is full (andNORESRETRYhas been exhausted).Failed to execute "x"โ program not in path, or not executable.Forced unlock denied on "x"โ no write permission in the directory where lockfile"x"resides, or more than one procmail trying to force a lock at exactly the same time.Forcing lock on "x"โ lockfile"x"is going to be removed by force because of a timeout (see also:LOCKTIMEOUT).Incomplete recipeโ the start of a recipe was found, but it stranded in anEOF.Insufficient privilegesโ procmail either needs root privileges, or must have the right(e)uidand(e)gidto run in delivery mode. the mail will bounce.Invalid regexp "x"โ the regular expression"x"contains errors (most likely some missing or extraneous parens).Kernel-lock failedโ while trying to use the kernel-supported locking calls, one of them failed (usually indicates an OS error), and procmail ignores this error and proceeds.Kernel-unlock failedโ see above.Lock failure on "x"โ can only occur if you specify some real weird (and illegal) lockfilenames, or if the lockfile could not be created because of insufficient permissions or nonexistent subdirectories.Lost "x"โ procmail tried to clone itself but could not find back rcfile"x"(it either got removed, or it was a relative path and you changed directory since procmail opened it last time).Missing actionโ the current recipe was found to be incomplete.Missing closing braceโ a nesting block was started, but never finished. the brace said โIโm freeโ and dipped ๐ญMissing nameโ the-foption needs an extra argument.Missing argumentโ you specified the-aoption but forgot the argument.Missing rcfileโ you specified the-moption, and procmail expects the name of an rcfile as argument.Missing recipientโ you specified the-doption or called procmail under a different name, and it expects one or more recipients as arguments.No space left to finish writing "x"โ the filesystem containing"x"does not have enough free space to permit delivery of the message to the file.Out of memoryโ the system is out of swap space (andNORESRETRYhas been exhausted).Processing continuedโ the unrecognised options on the command line are ignored, proceeding as usual. keep it moving โจProgram failure (nnn) of "x"โ the program that was started by procmail returnednnninstead ofEXIT_SUCCESS(=0); ifnnnis negative, then this is the signal the program died on.Quota exceeded while writing "x"โ the filesize quota for the recipient on the filesystem containing"x"does not permit delivering the message to the file.Renaming bogus "x" into "x"โ the system mailbox of the recipient was found to be bogus, and procmail performed evasive actions.Rescue of unfiltered data succeeded/failedโ a filter returned unsuccessfully, and procmail tried to get back the original text.Skipped: "x"โ couldnโt do anything with"x"in the rcfile (syntax error), so itโs ignoring it.Suspicious rcfile "x"โ the owner of the rcfile was not the recipient or root, the file was world writable, or the directory that contained it was world writable, or this was the default rcfile ($HOME/.procmailrc) and either it was group writable or the directory that contained it was group writable (the rcfile was not used). security said โnahโ ๐Terminating prematurely whilst waiting for ...โ procmail received a signal while it was waiting for...Timeout, terminating "x"โ timeout has occurred on program or filter"x".Timeout, was waiting for "x"โ timeout has occurred on program, filter or file"x". if it was a program or filter, then it didnโt seem to be running anymore.Truncated file to former sizeโ the file could not be delivered to successfully, so the file was truncated to its former size.Truncating "x" and retrying lockโ"x"does not seem to be a valid filename, or the file is not empty.Unable to treat as directory "x"โ either the suffix on"x"would indicate that it should be an MH or maildir folder, or it was listed as an second folder into which to link, but it already exists and is not a directory.Unexpected EOLโ missing closing quote, or trying to escapeEOF.Unknown user "x"โ the specified recipient does not have a correspondinguid.
โจ EXTENDED DIAGNOSTICS โจ
okay so extended diagnostics are a whole extra layer of lore, and you can turn them on and off by setting the VERBOSE variable. Hereโs the group chat translation of every diagnostic procmail can log ๐
[pid] time & dateโ procmailโs pid plus a timestamp. This gets generated whenever procmail logs a diagnostic and at least a second has elapsed since the last timestamp.Acquiring kernel-lockโ procmail is now trying to kernel-lock the most recently opened file (descriptor).Assigning "x"โ environment variable assignment.Assuming identity of the recipient, VERBOSE=offโ dropping all privileges (if any), which implicitly turns off extended diagnostics.Bypassed locking "x"โ the mail spool directory was not accessible to procmail, so it relied solely on kernel locks.Executing "x"โ starting program"x". If procmail starts it directly, without an intermediate shell, procmail will show where it separated the arguments by inserting commas.HOST mismatched "x"โ this host was called"x", butHOSTcontained something else.Locking "x"โ creating lockfile"x".Linking to "x"โ creating a hardlink between directory folders.Match on "x"โ condition matched.Matched "x"โ assigned"x"toMATCH.No match on "x"โ condition didnโt match, so the recipe was skipped.Non-zero exitcode (nnn) by "x"โ program started by procmail as a condition or as the action of a recipe with theWflag returnednnninstead ofEXIT_SUCCESS(=0); the usage indicates that this is not an entirely unexpected condition.Notified comsat: "$LOGNAME@offset:file"โ sent comsat/biff a notice that mail arrived for user$LOGNAMEatoffsetinfile.Opening "x"โ opening file"x"for appending.Rcfile: "x"โ rcfile changed to"x".Reiterating kernel-lockโ while attempting several locking methods, one of these failed. procmail will reiterate until they all succeed in rapid succession.Score: added newtotal "x"โ this condition scoredaddedpoints, which resulted in anewtotalscore.Unlocking "x"โ removing lockfile"x"again.
๐จ WARNINGS ๐จ
bestie, please read these. they are the โdonโt text your exโ of procmail advice ๐ญ
You should create a shell script that uses lockfile(1) before invoking your mail shell on any mailbox file other than the system mailbox (unless, of course, your mail shell uses the same lockfiles โ local or global โ that you specified in your rcfile).
In the unlikely event that you absolutely need to kill procmail before it has finished, first try and use the regular kill command (i.e., not kill -9, see the subsection Signals for suggestions), otherwise some lockfiles might not get removed.
Beware when using the -t option: if procmail repeatedly is unable to deliver the mail (e.g., due to an incorrect rcfile), the system mailqueue could fill up. This could aggravate both the local postmaster and other users.
The /etc/procmailrc file might be executed with root privileges, so be very careful of what you put in it. SHELL will be equal to that of the current recipient, so if procmail has to invoke the shell, youโd better set it to some safe value first. See also: DROPPRIVS.
Keep in mind that if chown(1) is permitted on files in /etc/procmailrcs/, that they can be chowned to root (or anyone else) by their current owners. For maximum security, make sure this directory is executable to root only.
Procmail is not the proper tool for sharing one mailbox among many users, such as when you have one POP account for all mail to your domain. It can be done if you manage to configure your MTA to add some headers with the envelope recipient data in order to tell Procmail who a message is for, but this is usually not the right thing to do. Perhaps you want to investigate if your MTA offers virtual user tables, or check out the multidrop facility of Fetchmail.
๐ BUGS ๐
After removing a lockfile by force, procmail waits $SUSPEND seconds before creating a new lockfile so that another process that decides to remove the stale lockfile will not remove the newly created lock by mistake.
Procmail uses the regular TERMINATE signal to terminate any runaway filter, but it does not check if the filter responds to that signal and it only sends it to the filter itself, not to any of the filterโs children.
A continued Content-Length: field is not handled correctly.
๐ธ MISCELLANEOUS ๐ธ
If there is an existing Content-Length: field in the header of the mail and the -Y option is not specified, procmail will trim the field to report the correct size. Procmail does not change the fieldwidth.
If there is no Content-Length: field or the -Y option has been specified and procmail appends to regular mailfolders, any lines in the body of the message that look like postmarks are prepended with > (disarms bogus mailheaders). The regular expression that is used to search for these postmarks is:
\nFrom
If the destination name used in explicit delivery mode is not in /etc/passwd, procmail will proceed as if explicit delivery mode was not in effect. If not in explicit delivery mode and should the uid procmail is running under have no corresponding /etc/passwd entry, then HOME will default to /, LOGNAME will default to #uid, USER_SHELL will default to /bin/sh, and ORGMAIL will default to /tmp/dead.letter.
When in explicit delivery mode, procmail will generate a leading From line if none is present. If one is already present procmail will leave it intact. If procmail is not invoked with one of the following user or group ids: root, daemon, uucp, mail, x400, network, list, slist, lists or news, but still has to generate or accept a new From line, it will generate an additional >From line to help distinguish fake mails.
For security reasons procmail will only use an absolute or $HOME-relative rcfile if it is owned by the recipient or root, not world writable, and the directory it is contained in is not world writable. The $HOME/.procmailrc file has the additional constraint of not being group-writable or in a group-writable directory.
If /var/spool/mail/$LOGNAME is a bogus mailbox (i.e., does not belong to the recipient, is unwritable, is a symbolic link or is a hard link), procmail will upon startup try to rename it into a file starting with BOGUS.$LOGNAME. and ending in an inode-sequence-code. If this turns out to be impossible, ORGMAIL will have no initial value, and hence will inhibit delivery without a proper rcfile.
If /var/spool/mail/$LOGNAME already is a valid mailbox, but has got too loose permissions on it, procmail will correct this. To prevent procmail from doing this make sure the u+x bit is set.
When delivering to directories, MH folders, or maildir folders, you donโt need to use lockfiles to prevent several concurrently running procmail programs from messing up.
Delivering to MH folders is slightly more time consuming than delivering to normal directories or mailboxes, because procmail has to search for the next available number (instead of having the filename immediately available).
On general failure procmail will return EX_CANTCREAT, unless option -t is specified, in which case it will return EX_TEMPFAIL.
To make egrepping of headers more consistent, procmail concatenates all continued header fields; but only internally. When delivering the mail, line breaks will appear as before.
If procmail is called under a name not starting with procmail (e.g., if it is linked to another name and invoked as such), it comes up in explicit delivery mode, and expects the recipientsโ names as command line arguments (as if -d had been specified).
Comsat/biff notifications are done using udp. They are sent off once when procmail generates the regular logfile entry. The notification messages have the following extended format (or as close as you can get when final delivery was not to a file):
$LOGNAME@offset_of_message_in_mailbox:absolute_path_to_mailbox
Whenever procmail itself opens a file to deliver to, it consistently uses the following kernel locking strategies: fcntl(2).
Procmail is NFS-resistant and eight-bit clean. ๐
๐ธ NOTES ๐ธ
okay so first thing's first: if you call up procmail with the -h or -? options, it will straight up display a command-line help and recipe flag quick-reference page. like, it's giving "read the room, read the flags." ๐
There exists an excellent newbie FAQ about mailfilters (and procmail in particular) โ no cap, it's iconic. It's maintained by Nancy McGough <nancym@ii.com> and you can obtain it by sending a mail to mail-server@rtfm.mit.edu with the following in the body:
send usenet/news.answers/mail/filtering-faq
If procmail is not installed globally as the default mail delivery agent (ask your system administrator, bestie), you have to make sure it is invoked when your mail arrives. In this case your $HOME/.forward file should contain the line below.
โ ๏ธ beware: it has to be world readable. yes, literally everyone can see it. that's the vibe. ๐
Be sure to include the single and double quotes, and unless you know your site to be running smrsh (the SendMail Restricted SHell), it must be an absolute path.
"|exec /usr/bin/procmail"
Some mailers (notably exim) do not currently accept the above syntax. In such case use this instead:
|/usr/bin/procmail
Procmail can also be invoked to postprocess an already filled system mailbox. This can be useful if you don't want to or can't use a $HOME/.forward file โ in which case the following script could periodically be called from within cron(1), or whenever you start reading mail. main character energy tbh ๐
#!/bin/sh
ORGMAIL=/var/spool/mail/$LOGNAME
if cd $HOME &&
test -s $ORGMAIL &&
lockfile -r0 -l1024 .newmail.lock 2>/dev/null
then
trap "rm -f .newmail.lock" 1 2 3 13 15
umask 077
lockfile -l1024 -ml
cat $ORGMAIL >>.newmail &&
cat /dev/null >$ORGMAIL
lockfile -mu
formail -s procmail <.newmail &&
rm -f .newmail
rm -f .newmail.lock
fi
exit 0
๐ฆ A sample small $HOME/.procmailrc ๐ฆ
PATH=/usr/local/bin:/bin:/usr/bin
MAILDIR=$HOME/Mail #you'd better make sure it exists
DEFAULT=$MAILDIR/mbox #completely optional
LOGFILE=$MAILDIR/from #recommended
:0:
* ^From.*berg
from_me
:0
* ^Subject:.*Flame
/dev/null
Other examples for rcfile recipes can be looked up in the procmailex(5) man page. go off, queen ๐
โจ SOURCE โจ
This program is part of the procmail mail-processing-package (v3.24) available at http://www.procmail.org/ or ftp.procmail.org in pub/procmail/. ๐ซถ
๐ MAILINGLIST ๐
There exists a mailinglist for questions relating to any program in the procmail package:
<procmail-users@procmail.org>โ for submitting questions/answers.<procmail-users-request@procmail.org>โ for subscription requests.
If you would like to stay informed about new versions and official patches, send a subscription request to procmail-announce-request@procmail.org โ this is a readonly list, so it's strictly a "look, don't touch" situation. ๐
๐ AUTHORS ๐
Stephen R. van den Berg <srb@cuci.nl>
okay that's the whole page, bestie โ you're officially a procmail girlie now ๐โญ this was the PROCMAIL(1) man page, rendered by BuGless, and it's giving legendary. mwah ๐
๐ฆ where this page comes from
- opensuse-leap 16.0: procmail 3.24-160000.2.2 ยท Artistic-1.0 OR GPL-2.0-or-later
- opensuse-leap 16.0: procmail 3.24-160000.2.2 ยท Artistic-1.0 OR GPL-2.0-or-later
- opensuse-leap 16.0: procmail 3.24-160000.2.2 ยท Artistic-1.0 OR GPL-2.0-or-later
- opensuse-leap 16.0: procmail 3.24-160000.2.2 ยท Artistic-1.0 OR GPL-2.0-or-later
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms