簡體   English   中英

php-帶有附件文件的郵件-郵件已加密

[英]php - mail with attachment file - message encrypted

我編寫了以下代碼,以html格式從php發送帶有附件的電子郵件:

<?php

if($_POST && isset($_FILES['file-upload'])){

    $from             = $_POST["email"]; 
    $rubinetteria     = 'info@domain.com'; 

    $nome             = filter_var($_POST["nome"], FILTER_SANITIZE_STRING); 
    $email            = filter_var($_POST["email"], FILTER_SANITIZE_STRING); 
    $oggetto          = filter_var($_POST["oggetto"], FILTER_SANITIZE_STRING); 
    $compagnia        = filter_var($_POST["company"], FILTER_SANITIZE_STRING);
    $ruolo            = filter_var($_POST["ruolo"], FILTER_SANITIZE_STRING);
    $messaggio        = filter_var($_POST["messaggio"], FILTER_SANITIZE_STRING); 

    $fileTmpName     = $_FILES['file-upload']['uploads'];
    $fileName        = $_FILES['file-upload']['name'];
    $fileSize        = $_FILES['file-upload']['size'];
    $fileType        = $_FILES['file-upload']['type'];
    $fileError       = $_FILES['file-upload']['error'];




    $handle = fopen($fileTmpName, "r");
    $content = fread($handle, $fileSize);
    fclose($handle);
    $encoded_content = chunk_split(base64_encode($content));

        $boundary = md5("sanwebe");

        $headers = "MIME-Version: 1.0\r\n";
        $headers .= "From:".$compagnia."\r\n";
        $headers .= "Reply-To: ".$reply_to_email."" . "\r\n";
        $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n";


        $body = "--$boundary\r\n";
        $body .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
        $body .= "Content-Transfer-Encoding: base64\r\n\r\n";
        $body .= "<b>Azienda: </b>" .$compagnia. "<br>";
        $body .= "<b>Nome e Cognome: </b>" .$nome. "<br>";
        $body .= "<b>Ruolo: </b>" .$ruolo. "<br>";
        $body .= "<br>". chunk_split(base64_encode($messaggio));


        $body .= "--$boundary\r\n";
        $body .="Content-Type: $fileType; name=".$fileName."\r\n";
        $body .="Content-Disposition: attachment; filename=".$fileName."\r\n";
        $body .="Content-Transfer-Encoding: base64\r\n";
        $body .="X-Attachment-Id: ".rand(1000,99999)."\r\n\r\n";
        $body .= $encoded_content;

    $sentMail = @mail($rubinetteria, $oggetto, $body, $headers);

}


?>

問題是,當我收到電子郵件時,某些消息被加密了。 我想問題是這行代碼:

$body .= "<br>". chunk_split(base64_encode($messaggio));

我試圖用這一行訂閱這一行:

$body .= "<br>".$messaggio;

但是在這種情況下,郵件未加密,但是沒有附件文件(描述確認附件已被實際處理但未收到)

你有兩個問題

1)

 $fileTmpName     = $_FILES['file-upload']['uploads'];

這是不正確的,您引用的$_FILES值應該是上載文件的臨時位置,而不是[uploads]而是[tmp_name] ,因此將上面的代碼替換為:

 $fileTmpName     = $_FILES['file-upload']['tmp_name'];

2)

第二個問題是您提供給PHP以讀取$fileSize的文件大小不是完整文件,因此附件被截斷並因此顯示不正確(顯示為“ encrypted”)

我注意到PHP計算文件大小的方式存在很多問題[可能在某些平台上,我不知道]。 在這種情況下,似乎給fread函數提供的值與實際的完整文件大小不一樣,因此mail函數僅加載約99%的附件,這意味着文件不完整,因此看起來會出現亂碼( “加密” )。

手冊頁所述

如果只想將文件的內容轉換為字符串,請使用file_get_contents(),因為它的性能要比[fread()]好得多。

所以替換$handle = fopen($fileTmpName, "r");
$content = fread($handle, $fileSize); 與:

 $content = file_get_contents($fileTmpName); 

這將捕獲整個文件大小,而不是$fileSize定義的任意數量。
現在,您應該在電子郵件中上傳了完整的文件。


獎金:

正如nogad所指出的nogad ,您確實應該使用Swift MailerPHPMailer進行查找,因為mail功能充滿了類似此處的類似小問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM