Gift Guide

Exim: The Mail Transfer Agent


Exim delivers electronic mail, both local and remote. It has all the virtues of a good postman: it's easy to talk to, reliable, efficient, and eager to accommodate even the most complex special requests. It's the default mail transport agent installed on some Linux systems, runs on many versions of Unix, and is suitable for any TCP/IP network with any combination of hosts and end-user mail software.Exim is growing in popularity because it is open source, scalable, and rich in ...

See more details below
Other sellers (Paperback)
  • All (18) from $1.99   
  • New (6) from $11.34   
  • Used (12) from $1.99   
Exim: The Mail Transfer Agent: The Mail Transfer Agent

Available on NOOK devices and apps  
  • NOOK Devices
  • Samsung Galaxy Tab 4 NOOK 7.0
  • Samsung Galaxy Tab 4 NOOK 10.1
  • NOOK HD Tablet
  • NOOK HD+ Tablet
  • NOOK eReaders
  • NOOK Color
  • NOOK Tablet
  • Tablet/Phone
  • NOOK for Windows 8 Tablet
  • NOOK for iOS
  • NOOK for Android
  • NOOK Kids for iPad
  • PC/Mac
  • NOOK for Windows 8
  • NOOK for PC
  • NOOK for Mac
  • NOOK for Web

Want a NOOK? Explore Now

NOOK Book (eBook)
$19.99 price
(Save 44%)$35.99 List Price


Exim delivers electronic mail, both local and remote. It has all the virtues of a good postman: it's easy to talk to, reliable, efficient, and eager to accommodate even the most complex special requests. It's the default mail transport agent installed on some Linux systems, runs on many versions of Unix, and is suitable for any TCP/IP network with any combination of hosts and end-user mail software.Exim is growing in popularity because it is open source, scalable, and rich in features such as the following:

  • Compatibility with the calling interfaces and options of Sendmail (for which Exim is usually a drop-in replacement)
  • Lookups in LDAP servers, MySQL and PostgreSQL databases, and NIS or NIS+ services
  • Support for many kinds of address parsing, including regular expressions that are compatible with Perl 5
  • Sophisticated error handling
  • Innumerable tuning parameters for improving performance and handling enormous volumes of mail
Best of all, Exim is easy to configure. You never have to deal with ruleset 3 or worry that a misplaced asterisk will cause an inadvertent mail bomb.While a basic configuration is easy to read and can be created quickly, Exim's syntax and behavior do get more subtle as you enter complicated areas like virtual hosting, filtering, and automatic replies. This book is a comprehensive survey that provides quick information for people in a hurry as well as thorough coverage of more advanced material.
Read More Show Less

Product Details

  • ISBN-13: 9780596000981
  • Publisher: O'Reilly Media, Incorporated
  • Publication date: 7/16/2001
  • Edition number: 1
  • Pages: 640
  • Product dimensions: 7.04 (w) x 9.22 (h) x 1.16 (d)

Meet the Author

Philip Hazel has a Ph.D. in applied mathematics, but has spent the last 30 years writing general-purpose software for the Computing Service at the University of Cambridge in England. Since moving from an IBM mainframe to Unix about ten years ago, he has gotten more and more involved with email. Philip started developing Exim in 1995 and is its sole author.

Read More Show Less

Read an Excerpt


Delivery Errors and Retrying

This chapter is all about temporary delivery errors, and how Exim deals with them. In an ideal world, every message would either be delivered at the first attempt, or be bounced, and temporary errors would not arise. In the real world, this does not happen; hosts are down from time to time, or are not responding, and network connections fail. An NITA has to be prepared to hold on to messages for some time, while trying every now and again to deliver them. Some rules are needed for deciding how often the retrying is to occur, and when to give up because the retrying has been going on for too long.

A related topic is how to handle messages destined for hosts that are connected to the Internet only intermittently (for example, by dial-up lines). In this case, incoming messages have to be kept on some server host because they cannot be delivered immediately. Exim was not designed for this, and is not ideal for it, but because it is being used in such circumstances, the final section of this chapter discusses how it can best be configured.

Retrying After Errors

Delivering a message costs resources, so it is a good idea not to retry unreasonably often. Trying to deliver a failing message every minute for several days, for example, is not sensible. Even trying as often as every 15 minutes is wasteful over a long period. Furthermore, if one message has just suffered a temporary connection failure, immediately trying to deliver another message to the same host is also a waste of resources.

A number of MTAs use message-based retrying; that is, they apply a retry schedule to each message independently. This can cause hosts to be tried several times in quick succession. Exim is not like this; for failures that are not related to a specific message, it uses host-based retrying, which means that if a host fails, all messages that are routed to it are delayed until its next retry time arrives.

In fact, Exim normally bases these retry operations on the failing IP address, rather than the hostname. If a host has more than one IP address, each is treated independently as far as retrying is concerned. In the discussion that follows, we use the word "host" when talking about remote delivery errors to make it easier to read. It should be understood, however, that this refers to a single IP address, so that a host with several network interfaces is, in effect, treated as several independent hosts.

Information about temporary delivery failures is kept in a hints database called retry in the db subdirectory of Exim's spool directory. You can read the contents of this if you want to, using the exim_dumpdb or exinext utilities, which are described in Chapter 21, Administering Exim. The information includes details of the error, the time of the first failure, the time of the most recent failure, and the time before which it is not reasonable to try again.

Exim uses a set of configurable retry rules in the fifth section of the configuration file for deciding when next to try a failing delivery. These rules allow you to specify fixed or increasing retry intervals, or a combination of the two. Details of the rules are given later in this chapter, after the different kinds of error are described.

Remote Delivery Errors

Most, but not all, delays and retries are concerned with deliveries to remote hosts. Three different kinds of error are recognized during a remote delivery: host errors, message errors, and recipient errors.

Host Errors

A host error is not associated with a particular message, nor with a particular recipient of a message. The host errors are as follows:

  • Refusal of connection to a remote host.
  • Timeout of a connection attempt.
  • An error code in response to setting up a connection.
  • An error code in response to HELo or EH,o.
  • Loss of connection at any time, except after the final dot that ends a message.
  • I/O errors at any time.
  • Timeout during the SMTP session, other than in response to rrAIL, RCPT or the dot at the end of the data.

When a permanent SMTP error code (5xoc) is given at the start of a connection or in response to a HEw or EHLo command, all the addresses that are routed to the host are failed, and returned to the sender in a bounce message.

The other kinds of host error are treated as temporary, and they cause all addresses routed to the host to be deferred. Retry data is created for the host, and it is not tried again, for any message, until its retry time arrives. If the current set of addresses are not all delivered to some backup host by this delivery process, the message is added to a list of those waiting for the failing host. This is a hint that Exim uses if it makes a subsequent successful delivery to the host. It checks to see if there are any other messages waiting for the host, and if so, sends them down the same SMTP connection.

Message Errors

A message error is associated with a particular message when sent to a particular host, but not with a particular recipient of the message. The message errors are as follows:

  • An error code in response to MAIL, DATA, or the dot that terminates the data.
  • Timeout after sending MAIL.
  • Timeout or loss of connection after the dot that terminates the data. A timeout after the DATA command itself is treated as a host error, as is loss of connection at any other time.
For a temporary message error, all addresses that are routed to the host are deferred. Retry data is not created for the host, but instead, a retry record for the combination of a host plus a message ID is created. The message is not added to the list of those waiting for this host. This ensures that the failing message will not be sent to this host again until the retry time arrives. However, other messages that are routed to the host are not affected, so if it is some property of the message that is causing the error, this does not stop the delivery of other mail.

If the remote host specifies support for the SzzE parameter in its response to EHW, Exim adds szzE=rmn to the MAIL command, so an overlarge message causes a permanent message error, because it arrives as a response to MAIL. However, when SIZE is not in use, some hosts respond to unacceptably large messages by just dropping the connection. This leads to a temporary message error if it is detected after the whole message has been sent. Better behaved hosts give a permanent error return after the end of the message; this allows the message to be bounced without retries.

Recipient Errors

A recipient error is associated with a particular recipient of a message. The recipient errors are as follows:

  • An error code in response to RCPT
  • Timeout after RCPT
For temporary recipient errors, the failing address is deferred, and routing retry data is created for it. This delays processing of the address in subsequent queue runs, until its routing retry time arrives. The delay applies to all messages, but because it operates only in queue runs, one attempt is made to deliver a new message to the failing address before the delay starts to operate. This ensures that, if the failure is really related to the message rather than the recipient ("message too big for this recipient" is a possible example), other messages have a chance of being delivered. If a delivery to the address does succeed, the retry information is cleared, after which all stuck messages are tried again.

The message is not added to the list of those waiting for this host. Use of the host for other recipient addresses is unaffected, and except in the case of a timeout, other recipients are processed independently, and may be successfully delivered in the current SMTP session. After a timeout, it is, of course, impossible to proceed with the session, so all addresses are deferred. However, those other than the one that failed do not suffer any subsequent retry delays. Therefore, if one recipient is causing trouble, the others have a chance of getting through when a subsequent delivery attempt occurs before the failing recipient's retry time.

Problems of Error Classification

Some hosts have been observed to give temporary error responses to every rAiL command at certain times ("insufficient space" has been seen). These are treated as message errors. It would be nice if such circumstances could be recognized instead as host errors, and retry data for the host itself created, but this is not possible within the current Exim design. What actually happens is that retry data for every (host, message) combination is created.

The reason that timeouts after MAIL and RCPT are treated specially is that these can Ssometimes arise as a result of the remote host's verification procedures taking a very long time. Exim makes this assumption, and treats them as if a temporary error response had been received. A timeout after the final dot is treated specially because it is known that some broken implementations fail to recognize the end of the message if the last character of the last line is a binary zero. Thus, is it helpful to treat this case as a message error.

Timeouts at other times are treated as host errors, assuming a problem with the host, or the connection to it. If a timeout after MAIL, RCS, or the final dot is really a connection problem, the assumption is that at the next try, the timeout is likely to occur at some other point in the dialog, causing it to be treated as a host error.

There is experimental evidence that some MTAs drop the connection after the terminating dot if they do not like the contents of the message for some reason. This is in contravention of the RFC, which indicates that a 5xoc response should be given. That is why Exim treats this case as a message error rather than a host error, in order not to delay other messages to the same host.

Delivery to Multiple Hosts

In all cases of temporary delivery error, if there are other hosts (or IP addresses) available for the current set of addresses (for example, from multiple MX records), they are tried in this run for any undelivered addresses, subject of course to their own retry data. This means that newly created recipient error retry data does not affect the current delivery process; instead, it takes effect the next time a delivery process for the message is run.....

Read More Show Less

Table of Contents

Organization of the Book;
Conventions Used in This Book;
Comments and Questions;
Chapter 1: Introduction;
Chapter 2: How Internet Mail Works;
2.1 Different Types of MTA;
2.2 Internet Message Standards;
2.3 RFC 822 Message Format;
2.4 The Message “On the Wire”;
2.5 Summary of the SMTP Protocol;
2.6 Forgery;
2.7 Authentication and Encryption;
2.8 Routing a Message;
2.9 Checking Incoming Mail;
2.10 Overview of the DNS;
2.11 DNS Records Used for Mail Routing;
2.12 Related DNS Records;
2.13 Common DNS Errors;
2.14 Role of the Postmaster;
Chapter 3: Exim Overview;
3.1 Exim Philosophy;
3.2 Exim’s Queue;
3.3 Receiving and Delivering Messages;
3.4 Exim Processes;
3.5 Coordination Between Processes;
3.6 How Exim Is Configured;
3.7 How Exim Delivers Messages;
3.8 Local and Remote Addresses;
3.9 Processing an Address;
3.10 A Simple Example;
3.11 Complications While Directing and Routing;
3.12 Complications During Delivery;
3.13 Complications After Delivery;
3.14 Use of Transports by Directors and Routers;
Chapter 4: Exim Operations Overview;
4.1 How Exim Identifies Messages;
4.2 Watching Exim at Work;
4.3 The Runtime Configuration File;
4.4 The Default Qualification Domain;
4.5 Handling Frozen Bounce Messages;
4.6 Reducing Activity at High Load;
4.7 Limiting Message Sizes;
4.8 Parallel Remote Delivery;
4.9 Controlling the Number of Delivery Processes;
4.10 Large Message Queues;
4.11 Large Installations;
Chapter 5: Extending the Delivery Configuration;
5.1 Multiple Local Domains;
5.2 Virtual Domains;
5.3 Mailing Lists;
5.4 Using an External Local Delivery Agent;
5.5 Multiple User Addresses;
5.6 Mixed Local/Remote Domains;
5.7 Delivering to UUCP;
5.8 Ignoring the Local Part in Local Deliveries;
5.9 Handling Local Parts in a Case-Sensitive Manner;
5.10 Scanning Messages for Viruses;
5.11 Modifying Message Bodies;
Chapter 6: Options Common to Directors and Routers;
6.1 Conditional Running of Routers and Directors;
6.2 Changing a Driver’s Successful Outcome;
6.3 Adding Data for Use by Transports;
6.4 Debugging Directors and Routers;
6.5 Summary of Director/Router Generic Options;
Chapter 7: The Directors;
7.1 Conditional Running of Directors;
7.2 Optimizing Single-Level Aliasing;
7.3 Adding Data for Use by Transports;
7.4 The aliasfile and forwardfile Directors;
7.5 The aliasfile Director;
7.6 The forwardfile Director;
7.7 The localuser Director;
7.8 The smartuser Director;
Chapter 8: The Routers;
8.1 Timeouts While Routing;
8.2 Domains That Route to the Local Host;
8.3 The lookuphost Router;
8.4 The domainlist Router;
8.5 The ipliteral Router;
8.6 The queryprogram Router;
Chapter 9: The Transports;
9.1 Options Common to All Transports;
9.2 The smtp Transport;
9.3 Environment for Local Transports;
9.4 Options Common to the appendfile and pipe Transports;
9.5 The appendfile Transport;
9.6 The pipe Transport;
9.7 The lmtp Transport;
9.8 The autoreply Transport;
Chapter 10: Message Filtering;
10.1 Examples of Filter Commands;
10.2 Filtering Compared with an External Delivery Agent;
10.3 Setting Up a User Filter;
10.4 Setting Up a System Filter;
10.5 Testing Filter Files;
10.6 Format of Filter Files;
10.7 Significant Actions;
10.8 Filter Commands;
10.9 The add Command;
10.10 Delivery Commands;
10.11 Mail Commands;
10.12 Logging Commands;
10.13 The testprint Command;
10.14 The finish Command;
10.15 Obeying Filter Commands Conditionally;
10.16 Additional Features for System Filters;
Chapter 11: Shared Data and Exim Processes;
11.1 Message Files;
11.2 Locking Message Files;
11.3 Hints Files;
11.4 Log Files;
11.5 User and Group IDs for Exim Processes;
11.6 Process Relationships;
11.7 The Daemon Process;
11.8 Reception Processes;
11.9 Queue Runner Processes;
11.10 Delivery Processes;
11.11 Summary of Message Handling Process Types;
11.12 Other Types of Process;
Chapter 12: Delivery Errors and Retrying;
12.1 Retrying After Errors;
12.2 Remote Delivery Errors;
12.3 Local Delivery Errors;
12.4 Routing and Directing Errors;
12.5 Retry Rules;
12.6 Computing Retry Times;
12.7 Using Retry Times;
12.8 Retry Rule Examples;
12.9 Timeout of Retry Data;
12.10 Long-Term Failures;
12.11 Ultimate Address Timeout;
12.12 Intermittently Connected Hosts;
Chapter 13: Message Reception and Policy Controls;
13.1 Message Sources;
13.2 Message Size Control;
13.3 Messages from Local Processes;
13.4 Unqualified Addresses from Remote Hosts;
13.5 Checking a Remote Host;
13.6 Checking Remote Sender Addresses;
13.7 Checking Recipient Addresses;
13.8 Checking Header Line Syntax;
13.9 Relay Control;
13.10 Customizing Prohibition Messages;
13.11 Incoming Message Processing;
Chapter 14: Rewriting Addresses;
14.1 Automatic Rewriting;
14.2 Configured Rewriting;
14.3 Rewriting Rules;
14.4 Rewriting Patterns;
14.5 Rewriting Flags;
14.6 A Further Rewriting Example;
14.7 Testing Rewriting Rules;
Chapter 15: Authentication, Encryption, and Other SMTP Processing;
15.1 SMTP Authentication;
15.2 Encrypted SMTP Connections;
15.3 SMTP over TCP/IP;
15.4 Local SMTP;
15.5 Batched SMTP;
Chapter 16: File and Database Lookups;
16.1 Single-Key Lookup Types;
16.2 Query-Style Lookup Types;
16.3 Quoting Lookup Data;
16.4 NIS+;
16.5 LDAP;
16.6 MySQL and PostgreSQL;
16.7 DNS Lookups;
16.8 Implicit Keys in Query-Style Lookups;
16.9 Temporary Errors in Lookups;
16.10 Default Values in Single-Key Lookups;
16.11 Partial Matching in Single-Key Lookups;
16.12 Lookup Caching;
Chapter 17: String Expansion;
17.1 Variable Substitution;
17.2 Header Insertion;
17.3 Operations on Substrings;
17.4 Character Translation;
17.5 Text Substitution;
17.6 Conditional Expansion;
17.7 Lookups in Expansion Strings;
17.8 Extracting Fields from Substrings;
17.9 IP Address Masking;
17.10 Quoting;
17.11 Reexpansion;
17.12 Running Embedded Perl;
17.13 Testing String Expansions;
Chapter 18: Domain, Host, and Address Lists;
18.1 Negative Items in Lists;
18.2 List Items in Files;
18.3 Lookup Items in Lists;
18.4 Domain Lists;
18.5 Host Lists;
18.6 Address Lists;
Chapter 19: Miscellany;
19.1 Security Issues;
19.2 Privileged Users;
19.3 RFC Conformance;
19.4 Timestamps;
19.5 Checking Spool Space;
19.6 Control of DNS Lookups;
19.7 Bounce Message Handling;
19.8 Miscellaneous Controls;
Chapter 20: Command-Line Interface to Exim;
20.1 Input Mode Control;
20.2 Additional Message Data;
20.3 Immediate Delivery Control;
20.4 Error Routing;
20.5 Queue Runner Processes;
20.6 Configuration Overrides;
20.7 Watching Exim’s Queue;
20.8 Message Control;
20.9 Testing Options;
20.10 Options for Debugging;
20.11 Terminating the Options;
20.12 Embedded Perl Options;
20.13 Compatibility with Sendmail;
20.14 Calling Exim by Different Names;
Chapter 21: Administering Exim;
21.1 Log Files;
21.2 Log Destination Control;
21.3 Format of Main Log Entries;
21.4 Cycling Log Files;
21.5 Extracting Information from Log Files;
21.6 Watching What Exim is Doing;
21.7 The Exim Monitor;
21.8 Maintaining Alias and Other Datafiles;
21.9 Hints Database Maintenance;
21.10 Mailbox Maintenance;
Chapter 22: Building and Installing Exim;
22.1 Prerequisites;
22.2 Fetching and Unpacking the Source;
22.3 Configuration for Building;
22.4 The Building Process;
22.5 Installing Exim;
22.6 Testing Before Turning On;
22.7 Turning Exim On;
22.8 Installing Documentation in Info Format;
22.9 Upgrading to a New Release;
Summary of String Expansion;
Expansion Items;
Expansion Conditions;
Expansion Variables;
Regular Expressions;
Testing Regular Expressions;
Changing Matching Options;
Circumflex and Dollar;
Dot (Period, Full Stop);
Square Brackets;
POSIX Character Classes;
Vertical Bar;
Back References;
Once-Only Subpatterns;
Conditional Subpatterns;
Recursive Patterns;

Read More Show Less



Exim is a mail transfer agent (MTA) that can be run as an alternative to Sendmail on Unix systems.* Exim is open-source software that is distributed under the GNU General Public License (GPL), and it runs on all the most popular flavors of Unix and many more besides. A number of Unix distributions now include Exim as their default MTA.

I wrote Exim for use on medium-sized servers with permanent Internet connections in a university environment, but it is now used in a wide variety of different situations, from single-user machines on dial-up connections to clusters of servers supporting millions of customers at some large ISP sites. The code is small (between 500 KB and 1.2 MB on most hardware, depending on the compiler and which optional modules are included), and its performance scales well.

The job of a mail transfer agent is to receive messages from different sources and to deliver them to their destinations, potentially in a number of different ways. Exim can accept messages from remote hosts using SMTPt over TCP/IP, and as well as from local processes. It handles local deliveries to mailbox files or to pipes attached to commands, as well as remote SMTP deliveries to other hosts. Exim consists of support for the new IPv6 protocol in its TCP/IP functions, as well as for the current IPv4 protocol. It does not directly support UUCP, though it can be interfaced to other software that does, provided that UUCP "bang path" addressing is not required, because Exim supports only Internet-style, domain-based addressing.

Exim's configuration is flexible and can be set up to deal with a wide variety of requirements, including virtual domains and the expansion of mailing lists. Once you have grasped the general principles of how Exim works, you will find that the runtime configuration is straightforward and simple to set up. The configuration consists of a single file that is divided into a number of sections, and entries in each section that are keyword/value pairs. Regular expressions, compatible with Perl 5, are available for use in a number of options.

The configuration file can reference data from other files, in linear and indexed formats, and from NIS, NIS+, LDAP, MySQL, and PostgreSQL databases. It can also make use of online lists such as the Realtime Blackhole List (RBL).* By this means, you can make much of Exim's operation table-driven if desired. For example, it is possible to do local delivery on a machine on which the users do not have accounts. The ultimate flexibility can be obtained (at a price) by running a Perl interpreter while processing certain option strings.

You can use a number of different facilities for checking and controlling incoming messages. For example, the maximum size of messages can be specified, SMTP calls from specific hosts and networks (optionally from specific identifiers) can be locked out, as can incoming SMTP messages from specific senders You can identify blocked hosts explicitly, or via RBL lists, and you can control which hosts are permitted to use the Exim host as a relay for onward transmission of mail. The SMTP RUTH mechanism can be used to authenticate client hosts for this purpose.

End users are not normally concerned with which MTA is delivering into their mailboxes, but when Exim is in use, its filtering facility, which extends the power of the traditional .forward file, can be made available to them. A filter file can test various characteristics of a message, including the contents of the headers and the start of the body, and then direct delivery to specified addresses, files, or pipes according to what it finds. The filtering feature can also be used by the system administrator to inspect each message before delivery.

Like many MTAs, Exim has adopted the Sendmail command interface so that it can be a straight replacement for lusrlsbinlsendmail or lusrlliblsendmail. All the relevant Sendmail options are implemented. There are also some additional options that are compatible with Smail 3, and some further options that are specific to Exim.

Messages on the queue can be controlled by the use of certain privileged command-line options. There is also an optional monitor program called eximon, which displays current information in an X window, and contains interfaces to the command-line options.

Exim is not designed for storing mail for dial-up hosts. When the volumes of such mail are large, it is better to get the messages "delivered" into files (that is, off Exim's queue) and subsequently passed on to the dial-up hosts by other means.

There are some things that Exim does not do: it does not support any form of delivery status notification,* and it has no built-in facilities for modifying the bodies of messages. In particular, it never translates message bodies from one form of encoding to another.

The aim of this book is to explain how Exim works, and to give background and tutorial information on the core facilities that the majority of administrators will need to know about. Some options that are required only in very special circumstances are not covered. In any case, a book can never keep up with developing software; if you want to know exactly what is available in any given release, you should consult the reference manual and other documentation that is included in the distribution for that release.

Exim is still being developed in the light of experience, changing requirements, and feedback from users. This book was originally written to correspond to Release 3.16, but while it was being revised, additional facilities, such as support for LMTP and SSL/TLS, were added to Exim for the 3.20 release. Some references to these important new features have therefore been included in the book, which now covers all the major features of the 3.2x releases. No further functional enhancements to Exim 3 are planned, though in due course a new major release (Exim 4) is expected.

The Exim reference manual and a FAQ are online at the Exim web site, at and its mirrors. Here you will also find the latest release of Exim, as a source distribution. In addition to the plain text version that is included in the distribution, the manual can be downloaded in HTML (for faster browser access), in PostScript or PDF (for printing), and in Texinfo format for the info command.

Some versions of GNU/Linux are now being distributed with binary versions of Exim included. For this reason, I've left the material on building Exim from source until the end of the book, and concentrated on the runtime aspects first. If you are working with a binary distribution, make sure you have a copy of the text version of the reference manual that comes with the source distribution. It provides full coverage of every configuration option, and can easily be searched.

z The next chapter is a general discussion of the way email on the Internet works; Exim is hardly mentioned. This material has been included for the benefit of the many people who find themselves having to run a mail server without this essential background knowledge. You can skip to Chapter 3, Exim Overview if you already know about RFC 822 message format, SMTP, mail routing, and DNS usage.

Read More Show Less

Customer Reviews

Be the first to write a review
( 0 )
Rating Distribution

5 Star


4 Star


3 Star


2 Star


1 Star


Your Rating:

Your Name: Create a Pen Name or

Barnes & Review Rules

Our reader reviews allow you to share your comments on titles you liked, or didn't, with others. By submitting an online review, you are representing to Barnes & that all information contained in your review is original and accurate in all respects, and that the submission of such content by you and the posting of such content by Barnes & does not and will not violate the rights of any third party. Please follow the rules below to help ensure that your review can be posted.

Reviews by Our Customers Under the Age of 13

We highly value and respect everyone's opinion concerning the titles we offer. However, we cannot allow persons under the age of 13 to have accounts at or to post customer reviews. Please see our Terms of Use for more details.

What to exclude from your review:

Please do not write about reviews, commentary, or information posted on the product page. If you see any errors in the information on the product page, please send us an email.

Reviews should not contain any of the following:

  • - HTML tags, profanity, obscenities, vulgarities, or comments that defame anyone
  • - Time-sensitive information such as tour dates, signings, lectures, etc.
  • - Single-word reviews. Other people will read your review to discover why you liked or didn't like the title. Be descriptive.
  • - Comments focusing on the author or that may ruin the ending for others
  • - Phone numbers, addresses, URLs
  • - Pricing and availability information or alternative ordering information
  • - Advertisements or commercial solicitation


  • - By submitting a review, you grant to Barnes & and its sublicensees the royalty-free, perpetual, irrevocable right and license to use the review in accordance with the Barnes & Terms of Use.
  • - Barnes & reserves the right not to post any review -- particularly those that do not follow the terms and conditions of these Rules. Barnes & also reserves the right to remove any review at any time without notice.
  • - See Terms of Use for other conditions and disclaimers.
Search for Products You'd Like to Recommend

Recommend other products that relate to your review. Just search for them below and share!

Create a Pen Name

Your Pen Name is your unique identity on It will appear on the reviews you write and other website activities. Your Pen Name cannot be edited, changed or deleted once submitted.

Your Pen Name can be any combination of alphanumeric characters (plus - and _), and must be at least two characters long.

Continue Anonymously

    If you find inappropriate content, please report it to Barnes & Noble
    Why is this product inappropriate?
    Comments (optional)