我最近建立了一个警报系统,当调用某些API时,它会通过PHP的mail()函数提醒我(或其他人)。
在电子邮件上它完全正常。该函数返回true,并在发送它的邮箱中收到。
由于某种原因,当发送到SMS网关(即XXXXXXXXXX@messaging.sprint.com)时,该函数发送它(它确实返回true)但是它永远不会在另一端收到。
如果我使用同一个确切的电子邮件地址(发送到短信网关)并通过电子邮件客户端(例如zimbra或其他)发送,它会通过罚款并由该人接收。
我是网页设计师,而不是电子邮件/ IT人员。我假设它与标题或某些东西有关,但是我不熟悉这个技术主题。
我和我的IT人员谈过,他说这是错误的,看起来标题中没有正确的“发件人”地址。电子邮件错误看起来像是来自“www.data @ [server-name]”而不是我通过标题发送的有效电子邮件地址,而不是来自有效的电子邮件地址。
这是我的代码片段:
<?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)
这会让任何人慢慢抬头吗? .....
答案 0 :(得分:2)
确定首先,您允许随机的陌生人(提交POST请求)通过访问$ _POST ['from']并将其用作FROM地址来设置电子邮件的FROM地址。如果(正如其他人所建议的那样)根据您的邮件服务器设置一个不是有效发件人地址的FROM地址,并且根据您正在使用的任何上游邮件服务器,这将不起作用。因此,例如,在我自己的网络中,我可以发送电子邮件“From:me@mydomain.com”,但如果我发送的内容是“From:you@fakedomain.com”,那么它可能会反弹或被抛弃。因此,您可能需要硬编码从发件人地址到您的IT人员所说的内容,而不是使用$ _POST变量。
您的电子邮件实际上是“来自:www.data@servername”,这可能意味着以下几点:
您的系统管理员需要告诉您硬编码的地址是该系统上的FROM地址。此外,他或她需要配置邮件系统以允许www.data设置自己的FROM地址。假设您使用的是实际的真实sendmail(而不是其他配置为sendmail的工作,例如postfix),那么可以通过在文件/ etc / mail / trusted-users中添加一行“www.data”来完成。在该系统上设置的任何信任文件。解决这个问题的方法是找到系统中正在使用的sendmail.cf文件,并查找以“Ft”开头的行,例如
英尺的/ etc /邮件/可信用户
可以在sendmail文档中找到更多信息,例如在安装了sendmail-cf软件包的Red Hat / CentOS系统上,该系统上将有一个/ usr / share / sendmail-cf / README文件,其中包含有关可信用户的有用信息。
答案 1 :(得分:2)
首先,我强烈建议您阅读limitations on email-to-SMS。这是一个较旧的线程,但我没有理由相信现在的限制更好。请记住,短信对某些用户不是免费的,因此运营商有动机限制你可以做的事情。
其次,您的电子邮件的相关数据将位于邮件服务器日志中。太多人认为因为mail()
返回true,所以发送了电子邮件。所有mail()
都可以告诉您sendmail(或您使用的任何MTA)是否响应。如果您查看邮件日志(通常在大多数Linux发行版的/var/log/maillog
中)并查找您发送到的地址,您将看到sendmail是否实际上成功发送了电子邮件,或者收件人服务器是否拒绝了该邮件。基于我的第一点,我愿意打赌你以某种方式过滤了。如果您没有格式正确的地址,您的服务器将使用 username @ server-hostname ,它往往看起来像apache@23247244efg.myhostingcomapny.com
(主要YMMV,因为一些虚拟服务器甚至没有有一个FQDN)
第三,您应该考虑使用SMS服务。例如,亚马逊有SNS service,您可以按使用付费(还有其他月费等服务)。这里的优势很明显,因为你正在使用一些旨在通过短信推送通知的东西,而不是一种实现同样功能的弱(并且可能已弃用)方法。而且,通过这种方式,您无需处理任何令您头疼的问题,即确保您的电子邮件已经过格式化,以便运营商接受。
答案 2 :(得分:1)
如果您知道电话号码的提供者,您可以使用大多数公司的电子邮件短信服务。
例如:
Rogers Wireless:[10位电话号码] @ pcs.rogers.com
Telus:[10位电话号码] @ msg.telus.com
Bell Mobility:[10位电话号码] @txt.bell.ca
Kudo Mobile:[10位数电话号码] @ msg.koodomobile.com
MTS:[10位数电话号码] @ text.mtsmobility.com
总统选择:[10位数电话号码] @txt.bell.ca
Sasktel:[10位电话号码] @sms.sasktel.com
Solo:[10位数电话号码] @txt.bell.ca
处女:[10位电话号码] @ vmobile.ca
干杯
答案 3 :(得分:0)
有两种解决方案(我知道):
SMS网关提供商或使用GSM调制解调器。
对于第一个,它是最简单的一个,你必须使用你的提供者的API。它也可以通过SMTP。 该过程取决于提供商。通常,您必须提供一些额外的标题。
使用GSM调制解调器(我已经尝试过),你必须向你的调制解调器发出一些命令,这不是那么困难,但调制解调器大概是350美元
答案 4 :(得分:0)
首先,检查您的服务器IP是否在任何黑名单上。如果是这样,请尝试从中删除。其次,使用有效的发件人地址来表明它来自您的服务器,不要欺骗。当我这样做时,我从服务器发送电子邮件没有问题。
(请注意,最终用户可能需要为这些邮件付费,收件人可能需要启用此功能)
答案 5 :(得分:0)
问题很可能是由sprintpcs DNS records are broken引起的。这可能是故意阻止人们滥用他们的服务。您可以通过使用直接连接到非授权地址的SMTP客户端来解决此问题。