Письмо в формате RTF

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

#1
Помогите решить следующую задачу. Есть форма в которой есть поле Body с типом RichText. Как сделать так, что бы при нажатии на кнупку, отправлялось письмо и при этом сохранилось форматирование?
 
B

Breef

#2
<!--QuoteBegin-Guest+26:03:2005, 20:28 -->
<span class="vbquote">(Guest @ 26:03:2005, 20:28 )</span><!--QuoteEBegin-->Помогите решить следующую задачу. Есть форма в которой есть поле Body с типом RichText. Как сделать так, что бы при нажатии на кнупку, отправлялось письмо и при этом сохранилось форматирование?[/quote]
Создаем документ, создаем в нем поле типа RichText, копируем в него содержимое из нужного нам документа (или просто копируем Item), отправляем новый документ через doc.Send. Форматирование, по идее, сохранится... или я не прав?
 
G

Guest

#3
<!--QuoteBegin-Breef+28:03:2005, 12:22 -->
<span class="vbquote">(Breef @ 28:03:2005, 12:22 )</span><!--QuoteEBegin-->Создаем документ, создаем в нем поле типа RichText, копируем в него содержимое из нужного нам документа (или просто копируем Item), отправляем новый документ через doc.Send. Форматирование, по идее, сохранится... или я не прав?[/quote]
Я так и делал, но к сожалению текст не получается форматированным. Когда программно делаю форматирование (rtitem.Bold например) то все нормально, при doc.Send письмо отправлятся с выделениями. А вот когда из поля RichText береш текст, то он преобразовывается к PlainText. Может я что то не так делаю? Может кто нибудь проверенный кусочек кода выложить? Заранее благодарен.
 
B

Breef

#4
<!--QuoteBegin-Guest+28:03:2005, 13:15 -->
<span class="vbquote">(Guest @ 28:03:2005, 13:15 )</span><!--QuoteEBegin-->Я так и делал, но к сожалению текст не получается форматированным. Когда программно делаю форматирование (rtitem.Bold например) то все нормально, при doc.Send письмо отправлятся с выделениями. А вот когда из поля RichText береш текст, то он преобразовывается к PlainText. Может я что то не так делаю? Может кто нибудь проверенный кусочек кода выложить? Заранее благодарен.[/quote]
Выложи, пожалуй, кусочек, в котором ты работаешь с этими полями.
 
G

Guest

#5
<!--QuoteBegin-Breef+28:03:2005, 14:02 -->
<span class="vbquote">(Breef @ 28:03:2005, 14:02 )</span><!--QuoteEBegin-->Выложи, пожалуй, кусочек, в котором ты работаешь с этими полями.[/quote]
Вот собственно кусочек моего кода. (Скажу сразу в лотусе я начинаю только програмить так что выслушаю все ваши конструктивные замечания и пожелания)

Код:
Sub Click(Source As Button)
Dim s As New NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim workspace As New NotesUIWorkspace
Dim rtitem As NotesRichTextItem
Dim richStyle As NotesRichTextStyle

Set wsdoc = workspace.CurrentDocument
Set db = s.CurrentDatabase
Set doc = New NotesDocument (db)
Set rtitem = New NotesRichTextItem( doc, "Body" )
Set richStyle = s.CreateRichTextStyle	
mailbody = wsdoc.FieldGetText("mailbody")
subject = wsdoc.FieldGetText("Subject")
privetstvie=wsdoc.FieldGetText("privetstvie")+" "
richStyle.Italic = True
richStyle.bold = True
Call rtitem.AppendStyle(richStyle)
Call rtitem.AppendText(privetstvie)
Call rtitem.AppendText(entry.ColumnValues(1)	)
richStyle.Italic = False
richStyle.bold = False
Call rtitem.AddNewline(2)
Call rtitem.AppendStyle(richStyle)
Call rtitem.AppendText(mailbody)
doc.Subject = subject
Call doc.Send(False)

End Sub
 
B

Breef

#6
Для начала можно попробовать просто сохранить документ перед отправкой.
Если не поможет (увы, сейчас проверить не могу у себя), подумаем еще.
Еще один вариант -- создавать это поле в другом документе, а потом просто копировать его как item, хотя, это немного для другой задачи используется.
 
B

Breef

#7
Для начала можно попробовать просто сохранить документ перед отправкой.
Если не поможет (увы, сейчас проверить не могу у себя), подумаем еще.
Еще один вариант -- создавать это поле в другом документе, а потом просто копировать его как item, хотя, это немного для другой задачи используется.
 
G

Guest

#9
<!--QuoteBegin-Medevic+28:03:2005, 16:02 -->
<span class="vbquote">(Medevic @ 28:03:2005, 16:02 )</span><!--QuoteEBegin-->Вот это поясни. Как и куда берется ?[/quote]
Объясняю подробней. В форме есть поле "mailbody" с типом RichText есть кнопка действия при нажатии на которую выполняется код который я привел выше (часть кода, коечто удалил что бы выделить главное). В этом поле пишу текст с форматированием документ не сохраняю (щас попробую что будет если сохранить) перед обработкой и делаю вот так (это уже приводил)
Код:
Set rtitem = New NotesRichTextItem( doc, "Body")
Set richStyle = s.CreateRichTextStyle
mailbody = wsdoc.FieldGetText("mailbody")
Call rtitem.AppendStyle(richStyle)
Call rtitem.AppendText(mailbody)
Call doc.Send(False)
По поводу преобразовывания текста, то когда после обработки этого кода читаешь отправленное письмо, то текст там без форматирования и более того удаляется все переходы на новую строку, т.е. текст идет сплошной строкой.
 
B

Breef

#10
<!--QuoteBegin-Guest+28:03:2005, 16:22 -->
<span class="vbquote">(Guest @ 28:03:2005, 16:22 )</span><!--QuoteEBegin-->Объясняю подробней. В форме есть поле "mailbody" с типом RichText есть кнопка действия при нажатии на[/quote]
Ясно.. Мне показалось, что mailBody -- обычное текстовое поле.
Тогда, конечно, нельзя брать просто текст... Надо копированием item'ов заниматься... Иначе, никакое форматирование не сохранится.
 
G

Guest

#11
<!--QuoteBegin-Breef+28:03:2005, 16:26 -->
<span class="vbquote">(Breef @ 28:03:2005, 16:26 )</span><!--QuoteEBegin-->Надо копированием item'ов заниматься...[/quote]
Поподробнее в этом месте плиззз.
 
B

Breef

#12
Есть у тебя NotesRichTextItem. Ты Туда текст запихал, форматнул что и как надо, а потом копируешь этот item в новый документ (чую, где-то в процессе надо сохраняться) и потом его отсылаешь спокойно. Зачем выдирать из ричтекста голый текст и форматировать его заново?
 
G

Guest

#13
<!--QuoteBegin-Breef+28:03:2005, 16:57 -->
<span class="vbquote">(Breef @ 28:03:2005, 16:57 )</span><!--QuoteEBegin-->Есть у тебя NotesRichTextItem. Ты Туда текст запихал, форматнул что и как надо, а потом копируешь этот item в новый документ (чую, где-то в процессе надо сохраняться) и потом его отсылаешь спокойно. Зачем выдирать из ричтекста голый текст и форматировать его заново?[/quote]
Всеравно не понимаю. Если я в поле с типом RichText делаю красивый форматированный текс, мне что просто так его с сохранение форматирования скопировать кудато не получится? А как мне потом программно это форматирование все сделать??? Голый текст я не выдираю, он сам потом таким становится:(
 
B

Breef

#14
еще раз: формируешь исходное форматированное ричтекст поле. После чего берешь его как Item, копируешь в новый документ (котрый отсылать собираешься), добавляешь, если надо, что-то от себя, сохраняешь этот документ и отправляешь.
FieldGetText method: In a document in read or Edit mode, returns the contents of a field you specify, as a string.
String, как известно, форматирования иметь не может.
 

Andre

Well-known member
29.07.2004
108
0
#15
Посмотри ка метод AppendRTItem - думаю что он тебе поможет
В сохранении нет необходимости, если тебе не нужен сам документ содержащий mailBody
 
G

Guest

#16
Вот вобщем что у меня получилось. Письмо с форматирование получается уже делать:( Возник новый вопрос. Собственно зачем я это делаю. Есть база клиентов. В карточке клиента присутствует его имя и имейл. Необходимо отправлять именные письма. Делаю представление ("Почта") где в одной колонке у меня имена, а во второй адреса. Делаю фоорму с 2мя полями body и body1 и типом richtext. поле body предназначено для именного приветствия (например, Уважаемыей Петр Петрович), а воле body1 -- для тела письма. Как мне циклически сделать подстановку имен? Подправте мой код если не сложно плиззз:(

Код:
Dim w As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim s As New NotesSession
Dim db As NotesDatabase 
Dim rtitemA As Variant
Dim rtitemB As Variant
Dim view As NotesView	
Dim i As Integer	
Dim nav As NotesViewNavigator
Dim entry As NotesViewEntry
Dim rtitem As NotesRichTextItem
Dim richStyle As NotesRichTextStyle
'---------------------------------------------------------------------------------------------------------
Set uidoc = w.CurrentDocument
Set doc = uidoc.Document
Call uidoc.Save
Set rtitemA = doc.GetFirstItem( "body" )
Set rtitemB = doc.GetFirstItem( "body1" )
Set rtitem = New NotesRichTextItem(doc, "tmp")
Set richStyle = s.CreateRichTextStyle	
Set db = s.CurrentDatabase	
Set view = db.GetView("Почта")
Set nav = view.CreateViewNav()
Set entry = nav.GetFirst
richStyle.Italic = True
richStyle.bold = True
Call rtitem.AppendStyle(richStyle)
Call rtitem.AppendText(" ")
Call rtitem.AppendText(entry.ColumnValues(1))
richStyle.Italic = False
richStyle.bold = False
'----------------------------------------------------------------------------------------------------------
If ( rtitemA.Type = RICHTEXT And rtitemB.Type = RICHTEXT ) Then
Call rtitemA.AppendRTitem(rtitem) 
Call rtitemA.AddNewLine(1)
Call rtitemA.AppendRTItem( rtitemB)
doc.SaveOptions = "0"
doc.SendTo=entry.ColumnValues(2) 
Call doc.Save(False, True)
Call doc.Send(False)	
'	Call uidoc.Close
End If
Print (rtitem.text)
Print (rtitemA.text)
'===============================================================	
For i=0 To nav.Count-2                          В ЭТОЙ ЧАСТИ ВОЗНИКАЮТ ПРОБЛЕМЫ
Set entry = nav.GetNext(entry)                К ТЕЛУ НОВОГО ПИСЬМА ПРИБАЛЯЕТСЯ 
'Set rtitemA = doc.GetFirstItem( "body" )          ТЕЛО ПРЕДЫДУЩЕГО ПИСЬМА             
'Set rtitemB = doc.GetFirstItem( "body1" )

Set richStyle = s.CreateRichTextStyle	
richStyle.Italic = True
richStyle.bold = True
Call rtitem.AppendStyle(richStyle)
Call rtitem.AppendText(" ")
Call rtitem.AppendText(entry.ColumnValues(1))
richStyle.Italic = False
richStyle.bold = False
'----------------------------------------------------------------------------------------------------------
If ( rtitemA.Type = RICHTEXT And rtitemB.Type = RICHTEXT ) Then
Call rtitemA.AppendRTitem(rtitem) 
Call rtitemA.AddNewLine(1)
Call rtitemA.AppendRTItem( rtitemB)
doc.SaveOptions = "0"
doc.SendTo=entry.ColumnValues(2)
' 	Call doc.Save(False, True)
Call doc.Send(False)	
End If
Print (rtitemA.text)

Next i
 

Andre

Well-known member
29.07.2004
108
0
#17
Если не ошибаюсь - то проблема состоит в том, что каждое следующее письмо содержит тела сообщений всех предыдущих писем.
Все дело в том, что каждый раз в цикле For ты работаешь не с новым экземпляром richTextItem, а с предыдущим (первоначально сформированнным). Соответственно ты получаешь арифметическую прогресиию :)

Что можно попробовать поправить.
Я бы например делал так
Dim w As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim s As New NotesSession
Dim db As NotesDatabase
Dim rtitemA As Variant
Dim rtitemB As Variant
Dim view As NotesView
Dim i As Integer
Dim rtitem As NotesRichTextItem
Dim richStyle As NotesRichTextStyle
Dim tmpDoc As NotesDocument
'---------------------------------------------------------------------------------------------------------
Set uidoc = w.CurrentDocument
Set doc = uidoc.Document
Call uidoc.Save

Set rtitemA = doc.GetFirstItem( "body" )
Set rtitemB = doc.GetFirstItem( "body1" )

Set richStyle = s.CreateRichTextStyle

Set db = s.CurrentDatabase
Set view = db.GetView("Почта")

set tmpDoc = view.getFirstDocument

while not tmpDoc is Nothing
Set rtitem = New NotesRichTextItem(tmpdoc, "Body")

richStyle.Italic = True
richStyle.bold = True
Call rtitem.AppendStyle(richStyle)
Call rtitem.AppendText(" ")
Call rtitem.AppendText(tmpDoc.поле_имя_клиента(0))
richStyle.Italic = False
richStyle.bold = False

If ( rtitemA.Type = RICHTEXT And rtitemB.Type = RICHTEXT ) Then
Call rtitem.AppendRTitem(rtitemA)
Call rtitem.AddNewLine(1)
Call rtitem.AppendRTItem( rtitemB)
tmpdoc.SendTo=tmpDoc.поле_email_клиента(0)

Call tmpdoc.Send(False)
End If

set tmpDoc = view.getnextDocument (tmpDoc)
wend


Дальше думаю разберешься
 
G

Guest

#18
Все получилось:) Большое спасибо всем, кто мне помогал в решении данной задачи:) Vincent.

З.Ы. Привожу немножко изменненый код Andre. Теперь все работает именно так, как я хотел.
Код:
Sub Click(Source As Button)
Dim boxType As Long
Dim answer As Integer
boxType& = MB_YESNO + MB_ICONQUESTION	
answer = Messagebox ("Вы действительно хотите сделать рассылку?" , boxType& , "Внимание!!!")

If answer = 6 Then
Dim w As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim doc As NotesDocument
Dim s As New NotesSession
Dim db As NotesDatabase 
Dim rtitemA As Variant
Dim rtitemB As Variant
Dim view As NotesView 
Dim rtitem As NotesRichTextItem
Dim richStyle As NotesRichTextStyle
Dim tmpDoc As NotesDocument 

Set uidoc = w.CurrentDocument
Set doc = uidoc.Document
Call uidoc.Save
Set rtitemA = doc.GetFirstItem( "body" )
Set rtitemB = doc.GetFirstItem( "body1" )
Set richStyle = s.CreateRichTextStyle 
Set db = s.CurrentDatabase 
Set view = db.GetView("Почта")
Set tmpDoc = view.getFirstDocument	
While Not tmpDoc Is Nothing
Set rtitem = New NotesRichTextItem(tmpdoc, "Body")

If ( rtitemA.Type = RICHTEXT And rtitemB.Type = RICHTEXT ) Then
 Call rtitem.AppendRTitem(rtitemA) 
 
 richStyle.Italic = True
 richStyle.bold = True
 Call rtitem.AppendStyle(richStyle)
 Call rtitem.AppendText(" ")
 Call rtitem.AppendText(tmpDoc.ColumnValues(1))
 richStyle.Italic = False
 richStyle.bold = False
 
 Call rtitem.AddNewLine(1)
 
 Call rtitem.AppendRTItem( rtitemB)
 tmpdoc.Subject=uidoc.FieldGetText("Subject")
     tmpdoc.SendTo=tmpDoc.ColumnValues(2)
 Call tmpdoc.Send(False) 
End If
Set tmpDoc = view.getnextDocument (tmpDoc)
Wend
Messagebox "Письма успешно отправлены!" , MB_OK , "Отчет об отправке"
Else
Messagebox "Рассылка отменяется! Письма не отправлены!" , MB_OK , "Внимание!"
End If
End Sub
 
Статус
Закрыто для дальнейших ответов.