【问题标题】:php - mail with attachment file - message encryptedphp - 带有附件文件的邮件 - 邮件加密
【发布时间】:2017-09-29 07:20:50
【问题描述】:

我编写了这段代码,用于从 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;

但在这种情况下,邮件没有加密但没有附件文件(说明确认附件实际上已处理但未收到)

【问题讨论】:

  • “加密”是什么意思?你有例子吗?
  • 你应该停止使用 php 的 mail() 并查看 phpmailer 或 swiftmailer
  • 您的问题不清楚。您需要回复 cmets 或 Martin's answer
  • $headers .= "From:".$compagnia."\r\n"; 这是不正确的。 mail() 需要一个电子邮件地址,而不仅仅是一个“公司”名称。这可能在其中发挥了重要作用。
  • OP 的表单上可能也没有 CSRF,或者上述电子邮件发送脚本上没有任何形式的重复预防......

标签: php email chunks


【解决方案1】:

你有两个问题

1)

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

这是不正确的,你引用的$_FILES值应该是上传文件的临时位置,不是[uploads]而是[tmp_name],所以把上面的代码替换为:

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

2)

第二个问题是您提供给 PHP 以读取 $fileSize 的文件大小不是完整文件,因此附件被截断,因此显示不正确(出现“加密”)

我注意到 PHP 在计算文件大小的方式上有很多问题 [可能在某些平台上,我不知道]。在这种情况下,fread 函数的值似乎与实际完整文件大小的字节数不同,因此mail 函数仅加载约 99% 的附件,这意味着文件不完整并且所以看起来会乱码(“加密”)。

作为stated on the manual page:

如果您只想将文件的内容转换为字符串,请使用 file_get_contents(),因为它的性能要好得多 [比 fread()]。

所以将$handle = fopen($fileTmpName, "r");
$content = fread($handle, $fileSize); 替换为:

 $content = file_get_contents($fileTmpName); 

这将捕获整个文件大小,而不是$fileSize定义的任意数量。
您现在应该已将完整的文件上传到您的电子邮件中。


奖励:

正如nogad 所指出的,您真的应该使用Swift MailerPHPMailer 查找,因为mail 函数充满了类似的小问题,就像这里的那个。

【讨论】:

  • 你听说过php中的word_chunk()吗?我知道这是一个愚蠢的问题,我不得不问。那里的答案没有回应我在它下面留下的评论。
  • @Fred-ii- 我只能认为它是插件库的一部分,“吹”。如blowing_chunks()
  • 对不起马丁;我不跟。除非那是个玩笑;-) 那我就明白了。
  • 抱歉,那是joke:-| 。我想睡觉,但我需要等待病毒扫描完成...
  • 呵呵,是的,我是这么想的 ;-)
猜你喜欢
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 2017-09-06
  • 2012-09-09
  • 2020-01-04
  • 2017-07-31
  • 2016-05-03
  • 2010-10-30
相关资源
最近更新 更多