Using Thunderbird for “Send Only” Email

Exactly 10 years ago today, I wrote Use Mailsmith to create a “send-only” email account for TUAW (which was later ‘replaced’ by Engadget).

Unfortunately, Mailsmith did not make the 64-bit transition, and another app known as “Let.ter” seems to have disappeared (although last time I checked, it did still work, but I don’t think it integrated with the macOS address book).

If you use Gmail (or “Google Suite” or whatever it is called), you can use a link like this to send email without ever seeing your Inbox:

https://mail.google.com/mail/u/?authuser=example@gmail.com&view=cm

Obviously replace example@gmail.com with your actual email address. That link will bring up a ‘Compose’ window, which you can use as normal, and then when you send the email, you will be left with a Gmail window which is basically inert.

However, I wanted a Mac app for this. More specifically, I wanted an app which would be able to autocomplete from my macOS Contacts..

It turns out to be much harder than you might think.

Most email apps think they are doing exactly what users want by making sure that they retrieve email as effortlessly as possible. Let’s be honest, that’s a reasonable assumption.

My first attempt was to set up an email app that I don’t usually use, and then either change or delete the IMAP information, so that the app could not download email.

Most email apps will freak out if you do this. First off, most of them won’t even let you delete the IMAP information, and if it is incorrect, they will continually throw error messages as you. Again, it’s a reasonable assumption that users will want to download email, so I can’t really fault them for this, but I found that it was extremely frustrating to deal with the error messages.

Recently, I decided to try this again, and found that it was actually possible to do. It’s not 100% as “clean” as I would like, but it works well enough, and until I find something better, this is what I will be using.

Thunderbird Swoops In

Thunderbird is the mail app from Mozilla, the people who make the Firefox web browser. I had tried this a few years ago and couldn’t get it to work, but it struck me as the email app that was most likely to allow this level of customization.

A search for “Thunderbird Send Only” led me to this post on Superuser:

A Thunderbird account is only for receiving mail. It cannot send mail at all.

To send mail in Thunderbird, you use an identity, not an account. Unfortunately, Thunderbird’s user interface makes the relationship between accounts and identities confusing, as the “Manage Identities” button is found within Account Settings.

Add an identity to your default account, and if necessary add a separate SMTP server for the new identity, but don’t otherwise configure the account. The new identity can send mail independently of the account, and it will never try to receive mail.

I also came across forum post from January 3rd, 2009 (!) saying essentially the same thing, so I decided to give it at shot. Apparently this has been possible for a lot longer than I realized.

The Thunderbird distinction between Identity and Account is important, so I will try to use both terms very carefully from here on.

Here’s the Downside

As far as I can tell, in order to set this up, you have to give Thunderbird access to a “real” email account to create the Account.

You can set this account to not download email automatically at launch, and not to download email periodically, but if you click on the ‘Inbox’ it will download email in the inbox, so that makes it a “No Go” as far as being a 100% reliable “send only” account for that email account.

However, I have an old Gmail account which I pretty much never use, which gets almost no email (even spam!). I created it for a project or something which never went anywhere. So it’s a good Gmail account to use to set up the Thunderbird account because even if it did download email, and even if there was email for it to download, there would be nothing in there to distract me.

You could even set up a new Gmail account and create a Gmail filter to automatically delete all incoming email. But I had this one already, so I decided to use it.

If you don’t have a spare email account, creating a new Gmail account is a bit of a hassle, but, IMO, worth it.

Here’s How to Do It

Step 1: Set up a new account in Thunderbird using an existing email account. This is not the email address you want to use for “Send Only” but another “dummy” account.

Step 2: Once you have it setup, click on the very top level (see screenshot above, item #1), and then choose “Account Settings” (item #2).

Thunderbird 001 Click On Account Settings

Step 3: Click on “Manage Identities” at the bottom right corner.

Thunderbird 002 Manage Identities

Step 4: Click to Add a New Identity

Thunderbird 003 Identities Add

Step 5: Fill Out Information. Items 5, 6, 7, and 8 are the only ones that are required (as far as I can tell.) #8 may not be required, but it’s definitely something I recommend. This should be the account you want to use as “Send Only”.

Thunderbird 004 Fill Out Identity

Don’t click “OK” yet – click on #7 to create a new SMTP server. This is a vital step!

Step 6: Enter SMTP Server Information. This is the information for the “Send Only” account.

Thunderbird 005 STMP Info

Note that I have given the “Description” (item #9) to make it obvious that this is the SMTP server I want to use when using it as “Send Only”.

Items 10-14 will differ, depending on the options for “Connection Security” and “Authentication Method” that you will have to choose for your email provider. What is shown here is for Gmail, but if you use another email provider, it may be different. (If email does not send, or does not send from the proper account, remember this step, because this is probably where you will need to come back to.)

Step 7: Set Default Identity.

Click the “Manage Identities” button again (see Step 3) and you should have two Identities now. Either choose the one you want to use as “Send Only” and click “Set Default” or click the one you aren’t going to use and click “Delete”.

Thunderbird 007 Default Identity

You can see above that I’ve already deleted the one I’m not planning to use.

Step 8: Set the Outgoing Server (SMTP).

Thunderbird 006 Default STMP Server

Click the next to #15 and change it to the “Send Only SMTP Server” that we created in Step #6. I wish I could delete the other SMTP server, but I cannot find a way to do that. Let me know if I missed it.

Step 8: Send a Test Message.

  • Close the “Tab” with the account settings.
  • ⌘N to open a new “Compose” window.
  • Check the “From” address is the correct one (if not, go back to Step 7).
  • Send a test email to yourself. If you set up a Gmail SMTP server, the first time you send a message Thunderbird will open a browser window to authenticate you with your Gmail account. Once you’ve done that once, you won’t need to do it again.

There Is No Step 9. Hopefully.

I hope that will work for you. If not, let me know. It can be a bit of a challenge writing up instructions after the fact because I’m always afraid I will forget some detail or some step that I did the first time through.

If you want to discuss this, please post to this thread on the Mac Power Users forum.


Optional Steps

  • in “Account Settings” click on “Server Settings” and uncheck the boxes next to “Check for new messages at startup” and “Check for new messages every X minutes” and “Allow immediate server notifications when new messages arrive.” This should prevent Thunderbird from automatically downloading email from your the email account we setup in Step 1.
  • in “Account Settings” click on “Copies & Folders” and choose options for where you want copies of sent messages to be stored. You may want to set it up to automatically BCC yourself at the “Send Only” account so you’ll have a record of those emails in that account. (Note: if you use Gmail for SMTP, it will automatically store the message in your Sent email ‘folder’ on Gmail, so you don’t need to do that for Gmail.)

Automators Podcast, episode 58

I was extremely pleased to be on episode 58 of the Automators podcast on Relay.fm.

This was my first time on Automators, which is a show that I have really enjoyed since it first began.

I’m guessing anyone who has managed to still find and read my site probably knows this already, but I’ve also been on a few episodes of Mac Power Users too:

Links and Show Notes

Here are the show notes for Automators 58:

Compare macOS Versions with zsh and is-at-least

Update (26 July 2020)

Howard Oakley has reported that Big Sur is both 10.16 and 11.0.

For the purposes of shells scripts, sw_vers will return 11.0 unless SYSTEM_VERSION_COMPAT=1 is set. If it is set, then sw_vers will return 10.16.

To my mind, this new information only makes the following suggestion more useful, because it will work under either scenario.

end of update

Original Post

I have already run into an issue where I’ve had to adapt some of my scripts for Big Sur.

(n.b. if you have used the -p arg to shasum in the past, it no longer exists in Big Sur. There is a new -U option which is not the same as what -p used to do. Ironically, -p was for ‘portable’ mode.)

It has already been noted that Apple is referring to Big Sur as “macOS 11” which presumably means that sw_vers -productVersion will return ‘11.0’ once Big Sur is out of beta.

However, at least as of this writing (10 July 2020), sw_vers -productVersion on Big Sur returns ‘10.16’.

If you are trying to write a shell script which can be used on both Big Sur and earlier versions of macOS, how can you check to see which version you are running?

I would like to recommend the following, which uses a feature which I believe is unique to zsh — and since Apple has made zsh it’s preferred shell, I recommend writing all of your shell scripts in zsh (however I should note that I may be a little biased, as I’ve been using zsh for 20+ years).

is-at-least

The zsh feature in question is called is-at-least and you use it like this:

autoload is-at-least

is-at-least "$MINIMUM" "$ACTUAL"

where $MINIMUM and $ACTUAL represent the two numbers that you want to compare. What is especially nice about is-at-least is that it can compare version numbers such as 10.15.5 and 10.13.4 and 10.16 (or 11.0).

Note: the autoload is-at-least line needs to be called once-per-script before you use is-at-least but once you’ve loaded it, you can use is-at-least as many times as you want in that script.

The key here is that regardless of whether Big Sur reports itself as 10.16 or 11.0, we can use ‘10.16’ as $MINIMUM and then set $ACTUAL to the version of macOS that we are using.

Note that you don’t have to use variables here, you could do this:

autoload is-at-least

is-at-least "10.16" "$ACTUAL"

The result of is-at-least will be zero if $ACTUAL is at least equal to 10.16, or 1 if it is not.

Here’s a complete example script as a gist for those who may find it useful.


#!/bin/zsh -f
# Purpose: Check to see if we are running on Big Sur
#
# From: Timothy J. Luoma
# Mail: luomat at gmail dot com
# Date: 2020-07-10
PATH="/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin"
# this will check to make sure `sw_vers` exists
# if it does not, this is probably not macOS
if ((! $+commands[sw_vers] ))
then
echo "$NAME: 'sw_vers' is required but not found in $PATH" >>/dev/stderr
exit 2
fi
## First we get the value for this Mac and save it to `$ACTUAL`
ACTUAL=$(sw_vers -productVersion)
## load 'is-at-least' so we can use it
autoload is-at-least
## "Is the version of macOS that we are using _at least_ 10.16?"
is-at-least "10.16" "$ACTUAL"
## EXIT will be '0' if ACTUAL is at least 10.16
## EXIT will be '1' if ACTUAL is _less than_ 10.16
EXIT="$?"
if [[ "$EXIT" == "0" ]]
then
# This is Big Sur (or later)
echo "YES"
elif [[ "$EXIT" == "1" ]]
then
# This is BEFORE Big Sur
echo "NO"
else
# we should never get here
echo "This should not have happened. EXIT = $EXIT"
fi
exit 0

Listen, record, and even pause Relay.fm Live using VLC and Audio Hijack

Relay.fm has a schedule of live shows which you can listen to as they are recording. Most people just listen to these in a web browser, because that makes the most sense and is the easiest way to do it. If you have an iOS device you can use the free Relay.fm app which I will also use if I am not at home when a show is live.

However, if I am on my Mac when a show is live, I prefer to listen using VLC which is a free app, and I also like to record the live show, either so I can pause it if I get interrupted or can just listen later to the MP3. This is accomplished by using VLC plus Rogue Amoeba’s Audio Hijack program, which is not free, but which any self-respecting Mac nerd ought to own because it’s amazing cool and powerful. It can do 1,000 more things than this, but I’m just going to talk about this for now.

Using VLC to listen to Relay.fm live

To listen to Relay.fm in VLC, you need the URL to the live-stream server:

http://stream.relay.fm:8000/stream

That URL is only enabled when the live-stream is active.

First go the File » Open Network:

VLC: File » Open Network

Second, put the URL into the Network URL in the Open Source window that will open:

VLC: Network Pane

If the live-stream is active, it will look like this:

VLC: Live Stream window

If you’re comfortable with the command line, you can replace the first two steps by this line in Terminal:

open -a VLC 'http://stream.relay.fm:8000/stream'

which will automatically open VLC with the stream playing (again, only if it is live).

Record Relay.fm Live with VLC and Audio Hijack

If you want to record Relay.fm with Audio Hijack, we can still use VLC, and then set it up the output to go two places:

  1. To an MP3 so we can listen later

  2. To the Mac’s speakers

In number 2, we also add a “Time Shift” block, which will allow us to pause the livestream (which will keep recording in real-time to the MP3, because that is completely separate). It will also allow us to rewind the broadcast if we missed something. It’s sort of like TiVo for audio.

The setup (which Audio Hijack calls a “Session”) will look something like this:

VLC in Audio Hijack

You can see there are two “branches” from VLC, one going up to an MP3, and the other going down to “Time Shift” and “Output Device”.

We have to tell VLC what to play when this Session runs, which we can set by clicking on the VLC “block” in Audio Hijack, which will reveal the VLC settings. You can see it here:

VLC settings in Audio Hijack

Note that the box next to “Open URL” is checked, and the URL is entered into the appropriate box.

You can also change the MP3 settings (not shown) by clicking on the “Recorder” block. I have mine set to save recordings to the folder ~/Music/Audio Hijack/ with filenames that are formatted like this:

Relay.FM-2019-05-16-at-13-04.mp3

The first part makes sure that all the Relay.fm recordings will be grouped together by name, and then the date (YYYY-MM-DD) followed by the time that the recording began (13-04 refers to 1:04 p.m. local time on May 16th of 2019).

You can download my Audio Hijack session file here: Relay-to-Speakers-and-mp3.ahsession

Assuming you have Audio Hijack installed, you should be able to double-click on the Relay-to-Speakers-and-mp3.ahsession file and have it open right in Audio Hijack. You can then adjust any of the settings that you might want to change. (The file also assumes that VLC is installed at /Applications/VLC.app.)


p.s. – You can easily adapt these instructions to record other podcasts which record live, by creating a new “Session” in Audio Hijack and changing the URL of the live-stream server. For example, ATP’s URL is http://marco.org:8001/listen

With ATP, you can even use Audio Hijack’s “Schedule” feature to record Wednesday nights at 8:58 p.m. (US/Eastern) to 11:55 p.m. and automatically record most of ATP’s live shows. They do occasionally change that date/time of recording, but that will catch most weeks. I suggest starting a few minutes before 9:00 p.m. not because I want to subject you to Marco’s Phish concerts, but just to give yourself a little leeway. Also, they usually stop recording long before 11:55 p.m., but Audio Hijack is smart enough to figure out when there is no sound playing.

Using Keyboard Maestro to make the Home.app Less Terrible

The Home.app on Mac is, frankly, not very good.

It was originally released as an example of iOS apps coming to the Mac, and when it first came out, pretty much everyone said “Well, sure, it’s not very good, but it’s better than nothing… and surely Apple will improve on it over time.”

That has not happened (yet?) and the app remains mostly terrible. For example, it is completely missing some HomeKit accessories which appear in the iPhone/iPad.

In our living room we have 9 overhead lights which I grouped together as “one light” in the Home.app on the iPhone… but for some reason they continue to appear as 9 individual lights in the Home.app on the Mac. I grouped them together on the Mac Home.app, and later they appeared un-grouped again. Why? Who’s to say?

Oh, and some of my Home.app scenes just don’t appear on the Mac. Why? Who knows? How do I fit it? Who knows? The only thing I can do is uncheck the box for “Home” in System Preferences under iCloud, wait for the Home.app to empty out, and then check the box again to re-enable it.

Screenshot of System Preferences, iCloud, Home

That did work to get the Home.app to recognize some new accessories, but it did not help the missing “scenes” appear. Which, I guess, is better than nothing.

(You’ll notice that “It’s better than nothing” is effectively the slogan of most of these iOS-apps-on-the-Mac, at least so far.)

Home.app Automation

The Home.app is mostly impervious to attempts to automate it on the Mac. There is absolutely zero AppleScript support, and keyboard shortcuts are limited to switching between the “Home”, “Rooms”, and “Automation” tabs in the main window.

(That “Automation” tab is identical to what you see on iOS, where you can set timers and triggers. That automation is pretty good, but if you want to assign a keyboard shortcut to setting a Home.app scene or even turning an accessory on/off, well, you are out of luck.)

One minimal piece of functionality that the app has is that each of your “rooms” are available under the “View” menu and via an icon on the Home.app toolbar.

Screenshot of Home.app's "View" menu

I have often wished for a way to go to a specific room via a keyboard shortcut, and today I finally made that happen using one of the best apps on macOS: Keyboard Maestro.

It’s a relatively straight-forward macro, but I thought I’d walk through it as an intro to folks who may want to learn more about Keyboard Maestro.

Create a “Macro Group” for the Home.app

Screenshot of Keyboard Maestro - create macro group

Click the + icon in the first column of Keyboard Maestro’s Editor window to create a new “Macro Group” (think of it like a folder). Then, in the third (main) section, set “Available in these applications” to the Home app using the dropdown. This will restrict the macros in that Macro Group to only being active when you are using the Home.app. Note that I called mine “» Home.app” but you could call it anything you want. I use the » prefix before all of my Macro Groups that are specific to an app to help keep them sorted together.

(That process of setting a Macro Group to only work in one app is a handy feature of Keyboard Maestro that you will probably use a lot.)

Create a Macro for each room

Screenshot of Keyboard Maestro - create macro

  1. Click the + icon in the middle column to create a new macro inside the “Home.app” macro group.

  2. The Macro Name (shown here as “Ethan’s Room”) can be anything you want. You could call it “Bedroom 3” or “Purple Monster”. Whatever name you give it will be what is shown in the middle column.

  3. Assign a “hot key” which is Keyboard Maestro’s name for a keyboard shortcut. Notice that I have assigned two hot keys: ⌥E and ⌥S.

    Keyboard Maestro will let you create as many of these as you want (which is especially nice if you don’t always remember what keyboard shortcut you used — if you think it might be one or the other, use both!)

    However, in this case, I am going to assign at least two keyboard shortcuts to each room, and one of them will always be ⌥S (I will explain why in a moment).

  4. Click “New Action” and choose “Select or Show a Menu Item” (not shown in screenshot) to tell Keyboard Maestro that you want it to use that keyboard shortcut to match a menu item. The top level title is “View” (that is what appears in the menu bar) and the menu item is the name of the room. (Note: in this step, you do have to be exact and match precisely what the menu item says, so be careful.

Repeat the previous 4 steps for each room

I’m not going to show them all to you, but here’s the next one for the Front Door.

Screenshot of Keyboard Maestro, Macros, Front Door

Notice that the first “hot key” is unique ⌥F but the second is the repeated ⌥S.

The same is true for Garage, Hallway, Tj’s Room, Living Room, Office, and Tracey’s Room.

In the middle column you can see the hot keys which have been assigned to each macro. If more than one hot key is assigned, only the first will be shown, so make sure that is that unique one.

(Yes, I will explain why I added those bracketed letters to Tj’s Room and Tracey’s room.)

Q: “Why did you assign the same hot key for each room? Obviously that isn’t going to work right… Right?”

Well, it depends what you mean by “work right” I suppose.

Normally, if you had two identical keyboard shortcuts in an app, you would expect that when you use that keyboard shortcut, nothing will happen, except maybe the system beep will go off.

Keyboard Maestro is smarter than that. If you assign the same keyboard shortcut (or “hot key” in Keyboard Maestro parlance) when you press that keyboard shortcut, Keyboard Maestro will show you what is called the “Conflict Palette”.

The “Conflict Palette” is a little pop-up window which will appear and look something like this:

Screenshot of Keyboard Maestro's Conflict Palette

Note that at the top of the window it shows ⌥S so you will know what hot key caused the conflict. Then there is a list of each macro that has that hot key assigned to it.

Also note that the first letter of each macro name is in grey. When the “Conflict Palette” appears, you can press the corresponding letter to choose that macro, so H for “Hallway” for example.

You’ll note that that last two both start with the letter T. If you press the letter T when this “Conflict Palette” appears, it will then show you only those two items:

Screenshot of Keyboard Maestro's Smaller Conflict Palette

Now it shows the first unique letter to each macro: in this case it’s either J or R. So if I wanted to go to Tracey’s Room, I could press ⌥S then press T then press R.

However, if you look at the Keyboard Maestro Editor screenshot above, you can see that I have also assigned ⌥R and ⌥J to those rooms, so I can go to them directly by pressing those respective keys. You will note that I added [J] and [R] to the macro names to help me remember which keyboard shortcut to use to go directly to those rooms.

(It is not shown here, but I also assigned the hot key ⌥T to both of them, so if I press that it will bring up the second “Conflict Palette” showing just those two rooms.)

This intentional use of the “Conflict Palette” can come in very handy when using Keyboard Maestro to create these floating menu items which you can select with your keyboard.

It’s also a way to make the Home.app slightly less terrible.


Short URL for this post https://luo.ma/km-home-app

Trying to make a Virtual Machine from Apple’s recent DMG releases of Mac OS X

Scroll down to “Update and Solution” to see how to get this to work.


Apple recently released new installers for Mac OS X/OS X/mac OS to deal with expired certificates:

If an installer says it can’t be verified or was signed with a certificate that has expired – Apple Support

Three of the six are links to the Mac App Store:

The other three are URLs to download DMGs:

Today I tried (and failed) to create a new Virtual Machine in either Parallels or VMware Fusion using one of these DMGs, specifically, the El Capitan one.

I will explain what I did, and where I got stuck, in the hopes that someone else might figure out what I did wrong and point me in the right direction.

Download the DMG

Apple has created three DMGs for Yosemite, El Capitan, and Sierra, but couldn’t be bothered to give them useful names, so Yosemite and El Capitan are called ‘InstallMacOSX.dmg’ and Sierra is ‘InstallOS.dmg’.

Likewise the DMGs aren’t named usefully when you mount them either, so make sure you name the DMGs well when you download them to avoid confusion. Here’s how to download it and rename it at the same time

curl --fail --location --continue-at - --output "$HOME/Downloads/InstallElCapitan.dmg" \
"http://updates-http.cdn-apple.com/2019/cert/061-41424-20191024-218af9ec-cf50-4516-9011-228c78eda3d2/InstallMacOSX.dmg"

Mount the DMG

Open the ‘~/Downloads/InstallElCapitan.dmg’

That will leave you with

“/Volumes/Install OS X/InstallMacOSX.pkg”

Extract the App

Don’t try to install from that .pkg file, it probably won’t work unless the Mac you’re using is capable of running El Capitan:

Instead, open it with Suspicious Package which will let you examine the contents of the .pkg file, as shown here:

Note the area in the red box. Obviously that’s not the full installer, despite the .dmg being over 6 GB. But let’s export it anyway:

Save it to /Applications/ (or wherever you prefer, but that’s where I’ll assume it is for the rest of these instructions).

Don’t eject “/Volumes/Install OS X/InstallMacOSX.pkg” yet, we still need to get the actual .dmg from it.

Get the other DMG

Download The Archive Browser if you don’t already have it (it’s free!) and use it to open “/Volumes/Install OS X/InstallMacOSX.pkg”.

It will look like this:

Click on the triangle to the left of “InstallMaxOSX.pkg” to reveal its contents, and select the “InstallESD.dmg” file from it.

Once it is selected, choose “Extract Selected” from the bottom-left. Save it to ~/Downloads/ (it won’t be staying there long).

Ok, this part could be confusing…

When The Archive Browser exports the file, it will not just export the “InstallESD.dmg” file. First it creates a folder “InstallMacOSX” and then it created “InstallMacOSX.pkg” inside that folder, and the “InstallESD.dmg” file is put inside the .pkg… but you can’t see it, because the .pkg file won’t let you open it.

That’s OK, because we’re going to use Terminal.app to move the file into place anyway.

First we need to create a directory inside the ‘Install OS X El Capitan.app’ which we previously saved to /Applications/. We’re going to use the same folder for two commands and we want to make sure we get it exactly right both times, so we’ll make it a variable:

DIR='/Applications/Install OS X El Capitan.app/Contents/SharedSupport'

Then use the variable with mkdir to create the folder:

mkdir -p "$DIR"

and then we need to move the “InstallESD.dmg” file into that folder

mv -vn "$HOME/Downloads/InstallMacOSX/InstallMacOSX.pkg/InstallESD.dmg" "$DIR"

Note: you probably want to trash the ‘~/Downloads/InstallMacOSX/InstallMacOSX.pkg’ (and its parent folder) now that it is empty, to avoid confusion later

mv -vn "$HOME/Downloads/InstallMacOSX/" "$HOME/.Trash/"

Now if you look at the ‘Install OS X El Capitan.app’ in the Finder, it should show itself as 6.21 GB:

open -R  '/Applications/Install OS X El Capitan.app'

So close, and yet…

VMWare was willing to start trying to make a virtual machine using the app, but it failed when it came to the actual installation part:

I don’t know what to try next. Parallels would not use either the ‘Install OS X El Capitan.app’ or the ‘InstallESD.dmg’ to try to create a new virtual machine.


Update and Solution

I posted a question on the VMware Fusion support forum asking how to do this, and someone came up with a very clever solution, which I will replicate here in case others are interested. The idea is simple, but I never would have thought of it.

  1. Create a virtual machine of any version of macOS, even the current version that you are using on your Mac.

  2. Inside the VM, download the .dmg (see below) and mount it.

  3. Launch the .pkg inside the .dmg.

  4. The .pkg seems to understand that it is inside a VM, and will install the app, which it would not do outside of the VM. Note that the Installer.app says that it will only take a few megabytes, but that is incorrect.

  5. Find the “Install OS X El Capitan.app” (or whatever the app name is) in the /Applications/ folder inside the VM. It should be over 6 GB in size.

  6. Copy the “Install….app” from the VM out to your actual Mac.

  7. Create a new VM using the “Install….app” from the /Applications/ folder on your Mac.

Step #4 is the part that I never would have guessed. The .pkg would not install the app outside of a VM, but will install it inside of a VM.

This worked perfectly with the El Capitan .dmg file, and I’m currently doing the same with Yosemite and Sierra. Then I’ll try the older versions of Mac OS X from old installers that I have from before they disappeared from Apple’s servers.

Update 2

Turns out that Rich Trouton wrote about this technique back in early 2017:

Downloading older OS installers on incompatible hardware using VMs | Der Flounder

But I wasn’t working with VMs at the time, so I must not not stored that in my long-term memory.

Update 3

I had saved the older installers for Lion, Mountain Lion, and Mavericks, which are no longer available for download.

Each of them still installed as a VM. Apparently they were not signed with the certificates that expired.

Older versions of Mac OS X (10.6.8 and before) are not available to virtualize.