Mailsmith>FileMaker??

I recently downloaded an older AS that allows the export of Mail from Mailsmith to FileMaker but am having trouble using it. (I am using Mailsmith 2.1.2 and FM 7.0v2). The script appears to work but the Mailsmith email fails to import into FileMaker - my guess is an incompatibility in the script with FM v.7

I will paste the AppleScript (with its notes) below in the hope that someone can help?
ChrisS

===========

– These properties will store the local path to your filemaker database and its name.
– You will be prompted to specify its location at the first start (from which the name will be extracted).
– The script will keep track of your database path & name as you move or rename it.
property database_path : 0
property database_name : 0

global layout_name, Die, msgs_exported, msgs_export_failed, count_only_once, submbox_ct, FMP4_or_greater, Finder_label_list

– This specifies the layout to be used. Its name must be edited if it was changed in the database:
set layout_name to “import view”

– Set this variable to “false” if you don’t want to see a confirmation dialog when exporting complete mailboxes
set mbox_warning to true

set Die to false
set msgs_exported to 0
set msgs_export_failed to 0
set count_only_once to {}
set mbox_ct to 0
set submbox_ct to 0
set Finder_label_list to {7, 6, 5, 4, 3, 2, 1}

– This part handles receiving a message from a filter and is
– used when this script is executed as part of a filter action.
on FilterMessage(the_message)
my parse_message(the_message)
end FilterMessage

– This part handles exporting messages or mailboxes selected in a mail list window
– or in the mail browser window. If no messages are selected it gets flipant…
tell application “Mailsmith”
set the_list to selection as list
if the_list is not {} then
my launch_database()
if not Die then
try
set m to item 1 of the_list
if class of m is mailbox then
if mbox_warning then – Throw up a dialog when complete mailboxes are selected
– Before getting started: if a mailbox is selected the user will be informed that complete
– mailboxes (including all submailboxes!) will be exported, which of course may take some time!
repeat with obj in the_list
if id of obj is not in count_only_once then
set mbox_ct to mbox_ct + 1 – counts total number of 1st-level mailboxes (regarding your selection)
my count_submboxes(obj) – counts total number of selected sub-level mailboxes
end if
end repeat
activate
– The warning dialog:
set DialogResult to display dialog “Your selection contains:” & return & return & ¬
"mailboxes: " & mbox_ct & return & ¬
"submailboxes: " & submbox_ct & return & return & ¬
“Really export ALL contained messages?” with icon note buttons {“Cancel”, “OK”} default button 2
if button returned of DialogResult is “Cancel” then set Die to true
end if
if not Die then
repeat with obj in the_list
my process_mailbox(obj)
end repeat
end if
else – Class is not mailbox → “message” or something else (“string”, etc.)
my process_selection(the_list)
end if
on error – No class specified
my process_selection(the_list)
end try
if not Die then – inform the user how many msgs have been exported successfully
my export_statistics()
end if
end if
else – Nothing was selected
my nothing_selected_alert()
end if
end tell

– This section will prepare for message parsing and will hand each message to the parse_message routine:
on parse_msgs_prologue(m_list)
set old_delimiters to AppleScript’s text item delimiters
repeat with i from 1 to count items of m_list
my parse_message(item i of m_list)
end repeat
set AppleScript’s text item delimiters to old_delimiters
end parse_msgs_prologue

– This is the part of the script which actually gets the interesting parts of the message:
on parse_message(the_message)
tell application “Mailsmith”
try
if notes of the_message does not contain “” then
set AppleScript’s text item delimiters to return

			set mailbox_name to name of container of the_message
			
			set full_headers to header text of the_message as text
			
			if full_headers is "" then
				set full_headers to "(outgoing messages have no headers)"
				if sent of the_message is true then set msg_type to "sent"
				if sent of the_message is false then set msg_type to "queued"
			else
				set msg_type to "incoming"
			end if
			
			set msg_priority to "normal"
			if priority of the_message is urgent then set msg_priority to "urgent"
			if priority of the_message is high then set msg_priority to "high"
			if priority of the_message is low then set msg_priority to "low"
			if priority of the_message is bulk then set msg_priority to "bulk"
			if priority of the_message is none then set msg_priority to "(none)"
			
			set the_subject to subject of the_message
			if the_subject is "" then set the_subject to "(no subject)"
			
			set the_contents to contents of the_message as text
			if the_contents is "" then set the_contents to "(no body content)"
			
			set the_enclosures to (name of every enclosure of the_message) as text
			if the_enclosures is "" then set the_enclosures to "(no enclosures)"
			
			set the_notes to notes of the_message
			if the_notes is "" then set the_notes to "(no notes)"
			
			set the_originator to originator of the_message
			set orig_name to display name of the_originator
			set orig_email to address string of the_originator
			set the_originator to orig_email & " (" & orig_name & ")"
			
			set the_to_recipients to my address_constructor(to_recipients of the_message) as text
			set the_cc_recipients to my address_constructor(cc_recipients of the_message) as text
			set the_bcc_recipients to my address_constructor(bcc_recipients of the_message) as text
			
			set AppleScript's text item delimiters to ""
			
			set time_sent to my parse_time(time sent of the_message)
			set date_sent to my parse_date(time sent of the_message)
			
			if msg_type is "incoming" then
				set time_received to my parse_time(time received of the_message)
				set date_received to my parse_date(time received of the_message)
				
			else
				set time_received to ""
				set date_received to ""
			end if
			
			set label_no to label index of the_message
			-- due to some strange behaviour Mailsmith will map the Finder labels 1-7 to label indices 7-1
			-- so if necessary we have to switch these numbers first:
			if label_no is in Finder_label_list then
				set label_no to item label_no of Finder_label_list
			end if
			if label_no is not 0 then -- get label name
				set label_name to name of label label_no
			else
				set label_name to "none"
			end if
			
			if FMP4_or_greater then -- Filemaker Pro 4 or greater is being used
				set the_data to ¬
					{full_headers, the_contents, the_subject, the_enclosures, the_notes, ¬
						orig_name, orig_email, the_originator, ¬
						the_to_recipients, the_cc_recipients, the_bcc_recipients, ¬
						date_received, time_received, date_sent, time_sent, msg_type, msg_priority, ¬
						mailbox_name, label_no, label_name}
			else -- Filemaker Pro < 4 is being used
				set the_data to ¬
					{full_headers, the_to_recipients, the_contents, the_subject, date_received, ¬
						orig_name, the_originator, the_cc_recipients, date_sent, time_received, ¬
						time_sent, orig_email, msg_type, the_bcc_recipients, the_enclosures, ¬
						the_notes, msg_priority, mailbox_name, label_no, label_name}
			end if
			
			my create_record(the_data)
			
			-- Counts the total number of exported messages:
			set msgs_exported to (msgs_exported + 1)
			
			-- This will tag the successfully exported message:
			if the_notes = "(no notes)" then
				set notes of the_message to "<exported>" & return & return
			else
				set notes of the_message to "<exported>" & return & return & the_notes
			end if
		end if
	on error
		my handle_error(the_message)
	end try
end tell

end parse_message

– This section handles getting the time (as a string) out of dates
– and requires the “Date Calculations” osax:
on parse_time(foo)
set time_items to «event AEHKDITE» foo
set the_hour to «class HOUR» of time_items
set the_minute to «class MINS» of time_items
set the_second to «class SECS» of time_items
if the_minute < 10 then set the_minute to 0 & the_minute
if the_second < 10 then set the_second to 0 & the_second

set the_time to the_hour & ":" & the_minute & ":" & the_second as text

end parse_time

– This section handles getting the date (as a string) out of dates
– and requires the “Date Calculations” osax:
on parse_date(foo)
set date_items to «event AEHKDITE» foo
set the_month to «class MNTH» of date_items
set the_day to «class DAY » of date_items
set the_year to «class YEAR» of date_items as text
if the_month < 10 then set the_month to 0 & the_month
if the_day < 10 then set the_day to 0 & the_day

set the_date to the_day & "." & the_month & "." & the_year as text

end parse_date

– This section handles building full addresses from the parts that Mailsmith provides:
on address_constructor(foo)
tell application “Mailsmith”
set recipient_list to {}
if foo is not {} then
set foo to foo as list
repeat with i from 1 to count items of foo
set the_name to display name of item i of foo
set the_address to address string of item i of foo
set the_person to the_address & " (" & the_name & “)” as text
set recipient_list to recipient_list & the_person
end repeat
end if
recipient_list
end tell
end address_constructor

– This section handles blasting the data into FileMaker Pro
on create_record(the_data)
tell application “FileMaker Pro”
set current record to create new record with data the_data at layout layout_name of database database_name
end tell
end create_record

– This handler will process every kind of selection that
– - does not consist out of mailboxes → class is not mailbox
– - is not “empty” → {}
on process_selection(m_list)
tell application “Mailsmith”
set retry to false
set m to item 1 of m_list
try
if class of m is message then
my parse_msgs_prologue(m_list)
else
set retry to true
end if
on error
set retry to true
end try
if retry then
set retry to false
try
set m_list to message of window 1 as list
my parse_msgs_prologue(m_list)
on error
set retry to true
end try
end if
if retry then – → No selection
set Die to true
my nothing_selected_alert()
end if
end tell
end process_selection

– This handler will step through the mailboxes (if any selected):
on process_mailbox(mbox)
tell application “Mailsmith”
set m_list to (every message of mbox) as list
if m_list is not {} then my process_selection(m_list)
set ct to count mailboxes of mbox
repeat with i from 1 to ct
set obj to mailbox i of mbox
my process_mailbox(obj)
end repeat
end tell
end process_mailbox

– This section will start the Filemaker app (if not already running) and
– will open the database (if its not already open):
on launch_database()
– first get the FMP version being used (which is important when arranging the data for export):
tell application “FileMaker Pro” to set FMP_version to version as text
set FMP_version to first character of FMP_version as number
if FMP_version ? 4 then – FMP 4 or greater is being used
set FMP4_or_greater to true
else
set FMP4_or_greater to false
end if
tell application “Finder”
try
if (exists file database_path) then
tell application “FileMaker Pro”
if not (exists database database_name) then
open database_path
set database_name to name of database 1
end if
end tell
else
my choose_database()
end if
on error ErrText number ErrNo
if ErrNo is not -128 then – if user didn’t press ‘cancel’:
if ErrNo is 32768029 then – “file not found”
my choose_database()
else – present an error message
display dialog “The following error has occurred:” & return & return & ErrText & return & ¬
"(Error Code: " & ErrNo & “)” with icon caution buttons {“OK”} default button 1
end if
else
set Die to true
end if
end try
end tell
end launch_database

on choose_database() – If the database wasn’t found (script was recompiled or due to some error) the script will ask for the database location:
set database_path to choose file with prompt “Choose the Filemaker database:”

--This section will extract the database name from "database_path":
set old_delims to AppleScript's text item delimiters
set AppleScript's text item delimiters to ":"
set database_name to string (last text item of (database_path as string))
set AppleScript's text item delimiters to old_delims

tell application "FileMaker Pro" to open database_path

end choose_database

– This handler will step through all selected mailboxes and count the total number of sub-level mailboxes
– contained within the selection. This is only to provide information for the initial dialog that pops up if
– your selection contains mailboxes.
on count_submboxes(mbox)
tell application “Mailsmith”
set mbox_id to id of mbox
if mbox_id is not in count_only_once then – Avoids double counting
copy mbox_id to end of count_only_once
set ct to count mailboxes of mbox
set submbox_ct to submbox_ct + ct
repeat with i from 1 to ct
set obj to mailbox i of mbox
my count_submboxes(obj)
end repeat
end if
end tell
end count_submboxes

on export_statistics()
if (msgs_exported = 0) and (msgs_export_failed = 0) then
set already_exported_info to “” & return & return & “All selected messages have been already exported!”
else
set already_exported_info to “”
end if
– if enabled the following line will produce odd behaviour if the user pressed cancel while the script executes: the export_statistics() routine won’t show up!
– tell application “Mailsmith 1.1” to activate

-- the final dialog stating how many msgs have been successfully exported:
display dialog "Number of Messages that" & return & return & ¬
	"- were successfully exported:    " & (msgs_exported as string) & return & ¬
	"- failed to export:                        " & (msgs_export_failed as string) & ¬
	already_exported_info with icon note buttons "OK" default button 1

end export_statistics

– This handler gets activated if there was no selection in Mailsmith:
on nothing_selected_alert()
tell application “Mailsmith”
activate
display dialog “No messages were selected!” with icon caution buttons “Oops” default button 1
end tell
end nothing_selected_alert

– If a message fails to be parsed properly or can’t be inserted into the database:
on handle_error(the_message)
tell application “Mailsmith”
set msgs_export_failed to msgs_export_failed + 1 – counts the messages that failed to get exported
set label index of the_message to 31
end tell
end handle_error

There are significant changes to FileMaker’s AS model in v. 7.

  1. Please post the actual code to the script. not the event log. The code itself is more useful in providing help, at least on the front-end.

  2. Be sure to remember that you now need to specify a table when addressing a FMaker database. This is new in FM7.

Many thanks.

In the interests of space, I have edited my initial post above to replace the Event Log with the actual script along with its accompanying notes.
Chris S

It’s this line that’s failing, but it’s not an error:
“set current record to create new record with data the_data at layout layout_name of database database_name”

In FileMaker 7 there is a default object which is the current record of the current layout of the current table of the current database (or document).

I tried to create a new record, with all the correct parameters above, but while FileMaker was on a Blank layout. No data. It will not switch layouts unless you tell it to, and it will not enter the data if the fields are not on the current layout. There no longer is a “layout 0” like previous versions. This works:

go to layout layout_name
create new record with the_data

If you’re running this inside a Perform AppleScript step then you don’t need “tell FileMaker” commands. It appears you’re not, so you’ll probably still need code to target the correct database, etc… But it’s the layout FileMaker is actually on that matters.

Here’s another twist. If there’s several databases open, “tell database” doesn’t seem to work. It still just goes to whichever is active. You have to “go to database” (or document, or window). Then you can “tell layout” (or “go to layout”). Basically it seems you need to “go” somewhere first; unless of course the current layout is active in FileMaker already. This also works:

set database_name to “SetData”
set layout_name to “SetData”
set the_data to {“My”, “2nd”, “Data”}

tell application “FileMaker Developer”
go to database database_name
tell layout layout_name
set newRec to create new record
go to newRec
set data of current record to the_data
works on Blank layout
end tell
end tell

As does this:

tell application “FileMaker Developer”
go to database database_name
go to layout layout_name
create new record with data the_data
end tell