велосипедик для отправки смс через mrim-траспорт
интерес может представлять первая функция (первый «#'jabber-process-data» -> nil для подавления вывода, и прикрутить обработку сообщений от mrim.jabber.ru) остальные приблуды для интерактивного использования
можно прикрутить балансировку на несколько аккаунтов (вроде для mrim лимит порядка 5)
(defun jabber-send-sms (tel text)
(jabber-send-iq (jabber-read-account)
"support%corp.mail.ru@mrim.jabber.ru"
"set"
`(command ((xmlns . "http://jabber.org/protocol/commands")
(node . "send_sms")
(action . "complete"))
(x ((xmlns . "jabber:x:data")
(type . "submit"))
(field ((var . "translit"))
(value nil "0"))
(field ((var . "text"))
(value nil ,text))
(field ((var . "number"))
(value nil ,tel))))
#'jabber-process-data #'jabber-ahc-display
#'jabber-process-data "Command execution failed"))
;; optional stuff
(defun read-telephone-at-point ()
"Try to read telephone number at cursor position:
consume '+', '0-9' and possible delimeters ' ', '.', '-'
delete delimeters and replace leading '8' by '+7'"
((lambda (arg) (if (= 12 (length arg)) arg "+79XXXXXXXXX"))
(replace-regexp-in-string "^8" "+7" (replace-regexp-in-string "[ .-]" ""
(buffer-substring
(save-excursion (skip-chars-backward "+0-9 .-") (point))
(save-excursion (skip-chars-forward "+0-9 .-") (point)))))))
(defun shortened-text-repr (text)
"Represent given text (passed by string) in short form:
get first line and replace long result by dots"
(replace-regexp-in-string "\\(.\\{16\\}\\).*" "\\1..."
(car (split-string text "\n"))))
(defun jabber-send-sms-interactive ()
(interactive)
"Read telephone number and text, taking default from kill ring."
(let ((tel-at-point (read-telephone-at-point)) (text (car kill-ring)))
;; (jabber-send-sms
(jabber-send-sms
(read-string (concat "enter telephone number: "
(when tel-at-point
(format "(default %s) " tel-at-point)))
nil nil tel-at-point)
(read-string (concat "enter text message: "
(unless (null text)
(format "(default `%s') "
(shortened-text-repr text))))
nil nil text))))