Forward Messages

Summary: Forwards the selected message in a single message.
Requires: Mailsmith
Suggested Key Binding: Command-Control-F
Last Modified: 2019-10-02

Description

Emailer-style forwards without quote characters. If multiple messages are selected, they are concatenated into one large message (with appropriate delimiters). Does not yet handle enclosures.

Installation Instructions · Download in Compiled Format · Download in Text Format

Script

property punctDelim : "-----"

on run
    
set theList to getList()
    
if theList is not {} then
        
my doAction(theList)
    
else
        
display dialog "No messages were selected" buttons "Ok"
    
end if
end run

on doAction(mList)
    
tell application "Mailsmith"
        
set theContents to ""
        
if length of mList > 1 then set theContents to my beginOuterDelim(mList)
        
set n to 1
        
repeat with m in mList
            
set theContents to theContents & my beginInnerDelim(n, mList)
            
            
set h to ""
            
set h to h & ("Subject: " & subject of m & return)
            
set h to h & "From: "
            
try
                
set h to h & originator of m & return
            
on error
                
set h to h & return
            
end try
            
            
set theRecipients to ""
            
repeat with r in to_recipients of m
                
set theRecipients to theRecipients & my addressString(r) & ", "
            
end repeat
            
if theRecipients is not equal to "" then
                
set theRecipients to characters 1 thru ((length of theRecipients) - 2) of theRecipients
                
set h to h & ("To: " & theRecipients)
            
end if
            
set theCCs to ""
            
repeat with c in cc_recipients of m
                
set theCCs to theCCs & my addressString(c) & ", "
            
end repeat
            
if theCCs is not equal to "" then
                
set theCCs to characters 1 thru ((length of theCCs) - 2) of theCCs
                
set h to h & ("CC: " & theCCs)
            
end if
            
set theContents to theContents & h & return & return
            
            
set theContents to theContents & contents of m
            
set theContents to theContents & my endInnerDelim(n, mList)
            
set forwarded of m to true
            
            
set n to n + 1
        
end repeat
        
        
set theSubject to "Fwd: " & subject of item 1 of mList
        
        
if length of mList > 1 then set theContents to theContents & my endOuterDelim(mList)
    
end tell
    
makeMessage(theSubject, theContents)
end doAction

on makeMessage(theSubject, theContents)
    
tell application "Mailsmith"
        
try
            
make new message window
            
set subject of window 1 to theSubject
            
set contents of window 1 to theContents
        
on error
            
beep
            
display dialog "Something went wrong." buttons {"Ok"} default button 1
        
end try
    
end tell
end makeMessage

on getList()
    
tell application "Mailsmith"
        
set retry to false
        
try
            
set mList to get selection as list
            
set m to item 1 of mList
            
if class of m is not message then set retry to true
        
on error
            
set retry to true
        
end try
        
if retry then
            
set retry to false
            
try
                
set mList to message of window 1 as list
            
on error
                
set retry to true
            
end try
        
end if
        
if retry then set mList to {}
    
end tell
    
return mList
end getList

on beginInnerDelim(n, mList)
    
if length of mList > 1 then
        
return return & punctDelim & "Begin Message " & n & punctDelim & return
    
else
        
return punctDelim & "Begin Forwarded Message" & punctDelim & return
    
end if
end beginInnerDelim

on endInnerDelim(n, mList)
    
if length of mList > 1 then
        
return return & punctDelim & "End Message " & n & punctDelim & return
    
else
        
return punctDelim & "End Forwarded Message" & punctDelim & return
    
end if
end endInnerDelim

on beginOuterDelim(mList)
    
return punctDelim & "Begin Forwarded Messages" & punctDelim & return
end beginOuterDelim

on endOuterDelim(mList)
    
if length of mList > 1 then
        
set s to "s"
    
else
        
set s to ""
    
end if
    
return return & punctDelim & "End Forwarded Messages" & punctDelim
end endOuterDelim

on addressString(r)
    
tell application "Mailsmith"
        
set s to display name of r
        
set theAddress to address string of r
        
if theAddress ≠ "" then
            
set s to s & " <" & theAddress & ">"
        
end if
    
end tell
    
return s
end addressString