after looking through qmail logs, I've realized one of the reasons so many people complain about not receiving registration emails (making you imagine how many don't either but never complain).
Some (many actually) email providers, when they receive a mail, verify the sender email actually exists. The thing is, the sender email they verify is not the one in the mail headers (that one is filled by MU), it's the user that's actually used to send the email by your program (typically qmail).
And the other thing is, in most default installations, this user is not extracted from the mail headers by the mail() system function, it just uses "anonymous@yourdomain.com".
When the targetted email provider verifies the address, since anonymous@yourdomain.com doesn't exist, they consider the mail as spam and don't deliver.
Something like this would appear in your mail log:
@40000000460ce431178199dc info msg 331697: bytes 766 from qp 13103 uid 81
@40000000460ce43117e65ebc starting delivery 21704: msg 331697 to remote user@domain.com
@40000000460ce43117e662a4 status: local 0/10 remote 1/20
@40000000460ce4323a987b0c delivery 21704: failure: 80.168.44.11_does_not_like_recipient./Remote_host_said:_550-Verification_failed_for _/550-Called:___91.121.0.194/550-Sent:_____RCPT_TO:/550-Response:_511_sorry,_no_mailbox_here_by_that_name_(#5.1.1_-_chkuser)/550_Sender_verify_failed/Giving_up_on_80.168.44.11./STARTTLS_proto=TLSv1;_cipher=DHE-RSA-AES256-SHA;_subject=/C=GB/ST=UK/L=London/O=Amen/OU=Systems/CN= mx-vh.amenworld.com/emailAddress=support@amenworld.com;_issuer=/C=GB/ST=UK/L=London/O=Amen/OU=Systems/CN=mx-vh.amenworld.com/emailAddress=support@amenworld.com;/
@40000000460ce4323a9886c4 status: local 0/10 remote 0/20
@40000000460ce43302432b94 bounce msg 331697 qp 13106
What to do ? You can either configure your mail program with touse a default (existing) user. The problem then is that a difference between this user and the one in headers might trigger another spam filter, and MU uses multiple users to send emails.
Or, you can modify the wp_mail function so that it passes another argument to php's mail() that forces the user.
My wp_mail function looks something like this now (in pluggable.php):
if ( !function_exists('wp_mail') ) :
function wp_mail($to, $subject, $message, $headers = '',$sender='') {
if( $headers == '' ) {
$headers = "MIME-Version: 1.0\n" .
"From: info@unblog.fr\n" .
"Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
}
if($sender=='') {
return @mail($to, $subject, $message, $headers, '-finfo@unblog.fr');
} else {
return @mail($to, $subject, $message, $headers,'-f'.$sender);
}
}
endif;
the '-finfo@unblog.fr' is the piece that specifies the user to mail(). The function above is modified so that it uses a default email if no headers are provided. MU doesn't pass the sender by default (only the full headers). I've made the choice myself to add an extra parameter to the function and to modify the various calls that are made to this function throughout the code to add the sender to the call. You can parse headers in wp_mail if you prefer having all changes in one location. It'd be nice if this was the default behaviour in MU.
Anyway, just a heads up.