| 
0
 | 
     1 <!doctype html>
 | 
| 
 | 
     2 <html>
 | 
| 
 | 
     3 	<head>
 | 
| 
 | 
     4 		<meta name="viewport" content="width=device-width, initial-scale=1">
 | 
| 
 | 
     5 		<style>
 | 
| 
 | 
     6 			@import "/site.css";
 | 
| 
 | 
     7 
 | 
| 
 | 
     8 			h1 {
 | 
| 
 | 
     9 				margin-bottom: 8px;
 | 
| 
 | 
    10 			}
 | 
| 
 | 
    11 			h4 {
 | 
| 
 | 
    12 				margin-top: 0;
 | 
| 
 | 
    13 			}
 | 
| 
 | 
    14 
 | 
| 
 | 
    15 			textarea {
 | 
| 
 | 
    16 				width: 100%;
 | 
| 
 | 
    17 			}
 | 
| 
 | 
    18 			textarea[name=server] {
 | 
| 
 | 
    19 				height: 120px;
 | 
| 
 | 
    20 			}
 | 
| 
 | 
    21 			textarea[name=mail] {
 | 
| 
 | 
    22 				height: 260px;
 | 
| 
 | 
    23 			}
 | 
| 
 | 
    24 		</style>
 | 
| 
 | 
    25 		<script>
 | 
| 
 | 
    26 			let server = {
 | 
| 
 | 
    27 				host: 'mail.smtp2go.com',
 | 
| 
5
 | 
    28 				port: 465,
 | 
| 
 | 
    29 				username: 'reactionary',
 | 
| 
0
 | 
    30 				password: 'not telling',
 | 
| 
 | 
    31 			};
 | 
| 
 | 
    32 			server = JSON.stringify(server,null,'\t');
 | 
| 
 | 
    33 
 | 
| 
 | 
    34 			let mails = {};
 | 
| 
 | 
    35 
 | 
| 
 | 
    36 			mails.simple = {
 | 
| 
 | 
    37 				From: 'mailer@reactionary.software',
 | 
| 
 | 
    38 				To: 'someone@reactionary.software',
 | 
| 
 | 
    39 				Subject: 'Simple',
 | 
| 
 | 
    40 				body: 'Google sucks.',
 | 
| 
 | 
    41 			};
 | 
| 
 | 
    42 
 | 
| 
 | 
    43 			mails.html = {
 | 
| 
 | 
    44 				From: 'mailer@reactionary.software',
 | 
| 
 | 
    45 				To: 'someone@reactionary.software',
 | 
| 
 | 
    46 				Subject: 'HTML',
 | 
| 
 | 
    47 				'Content-Type': 'multipart/alternative',
 | 
| 
 | 
    48 				body: [
 | 
| 
 | 
    49 					{
 | 
| 
 | 
    50 						'Content-Type': 'text/plain; charset="UTF-8"',
 | 
| 
 | 
    51 						body: 'Google sucks.',
 | 
| 
 | 
    52 					},
 | 
| 
 | 
    53 					{
 | 
| 
 | 
    54 						'Content-Type': 'text/html; charset="UTF-8"',
 | 
| 
 | 
    55 						body: '<a href="https://www.google.com/">Google</a> sucks.',
 | 
| 
 | 
    56 					},
 | 
| 
 | 
    57 				],
 | 
| 
 | 
    58 			};
 | 
| 
 | 
    59 
 | 
| 
 | 
    60 			mails.attachment = {
 | 
| 
 | 
    61 				From: 'mailer@reactionary.software',
 | 
| 
 | 
    62 				To: 'someone@reactionary.software',
 | 
| 
 | 
    63 				Subject: 'Attachment',
 | 
| 
 | 
    64 				'Content-Type': 'multipart/mixed',
 | 
| 
 | 
    65 				body: [
 | 
| 
 | 
    66 					{
 | 
| 
 | 
    67 						'Content-Type': 'multipart/alternative',
 | 
| 
 | 
    68 						body: [
 | 
| 
 | 
    69 							{
 | 
| 
 | 
    70 								'Content-Type': 'text/plain; charset="UTF-8"',
 | 
| 
 | 
    71 								body: 'Google sucks.',
 | 
| 
 | 
    72 							},
 | 
| 
 | 
    73 							{
 | 
| 
 | 
    74 								'Content-Type': 'text/html; charset="UTF-8"',
 | 
| 
 | 
    75 								body: '<a href="https://www.google.com/">Google</a> sucks.',
 | 
| 
 | 
    76 							},
 | 
| 
 | 
    77 						],
 | 
| 
 | 
    78 					},
 | 
| 
 | 
    79 					{
 | 
| 
 | 
    80 						'Content-Disposition': 'attachment; filename="test.txt"',
 | 
| 
 | 
    81 						body: 'test file',
 | 
| 
 | 
    82 					},
 | 
| 
 | 
    83 				]
 | 
| 
 | 
    84 			};
 | 
| 
 | 
    85 
 | 
| 
 | 
    86 			function set(what) {
 | 
| 
 | 
    87 				let s = JSON.stringify( mails[what], null, '\t' );
 | 
| 
 | 
    88 				document.querySelector('textarea[name=mail]').textContent = s;
 | 
| 
 | 
    89 			}
 | 
| 
 | 
    90 
 | 
| 
 | 
    91 			function init() {
 | 
| 
 | 
    92 				document.querySelector('textarea[name=server]').textContent = server;
 | 
| 
 | 
    93 				set('simple');
 | 
| 
 | 
    94 			}
 | 
| 
 | 
    95 		</script>
 | 
| 
 | 
    96 		<title>Mailer REST API</title>
 | 
| 
 | 
    97 	</head>
 | 
| 
 | 
    98 	<body>
 | 
| 
 | 
    99 		<h1>Mailer REST API</h1>
 | 
| 
2
 | 
   100 		<h4><a href="http://www.reactionary.software/">Reactionary Software</a> by <a href="https://linkmy.style/fschmidt">fschmidt</a></h4>
 | 
| 
0
 | 
   101 
 | 
| 
 | 
   102 		<p>Send emails by a POST request.</p>
 | 
| 
 | 
   103 
 | 
| 
 | 
   104 		<form method=post action="/send.json">
 | 
| 
 | 
   105 			<p>
 | 
| 
 | 
   106 				SMTP Server<br>
 | 
| 
 | 
   107 				<textarea name=server></textarea><br>
 | 
| 
 | 
   108 				<small>Update to your server.</small>
 | 
| 
 | 
   109 			</p>
 | 
| 
 | 
   110 			<p>
 | 
| 
 | 
   111 				Mail<br>
 | 
| 
 | 
   112 				<textarea name=mail></textarea><br>
 | 
| 
 | 
   113 				<button type=button onclick="set('simple')">Simple</button>
 | 
| 
 | 
   114 				<button type=button onclick="set('html')">HTML</button>
 | 
| 
 | 
   115 				<button type=button onclick="set('attachment')">Attachment</button>
 | 
| 
 | 
   116 			</p>
 | 
| 
 | 
   117 			<p>
 | 
| 
 | 
   118 				<input type=submit>
 | 
| 
 | 
   119 			</p>
 | 
| 
 | 
   120 		</form>
 | 
| 
 | 
   121 
 | 
| 
 | 
   122 		<p>Note that all <b>mail</b> fields except <b>body</b> are simply passed directly to SMTP.</p>
 | 
| 
 | 
   123 
 | 
| 
3
 | 
   124 		<p>Port 465 uses SSL.  Other ports are unencrypted.  If anyone can give me good reason why TLS or STARTTLS are needed, I can implement them.</p>
 | 
| 
 | 
   125 
 | 
| 
4
 | 
   126 		<p>Here is <a href="https://hg.reactionary.software/repo/mailer/">the source</a> of this website.  This service is implemented in <a href="http://www.luan.software/">Luan</a>.  The entire implemention is in the file <a href="/send.json.luan">send.json.luan</a>.  And here is <a href="http://mikraite.arkian.net/Mailer-REST-API-tp3435.html">a discussion thread</a> if you want to comment.</p>
 | 
| 
0
 | 
   127 	</body>
 | 
| 
 | 
   128 	<script> init(); </script>
 | 
| 
 | 
   129 </html>
 |