it-swarm.com.de

Senden Sie Anhänge mit drupal_mail

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?\[email protected]', $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 folgendermaßen 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?

14
andeersg

Es kann andere Möglichkeiten geben, aber ich habe festgestellt, dass die Module Mailsystem und Mimemail 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 Dateiinhalt 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 verwenden, werden Sie wahrscheinlich bis zum 08. Januar 2015 zwei PHP-Fehler erhalten, einschließlich

Beim Hinzufügen einer verwalteten Datei:

$attachment = file_load($fid);

Dann senden Sie eine E-Mail an:

$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);
17
eric.chenchao
$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.

3
Aparna

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;
  }
}
2
Yusef