Vcard + Sms + Lotusscript

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#1
Всем привет!
Вопрос наверное не совсем по теме.... но все же..
Кто-то пробовал формировать vCard для отправки на мобильник через СМС.
СМС - посылка письма почтой на определенный адрес средствами Lotus.
СМС в принципе доставляются... интересует доставка vCard.
Есть какой-нибудь универсальный формат vCard, понятный для большинства телефонов?
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#2
чтож тут сложного то?
обычный текст
Код:
BEGIN:VCARD
VERSION:3.0
FN:к.м.н., пр. Василий Иванович Пупкин
N:Пупкин;Василий;Иванович;пр.,к.м.н.
ORG:Рога и Копыта
URL:http://ru.wikipedia.org/
EMAIL;TYPE=INTERNET:vasya.pupkin@example.com
END:VCARD
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#3
чтож тут сложного то?
обычный текст
Код:
BEGIN:VCARD
VERSION:3.0
FN:к.м.н., пр. Василий Иванович Пупкин
N:Пупкин;Василий;Иванович;пр.,к.м.н.
ORG:Рога и Копыта
URL:http://ru.wikipedia.org/
EMAIL;TYPE=INTERNET:vasya.pupkin@example.com
END:VCARD
Да в том-то и дело что не совсем обычный.
Пробовал я это... приходит обычное текстовое СМС.
А хочется полноценное сообщение, с возможностью сохранения карточки.
Думаю кроме тела СМС надо еще что-то указывать... возможно в теме письма
 

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#4
скинь со своего телефона контакт на емейл и глянь что пришло
может это файл .vcf а может это сообщенение в MIME
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#5
ну скорее всего придет вложение. Но не уверен что в СМС это сработает :(

Добавлено: проверил... Да.... с мобильного отсылается файл.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#8
Не уверен что решено правильно, но у меня работает :)
Формируется vCard как указывали выше.
Затем сообщение кодируется в HEX и отправляется. HEX длинной 4 символа. В начало дописывается недостающее кол-во "0"
Ну и собственно отправляется.
Протестировал на HTC - карточка принимается нормально.
Думаю на всех смартах будет работать.
На обычных телефонах - не получается :(
 

morpheus

скриптописец
07.08.2006
3 915
1
#9
Не уверен что решено правильно, но у меня работает
Формируется vCard как указывали выше.
Затем сообщение кодируется в HEX и отправляется. HEX длинной 4 символа. В начало дописывается недостающее кол-во "0"
Ну и собственно отправляется.
Протестировал на HTC - карточка принимается нормально.
Думаю на всех смартах будет работать.
На обычных телефонах - не получается
Пример можете привести - если не секрет
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#10
Пример можете привести - если не секрет
"причесанного" кода нет.. так.. наброски

Код:
	txt = _
{BEGIN:VCARD} + Chr(13) + Chr(10) +_
{VERSION:2.1} + Chr(13) + Chr(10) +_
{FN:J. Doe} + Chr(13) + Chr(10) +_
{N:Doe; J;;;} + Chr(13) + Chr(10) +_
{TEL;CELL;WORK:+440444555666} + Chr(13) + Chr(10) +_
{ORG:Рога и копыта} + Chr(13) + Chr(10) +_
{END:VCARD}


'	дополняем пробелами до кратности 60. 
'	чтоб получить максимальное количество пачек
While (Len(txt) Mod 60 ) <> 0
txt = txt & " "	
Wend

' подготавливаем пачки
ReDim rez( ( Len(txt) / 60 ) - 1 )	

'	заполняем пачки
For i = 0 To UBound(rez)

s = ""
tmp = FullTrim( Mid( txt, (60*i + 1), 60 ) )

' Конвертируем текст посылки в HEX
For j =1 To Len( tmp )

h = Mid$(tmp, j, 1)
h = Hex$( Uni( h ) )
h = Right$("0000" & h , 4)
s = s & h

Next

s = <идентификатор пачки> & <количество сообщений в пачке> & <номер сообщения в пачке> & s

rez( i ) = s

Next
<идентификатор пачки>, <количество сообщений в пачке> , <номер сообщения в пачке> - формат этих параметров нужно узнавать у мобильного оператора
Длинна 60 символов - вычислял опытным путем
Если в карточке не планируется русских символов - думаю переводить в HEX не обязательно

Теперь собственно отсылка.
Все пачки сообщений отсылаются как обычные письма.
Код:
	Set docSMS = db.Createdocument()

Call docSMS.Replaceitemvalue("Form", "Memo" )
Call docSMS.ReplaceItemValue( "From", Principal )
Call docSMS.ReplaceItemValue( "Principal", Principal )	
Call docSMS.ReplaceItemValue( "InetFrom", Principal )
Call docSMS.ReplaceItemValue( "SMTPOriginator", Principal )

docSMS.SendTo = ArrayAppend(docSMS.SendTo, <адресаты> )

Call docSMS.ReplaceItemValue( "Subject", "SMS:VCARD" )

' ТУТ код формирования посылок. Результат в tmp
Set rt = docSMS.Createrichtextitem("body")

For i = 0 To UBound(tmp)

rt.Values = 	tmp(i)

Call docSMS.Send(False)

Next
Principal - это псевдоним либо номер, короткий номер который увидит адресат.
<адресат> - <полный номер телефона>@<шлюз мобильного оператора>

Ну вот как-то так
 

hosm

* so what *
18.05.2009
2 442
6
#13
возможно, в связи с наличием function Space проще подсчитать кол-во необходимых пробелов, а не вычислять в цикле остаток от деления на 60.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#14
возможно, в связи с наличием function Space проще подсчитать кол-во необходимых пробелов, а не вычислять в цикле остаток от деления на 60.
Это конечно хорошая функция, но не известно сколько надо добавить пробелов.
Длинна сообщения может быть 30 символов, 10, 50, 110 и т.д.
Конечно можно заложиться на символов 500, но зачем?
А так я точно знаю сколько пачек получу и не важно сколько символов на входе. Лишнего не будет точно.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#16
Имеется ввиду, что проще
Код:
txt = txt & Space(Len(txt) Mod 60)
:) я тоже так думал, но это не правильно

Потому как при 50 символах получается клеить будем 84, а надо 10

Правильно так:
Код:
txt = txt & Space( Fix( (100 - (Len(txt) Mod 60) ) * (60/100) ) )
Ну это так.. на вскидку... и как по мне - не очень читабельно
 

nvyush

Lotus team
22.04.2009
2 317
0
#19
Ну, не знаю. У меня такой агент выводит 10
Код:
Sub Initialize
MsgBox CStr(60 - 50 Mod 60)
End Sub
Добавлено
Результат операции A Mod B по определению не должен превышать B.
Чтобы не добавлять 60 пробелов можно так:
Код:
rest = Len(txt) Mod 60
If rest > 0 Then txt = txt & Space(60 - rest)
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#20
Ну, не знаю. У меня такой агент выводит 10
Код:
Sub Initialize
MsgBox CStr(60 - 50 Mod 60)
End Sub
Да... что-то я тупонул.
Ну в общем если уж на то пошло - то можно написать так... чтоб всем нравилось
Это
Код:
	While (Len(txt) Mod 60 ) <> 0
txt = txt & " "	
Wend

' подготавливаем пачки
ReDim rez( ( Len(txt) / 60 ) - 1 )
заменить на это
Код:
txt = txt & Space(60)
ReDim rez( ( Len(txt) \ 60 ) + 1 )
А вообще - я сразу написал, что "причесанного" кода нет.. так.. наброски
Не нравится - не пользуйтесь