如何通过php的邮件功能()发送短信?

时间:2015-01-28 14:56:56

标签: php email smtp sms

我最近建立了一个警报系统,当调用某些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)

这会让任何人慢慢抬头吗? .....

6 个答案:

答案 0 :(得分:2)

确定首先,您允许随机的陌生人(提交POST请求)通过访问$ _POST ['from']并将其用作FROM地址来设置电子邮件的FROM地址。如果(正如其他人所建议的那样)根据您的邮件服务器设置一个不是有效发件人地址的FROM地址,并且根据您正在使用的任何上游邮件服务器,这将不起作用。因此,例如,在我自己的网络中,我可以发送电子邮件“From:me@mydomain.com”,但如果我发送的内容是“From:you@fakedomain.com”,那么它可能会反弹或被抛弃。因此,您可能需要硬编码从发件人地址到您的IT人员所说的内容,而不是使用$ _POST变量。

您的电子邮件实际上是“来自:www.data@servername”,这可能意味着以下几点:

  • 您的PHP已配置为mail()函数调用大多数Unix / Linux系统上安装的标准sendmail命令。
  • 运行PHP进程的Apache服务器作为该系统上的“www.data”用户运行。
  • 该系统上的“www-data”用户无权设置备用FROM地址,因此无论您说什么,sendmail都会强制FROM地址为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

Fido:[10位数电话号码] @ fido.ca

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客户端来解决此问题。