Files
lettre/docs/sending-messages/smtp/index.html
Jacob Budin aecbce50e3 fix(doc): Update Hugo theme
Updated Hugo Learn Theme and regenerated web docs.
2017-10-15 18:17:26 -04:00

697 lines
31 KiB
HTML

<!DOCTYPE html>
<html lang="en" class="js csstransforms3d">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="generator" content="Hugo 0.29" />
<meta name="description" content="Documentation for the Lettre mailer in Rust">
<meta name="author" content="Alexis Mousset">
<link rel="shortcut icon" href="https://lettre.github.io/lettre/images/favicon.png" type="image/x-icon" />
<title>SMTP transport :: Lettre site</title>
<link href="/lettre/css/nucleus.css?1508105428" rel="stylesheet">
<link href="/lettre/css/font-awesome.min.css?1508105428" rel="stylesheet">
<link href="/lettre/css/hybrid.css?1508105428" rel="stylesheet">
<link href="/lettre/css/featherlight.min.css?1508105428" rel="stylesheet">
<link href="/lettre/css/perfect-scrollbar.min.css?1508105428" rel="stylesheet">
<link href="/lettre/css/auto-complete.css?1508105428" rel="stylesheet">
<link href="/lettre/css/theme.css?1508105428" rel="stylesheet">
<link href="/lettre/css/hugo-theme.css?1508105428" rel="stylesheet">
<script src="/lettre/js/jquery-2.x.min.js?1508105428"></script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
display:none !important;
}
</style>
</head>
<body class="" data-url="/lettre/sending-messages/smtp/">
<nav id="sidebar" class="">
<div id="header-wrapper">
<div id="header">
<a href="https://lettre.github.io/lettre/getting-started/intro/"><img src="https://lettre.github.io/lettre/images/logo50.png" /></a>
</div>
<div class="searchbox">
<label for="search-by"><i class="fa fa-search"></i></label>
<input data-search-input id="search-by" type="text" placeholder="Search...">
<span data-search-clear=""><i class="fa fa-close"></i></span>
</div>
<script type="text/javascript" src="/lettre/js/lunr.min.js?1508105428"></script>
<script type="text/javascript" src="/lettre/js/auto-complete.js?1508105428"></script>
<script type="text/javascript">
var baseurl = "https:\/\/lettre.github.io\/lettre";
</script>
<script type="text/javascript" src="/lettre/js/search.js?1508105428"></script>
</div>
<div class="highlightable">
<ul class="topics">
<li data-nav-id="/lettre/getting-started/" title="Getting started" class="dd-item
">
<a href="/lettre/getting-started/">
Getting started
</a>
<ul>
<li data-nav-id="/lettre/getting-started/intro/" title="Introduction" class="dd-item ">
<a href="/lettre/getting-started/intro/">
Introduction
</a>
</li>
</ul>
</li>
<li data-nav-id="/lettre/creating-messages/" title="Creating messages" class="dd-item
">
<a href="/lettre/creating-messages/">
Creating messages
</a>
</li>
<li data-nav-id="/lettre/sending-messages/" title="Sending messages" class="dd-item
parent
">
<a href="/lettre/sending-messages/">
Sending messages
</a>
<ul>
<li data-nav-id="/lettre/sending-messages/intro/" title="Introduction" class="dd-item ">
<a href="/lettre/sending-messages/intro/">
Introduction
</a>
</li>
<li data-nav-id="/lettre/sending-messages/smtp/" title="SMTP transport" class="dd-item active">
<a href="/lettre/sending-messages/smtp/">
SMTP transport
</a>
</li>
<li data-nav-id="/lettre/sending-messages/sendmail/" title="Sendmail transport" class="dd-item ">
<a href="/lettre/sending-messages/sendmail/">
Sendmail transport
</a>
</li>
<li data-nav-id="/lettre/sending-messages/file/" title="File transport" class="dd-item ">
<a href="/lettre/sending-messages/file/">
File transport
</a>
</li>
<li data-nav-id="/lettre/sending-messages/stub/" title="Stub transport" class="dd-item ">
<a href="/lettre/sending-messages/stub/">
Stub transport
</a>
</li>
</ul>
</li>
</ul>
<section id="footer">
<p>Built with <a href="https://github.com/matcornic/hugo-theme-learn"><i class="fa fa-heart"></i></a> from <a href="http://getgrav.org">Grav</a> and <a href="http://gohugo.io/">Hugo</a></p>
</section>
</div>
</nav>
<section id="body">
<div id="overlay"></div>
<div class="padding highlightable sticky-parent">
<div class="sticky-spacer">
<div id="top-bar">
<div id="top-github-link">
<a class="github-link" href="https://github.com/lettre/lettre/edit/master/website/content/sending-messages/smtp.md" target="blank">
<i class="fa fa-code-fork"></i>
Edit this page
</a>
</div>
<div id="breadcrumbs" itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb">
<span id="sidebar-toggle-span">
<a href="#" id="sidebar-toggle" data-sidebar-toggle="">
<i class="fa fa-bars"></i>
</a>
</span>
<span id="toc-menu"><i class="fa fa-list-alt"></i></span>
<span class="links">
<a href='/lettre/'>Lettre site</a> > <a href='/lettre/sending-messages/'>Sending messages</a> > SMTP transport
</span>
</div>
<div class="progress">
<div class="wrapper">
<nav id="TableOfContents">
<ul>
<li>
<ul>
<li>
<ul>
<li>
<ul>
<li><a href="#simple-example">Simple example</a></li>
<li><a href="#complete-example">Complete example</a></li>
<li><a href="#lower-level">Lower level</a></li>
</ul></li>
</ul></li>
</ul></li>
</ul>
</nav>
</div>
</div>
</div>
</div>
<div id="body-inner">
<h1>SMTP transport</h1>
<p>This transport uses the SMTP protocol to send emails over the network (locally or remotely).</p>
<p>It is desinged to be:</p>
<ul>
<li>Secured: email are encrypted by default</li>
<li>Modern: Unicode support for email content and sender/recipient adresses when compatible</li>
<li>Fast: supports tcp connection reuse</li>
</ul>
<p>This client is designed to send emails to a relay server, and should <em>not</em> be used to send
emails directly to the destination.</p>
<p>The relay server can be the local email server, a specific host or a third-party service.</p>
<h4 id="simple-example">Simple example</h4>
<p>This is the most basic example of usage:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-rust" data-lang="rust"><span style="color:#66d9ef">use</span><span style=""> </span><span style="">lettre</span><span style="">::</span><span style="">{</span><span style="">SimpleSendableEmail</span><span style="">,</span><span style=""> </span><span style="">EmailTransport</span><span style="">,</span><span style=""> </span><span style="">EmailAddress</span><span style="">,</span><span style=""> </span><span style="">SmtpTransport</span><span style="">};</span><span style="">
</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">let</span><span style=""> </span><span style="">email</span><span style=""> </span><span style="color:#f92672">=</span><span style=""> </span><span style="">SimpleSendableEmail</span><span style="">::</span><span style="">new</span><span style="">(</span><span style="">
</span><span style=""> </span><span style="">EmailAddress</span><span style="">::</span><span style="">new</span><span style="">(</span><span style="color:#e6db74">&#34;user@localhost&#34;</span><span style="">.</span><span style="">to_string</span><span style="">()),</span><span style="">
</span><span style=""> </span><span style="">vec</span><span style="color:#f92672">!</span><span style="">[</span><span style="">EmailAddress</span><span style="">::</span><span style="">new</span><span style="">(</span><span style="color:#e6db74">&#34;root@localhost&#34;</span><span style="">.</span><span style="">to_string</span><span style="">())],</span><span style="">
</span><span style=""> </span><span style="color:#e6db74">&#34;message_id&#34;</span><span style="">.</span><span style="">to_string</span><span style="">(),</span><span style="">
</span><span style=""> </span><span style="color:#e6db74">&#34;Hello world&#34;</span><span style="">.</span><span style="">to_string</span><span style="">(),</span><span style="">
</span><span style=""> </span><span style="">);</span><span style="">
</span><span style="">
</span><span style=""></span><span style="color:#75715e">// Open a local connection on port 25
</span><span style="color:#75715e"></span><span style="color:#66d9ef">let</span><span style=""> </span><span style="color:#66d9ef">mut</span><span style=""> </span><span style="">mailer</span><span style=""> </span><span style="color:#f92672">=</span><span style="">
</span><span style=""></span><span style="">SmtpTransport</span><span style="">::</span><span style="">builder_unencrypted_localhost</span><span style="">().</span><span style="">unwrap</span><span style="">().</span><span style="">build</span><span style="">();</span><span style="">
</span><span style=""></span><span style="color:#75715e">// Send the email
</span><span style="color:#75715e"></span><span style="color:#66d9ef">let</span><span style=""> </span><span style="">result</span><span style=""> </span><span style="color:#f92672">=</span><span style=""> </span><span style="">mailer</span><span style="">.</span><span style="">send</span><span style="">(</span><span style="color:#f92672">&amp;</span><span style="">email</span><span style="">);</span><span style="">
</span><span style="">
</span><span style=""></span><span style="">assert</span><span style="color:#f92672">!</span><span style="">(</span><span style="">result</span><span style="">.</span><span style="">is_ok</span><span style="">());</span></code></pre>
</div>
<h4 id="complete-example">Complete example</h4>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-rust" data-lang="rust"><span style="color:#66d9ef">use</span><span style=""> </span><span style="">lettre</span><span style="">::</span><span style="">smtp</span><span style="">::</span><span style="">authentication</span><span style="">::</span><span style="">{</span><span style="">Credentials</span><span style="">,</span><span style=""> </span><span style="">Mechanism</span><span style="">};</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">use</span><span style=""> </span><span style="">lettre</span><span style="">::</span><span style="">smtp</span><span style="">::</span><span style="">SUBMISSION_PORT</span><span style="">;</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">use</span><span style=""> </span><span style="">lettre</span><span style="">::</span><span style="">{</span><span style="">SimpleSendableEmail</span><span style="">,</span><span style=""> </span><span style="">EmailTransport</span><span style="">,</span><span style=""> </span><span style="">EmailAddress</span><span style="">,</span><span style=""> </span><span style="">SmtpTransport</span><span style="">};</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">use</span><span style=""> </span><span style="">lettre</span><span style="">::</span><span style="">smtp</span><span style="">::</span><span style="">extension</span><span style="">::</span><span style="">ClientId</span><span style="">;</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">use</span><span style=""> </span><span style="">lettre</span><span style="">::</span><span style="">smtp</span><span style="">::</span><span style="">ConnectionReuseParameters</span><span style="">;</span><span style="">
</span><span style="">
</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">let</span><span style=""> </span><span style="">email</span><span style=""> </span><span style="color:#f92672">=</span><span style=""> </span><span style="">SimpleSendableEmail</span><span style="">::</span><span style="">new</span><span style="">(</span><span style="">
</span><span style=""> </span><span style="">EmailAddress</span><span style="">::</span><span style="">new</span><span style="">(</span><span style="color:#e6db74">&#34;user@localhost&#34;</span><span style="">.</span><span style="">to_string</span><span style="">()),</span><span style="">
</span><span style=""> </span><span style="">vec</span><span style="color:#f92672">!</span><span style="">[</span><span style="">EmailAddress</span><span style="">::</span><span style="">new</span><span style="">(</span><span style="color:#e6db74">&#34;root@localhost&#34;</span><span style="">.</span><span style="">to_string</span><span style="">())],</span><span style="">
</span><span style=""> </span><span style="color:#e6db74">&#34;message_id&#34;</span><span style="">.</span><span style="">to_string</span><span style="">(),</span><span style="">
</span><span style=""> </span><span style="color:#e6db74">&#34;Hello world&#34;</span><span style="">.</span><span style="">to_string</span><span style="">(),</span><span style="">
</span><span style=""> </span><span style="">);</span><span style="">
</span><span style="">
</span><span style=""></span><span style="color:#75715e">// Connect to a remote server on a custom port
</span><span style="color:#75715e"></span><span style="color:#66d9ef">let</span><span style=""> </span><span style="color:#66d9ef">mut</span><span style=""> </span><span style="">mailer</span><span style=""> </span><span style="color:#f92672">=</span><span style=""> </span><span style="">SmtpTransport</span><span style="">::</span><span style="">simple_builder</span><span style="">(</span><span style="color:#e6db74">&#34;server.tld&#34;</span><span style="">.</span><span style="">to_string</span><span style="">()).</span><span style="">unwrap</span><span style="">()</span><span style="">
</span><span style=""> </span><span style="color:#75715e">// Set the name sent during EHLO/HELO, default is `localhost`
</span><span style="color:#75715e"></span><span style=""> </span><span style="">.</span><span style="">hello_name</span><span style="">(</span><span style="">ClientId</span><span style="">::</span><span style="">Domain</span><span style="">(</span><span style="color:#e6db74">&#34;my.hostname.tld&#34;</span><span style="">.</span><span style="">to_string</span><span style="">()))</span><span style="">
</span><span style=""> </span><span style="color:#75715e">// Add credentials for authentication
</span><span style="color:#75715e"></span><span style=""> </span><span style="">.</span><span style="">credentials</span><span style="">(</span><span style="">Credentials</span><span style="">::</span><span style="">new</span><span style="">(</span><span style="color:#e6db74">&#34;username&#34;</span><span style="">.</span><span style="">to_string</span><span style="">(),</span><span style=""> </span><span style="color:#e6db74">&#34;password&#34;</span><span style="">.</span><span style="">to_string</span><span style="">()))</span><span style="">
</span><span style=""> </span><span style="color:#75715e">// Enable SMTPUTF8 if the server supports it
</span><span style="color:#75715e"></span><span style=""> </span><span style="">.</span><span style="">smtp_utf8</span><span style="">(</span><span style="color:#66d9ef">true</span><span style="">)</span><span style="">
</span><span style=""> </span><span style="color:#75715e">// Configure expected authentication mechanism
</span><span style="color:#75715e"></span><span style=""> </span><span style="">.</span><span style="">authentication_mechanism</span><span style="">(</span><span style="">Mechanism</span><span style="">::</span><span style="">Plain</span><span style="">)</span><span style="">
</span><span style=""> </span><span style="color:#75715e">// Enable connection reuse
</span><span style="color:#75715e"></span><span style=""> </span><span style="">.</span><span style="">connection_reuse</span><span style="">(</span><span style="">ConnectionReuseParameters</span><span style="">::</span><span style="">ReuseUnlimited</span><span style="">).</span><span style="">build</span><span style="">();</span><span style="">
</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">let</span><span style=""> </span><span style="">result_1</span><span style=""> </span><span style="color:#f92672">=</span><span style=""> </span><span style="">mailer</span><span style="">.</span><span style="">send</span><span style="">(</span><span style="color:#f92672">&amp;</span><span style="">email</span><span style="">);</span><span style="">
</span><span style=""></span><span style="">assert</span><span style="color:#f92672">!</span><span style="">(</span><span style="">result_1</span><span style="">.</span><span style="">is_ok</span><span style="">());</span><span style="">
</span><span style="">
</span><span style=""></span><span style="color:#75715e">// The second email will use the same connection
</span><span style="color:#75715e"></span><span style="color:#66d9ef">let</span><span style=""> </span><span style="">result_2</span><span style=""> </span><span style="color:#f92672">=</span><span style=""> </span><span style="">mailer</span><span style="">.</span><span style="">send</span><span style="">(</span><span style="color:#f92672">&amp;</span><span style="">email</span><span style="">);</span><span style="">
</span><span style=""></span><span style="">assert</span><span style="color:#f92672">!</span><span style="">(</span><span style="">result_2</span><span style="">.</span><span style="">is_ok</span><span style="">());</span><span style="">
</span><span style="">
</span><span style=""></span><span style="color:#75715e">// Explicitly close the SMTP transaction as we enabled connection reuse
</span><span style="color:#75715e"></span><span style="">mailer</span><span style="">.</span><span style="">close</span><span style="">();</span></code></pre>
</div>
<h4 id="lower-level">Lower level</h4>
<p>You can also send commands, here is a simple email transaction without
error handling:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-rust" data-lang="rust"><span style="color:#66d9ef">use</span><span style=""> </span><span style="">lettre</span><span style="">::</span><span style="">EmailAddress</span><span style="">;</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">use</span><span style=""> </span><span style="">lettre</span><span style="">::</span><span style="">smtp</span><span style="">::</span><span style="">SMTP_PORT</span><span style="">;</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">use</span><span style=""> </span><span style="">lettre</span><span style="">::</span><span style="">smtp</span><span style="">::</span><span style="">client</span><span style="">::</span><span style="">Client</span><span style="">;</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">use</span><span style=""> </span><span style="">lettre</span><span style="">::</span><span style="">smtp</span><span style="">::</span><span style="">client</span><span style="">::</span><span style="">net</span><span style="">::</span><span style="">NetworkStream</span><span style="">;</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">use</span><span style=""> </span><span style="">lettre</span><span style="">::</span><span style="">smtp</span><span style="">::</span><span style="">extension</span><span style="">::</span><span style="">ClientId</span><span style="">;</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">use</span><span style=""> </span><span style="">lettre</span><span style="">::</span><span style="">smtp</span><span style="">::</span><span style="">commands</span><span style="">::</span><span style="color:#f92672">*</span><span style="">;</span><span style="">
</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">let</span><span style=""> </span><span style="color:#66d9ef">mut</span><span style=""> </span><span style="">email_client</span><span style="">: </span><span style="color:#a6e22e">Client</span><span style="color:#f92672">&lt;</span><span style="">NetworkStream</span><span style="color:#f92672">&gt;</span><span style=""> </span><span style="color:#f92672">=</span><span style=""> </span><span style="">Client</span><span style="">::</span><span style="">new</span><span style="">();</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">let</span><span style=""> </span><span style="">_</span><span style=""> </span><span style="color:#f92672">=</span><span style=""> </span><span style="">email_client</span><span style="">.</span><span style="">connect</span><span style="">(</span><span style="color:#f92672">&amp;</span><span style="">(</span><span style="color:#e6db74">&#34;localhost&#34;</span><span style="">,</span><span style=""> </span><span style="">SMTP_PORT</span><span style="">),</span><span style=""> </span><span style="">None</span><span style="">);</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">let</span><span style=""> </span><span style="">_</span><span style=""> </span><span style="color:#f92672">=</span><span style=""> </span><span style="">email_client</span><span style="">.</span><span style="">smtp_command</span><span style="">(</span><span style="">EhloCommand</span><span style="">::</span><span style="">new</span><span style="">(</span><span style="">ClientId</span><span style="">::</span><span style="">new</span><span style="">(</span><span style="color:#e6db74">&#34;my_hostname&#34;</span><span style="">.</span><span style="">to_string</span><span style="">())));</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">let</span><span style=""> </span><span style="">_</span><span style=""> </span><span style="color:#f92672">=</span><span style=""> </span><span style="">email_client</span><span style="">.</span><span style="">smtp_command</span><span style="">(</span><span style="">
</span><span style=""> </span><span style="">MailCommand</span><span style="">::</span><span style="">new</span><span style="">(</span><span style="">Some</span><span style="">(</span><span style="">EmailAddress</span><span style="">::</span><span style="">new</span><span style="">(</span><span style="color:#e6db74">&#34;user@example.com&#34;</span><span style="">.</span><span style="">to_string</span><span style="">())),</span><span style=""> </span><span style="">vec</span><span style="color:#f92672">!</span><span style="">[])</span><span style="">
</span><span style=""> </span><span style="">);</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">let</span><span style=""> </span><span style="">_</span><span style=""> </span><span style="color:#f92672">=</span><span style=""> </span><span style="">email_client</span><span style="">.</span><span style="">smtp_command</span><span style="">(</span><span style="">
</span><span style=""> </span><span style="">RcptCommand</span><span style="">::</span><span style="">new</span><span style="">(</span><span style="">EmailAddress</span><span style="">::</span><span style="">new</span><span style="">(</span><span style="color:#e6db74">&#34;user@example.org&#34;</span><span style="">.</span><span style="">to_string</span><span style="">()),</span><span style=""> </span><span style="">vec</span><span style="color:#f92672">!</span><span style="">[])</span><span style="">
</span><span style=""> </span><span style="">);</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">let</span><span style=""> </span><span style="">_</span><span style=""> </span><span style="color:#f92672">=</span><span style=""> </span><span style="">email_client</span><span style="">.</span><span style="">smtp_command</span><span style="">(</span><span style="">DataCommand</span><span style="">);</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">let</span><span style=""> </span><span style="">_</span><span style=""> </span><span style="color:#f92672">=</span><span style=""> </span><span style="">email_client</span><span style="">.</span><span style="">message</span><span style="">(</span><span style="">Box</span><span style="">::</span><span style="">new</span><span style="">(</span><span style="color:#e6db74">&#34;Test email&#34;</span><span style="">.</span><span style="">as_bytes</span><span style="">()));</span><span style="">
</span><span style=""></span><span style="color:#66d9ef">let</span><span style=""> </span><span style="">_</span><span style=""> </span><span style="color:#f92672">=</span><span style=""> </span><span style="">email_client</span><span style="">.</span><span style="">smtp_command</span><span style="">(</span><span style="">QuitCommand</span><span style="">);</span></code></pre>
</div>
<footer class=" footline" >
</footer>
</div>
</div>
<div id="navigation">
<a class="nav nav-prev" href="/lettre/sending-messages/intro/" title="Introduction"> <i class="fa fa-chevron-left"></i></a>
<a class="nav nav-next" href="/lettre/sending-messages/sendmail/" title="Sendmail transport" style="margin-right: 0px;"><i class="fa fa-chevron-right"></i></a>
</div>
</section>
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
<script src="/lettre/js/clipboard.min.js?1508105428"></script>
<script src="/lettre/js/perfect-scrollbar.min.js?1508105428"></script>
<script src="/lettre/js/perfect-scrollbar.jquery.min.js?1508105428"></script>
<script src="/lettre/js/jquery.sticky-kit.min.js?1508105428"></script>
<script src="/lettre/js/featherlight.min.js?1508105428"></script>
<script src="/lettre/js/html5shiv-printshiv.min.js?1508105428"></script>
<script src="/lettre/js/highlight.pack.js?1508105428"></script>
<script>hljs.initHighlightingOnLoad();</script>
<script src="/lettre/js/modernizr.custom.71422.js?1508105428"></script>
<script src="/lettre/js/learn.js?1508105428"></script>
<script src="/lettre/js/hugo-learn.js?1508105428"></script>
<link href="/lettre/mermaid/mermaid.css?1508105428" type="text/css" rel="stylesheet" />
<script src="/lettre/mermaid/mermaid.js?1508105428"></script>
<script>
mermaid.initialize({ startOnLoad: true });
</script>
</body>
</html>