Kirim lampiran dengan drupal_mail

14

Saya mencoba mengirim lampiran dengan email saya dari Drupal. Dalam modul khusus saya, saya telah menambahkan:

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

dan saya dapat mengirim email dengan html, bagian itu berfungsi.

Tetapi ketika saya mencoba untuk melampirkan file itu tidak tiba di kotak masuk saya. Saya lampirkan file pengujian saya seperti ini:

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

Tapi tidak ada yang datang.

Adakah yang tahu bagaimana cara memperbaikinya?

andeersg
sumber
Tidak jelas bagi saya bagaimana $ attachment ditambahkan dalam contoh Anda.
David Meister

Jawaban:

17

Mungkin ada cara lain, tetapi saya telah menemukan sistem surat dan mimemail itu modul harus diinstal untuk mengirim email dengan lampiran. Jadi instal kedua modul ini terlebih dahulu.

Kemudian implementasikan hook_mail untuk mengirimkan lampiran ke $ 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'];
  }
}

Ada dua cara untuk menambahkan lampiran, Anda bisa melewatkan filecontent atau filepath saat menambahkan file yang tidak dikelola sebagai lampiran (tidak direkam dalam DB) atau meneruskan objek file saat menambahkan file yang dikelola.

Saat menambahkan file yang tidak dikelola:

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

atau

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

Dengan menggunakan cara filecontent, Anda mungkin akan mendapatkan dua kesalahan php pada 08 Jan 2015 termasuk

Saat menambahkan file terkelola:

$attachment = file_load($fid);

Kemudian kirim email dengan:

$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
sumber
setiap header perlu diatur?
siddiq
@siddiq tidak perlu mengatur header
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);

Ini berhasil untuk saya.

Aparna
sumber
Tampaknya aneh untuk mengisi ke dan dari dalam $ params tetapi tidak menetapkan $ ke dan $ dari ... Saya tidak yakin ini akan berhasil.
drewish
2

Saya ingat saya ingin melakukannya sebelumnya, saya mencoba ini dan bekerja untuk saya

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
sumber
1
file_get_contents()melakukan trik untukku. jika tidak menggunakannya, saya mendapatkan lampiran file yang rusak. Terima kasih.
anou
@Anou Saya senang solusi saya membantu yang lain setelah 2 tahun: D
Yusef