0

I have installed and successfully configured exim4 and sa-exim on my Ubuntu LTS installation. Spam Emails are successfully flagged:

X-SA-Exim-Connect-IP: 89.238.139.198
X-SA-Exim-Mail-From: hertaqcrqsaa@xxx
Subject: =?UTF-8?Q?F=C3=BCr_den_privaten_und_gesch=C3=A4ftlichen_Gebrauch:_=C3=B6konomische_LED-Lampen,_verbilligt?=
X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on mail.root42.de
X-Spam-Flag: YES
X-Spam-Level: **********
X-Spam-Status: Yes, score=10.3 required=5.0 tests=BAYES_60,HTML_IMAGE_ONLY_20,
    HTML_MESSAGE,HTML_SHORT_LINK_IMG_3,RCVD_IN_SBL_CSS,SPF_PASS,
    T_DKIM_INVALID,URIBL_ABUSE_SURBL,URIBL_BLOCKED,URIBL_DBL_SPAM
    autolearn=no autolearn_force=no version=3.4.2
X-SA-Exim-Version: 4.2.1 (built Sun, 16 Aug 2015 09:47:16 +0000)
X-SA-Exim-Scanned: Yes (on xxx.xxxxxx.de)

But still the email is delivered to the user's INBOX Maildir. How can I change this to go to the user's .Spam Maildir?

Arne
  • 123

2 Answers2

1

I don't know if exim4 and sa-exim can automagically do that for you. Someone else may chime in on that.

However, at the user's computer, in Thunderbird, you can use Message Filters, to move spam email to a spam folder. Create a new message filter like so... (if you don't wish to match on X-Spam-Status, you can create a special flag, called for example, X-Spam-Flag)...

enter image description here

heynnema
  • 73,649
1

Found it out myself via the excellent Exim Wiki:

First of all you have to create a file /etc/exim4/conf.d/router/899_exim4-config_local_user_spam with this content:

### router/900_exim4-config_local_user_spam                               
#################################                                         

# This router matches local user mailboxes. If the router fails, the error
# message is "Unknown user".                                              

local_user_spam:                                                          
  debug_print = "R: local_user_spam for $local_part@$domain"              
  driver = accept                                                         
  domains = +local_domains                                                
  check_local_user                                                        
  local_parts = !www:!root:!nobody:!postmaster:!abuse:!admin              
  transport = maildir_spam_delivery                                       
  condition = ${if def:h_X-Spam-Flag: {true}}                             
  cannot_route_message = Unknown user                                     

This will be matched BEFORE the local user router which has number 900. This ensures that spam will be delivered using the following transport.

Create a transport in /etc/exim4/conf.d/transport/30_exim4-config_maildir_spam_delivery with this content:

### transport/30_exim4-config_maildir_spam_delivery                      
#################################                                        

# Use this instead of mail_spool if you want to to deliver to Maildir in 
# home-directory - change the definition of LOCAL_DELIVERY               
#                                                                        
maildir_spam_delivery:                                                   
  debug_print = "T: maildir_spam_delivery for $local_part@$domain"       
  driver = appendfile                                                    
  .ifdef MAILDIR_HOME_MAILDIR_LOCATION                                   
  directory = MAILDIR_HOME_MAILDIR_LOCATION/.Junk                        
  .else                                                                  
  directory = $home/Maildir/.Junk                                        
  .endif                                                                 
  .ifdef MAILDIR_HOME_CREATE_DIRECTORY                                   
  create_directory                                                       
  .endif                                                                 
  .ifdef MAILDIR_HOME_CREATE_FILE                                        
  create_file = MAILDIR_HOME_CREATE_FILE                                 
  .endif                                                                 
  delivery_date_add                                                      
  envelope_to_add                                                        
  return_path_add                                                        
  maildir_format                                                         
  .ifdef MAILDIR_HOME_DIRECTORY_MODE                                     
  directory_mode = MAILDIR_HOME_DIRECTORY_MODE                           
  .else                                                                  
  directory_mode = 0700                                                  
  .endif                                                                 
  .ifdef MAILDIR_HOME_MODE                                               
  mode = MAILDIR_HOME_MODE                                               
  .else                                                                  
  mode = 0600                                                            
  .endif                                                                 
  mode_fail_narrower = false                                             
  # This transport always chdirs to $home before trying to deliver. If   
  # $home is not accessible, this chdir fails and prevents delivery.     
  # If you are in a setup where home directories might not be            
  # accessible, uncomment the current_directory line below.              
  # current_directory = /                                                

This is basically a copy of the defailt maildir_home transport, only appending /.Junk to the maildir name.

I am sure that exim4 can do this a bit more elegant with some if and else, but my exim foo is not good enough yet. Any exim professionals are welcome to add to this solution.

Arne
  • 123