【问题标题】:Want to generate a docx file and send it as attachment using PHP (PHPMailer)想要生成一个 docx 文件并使用 PHP (PHPMailer) 作为附件发送
【发布时间】:2013-09-16 19:51:13
【问题描述】:

我已经创建了一个患者医疗报告表,我的工作是我想生成一个格式正确且兼容的 docx 文件(主要由表格和段落组成),其中包含填写的表格接收到的值并发送它作为附件而不保存任何地方。

要创建 docx 文件,我想使用 PHPWord 插件,我还尝试使用HTMLtoDOCX 生成 docx,但我想以附件形式发送动态生成的 docx 文件。 (不要告诉我使用 PHPDocx,因为我有它的社区版本,它会生成空白文件或文本少于添加的文件)

我正在使用 PHPMailer 发送电子邮件。我不想附加文件使用 AddAttachment 函数,因为它用于位于某处的永久文件。

目前我可以使用 PHPMailer 发送动态生成的 doc 文件,但该文件与 MS Word 2010 的代码不兼容生成doc文件并作为附件发送是:

    $separator = md5(time());

    $eol = PHP_EOL;

    $headers  = "MIME-Version: 1.0".$eol;
line-4  // $headers .= "Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document".$eol;
line-5  // $headers .= "Content-Type: application/vnd.ms-word.document.macroEnabled".$eol;

    // attachment name
    $filename = $a1 . " Medical Report.doc";

    // Report Document

    $report  = "                    ".$a1 . " Medical Report".$eol.$eol.$eol;
    $report .= "NAME                            |            ".$a1.$eol;
    $report .= "HOSPITAL No.                    |            ".$a2.$eol;
    $report .= "DATE of BIRTH                   |            ".$a3.$eol;
    $report .= "SEX                             |            ".$a4.$eol;
    $report .= "DATE of FOLLOW UP               |            ".$a5.$eol;
    $report .= "DATE of IMPLANT                 |            ".$a6.$eol;
    $report .= "PACEMAKER                       |            ".$a7.$eol;
    $report .= "MODEL                           |            ".$a8.$eol;
    $report .= "PROGRAMMED RATE(bpm)            |            ".$a9.$eol;
    $report .= "MAGNET RATE(bpm)                |            ".$a10.$eol;
    $report .= "EOL/ERT RATE(bpm)               |            ".$a11.$eol;
    $report .= "PROGRAMMED RATE(ms)             |            ".$a12.$eol;
    $report .= "MAGNET RATE(ms)                 |            ".$a13.$eol;
    $report .= "EOL/ERT Rate(ms)                |            ".$a14.$eol;
    $report .= "ATRIAL(amp)                     |            ".$a15.$eol;
    $report .= "RIGHT VENTRICLE(amp)            |            ".$a16.$eol;
    $report .= "LEFT VENTRICLE(amp)             |            ".$a17.$eol;
    $report .= "ATRIAL(pw)                      |            ".$a18.$eol;
    $report .= "RIGHT VENTRICLE(pw)             |            ".$a19.$eol;
    $report .= "LEFT VENTRICLE(pw)              |            ".$a20.$eol;
    $report .= "ATRIAL(mv)                      |            ".$a21.$eol;
    $report .= "RIGHT VENTRICLE(mv)             |            ".$a22.$eol;
    $report .= "LEFT VENTRICLE(mv)              |            ".$a23.$eol;
    $report .= "ATRIAL(ohms)                    |            ".$a24.$eol;
    $report .= "RIGHT VENTRICLE(ohms)           |            ".$a25.$eol;
    $report .= "LEFT VENTRICLE(ohms)            |            ".$a26.$eol;
    $report .= "BATTERY IMPEDANCE               |            ".$a27.$eol;
    $report .= "CALC LONGEVITY                  |            ".$a28.$eol;
    $report .= "BATTERY VOLTAGE                 |            ".$a29.$eol;
    $report .= "ERI INDICATOR                   |            ".$a30.$eol;
    $report .= "CURRENT                         |            ".$a31.$eol;
    $report .= "STABILITY/MYO-POTENTIAL         |            ".$a32.$eol;
    $report .= "VA CONDUCTION                   |            ".$a33.$eol;
    $report .= "WOUND CHECK                     |            ".$a34.$eol;
    $report .= "ECG RHYTHM                      |            ".$a35.$eol;
    $report .= "UNDERLYING RHYTHM               |            ".$a36.$eol;
    $report .= "HISTOGRAMS %AGE PACING          |            ".$a37.$eol;
    $report .= "PATIENT SYMPTOMS                |            ".$a38.$eol;
    $report .= "COMMENTS                        |            ".$a39.$eol;
    $report .= "PROGRAMME CHANGES AND REASONS   |            ".$a40.$eol;  
    $report .= "CARDIAC PHYSIOLOGIST            |            ".$a44.$eol;
    $report .= "NEXT APPOINTMENT                |            ".$a42.$eol;



    // encode data (puts attachment in proper format)
    $attachment = chunk_split(base64_encode($report));

    ///////////HEADERS INFORMATION////////////

    // main header (multipart mandatory) message
    $headers .= "Content-Type: multipart/mixed; boundary=\"".$separator."\"".$eol.$eol; 
    $headers .= "Content-Transfer-Encoding: 7bit".$eol;
    $headers .= "This is a MIME encoded message.".$eol.$eol;

    // message
    $headers .= "--".$separator.$eol;
    $headers .= "Content-Type: text/html; charset=\"iso-8859-1\"".$eol;
    $headers .= "Content-Transfer-Encoding: 8bit".$eol.$eol;
    $headers .= $message1.$eol.$eol;

    // attachment
    $headers .= "--".$separator.$eol;
    $headers .= "Content-Type: application/octet-stream; name=\"".$filename."\"".$eol; 
    $headers .= "Content-Transfer-Encoding: base64".$eol;
    $headers .= "Content-Disposition: attachment".$eol.$eol;
    $headers .= $attachment.$eol.$eol;
    $headers .= "--".$separator."--";



    require("class.phpmailer.php");
    $mail = new PHPMailer();

    $mail->IsSMTP();   // set mailer to use SMTP
    $mail->Host = "localhost";  // specify main and backup server
    $mail->SMTPAuth = true;     // turn on SMTP authentication
    $mail->Username = "newuser"; // Make sure to replace this with your shell enabled user
    $mail->Password = "wampp";  // Make sure to use the proper password for your user


    $mail->From = "admin@localhost";
    $mail->FromName = "Admin";
    $mail->AddAddress("recepient@domain.com", "First Last");
        $mail->AddCC("recepient@domain.com");
        $mail->AddBCC("recepient@domain.com");

    $mail->AddReplyTo("admin@localhost", "Admin");

    $mail->WordWrap = 50;  // set word wrap to 50 characters
    $mail->IsHTML(true);   // set email format to HTML

    $mail->Subject = $subject;
    $mail->MsgHTML($message1);
    $mail->AddCustomHeader($headers);
    // $mail->AddAttachment($filename, 'Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms.word.document.macroEnabled');

    if(!$mail->Send()){
        echo "Message could not be sent. <p>";
        echo "Mailer Error: " . $mail->ErrorInfo;
        exit;
    }
    else {
echo <<<_END
    <script>
        alert("Email Sent");
        document.location='index.html';
    </script>
_END;
    }
?>

如果我注释掉 docx 的第 4 行和第 5 行,那么我没有收到 HTML 消息,并且文件也更改为不同的不受支持的 word 文件。

这个完整问题的结论是,我需要根据我想要的设计或我拥有的模板正确格式化的 Docx 文件,并将其作为附件发送,没有任何保存或下载对话框。 p>

如果我使用这些标题,则会出现一个带有打开和保存选项的对话框(我也不想要这个)

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=example.docx');
header('Content-Transfer-Encoding: binary');

我希望你们都明白我想要什么。如果有人会给我正确的方向或解决方案,那么在此先感谢 1000000000000000,因为我只在这个问题上浪费了 2 天时间。

【问题讨论】:

    标签: php phpmailer email-attachments phpword


    【解决方案1】:

    您不是在生成 Word 文件...您是在生成纯文本,然后通过伪造 mime 标题来假装它是 Word。

    鉴于您正在使用 PHPMailer,您应该尝试构建自己的 MIME 电子邮件 - PHPMailer 已经可以完美地为您完成它自己。

    至于不想使用“真实”文件来存储附件数据,可以使用AddStringAttachment()方法:

      $mailer->AddStringAttachment($your_fake_word_file_as_a_string, 'Example.docx')
    

    详见此处:http://phpmailer.worxware.com/index.php?pg=tutorial#3

    【讨论】:

    • 我是 PHP 的新手 .. 我没有正确理解你。我尝试了您的解决方案,但没有将其作为附件。我只得到 doc 文件。那么 PHPWord 和 HTMLtoDocx 呢。
    【解决方案2】:

    使用 PHPWord 生成 Docx 文件并通过邮件发送。它很容易添加图像、表格、字体样式和更多功能之类的东西,

    阅读此处了解有关 PHPWord 及其用法的更多信息。

    http://www.kvcodes.com/2014/08/create-docx-files-using-php/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      • 2013-08-31
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多