Many many thanks, it works like a breeze.
Etienne
I tested Yvan Koenig’s script in the post #7. It works on the Mojave perfect.
The title of the topic should be not Save Apple Mail And Attachments As PDF, but Save Apple Mail as PDF and its Attachments as Native Format. In order not to confuse people. It already confused me…
Without any GUI scripting, Apple Mail and its attachments can easily be saved in the Raw Message Format (as EML files). All markup is saved no worse than PDF. Select any message in Mail.app and run my script.
To continue the experiment, close Mail.app and double-click on the file just created to open it and to view its contents. Try even deleting the original message. An EML file should function without it.
The script:
set outputFile to (((path to desktop folder) as text) & "Experiment.eml")
tell application "Mail"
set aMessage to item 1 of (get selection)
set richSource to (source of aMessage) as rich text
end tell
try -- write text to EML file
set fileReference to open for access file outputFile with write permission
set eof of fileReference to 0
write richSource to fileReference
close access fileReference
on error
try
close access file outputFile
end try
end try
I apologizes but with every attempts, I got a file whose content in Mail is :
• aucun expéditeur
(Aucun objet)
The source contained:
–0000000000004ffb9c059f12ecc0
Content-Type: multipart/alternative; boundary="0000000000004ffb99059f12ecbe"
–0000000000004ffb99059f12ecbe
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Bonjour
J’esp=C3=A8re que vous allez bien , nous avons eu le bonheur d’acqu=C3=A9=
rir une
magnifique coupe dont nous aimerions avoir un peu plus de pr=C3=A9cision=
s sur
la date de sa r=C3=A9alisation.
En pi=C3=A8ce jointe quelques photos
Merci d’avance pour votre retour
Cordialement
M Aqsdfg g=C3=A9rard
Wazerty
–
–0000000000004ffb99059f12ecbe
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
…
–0000000000004ffb99059f12ecbe–
–0000000000004ffb9c059f12ecc0
Content-Type: image/jpeg; name="gerbino papillo6.jpg"
Content-Disposition: attachment; filename="gerbino papillo6.jpg"
Content-Transfer-Encoding: base64
Content-ID: <f_k6vzr20u0>
X-Attachment-Id: f_k6vzr20u0
/9j/4AAQSkZJRgABAQAASABIAAD/4QCMRXhpZgAATU0AKgAAAAgABQESAAMAAAABAAEAAAEaAAUA
AAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdpAAQAAAABAAAAWgAAAAAAAABIAAAAAQAA
AEgAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAABD6gAwAEAAAAAQAAAtQAAAAA/+0AOFBob3Rv
c2hvcCAzLjAAOEJJTQQEAAAAAAAAOEJJTQQlAAAAAAAQ1B2M2Y8AsgTpgAmY7PhCfv/AABEIAtQE
Are you using a feature which really works only with Mojave or Catalina ?
Yvan KOENIG running High Sierra 10.13.6 in French (VALLAURIS, France) mercredi 18 mars 2020 13:59:57
Remember to check - the EML files (.eml extension files) should be opened by Mail.app.
On my system I made second test. It works too. Maybe, it is new with Mojave and Catalina. Returned content of variable richSource (it has 1 text and 1 attached jpg file, and works fine):
From: Robert Kniazidis KNIAZIDIS.ROMPERT@gmail.com
Content-Type: multipart/alternative;
boundary=“Apple-Mail=_4E04147C-4B26-4187-AD6D-ABD0977BD6FC”
Mime-Version: 1.0 (Mac OS X Mail 12.4 (3445.104.11))
Subject: Test 2
X-Universally-Unique-Identifier: 0C01257B-513B-406B-B5BB-E122DE91B678
Message-Id: FC1ED9D9-FBC3-41CE-8B44-BB278DD26898@gmail.com
Date: Wed, 18 Mar 2020 19:38:42 +0200
To: kniazidis.rompert@gmail.com
–Apple-Mail=_4E04147C-4B26-4187-AD6D-ABD0977BD6FC
Content-Transfer-Encoding: 7bit
Content-Type: text/plain;
charset=us-ascii
ulk ou
–Apple-Mail=_4E04147C-4B26-4187-AD6D-ABD0977BD6FC
Content-Type: multipart/related;
type=“text/html”;
boundary=“Apple-Mail=_26D4488B-BE56-4C1F-ADA7-A4B3AAB65F12”
–Apple-Mail=_26D4488B-BE56-4C1F-ADA7-A4B3AAB65F12
Content-Transfer-Encoding: 7bit
Content-Type: text/html;
charset=us-ascii
ulk ou
–Apple-Mail=_26D4488B-BE56-4C1F-ADA7-A4B3AAB65F12
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename=“Fujifilm_FinePix_E500-Horned melon.jpg”
Content-Type: image/jpeg;
x-unix-mode=0755;
name=“Fujifilm_FinePix_E500-Horned melon.jpg”
Content-Id: A07039ED-0F5F-4B78-9E09-153EB6BE70AF@lan
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
r2LFzOaA5tdLHuVWpJJMX//Z
–Apple-Mail=_26D4488B-BE56-4C1F-ADA7-A4B3AAB65F12–
–Apple-Mail=_4E04147C-4B26-4187-AD6D-ABD0977BD6FC–
Here you can see 2 EML files on my screen (opened by double-clicking (My Mail.app is empty this moment. No messages in the mailboxes at all):
It’s puzzling. In every attempts the generated file was a zero bytes one.
Five hours later, testing with the same messages, it works.
Some gremlin seems to play in my machine.
Yvan KOENIG running High Sierra 10.13.6 in French (VALLAURIS, France) mercredi 18 mars 2020 21:16:12
Hi Yvan,
Thank you for the script you’ve created. I’ve been looking for this for years.
I don’t know to script but I was able to modify your script to save the attachments in different folders. Is there any way you can review this code and see if it can be edited to do the following:
- Skip making a folder if there are no attachments.
- Make this script simpler in order to increase the speed of printing and saving files in separate folders.
Thank you in advance,
Fernando Silva
my Germaine() # With this added step the script will not save globals in its file.
on Germaine()
# =======================================*=
set mySelf to {"Mr. Fernando Silva", "Silva Fernando", "Fernando Silva"} # I USE BOTH FORMATS, EDIT TO FIT YOUR NEEDS
# =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
# Define the folder where files will be stored
set attachmentsFolder to (choose folder) as text
tell application "Mail"
activate
set theMessages to (get selection)
end tell
---------------------------------------
repeat with eachMessage in theMessages
# Open a mail and treat it
tell application "Mail"
open eachMessage
delay 0.5
set wName to name of window 1
tell eachMessage # extract datas from the selected message
set sender_Name to extract name from its sender
set sender_Mail to extract address from its sender
set mail_Subject to subject
set mail_Date to date received # will keep the time component
set target_name to (name of its to recipient)
end tell # the message
end tell # application Mail
# No longer speak to application Mail
tell mail_Date
set theYear to year
set theMonth to its month as number
set theDay to day
set theHour to its hours
set theMinutes to its minutes
set theSeconds to its seconds
end tell
set begName to (theYear as text) & " " & text -2 thru -1 of ((100 + theMonth) as text) & " " & text -2 thru -1 of ((100 + theDay) as text) & space & text -2 thru -1 of ((100 + theHour) as text) & "" & text -2 thru -1 of ((100 + theMinutes) as text) -- & " Email "
if sender_Name is in mySelf then
set begName to begName & " to [" & target_name & "]"
else
set begName to begName & " from [" & sender_Name & "]"
end if
set thePDFname to begName & " - " & my remplace(mail_Subject, {":", "/"}, "-") & ".pdf" # I know, I'm a bit paranoid
set posixFolderPath to POSIX path of attachmentsFolder
set pdfPath to POSIX path of (posixFolderPath & thePDFname)
-- Print the opened email as PDF
tell application "System Events"
tell process "Mail"
set frontmost to true
set windowName to name of window 1
keystroke "p" using {command down} # Issue the Print shortcut
tell window wName
repeat
try
if (exists pop up button 1 of sheet 1) then exit repeat
end try
delay 0.2
end repeat
tell sheet 1
set PDFButton to first menu button
click PDFButton
tell menu 1 of PDFButton
name of menu items
--> {"Ouvrir le PDF dans Aperçu", "Enregistrer au format PDF…", "Enregistrer au format PostScript…", "Faxer le document PDF…", missing value, "@ PDF-BAT.qfilter", "@ PDF-prépresse CMJN.qfilter", "@ PDF-web.qfilter", "@ PDFX3-ISO.qfilter", "Add PDF to iTunes", "Envoyer le document PDF par courrier électronique", "Enregistrer le document PDF dans le dossier de reçus web", missing value, "Modifier le menu…"}
click menu item 2
end tell
repeat
if exists sheet 1 then exit repeat # the Print sheet exists, exit the loop!
delay 0.1
end repeat
end tell # sheet 1
tell sheet 1 of sheet 1
set wichElements to class of UI elements
if wichElements contains combo box then # maybe Mojave
get position of combo boxes --> {{910, 118}, {910, 148}}
set value of combo box 1 to thePDFname
else -- Yosemite, El Capitan, Sierra, High Sierra
--> {static text, text field, UI element, static text, text field, group, radio group, group, pop up button, text field, splitter group, text field, static text, button, text field, static text, text field, static text, static text, text field, button, button, button}
get position of text fields --> {{1262, 194}, {1262, 224}, {1458, 263}, {1086, 646}, {1086, 616}, {1086, 552}, {1086, 584}}
set value of text field 1 to thePDFname
end if
end tell # sheet 1 of sheet 1
keystroke "g" using {command down, shift down}
repeat until exists sheet 1 of sheet 1 of sheet 1
delay 0.02
end repeat
tell sheet 1 of sheet 1 of sheet 1
--name of UI elements
set wichElements to class of UI elements # According to system in use, may be
--> {static text, combo box, button, button} -- El Capitan, Sierra, High Sierra, maybe Mojave
--> {static text, text field, button, button} -- … Yosemite
if wichElements contains combo box then
set SaveIndex to -1
set value of combo box 1 to posixFolderPath
else
set SaveIndex to 1
set value of text item 1 to posixFolderPath
end if
name of buttons --> {"Aller", "Annuler"}
click button 1
end tell # sheet 1 of sheet 1 of sheet 1
tell sheet 1 of sheet 1
--name of UI elements # According to system in use, may be
--> {"Enregistrer", "Nouveau dossier", "Annuler"}
--> {"Nouveau dossier", "Annuler", "Enregistrer"}
click button SaveIndex
end tell # sheet 1 of sheet 1
end tell -- window wName
end tell # process Mail
end tell # "System Events"
# MAKES FOLDER
set folderName to begName & " - " & my remplace(mail_Subject, {":", "/"}, "-") # Change the name if you wish
set downloadFolder to attachmentsFolder # Don't change this instruction
set attachmentsFolders to downloadFolder & folderName & ":" # Don't remove the ending colon
tell application "System Events"
if not (exists folder attachmentsFolders) then
make new folder at end of folder downloadFolder with properties {name:folderName}
end if
end tell
#SAVES ATTACHMENTS IN FOLDER
tell application "Mail"
set selectedMessages to the selection
repeat with theMessage in selectedMessages
repeat with theAttachment in theMessage's mail attachments
set PosixName to name of theAttachment
# CAUTION, if the name of the file contain some slashes,
# it replace them by colons. So the next instruction reset the slashs.
set originalName to my remplace(PosixName, ":", "/")
set savePath to attachmentsFolders & originalName
try
save theAttachment in file (savePath)
end try
end repeat
end repeat
# MAKES FOLDER
set folderName to begName & " - " & my remplace(mail_Subject, {":", "/"}, "-") # Change the name if you wish
set downloadFolder to attachmentsFolder # Don't change this instruction
set attachmentsFolders to downloadFolder & folderName & ":" # Don't remove the ending colon
tell application "System Events"
if not (exists folder attachmentsFolders) then
make new folder at end of folder downloadFolder with properties {name:folderName}
end if
end tell
tell application "Finder"
set packageFolder to attachmentsFolder
set posixPath to quoted form of POSIX path of packageFolder
do shell script "find " & posixPath & " -name '.DS_Store' -type f -delete && find " & posixPath & " -empty -type d -delete"
end tell
#CLOSES EMAIL WINDOWS THAT ARE OPEN
try
repeat while exists window wName
close window wName
delay 0.1
end repeat
end try
end tell
end repeat
end Germaine
#=====
(*
replace every occurences of d1 by d2 in text t
*)
on remplace(t, d1, d2)
local oTIDs, l
set {oTIDs, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, d1}
set l to text items of t
set AppleScript’s text item delimiters to d2
set t to l as text
set AppleScript’s text item delimiters to oTIDs
return t
end remplace
#=====
–» HANLDERS
on exTant(_path) # Takes an HFS, Posix, or ~/Posix path as input.
local _path
try
if _path starts with “~/” then
set _path to (POSIX path of (path to home folder as text)) & text 3 thru -1 of _path
end if
if _path starts with “/” then
alias POSIX file _path
else if _path contains “:” then
alias _path
end if
return true
on error
return false
end try
end exTant
Model: MacBook Pro (Retina, 15-inch, Mid 2014)
AppleScript: 2.11 (203.1)
Browser: Safari 537.36
Operating System: macOS 10.14
Hi, Thanks@Yvan Koenig Script works great, Chucks out pdf on message every time
Issue: I believe its not related to script at all, → the pdf contents are truncated at the bottom & right side of each page
Any suggestions wud be welcome
Cheers
Hi all,
this is an old post and the operating system has been updated in the meantime.
In regards to exporting an email to PDF from Mail, there is no need to go through the print dialog box. In the file menu there is an “Export to PDF” item which can be activated using System Events.
This is much easier since the printer settings (such as black and white) will interfere with the quality of the PDF.
David. Thanks for the post and the excellent suggestion.
For several years now, I’ve been using a functionally similar (export-to-PDF) approach to save a Safari page to PDF, and it generally works well. Setting the file name and clicking on the Save button are both straightforward with GUI scripting, but I’ve never had any success changing the Where: folder. Have you been able to accomplish this?
Yes indeed! When the save-as dialog comes up, you just have to tell System Events to hit Shift Command G and then put the destination path into the next dialog that appears. The destination path needs to be in posix format.
Thanks. That works great.
Is the script supposed to work. This is my result:
Cmd-p works:
keystroke “p” using {command down}
But the next step of “Save as PDF…” doesn’t do anything:
click menu item 2
If you’re exporting from Mail, then have you seen this comment posted earlier:
I thought that this was in addition to the original script and not a replacement.
I’m a total novice with System Events and couldn’t get this to work at all:
tell application “Mail”
activate
end tell
tell application “System Events”
tell process “Mail”
set theFileMenu to menu bar item “File” of menu bar 1
click menu item “Export to PDF…” of theFileMenu
end tell
end tell
This makes an error:
System Events got an error: Can’t get menu item “Export to PDF…” of menu bar item “File” of menu bar 1 of application process “Mail”.
I’m just testing so there is no error handling at all. I make sure that an email is selected.
bwill. The following worked reliably on my Sonoma computer:
tell application "Mail" to activate
tell application "System Events" to tell process "Mail"
click menu item "Export as PDF…" of menu "File" of menu bar 1
delay 0.5
keystroke return
end tell
Thanks! I found the problem. My script uses “Export TO” and not “Export AS”. I know why I never used System Events.
Everything works, and a PDF is created on the desktop, but, there seems to be some sort of formatting issue, see posted PDF.
Pharmacological Intervention.pdf (352.8 KB)
I often encounter that issue, which also occurs with Mail’s print-to-PDF option. One workaround is to increase or decrease the size of the email (command-plus or command-minus keyboard shortcut) before exporting, but that’s kludgey. No good solutions that I’m aware of.
Hi. Scripting Newbie here and I’m really really sorry to have to ask but is there an easy way for me to learn how to implement this script? Thanks in advance…