Отправка почты с помощью модуля MIME Mail

Я не могу отправлять письма с прикреплением, используя MIME Mail .
Документация об этом модуле не содержит, но некоторые люди утверждают, что они успешно использовали модуль и отправил почту с приложением.

Я включил и успешно настроил:

Я думаю, что правильно настроил модули.

screenshot

Никакой почты с приложением не поставляется. Я вызываю drupal_mail() в задание cron со следующим кодом.

drupal_mail('mymodule', 'notice', $user_email, $lang, $params, $admin_email);

Он должен вызывать любые реализации hook_mail(), которые он делает, но без вложения.

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['subject'] = 'example submission from '. $account;
      $message['body'][] =
        '<p>'. $account .' has submitted an example.</p>';
      $message['params']['attachments'][] = $attachments;
      break;
  }
}
6 голосов | спросил Michiel 14 MarpmThu, 14 Mar 2013 15:25:12 +04002013-03-14T15:25:12+04:0003 2013, 15:25:12

4 ответа


3

Решение, которое я нашел, это использовать hook_mail_alter , чтобы прикрепить файл к письму после его создания и до его отправки. Ключом к этому является создание массива подробностей о вашем вложении и добавление этого к $ message ['params'] ['attachments'].

hook_mail отправит почту, но если вы используете другую программу для отправки (Swift Mailer или PET ) ), то я считаю, что вам понадобится hook_mail_alter, чтобы изменить почту, а не отправлять ее самостоятельно.

Я также предлагаю использовать API формы ( и это ), чтобы отслеживать ваш файл. Однако этого не требуется, просто укажите необходимую информацию.

function myhook_mail_alter(&$message) {

  print "message id: {$message['id']}\n";

  // if this email is one of the ones I want to alter:
  if (!empty($message['id']) && (preg_match('/^message-id-set-by-formmail[\d]{1,2}/', $message['id']))) {

    // $message['params']['body'] is a single string, not an array
    $result = preg_match('/\[my dumb string with node id# (\d+)]/', $message['params']['body'], $matches);

    print "Message body: \n {$message['params']['body']} \n\n Matches:\n";
    print_r($matches);

    if (!empty($matches[1])) {
      $file_id = $matches[1];
      $my_pdf = file_load($file_id);
      $original_attachments = $message['params']['attachments'];
      // $original_attachments is an array of associative arrays, each bearing details about an attachment.
      // Add an associative array about this desired attachment.
      $my_attachment = array(
        'filecontent' => file_get_contents($my_pdf->uri),
        'filemime' => $my_pdf->filemime,
        'filename' => $my_pdf->filename,
        'filepath' => NULL,
      );
      $message['params']['attachments'][] = $my_attachment;
    }

  }
}
ответил Michael Greisman 31 TueEurope/Moscow2013-12-31T07:35:42+04:00Europe/Moscow12bEurope/MoscowTue, 31 Dec 2013 07:35:42 +0400 2013, 07:35:42
1

Попробуйте, это должно сработать, удачи!

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;
  }
}
ответил bacar ndiaye 13 Maypm13 2013, 19:36:59
1

Мое рабочее решение Drupal 7 с модулем MimeMail без вызова hook_mail ():

// Load attachment.
$file = file_load($fid);

$to = '[email protected]';
$from = '[email protected]';
$subject = 'Invoice ' . $file->filename;

$module = 'mimemail';
$token = time();

$message = array(
  'id' => $module . '_' . $token,
  'to' => $to,
  'subject' => $subject,
  'body' => array('something text...'),
  'headers' => array(
    'From' => $from,
    'Sender' => $from,
    'Return-Path' => $from,
    'MIME-Version' => '1.0',
    'Content-Type' => 'text/html; charset=UTF-8',
  ),
  'params' => array(
    'attachments' => array(
      0 => array(
        'path' => file_stream_wrapper_get_instance_by_uri($file->uri)->realpath(),
        'filecontent' => file_get_contents($file->uri),
        'filename' => $file->filename,
        'mime' => $file->filemime,
        'encoding' => 'base64',
        'disposition' => 'attachment',
        'list' => TRUE,
      ),
    ),
  ),
);

$system = drupal_mail_system($module, $token);
$message = $system->format($message);

if ($system->mail($message)) {
  return TRUE;
}
else {
  return FALSE;
}
ответил Sándor Juhász 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 19 Sep 2014 13:59:45 +0400 2014, 13:59:45
0

В Swift Mail есть хорошая документация, проверьте этот . И ниже я сделал небольшую пользовательскую функцию, чтобы захватить полный путь uri вложений.

/**
 * Send an e-mail.
 */
function test() {

  //load the file by fid
  $file_one = file_load(1);

  //create the file details manually.
  $file = new stdClass();
  $file->uri = file_create_url($file_one->uri);
  $file->filename = $file_one->filename;
  $file->filemime = $file_one->filemime;

  if (!empty($file)) {
    // set parameters
    $params = array(
    'subject' => $subject,
    'body' => $body,
    'to' => $to,
    'cc' => $cc,
    'files' => array($file)
    );
  }
  // Send message
  $message = drupal_mail('singtel_kms', 'send', $to, language_default(),$params);

  // Check the email result array to make sure an email was sent.
  if(!empty($message['result'])) {
     drupal_set_message(t('Your email has been sent.'));
  } else {
     drupal_set_message(t('There was a problem with the application. Please send again or contact administrator.'), 'error');
  }
}

В вашем hook_mail ()

/**
 * Implementation of hook_mail().
 */
function modulename_mail($key, &$message, $params) {

  switch($key) {
    default:
        $text[] = t('<strong>Hi</strong>');
        $text[] = t('<p>This is an e-mail.</p>');

        if (isset($message['params']['files'])) {
            $message['params']['files'][] = $params['files'];
        }

        $message['subject'] = t('Test');
        $message['body'] = $text;
        break;
    }

}
ответил nanbatman 9 FebruaryEurope/MoscowbThu, 09 Feb 2017 09:48:06 +0300000000amThu, 09 Feb 2017 09:48:06 +030017 2017, 09:48:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132