Drupal Modul Backup and Migrate versendet keine E-Mails.

Veröffentlicht am: Mi., 27/12/2017 - 03:35 Von: Markus

Seit einem Update der PHP Version auf PHP 7 versendet das Drupal Modul Backup and Migrate keine Mails mehr.

Man bekommt dann in Druapl unter Berichte/ Aktuelle Protokollnachrichten einen Fehler angezeigt im Protokoll.

Warning: mail(): Multiple or malformed newlines found in additional_header in mime_mail->send() (Zeile 138 von /destinations.email.inc).

Das Problem ist soweit mir bekannt ist, eine Sicherheitsänderung in PHP.

Deshalb muss der Code des Moduls geändert werden. Leider gibt es im Moment noch kein Update.

Weil vielleicht nur noch an der neuen Version des Moduls für Drupal 8 gearbeitet wird.

Unter https://www.drupal.org/node/2507495 findet man schon ein geöffnetes Bug Ticket.

Dort findet man unter fix_malformed_newlines-2507495-8.patch eine Anleitung was an der Datei /includes/destinations.email.inc geändert werden muss.

+ bedeutet hinzufügen –entfernen.

Ganz hat dies aber auch nicht funktioniert bei mir ich bekam immer noch einen Fehler angezeigt.

Meine Lösung war noch eine andere Zeile löschen im Code. Allerdings bekomme ich jetzt die Mails immer doppelt.

Das ist mein geänderter Code:

 

<?php


/**
 * @file
 * Functions to handle the email backup destination.
 */

/**
 * A destination for emailing database backups.
 *
 * @ingroup backup_migrate_destinations
 */
class backup_migrate_destination_email extends backup_migrate_destination {
  var $supported_ops = array('scheduled backup', 'manual backup', 'remote backup', 'configure');

  /**
   * Save to (ie. email the file) to the email destination.
   */
  function save_file($file, $settings) {
    $size = filesize($file->filepath());
    $max = variable_get('backup_migrate_max_email_size', 20971520);
    if ($size > $max) {
      _backup_migrate_message('Could not email the file @file because it is @size and Backup and Migrate only supports emailing files smaller than @max.', array('@file' => $file->filename(), '@size' => format_size($size), '@max' => format_size($max)), 'error');
      return FALSE;
    }
    $attachment = new stdClass();
    $attachment->filename = $file->filename();
    $attachment->path = $file->filepath();
    _backup_migrate_destination_email_mail_backup($attachment, $this->get_location());
    return $file;
  }

  /**
   * Get the form for the settings for this filter.
   */
  function edit_form() {
    $form = parent::edit_form();
    $form['location'] = array(
      "#type" => "textfield",
      "#title" => t("Email Address"),
      "#default_value" => $this->get_location(),
      "#required" => TRUE,
      "#description" => t('Enter the email address to send the backup files to. Make sure the email sever can handle large file attachments'),
    );
    return $form;
  }

  /**
   * Validate the configuration form. Make sure the email address is valid.
   */
  function settings_form_validate($values) {
    if (!valid_email_address($values['location'])) {
      form_set_error('[location]', t('The e-mail address %mail is not valid.', array('%mail' => $form_state['values']['location'])));
    }
  }
}

/**
 * @function
 * Temporary mail handler class.
 *
 * Defines a mail class to send a message with an attachment. Eventually Drupal
 * core should provide this functionality, at which time this code will be
 * removed.
 *
 * More info on sending email at <http://php.net/function.mail>.
 * This function taken from dba.module.
 *
 * @param $attachment
 *   An object which contains two variables "path" the path to the file and
 *   filename and "filename" which is just the filename.
 */
function _backup_migrate_destination_email_mail_backup($attachment, $to) {
  // Send mail
  $attach        = fread(fopen($attachment->path, "r"), filesize($attachment->path));
  $mail          = new mime_mail();
  $mail->from    = variable_get('site_mail', ini_get('sendmail_from'));
  $mail->headers = 'Errors-To: [EMAIL='. $mail->from .']'. $mail->from .'[/EMAIL]';
  $mail->to      = $to;
  $mail->subject = t('Database backup from !site: !file', array('!site' => variable_get('site_name', 'drupal'), '!file' => $attachment->filename));
  $mail->body    = t('Database backup attached.') ."\n\n";

  $mail->add_attachment("$attach", $attachment->filename, "Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAgEASABIAAD/7QT+UGhvdG9zaG", NULL, TRUE);
  $mail->send();
}

class mime_mail {
  var $parts;
  var $to;
  var $from;
  var $headers;
  var $subject;
  var $body;

  function mime_mail() {
    $this->parts   = array();
    $this->to      = "";
    $this->from    = "";
    $this->headers = "";
    $this->subject = "";
    $this->body    = "";
  }

  function add_attachment($message, $name = "", $ctype = "application/octet-stream", $encode = NULL, $attach = FALSE) {
    $this->parts[] = array(
      "ctype" => $ctype,
      "message" => $message,
      "encode" => $encode,
      "name" => $name,
      "attach" => $attach,
    );
  }

  function build_message($part) {
    $content_type = "Content-Type: ". $part["ctype"] . ($part["name"] ? "; name = \"". $part["name"] ."\"" : "");
    $encoding = "Content-Transfer-Encoding: base64";
     $disposition = $part['attach'] ? "Content-Disposition: attachment; filename=$part[name]\n" : '';
    $message  = chunk_split(base64_encode($part["message"]));
   return "$content_type\n$encoding\n$disposition$message";
   
   
  }

  function build_multipart() {
   
    $boundary = "b". md5(uniqid(time()));
    $multipart = "Content-Type: multipart/mixed; boundary = $boundary\nThis is a MIME encoded message.\n--$boundary";
   for ($i = sizeof($this->parts) - 1; $i >= 0; $i--) {
       $multipart .= "\n". $this->build_message($this->parts[$i]) ."--$boundary";
     }
    return $multipart .= "--\n";
  }

  function send() {
    $mime = "";
    if (!empty($this->from)) $mime .= "From: ". $this->from ."\n";
    if (!empty($this->headers)) $mime .= $this->headers ."\n";
    if (!empty($this->body)) $this->add_attachment($this->body, "", "text/plain");
    $mime .= "MIME-Version: 1.0\n". $this->build_multipart();
    mail(trim($this->to), $this->subject, "", $mime);
  }
}

Nach dem man die Datei geändert hat funktioniert es erstmal wieder.

Es gibt sicher bald ein Update.

Ich übernehme aber keine Haftung für Schäden die durch den geänderten Code von mir entstehen könnten.

Der ursprüngliche Code stammt von https://www.drupal.org/project/backup_migrate

Neuen Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.

Eingeschränktes HTML

  • Erlaubte HTML-Tags: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • Zeilenumbrüche und Absätze werden automatisch erzeugt.
  • Website- und E-Mail-Adressen werden automatisch in Links umgewandelt.
CAPTCHA
Geben Sie die Zeichen ein, die im Bild gezeigt werden.
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.