Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

I installed Ubuntu 11.04, LAMP using tasksel.

I find that PHP mail() does not work.

I suppose I need to enable it or something? How do I do that?

share|improve this question
add comment

4 Answers

up vote 24 down vote accepted

From the mail manual of php:

Requirements

For the mail functions to be available, PHP requires an installed and working email system. The program to be used is defined by the configuration settings in the php.ini file.

This means you have to install some sort of mailserver and configure php to use it. Usually this mailserver is postfix in Ubuntu. However - if the php side you are coding will eventually be stored on a hosting service's side (e.g. xmission), a mail server will most likely allready be installed there. In that case just test your site online instead of locally.

If you need to test it on your own system or mean to host it on your own home-server than proceed with:

Postfix Installation

Installation: postfix Install postfix / sudo apt-get install postfix During the process you will be asked in which mode you want postfix installed. There are four possible modes:

  • Internet: Your own mail-server.
  • Satellite: An extern mail provider (e.g. Google) will be used for sending and mail. The server will not receive any mail.
  • Smarthost: Mixture between the two. Mail is storred locally but send through an extern mail provider.
  • Local only: Will not concern you. That's a system intern mailserver. You can only send mail from user to user on the system.

The rest of the install options depend on your choice of this general configuration.

Most likely you will choose a satellite install. That means mail will be send using an extern provider. As smtp-server (outgoing mail server) you will then have to specify your providers smpt. The rest of the options is self explanatory.

Post Installation Configuration

Most smtp-servers require a password authentication to send mail. So postfix will need to know that password. Also there are things like encryption to consider (which you'll have to google). This is how you configure postfix using password authentication (sasl):

  • Install libsasl2-modules Install libsasl2-modules and sasl2-bin Install sasl2-bin by clicking the Software Center icons or from terminal using:

    sudo apt-get install libsasl2-2 libsasl2-modules sasl2-bin
    
  • Enable sasl-auth by adding these lines to /etc/postfix/main.cf

     # add to /etc/postfix/main.cf
     smtp_sasl_auth_enable = yes
     smtp_sasl_security_options = noplaintext noanonymous
     smtp_sasl_password_maps = hash:/etc/postfix/sasl_password
    
  • Create a file /etc/postfix/sasl_password with a line like:

     smtp.gmail.com USERNAME@gmail.com:USERPASSWORD
    

    Substitute the acutal password, username and smpt-address.

  • Update postfix:

     sudo chmod 600 /etc/postfix/sasl_password # for safety of your smtp password
     sudo postmap hash:/etc/postfix/sasl_password 
     sudo postmap /etc/postfix/sender_canonical
     sudo /etc/init.d/postfix restart   
    

    You might have to circumvent the 'permission denied' bug by chwon postfix:postfix /etc/postfix beforehand.

This should do it in most of the cases. Yet some smpt providers require a specific address as the sender or encryption.

Related: PEAR::Mail interface might also be of intrest to you.

share|improve this answer
    
Sending mail from Ubuntu (local) works. But what if I want my Windows to use this machine to send mail (PHP also)? How do I configure that? –  JM at Work Jun 14 '11 at 3:15
    
Not sure I get the question. You can sand from your Ubuntu machine. Now what you want to do is send mal via that Ubuntu machine from your Windows PC via php? Is that correct? –  con-f-use May 8 '12 at 13:04
2  
Now the package libsasl2 doesn't exist. I am using 11.04. Its libsasl2-2 as per updated package.. –  cognoz Jul 23 '12 at 13:46
add comment

PHP requires an SMTP client to send mail. You could install a full-featured mail transfer agent (MTA) like Postfix to serve this function, but it's overkill if you only need to send mail through PHP. Instead, install msmtp. It's lightweight and much simpler to configure.

Install msmtp

sudo apt-get install msmtp ca-certificates

Configure it

Create a new configuration file:

sudo vi /etc/msmtprc

...with the following configuration information:

# Set defaults.
defaults

# Enable or disable TLS/SSL encryption.
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt

# Set up a default account's settings.
account default
host <smtp.example.net>
port 587
auth on
user <username@example.net>
password <password>
from <address-to-receive-bounces@example.net>
logfile /var/log/msmtp/msmtp.log

You need to put your own configuration information within each "<" and ">". For host/username/password, use your normal credentials for sending mail through your mail provider.

Tell PHP to use it

sudo vi /etc/php5/conf.d

Add this single line:

sendmail_path = /usr/bin/msmtp -t

Set up logging

sudo mkdir /var/log/msmtp
sudo chown www-data:adm /var/log/msmtp
sudo vi /etc/logrotate.d/msmtp

Add these lines to the new file:

/var/log/msmtp/*.log {
  rotate 12
  monthly
  compress
  missingok
  notifempty
}

If you'd like to be able to view the logs as yourself, you should add yourself to the www-data group.

share|improve this answer
    
Of course, 'sudo vi /etc/php5/conf.d' without a php.ini won't work. In my case (Ubuntu), I had to edit '/etc/php5/apache2/php.ini' and also restart apache 'sudo /etc/init.d/apache2 reload' in order for it to work. –  Dejan Dec 11 '12 at 14:01
    
BTW, you can test your msmtprc config using: cat <<EOF | msmtp <receiver@test.com> Subject: test This is a test! EOF –  Dejan Dec 11 '12 at 14:06
    
Would be nice, but it's not working for me. Nothing appears in its log. It seems totally fine, but no dice. –  Doc Dec 20 '12 at 1:58
    
To make msmtp available system-wide, install "msmtp-mta". –  colan Dec 13 '13 at 21:27
add comment

As already noted, postfix would be an overkill if you just need to send emails from php while developing applications on your home computer.

I personally use very simple and lightweight package ssmtp. It will use any smtp server to send outbound emails. Install it by running:

sudo apt-get install ssmtp

Then edit /etc/ssmtp/ssmtp.conf file, comment out existing mailhub line and add the following lines (this example is for gmail smtp server):

mailhub=smtp.gmail.com:587
UseSTARTTLS=YES
AuthUser=<YOUR-EMAIL>@gmail.com
AuthPass=<YOUR-PASSWORD>

(Provide your gmail username & password. Of course you can use any other SMTP server).

Now make sure that your php.ini has correct sendmail_path. It should read as:

sendmail_path = /usr/sbin/sendmail -t

Reload apache and your php should be able to send outgoing emails now.

share|improve this answer
    
I think you meant sendmail_path = /usr/sbin/ssmtp -t. This worked, thanks –  Omer Sabic Dec 18 '13 at 19:02
    
ssmtp should create symlink for /usr/sbin/sendmail, which correctly points to ssmtp. So, using sendmail_path = /usr/sbin/sendmail -t should work as well –  Dima L. Dec 29 '13 at 13:14
    
I use you script to send a gmail, it turns out work. But I want to know is there any way to use different username (and hence password) to send email? I hope this will work in php mail(), since ssmtp is really easy to configure, thanks! –  van abel Feb 20 at 10:26
add comment

Should be a simple fix. You just need to install Postfix which does the actual emailing.

sudo apt-get install postfix

You want to run that from a terminal (and not the software centre) because it needs to ask you a few setup questions. You should be find to just accept all the defaults (local-only, etc).

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.