Get attachments from .msg files using Ruby

A colleague had a lot of .msg and .msg.pst email files where they needed to extract the attachments from them, Ruby to the rescue!

I used the msg gem from

I put all the files in a directory called emails/ and when the script is done running it will output the attachments to a directory named attachments/.

require 'bundler/inline'
gemfile do
  source ''

  # We're using a git reference here because is 
  # only fixed in master
  gem 'ruby-msg', github: 'aquasync/ruby-msg', ref: '34fb32e43e29b3d5fa535537faf7123a176146a8'

require 'mapi/msg'
require 'fileutils'

directory_path = 'attachments'
FileUtils.rm_rf(directory_path) if Dir.exist?('attachments')

Dir.glob(File.join('emails', '*.{msg,msg.pst}')).each_with_index do |msg_file, mindex|
  puts "Processing #{msg_file}"

  msg =
  msg.attachments.each_with_index do |a, aindex|
    attachment_location = File.join('attachments', "#{mindex}-#{aindex}-#{File.basename(a.filename || 'attachment')}")
    raise if File.exist?(attachment_location)
    puts ".. output: #{attachment_location}", 'wb'))
    puts ''


Now read this

Optimizing bicycling routes with OpenStreetMap and APIs

(There’s a video version of this article available here, where we also do a deep dive into the code behind it, remember to turn on subtitles): I’ve started playing with data from OpenStreetMap (OSM). It started with me trying to fetch... Continue →