Invia allegati con drupal_mail


14

Sto cercando di inviare allegati con la mia e-mail da Drupal. Nel mio modulo personalizzato ho aggiunto:

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

e posso inviare mail con html, quella parte funziona.

Ma quando provo ad allegare un file non arriva nella mia casella di posta. Allego il mio file di prova in questo modo:

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

Ma non arriva nulla.

Qualcuno sa come posso ripararlo?


Non mi è chiaro come $ allegato sia aggiunto nel tuo esempio.
David Meister,

Risposte:


17

Potrebbero esserci altri modi, ma ho scoperto che i moduli mailsystem e mimemail devono essere installati per inviare e-mail con allegato. Quindi installa prima questi due moduli.

Quindi implementare hook_mail per passare l'allegato a $ 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'];
  }
}

Esistono due modi per aggiungere un allegato, è possibile passare il contenuto del file o il percorso file quando si aggiunge un file non gestito come allegato (non registrato nel DB) o passare l'oggetto file quando si aggiunge un file gestito.

Quando si aggiungono file non gestiti:

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

o

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

Utilizzando il metodo dei contenuti, probabilmente riceverai due errori php entro l'8 gennaio 2015 incluso

Quando si aggiunge un file gestito:

$attachment = file_load($fid);

Quindi inviare e-mail tramite:

$params = array(
  'key' => 'my_email_template',
  'to' => 'test@example.com',
  'from' => 'test@example.com',
  'subject' => 'Test email',
  'body' => 'test',
  'attachment' => $attachment
);

drupal_mail('mymodule', $key, $to, $language, $params, $from);

è necessario impostare delle intestazioni?
siddiq,

@siddiq non è necessario impostare alcuna intestazione
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 = 'test@example.com'; // emails
$from = 'test@example.com';

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

Questo ha funzionato per me.


Sembra strano popolare da e verso in $ params ma non impostare $ a e $ da ... Non sono sicuro che funzionerà.
Drewish,

2

Ricordo che volevo farlo prima, l'ho provato e ho lavorato per me

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

1
file_get_contents()ha fatto il trucco per me. se non lo utilizzavo, stavo ottenendo allegati di file danneggiati. Grazie.
anou,

@anou Sono felice che la mia soluzione ne aiuti un'altra dopo 2 anni: D
Yusef,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.