ホームページ >バックエンド開発 >PHPチュートリアル >[php]phpカールsmtpでメールを送信_PHPチュートリアル
会社のクラウド プラットフォームは fsockopen を無効にしました。SMTP 外部ネットワーク メールボックスを使用して電子メールを送信したい場合は、curl を使用するしかありません。
最初にグーグルで検索したところ、関連する質問をしている人がたくさんいましたが、関連する回答はありませんでした。また、phpclasses にも関連するクラスが見つからなかったので、stmp の関連するプロトコルを調べながら、curl を試し始めました。
SMTPプロトコル
インターネット上には関連する例がたくさんありますので、Telnet を使用してメール サーバーに接続して自分で試すことができます。
$ Telnet 電子メール SMTP サービス アドレス 25
メールサービスのIPアドレスを試しています...
電子メール SMTP サービス アドレスに接続しました。
エスケープ文字は「^]」です。
220 Exchange 電子メール サーバー アドレス Microsoft ESMTP MAIL サービスは Sat, 2 Jun 2012 15:02:12 +0800 で準備完了
EHLO 127.0.0.1
250-exchange メール サーバー アドレス こんにちは [メール サービス IP アドレス]
250サイズ
250-パイプライニング
250-DSN
250-強化されたステータスコード
250-X-アノニマス
250 認証 NTLM ログイン
250-X-EXPS GSSAPI NTLM
250-8ビットタイム
250-バイナリーマイム
250チャンキング
250-XEXCH50
250XRDST
認証ログイン
334 VXNlcm5hbWU6
ユーザー名(base64_encode)
334 UGFzc3dvcmQ6
パスワード(base64_encode)
235 2.7.0 認証に成功しました
MAIL FROM: 送信ボックスのアドレス
250 2.1.0 送信者 OK
RCPT TO:受信箱アドレス
250 2.1.5 受信者OK
データ
354 メール入力を開始し、
送信するコンテンツ (関連する仕様がここに多数あります)
.
250 2.6.0 配信待ちのメール
やめる
221 2.0.0 サービスが送信チャネルを閉じています
接続は外部ホストによって閉じられました。
PHPのテストコード:
1
2 header("content-type:text/html;charset=utf-8");
3 $smtp = 配列(
4 "url" => "メール SMTP サーバー アドレス",
5 "ポート" => "メールボックス SMTP サーバー ポート", // 通常は 25
6 "ユーザー名" => "ユーザー名",
7 「パスワード」 => 「パスワード」、
8 "from" => "送信アドレス",
9 "宛先" => "受信アドレス",
10 "件名" => "タイトルをテスト",
11 "本文" => "コンテンツをテスト"
12);
13
14 $CRLF = "rn";
15 $test = "";
16 $curl =curl_init();
17
18curl_setopt($curl, CURLOPT_URL, $smtp['url']);
19curl_setopt($curl, CURLOPT_PORT, $smtp['port']);
20curl_setopt($curl, CURLOPT_TIMEOUT,10);
21
22 関数 inlineCode($str){
23 $str = トリム($str);
24 return $str?'=?UTF-8?B?'.base64_encode($str).'?= ':'';
25}
26
27 関数 buildHeader($headers){
28 $ret = '';
29 foreach($headers as $k=>$v){
30 $ret.=$k.': '.$v."n";
31 }
32 $ret;
を返します
33}
34
35 //
36 $header = 配列(
37 'リターンパス'=>'<'.$smtp['from'].'>',
38 '日付'=>日付('r'),
39 'From'=> '<'.$smtp['from'].'>',
40 'MIME バージョン'=>'1.0',
41 '件名'=>inlineCode($smtp['件名']),
42 'To'=>$smtp['to'],
43 'コンテンツタイプ'=>'文字セット=UTF-8',
44 'コンテンツ転送エンコーディング'=>'base64'
45 );
46 $data = buildHeader($header).$CRLF.chunk_split(base64_encode($smtp['body']));
47
48
49 $content = "EHLO ".$smtp["url"].$CRLF; // まずはこんにちは
;
50 $content .= "AUTH LOGIN".$CRLF.base64_encode($smtp["username"]).$CRLF.base64_encode($smtp["password"]).$CRLF; // ログインを確認します
;51 $content .= "MAIL FROM:".$smtp["from"].$CRLF // 送信アドレス
;
52 $content .= "RCPT TO:".$smtp["to"].$CRLF // 受信アドレス
;
53 $content .= "DATA".$CRLF.$data.$CRLF.".".$CRLF // コンテンツを送信
;
54 $content .= "QUIT".$CRLF // 終了
;
55
56curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); //curl は戻りデータを受け取ります
;
57curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $content);
58 $test =curl_exec($curl);
59 var_dump($test);
60 エコー "
rn";
61 var_dump($content);
62
63 //終わり
64 カール_クローズ($カール);
上記はテスト用のphpです
製品コードを fsockopen とcurl と互換性のあるものにするために、パッケージのテストと修正に 6 時間近くかかりました
今後時間があるときに、fsockopen とcurl に互換性のある、単純にメールを送信するための SMTP クラスを作成します
コーディングで考える
bluefrogより抜粋