2016-06-17 8 views
3

У меня есть веб-приложение, в котором пользователи могут нажать кнопку, чтобы загрузить отчет в формате PDF.Как загрузить файл и немедленно экспортировать его в виде вложения электронной почты

Мои пользователи просили, чтобы при загрузке PDF его сразу же открывали в виде вложения электронной почты (вроде как при нажатии на ящик mailto).

Возможно ли это? Я думал, возможно, используя js для создания тега привязки за кадром, но я читал, что mailto не поддерживает приложения.

Если это имеет значение, PDF создается на стороне сервера, используя PHP mPDF для загрузки режима вывода.

+0

Это не представляется возможным, по крайней мере, без какой-либо клиент работал на компьютере клиента. – Farkie

+0

Вы имеете в виду без каких-либо клиентских приложений? –

+0

Yep, который, я думаю, слушает PDF-файлы, загруженные вашим собственным сайтом, и передает его. Даже тогда это было бы очень сложно. – Farkie

ответ

0

mailto поддерживает вложение, если файл доступен локально. Вы можете использовать параметр attach, чтобы указать это.
, например. mailto:[email protected]?subject=Test&attach=C:\Documents%20and%20Settings\username\Desktop\foldername\file.extn
Однако я не уверен, как вы будете использовать это в своем коде, так как пользователи могут загружать файл в любое место на своем компьютере. Если это используется, параметр attach поддерживает общие расположения дисков, если у пользователя есть соответствующий доступ.

+0

Параметр 'attach' в эти дни игнорируется из-за проблем с безопасностью. – Farkie

0

Для этого вам необходимо разделить процесс на два этапа.

  1. Создать PDF на сервере в некотором каталоге с помощью http://wkhtmltopdf.org/
  2. Send генерироваться PDF, как часть электронной прикрепленного с помощью https://github.com/PHPMailer/PHPMailer

настроить как сервис поможет вам достичь вашей задачи.

Ниже приведен пример кода, который поможет вам

//generate PDF file for bill and send it in email 
public function sendInvoiceInEmail($register_no, $html_string, $guest_email_id) 
{ 
    //create mailer class 
    $mail = new PHPMailer; 
    //remove old invoice file if exist at public/doc 
    // here i have used my path you have to use your path 
    if(file_exists(__DIR__.'/../../public/docs/invoice.pdf')){ 
     unlink(__DIR__.'/../../public/docs/invoice.pdf'); 
    } 

    // You can pass a filename, a HTML string, an URL or an options array to the constructor 
    $pdf = new Pdf([ 
     'commandOptions' => [ 
      'useExec' => false, 
      'escapeArgs' => false, 
      'procOptions' => array(
      // This will bypass the cmd.exe which seems to be recommended on Windows 
      'bypass_shell' => true, 
      // Also worth a try if you get unexplainable errors 
      'suppress_errors' => true, 
      ), 
     ], 
    ]); 
    $globalOptions = array(
     'no-outline' 
    ); 

    $pdf->setOptions($globalOptions); 

    $pdf->addPage($html_string); 
    //for Windows in my system i have setup wkhtmltopdf here 
    $pdf->binary = '"C:/Program Files/wkhtmltopdf/bin/wkhtmltopdf.exe"'; 
    // for linux when you will host you have to setp on linux abd comment windows path and uncomment below line 
    //$pdf->binary = '/home/username/wkhtmltox/bin/wkhtmltopdf'; 
    if (!$pdf->saveAs(__DIR__.'/../../public/docs/invoice.pdf')) { 
     throw new Exception('Could not create PDF: '.$pdf->getError()); 
    } 
    //now send email and attach invoice.pdf file from public/doc/invoice.pdf 



    //$mail->SMTPDebug = 3;        // Enable verbose debug output 
    $mail->isSMTP();          // Set mailer to use SMTP 
    $mail->Host = 'hostname'; // Specify main and backup SMTP servers 
    $mail->SMTPAuth = true;        // Enable SMTP authentication 
    $mail->Username = 'username';     // SMTP username 
    $mail->Password = 'password';       // SMTP password 
    $mail->SMTPSecure = 'tls';       // Enable TLS encryption, `ssl` also accepted 
    $mail->Port = 587;         // TCP port to connect to 
    $mail->setFrom('from_email_address', 'From Name',FALSE); 
    $mail->addAddress('to_email_address');  // Add a recipient 

    $mail->addAttachment(__DIR__.'/../../public/docs/invoice.pdf');   // Add attachments 

    $mail->isHTML(true);         // Set email format to HTML 

    $mail->Subject = 'Subject'; 
    $mail->Body = 'email message body'; 

    $is_email_sent = false; 
    if(!$mail->send()) { 
     // echo 'Message could not be sent.'; 
     // echo 'Mailer Error: ' . $mail->ErrorInfo; 
     $is_email_sent = false; 
    } else { 
     // echo 'Message has been sent'; 
     $is_email_sent = true; 
    } 

    return true; 
} 
+0

Это не то, о чём задан вопрос - mailto: это ссылка электронной почты на стороне клиента, например, thunderbird. – Farkie

+0

Я думаю, что его лучше отправить с сервера. До того, как несколько дней назад я действительно так много пытался использовать клиентскую сторону, но я не смог –

+0

Но мне удалось использовать подход на стороне сервера и опубликованное решение. Я думаю, это может помочь –