web-dev-qa-db-fra.com

Envoyer des pièces jointes avec drupal_mail

J'essaie d'envoyer des pièces jointes avec mon e-mail depuis Drupal. Dans mon module personnalisé, j'ai ajouté:

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)
    );
  }
}

et je peux envoyer des mails avec html, cette partie fonctionne.

Mais lorsque j'essaie de joindre un fichier, il n'arrive pas dans ma boîte de réception. J'attache mon fichier de test comme ceci:

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

Mais rien n'arrive.

Quelqu'un sait comment je peux le réparer?

14
andeersg

Il pourrait y avoir d'autres moyens, mais j'ai trouvé que les modules mailsystem et mimemail doivent être installés pour envoyer des e-mails avec pièce jointe. Installez donc ces deux modules en premier.

Ensuite, implémentez hook_mail pour passer la pièce jointe à $ message

/**
 * 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'];
  }
}

Il existe deux façons d'ajouter une pièce jointe: vous pouvez transmettre le contenu du fichier ou le chemin d'accès au fichier lors de l'ajout d'un fichier non géré en tant que pièce jointe (non enregistré dans la base de données) ou transmettre l'objet fichier lors de l'ajout d'un fichier géré.

Lors de l'ajout d'un fichier non géré:

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

ou

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

En utilisant filecontent, vous obtiendrez probablement deux erreurs php d'ici le 8 janvier 2015, y compris

Lors de l'ajout d'un fichier géré:

$attachment = file_load($fid);

Envoyez ensuite un e-mail par:

$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);

Cela a fonctionné pour moi.

3
Aparna

Je me souviens que je voulais l'avoir fait avant, j'ai essayé et j'ai travaillé pour moi

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