<!DOCTYPE html>
<html lang="en">
  <head>
    <!-- Meta, title, CSS, favicons, etc. -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="">
    <meta name="author" content="">

    <title>Haraka Manual &raquo; Haraka</title>
    
    <!-- Bootstrap core CSS -->
    <link href="/css/bootstrap.css" rel="stylesheet">

    <!-- Documentation extras -->
    <link href="/css/docs.css" rel="stylesheet">
    <link href="/css/pygments-manni.css" rel="stylesheet">

    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!--[if lt IE 9]>
      <script src="/js/html5shiv.js"></script>
      <script src="/js/respond.min.js"></script>
    <![endif]-->

    </head>
      <body class="bs-docs-home">
        <a class="sr-only" href="#content">Skip navigation</a>

        <!-- Docs master nav -->
        <header class="navbar navbar-inverse navbar-fixed-top bs-docs-nav" role="banner">
          <div class="container">
            <div class="navbar-header">
              <button class="navbar-toggle" type="button" data-toggle="collapse" data-target=".bs-navbar-collapse">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
              </button>
              <a href="/" class="navbar-brand">Haraka</a>
            </div>
            <nav class="collapse navbar-collapse bs-navbar-collapse" role="navigation">
              <ul class="nav navbar-nav">
                <li>
                  <a href="/about.html">About</a>
                </li>
                <li>
                  <a href="/community.html">Community</a>
                </li>
                <li>
                  <a href="/users.html">Known Users</a>
                </li>
                <li>
                  <a href="https://github.com/baudehlo/Haraka">Source on Github</a>
                </li>
                <li class="active">
                  <a href="/manual.html">Manual</a>
                </li>
              </ul>
            </nav>
          </div>
        </header>
        
        <!-- Docs page layout -->
        <div class="bs-header" id="content">
          <div class="container">
            <h1>Haraka</h1>
          </div>
        </div>
        
        <div class="container bs-docs-container">
          <div class="row">
            <div class="col-md-3">
              <div id="chapternav" class="bs-sidebar hidden-print" role="complementary">
                <ul class="nav bs-sidenav"><li><a class="submenu" data-toggle="collapse" data-target="#core" data-parent="#chapternav" href="javascript:void(null);">Core</a>
<ul id='core' class='nav'>
<li class="active"><a href='/README.html'>Haraka</a></li>
<li><a href='/manual/Address.html'>Address Object</a></li>
<li><a href='/manual/Body.html'>Body Object</a></li>
<li><a href='/manual/Config.html'>Config Files</a></li>
<li><a href='/manual/Connection.html'>Connection Object</a></li>
<li><a href='/manual/CoreConfig.html'>Core Configuration Files</a></li>
<li><a href='/manual/CustomReturnCodes.html'>Custom Return Codes</a></li>
<li><a href='/manual/HAProxy.html'>HAProxy PROXY protocol extension support</a></li>
<li><a href='/manual/Header.html'>Header Object</a></li>
<li><a href='/manual/Logging_API.html'>Logging API</a></li>
<li><a href='/manual/Net_Utils.html'>Net_Utils</a></li>
<li><a href='/manual/Outbound.html'>Outbound Mail with Haraka</a></li>
<li><a href='/manual/Plugins.html'>Writing Haraka Plugins</a></li>
<li><a href='/manual/Transaction.html'>Transaction Object</a></li>
</ul></li>
<li><a class="submenu" data-toggle="collapse" data-target="#tutorials" data-parent="#chapternav" href="javascript:void(null);">Tutorials</a>
<ul id='tutorials' class='nav'>
<li><a href='/manual/Tutorial.html'>Writing Haraka Plugins</a></li>
<li><a href='/manual/tutorials/Migrating_from_v1_to_v2.html'>Migrating from Haraka v1.x to v2.x</a></li>
<li><a href='/manual/tutorials/SettingUpOutbound.html'>Configuring Haraka For Outbound Email</a></li>
</ul></li>
<li><a class="submenu" data-toggle="collapse" data-target="#plugins" data-parent="#chapternav" href="javascript:void(null);">Plugins</a>
<ul id='plugins' class='nav'>
<li><a href='/manual/plugins/auth/auth_ldap.html'>auth/auth_ldap</a></li>
<li><a href='/manual/plugins/auth/auth_proxy.html'>auth/auth_proxy</a></li>
<li><a href='/manual/plugins/auth/flat_file.html'>auth/flat_file</a></li>
<li><a href='/manual/plugins/queue/deliver.html'>queue/deliver</a></li>
<li><a href='/manual/plugins/queue/discard.html'>discard</a></li>
<li><a href='/manual/plugins/queue/lmtp.html'>queue/lmtp</a></li>
<li><a href='/manual/plugins/queue/qmail-queue.html'>queue/qmail-queue</a></li>
<li><a href='/manual/plugins/queue/quarantine.html'>quarantine</a></li>
<li><a href='/manual/plugins/queue/smtp_forward.html'>queue/smtp_forward</a></li>
<li><a href='/manual/plugins/queue/smtp_proxy.html'>queue/smtp_proxy</a></li>
<li><a href='/manual/plugins/aliases.html'>aliases</a></li>
<li><a href='/manual/plugins/attachment.html'>attachment</a></li>
<li><a href='/manual/plugins/avg.html'>avg</a></li>
<li><a href='/manual/plugins/block_me.html'>block_me</a></li>
<li><a href='/manual/plugins/bounces.html'>bounce</a></li>
<li><a href='/manual/plugins/clamd.html'>clamd</a></li>
<li><a href='/manual/plugins/connect.geoip.html'>geoip</a></li>
<li><a href='/manual/plugins/connect.p0f.html'>connect.p0f - A TCP Fingerprinting Plugin</a></li>
<li><a href='/manual/plugins/connect.rdns_access.html'>connect.rdns_access</a></li>
<li><a href='/manual/plugins/daemonize.html'>daemonize</a></li>
<li><a href='/manual/plugins/data.headers.html'>data.headers</a></li>
<li><a href='/manual/plugins/data.nomsgid.html'>data.nomsgid</a></li>
<li><a href='/manual/plugins/data.noreceived.html'>data.noreceived</a></li>
<li><a href='/manual/plugins/data.rfc5322_header_checks.html'>data.rfc5322_header_checks</a></li>
<li><a href='/manual/plugins/data.signatures.html'>data.signatures</a></li>
<li><a href='/manual/plugins/data.uribl.html'>data.uribl</a></li>
<li><a href='/manual/plugins/delay_deny.html'>delay_deny</a></li>
<li><a href='/manual/plugins/dkim_sign.html'>dkim_sign</a></li>
<li><a href='/manual/plugins/dnsbl.html'>dnsbl</a></li>
<li><a href='/manual/plugins/dnswl.html'>dnswl</a></li>
<li><a href='/manual/plugins/early_talker.html'>early_talker</a></li>
<li><a href='/manual/plugins/graph.html'>graph</a></li>
<li><a href='/manual/plugins/helo.checks.html'>helo.checks</a></li>
<li><a href='/manual/plugins/karma.html'>karma - reward good and penalize bad mail senders</a></li>
<li><a href='/manual/plugins/log.syslog.html'>log.syslog</a></li>
<li><a href='/manual/plugins/lookup_rdns.strict.html'>lookup_rdns.strict</a></li>
<li><a href='/manual/plugins/mail_from.access.html'>mail_from.access</a></li>
<li><a href='/manual/plugins/mail_from.blocklist.html'>mail_from.blocklist</a></li>
<li><a href='/manual/plugins/mail_from.is_resolvable.html'>mail_from.is_resolvable</a></li>
<li><a href='/manual/plugins/mail_from.nobounces.html'>mail_from.nobounces</a></li>
<li><a href='/manual/plugins/max_unrecognized_commands.html'>max_unrecognized_commands</a></li>
<li><a href='/manual/plugins/messagesniffer.html'>messagesniffer</a></li>
<li><a href='/manual/plugins/process_title.html'>process_title</a></li>
<li><a href='/manual/plugins/rate_limit.html'>rate_limit</a></li>
<li><a href='/manual/plugins/rcpt_to.access.html'>rcpt_to.access</a></li>
<li><a href='/manual/plugins/rcpt_to.blocklist.html'>rcpt_to.blocklist</a></li>
<li><a href='/manual/plugins/rcpt_to.in_host_list.html'>rcpt_to.in_host_list</a></li>
<li><a href='/manual/plugins/rcpt_to.max_count.html'>rcpt_to.max_count</a></li>
<li><a href='/manual/plugins/rcpt_to.qmail_deliverable.html'>qmail_deliverable</a></li>
<li><a href='/manual/plugins/rdns.regexp.html'>rdns.regexp</a></li>
<li><a href='/manual/plugins/relay_acl.html'>relay_acl</a></li>
<li><a href='/manual/plugins/relay_all.html'>relay_all</a></li>
<li><a href='/manual/plugins/relay_force_routing.html'>relay_force_routing.js</a></li>
<li><a href='/manual/plugins/reseed_rng.html'>reseed_rng</a></li>
<li><a href='/manual/plugins/spamassassin.html'>spamassassin</a></li>
<li><a href='/manual/plugins/spf.html'>spf</a></li>
<li><a href='/manual/plugins/tarpit.html'>tarpit</a></li>
<li><a href='/manual/plugins/tls.html'>tls</a></li>
<li><a href='/manual/plugins/toobusy.html'>toobusy</a></li>
<li><a href='/manual/plugins/xclient.html'>XCLIENT</a></li>
</ul></li></ul>

              </div>
            </div>
            
            <div class="col-md-9" role="main">
              <div class="bs-docs-section">
                <h2>Haraka - a Node.js Mail Server</h2>

<p>Haraka is an SMTP server which uses a plugin architecture to implement most
of its functionality. It uses a highly scalable event model to be able to
cope with thousands of concurrent connections. Plugins are written in
Javascript using <a href="http://nodejs.org/">Node.js</a>, and as such perform extremely quickly. The
core Haraka framework is capable of processing thousands of messages per
second on the right hardware.</p>

<p>Haraka can be used either as an inbound SMTP server, and is designed with
good anti-spam protections in mind (see the <code>plugins</code> directory), or it can
be used as an outbound mail server - the most common way of doing this is by
running it on port 587 with an "auth" plugin to authenticate your users.</p>

<p>A full mail system for end users is vastly complicated, and so Haraka makes
no attempt to be an IMAP server, figure out where mails should be delivered,
or implement any of the functionality of a mail store. As such it is common
to have a backend mail server which Haraka delivers to for that sort of
functionality - Exchange, Postfix, Dovecot or Courier would be examples of
such systems.</p>

<p>Haraka does have a scalable outbound mail delivery engine built in. Any mail
marked as <code>relaying</code> (such as via an <code>auth</code> plugin) will automatically be
queued for outbound delivery.</p>

<h3>Join the Mailing List</h3>

<p>To get started with Haraka and ask questions about it, please join the
mailing list: mailto:haraka-sub@harakamail.com - the mailing list is
implemented as a Haraka plugin.</p>

<h3>Screencast</h3>

<p><a href="http://youtu.be/6twKXMAsPsw">Getting started with Haraka</a></p>

<h3>Why Use Haraka?</h3>

<p>Haraka's primary purpose is to provide you with a much easier to extend
mail server than most available SMTP servers out there such as Postfix,
Exim or Microsoft Exchange, yet while still running those systems for their
excellent ability to deliver mail to users.</p>

<p>The plugin system makes it trivial to code new features. A typical example
might be to provide qmail-like extended addresses to an Exchange system,
whereby you could receive mail as <code>user-anywordshere@domain.com</code>, and yet
still have it correctly routed to <code>user@domain.com</code>. This is a few lines of
code in Haraka, or maybe someone has already written this plugin.</p>

<p>Plugins are already provided for running mail through SpamAssassin, checking
for known bad HELO patterns, checking DNS Blocklists, and watching for
violators of the SMTP protocol via the "early_talker" plugin.</p>

<p>Furthermore Haraka comes with a simple plugin called "graph" which shows you
real-time charts of which plugins rejected the most mail, allowing you to
easily fine-tune your list of plugins to more effectively stop spam.</p>

<h3>Installing Haraka</h3>

<p>Haraka is written in Javascript and requires <a href="http://nodejs.org/">node.js</a> to run.</p>

<p>Installation is very simple via <a href="http://youtu.be/6twKXMAsPsw">npm</a>:</p>

<pre><code>$ npm install -g Haraka
</code></pre>

<p>That will provide you with a <code>haraka</code> binary which allows you to setup the
service.</p>

<h3>Running Haraka</h3>

<p>Setting up Haraka is simple. Firstly we need to create the service:</p>

<pre><code>$ haraka -i /path/to/haraka_test
</code></pre>

<p>That creates the directory <code>haraka_test</code> and creates <code>config</code> and <code>plugin</code>
directories in there, and automatically sets the host name used by Haraka
to the output of the <code>hostname</code> command.</p>

<p>This assumes that <code>hostname</code> gives you the correct host you want to receive
mail for. If not, edit the <code>config/host_list</code> file. For example if you want
to receive mail addressed to <code>user@domain.com</code>, add <code>domain.com</code> to the
<code>config/host_list</code> file.</p>

<p>Finally just start Haraka:</p>

<pre><code>$ haraka -c /path/to/haraka_test
</code></pre>

<p>And it will run.</p>

<p>However the big thing you want to do next is to edit the <code>config/plugins</code>
file. This determines what plugins run in Haraka, and controls the overall
behaviour of the server. By default the server is setup to receive mails for
domains in <code>host_list</code> and deliver them via <code>smtp-forward</code>. Configure the
destination in <code>config/smtp_forward.ini</code>.</p>

<p>Each plugin has documentation available via <code>haraka -h plugins/&lt;name&gt;</code>.
Look there for information about how each plugin is configured, edit your
<code>config/plugins</code> file, restart Haraka and enjoy!</p>

<p>Feel free to write to the mailing list with any questions. Or use github
"Issues".</p>

<h3>Running from git</h3>

<p>If you are unable to use npm to install Haraka, you can run from git by
following these steps:</p>

<p>First clone the repository:</p>

<pre><code>$ git clone https://github.com/baudehlo/Haraka.git
$ cd Haraka
</code></pre>

<p>Edit <code>config/plugins</code> and <code>config/smtp.ini</code> to specify the plugins and
config you want.</p>

<p>Finally run Haraka:</p>

<pre><code>$ node haraka.js
</code></pre>

<h3>Performance</h3>

<p>Haraka is fast, due to the nature of using the v8 Javascript engine, and
it is scalable due to using async I/O everywhere. On my local system I have
managed to scale it up to 5000 emails per second (with minimal plugins).</p>

<p>I welcome other performance evaluations.</p>

<h3>License and Author</h3>

<p>Haraka is MIT licensed - see the LICENSE file for details.</p>

<p>Haraka is a project started by Matt Sergeant, a 10 year veteran of the email
and anti-spam world. Previous projects have been the project leader for
SpamAssassin and a hacker on Qpsmtpd, a perl based mail server which is 
quite similar to Haraka (but not as fast due to perl being slower than
Javascript).</p>

              </div>
            </div>
          </div>
        </div>

        <footer class="container" role="contentinfo">
            <ul class="bs-masthead-links">
            <li>
            <form action="https://www.paypal.com/cgi-bin/webscr" method="post" target="_top">
            <input type="hidden" name="cmd" value="_s-xclick">
            <input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----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-----END PKCS7-----
            ">
            <input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
            <img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
            </form>
            </li>
            </ul>
        </footer>
        
        <!-- Placed at the end of the document so the pages load faster -->
        <script src="/js/jquery.js"></script>
        <script src="/js/bootstrap.js"></script>
        <script src="/js/holder.js"></script>
        <!-- <script src="/js/application.js"></script> -->
        <script>
        $('.bs-sidebar ul ul').each(function (i, el) {
            if (!$(el).find('li.active').length) {
                $(el).collapse('toggle');
            }
        });
        $('a.submenu').on('touchstart', function(e) { e.stopPropagation(); });
        </script>

    </body>
</html>