Недавно я установил систему оповещения, при которой при вызове определенных API он уведомляет меня (или других) через функцию mail () PHP.
По электронной почте это работает совершенно нормально. Функция возвращает истину, и она получена в почтовом ящике, куда она отправлена.
По какой-то причине при отправке на SMS-шлюз (например, [email protected]) функция отправляет его (возвращает true), однако на другом конце она никогда не будет получена.
Если я беру тот же самый точный адрес электронной почты (который идет к шлюзу sms) и отправляю его через почтовый клиент (такой как zimbra или любой другой), он проходит хорошо, и он получен человеком.
Я веб-дизайнер, а не специалист по электронной почте / 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);
?>
редактировать:
Я изменил функцию mail (), добавив 4-й параметр, чтобы он выглядел примерно так, как это может помочь:
mail($to,$subject,$message,$headers,'-f[myaddress]@[mydomain].com')
Затем sms-письмо перешло BACK на адрес электронной почты «from», как указано в заголовках со следующим:
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 -----
<[email protected]>
(reason: 550 Host unknown)
----- Transcript of session follows -----
550 5.1.2 <[email protected]>... Host unknown (Name server: messaging.sprintpcs.com: host not found)
Это пробуждает чью-либо голову? …..
Хорошо, во-первых, вы позволяете случайному незнакомцу (который отправляет запрос POST) установить адрес FROM почтового сообщения, открыв $ _POST [‘from’] и используя его в качестве адреса FROM. Это не сработает, если (как другие предлагали) вы устанавливаете адрес FROM, который не является действительным адресом отправителя, в соответствии с вашим почтовым сервером — и в зависимости от того, какой почтовый сервер вы используете. Так, например, в моей собственной сети я могу отправить электронное письмо «From: [email protected]», но если я отправлю что-то с адресом «From: [email protected]», то оно, вероятно, будет отказано или выброшено. Поэтому вам, вероятно, нужно жестко запрограммировать адрес From, что бы ни говорили ваши ИТ-парни, а не использовать переменную $ _POST.
Тот факт, что ваша электронная почта на самом деле выглядит как «From: www.data@servername», вероятно, означает несколько вещей:
Ваш системный администратор должен сообщить вам, какой адрес для жесткого кода является адресом FROM в этой системе. Кроме того, ему или ей необходимо настроить почтовую систему, чтобы www.data мог установить свой собственный адрес FROM. Предполагая, что вы используете реальный настоящий sendmail (а не что-то еще, настроенное для работы наподобие sendmail, например postfix), тогда это можно сделать, добавив строку «www.data» в файл / etc / mail / trust-users или любой доверительный файл установлен в этой системе. Ключом к этому является поиск файла sendmail.cf, используемого в системе, и поиск строки, начинающейся с «Ft», например,
Ft / и т.д. / почта / доверенные пользователи
Дополнительную информацию можно найти в документах sendmail, например, в системе Red Hat / CentOS с установленным пакетом sendmail-cf в этой системе будет файл / usr / share / sendmail-cf / README с полезной информацией о доверенных пользователях.
Во-первых, я настоятельно рекомендую вам прочитать на ограничения на электронную почту в SMS. Это старая ветка, но у меня нет оснований полагать, что ограничения сейчас лучше. Помните, что SMS не является бесплатным для некоторых пользователей, поэтому у операторов есть стимул ограничивать то, что вы можете делать.
Во-вторых, соответствующие данные для вашей электронной почты будут в вашем логи почтового сервера. Слишком много людей думают, что потому что mail()
вернул истину, что письмо было отправлено. Все mail()
можно сказать, ответил ли sendmail (или любой другой используемый вами MTA). Если вы проверить почтовый журнал (как правило, в /var/log/maillog
для большинства дистрибутивов Linux) и посмотрите адрес, который вы отправили, вы увидите, действительно ли sendmail успешно отправил электронное письмо или сервер-получатель отклонил его. Исходя из моего первого пункта, я готов поспорить, что вас каким-то образом отфильтровали. Если у вас нет правильно отформатированного адреса, ваш сервер будет использовать имя пользователя @ имя-хоста сервера который имеет тенденцию выглядеть [email protected]
(основной YMMV, так как некоторые вирт-серверы даже не имеют полного доменного имени)
В-третьих, вы должны рассмотреть услугу SMS. Amazon, например, имеет свои Служба SNS, где вы платите за использование (есть другие услуги с ежемесячной платой и т. д.). Преимущество здесь очевидно, потому что вы используете что-то, предназначенное для отправки уведомлений через SMS, вместо слабого (и, вероятно, устаревшего) метода достижения того же самого. И, таким образом, вам не нужно иметь дело с какими-либо головными болями, чтобы убедиться, что ваша электронная почта отформатирована, чтобы операторы ее приняли.
Если вы знаете поставщика телефонного номера, вы можете использовать электронную почту для службы смс большинством компаний.
Пример:
Rogers Wireless: [10-значный номер телефона] @ pcs.rogers.com
Фидо: [10-значный номер телефона] @ fido.ca
Telus: [10-значный номер телефона] @ msg.telus.com
Bell Mobility: [10-значный номер телефона] @ txt.bell.ca
Kudo Mobile: [10-значный номер телефона] @ msg.koodomobile.com
МТС: [10-значный номер телефона] @ text.mtsmobility.com
Выбор президента: [10-значный номер телефона] @ txt.bell.ca
Sasktel: [10-значный номер телефона] @ sms.sasktel.com
Соло: [10-значный номер телефона] @ txt.bell.ca
Virgin: [10-значный номер телефона] @ vmobile.ca
ура
Есть 2 решения (которые я знаю):
Поставщик SMS-шлюза или Использование модема GSM.
Во-первых, это самый простой, вы должны использовать API вашего провайдера. Это также может быть через SMTP.
Процесс зависит от провайдера. Часто вы должны предоставить несколько дополнительных заголовков.
Используя GSM-модем (я уже пробовал), вам нужно запустить несколько команд для вашего модема, это не так сложно, но модем стоит около 350 $.
Во-первых, проверьте, есть ли ip вашего сервера в чёрных списках. Если так, попытайтесь удалиться от них. Во-вторых, используйте действительный адрес отправителя, который указывает, что он поступает с вашего сервера, не обманывайте. Когда я это сделал, у меня не было проблем с отправкой электронной почты с моего сервера.
(обратите внимание, что за эти сообщения может взиматься плата с конечного пользователя, а получателю может потребоваться включить эту функцию)
Проблема, скорее всего, связана с тем, что DNS-записи не работают. Это может быть преднамеренным, чтобы люди не злоупотребляли своим обслуживанием. Вы можете обойти это, используя SMTP-клиент, подключающийся напрямую к неавторизованному адресу.