Tracks
/
Elixir
Elixir
/
Übungen
/
Newsletter
Newsletter

Newsletter

Lernübung

Einführung

File

Funktionen für die Arbeit mit Dateien stellt das Modul File bereit.

Um eine ganze Datei zu lesen, verwende File.read/1. Um in eine Datei zu schreiben, verwende File.write/2.

Jedes Mal, wenn mit File.write/2 in eine Datei geschrieben wird, wird ein Dateideskriptor geöffnet und ein neuer Elixir-Prozess gestartet. Aus diesem Grund solltest du es vermeiden, in einer Schleife mit File.write/2 in eine Datei zu schreiben.

Stattdessen kannst du eine Datei mit File.open/2 öffnen. Das zweite Argument von File.open/2 ist eine Liste von Modi, mit der du angeben kannst, ob du die Datei zum Lesen oder zum Schreiben öffnen möchtest.

File.open/2 gibt die PID eines Prozesses zurück, der die Datei verwaltet. Um in die Datei zu lesen und zu schreiben, verwendest du Funktionen aus dem Modul IO und übergibst diese PID als IO-Gerät.

Wenn du mit der Datei fertig bist, schließe sie mit File.close/1.

Alle genannten Funktionen aus dem Modul File haben auch eine !-Variante, die einen Fehler auslöst, anstatt ein Fehler-Tupel zurückzugeben (z. B. File.read!/1). Verwende diese Variante, wenn du nicht vorhast, Fehler wie fehlende Dateien oder fehlende Berechtigungen zu behandeln.

Anleitung

Du bist ein großer Fan von Modelleisenbahnen und hast beschlossen, deine Leidenschaft mit der Welt zu teilen, indem du einen Newsletter startest. Zum Anfang schickst du die erste Ausgabe deines Newsletters an deine Freunde und Bekannten, die dein Hobby teilen. Du hast eine Textdatei mit einer Liste ihrer E-Mail-Adressen.

1. E-Mail-Adressen aus einer Datei lesen

Implementiere die Funktion Newsletter.read_emails/1. Sie erwartet einen Dateipfad. Die Datei ist eine Textdatei, die E-Mail-Adressen enthält, die durch Zeilenumbrüche getrennt sind. Die Funktion gibt eine Liste der E-Mail-Adressen aus der Datei zurück.

Newsletter.read_emails("/home/my_user/documents/model_train_friends_emails.txt")
# => ["rick@example.com", "choochoo42@example.com", "anna@example.com"]

2. Eine Logdatei zum Schreiben öffnen

Das Senden einer E-Mail ist eine Aufgabe, die aus vielen unvorhersehbaren Gründen fehlschlagen kann, zum Beispiel wegen eines Tippfehlers in der E-Mail-Adresse oder vorübergehender Netzwerkprobleme. Damit du das Senden der E-Mails an alle deine Freunde wiederholen kannst, ohne Duplikate zu verschicken, musst du die E-Mail-Adressen protokollieren, die die E-Mail bereits erhalten haben. Dafür brauchst du eine Logdatei.

Implementiere die Funktion Newsletter.open_log/1. Sie erwartet einen Dateipfad, öffnet die Datei zum Schreiben und gibt die PID des Prozesses zurück, der die Datei verwaltet.

Newsletter.open_log("/home/my_user/documents/newsletter_issue1_log.txt")
# => #PID<0.145.0>

3. Eine gesendete E-Mail protokollieren

Implementiere die Funktion Newsletter.log_sent_email/2. Sie erwartet die PID des Prozesses, der die Datei verwaltet, und einen String mit der E-Mail-Adresse. Sie schreibt die E-Mail-Adresse in die Datei, gefolgt von einem Zeilenumbruch.

Newsletter.log_sent_email(pid, "joe@example.com")
# => :ok

4. Die Logdatei schließen

Implementiere die Funktion Newsletter.close_log/1. Sie erwartet die PID des Prozesses, der die Datei verwaltet, und schließt die Datei.

Newsletter.close_log(pid)
# => :ok

5. Den Newsletter verschicken

Jetzt, wo du alle Bausteine für das Versenden der E-Mails hast, musst du sie in einer einzigen Funktion zusammenführen.

Implementiere die Funktion Newsletter.send_newsletter/3. Sie erwartet den Pfad der Datei mit den E-Mail-Adressen, den Pfad einer Logdatei und eine anonyme Funktion, die eine E-Mail an eine bestimmte E-Mail-Adresse sendet. Sie liest alle E-Mail-Adressen aus der angegebenen Datei und versucht, an jede von ihnen eine E-Mail zu senden. Wenn die anonyme Funktion, die die E-Mail sendet, :ok zurückgibt, schreibe die E-Mail-Adresse in die Logdatei, gefolgt von einem Zeilenumbruch. Achte darauf, dass du das sofort tust, sobald die E-Mail gesendet wurde. Nachdem alle E-Mails gesendet wurden, schließe die Logdatei.

Newsletter.send_newsletter(
  "model_train_friends_emails.txt",
  "newsletter_issue1_log.txt",
  fn email -> :ok end
)

# => :ok
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Elixir Exercism

Bereit, mit Newsletter zu starten?

Melde dich bei Exercism an, um Elixir mit 58 Konzepte168 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.