<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>config on Mister Muffin Blog</title>
    <link>http://blog.mister-muffin.de/tags/config/</link>
    <description>Recent content in config on Mister Muffin Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 30 Nov 2014 16:39:00 +0000</lastBuildDate><atom:link href="http://blog.mister-muffin.de/tags/config/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>simple email setup</title>
      <link>http://blog.mister-muffin.de/2014/11/30/simple-email-setup/</link>
      <pubDate>Sun, 30 Nov 2014 16:39:00 +0000</pubDate>
      
      <guid>http://blog.mister-muffin.de/2014/11/30/simple-email-setup/</guid>
      <description>&lt;p&gt;I was unable to find a good place that describes how to create a simple
self-hosted email setup. The most surprising discovery was, how much already
works after:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get install postfix dovecot-imapd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Right after having finished the installation I was able to receive email (but
only in in &lt;code&gt;/var/mail&lt;/code&gt; in mbox format) and send email (bot not from any other
host). So while I expected a pretty complex setup, it turned out to boil down
to just adjusting some configuration parameters.&lt;/p&gt;
&lt;h1 id=&#34;postfix&#34;&gt;Postfix&lt;/h1&gt;
&lt;p&gt;The two interesting files to configure postfix are &lt;code&gt;/etc/postfix/main.cf&lt;/code&gt; and
&lt;code&gt;/etc/postfix/master.cf&lt;/code&gt;. A commented version of the former exists in
&lt;code&gt;/usr/share/postfix/main.cf.dist&lt;/code&gt;. Alternatively, there is the ~600k word
strong man page postconf(5). The latter file is documented in master(5).&lt;/p&gt;
&lt;h2 id=&#34;etcpostfixmaincf&#34;&gt;/etc/postfix/main.cf&lt;/h2&gt;
&lt;p&gt;I changed the following in my &lt;code&gt;main.cf&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;@@ -37,3 +37,9 @@
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt; mailbox_size_limit = 0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; recipient_delimiter = +
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; inet_interfaces = all
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+home_mailbox = Mail/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+smtpd_recipient_restrictions = permit_mynetworks reject_unauth_destination permit_sasl_authenticated
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+smtpd_sasl_type = dovecot
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+smtpd_sasl_path = private/auth
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+smtp_helo_name = my.reverse.dns.name.com
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At this point, also make sure that the parameters &lt;code&gt;smtpd_tls_cert_file&lt;/code&gt; and
&lt;code&gt;smtpd_tls_key_file&lt;/code&gt; point to the right certificate and private key file. So
either change these values or replace the content of
&lt;code&gt;/etc/ssl/certs/ssl-cert-snakeoil.pem&lt;/code&gt; and
&lt;code&gt;/etc/ssl/private/ssl-cert-snakeoil.key&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;home_mailbox&lt;/code&gt; parameter sets the default path for incoming mail. Since
there is no leading slash, this puts mail into &lt;code&gt;$HOME/Mail&lt;/code&gt; for each user. The
trailing slash is important as it specifies ``qmail-style delivery&amp;rsquo;&amp;rsquo; which
means maildir.&lt;/p&gt;
&lt;p&gt;The default of the &lt;code&gt;smtpd_recipient_restrictions&lt;/code&gt; parameter is
&lt;code&gt;permit_mynetworks reject_unauth_destination&lt;/code&gt; so this just adds the
&lt;code&gt;permit_sasl_authenticated&lt;/code&gt; option. This is necessary to allow users to send
email when they successfully verified their login through dovecot.  The dovecot
login verification is activated through the &lt;code&gt;smtpd_sasl_type&lt;/code&gt; and
&lt;code&gt;smtpd_sasl_path&lt;/code&gt; parameters.&lt;/p&gt;
&lt;p&gt;I found it necessary to set the &lt;code&gt;smtp_helo_name&lt;/code&gt; parameter to the reverse DNS
of my server. This was necessary because many other email servers would only
accept email from a server with a valid reverse DNS entry. My hosting provider
charges USD 7.50 per month to change the default reverse DNS name, so the easy
solution is, to instead just adjust the name announced in the SMTP &lt;code&gt;helo&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;etcpostfixmastercf&#34;&gt;/etc/postfix/master.cf&lt;/h2&gt;
&lt;p&gt;The file &lt;code&gt;master.cf&lt;/code&gt; is used to enable the &lt;code&gt;submission&lt;/code&gt; service. The following
diff just removes the comment character from the appropriate section.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;@@ -13,12 +13,12 @@
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt; #smtpd     pass  -       -       -       -       -       smtpd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; #dnsblog   unix  -       -       -       -       0       dnsblog
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; #tlsproxy  unix  -       -       -       -       0       tlsproxy
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-#submission inet n       -       -       -       -       smtpd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-#  -o syslog_name=postfix/submission
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-#  -o smtpd_tls_security_level=encrypt
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-#  -o smtpd_sasl_auth_enable=yes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-#  -o milter_macro_daemon_name=ORIGINATING
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+submission inet n       -       -       -       -       smtpd
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+  -o syslog_name=postfix/submission
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+  -o smtpd_tls_security_level=encrypt
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+  -o smtpd_sasl_auth_enable=yes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+  -o milter_macro_daemon_name=ORIGINATING
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&lt;/span&gt; #smtps     inet  n       -       -       -       -       smtpd
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; #  -o syslog_name=postfix/smtps
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; #  -o smtpd_tls_wrappermode=yes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;dovecot&#34;&gt;Dovecot&lt;/h1&gt;
&lt;p&gt;Since above configuration changes made postfix store email in a different
location and format than the default, dovecot has to be informed about these
changes as well. This is done in &lt;code&gt;/etc/dovecot/conf.d/10-mail.conf&lt;/code&gt;. The second
configuration change enables postfix to authenticate users through dovecot in
&lt;code&gt;/etc/dovecot/conf.d/10-master.conf&lt;/code&gt;. For SSL one should look into
&lt;code&gt;/etc/dovecot/conf.d/10-ssl.conf&lt;/code&gt; and either adapt the parameters &lt;code&gt;ssl_cert&lt;/code&gt;
and &lt;code&gt;ssl_key&lt;/code&gt; or store the correct certificate and private key in
&lt;code&gt;/etc/dovecot/dovecot.pem&lt;/code&gt; and &lt;code&gt;/etc/dovecot/private/dovecot.pem&lt;/code&gt;,
respectively.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;dovecot-core&lt;/code&gt; package (which &lt;code&gt;dovecot-imapd&lt;/code&gt; depends on) ships tons of
documentation. The file
&lt;code&gt;/usr/share/doc/dovecot-core/dovecot/documentation.txt.gz&lt;/code&gt; gives an overview of
what resources are available. The path
&lt;code&gt;/usr/share/doc/dovecot-core/dovecot/wiki&lt;/code&gt; contains a snapshot of the dovecot
wiki at &lt;a href=&#34;http://wiki2.dovecot.org/&#34;&gt;http://wiki2.dovecot.org/&lt;/a&gt;. The example configurations seem to be the
same files as in &lt;code&gt;/etc/&lt;/code&gt; which are already well commented.&lt;/p&gt;
&lt;h2 id=&#34;etcdovecotconfd10-mailconf&#34;&gt;/etc/dovecot/conf.d/10-mail.conf&lt;/h2&gt;
&lt;p&gt;The following diff changes the default email location in &lt;code&gt;/var/mail&lt;/code&gt; to a
maildir in &lt;code&gt;~/Mail&lt;/code&gt; as configured for postfix above.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;@@ -27,7 +27,7 @@
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt; #
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; # &amp;lt;doc/wiki/MailLocation.txt&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; #
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-mail_location = mbox:~/mail:INBOX=/var/mail/%u
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+mail_location = maildir:~/Mail
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; # If you need to set multiple mailbox locations or want to change default
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; # namespace settings, you can do it by defining namespace sections.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;etcdovecotconfd10-masterconf&#34;&gt;/etc/dovecot/conf.d/10-master.conf&lt;/h2&gt;
&lt;p&gt;And this enables the authentication socket for postfix:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;@@ -93,9 +93,11 @@
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;   }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   # Postfix smtp-auth
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-  #unix_listener /var/spool/postfix/private/auth {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-  #  mode = 0666
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-  #}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+  unix_listener /var/spool/postfix/private/auth {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+    mode = 0660
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+    user = postfix
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+    group = postfix
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+  }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   # Auth process is run as this user.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   #user = $default_internal_user
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id=&#34;aliases&#34;&gt;Aliases&lt;/h1&gt;
&lt;p&gt;Now Email will automatically put into the &amp;lsquo;~/Mail&amp;rsquo; directory of the receiver.
So a user has to be created for whom one wants to receive mail&amp;hellip;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ adduser josch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;hellip;and any aliases for it to be configured in &lt;code&gt;/etc/aliases&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;@@ -1,2 +1,4 @@
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-# See man 5 aliases for format
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;-postmaster:    root
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+root:       josch
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+postmaster: josch
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+hostmaster: josch
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;+webmaster:  josch
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After editing &lt;code&gt;/etc/aliases&lt;/code&gt;, the command&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ newaliases
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;has to be run. More can be read in the aliases(5) man page.&lt;/p&gt;
&lt;h1 id=&#34;finishing-up&#34;&gt;Finishing up&lt;/h1&gt;
&lt;p&gt;Everything is done and now postfix and dovecot have to be informed about the
changes. There are many ways to do that. Either restart the services, reboot or
just do:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ postfix reload
$ doveadm reload
&lt;/code&gt;&lt;/pre&gt;
&lt;h1 id=&#34;spf&#34;&gt;SPF&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;$ apt-get install postfix-policyd-spf-python
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;etcpostfixmaincf-1&#34;&gt;/etc/postfix/main.cf&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;policy-spf_time_limit = 3600s
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;etcpostfixmastercf-1&#34;&gt;/etc/postfix/master.cf&lt;/h2&gt;
&lt;p&gt;policy-spf  unix  -       n       n       -       -       spawn
user=nobody argv=/usr/bin/policyd-spf&lt;/p&gt;
&lt;p&gt;DNS TXT record with value:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;v=spf1 ip4:62.75.219.19 -all
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;etcpostfix-policyd-spf-pythonpolicyd-spfconf&#34;&gt;/etc/postfix-policyd-spf-python/policyd-spf.conf&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;debugLevel = 1 
defaultSeedOnly = 1

HELO_reject = SPF_Not_Pass
Mail_From_reject = Fail

PermError_reject = False
TempError_Defer = False

skip_addresses = 127.0.0.0/8,::ffff:127.0.0.0//104,::1//128
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;FIXME: the &lt;code&gt;skip_addresses&lt;/code&gt; field should also list all hosts that I get email
forwarded from. For example if I get my &lt;a href=&#34;mailto:josch@debian.org&#34;&gt;josch@debian.org&lt;/a&gt; email forwarded to
this server, then I should list the debian.org mail relay servers. A list of
these can be found by doing:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ldapsearch -x -LLL -b dc=debian,dc=org -h db.debian.org &#39;purpose=mail relay&#39; ipHostNumber
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Otherwise, senders with an SPF record with only their own IP and a final &lt;code&gt;-all&lt;/code&gt;
will see their mail rejected by the server. This is because the email was
forwarded by the debian.org relay but that IP was not in their SPF record.&lt;/p&gt;
&lt;h1 id=&#34;dkim&#34;&gt;DKIM&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;$ apt-get install opendkim opendkim-tools
$ mkdir /etc/mail
$ cd /etc/mail
$ opendkim-genkey -t -s mail -d mister-muffin.de
$ cat mail.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;etcopendkimconf&#34;&gt;/etc/opendkim.conf&lt;/h2&gt;
&lt;p&gt;Domain                  mister-muffin.de
KeyFile                 /etc/mail/mail.private
Selector                mail
Canonicalization        relaxed/relaxed&lt;/p&gt;
&lt;h2 id=&#34;etcdefaultopendkim&#34;&gt;/etc/default/opendkim&lt;/h2&gt;
&lt;p&gt;SOCKET=&amp;ldquo;inet:8891@localhost&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;etcpostfixmaincf-2&#34;&gt;/etc/postfix/main.cf&lt;/h2&gt;
&lt;p&gt;milter_default_action = accept
milter_protocol = 2
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ service opendkim restart
$ service postfix restart
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>automatically suspending cpu hungry applications</title>
      <link>http://blog.mister-muffin.de/2014/11/07/automatically-suspending-cpu-hungry-applications/</link>
      <pubDate>Fri, 07 Nov 2014 08:51:00 +0000</pubDate>
      
      <guid>http://blog.mister-muffin.de/2014/11/07/automatically-suspending-cpu-hungry-applications/</guid>
      <description>&lt;p&gt;TLDR: Using the &lt;a href=&#34;http://awesome.naquadah.org&#34;&gt;awesome window manager&lt;/a&gt;: how to automatically send
&lt;code&gt;SIGSTOP&lt;/code&gt; and &lt;code&gt;SIGCONT&lt;/code&gt; to application windows when they get unfocused or
focused, respectively, to let the application not waste CPU cycles when not in
use.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t require any fancy looking GUI, so my desktop runs no full-blown desktop
environment like Gnome or KDE but instead only awesome as a light-weight window
manager. Usually, the only application windows I have open are rxvt-unicode as
my terminal emulator and firefox/iceweasel with the &lt;a href=&#34;http://5digits.org/pentadactyl&#34;&gt;pentadactyl&lt;/a&gt; extension as my
browser. Thus, I would expect that CPU usage of my idle system would be pretty
much zero but instead firefox decides to constantly eat 10-15%. Probably to
update some GIF animations or JavaScript (or nowadays even HTML5 video
animations).  But I don&amp;rsquo;t need it to do that when I&amp;rsquo;m not currently looking at
my browser window.  Disabling all JavaScript is no option because some websites
that I need for uni or work are just completely broken without JavaScript, so I
have to enable it for those websites.&lt;/p&gt;
&lt;p&gt;Solution: send &lt;code&gt;SIGSTOP&lt;/code&gt; when my firefox window looses focus and send &lt;code&gt;SIGCONT&lt;/code&gt;
once it gains focus again.&lt;/p&gt;
&lt;p&gt;The following addition to my &lt;code&gt;/etc/xdg/awesome/rc.lua&lt;/code&gt; does the trick:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;local&lt;/span&gt; capi &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; { timer &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; timer }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;client.add_signal(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;focus&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;(c)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; c.class &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Iceweasel&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    awful.util.spawn(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kill -CONT &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;..&lt;/span&gt; c.pid)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;client.add_signal(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;unfocus&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt;(c)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; c.class &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Iceweasel&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;local&lt;/span&gt; timer_stop &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; capi.timer { timeout &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;local&lt;/span&gt; send_sigstop &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;function&lt;/span&gt; ()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      timer_stop:stop()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; client.focus.pid &lt;span style=&#34;color:#f92672&#34;&gt;~=&lt;/span&gt; c.pid &lt;span style=&#34;color:#66d9ef&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        awful.util.spawn(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;kill -STOP &amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;..&lt;/span&gt; c.pid)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    timer_stop:add_signal(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;timeout&amp;#34;&lt;/span&gt;, send_sigstop)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    timer_stop:start()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Since I&amp;rsquo;m running Debian, the class is &amp;ldquo;Iceweasel&amp;rdquo; and not &amp;ldquo;Firefox&amp;rdquo;. When the
window gains focus, a &lt;code&gt;SIGCONT&lt;/code&gt; is sent immediately. I&amp;rsquo;m executing &lt;code&gt;kill&lt;/code&gt;
because I don&amp;rsquo;t know how to send UNIX signals from lua directly.&lt;/p&gt;
&lt;p&gt;When the window looses focus, then the &lt;code&gt;SIGSTOP&lt;/code&gt; signal is only sent after a 10
second timeout. This is done for several reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I don&amp;rsquo;t want firefox to stop in cases where I&amp;rsquo;m just quickly switching back and forth between it and other application windows&lt;/li&gt;
&lt;li&gt;When firefox starts, it doesn&amp;rsquo;t have a window for a short time. So without a timeout, the process would start but immediately get stopped as there is no window to have a focus.&lt;/li&gt;
&lt;li&gt;when using the X paste buffer, then the application behind the source window must not be stopped when pasting content from it. I assume that I will not spend more than 10 seconds between marking a string in firefox and pasting it into another window&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With this change, when I now open &lt;code&gt;htop&lt;/code&gt;, the process consuming most CPU
resources is htop itself. Success!&lt;/p&gt;
&lt;p&gt;Another cool advantage is, that firefox can now be moved completely into swap
space in case I run otherwise memory hungry applications without ever requiring
any memory from swap until I really use it again.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t encountered any disadvantages of this setup yet. If 10 seconds prove
to be too short to copy and paste I can easily extend this delay. Even clicking
on links in my terminal works flawlessly - the new tab will just only load once
firefox gets focused again.&lt;/p&gt;
&lt;p&gt;EDIT: thanks to Helmut Grohne for suggesting to compare the pid instead of the
raw client instance to prevent misbehaviour when firefox opens additional
windows like the preferences dialog.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>mplayer config</title>
      <link>http://blog.mister-muffin.de/2011/03/15/mplayer-config/</link>
      <pubDate>Tue, 15 Mar 2011 11:49:00 +0000</pubDate>
      
      <guid>http://blog.mister-muffin.de/2011/03/15/mplayer-config/</guid>
      <description>&lt;p&gt;There are dozens of vim configs but not many for mplayer but the defaults dont
work that well on some media so here is how I like my mplayer:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;stop-xscreensaver=1
vo=xv
ontop=yes
lavdopts=fast=1:threads=2:skiploopfilter=all
autosync=30
framedrop=yes
cache=102400
cache-min=20
cache-seek-min=20
softvol=1
softvol-max=1000
idx=1
ass=yes
embeddedfonts=yes
vfm=libmpeg2 # to selecgt mpeg12 over ffmpeg2
#ao=alsa:device=hw=0.3
#af=pan=2:1:0:0:1:1:0:0:1:0.5:0.5:1:1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Line 1 to 3 are self explanatory. Lines 4 to 6 add some options that slightly
improve playback performance. Line 7 to 9 add some ridiculously high caches for
playback performance as well.&lt;/p&gt;
&lt;p&gt;The softvol entries of lines 10, 11 are sometimes necessary when audio is very
silent and you have to make it louder than 100%.&lt;/p&gt;
&lt;p&gt;Line 12 rebuilds the index for broken files automatically to be able to seek in
files that are either broken or not yet fully downloaded.&lt;/p&gt;
&lt;p&gt;Lines 13,14 add support for styled subtitles which are more and more used to
subtitle anime and those subtitles are incredible.&lt;/p&gt;
&lt;p&gt;Line 15 will probably be removed once an ffmpeg2 bug in decoding mpeg1/2
content is fixed. On some content it creates horrible artifacts and it took me
some time to find out that the decoder is broken and i have to force usage of
the mpeg12 decoder.&lt;/p&gt;
&lt;p&gt;The last two lines are commented out as i only use them seldomly cases and they
would otherwise hinder playback. They select my hdmi audio device for output
(in cases where my laptop is connected to a hdmi device) and make 5.1 sound
play back correctly, mixing it down to stereo.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
