MIME Mail モジュールを使用して、添付ファイル付きのメールを送信できません。
このモジュールに関する詳細なドキュメントはありませんが、 一部の人々 は、モジュールを正常に使用し、添付ファイル付きのメールを送信したと主張しています。
私は有効にして正常に設定しました:
モジュールを正しく構成したと思います。
添付ファイル付きのメールは配信されません。 cronジョブでdrupal_mail()
を次のコードで呼び出します。
_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;
}
}
_
私が見つけた解決策は、 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;
}
}
}
私の作業Drupal 7 Hook_mail()を呼び出さずにMimeMailモジュールを使用したソリューション:
// 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;
}
これを試してみてください、うまくいくはずです。
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;
}
}
Swift Mailにはこれに関する素晴らしいドキュメントがあります。 this をチェックしてください。以下では、添付ファイルの完全な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;
}
}