Deno SMTP mail client
IMPORTANT SECURITY INFORMATION
PLEASE update to a version >= 0.8! 0.8 has a problem where malformed mails could potatialy allow attackers to create a mail (with linebreaks) to send unwanted SMTP commands. This could result in authentic phishing attacks! Whith no way for the user to identify that this is a phishing mail! Or that this mail contains a dangorus attachment!
Also make shure that Mails are sent one after the other as they can corrupt each others data!
Allowed Mail Formats
A single Mail mail@example.de with a name NAME can be encoded in the
following ways:
"name@example.de""<name@example.de>""NAME <name@example.de>"{mail: "name@example.de"}{mail: "name@example.de", name: "NAME"}
Where 1-3 is called a “MailString”.
Multiple Mails can be an Array of the above OR a object that maps names to mails for example:
{"P1": "p1@example.de", "P2": "p2@example.de"} we call this a MailObject.
For the fields
from,replyTowe only allow a “MailString”.to,cc,bccwe allow a MailObject a Array of single Mails or a single Mail.
Sending multiple mails
Note that for race-condition reasons we can’t send multiple mails at once.
Because of that if send is allready called and still processing a mail
client.send will que that sending.
Example
import { SmtpClient, quotedPrintableEncode } from "https://deno.land/x/denomailer/mod.ts";
const client = new SmtpClient();
await client.connect({
  hostname: "smtp.163.com",
  port: 25,
  username: "username",
  password: "password",
});
await client.send({
  from: "mailaddress@163.com",
  to: "Me <to-address@xx.com>",
  cc: [
    "name@example.de",
    "<name@example.de>",
    "NAME <name@example.de>",
    {mail: "name@example.de"},
    {mail: "name@example.de", name: "NAME"}
  ],
  bcc: {
    "Me": "to-address@xx.com"
  },
  subject: "Mail Title",
  content: "Mail Content",
  html: "<a href='https://github.com'>Github</a>",
  date: "12 Mar 2022 10:38:05 GMT",
  priority: "high",
  replyTo: 'mailaddress@163.com',
  attachments: [
    { encoding: "text"; content: 'Hi', contentType: 'text/plain', filename: 'text.txt' },
    { encoding: "base64"; content: '45dasjZ==', contentType: 'image/png', filename: 'img.png' },
    {
      content: new Uint8Array([0,244,123]),
      encoding: "binary",
      contentType: 'image/jpeg', 
      filename: 'bin.png'
    }
  ],
  mimeContent: [
    {
      mimeType: 'application/markdown',
      content: quotedPrintableEncode('# Title\n\nHello World!'),
      transferEncoding: 'quoted-printable'
    }
  ]
  
});
await client.close();TLS connection
await client.connectTLS({
  hostname: "smtp.163.com",
  port: 465,
  username: "username",
  password: "password",
});Use in Gmail
await client.connectTLS({
  hostname: "smtp.gmail.com",
  port: 465,
  username: "your username",
  password: "your password",
});
await client.send({
  from: "someone@163.com", // Your Email address
  to: "someone@xx.com", // Email address of the destination
  subject: "Mail Title",
  content: "Mail Content,maybe HTML",
});
await client.close();Configuring your client
You can pass options to your client through the SmtpClient constructor.
import { SmtpClient } from "https://deno.land/x/denomailer/mod.ts";
//Defaults
const client = new SmtpClient({
  console_debug: true, // enable debugging this is good while developing should be false in production as Authentication IS LOGGED TO CONSOLE!
  unsecure: true, // allow unsecure connection to send authentication IN PLAIN TEXT and also mail content!
});