Envoyer des pièces jointes avec drupal_mail

14

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?

andeersg
la source
Je ne sais pas comment $ attachment est ajouté dans votre exemple.
David Meister

Réponses:

17

Il pourrait y avoir d'autres moyens, mais j'ai constaté que les modules de système de messagerie et de messagerie électronique 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 la méthode 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);
eric.chenchao
la source
des en-têtes doivent être définis?
siddiq
@siddiq pas besoin de définir d'en
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);

Cela a fonctionné pour moi.

Aparna
la source
Semble étrange de remplir le to et from dans $ params mais pas de définir $ to et $ from ... Je ne suis pas sûr que cela fonctionnera.
drewish
2

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;
  }
}
Yusef
la source
1
file_get_contents()a fait l'affaire pour moi. sinon, je recevais des pièces jointes corrompues. Merci.
anou
@anou Je suis heureux que ma solution en aide une autre après 2 ans: D
Yusef