<?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
页面上,但提交单独的“感谢您的提交”页面thankyou.php
,其中嵌入了上述PHP代码。
代码提交完美,但从不发送电子邮件。请帮忙。
答案 0 :(得分:459)
虽然这个答案的某些部分仅适用于mail()
函数本身的使用,但许多故障排除步骤都可以应用于任何PHP邮件系统。
您的脚本似乎没有发送电子邮件的原因有多种。除非出现明显的语法错误,否则很难诊断这些事情。如果没有,您需要查看下面的清单,找出您可能遇到的任何潜在陷阱。
错误报告对于根除代码中的错误和PHP遇到的常规错误至关重要。需要启用错误报告才能接收这些错误。将以下代码放在PHP文件的顶部(或主配置文件中)将启用错误报告。
error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");
有关详细信息,请参阅this Stack Overflow answer。
mail()
函数这看起来很愚蠢,但常见的错误是忘记在代码中实际放置mail()
函数。确保它在那里,没有注释掉。
mail()
函数bool mail(string $ to,string $ subject,string $ message [,string $ additional_headers [,string $ additional_parameters]])
邮件功能需要三个必需参数,可选择第四个和第五个参数。如果您对mail()
的呼叫至少没有三个参数,则会失败。
如果您对mail()
的呼叫没有正确顺序的正确参数,它也将失败。
您的网络服务器应记录所有通过它发送电子邮件的尝试。这些日志的位置会有所不同(您可能需要询问服务器管理员所在的位置),但通常可以在logs
下的用户根目录中找到它们。内部将是服务器报告的错误消息(如果有),与您尝试发送电子邮件有关。
端口阻塞是一个非常常见的问题,大多数开发人员在整合其代码以使用SMTP传递电子邮件时会遇到这个问题。并且,这可以在服务器maillogs上轻松跟踪(邮件日志服务器的位置因服务器而异,如上所述)。如果您在共享主机服务器上,默认情况下端口25和587仍然处于阻止状态。此块是由您的托管服务提供商专门完成的。即使对于某些专用服务器也是如此。当这些端口被阻止时,尝试使用端口2525进行连接。如果您发现端口也被阻止,那么唯一的解决方案是联系您的托管服务提供商以取消阻止这些端口。
大多数托管服务提供商都阻止这些电子邮件端口,以保护其网络不会发送任何垃圾邮件。
将端口25或587用于普通/ TLS连接,将端口465用于SSL连接。对于大多数用户,建议使用端口587来避免某些托管服务提供商设置的速率限制。
当error suppression operator @
附加到PHP中的表达式时,该表达式可能生成的任何错误消息都将被忽略。在某些情况下,使用此运算符是必要的,但发送邮件不其中之一。
如果您的代码包含@mail(...)
,那么您可能会隐藏重要的错误消息,这些消息将帮助您进行调试。移除@
并查看是否有任何错误报告。
只有在check with error_get_last()
之后发生具体的失败时,才建议这样做。
mail()
返回值 mail()
功能:
如果邮件成功接受传递,则返回
TRUE
,否则返回FALSE
。重要的是要注意,仅仅因为邮件被接受传递,并不意味着邮件实际上将到达预定目的地。
这一点很重要,因为:
FALSE
返回值,则表示错误在于您的服务器接受您的邮件。这可能不是编码问题,而是服务器配置问题。您需要与系统管理员联系,以了解发生这种情况的原因。TRUE
返回值,则表示您的电子邮件肯定会被发送。它只是意味着电子邮件已成功通过PHP发送到服务器上的各自处理程序。 PHP控制之外还有更多的失败点可能导致电子邮件无法发送。所以FALSE
会帮助您指明正确的方向,而TRUE
不必然意味着您的电子邮件已成功发送。这一点很重要!
许多共享的虚拟主机,特别是免费的虚拟主机提供商,不允许从其服务器发送电子邮件或限制在任何给定时间段内可以发送的金额。这是因为他们努力限制垃圾邮件发送者利用他们更便宜的服务。
如果您认为您的主机有电子邮件限制或阻止发送电子邮件,请查看其常见问题解答,看看他们是否列出了任何此类限制。否则,您可能需要联系他们的支持,以验证发送电子邮件是否存在任何限制。
通常,由于各种原因,通过PHP(以及其他服务器端编程语言)发送的电子邮件最终会出现在收件人的垃圾邮件文件夹中。在对代码进行故障排除之前,请务必进行检查。
为了避免通过PHP发送的邮件被发送到收件人的垃圾邮件文件夹,您可以使用PHP代码和其他方式执行各种操作,以最大程度地降低电子邮件被标记为垃圾邮件的可能性。来自Michiel de Mare的好提示包括:
- 使用电子邮件身份验证方法(例如SPF和DKIM)来证明您的电子邮件和您的域名属于一起,并防止欺骗您的域名。 SPF网站包含一个向您的站点生成DNS信息的向导。
- Check您的reverse DNS,以确保您的邮件服务器的IP地址指向您用于发送邮件的域名。
- 确保您使用的IP地址为not on a blacklist
- 确保回复地址是有效的现有地址。
- 在收件人字段中使用收件人的完整真实姓名,而不仅仅是电子邮件地址(例如
"John Smith" <john@blacksmiths-international.com>
)。- 监控您的滥用帐户,例如abuse@yourdomain.com和postmaster@yourdomain.com。这意味着 - 确保这些帐户存在,阅读发送给他们的内容,并根据投诉采取行动。
- 最后,让真的轻松取消订阅。否则,您的用户将通过按垃圾邮件按钮取消订阅,这将影响您的声誉。
有关此主题的更多信息,请参阅How do you make sure email you send programmatically is not automatically marked as spam?。
如果某些垃圾邮件软件缺少常用标题,例如&#34;来自&#34;和&#34;回复&#34;:
$headers = array("From: from@example.com",
"Reply-To: replyto@example.com",
"X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);
无效的标头与没有标头一样糟糕。一个不正确的角色可能只是让您的电子邮件脱轨。仔细检查以确保您的语法正确,因为PHP将不为您捕获这些错误。
$headers = array("From from@example.com", // missing colon
"Reply To: replyto@example.com", // missing hyphen
"X-Mailer: "PHP"/" . PHP_VERSION // bad quotes
);
From:
发件人虽然邮件必须包含发件人:发件人,但您可能不只是使用任何值。特别是用户提供的发件人地址是阻止邮件被阻止的绝对方式:
$headers = array("From: $_POST[contactform_sender_email]"); // No!
原因:您的网络或发送邮件服务器不是SPF / DKIM白名单,假装负责@hotmail或@gmail地址。它甚至可能会默默地删除未配置From:
个发件人域名的邮件。
有时,问题就像电子邮件收件人的值不正确一样简单。这可能是由于使用了不正确的变量。
$to = 'user@example.com';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to
另一种测试方法是将收件人值硬编码到mail()
函数调用中:
mail('user@example.com', $subject, $message, $headers);
这可以应用于所有mail()
参数。
要帮助排除电子邮件帐户问题,请将您的电子邮件发送到不同电子邮件提供商的多个电子邮件帐户。如果您的电子邮件未到达用户的Gmail帐户,请将相同的电子邮件发送到Yahoo帐户,Hotmail帐户和常规POP3帐户(例如ISP提供的电子邮件帐户)。
如果电子邮件到达所有或部分其他电子邮件帐户,您知道您的代码正在发送电子邮件,但电子邮件帐户提供商很可能因某些原因阻止了这些电子邮件。如果电子邮件未到达任何电子邮件帐户,则问题更可能与您的代码相关。
如果您已将表单方法设置为POST
,请确保使用$_POST
查找表单值。如果您已将其设置为GET
或根本没有设置,请确保使用$_GET
查找您的表单值。
action
值指向正确的位置确保您的表单action
属性包含指向您的PHP邮件代码的值。
<form action="send_email.php" method="POST">
某些网络托管服务提供商不允许或启用通过其服务器发送电子邮件。原因可能有所不同,但如果他们禁止发送邮件,您将需要使用另一种方法,使用第三方为您发送这些电子邮件。
向他们的技术支持发送电子邮件(访问其在线支持或常见问题解答后)应说明您的服务器上是否有电子邮件功能。
localhost
邮件服务器如果使用WAMP,MAMP或XAMPP在本地工作站上进行开发,则工作站上可能未安装电子邮件服务器。如果没有,PHP默认情况下无法发送邮件。
您可以通过安装基本邮件服务器来解决此问题。对于Windows,您可以使用免费的Mercury Mail。
您还可以使用SMTP发送电子邮件。请参阅this great answer中的Vikas Dwivedi了解如何执行此操作。
mail.log
除了您的MTA和PHP的日志文件之外,您还可以专门启用logging for the mail()
function。它不记录完整的SMTP交互,但至少记录了函数调用参数和调用脚本。
ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);
有关详细信息,请参阅http://php.net/manual/en/mail.configuration.php。 (最好在php.ini
或.user.ini
或.htaccess
中启用这些选项。)
您可以使用各种传递和垃圾邮件检查服务来测试您的MTA /网络服务器设置。通常,您将邮件探测发送到:他们的地址,然后获取交付报告以及更具体的故障或分析:
PHP内置mail()
功能非常方便,通常可以完成工作,但has its shortcomings。幸运的是,有一些替代方案可提供更多功能和灵活性,包括处理上述许多问题:
所有这些都可以与专业的SMTP服务器/服务提供商结合使用。 (因为在电子邮件设置/可配置性方面,典型的08/15共享虚拟主机计划会受到影响。)
答案 1 :(得分:36)
在邮件功能中添加邮件标题
$header = "From: noreply@example.com\r\n";
$header.= "MIME-Version: 1.0\r\n";
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header.= "X-Priority: 1\r\n";
$status = mail($to, $subject, $message, $header);
if($status)
{
echo '<p>Your mail has been sent!</p>';
} else {
echo '<p>Something went wrong, Please try again!</p>';
}
答案 2 :(得分:22)
答案 3 :(得分:20)
您使用SMTP配置发送电子邮件吗? 尝试使用phpmailer。您可以从https://github.com/PHPMailer/PHPMailer下载该库。我以这种方式创建了我的电子邮件:
function send_mail($email, $recipient_name, $message='')
{
require("phpmailer/class.phpmailer.php");
$mail = new PHPMailer();
$mail->CharSet="utf-8";
$mail->IsSMTP(); // set mailer to use SMTP
$mail->Host = "mail.example.com"; // specify main and backup server
$mail->SMTPAuth = true; // turn on SMTP authentication
$mail->Username = "myusername"; // SMTP username
$mail->Password = "p@ssw0rd"; // SMTP password
$mail->From = "me@walalang.com";
$mail->FromName = "System-Ad";
$mail->AddAddress($email, $recipient_name);
$mail->WordWrap = 50; // set word wrap to 50 characters
$mail->IsHTML(true); // set email format to HTML (true) or plain text (false)
$mail->Subject = "This is a Sampleenter code here Email";
$mail->Body = $message;
$mail->AltBody = "This is the body in plain text for non-HTML mail clients";
$mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
$mail->addAttachment('files/file.xlsx');
if(!$mail->Send())
{
echo "Message could not be sent. <p>";
echo "Mailer Error: " . $mail->ErrorInfo;
exit;
}
echo "Message has been sent";
}
答案 4 :(得分:15)
在发送邮件之前添加一些标题:
<?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";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: from@example.com' . "\r\n" .
'Reply-To: reply@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
还有一件事。 mail()
函数在localhost中不起作用。将您的代码上传到服务器并尝试。
答案 5 :(得分:13)
通过执行以下操作,它在000webhost上为我工作:
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: ". $from. "\r\n";
$headers .= "Reply-To: ". $from. "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "\r\n";
发送电子邮件时直接输入电子邮件地址
mail('email@gmail.com', $subject, $message, $headers)
使用''
而非""
此代码有效但电子邮件收到的时间滞后半小时
答案 6 :(得分:10)
大多数情况下,mail()
功能在共享主机中被禁用。
更好的选择是使用SMTP。最好的选择是Gmail或SendGrid。
<强> SMTPconfig.php 强>
<?php
$SmtpServer="smtp.*.*";
$SmtpPort="2525"; //default
$SmtpUser="***";
$SmtpPass="***";
?>
<强> SMTPmail.php 强>
<?php
class SMTPClient
{
function SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
{
$this->SmtpServer = $SmtpServer;
$this->SmtpUser = base64_encode ($SmtpUser);
$this->SmtpPass = base64_encode ($SmtpPass);
$this->from = $from;
$this->to = $to;
$this->subject = $subject;
$this->body = $body;
if ($SmtpPort == "")
{
$this->PortSMTP = 25;
}
else
{
$this->PortSMTP = $SmtpPort;
}
}
function SendMail ()
{
$newLine = "\r\n";
$headers = "MIME-Version: 1.0" . $newLine;
$headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;
if ($SMTPIN = fsockopen ($this->SmtpServer, $this->PortSMTP))
{
fputs ($SMTPIN, "EHLO ".$HTTP_HOST."\r\n");
$talk["hello"] = fgets ( $SMTPIN, 1024 );
fputs($SMTPIN, "auth login\r\n");
$talk["res"]=fgets($SMTPIN,1024);
fputs($SMTPIN, $this->SmtpUser."\r\n");
$talk["user"]=fgets($SMTPIN,1024);
fputs($SMTPIN, $this->SmtpPass."\r\n");
$talk["pass"]=fgets($SMTPIN,256);
fputs ($SMTPIN, "MAIL FROM: <".$this->from.">\r\n");
$talk["From"] = fgets ( $SMTPIN, 1024 );
fputs ($SMTPIN, "RCPT TO: <".$this->to.">\r\n");
$talk["To"] = fgets ($SMTPIN, 1024);
fputs($SMTPIN, "DATA\r\n");
$talk["data"]=fgets( $SMTPIN,1024 );
fputs($SMTPIN, "To: <".$this->to.">\r\nFrom: <".$this->from.">\r\n".$headers."\n\nSubject:".$this->subject."\r\n\r\n\r\n".$this->body."\r\n.\r\n");
$talk["send"]=fgets($SMTPIN,256);
//CLOSE CONNECTION AND EXIT ...
fputs ($SMTPIN, "QUIT\r\n");
fclose($SMTPIN);
//
}
return $talk;
}
}
?>
<强> contact_email.php 强>
<?php
include('SMTPconfig.php');
include('SMTPmail.php');
if($_SERVER["REQUEST_METHOD"] == "POST")
{
$to = "";
$from = $_POST['email'];
$subject = "Enquiry";
$body = $_POST['name'].'</br>'.$_POST['companyName'].'</br>'.$_POST['tel'].'</br>'.'<hr />'.$_POST['message'];
$SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
$SMTPChat = $SMTPMail->SendMail();
}
?>
答案 7 :(得分:9)
如果您只使用mail()
功能,则需要完成配置文件。
您需要打开邮件扩展,并设置SMTP smtp_port
等等,最重要的是,设置您的用户名和密码。没有它,就无法发送邮件。此外,您可以使用PHPMail类发送。
答案 8 :(得分:9)
分开尝试这两件事:
if($_POST['submit']){}
$from
(只是我的直觉)答案 9 :(得分:8)
对于任何发现这种情况的人,我不建议使用mail
。有一些答案涉及到这个,但不是为什么。
PHP mail
函数不仅不透明,它完全依赖于您使用的任何MTA(即Sendmail)来完成工作。 mail
只会告诉您MTA是否未能接受它(即当您尝试发送时Sendmail已关闭)。它无法告诉您邮件是否成功,因为它已将其交付。因此(如John Conde的回答详细信息),您现在可以摆弄MTA的日志,并希望它足以告诉您未能修复它的问题。如果您是共享主机或无法访问MTA日志,那么您将失去运气。遗憾的是,Linux的大多数vanilla安装的默认设置都是这样处理的。
邮件库(PHPMailer,Zend Framework 2+等)与mail
有很大不同。他们所做的是直接打开接收邮件服务器的套接字,然后直接通过该套接字发送SMTP邮件命令。换句话说,该类充当自己的MTA(请注意,您可以告诉库使用mail
最终发送邮件,但我强烈建议您不要这样做。)
这对您来说意味着您可以直接看到来自接收服务器的响应(例如,在PHPMailer中,您可以turn on debugging output)。不再猜测邮件是否发送失败或原因。
如果您正在使用SMTP(即您正在调用
isSMTP()
),则可以使用SMTPDebug
属性获取SMTP会话的详细记录。通过在脚本中包含这样的行来设置此选项:
$mail->SMTPDebug = 2;
您还可以获得更好的界面。使用mail
,您必须设置所有标题,附件等。使用库,您可以使用专用功能来执行此操作。这也意味着该功能正在完成所有棘手的部分(如标题)。
答案 10 :(得分:8)
我认为这应该可以解决问题。我刚刚添加了一个if(isset
并添加了连接到正文中的变量以将PHP与HTML分开。
<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = 'contact@yoursite.com';
$subject = 'Customer Inquiry';
$body = "From:" .$name."\r\n E-Mail:" .$email."\r\n Message:\r\n" .$message;
if (isset($_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>';
}
}
?>
答案 11 :(得分:6)
试试这个
<?php
$to = "somebody@example.com, somebodyelse@example.com";
$subject = "HTML email";
$message = "
<html>
<head>
<title>HTML email</title>
</head>
<body>
<p>This email contains HTML Tags!</p>
<table>
<tr>
<th>Firstname</th>
<th>Lastname</th>
</tr>
<tr>
<td>John</td>
<td>Doe</td>
</tr>
</table>
</body>
</html>";
// Always set content-type when sending HTML email
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
// More headers
$headers .= 'From: <webmaster@example.com>' . "\r\n";
$headers .= 'Cc: myboss@example.com' . "\r\n";
mail($to,$subject,$message,$headers);
?>
答案 12 :(得分:6)
$name = $_POST['name'];
$email = $_POST['email'];
$reciver = '/* Reciver Email address */';
if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
$subject = $name;
// To send HTML mail, the Content-type header must be set.
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'From:' . $email. "\r\n"; // Sender's Email
//$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
$template = '<div style="padding:50px; color:white;">Hello ,<br/>'
. '<br/><br/>'
. 'Name:' .$name.'<br/>'
. 'Email:' .$email.'<br/>'
. '<br/>'
. '</div>';
$sendmessage = "<div style=\"background-color:#7E7E7E; color:white;\">" . $template . "</div>";
// Message lines should not exceed 70 characters (PHP rule), so wrap it.
$sendmessage = wordwrap($sendmessage, 70);
// Send mail by PHP Mail Function.
mail($reciver, $subject, $sendmessage, $headers);
echo "Your Query has been received, We will contact you soon.";
} else {
echo "<span>* invalid email *</span>";
}
答案 13 :(得分:6)
您可以使用codeigniter配置电子邮件,例如使用smtp(简单方法):
$config = Array(
'protocol' => 'smtp',
'smtp_host' => 'mail.domain.com', //your smtp host
'smtp_port' => 26, //default port smtp
'smtp_user' => 'name@domain.com',
'smtp_pass' => 'password',
'mailtype' => 'html',
'charset' => 'iso-8859-1',
'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('name@domain.com', 'Title');
$this->email->to('emaildestination@domain.com');
$this->email->subject('Header');
$this->email->message($message);
if($this->email->send())
{
//conditional true
}
这对我有用!
答案 14 :(得分:4)
试试这个
if ($_POST['submit']) {
$success= mail($to, $subject, $body, $from);
if($success)
{
echo '
<p>Your message has been sent!</p>
';
} else {
echo '
<p>Something went wrong, go back and try again!</p>
';
}
}
答案 15 :(得分:3)
确保您的服务器中安装了Sendmail。
如果您检查了代码并确认没有任何错误,请转至/ var / mail并检查该文件夹是否为空。
如果为空,则需要执行以下操作:
sudo apt-get install sendmail
如果你在Ubuntu服务器上。
答案 16 :(得分:3)
也许问题是邮件服务器的配置,为了避免这类问题或者你不必担心邮件服务器问题,我建议你使用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;
}
答案 17 :(得分:3)
对于那些不想使用外部邮件程序并希望在专用Linux服务器上发送邮件()的人。
php.ini
部分[mail function]
中描述了php邮件的方式。
参数sendmail-path
描述了如何调用sendmail。默认值为sendmail -t -i
,因此如果您在linux控制台中工作sendmail -t -i < message.txt
,您将完成。您还可以添加mail.log
进行调试,并确保真正调用mail()。
不同的MTA可以实现sendmail
,它们只是在该名称上与其二进制文件建立符号链接。例如,在debian中默认为postfix。配置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.
我更喜欢使用 ssmtp 作为MTA,因为它很简单,并且不需要在打开的端口上运行守护程序。 ssmtp仅适用于从本地主机发送邮件,它还可以通过您的帐户在公共邮件服务上发送经过身份验证的电子邮件。安装ssmtp并编辑config /etc/ssmtp/ssmtp.conf
。还可以将本地系统邮件重新发送到unix帐户(例如,从cron作业向root发送警报)配置/etc/ssmtp/revaliases
文件。
以下是我在Yandex邮件上的帐户配置:
root=mymail@example.com
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
AuthUser=abcde@yandex.ru
AuthPass=password
答案 18 :(得分:3)
如果您在使用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的更多信息,请参阅the official documentation。
答案 19 :(得分:2)
这只会影响少数几个用户,但我希望这个小小的用户能够记录下来。由于这个问题,这一小部分成员花了6个小时对正在运行的PHP邮件脚本进行故障排除。
如果你要去www.AceITLab.com运营XAMPP的大学,你应该知道我们的教授没有告诉我们:AceITLab防火墙(不是Windows防火墙)阻止了XAMPP中的MercuryMail 。您必须使用备用邮件客户端,梨正在为我们工作。您必须发送安全设置较低的Gmail帐户。
是的,我知道,这对现实世界的电子邮件完全没用。然而,从我所看到的情况来看,学术环境和现实世界往往没有什么共同之处。
答案 20 :(得分:2)
首先,
您可能需要mail()函数的许多参数...
你最多可以有5个。 mail(to,subject,message,headers,parameters);
就$from
变量而言,如果你使用linux cPanel,它应该自动来自你的webhost。它自动来自您的cPanel用户名和IP地址。
$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";
还要确保mail()函数中的变量顺序正确。
按此顺序mail($to,$subject,$message,etc.)
,否则有可能无效。
如果这有帮助,请告诉我......
答案 21 :(得分:1)
如果您在本地服务器(即用于开发目的的计算机)上运行此代码,则不会将电子邮件发送给收件人。会发生什么,它将在名为.txt
的文件夹中创建一个mailoutput
文件。
如果您使用000webhost
或hostinger
等免费软管服务,则这些服务提供商会停用mail()
功能,以防止意外使用电子邮件欺骗,垃圾邮件等。希望您与他们联系,看看他们是否支持此功能。
如果您确定服务提供商支持mail()函数,您可以查看此PHP手册以获取进一步的参考, PHP mail()
要查看您的托管服务支持mail()功能的天气,请尝试运行此代码,(请记住更改收件人电子邮件地址)
<?php
$to = 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
'Reply-To: webmaster@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
?>
希望这会有所帮助。
答案 22 :(得分:0)
您可以使用libmail:http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=en
include "libmail.php";
$m = new Mail(); // create the mail
$m->From( $_POST['form'] );
$m->To( $_POST['to'] );
$m->Subject( $_POST['subject'] );
$m->Body( $_POST['body'] );
$m->Cc( $_POST['cc']);
$m->Priority(4);
// attach a file of type image/gif to be displayed in the message if possible
$m->Attach( "/home/leo/toto.gif", "image/gif", "inline" );
$m->Send(); // send the mail
echo "Mail was sent:"
echo $m->Get(); // show the mail source
答案 23 :(得分:0)
如果您的sendmail系统正常运行,则必须按如下所示修改您的代码:
<?php
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$header ="
Content-Type: text/html; charset=UTF-8\r\n
MIME-Version: 1.0\r\n
From: \"$name\" <$email>\r\n
Reply-To: no-reply@yoursite.com\r\n
X-Mailer: yoursite.com mailer\r\n
";
$to = '"Contact" <contact@yoursite.com>';
$subject = 'Customer Inquiry';
$body =<<<EOB
<!DOCTYPE html>
<html>
<body>
$message
</body>
</html>
EOB;
if ($_POST['submit']) {
if (mail ($to, $subject, $body, $header) !== false) {
echo '<p>Your message has been sent!</p>';
} else {
echo '<p>Something went wrong, go back and try again!</p>';
}
}
?>
这使您可以发送基于HTML的电子邮件。
值得注意的是:
注意:<<<EOB
语法要求最后一个EOB标记从行首开始,并且在分号后没有空格或任何字符。
答案 24 :(得分:0)
Sendmail 对于Debian 10.0.0(“ Buster”)的安装实际上是微不足道的!
php.ini
[mail function]
sendmail_path=/usr/sbin/sendmail -t -i
; (Other directives are mostly windows)
标准 sendmail 软件包安装(允许“发送”):
su - # Install as user 'root'
dpkg --list # Is install necessary?
apt-get install sendmail sendmail-cf m4 # Note multiple package selection
sendmailconfig # Respond all 'Y' for new install
其他有用的命令:
which sendmail # /usr/sbin/sendmail
which sendmailconfig # /usr/sbin/sendmailconfig
man sendmail # Documentation
systemctl restart sendmail # As and when required
验证(发送能力)
echo "Subject: sendmail test" | sendmail -v <yourEmail>@gmail.com
以上过程大约花费了5分钟。然后我浪费了5个小时... 别忘了检查您的垃圾邮件文件夹 !
答案 25 :(得分:0)
如果您对Hostgator上托管的应用感到困惑,this可以解决我的问题。非常感谢发布详细解决方案的人。如果链接有一天离线,您可以看到以下摘要:
<?php phpinfo(); ?>
。 (然后,别忘了删除此代码!)sendmail path
,则编辑服务器的-t -i
并添加以下行:php.ini
但是,在能够使用PHP sendmail_path = /usr/sbin/sendmail -t -i;
函数发送邮件之后,我了解到它发送的邮件没有经过身份验证,这导致了另一个问题。这些电子邮件全部掉入了Hotmail的垃圾箱中,有些电子邮件从未发送过,我认为这与未经过身份验证有关。因此,我决定通过SMTP从mail()
切换到mail()
。
答案 26 :(得分:0)
可能是$headers这部分的“From:”$email地址有问题:
From: \"$name\" <$email>
要尝试一下,请发送一封没有标题部分的电子邮件,例如:
mail('user@example.com', $subject, $message);
如果是这种情况,请尝试使用已在您尝试从中发送邮件的系统上创建的电子邮件帐户。
答案 27 :(得分:0)
<?php
$to = 'name@example.com';
$subject = 'Write your email subject here.';
$message = '
<html>
<head>
<title>Title here</title>
</head>
<body>
<p>Message here</p>
</body>
</html>
';
// Carriage return type (RFC).
$eol = "\r\n";
$headers = "Reply-To: Name <name@example.com>".$eol;
$headers .= "Return-Path: Name <name@example.com>".$eol;
$headers .= "From: Name <name@example.com>".$eol;
$headers .= "Organization: Hostinger".$eol;
$headers .= "MIME-Version: 1.0".$eol;
$headers .= "Content-type: text/html; charset=iso-8859-1".$eol;
$headers .= "X-Priority: 3".$eol;
$headers .= "X-Mailer: PHP".phpversion().$eol;
mail($to, $subject, $message, $headers);
发送 HTML 电子邮件 发送电子邮件时,您可以指定 Mime 版本、内容类型和字符集以发送 HTML 电子邮件。
示例 上面的示例将向 name@example.com 发送 HTML 电子邮件消息。您可以对这个程序进行编码,使其接收来自用户的所有内容,然后发送电子邮件。
答案 28 :(得分:-1)
您可以通过以下方式查看错误
error_reporting(E_ALL);
我的示例代码是
<?php
use PHPMailer\PHPMailer\PHPMailer;
require 'PHPMailer.php';
require 'SMTP.php';
require 'Exception.php';
$name=$_POST['name'];
$mailid=$_POST['mail'];
$mail = new PHPMailer;
$mail->IsSMTP();
$mail->SMTPDebug = 0; // Set mailer to use SMTP
$mail->Host = 'smtp.gmail.com'; // Specify main and backup server
$mail->Port = 587; // Set the SMTP port
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'someone@gmail.com'; // SMTP username
$mail->Password = 'password'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable encryption, 'ssl' also accepted
$mail->From = 'someone@gmail.com';
$mail->FromName = 'name';
$mail->AddAddress($mailid,$name); // Name is optional
$mail->IsHTML(true); // Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body = 'Here is your message' ;
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
if(!$mail->Send()) {
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
exit;
}
echo 'Message has been sent';
?>
答案 29 :(得分:-3)
如果您正在使用php mailer,则可以使用此代码,只需复制粘贴即可,并用您的数据和凭据替换***
。并更改输入数据名称的值。
<?php
require_once ("PHPMailer/PHPMailerAutoload.php");
$error = array();
//var_dump($_POST);
$message = $_POST['a'] . '<br>';
$message.= $_POST['b'] . '<br>';
$message.= $_POST['c'] . '<br>';
$message.= $_POST['d'] . '<br>';
$message.= $_POST['e'] . '<br>';
$message.= $_POST['f'] . '<br>';
$message.= $_POST['g'] . '<br>';
$message.= $_POST['h'] . '<br>';
$message.= $_POST['i'] . '<br>';
$message.= $_POST['j'] . '<br>';
$message.= $_POST['k'] . '<br>';
$subject = "Visitor Query";
$from = "******@******.com"; // example a@b.com
$password = '******';
$mail = new PHPMailer();
$body = $message;
$mail->IsSMTP();
$mail->SMTPAuth = true; // turn on SMTP authentication
$mail->SMTPKeepAlive = true; // SMTP connection will not close after each email sent, reduces SMTP overhead
$mail->SMTPDebug = 0;
//$mail->Host = 'mail.******.com'; // sets SMTP server
$mail->Host = 'mail.******.com'; // sets SMTP server
$mail->SMTPSecure = 'ssl';
$mail->Port = 465;
//$mail->Port = 25;
$mail->Username = $from; // SMTP username
$mail->Password = $password; // SMTP password
$mail->AddAddress ( "******@gmail.com" );
$mail->AddReplyTo ( "******@gmail.com", "Team");
$mail->Subject = $subject;
$mail->Body = $message;
$mail->From = $from;
$mail->FromName = "Visitor's Query";
$mail->ContentType = "text/html";
if (count($error == 0)) {
$mail->Send();
// echo "_________________wait_______for_______ our _______ reply !";
} else {
echo $error; // show error messages
//echo $result;
}
//header("location: index.php");
?>