Home > Article > Backend Development > [php]php curl smtp to send email_PHP tutorial
The company's cloud platform has turned off fsockopen. If you want to use an SMTP external mailbox to send emails, you can only try using curl
I googled first and found a lot of people asking related questions but no relevant answers. I also couldn’t find the relevant classes in phpclasses, so I started to try curl while looking at the relevant protocols of stmp
SMTP protocol
You can find many related examples on the Internet. You can try it yourself by using telnet to connect to the mail server
$ telnet email SMTP service address 25
Trying email service IP address...
Connected to email SMTP service address.
Escape character is '^]'.
220 exchange email server address Microsoft ESMTP MAIL Service ready at Sat, 2 Jun 2012 15:02:12 +0800
EHLO 127.0.0.1
250-exchange email server address Hello [mail service IP address]
250-SIZE
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-X-ANONYMOUSTLS
250-AUTH NTLM LOGIN
250-X-EXPS GSSAPI NTLM
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250-XEXCH50
250 XRDST
AUTH LOGIN
334 VXNlcm5hbWU6
Username(base64_encode)
334 UGFzc3dvcmQ6
Password (base64_encode)
235 2.7.0 Authentication successful
MAIL FROM:Outbox address
250 2.1.0 Sender OK
RCPT TO:Inbox address
250 2.1.5 Recipient OK
DATA
354 Start mail input; end with
Content to be sent (there are many related specifications here)
.
250 2.6.0 <0b476f30-3b96-4e3d-84d2-395a96d34000@exchange email server address> Queued mail for delivery
QUIT
221 2.0.0 Service closing transmission channel
Connection closed by foreign host.
php test code:
1
2 header("content-type:text/html;charset=utf-8");
3 $smtp = array(
4 "url" => "Email SMTP server address",
5 "port" => "Mailbox SMTP server port", // usually 25
6 "username" => "username",
7 "password" => "password",
8 "from" => "Sending address",
9 "to" => "Receiving address",
10 "subject" => "Test the title",
11 "body" => "Test the content"
12);
13
14 $CRLF = "rn";
15 $test = "";
16 $curl = curl_init();
17
18 curl_setopt($curl, CURLOPT_URL, $smtp['url']);
19 curl_setopt($curl, CURLOPT_PORT, $smtp['port']);
20 curl_setopt($curl, CURLOPT_TIMEOUT,10);
21
22 function inlineCode($str){
23 $str = trim($str);
24 return $str?'=?UTF-8?B?'.base64_encode($str).'?= ':'';
25}
26
27 function buildHeader($headers){
28 $ret = '';
29 foreach($headers as $k=>$v){
30 $ret.=$k.': '.$v."n";
31 }
32 return $ret;
33}
34
35 //
36 $header = array(
37 'Return-path'=>'<'.$smtp['from'].'>',
38 'Date'=>date('r'),
39 'From'=> '<'.$smtp['from'].'>',
40 'MIME-Version'=>'1.0',
41 'Subject'=>inlineCode($smtp['subject']),
42 'To'=>$smtp['to'],
43 'Content-Type'=>'text/html; charset=UTF-8; format=flowed',
44 'Content-Transfer-Encoding'=>'base64'
45 );
46 $data = buildHeader($header).$CRLF.chunk_split(base64_encode($smtp['body']));
47
48
49 $content = "EHLO ".$smtp["url"].$CRLF; // Hello first
50 $content .= "AUTH LOGIN".$CRLF.base64_encode($smtp["username"]).$CRLF.base64_encode($smtp["password"]).$CRLF; // Verify login
51 $content .= "MAIL FROM:".$smtp["from"].$CRLF; // Sending address
52 $content .= "RCPT TO:".$smtp["to"].$CRLF; // Receiving address
53 $content .= "DATA".$CRLF.$data.$CRLF.".".$CRLF; // Send content
54 $content .= "QUIT".$CRLF; // Exit
55
56 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // curl receives return data
57 curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $content);
58 $test = curl_exec($curl);
59 var_dump($test);
60 echo "
rn";
61 var_dump($content);
62
63 // End
64 curl_close($curl);
The above is just the tested php
It took nearly 6 hours of package testing + modification to make the product code compatible with fsockopen and curl
When I have time in the future, I will write an SMTP class that is compatible with fsockopen and curl to simply send emails
think in coding
Excerpted from bluefrog