How to make this query use my multicolumn index?
The expression lower(name::text) is not covered by your index, which also does not seem to be useful at all, at least for what we see in your question:


CREATE INDEX crm_customer_big_index 
    ON crm_customer (name ASC, 
                     name text_pattern_ops, 
                     (id::text) text_pattern_ops, 
                     phone text_pattern_ops, 
                     mail text_pattern_ops, 
                     rating);


This index would cover your query:

CREATE INDEX crm_customer_foo_index ON crm_customer (
  rating
, lower(name::text) text_pattern_ops
, address_id);  -- for the join


To optimize, I suggest to adapt your query additionally:

SELECT * 
FROM   customer_list
WHERE  lower(name::text) LIKE 'env%' 
AND    rating = 3 
ORDER  BY lower(name::text), name
LIMIT  20;

Also, if you are only interested in the first few characters of name character varying(100), make the index shorter and faster by just indexing those first few characters:

CREATE INDEX crm_customer_foo_index ON crm_customer (
  rating
, lower(left(name::text, 7)) text_pattern_ops  -- example with local optimum
, address_id);  -- for the join


The query must match the index expression:

WHERE  lower(left(name::text, 7)) LIKE 'env%' 
...
ORDER  BY lower(left(name::text, 7)), name


Not sure if the view is in the way somehow. But it should be transparent.  

I wouldn't use varchar(n) at all. Just text:


Should I add an arbitrary length limit to VARCHAR columns?


About pattern matching and text_pattern_ops:


Pattern matching with LIKE, SIMILAR TO or regular expressions in PostgreSQL


Why did I put rating first in the index?


Multicolumn index and performance


There are query techniques to better capitalize on non-leading index columns. Consider the Postgres Wiki on "Loose indexscan".