【问题标题】:PHP using mail() - email with attachment sends but plain text email does notPHP 使用 mail() - 发送带有附件的电子邮件,但不发送纯文本电子邮件
【发布时间】:2020-10-09 07:34:43
【问题描述】:

我正在尝试使用 PHP mail() 从 HTML 表单发送带有附件的电子邮件。

我在网上找到了一个有效的脚本 - 但有一个问题:

如果将文件附加到电子邮件中,则脚本可以正常工作。但是,如果没有附件,则会发送电子邮件但不包含任何文本内容(空白电子邮件正文)。

我希望添加附件的功能是可选的。

我的问题是,如何才能成功发送电子邮件,无论是否带有附件?

谢谢!

我使用的PHP脚本如下:

<?php

$email =  trim($_POST['email']);
$email_san = filter_var($email, FILTER_SANITIZE_EMAIL);

$fname = $_POST['first_name'];
$fname_san = filter_var($fname,FILTER_SANITIZE_STRING);

$lname = $_POST['last_name'];
$lname_san = filter_var($lname,FILTER_SANITIZE_STRING);

$org =  trim($_POST['organisation']);
$org_san =  filter_var($org,FILTER_SANITIZE_STRING);

$user_phone = $_POST['phone'];
$trim_phone = trim($user_phone);  
$replace_phone = preg_replace('/[^0-9+-]/', '', $trim_phone);
$phone_san = filter_var($replace_phone,FILTER_SANITIZE_NUMBER_INT);

$message = $_POST['message'];
$fromemail =  $email_san;
$subject="Inquiry";
$email_message = '<p><b>First Name:</b> '.$fname_san.'</p>
                <p><b>Organisation:</b> '.$org_san.'</p>
                <p><b>Email:</b> '.$email_san.'</p> 
                <p><b>Phone:</b> '.$phone_san.'</p>                    
                <p><b>Message:</b><br/>'.$message.'</p>';

$semi_rand = md5(uniqid(time()));
$headers = "From: ".$fromemail;
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

$headers .= "\nMIME-Version: 1.0\n" .
"Content-Type: multipart/mixed;\n" .
" boundary=\"{$mime_boundary}\"";

if($_FILES["file"]["name"]!= ""){  
$strFilesName = $_FILES["file"]["name"];  
$strContent = chunk_split(base64_encode(file_get_contents($_FILES["file"]["tmp_name"])));  


$email_message .= "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type:text/html; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$email_message .= "\n\n";


$email_message .= "--{$mime_boundary}\n" .
"Content-Type: application/octet-stream;\n" .
" name=\"{$strFilesName}\"\n" .
//"Content-Disposition: attachment;\n" .
//" filename=\"{$fileatt_name}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$strContent  .= "\n\n" .
"--{$mime_boundary}--\n";
}
$toemail="email@somedomain.com"; 

if(mail($toemail, $subject, $email_message, $headers)){
echo "Email sent.";
}else{

echo "Email NOT sent.";
}

?>

/*** 更新***/

好的,考虑到 PHPMailer 是一种更好的发送电子邮件的方法,我再次尝试设置 PHPMailer。

我没有 Composer,所以我手动下载并安装了 PHPMailer。我没有 Composer,所以我手动下载并安装了 PHPMailer。我的服务器文件夹层次结构显示在this image。

我在网上找到了一个 PHPMailer 教程,它提供了一个简单的脚本,我将它保存为“mailer-test.php”,上传并链接到我的 PHPMailer 安装:

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require_once "php-mailer/src/Exception.php";

//PHPMailer Object
$mail = new PHPMailer(true); //Argument 'true' in enables exceptions

//From email address and name
$mail->From = "me@mydomain.com";
$mail->FromName = "Full Name";

//To address and name
//$mail->addAddress("recipient@somedomain.com", "Recepient Name");
$mail->addAddress("recipient@somedomain.com"); //Recipient name is optional

//Address to which recipient will reply
$mail->addReplyTo("me@mydomain.com", "Reply");

//Send HTML or Plain Text email
$mail->isHTML(true);

$mail->Subject = "Subject Text";
$mail->Body = "<i>Mail body in HTML</i>";
$mail->AltBody = "This is the plain text version of the email content";

try {
    $mail->send();
    echo "Message has been sent successfully";
} catch (Exception $e) {
    echo "Mailer Error: " . $mail->ErrorInfo;
}

?>

但是,当我在浏览器中查看“mailer-test.php”时,出现以下服务器错误:

此页面无法正常工作。 yourdomain.com 目前无法处理此请求。 HTTP 错误

这是什么原因造成的?

【问题讨论】:

  • 出于好奇:是否有充分的理由手动编写所有这些内容?那里有很多好的库(比如 PHPMailer、SwiftMailer),它们会让你的生活更轻松:)
  • 试过 PHPMailer 但无法配置它。在这上面浪费了一天。至少这个脚本有时可以工作。
  • 问题已经改变/演变。它最初是“我希望附件是可选的,并且我无法发送没有附件的电子邮件”,现在似乎是“我在更改代码后发送电子邮件时出错”。礼仪是提出一个单独的问题(meta.stackoverflow.com/a/252129/3080207)

标签: php email


【解决方案1】:

您的 strcontent 看起来有些奇怪(他错过了第 39 行的 $) 但要更简单,请使用PhpMailer 类

发送邮件让您的生活变得轻松

【讨论】:

  • 感谢您的建议。我浪费了一天时间尝试配置 PHPMailer。无法让它工作。至少这个脚本部分有效!
  • 您只需要包含库,然后只需几行代码,如果您愿意,我可以帮助您。 github.com/PHPMailer/PHPMailer#a-simple-example
  • 感谢您的提议!赞赏。但是我在使用 PHPMailer 时遇到了各种各样的问题。另外,我对 SMTP 一无所知,因此您可能需要一周的时间来指导我完成设置。
  • 第 39 行缺少 $ 是我的错字。原来的脚本是正确的。
  • 好吧,随你喜欢 :) 在每种情况下,你都不必强制使用 SMTP,你可以使用主机的默认提供程序(无需配置)
【解决方案2】:

确保将enctype='multipart/form-data' 添加到表单标签中:

<form action='index.php' method='POST' enctype='multipart/form-data'>
  ...
</form>

【讨论】:

    猜你喜欢
    • 2012-06-15
    • 2015-07-08
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多