Reply without attachments

There is nothing more annoying than receiving a reply to a message you sent with your original attachment included.

View member feedback to this tip.

There is nothing more annoying than receiving a reply to a message you sent with your original attachment included. It is a complete waste of space and reso>urces and a great nemesis to already taxed e-mail servers and managed mailbox databases. We have come up with separate options for replying to messages with attachments. These options will remove the attachments from a new Reply with History or Reply to All with History and replace the attachment with a message saying the attachment has been removed.


First, create two new Shared actions and copy the code for the actions:
-------------------------------------
"Reply with History - attachments removed":
Shared Action Code:
@If(@IsDocTruncated; @Prompt([OK]; "Reply with History"; "This document is truncated."); "");
@SetEnvironment( "tmpReplyHistAll" ; "FALSE" ) ;
@SetEnvironment("tmpReplyWithoutAttachments"; "1");
@Command([ToolsRunMacro] ; "(ReplyNoAttachments)" )
---------------------------------------
"Reply to All with History - attachments removed"
Shared Action Code: 
xxTitle:="Reply with History";
xxMessage:= "This document is truncated.";
@If
 (
 @Text(@Right(@NoteID; "NT")) != "00000000";
  @Do
    (
    @If
     (
     @IsDocTruncated;
      @Prompt([OK]; xxTitle; xxMessage);
     ""
     );
    @Environment("MailStEd";"9")
    );
 ""
 );

@SetEnvironment( "tmpReplyHistAll" ; "TRUE" ) ;
@SetEnvironment("tmpReplyWithoutAttachments"; "1");
@Command([ToolsRunMacro] ; "(ReplyNoAttachments)" )

---------------------------------------
Second, create an agent (named "ReplyNoAttachments") which is a shared agent run manually from agent list on selected documents.  Here is the code:
'---------
'(Options)
'---------
Option Public
Option Declare
Use "Common"
'------------
'(Initialize)
'------------
Sub Initialize
 Dim uiws As New NotesUIWorkspace
 Dim uidoc As NotesUIDocument
 Dim doc As NotesDocument
 Dim sess As New NotesSession  
 Dim errormsg(2)  As String
 
 On Error Goto errorhandler
 
 ' this text is common to all error messages 
 errormsg(0) = "  You can remove the attachment(s) manually prior to sending the reply"_
 &" by selecting the attachment icon(s) and pressing delete."
 
 ' used when doc contains mixed attachment or object embed
 errormsg(1) = "This document contains attachment(s) which cannot be removed by this process." & errormsg(0)
 ' used for any error 
 errormsg(2) = "An error occurred while processing this document." & errormsg(0)
 
 Set uidoc = uiws.currentdocument
 If uidoc Is Nothing Then              ' if activated from view open document in ui
  Call uiws.EditDocument(False)
  Set uidoc=uiws.currentDocument
 End If
 
 Set doc = uidoc.document
 
 If doc.HasEmbedded = False Then  ' if no attachments create standard Reply skip remaining process
  Call OpenReplyInUI( uiws )
  Exit Sub
 End If
 
 Dim count As Integer
 Dim rtitem As notesrichtextitem
 Dim inbody! 
 
 Set rtitem=doc.getFirstItem("body") ' get body
 count = 0
 
 ' determine how attachment is saved in doc
 If Typename(rtitem.embeddedObjects) <> "EMPTY"  Then
  Forall x In rtitem.embeddedObjects
   If x.type = EMBED_ATTACHMENT Then
    count = 1
    inbody! = True
    Exit Forall
   End If
  End Forall
 Else
  Forall fld In doc.items
   If fld.Type = ATTACHMENT Then
    count=1
    Exit Forall
   End If
  End Forall
 End If
 
 If count = 0 Then  ' If type ATTACHMENT not found then create standard reply
  Call OpenReplyInUI( uiws )
  Exit Sub
 End If
 
 Dim continue!, RWAP%, TRWOA%
 ' Get ini variables so we know what user wants to do
 RWAP% = sess.GetEnvironmentValue( "ReplyAttachPrompt", False )
 TRWOA% = sess.GetEnvironmentValue( "tmpReplyWithoutAttachments", False )
 
 Select Case True
  
 Case RWAP% = "1"      ' user has their preference set to prompt.  
  continue! = Msgbox( "Would you prefer to reply without attachments? This is recommended to improve performance and disk usage."_
  ,36, "Remove Attachments" )
  
 Case TRWOA% = "1"     ' preference is set not to prompt and user has selected menu option to remove attachments
  continue! = 6
  
 Case TRWOA% = "0"      ' preference is set not to prompt and user has not selected menu option to remove attachments
  continue! = 0 
  
 End Select
 
' clear tmporary ini variable
 Call sess.SetEnvironmentVar( "tmpReplyWithoutAttachments", "", False )
 
'execution 
 If continue! <> "6" Then
  Call OpenReplyInUI( uiws )
  Exit Sub
 End If
 
 Dim uidoc2 As notesuidocument
 Dim replyuidoc As notesuidocument
 Dim tempdoc As NotesDocument
 Dim namelist() As String
 Dim rtitem2 As notesrichtextitem
 Dim richStyle As NotesRichTextStyle
 Dim db As NotesDatabase
 Dim cnt! 
 
 Set db = sess.currentDatabase
 Set tempdoc = New NotesDocument(db)
 
 If inbody! Then
  Forall x In rtitem.embeddedObjects
   If x.type = EMBED_ATTACHMENT Then
    Redim Preserve namelist( cnt! )
    namelist(cnt!) = x.name
    x.remove
    cnt! = cnt! + 1
   Else
    Goto cannotremove    ' if an embedded object not of type Attachment then exit
   End If
  End Forall
 Else
  Forall x In doc.items
   If x.type= ATTACHMENT Then
    Redim Preserve namelist( cnt! )
    namelist(cnt!) = x.values(0)
    x.remove
    cnt! = cnt! + 1  
   Else
    Goto cannotremove ' if an embedded object not of type Attachment then exit
   End If
  End Forall
 End If
 
 ' this section builds a message that lists the names of the removed attachments
 Set richStyle = sess.CreateRichTextStyle ' first we define the style
 richStyle.NotesFont = FONT_COURIER
 richStyle.FontSize = 12
 richStyle.NotesColor = 10
 Set rtitem2 = New notesrichtextitem( doc, "msgbody" ) ' create a place to store the message
 Call rtitem2.AppendStyle(richStyle)    ' apply the style
 Forall n In namelist
  rtitem2.Addnewline( 1 ) ' prepare comment lines
  rtitem2.AppendText( "An attachment named " + Ucase( n ) + " was removed." ) 
 End Forall
 
 rtitem2.Addnewline( 2 ) 
 Call rtitem2.Appendrtitem( rtitem ) ' pre-pend attachment message to Body field
 rtitem.remove  ' remove old rtitem so it can be reused
 Set rtitem =rtitem2.copyitemtodocument( doc, "Body" )
 rtitem2.remove  ' remove rtitem2 'cause it's not needed
 
 Call doc.CopyAllItems(tempdoc,True)
 Call tempdoc.MakeResponse( doc)
 Call tempdoc.Save(True,False)
 
 Set uidoc2 = uiws.EditDocument(True,tempdoc)
 Set replyuidoc = OpenReplyInUI( uiws )
 
 Dim refitem As NotesItem
 Set refitem = tempdoc.GetFirstItem("$REF")
 Call refitem.CopyItemToDocument( replyuidoc .document,"$REF")
 Call uidoc2.close
 Call tempdoc.Remove(True)
 Exit Sub
 
errorhandler:
 Msgbox "Error " & Err & ".  " & errormsg(2), 16, "Operation Failed"
 
 If Not uidoc2 Is Nothing Then
  Call uidoc2.close
 End If
 
 If Not replyuidoc Is Nothing Then
  replyuidoc.close
 End If
 
 If Not tempdoc Is Nothing Then
  Call tempdoc.Remove(True)
 End If
 
 Call OpenReplyInUI( uiws )   ' create standard reply
 
 Exit Sub
 
cannotremove:
 Msgbox errormsg(1), 16, "Unable to complete operation."
 
 Call OpenReplyInUI( uiws )  ' create standard reply
 
 Exit Sub 
 
End Sub
'-------------
'OpenReplyInUI
'-------------
Function OpenReplyInUI( uiws As notesuiworkspace ) As notesuidocument 
 Dim sess As New notessession
 Dim replyuidoc As notesuidocument
 On Error Resume Next
 
 Set replyuidoc = uiws.ComposeDocument("","","Reply With History")
 
  ' This call is to the Lotus provided Common script libray.
  ' It is necessary for the cc field to be properly populated.
  ' The environment var is set by the Reply with History and Reply to All with History action buttons
 If sess.Getenvironmentstring( "tmpReplyHistAll", False) = "TRUE" Then
  Call MEMOReplyToAll( replyuidoc.document )
  replyuidoc.reload
 End If
 
 Set OpenReplyInUI = replyuidoc
 
End Function


MEMBER FEEDBACK TO THIS TIP

Great tip! It is easy to implement and little impact to user behavior. Why didn't we think of this before?

—Stan E.

This was first published in August 2001

Dig deeper on Lotus Notes Domino Administration Tools

0 comments

Oldest 

Forgot Password?

No problem! Submit your e-mail address below. We'll send you an email containing your password.

Your password has been sent to:

SearchWinIT

Search400

  • iSeries tutorials

    Search400.com's tutorials provide in-depth information on the iSeries. Our iSeries tutorials address areas you need to know about...

  • V6R1 upgrade planning checklist

    When upgrading to V6R1, make sure your software will be supported, your programs will function and the correct PTFs have been ...

  • Connecting multiple iSeries systems through DDM

    Working with databases over multiple iSeries systems can be simple when remotely connecting logical partitions with distributed ...

SearchEnterpriseLinux

SearchVirtualDataCentre.co.UK

Close