22

I'm trying to send an email when a form is submitted. I'm using PHPMailer to send the mail using the below configuration.

$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = 'mail.example.in'; 
$mail->Port = 25; 
$mail->SMTPAuth = true;
$mail->Username = 'user@example.in'; 
$mail->Password = 'password'; 

$mail->setFrom("user@example.in" , "User");
$mail->addAddress('receiver@example.in', 'Receiver');
$mail->addBCC('anotheruser@somedomain.com', 'Another user');
$mail->AddReplyTo('user@example.in', 'User');

$mail->isHTML(true);

$mail->Subject = $subject;
$mail->Body    = $message;
if($mail->send())
    echo "Your request has been received. We will soon contact you.";
else echo "Unable to send your request. Please try again";

This works fine in localhost. But, when I deploy it to my server (example.in) I get the below exception.

SMTP ERROR: Failed to connect to server: Connection timed out (110)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

--EDIT--

I tried connecting to the SMTP server using telnet command, but I'm unable to add the recipient. I get the below error?

Last login: Fri Sep 16 11:08:06 on ttys000
admin:~ admin$ telnet mail.example.in 25
Trying 111.91.153.112...
Connected to mail.example.in.
Escape character is '^]'.
220 fbs-ho-mailserver.example.in ESMTP Service (Lotus Domino Release 8.5.3FP3) ready at Fri, 16 Sep 2016 11:36:01 +0530
HELO example.in
250 fbs-ho-mailserver.example.in Hello example.in ([111.91.127.222]), pleased to meet you
MAIL from: marketing@example.in
250 marketing@example.in... Sender OK
RCPT to: john.hh@gmail.com
554 Relay rejected for policy reasons.

-- EDIT --

I was able to setup this account in outlook. I'm really confused what's happening.

enter image description here

Aakash
  • 1,751
  • 1
  • 14
  • 21
  • It sounds like your production environment blocks outgoing connections to the mail server, or that the mail server blocks incoming connections. Talk with operations people. – Joni Sep 16 '16 at 05:23
  • I dont think mail.example.in is a valid smtp server. –  Sep 16 '16 at 05:30
  • I've added mail.example.in because I don't want to reveal the actual smtp server name. – Aakash Sep 16 '16 at 05:33
  • @Joni There are no operations people. It's just me. Can you please give me the steps on what I need to do ? – Aakash Sep 16 '16 at 05:34
  • Who's responsible for making sure the two servers run, you as well? – Joni Sep 16 '16 at 05:38
  • Is your telnet session done from the same server your PHPMailer script is running on? Relaying rejection is usually because you are either not connecting from a permitted IP, or that you need to use authentication. Message submission is usually on port 587 with TLS, so give that a try. – Synchro Sep 16 '16 at 06:58
  • No. I tested it from my local machine. The PHPMailer is runing on hostgator I'm not sure how to test it there. – Aakash Sep 19 '16 at 04:51
  • Can you please try to send an email using your gmail username and password from your server? If you will not able to send an email using your gmail credentials than it will be like your production is blocking outside connections. – Hardik Patel Sep 21 '16 at 10:34
  • I'm able to send mail using gmail and godaddy smtp configurations. Only this particular configuration which is using port 25 is not working. – Aakash Sep 21 '16 at 10:56
  • I also had same problem i enabled https://www.google.com/settings/security/lesssecureapps – Abhijit Jagtap Sep 22 '16 at 05:18
  • @Aakash Yes, this is not a bug, but a security policy by godaddy. I recently overcome this error by using a 3rd party API to send email. I will add that as the answer. – Sibidharan Sep 24 '16 at 07:47
  • @Aakash Are you able to send mail using outlook? – Shailesh Chauhan Sep 24 '16 at 10:54
  • Yes I am able to. – Aakash Sep 24 '16 at 11:11
  • @Aakash are you still checking answers? – norcal johnny Sep 27 '16 at 08:21
  • I am checking the answers. I need to work with someone to verify it. – Aakash Sep 27 '16 at 08:36

12 Answers12

5

Your error says:

SMTP ERROR: Failed to connect to server: Connection timed out (110)
SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

So let's look at https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting :

"SMTP Error: Could not connect to SMTP host."

This may also appear as SMTP connect() failed or Called Mail() without being connected in debug output. This is often reported as a PHPMailer problem, but it's almost always down to local DNS failure, firewall blocking (for example as GoDaddy does) or other issue on your local network. It means that PHPMailer is unable to contact the SMTP server you have specified in the Host property, but doesn't say exactly why. It can also be caused by not having the openssl extension loaded (See encryption notes below).

Some techniques to diagnose the source of this error are discussed below.

GoDaddy

Popular US hosting provider GoDaddy imposes very strict (to the point of becoming almost useless) constraints on sending email. They block outbound SMTP to ports 25, 465 and 587 to all servers except their own. This problem is the subject of many frustrating questions on Stack Overflow. If you find your script works on your local machine, but not when you upload it to GoDaddy, this will be what's happening to you. The solution is extremely poorly documented by GoDaddy: you must send through their servers, and also disable all security features, username and password (great, huh?!), giving you this config for PHPMailer:

$mail->isSMTP();
$mail->Host = 'relay-hosting.secureserver.net';
$mail->Port = 25;
$mail->SMTPAuth = false;
$mail->SMTPSecure = false;

GoDaddy also refuses to send with a From address belonging to any aol, gmail, yahoo, hotmail, live, aim, or msn domain (see their docs). This is because all those domains deploy SPF and DKIM anti-forgery measures, and faking your from address is forgery.

You may find it easier to switch to a more enlightened hosting provider.

LSerni
  • 55,617
  • 10
  • 65
  • 107
2

The problem - rather the two unrelated problems - that you're experiencing are quite straightforward:

SMTP ERROR: Failed to connect to server: Connection timed out (110) SMTP connect() failed.

and you have verified that the server is indeed accepting connections:

I tried connecting to the SMTP server using telnet command

Last login: Fri Sep 16 11:08:06 on ttys000
admin:~ admin$ telnet mail.example.in 25
Trying 111.91.153.112...
Connected to mail.example.in.

Your script cannot connect to the SMTP server when run from its production server.

The likely cause is that the production server has a firewall that, to avoid abuse, prevents any connection to the outside. The server can serve Web requests, but no more.

If your test had verified that port 25 was not responding, then (after checking that the host address was correct) you could have tried telnet mail.example.in 587 instead. If that worked, it could have meant that the server is not accepting insecure connections (port 25) but is accepting secure connections. With PHPMailer you could then have tried activating secure connection:

$mail->SMTPSecure = 'tls';

or

$mail->SMTPSecure = 'ssl';

If that does not work, you might still have a firewall issue; or you might need to look at phpinfo() and verify you do have OpenSSL support available in PHP.

What you need to do

  • ask the IT people that maintain the production server to open the firewall;
  • more promisingly, ask them how to send emails from that server. Chances are that you need to use the mail() function, or use localhost or 127.0.0.1 as SMTP server. Then the emails will go out through your production server's service network.

They might tell you that port 25 is not allowed, but port (say) 465 or 567 would be allowed. You will have to update your configuration and/or add TLS/SSL accordingly (see above).

  • or you might be allowed to connect to a third party SMTP server of which you will have to supply the IP address, to allow the IT guys to open a suitable firewall window. Then the emails will go out through the third party server.

The second problem (possibly NOT a problem)

250 marketing@example.in... Sender OK RCPT to: john.hh@gmail.com 554 Relay rejected for policy reasons

Also to avoid abuse, SMTP Servers will not let everyone connect and send emails, but only their own customers. I see that in the PHPMailer configuration you specified an user and a password. In the telnet session you did not. So it might well be that PHPmailer could send, but not connect, while your telnet can connect, but not send.

Once you solve the connection problem, your authentication problem will either be solved or will have gone away (because you'll be using a different server supplied to you by the IT guys, for example localhost).

The third problem (might never arise)

A third way of abusing services is over-use - sending too many emails to too many people. Verify with the IT guys what the acceptable policies are for sending emails.

Problems, problems

Other things to look into are the credibility of the source (you might want to send emails on behalf of some domain which has not designated your SMTP server of choice as permitted sender), and the confidentiality of the data (even with TLS/SSL connections, if you are given localhost as the SMTP server, your IT guys will have complete, unfettered, undetectable access to any email you send. You might, or might not, be okay with that).

Community
  • 1
  • 1
LSerni
  • 55,617
  • 10
  • 65
  • 107
1

1st quote (from ibm community):

john.hh@gmail.com was a member of a group (Reject) that was listed in gmail.com's "Deny messages intended for the following internet addresses" field (in the destination server's Domino Configuration document's Router/SMTP, Restrictions and Controls, SMTP Inbound Controls tab's "Inbound Intended Recipient's Controls" section).

Removing Mary's hierarchical name (Mary Jones/ABC) from the members list in the Reject (group) document allows Mary to receive messages from the Internet.

2nd quote:

Most mail servers, to prevent them being used as anonymous spam relays, are configured only to relay mail from certain hosts.

T.Todua
  • 53,146
  • 19
  • 236
  • 237
1

It's a bad idea to use your own SMTP. Depending of what you have to do with it, you have some great chances to have your emails blocked in some ways or marked as SPAM. And you will have to spend some times to keep your server up to date.

Use online services that are white-listed for every provider and that expose API to send your transactionnal mails : https://www.mailjet.com/ http://mailchimp.com/ ...

They often propose a free account for small volume (under 2000 emails per days). Using the API is quite trivial and can be put in place in some minutes (ex : https://dev.mailjet.com/)

ArGh
  • 1,148
  • 1
  • 11
  • 20
1

Ask to your hosting provider if smtp is enabled on not on that server.I had same issue before for smtp and curl both.Contact hosting provider.

1

What's the phpmailer version?

You might forget to add this line

  $mail->IsSMTP(); //  use SMTP

after you initiate $mail.

Have a try.

Robert
  • 63
  • 9
1

So you have a GoDaddy server and you want to send email through your newly acquired SMTP Relay. Well “you can’t” is probably what you are going to find if you do some poking around Google.

If you poke around a little more you will probably find GoDaddy’s official solution is to use their internal mail relay. This is not ideal, because of arbitrary barriers they have set, such as this one:

Our dedicated servers have an outbound email limit of 1000 per day. If you need to send more than 1000 emails per day, please call Customer Support or open a support ticket to request a higher limit.

Quick and Working Solution: Get SMTP Relay that supports sending emails using HTTP API.

My Suggestion: (A simple and effective working solution, I am using personally)

Signup for an account in Sendgrid. Sendgrid provides free 12k emails per month, and I think that should suffice any basic needs.

First Step: Sendgrid will ask you to add few DNS records to authenticate you for sending emails on behalf of that host. So do it.

Second Step Step: Configure White Lables https://sendgrid.com/docs/User_Guide/Settings/Whitelabel/index.html (This is not important, but it will give professional look to the emails you are sending)

Third Step: Generate API keys

You can manage your API Keys from the SendGrid Customer Portal. Additionally, you can manage your API keys via the API itself.

Forth Step: Go ahead and write our codes.

Sending mails using PHP on sendgrid using this library available on github is easy:

// using SendGrid's PHP Library
// https://github.com/sendgrid/sendgrid-php
require 'vendor/autoload.php';
$sendgrid = new SendGrid("SENDGRID_APIKEY");
$email    = new SendGrid\Email();

$email->addTo("test@sendgrid.com")
      ->setFrom("you@youremail.com")
      ->setSubject("Sending with SendGrid is Fun")
      ->setHtml("and easy to do anywhere, even with PHP");

$sendgrid->send($email);

How this works

GoDaddy blocks port 25, 2525, 587 and 485 which are ideal ports for SMTP. So we are using the port 80/443 and requesting the sengrid's API to send the email on our behalf behalf using port 80, and yes, we fooled GoDaddy.

Sibidharan
  • 2,717
  • 2
  • 26
  • 54
  • This might be the magic that many appear to be looking for, so I'm upvoting this answer. Yet, beware believing you have 'fooled' your ISP. Traffic monitoring is **easy**, and if the ISP ever decided to block outgoing traffic directed to SendGrid servers, they can do it in a snap. Always, if possible, try to work *with* your ISP - or change ISP; try to avoid *fooling* your connectivity purveyors. – LSerni Sep 24 '16 at 08:31
  • @lserni Yes! But in many ways, we can override the block to sendgrid on 80, in case if it happens, like using a bounce or vpn.. Whatsoever, this is the current working solution, which I am using personally. GoDaddy will never remove those limit, I tried that for very long. – Sibidharan Sep 24 '16 at 08:33
  • @lserni OP is using GoDaddy. Look for this comment `I'm able to send mail using gmail and godaddy smtp configurations. Only this particular configuration which is using port 25 is not working.` reply to the question by the author. – Sibidharan Sep 24 '16 at 08:55
  • 1
    Yes, the comment had 'folded' and so I had not seen it anymore :-). I was saying, in the OP's case, maybe just using `mail()` would be the quickest solution. PHPMailer is overkill for what seems to be a simple contact form. – LSerni Sep 24 '16 at 09:00
  • Yes, that's indeed correct. But this solution, tons out there are looking for it. – Sibidharan Sep 24 '16 at 09:03
  • Which is exactly why I *did* upvote it :-) . Possibly you could add a note about evaluating whether it's really necessary to use PHPMailer -- but that's up to you. – LSerni Sep 24 '16 at 09:06
  • @Iserni Yes, that will be a doubt many might have. I will look into it. – Sibidharan Sep 24 '16 at 09:07
1

I think within a few steps we can get this working properly.

  1. In your Godaddy/Hostgator Cpanel > Select MX records > Select Domain in question > Select "Remote Mail Exchanger"

    You can test mail delivery at this time, issue may be resolved.

  2. I am sure it is set up right but trust me when it comes to good ole Cpanel, PhpMailer and Godaddy/Hostgator. It's a place where common sense makes no sense.

replace:

$mail->Host = 'mail.example.in';

with:

$mail->Host = 'localhost';

I believe this should resolve any issues assuming things like login credentials are valid.

norcal johnny
  • 2,050
  • 2
  • 13
  • 17
1

I faced similar timeout issue , the reason was my hosting provider (Linode) . TLDR; SMTP restrictions are in place by default for Linode on accounts created after November 5th 2019. You'll need to configure rDNS for your instance and open a Support ticket confirming CAN-SPAM compliance, and Support should lift the restrictions pretty quickly. I guess many people face this issue because of smtp restrictions

0

Timeout error is typical of packets dropped, so could be firewall issues between web server and SMTP server. If you got ssh access to your server, you can try to connect to smtp using:

telnet <smtp server> 25

On timeout error even with telnet, you're quite sure that the problem is on network/firewall side.

Edo
  • 37
  • 1
  • 1
  • 4
0

You need to change some setting in your php.ini :

upload_max_filesize = 2M 
;or whatever size you want

max_execution_time = 60
; also, higher if you must - sets the maximum time in seconds.

Were your PHP.ini is depends on your enviroment, more information: reference

OR

Place this at the top of your PHP script and let your script loose

ini_set('max_execution_time', 600); //600 seconds = 10 minutes or set your time
Dave
  • 3,073
  • 7
  • 20
  • 33
  • Your advice would be good in a different context, but it has nothing to do with the actual problem, and so is not useful. The OP's error is a *connection* timeout, not a *script* timeout error. Also, upload file size has nothing to do with the sending of an email from the server - it's the size of the file being sent *to* the server. – LSerni Sep 21 '16 at 19:22
0

I got your point. Same issue happen with me , I have just add one line and its working for me. please use ,

$mail->SMTPSecure = 'ssl';

and configure your setting according to ssl . Also properly check mail configure at your serve end.

Kumar Rakesh
  • 2,718
  • 2
  • 18
  • 39
Vijju Pundir
  • 163
  • 7