Gửi tệp đính kèm với drupal_mail


15

Tôi đang cố gắng gửi tệp đính kèm với email của mình từ Drupal. Trong mô-đun tùy chỉnh của tôi, tôi đã thêm:

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

và tôi có thể gửi thư bằng html, phần đó đang hoạt động.

Nhưng khi tôi cố đính kèm một tập tin thì nó không đến hộp thư đến của tôi. Tôi đính kèm tập tin kiểm tra của tôi như thế này:

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

Nhưng không có gì đến.

Bất cứ ai biết làm thế nào tôi có thể sửa chữa nó?


Tôi không rõ ràng về cách đính kèm $ được thêm vào trong ví dụ của bạn.
David Meister

Câu trả lời:


17

Có thể có những cách khác, nhưng tôi đã phát hiện ra rằng mailsystemmimemail module phải được cài đặt để gửi email với tập tin đính kèm. Vì vậy, cài đặt hai mô-đun đầu tiên.

Sau đó triển khai hook_mail để truyền tệp đính kèm vào $ 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'];
  }
}

Có hai cách để thêm tệp đính kèm, bạn có thể truyền tệp filecontent hoặc filepath khi thêm tệp không được quản lý dưới dạng tệp đính kèm (không được ghi trong DB) hoặc truyền đối tượng tệp khi thêm tệp được quản lý.

Khi thêm tệp không được quản lý:

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

hoặc là

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

Bằng cách sử dụng cách thức filecontent, bạn có thể sẽ nhận được hai lỗi php vào ngày 08 tháng 1 năm 2015 bao gồm

Khi thêm tệp được quản lý:

$attachment = file_load($fid);

Sau đó gửi email bằng cách:

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

bất kỳ tiêu đề cần phải được thiết lập?
siddiq

@siddiq không cần thiết lập bất kỳ tiêu đề nào
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);

Điều này làm việc cho tôi.


Có vẻ kỳ lạ khi nhập vào và từ trong $ params nhưng không đặt $ thành và $ từ ... Tôi không chắc điều này sẽ hoạt động.
thu hút

2

Tôi nhớ tôi muốn làm điều đó trước đây, tôi đã thử nó và làm việc cho tôi

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()đã lừa tôi Nếu không sử dụng nó, tôi đã nhận được tệp đính kèm bị hỏng. Cảm ơn.
anou

@anou Tôi rất vui khi giải pháp của tôi giúp một người khác sau 2 năm: D
Yusef
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.