Node.js-Module: Nodemailer

Nodemailer – E-Mail-Versand mit Node.js
Keine Kommentare

Zu den Standardaufgaben in der Webentwicklung zählt der Versand von E-Mails zur Benachrichtigung von Benutzern. Was beispielsweise bei PHP zum Standardrepertoire gehört, sucht man im Kern von Node.js vergeblich. Sie müssen jedoch nicht lange nach einer Lösung für dieses Problem suchen: Mit dem npm-Paket Nodemailer können Sie in wenigen Schritten die Funktionalität zum E-Mail-Versand in Ihre Applikation integrieren.

Wie die meisten Pakete für Node.js ist auch Nodemailer ein Open-Source-Projekt, das auf GitHub verwaltet wird und der MIT-Lizenz unterliegt. Die Installation erfolgt über npm auf der Kommandozeile mit dem Befehl npm install –save nodemailer. Das so hinzugefügte Paket kann dann über das Node.js-Modulsystem mit require(’nodemailer‘) eingebunden und verwendet werden. Nodemailer ist allerdings kein vollwertiger Mailserver, der in Node.js geschrieben ist, sondern nur ein recht vielseitiger Mailclient. Sie benötigen also trotzdem noch einen Mailserver zum Versand Ihrer E-Mails. Anders ist es jedoch auch bei anderen Sprachen nicht.

Der Versand

Zunächst müssen Sie mithilfe des Nodemailer-Pakets einen Transporter generieren, über den Sie dann Ihre E-Mails versenden können. Zu diesem Zweck rufen Sie die createTransport-Methode auf. Sie akzeptiert ein Konfigurationsobjekt und ein Objekt, das den Versand mit weiteren Optionen konfiguriert. In einfachen Fällen reicht der Verbindungs-URL zu einem SMTP-Server als Konfigurationsobjekt aus. Lassen Sie das zweite Argument weg, werden die Standardwerte von Nodemailer verwendet.

Mit dem entstandenen Transporter können Sie nun mit der sendMail-Methode Ihre E-Mails versenden. Hierzu benötigen Sie wiederum ein Konfigurationsobjekt, über das Sie Absender, Empfänger, Betreff und die Nachricht selbst angeben. Das zweite Argument ist eine Callback-Funktion, die ausgeführt wird, nachdem die Nachricht versendet wurde. Wie üblich in Node.js ist das erste Argument dieser Callback-Funktion ein Fehlerobjekt, das im Erfolgsfall den Wert null hat. Das zweite Argument ist ein Objekt, das weitere Informationen über den Versand, wie beispielsweise die MessageId beinhaltet (Listing 1).

var nodemailer = require('nodemailer');

var connection = 'smtps://user%40gmail.com:pass@smtp.gmail.com';

var transporter = nodemailer.createTransport(connection);

var mailOptions = {
  from: '"Klaus" <klaus@test.de>',
  to: 'peter@test.de',
  subject: 'Mr. Watson -- come here',
  text: 'I need to see you'
};

transporter.sendMail(mailOptions, function(err, info){
  if (err) throw err;
  console.log('Message sent: ' + info.response);
});

Weitere Konfigurationsoptionen

In vielen Fällen reicht die Angabe einer Zeichenkette zur Konfiguration des Transporters jedoch nicht aus. Stattdessen können Sie auch ein Konfigurationsobjekt verwenden, über das Sie sehr detailliert steuern können, wie sich der Transporter verhalten soll. So können Sie beispielsweise den Hostnamen und die Portnummer für die Verbindung angeben oder über die Option auth einen Benutzernamen und Passwort für die Anmeldung am Server festlegen.

Eine weitere wichtige Option verbirgt sich hinter dem Schlüssel pool. Sie gibt an, ob pro versendeter E-Mail eine Verbindung zum Server aufgebaut oder ein Verbindungspool benutzt werden soll. Beabsichtigen Sie nur eine oder wenige E-Mails zu versenden, so können Sie hier den Wert „false“ wählen. Er sorgt dafür, dass jeweils eine neue Verbindung aufgebaut wird. Sobald Sie jedoch mehrere E-Mails auf einmal versenden, führt dies zu unnötigem Overhead, den Sie mit dem Wert „true“ für die Pool-Option vermeiden können.

Mit dem Nodemailer können Sie auch über eine SSL-Verbindung Nachrichten versenden. Das sollten Sie standardmäßig tun, um zu vermeiden, dass unberechtigte Personen die von Ihnen versendeten Nachrichten auslesen können. Um eine solche sichere Verbindung aufzubauen, geben Sie die Option secure mit dem Wert „true“ an.

International PHP Conference

Frameworkless – the new black?

by Carsten Windler (KW-Commerce GmbH)

Getting started with PHP-FFI

by Thomas Bley (Bringmeister GmbH)

JSON-Schema von 0 auf 100

by Ingo Walther (Electronic Minds GmbH)

IT Security Camp 2021

Von der Cloud über DevSecOps bis hin zu Datenschutzproblem von WhatsApp

Christian Schneider spricht im Interview über aktuelle Security-Trends. Welche Themen rücken besonders heute stark in den Security-Fokus, warum alles rund um die Cloud immer mehr an Bedeutung gewinnt, welche Aspekte in der Cyberabwehr effektiv sind u.v.m.

IT-Security Experte, Christian Schneider

Christian ist als freiberuflicher White Hat Hacker, Trainer und Security-Coach tätig. Als Softwareentwickler mit mittlerweile 20 Jahren Erfahrung, fand er 2005 seinen Themenschwerpunkt im Bereich IT-Security.

HTML-E-Mails und Anhänge

Im vorangegangenen Beispiel haben Sie die text-Eigenschaft in den mailOptions verwendet. Das hat dafür gesorgt, dass Ihre Nachricht als Plain-Text versendet wurde. Sollten Sie jedoch wünschen, dass die E-Mail stattdessen im HTML-Format verschickt wird, definieren Sie Ihre Nachricht über den Schlüssel html. Eine weit verbreitete Best Practice in diesem Fall ist, beide Felder zu verwenden, sodass bei Clients, die HTML-E-Mails nicht unterstützen oder nicht erlauben, stattdessen die Textversion angezeigt wird.

Ähnlich einfach wie der Versand von HTML-E-Mails gestaltet sich auch das Anhängen von Dateien an eine E-Mail (Listing 2). Sie müssen lediglich unter dem Schlüssel attachments in den mailOptions ein Array von Dateiobjekten angeben. Jedes Element dieses Arrays ist ein Objekt mit dem Schlüssel content; er enthält entweder eine Zeichenkette, ein Buffer-Objekt oder einen Stream. Dieses Objekt stellt den eigentlichen Anhang dar. Zusätzlich dazu können Sie noch weitere Optionen wie beispielsweise den Dateinamen mit der Option filename oder die Zeichencodierung mit encoding angeben.

var mailOptions = {
  from: '"Klaus" &amp;amp;amp;amp;lt;klaus@test.de&amp;amp;amp;amp;gt;',
  to: 'mary@test.de',
  subject: 'Invoice #4',
  text: 'Please find attached your invoice',
  attachments: [{
    filename: 'invoice.pdf',
    content: fs.createReadStream('../attachments/invoice.pdf')
  }]
};

transporter.sendMail(mailOptions, function(err, info){
  if (err) throw err;
  console.log('Message sent: ' + info.response);
});

Die hier gezeigten Beispiele stellen nur einen sehr kleinen Ausschnitt aus dem Funktionsumfang von Nodemailer dar. Sie können Ihre eigenen Transporter schreiben oder eines der zahlreichen Plug-ins verwenden. Außerdem können Sie das Rendering von E-Mails beeinflussen, indem Sie entweder auf Templates oder eigene Renderer zurückgreifen. Wie Sie sehen, ist Nodemailer ein recht mächtiges Werkzeug, mit dem sich die meisten Anforderungen rund um den Versand von E-Mails aus Ihrer Node.js-Applikation heraus umsetzen lassen.

Fazit

Neben dem Nodemailer-Paket existieren für Node.js noch zahlreiche weitere Pakete, die sich um den Versand von E-Mails kümmern. Wobei sich Nodemailer als De-facto-Standard durchgesetzt hat. Dieses Paket bietet im Gegensatz zu seinen Konkurrenten einen relativ großen Funktionsumfang und wird seit Januar 2011 stets aktiv weiterentwickelt.

PHP Magazin

Entwickler MagazinDieser Artikel ist im PHP Magazin erschienen. Das PHP Magazin deckt ein breites Spektrum an Themen ab, die für die erfolgreiche Webentwicklung unerlässlich sind.

Natürlich können Sie das PHP Magazin über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Kiosk ist das PHP Magazin weiterhin im Print-Abonnement erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Abonnieren
Benachrichtige mich bei
guest
0 Comments
Inline Feedbacks
View all comments
X
- Gib Deinen Standort ein -
- or -