Register with Facebook sometimes doesn't provide email

Solution 1:

Just a guess...

The facebook documentation says:

note: this field will not be returned if no valid email address is available for the user

Source: https://developers.facebook.com/docs/reference/api/user/

So when an email address become invalid (users who haven't used facebook in years and have destroyed/changed their email address since for example), facebook may stop returning this field.

5% of invalid address may sounds big, but if I check my facebook friends, I think more than 5% of them never use their account, and I wouldn't be surprised if the address they used when they signed in is now invalid.

Solution 2:

Users don't always have to provide an email address in order to use Facebook. They can also sign up via SMS, though it's far less common.

In short, FB won't always have an email address, so can't serve it to your app.

Solution 3:

Try:

// Just to make sure email are permitted
//$facebook->getLoginUrl(array('req_perms' => 'email'))

// Request email
FB.api('/me?scope=email', function(response) { /*...*/ });

Or:

$email = $facebook->api('user_id?fields=email');

PROBLEMS:

  • The user changed the visibility of its email address to "only me" and thus you have no way to get it.
  • The user registered with SMS instead of email as mentioned in the previous answer.

ALTERNATIVE:

If you absolutely need to contact the user but you cannot get its email address nyou can still get its Facebook email (everybody has this email): "[email protected]".

If the user uses a POP server he will directly receive the email in GMail or others, if not he will receive your email as a private message. The only drawback if this method is that your email must be "plain/text" and not "HTML".

Solution 4:

One thing is Users don't always have to provide an email address in order to use Facebook(could have registered through mobile)- as mentioned by Colm. Apart from this-

Please check that if the user has definitely granted you the email extended permission or it hasn't subsequently been revoked. To have a check on this you could use the permissions api-

/USER/permissions