Senden Sie Anhänge mit drupal_mail

15

Ich versuche, Anhänge mit meiner E-Mail von Drupal zu senden. In meinem benutzerdefinierten Modul habe ich hinzugefügt:

class SponsorprogramMailSystem implements MailSystemInterface {
  /**
   * Concatenate and wrap the e-mail body for plain-text mails.
   *
   * @param $message
   *   A message array, as described in hook_mail_alter().
   *
   * @return
   *   The formatted $message.
   */
  public function format(array $message) {
    $message['body'] = implode("\n\n", $message['body']);
    return $message;
  }
  /**
   * Send an e-mail message, using Drupal variables and default settings.
   *
   * @see http://php.net/manual/en/function.mail.php
   * @see drupal_mail()
   *
   * @param $message
   *   A message array, as described in hook_mail_alter().
   * @return
   *   TRUE if the mail was successfully accepted, otherwise FALSE.
   */
  public function mail(array $message) {
    $mimeheaders = array();
    foreach ($message['headers'] as $name => $value) {
      $mimeheaders[] = $name . ': ' . mime_header_encode($value);
    }
    $line_endings = variable_get('mail_line_endings', MAIL_LINE_ENDINGS);
    return mail(
      $message['to'],
      mime_header_encode($message['subject']),
      // Note: e-mail uses CRLF for line-endings. PHP's API requires LF
      // on Unix and CRLF on Windows. Drupal automatically guesses the
      // line-ending format appropriate for your system. If you need to
      // override this, adjust $conf['mail_line_endings'] in settings.php.
      preg_replace('@\r?\n@', $line_endings, $message['body']),
      // For headers, PHP's API suggests that we use CRLF normally,
      // but some MTAs incorrectly replace LF with CRLF. See #234403.
      join("\n", $mimeheaders)
    );
  }
}

und ich kann Mails mit HTML senden, dieser Teil funktioniert.

Aber wenn ich versuche, eine Datei anzuhängen, kommt sie nicht in meinem Posteingang an. Ich hänge meine Testdatei so an:

$attachment = array(
        'filecontent' => file_get_contents(DRUPAL_ROOT . '/README.txt'),
        'filename' => 'test.txt',
        'filemime' => 'text/plain',
      );

Aber nichts kommt an.

Weiß jemand, wie ich es reparieren kann?

andeersg
quelle
Mir ist unklar, wie $ attachment in Ihrem Beispiel hinzugefügt wird.
David Meister

Antworten:

17

Möglicherweise gibt es andere Möglichkeiten, aber ich habe festgestellt, dass Mailsystem- und Mimemail- Module installiert werden müssen, um E-Mails mit Anhang zu senden. Installieren Sie also zuerst diese beiden Module.

Implementieren Sie dann hook_mail, um den Anhang an $ message zu übergeben

/**
 * Implements hook_mail().
 */
function mymodule_mail($key, &$message, $params) {
  $message['subject'] = $params['subject'];
  $message['body'][] = $params['body'];

  // Add attachment when available.
  if (isset($params['attachment'])) {
    $message['params']['attachments'][] = $params['attachment'];
  }
}

Es gibt zwei Möglichkeiten, einen Anhang hinzuzufügen: Sie können entweder den Dateicontent oder den Dateipfad übergeben, wenn Sie eine nicht verwaltete Datei als Anhang hinzufügen (nicht in der Datenbank aufgezeichnet), oder das Dateiobjekt übergeben, wenn Sie eine verwaltete Datei hinzufügen.

Beim Hinzufügen einer nicht verwalteten Datei:

$attachment = array(
  'filepath' => $filepath, // or $uri
);

oder

$attachment = array(
  'filecontent' => file_get_contents($uri),
  'filename' => $filename,
  'filemime' => 'application/pdf'
);

Wenn Sie filecontent way verwenden, werden Sie wahrscheinlich bis einschließlich 08.01.2015 zwei PHP-Fehler bekommen

Beim Hinzufügen einer verwalteten Datei:

$attachment = file_load($fid);

Dann senden Sie eine E-Mail per:

$params = array(
  'key' => 'my_email_template',
  'to' => '[email protected]',
  'from' => '[email protected]',
  'subject' => 'Test email',
  'body' => 'test',
  'attachment' => $attachment
);

drupal_mail('mymodule', $key, $to, $language, $params, $from);
eric.chenchao
quelle
Müssen Header gesetzt werden?
Siddiq
@siddiq müssen keine Header gesetzt werden
eric.chenchao
3
$attachment = array(
      'filecontent' => $filepathname,
      'filename' => $namefile,
      'filemime' => 'application/pdf'
      );
//where $filepathname should contain the path to the file and $filename should contain the name of the file.
$to = '[email protected]'; // emails
$from = '[email protected]';

$params = array(
  'headers' => array('Content-Type' => 'text/html'),
  'key' => 'test',
  'subject' => 'Test email',
  'body' => 'test',
  'attachment' => $attachment
);

drupal_mail($module, $key, $to, $language, $params, $from, $send = TRUE);

Das hat bei mir funktioniert.

Aparna
quelle
Scheint seltsam, das Hin- und Her-Kommando in $ params zu füllen, aber nicht $ to und $ from zu setzen ... Ich bin mir nicht sicher, ob dies funktionieren wird.
Am
2

Ich erinnere mich, dass ich es schon einmal machen wollte, ich habe es versucht und für mich gearbeitet

function mymodule_mail($key, &$message, $params) {
  $data['user'] = $params['from'];
  $account = $data['user']->name;

  $file_content = file_get_contents('some/file/path');

  $attachments = array(
     'filecontent' => $file_content,
     'filename' => 'example-' . $account,
     'filemime' => 'application/pdf',
   );

  switch($key) {
    case 'notice':

      $langcode = $message['language']->language;
      $message = drupal_mail($module, $key, $to, $language, $params, $from, $send);
      $message['subject'] = 'example submission from '. $account;
      $message['body'][] =
        '<p>'. $account .' has submitted an example.</p>';
      $message['params']['attachments'][] = $attachments;
    $system = drupal_mail_system($module, $key);
    // Format the message body.
    $message = $system->format($message);
    // Send e-mail.
    $message['result'] = $system->mail($message);

    if($message['result'] == TRUE) {
        drupal_set_message(t('Your message has been sent.'));
    }
    else{
        drupal_set_message(t('There was a problem sending your message and it was not     sent.'), 'error');
    }
      break;
  }
}
Yusef
quelle
1
file_get_contents()hat den Trick für mich getan. Wenn ich es nicht verwende, erhalte ich beschädigte Dateianhänge. Vielen Dank.
17.
@anou Ich bin froh, dass meine Lösung einem anderen nach 2 Jahren hilft: D
Yusef