<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = 'contact@yoursite.com';
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";
if ($_POST['submit']) {
if (mail ($to, $subject, $body, $from)) {
echo '<p>Your message has been sent!</p>';
} else {
echo '<p>Something went wrong, go back and try again!</p>';
}
}
?>
我试着创建了一个简单的邮件表单。表单本身在我的index.html页面上,但它提交到一个单独的“感谢您的提交”页面thanks . PHP,其中嵌入了上述PHP代码。
代码完美地提交,但从未发送电子邮件。我该如何解决这个问题?
可能问题出在邮件服务器的配置上。为了避免这类问题,或者您不必担心邮件服务器的问题,我建议您使用PHPMailer。
它是一个插件,拥有发送邮件所需的一切,唯一需要考虑的是启用SMTP端口(端口:25和465)。
require_once 'PHPMailer/PHPMailer.php';
require_once '/servicios/PHPMailer/SMTP.php';
require_once '/servicios/PHPMailer/Exception.php';
$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
//Server settings
$mail->SMTPDebug = 0;
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'correo@gmail.com';
$mail->Password = 'contrasenia';
$mail->SMTPSecure = 'ssl';
$mail->Port = 465;
// Recipients
$mail->setFrom('correo@gmail.com', 'my name');
$mail->addAddress('destination@correo.com');
// Attachments
$mail->addAttachment('optional file'); // Add files, is optional
// Content
$mail->isHTML(true);// Set email format to HTML
$mail->Subject = utf8_decode("subject");
$mail->Body = utf8_decode("mail content");
$mail->AltBody = '';
$mail->send();
}
catch (Exception $e) {
$error = $mail->ErrorInfo;
}
如果使用PHP发送邮件遇到问题,可以考虑使用PHPMailer或SwiftMailer等替代方案。
当我需要用PHP发送邮件时,我通常使用SwiftMailer。
基本用法:
require 'mail/swift_required.php';
$message = Swift_Message::newInstance()
// The subject of your email
->setSubject('Jane Doe sends you a message')
// The from address(es)
->setFrom(array('jane.doe@gmail.com' => 'Jane Doe'))
// The to address(es)
->setTo(array('frank.stevens@gmail.com' => 'Frank Stevens'))
// Here, you put the content of your email
->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');
if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
echo json_encode([
"status" => "OK",
"message" => 'Your message has been sent!'
], JSON_PRETTY_PRINT);
} else {
echo json_encode([
"status" => "error",
"message" => 'Oops! Something went wrong!'
], JSON_PRETTY_PRINT);
}
有关如何使用SwiftMailer的更多信息,请参阅官方文档。
对于那些不想使用外部邮件并且希望在专用的Linux服务器上使用mail()的人。
PHP如何发送邮件,详见PHP .ini中[邮件函数]一节。
参数sendmail-path描述如何调用sendmail。默认值是sendmail -t -i,因此如果您在Linux控制台中得到一个正常工作的sendmail -t -i < message.txt,那么您就完成了。您还可以将mail.log添加到调试中,并确保真正调用了mail()。
不同的mta可以实现sendmail。它们只是在这个名称上创建一个符号链接到它们的二进制文件。例如,在Debian中,默认是后缀。配置MTA以发送邮件并从控制台使用sendmail -v -t -i < message.txt进行测试。文件message.txt应该包含消息的所有头和正文,信封的目的地址将从To:头中获取。例子:
From: myapp@example.com
To: mymail@example.com
Subject: Test mail via sendmail.
Text body.
我更喜欢使用smtp作为MTA,因为它简单,不需要运行开放端口的守护进程。smtp仅适用于从本地主机发送邮件。它还可以通过公共邮件服务通过您的帐户发送经过认证的电子邮件。安装ssmtp,编辑配置文件/etc/ssmtp/ssmtp.conf。配置/etc/ssmtp/revaliases文件也能够接收本地系统邮件到Unix帐户(例如,从cron作业到root的警报)。
以下是我在Yandex邮箱上的账户配置:
root=mymail@example.com
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
AuthUser=abcde@yandex.ru
AuthPass=password