<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements. See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership. The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License. You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied. See the License for the
    specific language governing permissions and limitations
    under the License.
-->
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title>Apache James</title>

        <link rel="stylesheet" type="text/css" href="/assets/css/main.css">
        <link rel="stylesheet" type="text/css" href="/assets/css/font-awesome.min.css">
        <link rel="stylesheet" type="text/css" href="/assets/css/ie8.css">
        <link rel="stylesheet" type="text/css" href="/assets/css/ie9.css">
        <link rel="shortcut icon" href="/images/james-logo.png">
    </head>
<body>
    <!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements. See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership. The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License. You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied. See the License for the
    specific language governing permissions and limitations
    under the License.
-->

<link href="/assets/css/lightbox.css" rel="stylesheet">
<div id="wrapper" class="post-page">
  <div class="apache_ref">
    <a href="https://www.apache.org" alt="apache foundation link"><img src="https://www.apache.org/foundation/press/kit/asf_logo.svg" title="apache foundation logo"/></a>
  </div>
  <div class="apache_ref_mobile">
    <a href="https://www.apache.org" alt="apache foundation link">The Apache Software Foundation</a>
  </div>

  <header id="header" class="alt">
    <div class="logo"><a href="/index.html" alt="Apache James"><img src="/images/james.svg" alt="james logo"/></a></div>
    <h1 class="hidden">James Enterprise Mail Server</h1>
    <h2>Emails at the heart of your business logic</h2>
  </header>

  <!-- Main -->
    <div id="main">

      <!-- Content -->
        <section id="content" class="main">

          <h1><span class="icon fa-file-text-o"></span> Getting Apache James to serve 1M+ digital mailboxes of all Estonian residents </h1>
          <h2><span class="icon fa-clock-o"></span><b> September 21, 2021</b></h2>

          <br/>

          <div>
            <p>The Apache James team is proud to announce that one of our committers, Juhan Aasaru, presents a James
talk at <a href="https://www.apachecon.com/acah2021/index.html">ApacheCON @home 2021</a></p>

<p>Here is the <a href="https://www.apachecon.com/acah2021/tracks/highlight.html">talk description</a>:</p>

<p>Every Estonian (e)resident has a digital mailbox that is a secure application for the state and local government bodies 
to contact the resident and vice versa. A year ago our company won the tender to improve this service and to replace 
the legacy systems with something scalable. This is the story of how we started to look out for best technical solutions 
for the problem and found Apache James. How we made a proposition to the government agency responsible for providing this 
mailing service to use Apache James (and Apache Cassandra that powers the system under the hood). How we jumped into the 
Apache James community to understand the product and find a way to solve the requirements that were missing from the 
feature set. How we get tremendous help from the community and how we managed to give something back as well.</p>

<p>Eventually our story could be a lesson learned for someone who plans to undertake something similar together with tips 
on how to correctly build a system on top of open source and what to avoid.</p>

<p>Most of his working life Juhan has worked as a Java developer and Solutions Architect. He has also been CTO in two 
startup companies. A few years ago he was working on a Fintech startup and contributed to Apache Fineract but recently
 his attention has moved away from Fintech towards Apache James.</p>

<p>Join him Tuesday, 21th of September in the <em>highligh</em> track.</p>

<p>This talk can be seen on <a href="https://www.youtube.com/watch?v=uA775icp-kk">youtube</a>.</p>



          </div>
          <footer class="major special">
            <hr>
            <center>
              <ul class="actions">
                <li><a href="/index.html" class="button">Back to homepage</a></li>
                <li><a href="/posts.html" class="button">Read More Posts</a></li>
              </ul>
            </center>
          </footer>
        </section>
    </div>
    <footer id="footer" class="major">
      <section>
        <h2>James</h2>
        <ul class="no-padding">
          <li class="no-padding"><a href="../#intro" class="active">About</a></li>
          <li class="no-padding"><a href="../#first">Get Started</a></li>
          <li class="no-padding"><a href="../#posts">Last Posts</a></li>
          <li class="no-padding"><a href="../#second">Community</a></li>
          <li class="no-padding"><a href="https://james.apache.org/"><span class="fa fa-external-link"></span> Documentation</a></li>
        </ul>
      </section>
      <section>
        <h2>Connect</h2>
        <ul class="icons">
          <li><a href="http://twitter.com/ApacheJames" class="icon fa-twitter alt"><span class="label">Twitter</span></a></li>
          <li><a href="https://github.com/apache/james-project" class="icon fa-github alt"><span class="label">GitHub</span></a></li>
          <li><a href="http://james.apache.org/mail.html" class="icon fa-envelope-o alt"><span class="label">Mailing-list</span></a></li>
        </ul>
      </section>
      <section>
        <h2>Copyright</h2>
        <a href="http://www.apache.org/">Apache Licence Copyright</a><br/>
        &copy;Untitled. Design: <a href="https://html5up.net">HTML5 UP</a>
      </section>
    </footer>
</div>

</body>
</html>
