diff --git a/README.md b/README.md
index d9563e6..c7c033e 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,12 @@
# About sms-handler
[sms-handler](https://philo.ydns.eu/code/Philome/sms-handler) is a simple companion service of the
-[SMS Forward](https://gitlab.com/pierreduchemin/smsforward) app to send notification mails on reception of SMSes.
+*SMS to URL Forwarder* app available on [F-Droid](https://f-droid.org/en/packages/tech.bogomolov.incomingsmsgateway/),
+to send notification mails on reception of SMSes.
Main audience: people who run a server on the public internet, configured with an email server
or configured as a relay.
-
## Installation
```sh
@@ -20,6 +20,12 @@ sudo apt install -y pipx
PIP_EXTRA_INDEX_URL=https://pypi.org/simple/ pipx install --index-url https://philo.ydns.eu/code/api/packages/Philome/pypi/simple/ sms-handler
```
+*sms-handler* can be run with any unprivileged user.
+However due to standard security schemes, opening a port in the range 1-1024
+is allowed to privileged users only (such as *root*).
+Use `sudo` to install as root if *sms-handler* is to be configured
+with a reserved port.
+
## Configuration
Configuration is done by environment variables, prefixed by `SMS_HANDLER_`:
@@ -29,12 +35,26 @@ Configuration is done by environment variables, prefixed by `SMS_HANDLER_`:
* `SMS_HANDLER_MAIL_SERVER`: address of the mail server (default: localhost)
* `SMS_HANDLER_MAIL_SERVER_PORT`: port of the mail server (default: 25)
* `SMS_HANDLER_MAIL_SERVER_START_TLS`: initiate mail server connection with TLS (default: no)
-* `SMS_HANDLER_MAIL_TEMLATE`: used to format the body of the mails
+* `SMS_HANDLER_MAIL_TEMPLATE`: used to format the body of the mails
* `SMS_HANDLER_MAIL_ENABLE`: no or false to disable mails (default: yes)
The default settings work with a mail server runs on the localhost,
and mails are sent to the user that owns the process.
+The `SMS_HANDLER_MAIL_TEMPLATE` variable is used with Python `str.format()`.
+The field names are the same as the default JSON setting in the *SMS to URL Forwarder* app.
+
+The default setting formats emails as below:
+
+```text
+{text}
+---
+From: {from} {fromName}
+Sent: {sentStamp:%c}
+Received: {receivedStamp:%c}
+Sim: {sim}
+```
+
### SMS handler app configuration
Set the *Webhook URL* with as `https://your.server.name:8025/sms-handle`.
@@ -78,19 +98,24 @@ WantedBy=default.target
## Run behind a reverse proxy
-*sms-handler* can run behind a reverse proxy (Nginx, Apache, etc)
-for HTTPs support. The URI (configured in the *SMS Forward* app) can be prefixed
+*sms-handler* can run behind a reverse proxy (Nginx, Apache, Lighttpd, HAProxy, Caddy, Traefik, etc),
+eg. for HTTPs support. The URI (configured in the *SMS to URL Forwarder* app) can be prefixed
to dispatch different applications on the same server.
-Example for [Caddy](https://caddyserver.com/):
+[Caddy](https://caddyserver.com/) is suggested as it is straightforward to set up, with this Caddyfile extract:
-```caddyfile
-handle /sms-handler/* {
+```text
+my.example.com {
+ handle /sms-handler/* {
uri strip_prefix /sms-handler
- reverse_proxy 192.168.100.2:8025
+ reverse_proxy 127.0.0.1:8025
+ }
}
```
+Replace the public host name `my.example.com` and
+the destination IP:port `127.0.0.1:8025` for your setup.
+
## Development and test
*sms-handler* is packaged with [uv](https://docs.astral.sh/uv/).
@@ -106,17 +131,24 @@ uv sync
pytest -s tests/basic.py
```
-The *sms-handler* source has a CI test workflow for [Forgejo](https://forgejo.org/).
+The *sms-handler* source includes a CI test workflow for [Forgejo](https://forgejo.org/).
+
+## Compatibility
+
+*sms-handler* is also compatible with
+[this fork of *SMS to URL Forwarder*](>https://github.com/scottmconway/android_income_sms_gateway_webhook)
+which includes also the sender's name.
## Alternatives
-For a more flexible way to use *SMS Forward*
-(available on [FDroid](https://f-droid.org/packages/com.pierreduchemin.smsforward/)),
-use the [ntfy](https://ntfy.sh/) pub/sub service. It makes it easy
-to integrate with other tools, for notification on various devices and automation.
+For a more flexible way to use a tool like *SMS to URL Forwarder*,
+a pub/sub service like [ntfy](https://ntfy.sh/) should be considered.
+It makes it easy to integrate with other components
+for notification on various devices and automation.
## License, etc
*sms-handler* is BSD licensed. Suggestions and contributions are welcome.
-
\ No newline at end of file
+
+
diff --git a/pyproject.toml b/pyproject.toml
index 4140298..afcf963 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "sms_handler"
-version = "0.0.2"
+version = "0.0.4"
#dynamic = ["version"]
description = "Listen to messages from the SMS Forwarder app on Android and send mail"
readme = "README.md"
diff --git a/src/sms_handler/server.py b/src/sms_handler/server.py
index a344ab2..484aaaf 100755
--- a/src/sms_handler/server.py
+++ b/src/sms_handler/server.py
@@ -31,7 +31,7 @@ class MailSettings(BaseSettings):
"""\
{text}
---
- From: {from}
+ From: {from} {fromName}
Sent: {sentStamp:%c}
Received: {receivedStamp:%c}
Sim: {sim}
@@ -45,7 +45,8 @@ class Settings(BaseSettings):
class SmsAlert(BaseModel):
- from_: str = Field(alias="from")
+ from_: str = Field(alias="from") # "from" is reserved word in Python, use an alias
+ fromName: str = ""
text: str
sentStamp: datetime
receivedStamp: datetime
@@ -61,7 +62,7 @@ def send_mail(smsAlert: SmsAlert):
msg["Subject"] = f"SMS from {smsAlert.from_}"
msg["From"] = settings.mail.sender
msg["To"] = settings.mail.to
- fmt = dict(smsAlert)
+ fmt = dict(smsAlert) # Make a dict for sms
fmt["from"] = fmt.pop("from_")
msg.set_content(settings.mail.template.format_map(fmt))
return send(
diff --git a/tests/basic.py b/tests/basic.py
index 4bd861b..a8fb4af 100644
--- a/tests/basic.py
+++ b/tests/basic.py
@@ -19,3 +19,20 @@ def test_handle_sms():
)
assert response.status_code == 200
assert response.json() == "OK"
+
+
+def test_handle_sms_with_fromName():
+ with TestClient(app) as client:
+ response = client.post(
+ "/handle-sms",
+ json={
+ "text": "Hello!",
+ "from": "12345678",
+ "fromName": "foobar",
+ "sentStamp": "1234",
+ "receivedStamp": "1235",
+ "sim": "2",
+ },
+ )
+ assert response.status_code == 200
+ assert response.json() == "OK"