title: PHP mail() fails to send mails | Postfix configuration | Apache 2 | Ubuntu 16.04
body: <p>First of all, sorry if this is a long post, I'm trying here to gather all the informations (I can recall) that people on other forums seemed to find important.</p>
  
  <p>Secondly I apologize if the answer to this post happened to be "obvious", but to make it simple I have absolutly no idea what I'm doing, this is the first time I try to do this.</p>
  
  <p>I'm trying to send mails with PHP mail(), but it fails every time when I do it at home even though it works just fine at my school (I use PHP7 both at school and at home, so I'm guessing it comes from my server configuration at home).</p>
  
  <p>I've tried many tutorials requesting to update this file and that other file, none of which seemed to have any positive impact on the result, so here's what I did so far:</p>
  
  <pre><code>sudo apt-get install postfix
  </code></pre>
  
  <p>I then selected "internet site" and "localhost" during the postfix configuration.</p>
  
  <p>I opened /etc/postfix/main.cf and changed the two following variables' values as some tutorials and forum answers suggested:</p>
  
  <pre><code>inet_interfaces = loopback-only
  inet_protocols = ipv4
  </code></pre>
  
  <p>I'll post both master.cf and main.cf bellow if it's of any help.</p>
  
  <p>I aslo changed /etc/hosts and added the following line</p>
  
  <pre><code>127.0.0.1   localhost localhost.localdomain facorreg
  </code></pre>
  
  <p>Here's the full /etc/hosts</p>
  
  <pre><code>127.0.0.1   localhost
  127.0.1.1   facorreg
  127.0.0.1   localhost localhost.localdomain facorreg
  
  # The following lines are desirable for IPv6 capable hosts
  ::1     ip6-localhost ip6-loopback
  fe00::0 ip6-localnet
  ff00::0 ip6-mcastprefix
  ff02::1 ip6-allnodes
  ff02::2 ip6-allrouters
  </code></pre>
  
  <p>I added the following line to sendmail.mc (I'll past the full file bellow):</p>
  
  <pre><code>DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')
  </code></pre>
  
  <p>Finally, I changed php.ini</p>
  
  <pre><code>sendmail_path = /usr/sbin/sendmail -t -i
  </code></pre>
  
  <p>Here's what /var/log/mail.log tells me when I try to send a mail to a yahoo address:</p>
  
  <pre><code>Nov 17 16:42:13 localhost postfix/pickup[6223]: C5925E20D41: uid=33 from=&lt;www-data&gt;
  Nov 17 16:42:13 localhost postfix/cleanup[8491]: C5925E20D41: message-id=&lt;20171117154213.C5925E20D41@facorreg.home&gt;
  Nov 17 16:42:13 localhost postfix/qmgr[6224]: C5925E20D41: from=&lt;www-data@facorreg.home&gt;, size=637, nrcpt=1 (queue active)
  Nov 17 16:42:14 localhost postfix/smtp[8493]: connect to mta6.am0.yahoodns.net[74.6.137.65]:25: No route to host
  Nov 17 16:42:14 localhost postfix/smtp[8493]: connect to mta5.am0.yahoodns.net[63.250.192.46]:25: No route to host
  Nov 17 16:42:14 localhost postfix/smtp[8493]: connect to mta5.am0.yahoodns.net[66.218.85.139]:25: No route to host
  Nov 17 16:42:14 localhost postfix/smtp[8493]: connect to mta7.am0.yahoodns.net[98.136.216.25]:25: No route to host
  Nov 17 16:42:14 localhost postfix/smtp[8493]: connect to mta7.am0.yahoodns.net[98.138.112.33]:25: No route to host
  Nov 17 16:42:14 localhost postfix/smtp[8493]: C5925E20D41: to=&lt;facorreg@yahoo.com&gt;, relay=none, delay=0.64, delays=0.25/0.09/0.29/0, dsn=4.4.1, status=deferred (connect to mta7.am0.yahoodns.net[98.138.112.33]:25: No route to host)
  </code></pre>
  
  <p>That's pretty much it.</p>
  
  <p>Here are some complementary information, I don't know if they will be useful:</p>
  
  <p>main.cf:</p>
  
  <pre><code># See /usr/share/postfix/main.cf.dist for a commented, more complete version
  
  
  # Debian specific:  Specifying a file name will cause the first
  # line of that file to be used as the name.  The Debian default
  # is /etc/mailname.
  #myorigin = /etc/mailname
  
  smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
  biff = no
  
  # appending .domain is the MUA's job.
  append_dot_mydomain = no
  
  # Uncomment the next line to generate "delayed mail" warnings
  #delay_warning_time = 4h
  
  readme_directory = no
  
  # TLS parameters
  smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
  smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
  smtpd_use_tls=yes
  smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
  smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
  
  # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
  # information on enabling SSL in the smtp client.
  
  smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
  myhostname = facorreg.home
  alias_maps = hash:/etc/aliases
  alias_database = hash:/etc/aliases
  mydestination = $myhostname, localhost, facorreg, localhost.localdomain, localhost
  relayhost = 
  mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
  mailbox_size_limit = 0
  recipient_delimiter = +
  inet_interfaces = loopback-only
  inet_protocols = ipv4
  </code></pre>
  
  <p>master.cf:</p>
  
  <pre><code>#
  # Postfix master process configuration file.  For details on the format
  # of the file, see the master(5) manual page (command: "man 5 master" or
  # on-line: http://www.postfix.org/master.5.html).
  #
  # Do not forget to execute "postfix reload" after editing this file.
  #
  # ==========================================================================
  # service type  private unpriv  chroot  wakeup  maxproc command + args
  #               (yes)   (yes)   (no)    (never) (100)
  # ==========================================================================
  smtp      inet  n       -       y       -       -       smtpd
  #smtp      inet  n       -       y       -       1       postscreen
  #smtpd     pass  -       -       y       -       -       smtpd
  #dnsblog   unix  -       -       y       -       0       dnsblog
  #tlsproxy  unix  -       -       y       -       0       tlsproxy
  #submission inet n       -       y       -       -       smtpd
  #  -o syslog_name=postfix/submission
  #  -o smtpd_tls_security_level=encrypt
  #  -o smtpd_sasl_auth_enable=yes
  #  -o smtpd_reject_unlisted_recipient=no
  #  -o smtpd_client_restrictions=$mua_client_restrictions
  #  -o smtpd_helo_restrictions=$mua_helo_restrictions
  #  -o smtpd_sender_restrictions=$mua_sender_restrictions
  #  -o smtpd_recipient_restrictions=
  #  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  #  -o milter_macro_daemon_name=ORIGINATING
  #smtps     inet  n       -       y       -       -       smtpd
  #  -o syslog_name=postfix/smtps
  #  -o smtpd_tls_wrappermode=yes
  #  -o smtpd_sasl_auth_enable=yes
  #  -o smtpd_reject_unlisted_recipient=no
  #  -o smtpd_client_restrictions=$mua_client_restrictions
  #  -o smtpd_helo_restrictions=$mua_helo_restrictions
  #  -o smtpd_sender_restrictions=$mua_sender_restrictions
  #  -o smtpd_recipient_restrictions=
  #  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  #  -o milter_macro_daemon_name=ORIGINATING
  #628       inet  n       -       y       -       -       qmqpd
  pickup    unix  n       -       y       60      1       pickup
  cleanup   unix  n       -       y       -       0       cleanup
  qmgr      unix  n       -       n       300     1       qmgr
  #qmgr     unix  n       -       n       300     1       oqmgr
  tlsmgr    unix  -       -       y       1000?   1       tlsmgr
  rewrite   unix  -       -       y       -       -       trivial-rewrite
  bounce    unix  -       -       y       -       0       bounce
  defer     unix  -       -       y       -       0       bounce
  trace     unix  -       -       y       -       0       bounce
  verify    unix  -       -       y       -       1       verify
  flush     unix  n       -       y       1000?   0       flush
  proxymap  unix  -       -       n       -       -       proxymap
  proxywrite unix -       -       n       -       1       proxymap
  smtp      unix  -       -       y       -       -       smtp
  relay     unix  -       -       y       -       -       smtp
  #       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
  showq     unix  n       -       y       -       -       showq
  error     unix  -       -       y       -       -       error
  retry     unix  -       -       y       -       -       error
  discard   unix  -       -       y       -       -       discard
  local     unix  -       n       n       -       -       local
  virtual   unix  -       n       n       -       -       virtual
  lmtp      unix  -       -       y       -       -       lmtp
  anvil     unix  -       -       y       -       1       anvil
  scache    unix  -       -       y       -       1       scache
  #
  # ====================================================================
  # Interfaces to non-Postfix software. Be sure to examine the manual
  # pages of the non-Postfix software to find out what options it wants.
  #
  # Many of the following services use the Postfix pipe(8) delivery
  # agent.  See the pipe(8) man page for information about ${recipient}
  # and other message envelope options.
  # ====================================================================
  #
  # maildrop. See the Postfix MAILDROP_README file for details.
  # Also specify in main.cf: maildrop_destination_recipient_limit=1
  #
  maildrop  unix  -       n       n       -       -       pipe
    flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
  #
  # ====================================================================
  #
  # Recent Cyrus versions can use the existing "lmtp" master.cf entry.
  #
  # Specify in cyrus.conf:
  #   lmtp    cmd="lmtpd -a" listen="localhost:lmtp" proto=tcp4
  #
  # Specify in main.cf one or more of the following:
  #  mailbox_transport = lmtp:inet:localhost
  #  virtual_transport = lmtp:inet:localhost
  #
  # ====================================================================
  #
  # Cyrus 2.1.5 (Amos Gouaux)
  # Also specify in main.cf: cyrus_destination_recipient_limit=1
  #
  #cyrus     unix  -       n       n       -       -       pipe
  #  user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}
  #
  # ====================================================================
  # Old example of delivery via Cyrus.
  #
  #old-cyrus unix  -       n       n       -       -       pipe
  #  flags=R user=cyrus argv=/cyrus/bin/deliver -e -m ${extension} ${user}
  #
  # ====================================================================
  #
  # See the Postfix UUCP_README file for configuration details.
  #
  uucp      unix  -       n       n       -       -       pipe
    flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
  #
  # Other external delivery methods.
  #
  ifmail    unix  -       n       n       -       -       pipe
    flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
  bsmtp     unix  -       n       n       -       -       pipe
    flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
  scalemail-backend unix  -   n   n   -   2   pipe
    flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
  mailman   unix  -       n       n       -       -       pipe
    flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
    ${nexthop} ${user}
  </code></pre>
  
  <p>sendmail.mc</p>
  
  <pre><code>divert(-1)dnl
  #-----------------------------------------------------------------------------
  # $Sendmail: debproto.mc,v 8.15.2 2015-12-10 18:02:49 cowboy Exp $
  #
  # Copyright (c) 1998-2010 Richard Nelson.  All Rights Reserved.
  #
  # cf/debian/sendmail.mc.  Generated from sendmail.mc.in by configure.
  #
  # sendmail.mc prototype config file for building Sendmail 8.15.2
  #
  # Note: the .in file supports 8.7.6 - 9.0.0, but the generated
  #   file is customized to the version noted above.
  #
  # This file is used to configure Sendmail for use with Debian systems.
  #
  # If you modify this file, you will have to regenerate /etc/mail/sendmail.cf
  # by running this file through the m4 preprocessor via one of the following:
  #   * make   (or make -C /etc/mail)
  #   * sendmailconfig 
  #   * m4 /etc/mail/sendmail.mc &gt; /etc/mail/sendmail.cf
  # The first two options are preferred as they will also update other files
  # that depend upon the contents of this file.
  #
  # The best documentation for this .mc file is:
  # /usr/share/doc/sendmail-doc/cf.README.gz
  #
  #-----------------------------------------------------------------------------
  divert(0)dnl
  #
  #   Copyright (c) 1998-2005 Richard Nelson.  All Rights Reserved.
  #
  #  This file is used to configure Sendmail for use with Debian systems.
  #
  define(`_USE_ETC_MAIL_')dnl
  include(`/usr/share/sendmail/cf/m4/cf.m4')dnl
  VERSIONID(`$Id: sendmail.mc, v 8.15.2-3 2015-12-10 18:02:49 cowboy Exp $')
  OSTYPE(`debian')dnl
  DOMAIN(`debian-mta')dnl
  dnl # Items controlled by /etc/mail/sendmail.conf - DO NOT TOUCH HERE
  undefine(`confHOST_STATUS_DIRECTORY')dnl        #DAEMON_HOSTSTATS=
  dnl # Items controlled by /etc/mail/sendmail.conf - DO NOT TOUCH HERE
  dnl #
  dnl # General defines
  dnl #
  dnl # SAFE_FILE_ENV: [undefined] If set, sendmail will do a chroot()
  dnl #   into this directory before writing files.
  dnl #   If *all* your user accounts are under /home then use that
  dnl #   instead - it will prevent any writes outside of /home !
  dnl #   define(`confSAFE_FILE_ENV',             `')dnl
  dnl #
  dnl # Daemon options - restrict to servicing LOCALHOST ONLY !!!
  dnl # Remove `, Addr=' clauses to receive from any interface
  dnl # If you want to support IPv6, switch the commented/uncommentd lines
  dnl #
  FEATURE(`no_default_msa')dnl
  dnl DAEMON_OPTIONS(`Family=inet6, Name=MTA-v6, Port=smtp, Addr=::1')dnl
  DAEMON_OPTIONS(`Family=inet,  Name=MTA-v4, Port=smtp, Addr=127.0.0.1')dnl
  dnl DAEMON_OPTIONS(`Family=inet6, Name=MSP-v6, Port=submission, M=Ea, Addr=::1')dnl
  DAEMON_OPTIONS(`Family=inet,  Name=MSP-v4, Port=submission, M=Ea, Addr=127.0.0.1')dnl
  dnl #
  dnl # Be somewhat anal in what we allow
  define(`confPRIVACY_FLAGS',dnl
  `needmailhelo,needexpnhelo,needvrfyhelo,restrictqrun,restrictexpand,nobodyreturn,authwarnings')dnl
  dnl #
  dnl # Define connection throttling and window length
  define(`confCONNECTION_RATE_THROTTLE', `15')dnl
  define(`confCONNECTION_RATE_WINDOW_SIZE',`10m')dnl
  dnl #
  dnl # Features
  dnl #
  dnl # use /etc/mail/local-host-names
  FEATURE(`use_cw_file')dnl
  dnl #
  dnl # The access db is the basis for most of sendmail's checking
  FEATURE(`access_db', , `skip')dnl
  dnl #
  dnl # The greet_pause feature stops some automail bots - but check the
  dnl # provided access db for details on excluding localhosts...
  FEATURE(`greet_pause', `1000')dnl 1 seconds
  dnl #
  dnl # Delay_checks allows sender&lt;-&gt;recipient checking
  FEATURE(`delay_checks', `friend', `n')dnl
  dnl #
  dnl # If we get too many bad recipients, slow things down...
  define(`confBAD_RCPT_THROTTLE',`3')dnl
  dnl #
  dnl # Stop connections that overflow our concurrent and time connection rates
  FEATURE(`conncontrol', `nodelay', `terminate')dnl
  FEATURE(`ratecontrol', `nodelay', `terminate')dnl
  dnl #
  dnl # If you're on a dialup link, you should enable this - so sendmail
  dnl # will not bring up the link (it will queue mail for later)
  dnl define(`confCON_EXPENSIVE',`True')dnl
  dnl #
  dnl # Dialup/LAN connection overrides
  dnl #
  include(`/etc/mail/m4/dialup.m4')dnl
  include(`/etc/mail/m4/provider.m4')dnl
  dnl #
  dnl # Default Mailer setup
  MAILER_DEFINITIONS
  MAILER(`local')dnl
  MAILER(`smtp')dnl
  
  include(`/etc/mail/tls/starttls.m4')dnl
  DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')
  </code></pre>
  
  <p>Also :</p>
  
  <pre><code>ifconfig                       
  netstat -rn
  </code></pre>
  
  <p>returns:</p>
  
  <pre><code>enp0s25   Link encap:Ethernet  HWaddr 68:f7:28:9f:88:9a  
            UP BROADCAST MULTICAST  MTU:1500  Metric:1
            RX packets:0 errors:0 dropped:0 overruns:0 frame:0
            TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:1000 
            RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
            Interrupt:20 Memory:e1300000-e1320000 
  
  lo        Link encap:Local Loopback  
            inet addr:127.0.0.1  Mask:255.0.0.0
            inet6 addr: ::1/128 Scope:Host
            UP LOOPBACK RUNNING  MTU:65536  Metric:1
            RX packets:40037 errors:0 dropped:0 overruns:0 frame:0
            TX packets:40037 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:1000 
            RX bytes:3357002 (3.3 MB)  TX bytes:3357002 (3.3 MB)
  
  wlp4s0    Link encap:Ethernet  HWaddr f4:06:69:69:fd:7f  
            inet addr:192.168.1.37  Bcast:192.168.1.255  Mask:255.255.255.0
            inet6 addr: fe80::f089:fdf:b8be:3fe4/64 Scope:Link
            UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
            RX packets:54313 errors:0 dropped:0 overruns:0 frame:0
            TX packets:40329 errors:0 dropped:0 overruns:0 carrier:0
            collisions:0 txqueuelen:1000 
            RX bytes:52589300 (52.5 MB)  TX bytes:6690660 (6.6 MB)
  
  Kernel IP routing table
  Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
  0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 wlp4s0
  192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 wlp4s0
  </code></pre>
  
  <p>and</p>
  
  <pre><code>telnet mta6.am0.yahoodns.net 25  
  </code></pre>
  
  <p>returns</p>
  
  <pre><code>Trying 63.250.192.46...
  Trying 98.138.112.35...
  Trying 98.136.216.26...
  Trying 74.6.137.65...
  Trying 63.250.192.45...
  Trying 66.218.85.139...
  Trying 66.218.85.52...
  Trying 74.6.137.63...
  telnet: Unable to connect to remote host: No route to host
  </code></pre>
  
  <p>and finally (from when I tried to send a mail to a google account)</p>
  
  <pre><code>telnet alt4.gmail-smtp-in.l.google.com 25
  </code></pre>
  
  <p>returns:</p>
  
  <pre><code>Trying 74.125.28.26...
  Trying 2607:f8b0:400e:c04::1a...
  telnet: Unable to connect to remote host: Network is unreachable
  </code></pre>
  
  <p>Thanks in advance for your help.</p>