I use mutt as mail client at home and at work and I’m quite happy with it. One thing that bugs me though is the built-in alias support. Its email address completion is rather limited. Luckily, mutt supports QueryCommand that can be used to connect an arbitrary data source for external email address completion. I use a tiny wrapper for grep to search multiple alias files at once:

#!/bin/sh
# Search all alias files and sort by name.

echo "Search results for »$1«"
grep --ignore-case --no-filename "$1" $HOME/.mutt/aliases/*.aliases | sort --key=2,2

The query_command option in mutt must be set accordingly to use the script:

set query_command="~/.mutt/scripts/alias-query '%s'"

Mutt and the above script expect an alias file to be in the mutt query format. This format is rather simple and looks as follows (described here):

<email address> <tab> <long name> <tab> <other info> <newline>

Most of my alias files are autogenerated using various scripts. One of those scripts connects to an LDAP server, finds the name and the email address of all company employees and converts them to the mutt query format described above (tested on Exchange):

#!/bin/sh
# Collect data from an LDAP server and convert to mutt query format.
# NOTE: This script interactively asks for the LDAP password.

set -e
set -u

# Configuration
LDAP_HOST="192.168.1.1"
LDAP_USER="DOMAIN\\USERNAME"
LDAP_BASE="OU=SBSUsers,OU=Users,OU=MyBusiness,DC=DOMAIN,DC=TLD"
MUTT_INFO="TheOtherInfoField"

ldapsearch -LLL -h "$LDAP_HOST" -D "$LDAP_USER" -W \
  -x -b "$LDAP_BASE" "(mail=*)" cn mail | \
  sed -n "/^cn:/ {N; s/^cn: \(.*\)\nmail: \(.*\)$/\2\t\1\t$MUTT_INFO/p}"

Have fun.