【发布时间】:2015-03-27 12:52:14
【问题描述】:
我最近建立了一个警报系统,当调用某些 API 时,它会通过 PHP 的 mail() 函数向我(或其他人)发出警报。
在电子邮件上它工作得很好。该函数返回true,并在发送到的邮箱中接收。
由于某种原因,当发送到 SMS 网关(即 XXXXXXXXXX@messaging.sprint.com)时,函数会发送它(它确实返回 true),但它永远不会在另一端收到。
如果我使用相同的电子邮件地址(发送到 sms 网关)并通过电子邮件客户端(例如 zimbra 或其他)发送它,它会顺利通过并被此人接收。
我是网页设计师,而不是真正的电子邮件/IT 人员。我假设它与标题或类似的东西有关,但是我不精通这个技术主题。
我与我的 IT 人员交谈,他说这是错误的,并且标题中似乎没有正确的“发件人”地址。电子邮件错误不是来自有效的电子邮件地址,而是来自“www.data@[server-name]”,而不是我通过有效电子邮件地址的标头发送的内容。
这是我的代码的 sn-p:
<?php
$carriers = array("@messaging.sprintpcs.com");
//get to email
if (isset($_POST['to'])) {
$to = $_POST['to'];
}
// get from email
if (isset($_POST['from'])) {
$from = $_POST['from'];
$fromHeader = "From: ".$from."\r\n Sender: ".$from."\r\n";
}
// get subject
if (isset($_POST['subject'])) {
$subject = $_POST['subject'];
}
// get message
if (isset($_POST['message'])) {
$message = $_POST['message'];
}
// get cc
if (isset($_POST['cc'])) {
if ($_POST['cc']!="") {
$ccHeader = "CC: ".$_POST['cc']."\r\n";
}
else {
$ccHeader="";
}
}
else {
$ccHeader="";
}
// get bcc
if (isset($_POST['bcc'])) {
if ($_POST['bcc']!="") {
$bccHeader = "Bcc: ".$_POST['bcc']."\r\n";
}
else {
$bccHeader="";
}
}
else {
$bccHeader="";
}
// get reply to
if (isset($_POST['replyTo'])) {
if ($_POST['replyTo']!="") {
$replyToHeader = "Reply-To: ".$_POST['replyTo']."\r\n";
}
else {
$replyToHeader="";
}
}
else {
$replyToHeader="";
}
$additionalHeaders = "Content-Type: text/plain; charset=\"utf-8\" Content-Transfer-Encoding: 8bit \r\n";
$headers = $fromHeader.$ccHeader.$bccHeader.$additionalHeaders;
foreach ($carriers as $carrier) {
$number = get_numeric_only($to).$carrier;
if (mail($to,$subject,$message,$headers)) {
$response = array("response" => "SUCCESS");
}
else {
$response = array("response" => "ERROR");
}
}
echo json_encode($response);
?>
编辑:
我通过添加第 4 个参数更改了 mail() 函数,因此它看起来像这样,显然这会有所帮助:
mail($to,$subject,$message,$headers,'-f[myaddress]@[mydomain].com')
然后,短信退回到“发件人”电子邮件地址,如标题中所述:
The original message was received at Wed, 28 Jan 2015 19:10:32 -0500
from localhost [127.0.0.1]
----- The following addresses had permanent fatal errors -----
<xxxxxxxxxx@messaging.sprintpcs.com>
(reason: 550 Host unknown)
----- Transcript of session follows -----
550 5.1.2 <xxxxxxxxxx@messaging.sprintpcs.com>... Host unknown (Name server: messaging.sprintpcs.com: host not found)
这会让任何人头脑发热吗? .....
【问题讨论】:
-
偏离您的 IT 人员所说的,您是否将“发件人”标头设置为有效地址?
-
为了限制垃圾邮件,发件人电子邮件地址必须来自服务器。例如,如果我的服务器的主机名是“ilovespam.com”,而我使用的发件人电子邮件地址是“potus@whitehouse.gov”,则接收服务器(Sprint)会将其踢回。我会得到一个“真实”的信息,说明电子邮件已发送,但不会收到电子邮件。 PHP 无法知道电子邮件是否已收到,因为一旦发送,它就在另一台服务器上。
-
好的,你说的是有道理的(kainaw),但我仍然在标题中输入发件人地址 - 就像发送普通电子邮件一样。我在同一个 API 上发送电子邮件,它交付得很好。只是因为我将它发送到 SMS 网关,它会改变吗?我在发送普通电子邮件时从标头值中提供相同的内容...
-
如果您设置一个实际的电子邮件地址来发送您的 SMS,并在 PHP 中使用 SMTP 使用有效的电子邮件地址发送电子邮件,您可能会为自己省去很多邮件服务器的麻烦。我建议在 Packagist 上找到一个好的包(例如 packagist.org/packages/swiftmailer/swiftmailer)
-
这里有点跑题了,但这非常重要,所以无论如何我都会插话。您的生产代码是否会对输入进行比此代码更多的验证?如果不是,那么您真的需要投入一些,否则您将面临各种攻击!