1
0

sms.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <?php
  2. require_once 'sms.secrets';
  3. define('DEBUG', true);
  4. define('PARAMS', array('to', 'from', 'body', 'is_mms'));
  5. define('PARAMS_MMS', array('url', 'file_name', 'mime_type', 'file_size'));
  6. define('DEFAULT_NUM', '8002221222');
  7. debug_log('INIT');
  8. use PHPMailer\PHPMailer\PHPMailer;
  9. use PHPMailer\PHPMailer\Exception;
  10. require_once 'PHPMailer/src/Exception.php';
  11. require_once 'PHPMailer/src/PHPMailer.php';
  12. require_once 'PHPMailer/src/SMTP.php';
  13. debug_log('READ');
  14. $data = @file_get_contents('php://input');
  15. if (!$data) {
  16. fail('READ');
  17. }
  18. debug_log('JSON');
  19. $data = @json_decode($data);
  20. if (!$data || !is_object($data)) {
  21. fail('JSON');
  22. }
  23. debug_log('FIND');
  24. if (!property_exists($data, 'data') || !is_object($data->{'data'}) ||
  25. !property_exists($data->{'data'}, 'attributes') ||
  26. !is_object($data->{'data'}->{'attributes'})
  27. ) {
  28. fail('FIND');
  29. }
  30. $msg = $data->{'data'}->{'attributes'};
  31. debug_log('PARSE');
  32. foreach (PARAMS as $param) {
  33. if (!property_exists($msg, $param)) {
  34. fail('PARSE: ' . $param);
  35. }
  36. }
  37. $sms = array();
  38. foreach (PARAMS as $param) {
  39. $sms[$param] = $msg->{$param};
  40. }
  41. unset($msg);
  42. if ($sms['is_mms']) {
  43. debug_log('FIND_MMS');
  44. if (!property_exists($data, 'included') || !is_array($data->{'included'})) {
  45. fail('FIND_MMS');
  46. }
  47. $msg = $data->{'included'};
  48. foreach ($msg as $part) {
  49. if (!property_exists($part, 'attributes') || !is_object($part->{'attributes'})) {
  50. fail('FIND_MMS_PART');
  51. }
  52. $part = $part->{'attributes'};
  53. debug_log('PARSE_MMS');
  54. foreach (PARAMS_MMS as $param) {
  55. if (!property_exists($part, $param)) {
  56. fail('PARSE_MMS: ' . $param);
  57. }
  58. }
  59. $media = array();
  60. foreach (PARAMS_MMS as $param) {
  61. $media[$param] = $part->{$param};
  62. }
  63. $sms['media'][] = $media;
  64. unset($msg);
  65. }
  66. }
  67. debug_log('CLEANUP');
  68. if (preg_match('/\d*(\d{10})\D*$/', $sms['from'], $matches)) {
  69. $sms['from'] = $matches[1];
  70. } else {
  71. $sms['from'] = DEFAULT_NUM;
  72. }
  73. if (preg_match('/\d*(\d{10})\D*$/', $sms['to'], $matches)) {
  74. $sms['to'] = $matches[1];
  75. } else {
  76. $sms['to'] = DEFAULT_NUM;
  77. }
  78. unset($matches);
  79. debug_log('MAIL');
  80. $mail = new PHPMailer();
  81. if (DEBUG) {
  82. $mail->SMTPDebug = 2;
  83. }
  84. $mail->setFrom($sms['from'] . '@' . FROM_DOMAIN, 'SMS ' . $sms['from']);
  85. $mail->addAddress(TO_ADDR, TO_NAME);
  86. $mail->Subject = 'SMS Message ' . $sms['to'] . ' => ' . $sms['from'];
  87. $mail->Body = $sms['body'];
  88. foreach ($sms['media'] as $file) {
  89. $mail->Body .= "\n\n" . $file['file_name'] . '(' . $file['mime_type'] . '): ' . $file['url'] . "\n";
  90. }
  91. if (!$mail->send()) {
  92. debug_log('Mail error: ' . $mail->ErrorInfo);
  93. fail('MAIL');
  94. }
  95. unset($mail);
  96. if (DEBUG) {
  97. debug_log('DEBUG');
  98. debug_log(print_r($sms, true));
  99. $file = @tempnam('/var/tmp', 'sms.');
  100. if (!$file) {
  101. fail('STORE_INIT');
  102. }
  103. debug_log('File: ' . $file);
  104. if (!@file_put_contents($file . '.raw', print_r($data, true))) {
  105. fail('STORE_RAW');
  106. }
  107. if (!@file_put_contents($file, print_r($sms, true))) {
  108. fail('STORE_PARSED');
  109. }
  110. }
  111. function fail($msg = 'Unknown error', $code = 500) {
  112. http_response_code($code);
  113. echo 'Unable to process request: ' . $msg . "\n";
  114. exit(0);
  115. }
  116. function debug_log($msg) {
  117. if (! DEBUG) {
  118. return;
  119. }
  120. echo $msg . "\n";
  121. }
  122. ?>