7

I know this is elsewhere on the site but for some reason the answers I've found on here still haven't helped I still can't get it to work after trying different things all day. My goal was to have a confirmation code sent to the email that the user enters. I only know a small amount of PHP and followed a tutorial for the login/registration system but I'm fairly sure the php is working fine and the problem lies in my sendmail.ini and php.ini. Here is my sendmail.ini

; configuration for fake sendmail

; if this file doesn't exist, sendmail.exe will look for the settings in
; the registry, under HKLM\Software\Sendmail

[sendmail]

; you must change mail.mydomain.com to your smtp server,
; or to IIS's "pickup" directory.  (generally C:\Inetpub\mailroot\Pickup)
; emails delivered via IIS's pickup directory cause sendmail to
; run quicker, but you won't get error messages back to the calling
; application.

smtp_server=smtp.gmail.com

; smtp port (normally 25)

smtp_port=587

; SMTPS (SSL) support
;   auto = use SSL for port 465, otherwise try to use TLS
;   ssl  = alway use SSL
;   tls  = always use TLS
;   none = never try to use SSL

smtp_ssl=auto

; the default domain for this server will be read from the registry
; this will be appended to email addresses when one isn't provided
; if you want to override the value in the registry, uncomment and modify

;default_domain=mydomain.com

; log smtp errors to error.log (defaults to same directory as sendmail.exe)
; uncomment to enable logging

error_logfile=error.log

; create debug log as debug.log (defaults to same directory as sendmail.exe)
; uncomment to enable debugging

debug_logfile=debug.log

; if your smtp server requires authentication, modify the following two lines

auth_username= [email protected]
auth_password= mygmailpass

; if your smtp server uses pop3 before smtp authentication, modify the 
; following three lines.  do not enable unless it is required.

pop3_server=
pop3_username=
pop3_password=

; force the sender to always be the following email address
; this will only affect the "MAIL FROM" command, it won't modify 
; the "From: " header of the message content

[email protected]

; force the sender to always be the following email address
; this will only affect the "RCTP TO" command, it won't modify 
; the "To: " header of the message content

force_recipient=

; sendmail will use your hostname and your default_domain in the ehlo/helo
; smtp greeting.  you can manually set the ehlo/helo name if required

hostname=

And my the parts I've edited in my php.ini

extension=php_openssl.dll 

[mail function]
; XAMPP: Comment out this if you want to work with an SMTP Server like Mercury
SMTP =smtp.gmail.com
smtp_port =587

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = [email protected]


sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"

;sendmail_path="C:\xampp\mailtodisk\mailtodisk.exe"

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
;mail.force_extra_parameters =

and my PHP code in case it's needed

<?php
session_start();
include('configdb.php');
if(isset($_POST['submit']))
{
 //whether the username is blank
 if($_POST['username'] == '')
 {
  $_SESSION['error']['username'] = "User Name is required.";
 }
 //whether the email is blank
 if($_POST['email'] == '')
 {
  $_SESSION['error']['email'] = "E-mail is required.";
 }
 else
 {
  //whether the email format is correct
  if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $_POST['email']))
  {
   //if it has the correct format whether the email has already exist
   $email= $_POST['email'];
   $sql1 = "SELECT * FROM user WHERE email = '$email'";
   $result1 = mysqli_query($mysqli,$sql1) or die(mysqli_error());
   if (mysqli_num_rows($result1) > 0)
            {
    $_SESSION['error']['email'] = "This Email is already used.";
   }
  }
  else
  {
   //this error will set if the email format is not correct
   $_SESSION['error']['email'] = "Your email is not valid.";
  }
 }
 //whether the password is blank
 if($_POST['password'] == '')
 {
  $_SESSION['error']['password'] = "Password is required.";
 }
 //if the error exist, we will go to registration form
 if(isset($_SESSION['error']))
 {
  header("Location: index.php");
  exit;
 }
 else
 {
  $username = $_POST['username'];
  $email = $_POST['email'];
  $password = $_POST['password'];
  $com_code = md5(uniqid(rand()));

  $sql2 = "INSERT INTO user (username, email, password, com_code) VALUES ('$username', '$email', '$password', '$com_code')";
  $result2 = mysqli_query($mysqli,$sql2) or die(mysqli_error());

  if($result2)
  {
   $to = $email;
   $subject = "Confirmation for $username";
   $header = "Confirmation from";
   $message = "Please click the link below to verify and activate your account. rn";
   $message .= "http://www.yourname.com/confirm.php?passkey=$com_code";

   $sentmail = mail($to,$subject,$message,$header);

   if($sentmail)
            {
   echo "Your confirmation link has been sent to your e-mail address.";
   }
   else
         {
    echo "Error while sending confirmation link to your e-mail address";
   }
  }
 }
}
?>

Like I said I've been working on this for a while and I can't seem to figure it out, I assume it's something really simple but since I'm still learning I didn't see it. Thanks for all the help!

1
  • What exactly is not working with all that code? Is the mail sent to the internal mailserver, but not transmitted to the next responsible mailserver?
    – Nico Haase
    Commented Jan 12, 2020 at 16:46

2 Answers 2

9

You can just configure C:\xampp\php\php.ini and c:\xampp\sendmail\sendmail.ini for Gmail to send mail.

In php.ini file find [mail function] and change following

SMTP=smtp.gmail.com
smtp_port=587
sendmail_from = [email protected]
sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"

Now Open C:\xampp\sendmail\sendmail.ini. Replace all the existing code in sendmail.ini with following code

[sendmail]
    
smtp_server=smtp.gmail.com
smtp_port=587
error_logfile=error.log
debug_logfile=debug.log
[email protected]
auth_password=your-gmail-id-password
[email protected]

Now you have done!! create a PHP file with mail function and send mail from the localhost.

Note:- Replace your email id with "[email protected]"

1
  • 1
    Yes, it's work for me. thanks @sumit I have save my day. Commented Sep 29, 2017 at 11:19
7

if you are sending mail through local server you need to configure

c:\xampp\sendmail\sendmail.ini(send by Gmail) and C:\xampp\php\php.ini.

in php.ini

find extension=php_openssl.dll and remove the semicolon from the beginning of that line. So this allow you to send mail from localhost.

and then find mail function and change below settings

SMTP=smtp.gmail.com
smtp_port=587
sendmail_from = [email protected]
sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"

in sendmail.ini(path - C:\xampp\sendmail\sendmail.ini)

Change this

[sendmail]    
smtp_server=smtp.gmail.com
smtp_port=587
error_logfile=error.log
debug_logfile=debug.log
auth_username=GMail [email protected]//your gmail ID
auth_password=GMail PASSWORD // Your gmail password
force_sender=GMail [email protected] //your gmail ID

Change GMail [email protected], GMail PASSWORD, GMail [email protected] in above code.

Finally

comment following line if there is another sendmail_path : sendmail_path="C:\xampp\mailtodisk\mailtodisk.exe" in the php.ini file.

2
  • Thanks for the response! But it still isn't working for some reason :/. The user gets added to the database I have but I still get the else statement from my php code that says "Error while sending confirmation link to your e-mail address" and the email isn't sent and it isn't in my spam folder either. Commented May 29, 2015 at 18:38
  • 3
    There is one instruction missing: Google now blocks this kind of connection by default, and to unblock it you need to go into GMail's security settings and enable "less secure" connections. Here are instructions from Google: support.google.com/accounts/answer/6010255?hl=en
    – Ynhockey
    Commented Nov 6, 2017 at 6:56

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